From 51cb71af4243a11a3431eeabaf191e23c7ec2f85 Mon Sep 17 00:00:00 2001 From: Nils Christian Ehmke <nie@informatik.uni-kiel.de> Date: Sun, 7 Oct 2012 16:04:28 +0200 Subject: [PATCH] Localization, Internationalization, New Icons --- .../application/GlobalPropertiesBean.java | 22 +- .../session/CurrentConfigurationBean.java | 27 + .../kieker/webgui/beans/session/UserBean.java | 25 +- .../view/CurrentAnalysisEditorGraphBean.java | 6 +- .../src/main/resources/global.properties | 11 +- .../src/main/resources/messages_de.properties | 146 +++++ .../src/main/resources/messages_en.properties | 160 ++++++ .../src/main/webapp/AnalysisEditor.xhtml | 507 +++++++++--------- Kieker.WebGUI/src/main/webapp/Cockpit.xhtml | 20 +- .../src/main/webapp/Controller.xhtml | 216 ++++---- Kieker.WebGUI/src/main/webapp/Login.xhtml | 79 +-- .../src/main/webapp/ProjectOverview.xhtml | 202 +++---- .../src/main/webapp/WEB-INF/faces-config.xml | 21 + .../src/main/webapp/css/AnalysisEditor.css | 31 ++ Kieker.WebGUI/src/main/webapp/css/Common.css | 168 ++++++ Kieker.WebGUI/src/main/webapp/css/Login.css | 1 + Kieker.WebGUI/src/main/webapp/css/base.css | 31 -- .../src/main/webapp/css/js-graph-it.css | 24 - .../src/main/webapp/dialogs/aboutDialog.xhtml | 2 +- .../dialogs/manageLibrariesDialog.xhtml | 12 +- .../main/webapp/dialogs/projectDialogs.xhtml | 30 +- .../main/webapp/dialogs/settingsDialog.xhtml | 36 +- .../webapp/img/{ => LEDs}/Icon_LED_Gray.png | Bin .../webapp/img/{ => LEDs}/Icon_LED_Green.png | Bin .../webapp/img/{ => LEDs}/Icon_LED_Red.png | Bin .../webapp/img/{ => LEDs}/Icon_LED_Yellow.png | Bin .../img/{ => graphIcons}/FilterIcon.png | Bin .../img/{ => graphIcons}/ReaderIcon.png | Bin .../img/{ => graphIcons}/RepositoryIcon.png | Bin .../src/main/webapp/img/icons/About.png | Bin 0 -> 780 bytes .../src/main/webapp/img/icons/Analysis.png | Bin 0 -> 879 bytes .../main/webapp/img/icons/AnalysisEditor.png | Bin 0 -> 789 bytes .../src/main/webapp/img/icons/AutoLayout.png | Bin 0 -> 2367 bytes .../main/webapp/img/icons/AutoLayoutSmall.png | Bin 0 -> 837 bytes .../src/main/webapp/img/icons/Close.png | Bin 0 -> 932 bytes .../src/main/webapp/img/icons/Cockpit.png | Bin 0 -> 840 bytes .../main/webapp/img/icons/CockpitEditor.png | Bin 0 -> 789 bytes .../main/webapp/img/icons/GridDisabled.png | Bin 0 -> 898 bytes .../webapp/img/icons/GridDisabledSmall.png | Bin 0 -> 471 bytes .../src/main/webapp/img/icons/GridEnabled.png | Bin 0 -> 1270 bytes .../webapp/img/icons/GridEnabledSmall.png | Bin 0 -> 592 bytes .../src/main/webapp/img/icons/Home.png | Bin 0 -> 779 bytes .../main/webapp/img/icons/ImportProject.png | Bin 0 -> 759 bytes .../src/main/webapp/img/icons/Logout.png | Bin 0 -> 954 bytes .../main/webapp/img/icons/ManageLibraries.png | Bin 0 -> 914 bytes .../src/main/webapp/img/icons/NewProject.png | Bin 0 -> 471 bytes .../src/main/webapp/img/icons/Reload.png | Bin 0 -> 792 bytes .../src/main/webapp/img/icons/Save.png | Bin 0 -> 623 bytes .../src/main/webapp/img/icons/SaveAs.png | Bin 0 -> 623 bytes .../src/main/webapp/img/icons/ScaleToFit.png | Bin 0 -> 1776 bytes .../main/webapp/img/icons/ScaleToFitSmall.png | Bin 0 -> 749 bytes .../src/main/webapp/img/icons/Settings.png | Bin 0 -> 927 bytes .../main/webapp/img/icons/SnapDisabled.png | Bin 0 -> 1620 bytes .../webapp/img/icons/SnapDisabledSmall.png | Bin 0 -> 685 bytes .../src/main/webapp/img/icons/SnapEnabled.png | Bin 0 -> 1611 bytes .../webapp/img/icons/SnapEnabledSmall.png | Bin 0 -> 701 bytes .../src/main/webapp/img/icons/UserGuide.png | Bin 0 -> 801 bytes 57 files changed, 1154 insertions(+), 623 deletions(-) create mode 100644 Kieker.WebGUI/src/main/resources/messages_de.properties create mode 100644 Kieker.WebGUI/src/main/resources/messages_en.properties create mode 100644 Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml delete mode 100644 Kieker.WebGUI/src/main/webapp/css/base.css delete mode 100644 Kieker.WebGUI/src/main/webapp/css/js-graph-it.css rename Kieker.WebGUI/src/main/webapp/img/{ => LEDs}/Icon_LED_Gray.png (100%) rename Kieker.WebGUI/src/main/webapp/img/{ => LEDs}/Icon_LED_Green.png (100%) rename Kieker.WebGUI/src/main/webapp/img/{ => LEDs}/Icon_LED_Red.png (100%) rename Kieker.WebGUI/src/main/webapp/img/{ => LEDs}/Icon_LED_Yellow.png (100%) rename Kieker.WebGUI/src/main/webapp/img/{ => graphIcons}/FilterIcon.png (100%) rename Kieker.WebGUI/src/main/webapp/img/{ => graphIcons}/ReaderIcon.png (100%) rename Kieker.WebGUI/src/main/webapp/img/{ => graphIcons}/RepositoryIcon.png (100%) create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/About.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Analysis.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/AnalysisEditor.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/AutoLayout.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/AutoLayoutSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Close.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Cockpit.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/CockpitEditor.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/GridDisabled.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/GridDisabledSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/GridEnabled.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/GridEnabledSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Home.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Logout.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Reload.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Save.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/ScaleToFit.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/ScaleToFitSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Settings.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/SnapDisabled.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/SnapDisabledSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/SnapEnabled.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/SnapEnabledSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/UserGuide.png diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/GlobalPropertiesBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/GlobalPropertiesBean.java index 2a1a7c12..5c83ea36 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/GlobalPropertiesBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/GlobalPropertiesBean.java @@ -17,7 +17,9 @@ package kieker.webgui.beans.application; import java.io.IOException; +import java.util.Locale; import java.util.Properties; +import java.util.ResourceBundle; import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; @@ -44,14 +46,16 @@ public final class GlobalPropertiesBean { private static final String PROPERTY_FACES_CONTEXT_THEME_KEY = "kieker.webgui.config.lookAndFeel.facesContextKey"; private static final String PROPERTY_THEME_COOKIE_NAME = "kieker.webgui.config.lookAndFeel.cookieName"; private static final String PROPERTY_DEFAULT_THEME = "kieker.webgui.config.lookAndFeel.defaultTheme"; + private static final String PROPERTY_LANGUAGE_COOKIE_NAME = "kieker.webgui.config.language.cookieName"; private static final String PROPERTY_PROJECT_OVERVIEW_PAGE = "kieker.webgui.page.projectOverview"; - private static final String PROPERTY_WELCOME_MESSAGE = "kieker.webgui.common.welcomeMessage"; - private static final String PROPERTY_SHORT_WELCOME_MESSAGE = "kieker.webgui.common.shortWelcomeMessage"; private static final String PROPERTY_ANALYSIS_EDITOR_GRID_SIZE_COOKIE_NAME = "kieker.webgui.config.analysisEditor.gridSize.cookieName"; private static final String PROPERTY_ANALYSIS_EDITOR_GRID_COLOR_COOKIE_NAME = "kieker.webgui.config.analysisEditor.gridColor.cookieName"; private static final String PROPERTY_ANALYSIS_EDITOR_DEFAULT_GRID_SIZE = "kieker.webgui.config.analysisEditor.defaultGridSize"; private static final String PROPERTY_ANALYSIS_EDITOR_DEFAULT_GRID_COLOR = "kieker.webgui.config.analysisEditor.defaultGridColor"; + private static final String PROPERTY_WELCOME_MESSAGE = "longWelcomeMessage"; + private static final String PROPERTY_SHORT_WELCOME_MESSAGE = "shortWelcomeMessage"; + private final Properties globalProperties = new Properties(); /** @@ -109,8 +113,9 @@ public final class GlobalPropertiesBean { * * @return The value of the property. */ - public String getWelcomeMessage() { - return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_WELCOME_MESSAGE); + public String getWelcomeMessage(final Locale locale) { + // return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_WELCOME_MESSAGE); + return ResourceBundle.getBundle("messages", locale).getString(GlobalPropertiesBean.PROPERTY_WELCOME_MESSAGE); } /** @@ -118,8 +123,9 @@ public final class GlobalPropertiesBean { * * @return The value of the property. */ - public String getShortWelcomeMessage() { - return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_SHORT_WELCOME_MESSAGE); + public String getShortWelcomeMessage(final Locale locale) { + // return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_SHORT_WELCOME_MESSAGE); + return ResourceBundle.getBundle("messages", locale).getString(GlobalPropertiesBean.PROPERTY_SHORT_WELCOME_MESSAGE); } /** @@ -157,4 +163,8 @@ public final class GlobalPropertiesBean { public String getAnalysisEditorDefaultGridColor() { return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_ANALYSIS_EDITOR_DEFAULT_GRID_COLOR); } + + public String getLanguageCookieName() { + return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_LANGUAGE_COOKIE_NAME); + } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentConfigurationBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentConfigurationBean.java index 76c67761..cf246f53 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentConfigurationBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/CurrentConfigurationBean.java @@ -16,6 +16,7 @@ package kieker.webgui.beans.session; +import java.util.Locale; import java.util.Map; import javax.annotation.PostConstruct; @@ -39,6 +40,7 @@ import kieker.webgui.beans.application.GlobalPropertiesBean; @SessionScoped public final class CurrentConfigurationBean { + private String locale; private String lookAndFeel; private String gridColor; private int gridSize; @@ -158,6 +160,26 @@ public final class CurrentConfigurationBean { } } + public void setLocale(final String locale) { + synchronized (this) { + this.locale = locale; + CurrentConfigurationBean.saveValueInCookie(this.globalPropertiesBean.getLanguageCookieName(), locale); + + } + } + + public String getLocale() { + synchronized (this) { + return this.locale; + } + } + + public Locale getLocaleObject() { + synchronized (this) { + return new Locale(this.locale); + } + } + /** * This method tries to load the default values of the properties from the {@link GlobalPropertiesBean} and the faces context. */ @@ -175,6 +197,8 @@ public final class CurrentConfigurationBean { this.gridColor = this.globalPropertiesBean.getAnalysisEditorDefaultGridColor(); this.gridSize = Integer.parseInt(this.globalPropertiesBean.getAnalysisEditorDefaultGridSize()); + + this.locale = "en"; } } @@ -196,6 +220,9 @@ public final class CurrentConfigurationBean { if (cookies.containsKey(this.globalPropertiesBean.getAnalysisEditorGridSizeCookieName())) { this.gridSize = Integer.parseInt(((Cookie) cookies.get(this.globalPropertiesBean.getAnalysisEditorGridSizeCookieName())).getValue()); } + if (cookies.containsKey(this.globalPropertiesBean.getLanguageCookieName())) { + this.locale = ((Cookie) cookies.get(this.globalPropertiesBean.getLanguageCookieName())).getValue(); + } } } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/UserBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/UserBean.java index 0e3df0b7..02e4db07 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/UserBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/UserBean.java @@ -38,10 +38,14 @@ public final class UserBean { private static final String WELCOME_MSG_TEMPLATE = "growlComp.renderMessage({summary : '%s', detail : '%s', severity: 'info'});"; private String userName; + private String password; @ManagedProperty(value = "#{globalPropertiesBean}") private GlobalPropertiesBean globalPropertiesBean; + @ManagedProperty(value = "#{currentConfigurationBean}") + private CurrentConfigurationBean currentConfigurationBean; + /** * Default constructor. <b>Do not use this constructor. This bean is JSF managed.</b> */ @@ -68,6 +72,14 @@ public final class UserBean { this.userName = name; } + public String getPassword() { + return this.password; + } + + public void setPassword(final String password) { + this.password = password; + } + /** * Tries to login. If this has been successful the page of the project overview will be returned. * @@ -100,13 +112,22 @@ public final class UserBean { this.globalPropertiesBean = globalPropertiesBean; } + public CurrentConfigurationBean getCurrentConfigurationBean() { + return this.currentConfigurationBean; + } + + public void setCurrentConfigurationBean(final CurrentConfigurationBean currentConfigurationBean) { + this.currentConfigurationBean = currentConfigurationBean; + } + /** * This method shows the welcome message using the growl component and the global properties. */ public void showWelcomeMessage() { if (this.globalPropertiesBean != null) { - final String finalMsg = String.format(UserBean.WELCOME_MSG_TEMPLATE, this.globalPropertiesBean.getShortWelcomeMessage(), - this.globalPropertiesBean.getWelcomeMessage()); + final String finalMsg = String.format(UserBean.WELCOME_MSG_TEMPLATE, + this.globalPropertiesBean.getShortWelcomeMessage(this.currentConfigurationBean.getLocaleObject()), + this.globalPropertiesBean.getWelcomeMessage(this.currentConfigurationBean.getLocaleObject())); RequestContext.getCurrentInstance().execute(finalMsg); } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java index 5a8dd732..030cab75 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java @@ -170,9 +170,9 @@ public final class CurrentAnalysisEditorGraphBean { */ public void declareGraph() { RequestContext.getCurrentInstance().execute(CurrentAnalysisEditorGraphBean.JS_CMD_CREATE_GRAPH_VAR); - RequestContext.getCurrentInstance().execute("graph.setNodeIcon('Filter', '../img/FilterIcon.png');"); - RequestContext.getCurrentInstance().execute("graph.setNodeIcon('Reader', '../img/ReaderIcon.png');"); - RequestContext.getCurrentInstance().execute("graph.setNodeIcon('Repository', '../img/RepositoryIcon.png');"); + RequestContext.getCurrentInstance().execute("graph.setNodeIcon('Filter', '../img/graphIcons/FilterIcon.png');"); + RequestContext.getCurrentInstance().execute("graph.setNodeIcon('Reader', '../img/graphIcons/ReaderIcon.png');"); + RequestContext.getCurrentInstance().execute("graph.setNodeIcon('Repository', '../img/graphIcons/RepositoryIcon.png');"); } /** diff --git a/Kieker.WebGUI/src/main/resources/global.properties b/Kieker.WebGUI/src/main/resources/global.properties index 7a0c847e..915ffb4c 100644 --- a/Kieker.WebGUI/src/main/resources/global.properties +++ b/Kieker.WebGUI/src/main/resources/global.properties @@ -1,12 +1,3 @@ -#------------------------------------------------------------------------------ -# -# These constants concern common things -# -#------------------------------------------------------------------------------ - -kieker.webgui.common.shortWelcomeMessage = Welcome to the Kieker.WebGUI -kieker.webgui.common.welcomeMessage = This is an early alpha version of the Kieker Web GUI. Therefore it may contain bugs and some functionality may have not been implemented yet. Just click "Login" to continue. - #------------------------------------------------------------------------------ # # These constants concern the further (and more specific) configuration of the @@ -14,6 +5,8 @@ kieker.webgui.common.welcomeMessage = This is an early alpha version of the Kiek # #------------------------------------------------------------------------------ +kieker.webgui.config.language.cookieName = language + kieker.webgui.config.lookAndFeel.cookieName = lookAndFeel kieker.webgui.config.lookAndFeel.defaultTheme = glass-x kieker.webgui.config.lookAndFeel.facesContextKey = theme diff --git a/Kieker.WebGUI/src/main/resources/messages_de.properties b/Kieker.WebGUI/src/main/resources/messages_de.properties new file mode 100644 index 00000000..4c09a04c --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/messages_de.properties @@ -0,0 +1,146 @@ +#------------------------------------------------------------------------------ +# +# These are the messages which are commonly used within all pages. +# +#------------------------------------------------------------------------------ + +yes=Ja +ok=Ok +cancel=Abbrechen + +file=Datei +newProject=Neues Project +importProject=Projekt Importieren +refreshProjectsList=Projektliste Aktualisieren +settings=Einstellungen + +help=Hilfe +userGuide=User Guide +about=\u00dcber... + +analysisEditor=Analyse Editor +analysis=Analyse +analysisController=Analyse Controller +cockpitEditor=Cockpit Editor +cockpit=Cockpit + +#------------------------------------------------------------------------------ +# +# These are the messages for the login page. +# +#------------------------------------------------------------------------------ + +shortWelcomeMessage=Willkommen bei der Kieker.WebGUI +longWelcomeMessage=Dies ist eine fr\u00fche Alpha Version der Kieker Web GUI. Deshalb kann diese noch Bugs enthalten und einige Funktionalit\u00e4ten sind m\u00f6glicherweise noch nicht implementiert. Klicken Sie einfach auf "Anmelden" um fortzufahren. + +username=Benutzername +password=Passwort + +login=Anmelden + +#------------------------------------------------------------------------------ +# +# These are the messages for the project overview page. +# +#------------------------------------------------------------------------------ + +projectName=Projektname +state=Status +lastModification=Letzte \u00c4nderung +owner=Besitzer + +copyProject=Projekt Kopieren +renameProject=Projekt Umbenennen +deleteProject=Projekt L\u00f6schen + +name=Name +newName=Neuer Name + +msgReallyDeleteProject=M\u00f6chten Sie wirklich das ausgew\u00e4hlte Projekt l\u00f6schen? + +#------------------------------------------------------------------------------ +# +# These are the messages for the analysis editor page. +# +#------------------------------------------------------------------------------ + +saveProject=Projekt Speichern +saveProjectAs=Projekt Speichern Unter +reloadProject=Projekt Neu Laden +manageLibraries=Bibliotheken Verwalten +closeProject=Projekt schlie\u00dfen + +graph=Graph +analysisEditorScaleToFit = An Fenstergr\u00f6\u00dfe Anpassen +grid=Gitter +snap=Einrasten +autoLayout=Auto-Layout + +disable=Deaktivieren +enable=Aktivieren + +noPropertiesAvailable=Keine Eigenschaften vorhanden + +className=ClassName + +tooltipClassName=Der Klassenname der Komponente. +tooltipName=Der Name der Komponente. + +availablePlugins=Verf\u00fcgbare Plugins + +reader=Reader +filter=Filter +repositories=Repositories + +configuration=Konfiguration +dependencies=Abh\u00e4ngigkeiten +inputPorts=Eingabeports +outputPorts=Ausgabeports +repositoryPorts=Repositoryports + +msgProjectModified=Das Projekt wurde in der Zwischenzeit au\u00dferhalb dieses Editors modifiziert. Wollen Sie die \u00c4nderungen \u00fcberschreiben? + +properties=Eigenschaften +property=Eigenschaft +value=Wert + +libraries=Bibliotheken +fileName=Dateiname +fileSize=Gr\u00f6\u00dfe +libOptions=Optionen + +msgOnlyJar=Zur Zeit k\u00f6nnen lediglich *.jar-Abh\u00e4ngigkeiten hochgeladen werden. Die maximale Dateigr\u00f6\u00dfe ist beschr\u00e4nkt auf 100 [MiByte]. + +#------------------------------------------------------------------------------ +# +# These are the messages for the analysis page. +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# +# These are the messages for the cockpit editor page. +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# +# These are the messages for the cockpit page. +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# +# These are the messages for the settings dialog. +# +#------------------------------------------------------------------------------ + +common=Allgemein +lookAndFeel=Aussehen +chooseTheme=Motiv Ausw\u00e4hlen +language=Sprache + +toolPalette=Werkzeugpalette +lists=Listen +gridSize=Gittergr\u00f6\u00dfe +gridColor=Gitterfarbe \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/messages_en.properties b/Kieker.WebGUI/src/main/resources/messages_en.properties new file mode 100644 index 00000000..ea4ef0ca --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/messages_en.properties @@ -0,0 +1,160 @@ +#------------------------------------------------------------------------------ +# +# These are the messages which are commonly used within all pages. +# +#------------------------------------------------------------------------------ + +yes=Yes +ok=Ok +cancel=Cancel + +file=File +newProject=New Project +importProject=Import Project +refreshProjectsList=Refresh Projects List +settings=Settings + +help=Help +userGuide=User Guide +about=About... + +analysisEditor=Analysis Editor +analysis=Analysis +analysisController=Analysis Controller +cockpitEditor=Cockpit Editor +cockpit=Cockpit + +#------------------------------------------------------------------------------ +# +# These are the messages for the login page. +# +#------------------------------------------------------------------------------ + +shortWelcomeMessage=Welcome to the Kieker.WebGUI +longWelcomeMessage=This is an early alpha version of the Kieker Web GUI. Therefore it may contain bugs and some functionality may have not been implemented yet. Just click "Login" to continue. + +username=Username +password=Password + +login=Login + +#------------------------------------------------------------------------------ +# +# These are the messages for the project overview page. +# +#------------------------------------------------------------------------------ + +projectName=Project Name +state=State +lastModification=Last Modification +owner=Owner + +copyProject=Copy Project +renameProject=Rename Project +deleteProject=Delete Project + +name=Name +newName=New Name + +msgReallyDeleteProject=Do you really want to delete the selected project? + +#------------------------------------------------------------------------------ +# +# These are the messages for the analysis editor page. +# +#------------------------------------------------------------------------------ + +saveProject=Save Project +saveProjectAs=Save Project As +reloadProject=Reload Project +manageLibraries=Manage Libraries +closeProject=Close Project + +graph=Graph +scaleToFit=Scale To Fit +grid=Grid +snap=Snap +autoLayout=Auto-Layout + +disable=Disable +enable=Enable + +noPropertiesAvailable=No properties available + +className=ClassName + +tooltipClassName=The class name of this component. +tooltipName=The name of this component. + +availablePlugins=Available Plugins + +reader=Reader +filter=Filter +repositories=Repositories + +configuration=Configuration +dependencies=Dependencies +inputPorts=Input Ports +outputPorts=Output Ports +repositoryPorts=Repository Ports + +msgProjectModified=The project has been modified externally in the meanwhile. Do you want to overwrite the changes? + +properties=Properties +property=Property +value=Value + +libraries=Libraries +fileName=Filename +fileSize=Size +libOptions=Options + +msgOnlyJar=Currently only *.jar-Dependencies can be uploaded. The maximal file size is limited to 100 [MiByte]. + +#------------------------------------------------------------------------------ +# +# These are the messages for the analysis page. +# +#------------------------------------------------------------------------------ + +<p:commandButton value="Instantiate Analysis Controller" action="#{currentControllerBean.instantiateAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="Clean Analysis" action="#{currentControllerBean.cleanAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="Start Analysis" action="#{currentControllerBean.startAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="Stop Analysis" + + <p:tooltip for="iconLEDRed1" value="Indicates that the AnalysisController has not been instantiated yet."/> + <p:tooltip for="iconLEDYellow" value="Indicates that the AnalysisController has been instantiated, but not yet started."/> + <p:tooltip for="iconLEDGreen" value="Indicates that the AnalysisController has been started and is running."/> + <p:tooltip for="iconLEDRed2" value="Indicates that the AnalysisController has been terminated or has failed."/> + <p:tooltip for="iconLEDRed1_2" value="Indicates that the AnalysisController has not been instantiated yet."/> + <p:tooltip for="iconLEDYellow_2" value="Indicates that the AnalysisController has been instantiated, but not yet started."/> + <p:tooltip for="iconLEDGreen_2" value="Indicates that the AnalysisController has been started and is running."/> + <p:tooltip for="iconLEDRed2_2" value="Indicates that the AnalysisController has been terminated or has failed."/> + +#------------------------------------------------------------------------------ +# +# These are the messages for the cockpit editor page. +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# +# These are the messages for the cockpit page. +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# +# These are the messages for the settings dialog. +# +#------------------------------------------------------------------------------ + +common=Common +lookAndFeel=Look and Feel +chooseTheme=Choose Theme +language=Language + +toolPalette=Tool Palette +lists=Lists +gridSize=Grid-Size +gridColor=Grid-Color \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml b/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml index 935666ce..720e408a 100644 --- a/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml +++ b/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml @@ -13,282 +13,283 @@ <f:event type="preRenderView" listener="#{currentAnalysisEditorBean.initialize()}" /> </f:metadata> - <h:head> - <title>Kieker.WebGUI</title> - <!-- Load the necessary CSS files. --> - <link rel="stylesheet" type="text/css" href="../css/base.css" /> - <link rel="stylesheet" type="text/css" href="../css/FlowEditor.css" /> - <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/AnalysisEditor.css" /> + <f:view locale="#{currentConfigurationBean.locale}"> + <h:head> + <title>Kieker.WebGUI</title> + <!-- Load the necessary CSS files. --> + <link rel="stylesheet" type="text/css" href="../css/FlowEditor.css" /> + <link rel="stylesheet" type="text/css" href="../css/Common.css" /> + <link rel="stylesheet" type="text/css" href="../css/AnalysisEditor.css" /> - <!-- Load the necessary JS files. --> - <script language="javascript" type="text/javascript" src="../js/jit.js"></script> - <script language="javascript" type="text/javascript" src="../js/flowEditor.js"></script> + <!-- Load the necessary JS files. --> + <script language="javascript" type="text/javascript" src="../js/jit.js"></script> + <script language="javascript" type="text/javascript" src="../js/flowEditor.js"></script> - <script> - nodeClickListener = function(node, info, e) { - nodeClickCommand([{name : 'ID', value : node.id}]); - } + <script> + nodeClickListener = function(node, info, e) { + nodeClickCommand([{name : 'ID', value : node.id}]); + } - nodeRemoveListener = function(node) { - nodeRemoveCommand([{name : 'ID', value : node.id}]); - } + nodeRemoveListener = function(node) { + nodeRemoveCommand([{name : 'ID', value : node.id}]); + } - edgeCreateListener = function(sourceNode, targetNode, sourcePort, targetPort) { - edgeCreateCommand([{name : 'sourcePortID', value : sourcePort.id},{name : 'targetPortID', value : targetPort.id}]); - } + edgeCreateListener = function(sourceNode, targetNode, sourcePort, targetPort) { + edgeCreateCommand([{name : 'sourcePortID', value : sourcePort.id},{name : 'targetPortID', value : targetPort.id}]); + } - edgeRemoveListener = function(sourceNode, targetNode, sourcePort, targetPort) { - edgeRemoveCommand([{name : 'sourcePortID', value : sourcePort.id},{name : 'targetPortID', value : targetPort.id}]); - } - </script> - </h:head> + edgeRemoveListener = function(sourceNode, targetNode, sourcePort, targetPort) { + edgeRemoveCommand([{name : 'sourcePortID', value : sourcePort.id},{name : 'targetPortID', value : targetPort.id}]); + } + </script> + </h:head> - <h:body> - <h:form id="hidden" style="display:none"> - <p:remoteCommand autoRun="true" name="init" action="#{currentAnalysisEditorBean.initializeGraph()}" /> - </h:form> - <h:form id="hiddenNodeProperties" style="display:none"> - <p:remoteCommand name="nodeClickCommand" action="#{currentAnalysisEditorGraphBean.nodeClicked()}" update=":propertiesForm"/> - <p:remoteCommand name="nodeRemoveCommand" action="#{currentAnalysisEditorGraphBean.nodeRemoved()}" update=":propertiesForm"/> - <p:remoteCommand name="edgeCreateCommand" action="#{currentAnalysisEditorGraphBean.edgeCreated()}"/> - <p:remoteCommand name="edgeRemoveCommand" action="#{currentAnalysisEditorGraphBean.edgeRemoved()}"/> - </h:form> + <h:body> + <h:form id="hidden" style="display:none"> + <p:remoteCommand autoRun="true" name="init" action="#{currentAnalysisEditorBean.initializeGraph()}" /> + </h:form> + <h:form id="hiddenNodeProperties" style="display:none"> + <p:remoteCommand name="nodeClickCommand" action="#{currentAnalysisEditorGraphBean.nodeClicked()}" update=":propertiesForm"/> + <p:remoteCommand name="nodeRemoveCommand" action="#{currentAnalysisEditorGraphBean.nodeRemoved()}" update=":propertiesForm"/> + <p:remoteCommand name="edgeCreateCommand" action="#{currentAnalysisEditorGraphBean.edgeCreated()}"/> + <p:remoteCommand name="edgeRemoveCommand" action="#{currentAnalysisEditorGraphBean.edgeRemoved()}"/> + </h:form> - <p:layout fullPage="true"> + <p:layout fullPage="true"> - <p:layoutUnit position="north"> - <h:form id="menuForm"> - <!-- The following is the toolbar to navigate between the different pages. --> - <p:toolbar> - <p:toolbarGroup align="left"> - <h:outputText styleClass="kieker-title" value="Kieker » #{stringBean.shortenLongName(currentAnalysisEditorBean.projectName, 30)}"/> - </p:toolbarGroup> - <p:toolbarGroup align="right"> - <p:commandButton styleClass="perspective-button" icon="ui-icon-home" action="ProjectOverview.xhtml?faces-redirect=true" /> - <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Analysis Editor" disabled="true"/> - <p:button styleClass="perspective-button" icon="ui-icon-circle-triangle-e" value="Analysis" outcome="Controller.xhtml?faces-redirect=true"> - <f:param name="projectName" value="#{currentAnalysisEditorBean.projectName}" rendered="#{not empty currentAnalysisEditorBean.projectName}" /> - </p:button> - <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Cockpit Editor" disabled="true"> - </p:button> - <p:button styleClass="perspective-button" icon="ui-icon-image" value="Cockpit" disabled="true"> - </p:button> - </p:toolbarGroup> - </p:toolbar> + <p:layoutUnit position="north"> + <h:form id="menuForm"> + <!-- The following is the toolbar to navigate between the different pages. --> + <p:toolbar> + <p:toolbarGroup align="left"> + <h:outputText styleClass="kieker-title" value="Kieker » #{stringBean.shortenLongName(currentAnalysisEditorBean.projectName, 30)}"/> + </p:toolbarGroup> + <p:toolbarGroup align="right"> + <p:commandButton styleClass="perspective-button" icon="ui-icon-home" action="ProjectOverview.xhtml?faces-redirect=true" /> + <p:separator/> + <p:button styleClass="perspective-button" icon="ui-icon-analysisEditor" value="#{localizedMessages.analysisEditor}" disabled="true"/> + <p:button styleClass="perspective-button" icon="ui-icon-analysis" value="#{localizedMessages.analysis}" outcome="Controller.xhtml?faces-redirect=true"> + <f:param name="projectName" value="#{currentAnalysisEditorBean.projectName}" rendered="#{not empty currentAnalysisEditorBean.projectName}" /> + </p:button> + <p:separator/> + <p:button styleClass="perspective-button" icon="ui-icon-cockpitEditor" value="#{localizedMessages.cockpitEditor}" disabled="true"> + </p:button> + <p:button styleClass="perspective-button" icon="ui-icon-cockpit" value="#{localizedMessages.cockpit}" disabled="true"> + </p:button> + </p:toolbarGroup> + </p:toolbar> - <!-- The following is the main menu. --> - <p:menubar> - <p:submenu label="File"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-disk" value=" Save Project" update=":messages" ajax="true" action="#{currentAnalysisEditorBean.saveProject(false)}" disabled="#{empty currentAnalysisEditorBean.project}"/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-disk" value=" Save Project As" update=":messages" ajax="true" disabled="#{true or empty currentAnalysisEditorBean.project}"/> - <p:separator /> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-refresh" value=" Reload Project" ajax="false" url="analysisEditor?projectName=#{currentAnalysisEditorBean.projectName}" disabled="#{empty currentAnalysisEditorBean.project}" /> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-bookmark" value=" Manage Libraries" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> - <p:separator /> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-gear" value=" Settings" onclick="settingsDlg.show()" ajax="true"/> - <p:separator /> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-circle-close" value=" Close Project" action="ProjectOverview.xhtml?faces-redirect=true" ajax="false"/> - </p:submenu> + <!-- The following is the main menu. --> + <p:menubar> + <p:submenu label="#{localizedMessages.file}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-save" value=" #{localizedMessages.saveProject}" update=":messages" ajax="true" action="#{currentAnalysisEditorBean.saveProject(false)}" disabled="#{empty currentAnalysisEditorBean.project}"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveAs" value=" #{localizedMessages.saveProjectAs}" update=":messages" ajax="true" disabled="#{true or empty currentAnalysisEditorBean.project}"/> + <p:separator /> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value=" #{localizedMessages.reloadProject}" ajax="false" url="analysisEditor?projectName=#{currentAnalysisEditorBean.projectName}" disabled="#{empty currentAnalysisEditorBean.project}" /> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-manageLibraries" value=" #{localizedMessages.manageLibraries}" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> + <p:separator /> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> + <p:separator /> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-close" value=" #{localizedMessages.closeProject}" action="ProjectOverview.xhtml?faces-redirect=true" ajax="false"/> + </p:submenu> - <p:submenu label="Graph"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-search" value=" Scale To Fit" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" /> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-grip-dotted-horizontal" value=" #{currentAnalysisEditorGraphBean.gridEnabled ? 'Disable' : 'Enable'} Grid" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-link" value=" #{currentAnalysisEditorGraphBean.snapEnabled ? 'Disable' : 'Enable'} Snap" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-shuffle" value=" Auto-Layout" ajax="true" /> - </p:submenu> + <p:submenu label="Graph"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-scaleToFitSmall" value=" #{localizedMessages.analysisEditorScaleToFit}" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" /> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabledSmall' : 'ui-icon-gridDisabledSmall'}" value=" #{localizedMessages.grid} #{currentAnalysisEditorGraphBean.gridEnabled ? localizedMessages.disable : localizedMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/> + <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabledSmall' : 'ui-icon-snapDisabledSmall'}" value=" #{localizedMessages.snap} #{currentAnalysisEditorGraphBean.snapEnabled ? localizedMessages.disable: localizedMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-autoLayoutSmall" value=" #{localizedMessages.autoLayout}" ajax="true" /> + </p:submenu> - <p:submenu label="Help"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-help" value=" User Guide" ajax="true" disabled="true"/> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-comment" value=" About..." onclick="aboutDlg.show()" ajax="true"/> - </p:submenu> + <p:submenu label="#{localizedMessages.help}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-userGuide" value=" #{localizedMessages.userGuide}" ajax="true" disabled="true"/> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-about" value=" #{localizedMessages.about}" onclick="aboutDlg.show()" ajax="true"/> + </p:submenu> - <p:menuitem styleClass="logOutButton" icon="ui-icon-power" value="#{userBean.userName}" ajax="true" url="login"/> - </p:menubar> - <p:spacer height="5"/> - <p:menubar> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-search" value=" Scale To Fit" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" /> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-grip-dotted-horizontal" value=" #{currentAnalysisEditorGraphBean.gridEnabled ? 'Disable' : 'Enable'} Grid" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-link" value=" #{currentAnalysisEditorGraphBean.snapEnabled ? 'Disable' : 'Enable'} Snap" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-shuffle" value=" Auto-Layout" ajax="true" /> - </p:menubar> - </h:form> - </p:layoutUnit> + <p:menuitem styleClass="logOutButton element-with-whitespace" icon="ui-icon-logout" value=" #{userBean.userName}" ajax="true" url="login"/> + </p:menubar> + <p:spacer height="5"/> + <p:menubar> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-scaleToFit" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" /> + <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabled' : 'ui-icon-gridDisabled'}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/> + <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabled' : 'ui-icon-snapDisabled'}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-autoLayout" ajax="true" /> + </p:menubar> + </h:form> + </p:layoutUnit> - <!-- This is the center component showing the graph and everything. --> - <p:layoutUnit style="font-size: 12px" position="center" id="centerLayout"> - <div id="center-container" style="width: 100%;height: 100%"> - <div id="infovis"/> - </div> - </p:layoutUnit> + <!-- This is the center component showing the graph and everything. --> + <p:layoutUnit style="font-size: 12px" position="center" id="centerLayout"> + <div id="center-container" style="width: 100%;height: 100%"> + <div id="infovis"/> + </div> + </p:layoutUnit> - <!-- This is the component presenting the available properties. --> - <p:layoutUnit style="font-size: 12px" position="south" size="150" header="Properties" resizable="true" collapsible="true"> - <h:form id="propertiesForm" > - <p:dataTable editable="true" value="#{currentAnalysisEditorBean.advancedPluginProperties}" var="property" rowIndexVar="rowIndex" emptyMessage="No properties available" rendered="#{not empty currentAnalysisEditorBean.selectedPlugin}"> - <p:column headerText="Property" style="width:125px"> - <!-- The first property is always the classname, the second one always the normal name. After that, other properties can follow. --> - <h:outputText id="classNameProperty" value="ClassName" rendered="#{rowIndex == 0}"/> - <h:outputText id="nameProperty" value="Name" rendered="#{rowIndex == 1}"/> - <h:outputText id="normalProperty" value="#{property.name}" rendered="#{rowIndex > 1}"/> - <p:tooltip for="classNameProperty" value="The class name of this component." rendered="#{rowIndex == 0}"/> - <p:tooltip for="nameProperty" value="The name of this component." rendered="#{rowIndex == 1}"/> - <p:tooltip for="normalProperty" value="#{currentAnalysisEditorBean.getDescription(currentAnalysisEditorBean.selectedPlugin, property.name)}" rendered="#{rowIndex > 1}"/> - </p:column> + <!-- This is the component presenting the available properties. --> + <p:layoutUnit style="font-size: 12px" position="south" size="150" header="#{localizedMessages.properties}" resizable="true" collapsible="true"> + <h:form id="propertiesForm" > + <p:dataTable editable="true" value="#{currentAnalysisEditorBean.advancedPluginProperties}" var="property" rowIndexVar="rowIndex" emptyMessage="No properties available" rendered="#{not empty currentAnalysisEditorBean.selectedPlugin}"> + <p:column headerText="#{localizedMessages.property}" style="width:125px"> + <!-- The first property is always the classname, the second one always the normal name. After that, other properties can follow. --> + <h:outputText id="classNameProperty" value="#{localizedMessages.className}" rendered="#{rowIndex == 0}"/> + <h:outputText id="nameProperty" value="#{localizedMessages.name}" rendered="#{rowIndex == 1}"/> + <h:outputText id="normalProperty" value="#{property.name}" rendered="#{rowIndex > 1}"/> + <p:tooltip for="classNameProperty" value="#{localizedMessages.tooltipClassName}" rendered="#{rowIndex == 0}"/> + <p:tooltip for="nameProperty" value="#{localizedMessages.tooltipName}" rendered="#{rowIndex == 1}"/> + <p:tooltip for="normalProperty" value="#{currentAnalysisEditorBean.getDescription(currentAnalysisEditorBean.selectedPlugin, property.name)}" rendered="#{rowIndex > 1}"/> + </p:column> - <!-- The classname is not editable, the name is editable with a specific target, other properies are editable normally. --> - <p:column headerText="Value" style="width:125px"> - <h:outputText id="className" value="#{currentAnalysisEditorBean.selectedPlugin.classname}" rendered="#{rowIndex == 0}"/> - <p:inplace id="nameEditor" editor="true" rendered="#{rowIndex == 1}" > - <p:inputText value="#{currentAnalysisEditorBean.selectedPlugin.name}" /> - <p:ajax event="save" listener="#{currentAnalysisEditorGraphBean.renameNode(currentAnalysisEditorBean.selectedPlugin, currentAnalysisEditorBean.selectedPlugin.name)}" /> - </p:inplace> - <p:inplace id="normalEditor" editor="true" rendered="#{rowIndex > 1}"> - <p:inputText value="#{property.value}" /> - </p:inplace> - <p:tooltip for="className" value="The class name of this component." rendered="#{rowIndex == 0}"/> - <p:tooltip for="nameEditor" value="The name of this component." rendered="#{rowIndex == 1}"/> - <p:tooltip for="normalEditor" value="#{currentAnalysisEditorBean.getDescription(currentAnalysisEditorBean.selectedPlugin, property.name)}" rendered="#{rowIndex > 1}"/> - </p:column> - </p:dataTable> - </h:form> - </p:layoutUnit> + <!-- The classname is not editable, the name is editable with a specific target, other properies are editable normally. --> + <p:column headerText="#{localizedMessages.value}" style="width:125px"> + <h:outputText id="className" value="#{currentAnalysisEditorBean.selectedPlugin.classname}" rendered="#{rowIndex == 0}"/> + <p:inplace id="nameEditor" editor="true" rendered="#{rowIndex == 1}" > + <p:inputText value="#{currentAnalysisEditorBean.selectedPlugin.name}" /> + <p:ajax event="save" listener="#{currentAnalysisEditorGraphBean.renameNode(currentAnalysisEditorBean.selectedPlugin, currentAnalysisEditorBean.selectedPlugin.name)}" /> + </p:inplace> + <p:inplace id="normalEditor" editor="true" rendered="#{rowIndex > 1}"> + <p:inputText value="#{property.value}" /> + </p:inplace> + <p:tooltip for="className" value="#{localizedMessages.tooltipClassName}" rendered="#{rowIndex == 0}"/> + <p:tooltip for="nameEditor" value="#{localizedMessages.tooltipName}" rendered="#{rowIndex == 1}"/> + <p:tooltip for="normalEditor" value="#{currentAnalysisEditorBean.getDescription(currentAnalysisEditorBean.selectedPlugin, property.name)}" rendered="#{rowIndex > 1}"/> + </p:column> + </p:dataTable> + </h:form> + </p:layoutUnit> - <!-- The following is the toolpalette, presenting the available plugins etc. --> - <p:layoutUnit position="east" size="300" header="Available Plugins" resizable="true" collapsible="true"> - <h:form id="toolpalette"> - <p:accordionPanel multiple="true" activeIndex="0,1,2"> - <p:tab title="Reader"> - <ui:repeat value="#{currentAnalysisEditorBean.availableReaders}" var="reader"> - <p:commandLink id="readerLink" value="#{reader.simpleName}" action="#{currentAnalysisEditorBean.addPlugin(reader)}" update=":messages" /><br/> - <p:tooltip for="readerLink"> - <b><h:outputText value="#{reader.simpleName} (#{reader.name})"/></b> - <br/> - <h:outputText value="#{currentAnalysisEditorBean.getDescription(reader)}"/> - <br/><br/> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getOutputPorts(reader)}"> - <b><h:outputText value="Output Ports:"/></b> - <p:dataList value="#{currentAnalysisEditorBean.getOutputPorts(reader)}" var="port"> - #{port.name()} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getRepositoryPorts(reader)}"> - <b><h:outputText value="Repository Ports:" /></b> - <p:dataList value="#{currentAnalysisEditorBean.getRepositoryPorts(reader)}" var="port"> - #{port.name()} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getProperties(reader)}"> - <b><h:outputText value="Configuration:"/></b> - <p:dataList value="#{currentAnalysisEditorBean.getProperties(reader)}" var="property"> - #{property.name()} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getDependencies(reader)}"> - <b><h:outputText value="Dependencies:"/></b> + <!-- The following is the toolpalette, presenting the available plugins etc. --> + <p:layoutUnit position="east" size="300" header="#{localizedMessages.availablePlugins}" resizable="true" collapsible="true"> + <h:form id="toolpalette"> + <p:accordionPanel multiple="true" activeIndex="0,1,2"> + <p:tab title="#{localizedMessages.reader}"> + <ui:repeat value="#{currentAnalysisEditorBean.availableReaders}" var="reader"> + <p:commandLink id="readerLink" value="#{reader.simpleName}" action="#{currentAnalysisEditorBean.addPlugin(reader)}" update=":messages" /><br/> + <p:tooltip for="readerLink"> + <b><h:outputText value="#{reader.simpleName} (#{reader.name})"/></b> <br/> - <h:outputText value="#{currentAnalysisEditorBean.getDependencies(reader)}"/> - </ui:fragment> - </p:tooltip> - </ui:repeat> - </p:tab> - <p:tab title="Filter"> - <ui:repeat value="#{currentAnalysisEditorBean.availableFilters}" var="filter"> - <p:commandLink id="filterLink" value="#{filter.simpleName}" action="#{currentAnalysisEditorBean.addPlugin(filter)}" update=":messages"/><br/> - <p:tooltip for="filterLink"> - <b><h:outputText value="#{filter.simpleName} (#{filter.name})"/></b> - <br/> - <h:outputText value="#{currentAnalysisEditorBean.getDescription(filter)}"/> - <br/><br/> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getInputPorts(filter)}"> - <b><h:outputText value="Input Ports:"/></b> - <p:dataList value="#{currentAnalysisEditorBean.getInputPorts(filter)}" var="port"> - #{port.name()} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getOutputPorts(filter)}"> - <b><h:outputText value="Output Ports:"/></b> - <p:dataList value="#{currentAnalysisEditorBean.getOutputPorts(filter)}" var="port"> - #{port.name()} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getRepositoryPorts(filter)}"> - <b><h:outputText value="Repository Ports:"/></b> - <p:dataList value="#{currentAnalysisEditorBean.getRepositoryPorts(filter)}" var="port"> - #{port.name()} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getProperties(filter)}"> - <b><h:outputText value="Configuration:"/></b> - <p:dataList value="#{currentAnalysisEditorBean.getProperties(filter)}" var="property"> - #{property.name()} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getDependencies(filter)}"> - <b><h:outputText value="Dependencies:"/></b> + <h:outputText value="#{currentAnalysisEditorBean.getDescription(reader)}"/> + <br/><br/> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getOutputPorts(reader)}"> + <b><h:outputText value="#{localizedMessages.outputPorts}:"/></b> + <p:dataList value="#{currentAnalysisEditorBean.getOutputPorts(reader)}" var="port"> + #{port.name()} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getRepositoryPorts(reader)}"> + <b><h:outputText value="#{localizedMessages.repositoryPorts}:" /></b> + <p:dataList value="#{currentAnalysisEditorBean.getRepositoryPorts(reader)}" var="port"> + #{port.name()} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getProperties(reader)}"> + <b><h:outputText value="#{localizedMessages.configuration}:"/></b> + <p:dataList value="#{currentAnalysisEditorBean.getProperties(reader)}" var="property"> + #{property.name()} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getDependencies(reader)}"> + <b><h:outputText value="#{localizedMessages.dependencies}:"/></b> + <br/> + <h:outputText value="#{currentAnalysisEditorBean.getDependencies(reader)}"/> + </ui:fragment> + </p:tooltip> + </ui:repeat> + </p:tab> + <p:tab title="#{localizedMessages.filter}"> + <ui:repeat value="#{currentAnalysisEditorBean.availableFilters}" var="filter"> + <p:commandLink id="filterLink" value="#{filter.simpleName}" action="#{currentAnalysisEditorBean.addPlugin(filter)}" update=":messages"/><br/> + <p:tooltip for="filterLink"> + <b><h:outputText value="#{filter.simpleName} (#{filter.name})"/></b> <br/> - <h:outputText value="#{currentAnalysisEditorBean.getDependencies(filter)}"/> - </ui:fragment> - </p:tooltip> - </ui:repeat> - </p:tab> - <p:tab title="Repositories"> - <ui:repeat value="#{currentAnalysisEditorBean.availableRepositories}" var="repository"> - <p:commandLink id="repositoryLink" value="#{repository.simpleName}" action="#{currentAnalysisEditorBean.addRepository(repository)}" update=":messages"/><br/> - <p:tooltip for="repositoryLink"> - <b><h:outputText value="#{repository.simpleName} (#{repository.name})"/></b> - <br/> - <h:outputText value="#{currentAnalysisEditorBean.getDescription(repository)}"/> - <br/><br/> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getProperties(repository)}"> - <b><h:outputText value="Configuration:"/></b> - <p:dataList value="#{currentAnalysisEditorBean.getProperties(repository)}" var="property"> - #{property.name()} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getDependencies(repository)}"> - <b><h:outputText value="Dependencies:"/></b> + <h:outputText value="#{currentAnalysisEditorBean.getDescription(filter)}"/> + <br/><br/> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getInputPorts(filter)}"> + <b><h:outputText value="#{localizedMessages.inputPorts}:"/></b> + <p:dataList value="#{currentAnalysisEditorBean.getInputPorts(filter)}" var="port"> + #{port.name()} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getOutputPorts(filter)}"> + <b><h:outputText value="#{localizedMessages.outputPorts}:"/></b> + <p:dataList value="#{currentAnalysisEditorBean.getOutputPorts(filter)}" var="port"> + #{port.name()} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getRepositoryPorts(filter)}"> + <b><h:outputText value="#{localizedMessages.repositoryPorts}:"/></b> + <p:dataList value="#{currentAnalysisEditorBean.getRepositoryPorts(filter)}" var="port"> + #{port.name()} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getProperties(filter)}"> + <b><h:outputText value="#{localizedMessages.configuration}:"/></b> + <p:dataList value="#{currentAnalysisEditorBean.getProperties(filter)}" var="property"> + #{property.name()} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getDependencies(filter)}"> + <b><h:outputText value="#{localizedMessages.dependencies}:"/></b> + <br/> + <h:outputText value="#{currentAnalysisEditorBean.getDependencies(filter)}"/> + </ui:fragment> + </p:tooltip> + </ui:repeat> + </p:tab> + <p:tab title="#{localizedMessages.repositories}"> + <ui:repeat value="#{currentAnalysisEditorBean.availableRepositories}" var="repository"> + <p:commandLink id="repositoryLink" value="#{repository.simpleName}" action="#{currentAnalysisEditorBean.addRepository(repository)}" update=":messages"/><br/> + <p:tooltip for="repositoryLink"> + <b><h:outputText value="#{repository.simpleName} (#{repository.name})"/></b> <br/> - <h:outputText value="#{currentAnalysisEditorBean.getDependencies(repository)}"/> - </ui:fragment> - </p:tooltip> - </ui:repeat> - </p:tab> - </p:accordionPanel> - </h:form> - </p:layoutUnit> - </p:layout> + <h:outputText value="#{currentAnalysisEditorBean.getDescription(repository)}"/> + <br/><br/> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getProperties(repository)}"> + <b><h:outputText value="#{localizedMessages.configuration}:"/></b> + <p:dataList value="#{currentAnalysisEditorBean.getProperties(repository)}" var="property"> + #{property.name()} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty currentAnalysisEditorBean.getDependencies(repository)}"> + <b><h:outputText value="#{localizedMessages.dependencies}:"/></b> + <br/> + <h:outputText value="#{currentAnalysisEditorBean.getDependencies(repository)}"/> + </ui:fragment> + </p:tooltip> + </ui:repeat> + </p:tab> + </p:accordionPanel> + </h:form> + </p:layoutUnit> + </p:layout> - <p:dialog header="Save Project" resizable="false" modal="true" widgetVar="forceSaveDlg"> - <h:form> - <div style="text-align: center"> - <h:outputText value="The project has been modified externally in the meanwhile. Do you want to overwrite the changes?" /> - </div> - <hr/> - <div style="text-align: right"> - <p:commandButton value="Yes" action="#{currentAnalysisEditorBean.saveProject(true)}" oncomplete="forceSaveDlg.hide()" update=":messages" /> - <p:spacer width="10px" height="10" /> - <p:commandButton value="Cancel" onclick="forceSaveDlg.hide()" /> - </div> - </h:form> - </p:dialog> + <p:dialog header="#{localizedMessages.saveProject}" resizable="false" modal="true" widgetVar="forceSaveDlg"> + <h:form> + <div style="text-align: center"> + <h:outputText value="#{localizedMessages.msgProjectModified}" /> + </div> + <hr/> + <div style="text-align: right"> + <p:commandButton value="#{localizedMessages.yes}" action="#{currentAnalysisEditorBean.saveProject(true)}" oncomplete="forceSaveDlg.hide()" update=":messages" /> + <p:spacer width="10px" height="10" /> + <p:commandButton value="#{localizedMessages.cancel}" onclick="forceSaveDlg.hide()" /> + </div> + </h:form> + </p:dialog> - <p:growl id="messages" life="1500" showDetail="true" autoUpdate="false" sticky="true"/> + <p:growl id="messages" life="1500" showDetail="true" autoUpdate="false" sticky="true"/> - <!-- Include the dialog for the configuration. --> - <ui:include src="dialogs/settingsDialog.xhtml" /> + <!-- Include the dialog for the configuration. --> + <ui:include src="dialogs/settingsDialog.xhtml" /> - <!-- Include the about-dialog. --> - <ui:include src="dialogs/aboutDialog.xhtml" /> + <!-- Include the about-dialog. --> + <ui:include src="dialogs/aboutDialog.xhtml" /> - <!-- Include the dialog the manage the libraries. --> - <ui:include src="dialogs/manageLibrariesDialog.xhtml" /> + <!-- Include the dialog the manage the libraries. --> + <ui:include src="dialogs/manageLibrariesDialog.xhtml" /> - </h:body> + </h:body> + </f:view> </html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml b/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml index 044afd45..f0472a9d 100644 --- a/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml +++ b/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml @@ -32,31 +32,31 @@ <p:toolbarGroup align="right"> <p:commandButton styleClass="perspective-button" icon="ui-icon-home" action="ProjectOverview.xhtml" /> <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Analysis Editor" style="white-space: none" outcome="AnalysisEditor.xhtml"> + <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="#{localizedMessages.analysisEditor}" style="white-space: none" outcome="AnalysisEditor.xhtml"> <f:param name="projectName" value="#{currentCockpitBean.projectName}" /> </p:button> - <p:button styleClass="perspective-button" icon="ui-icon-circle-triangle-e" value="Analysis" style="white-space: none" outcome="Controller.xhtml"> + <p:button styleClass="perspective-button" icon="ui-icon-circle-triangle-e" value="#{localizedMessages.analysis}" style="white-space: none" outcome="Controller.xhtml"> <f:param name="projectName" value="#{currentCockpitBean.projectName}" /> </p:button> <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Cockpit Editor" style="white-space: none" outcome="CockpitEditor.xhtml"> + <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="#{localizedMessages.cockpitEditor}" style="white-space: none" outcome="CockpitEditor.xhtml"> <f:param name="projectName" value="#{currentCockpitBean.projectName}" /> </p:button> - <p:button styleClass="perspective-button" icon="ui-icon-image" value="Cockpit" style="white-space: none" disabled="true"> + <p:button styleClass="perspective-button" icon="ui-icon-image" value="#{localizedMessages.cockpit}" style="white-space: none" disabled="true"> </p:button> </p:toolbarGroup> </p:toolbar> <p:menubar> - <p:submenu label="File"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-gear" value=" Settings" onclick="settingsDlg.show()" ajax="true"/> + <p:submenu label="#{localizedMessages.file}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-gear" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-circle-close" value=" Close Project" action="ProjectOverview.xhtml?faces-redirect=true" ajax="false"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-circle-close" value=" #{localizedMessages.closeProject}" action="ProjectOverview.xhtml?faces-redirect=true" ajax="false"/> </p:submenu> - <p:submenu label="Help"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-help" value=" User Guide" ajax="true" disabled="true"/> + <p:submenu label="#{localizedMessages.help}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-help" value=" #{localizedMessages.userGuide}" ajax="true" disabled="true"/> <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-comment" value=" About..." onclick="aboutDlg.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-comment" value=" #{localizedMessages.about}" onclick="aboutDlg.show()" ajax="true"/> </p:submenu> <p:menuitem styleClass="logOutButton" icon="ui-icon-power" value="#{userBean.userName}" ajax="true" url="login"/> diff --git a/Kieker.WebGUI/src/main/webapp/Controller.xhtml b/Kieker.WebGUI/src/main/webapp/Controller.xhtml index bccc8510..e0039b07 100644 --- a/Kieker.WebGUI/src/main/webapp/Controller.xhtml +++ b/Kieker.WebGUI/src/main/webapp/Controller.xhtml @@ -11,111 +11,113 @@ <f:viewParam name="projectName" value="#{currentControllerBean.projectName}"/> </f:metadata> - <h:head> - <title>Kieker.WebGUI</title> - <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/Controller.css" /> - </h:head> - - <h:body> - - <!-- This is the layout for the whole page. --> - <p:layout id="layout" fullPage="true"> - - <p:layoutUnit position="north" collapsible="false"> - <h:form> - <p:toolbar> - <p:toolbarGroup align="left"> - <h:outputText styleClass="kieker-title" value="Kieker » #{stringBean.shortenLongName(currentControllerBean.projectName, 30)}"/> - </p:toolbarGroup> - <p:toolbarGroup align="right"> - <p:commandButton styleClass="perspective-button" icon="ui-icon-home" action="ProjectOverview.xhtml?faces-redirect=true" /> - <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Analysis Editor" style="white-space: none" outcome="AnalysisEditor.xhtml?faces-redirect=true"> - <f:param name="projectName" value="#{currentControllerBean.projectName}" rendered="#{not empty currentControllerBean.projectName}" /> - </p:button> - <p:button styleClass="perspective-button" icon="ui-icon-circle-triangle-e" value="Analysis" style="white-space: none" disabled="true"> - </p:button> - <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Cockpit Editor" disabled="true"> - </p:button> - <p:button styleClass="perspective-button" icon="ui-icon-image" value="Cockpit" disabled="true"> - </p:button> - </p:toolbarGroup> - </p:toolbar> - - <p:menubar> - <p:submenu label="File"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-gear" value=" Settings" onclick="settingsDlg.show()" ajax="true"/> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-circle-close" value=" Close Controller" action="ProjectOverview.xhtml?faces-redirect=true" ajax="false"/> - </p:submenu> - - <p:submenu label="Help"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-help" value=" User Guide" ajax="true" disabled="true"/> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-comment" value=" About..." onclick="aboutDlg.show()" ajax="true"/> - </p:submenu> - - <p:menuitem styleClass="logOutButton" icon="ui-icon-power" value="#{userBean.userName}" ajax="true" url="login"/> - </p:menubar> - - </h:form> - </p:layoutUnit> - - - <p:layoutUnit position="center" id="centerLayout"> - <h:form id="logList"> - <ui:repeat value="#{currentControllerBean.log}" var="entry"> - <h:outputText value="#{entry}"/><br/><br/> - </ui:repeat> - </h:form> - </p:layoutUnit> - - <p:layoutUnit position="south" header="Control" resizable="true" collapsible="true"> - <h:form id="controllerForm"> - <p:commandButton value="Instantiate Analysis Controller" action="#{currentControllerBean.instantiateAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> - <p:commandButton value="Clean Analysis" action="#{currentControllerBean.cleanAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> - <p:commandButton value="Start Analysis" action="#{currentControllerBean.startAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> - <p:commandButton value="Stop Analysis" action="#{currentControllerBean.stopAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> - <p:poll interval="1" update=":ledsForm"/> - </h:form> - <hr/> - <h:form id="ledsForm"> - <div align="center"> - <h:graphicImage id="iconLEDRed1" url="../img/Icon_LED_Red.png" height="50px" rendered="#{currentControllerBean.isAnalysisNotAvailable()}"/> - <h:graphicImage id="iconLEDRed1_2" url="../img/Icon_LED_Gray.png" height="50px" rendered="#{not currentControllerBean.isAnalysisNotAvailable()}"/> - <p:spacer height="0" width="15px"/> - <h:graphicImage id="iconLEDYellow" url="../img/Icon_LED_Yellow.png" height="50px" rendered="#{currentControllerBean.isAnalysisReady()}"/> - <h:graphicImage id="iconLEDYellow_2" url="../img/Icon_LED_Gray.png" height="50px" rendered="#{not currentControllerBean.isAnalysisReady()}"/> - <p:spacer height="0" width="15px"/> - <h:graphicImage id="iconLEDGreen" url="../img/Icon_LED_Green.png" height="50px" rendered="#{currentControllerBean.isAnalysisRunning()}"/> - <h:graphicImage id="iconLEDGreen_2" url="../img/Icon_LED_Gray.png" height="50px" rendered="#{not currentControllerBean.isAnalysisRunning()}"/> - <p:spacer height="0" width="15px"/> - <h:graphicImage id="iconLEDRed2" url="../img/Icon_LED_Red.png" height="50px" rendered="#{currentControllerBean.isAnalysisTerminated() or currentControllerBean.isAnalysisFailed()}"/> - <h:graphicImage id="iconLEDRed2_2" url="../img/Icon_LED_Gray.png" height="50px" rendered="#{not (currentControllerBean.isAnalysisTerminated() or currentControllerBean.isAnalysisFailed())}"/> - - <p:tooltip for="iconLEDRed1" value="Indicates that the AnalysisController has not been instantiated yet."/> - <p:tooltip for="iconLEDYellow" value="Indicates that the AnalysisController has been instantiated, but not yet started."/> - <p:tooltip for="iconLEDGreen" value="Indicates that the AnalysisController has been started and is running."/> - <p:tooltip for="iconLEDRed2" value="Indicates that the AnalysisController has been terminated or has failed."/> - <p:tooltip for="iconLEDRed1_2" value="Indicates that the AnalysisController has not been instantiated yet."/> - <p:tooltip for="iconLEDYellow_2" value="Indicates that the AnalysisController has been instantiated, but not yet started."/> - <p:tooltip for="iconLEDGreen_2" value="Indicates that the AnalysisController has been started and is running."/> - <p:tooltip for="iconLEDRed2_2" value="Indicates that the AnalysisController has been terminated or has failed."/> - </div> - </h:form> - - </p:layoutUnit> - </p:layout> - - <p:growl id="messages" life="1500" showDetail="true" autoUpdate="false" sticky="true"/> - - <!-- Include the dialog for the configuration. --> - <ui:include src="dialogs/settingsDialog.xhtml" /> - - <!-- Include the about-dialog. --> - <ui:include src="dialogs/aboutDialog.xhtml" /> - - </h:body> + <f:view locale="#{currentConfigurationBean.locale}"> + <h:head> + <title>Kieker.WebGUI</title> + <link rel="stylesheet" type="text/css" href="../css/Common.css" /> + <link rel="stylesheet" type="text/css" href="../css/Controller.css" /> + </h:head> + + <h:body> + + <!-- This is the layout for the whole page. --> + <p:layout id="layout" fullPage="true"> + + <p:layoutUnit position="north" collapsible="false"> + <h:form> + <p:toolbar> + <p:toolbarGroup align="left"> + <h:outputText styleClass="kieker-title" value="Kieker » #{stringBean.shortenLongName(currentControllerBean.projectName, 30)}"/> + </p:toolbarGroup> + <p:toolbarGroup align="right"> + <p:commandButton styleClass="perspective-button" icon="ui-icon-home" action="ProjectOverview.xhtml?faces-redirect=true" /> + <p:separator/> + <p:button styleClass="perspective-button" icon="ui-icon-analysisEditor" value="#{localizedMessages.analysisEditor}" style="white-space: none" outcome="AnalysisEditor.xhtml?faces-redirect=true"> + <f:param name="projectName" value="#{currentControllerBean.projectName}" rendered="#{not empty currentControllerBean.projectName}" /> + </p:button> + <p:button styleClass="perspective-button" icon="ui-icon-analysis" value="#{localizedMessages.analysis}" style="white-space: none" disabled="true"> + </p:button> + <p:separator/> + <p:button styleClass="perspective-button" icon="ui-icon-cockpitEditor" value="#{localizedMessages.cockpitEditor}" disabled="true"> + </p:button> + <p:button styleClass="perspective-button" icon="ui-icon-cockpit" value="#{localizedMessages.cockpit}" disabled="true"> + </p:button> + </p:toolbarGroup> + </p:toolbar> + + <p:menubar> + <p:submenu label="#{localizedMessages.file}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-close" value=" #{localizedMessages.closeProject}" action="ProjectOverview.xhtml?faces-redirect=true" ajax="false"/> + </p:submenu> + + <p:submenu label="#{localizedMessages.help}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-userGuide" value=" #{localizedMessages.userGuide}" ajax="true" disabled="true"/> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-about" value=" #{localizedMessages.about}" onclick="aboutDlg.show()" ajax="true"/> + </p:submenu> + + <p:menuitem styleClass="logOutButton element-with-whitespace" icon="ui-icon-logout" value=" #{userBean.userName}" ajax="true" url="login"/> + </p:menubar> + + </h:form> + </p:layoutUnit> + + + <p:layoutUnit position="center" id="centerLayout"> + <h:form id="logList"> + <ui:repeat value="#{currentControllerBean.log}" var="entry"> + <h:outputText value="#{entry}"/><br/><br/> + </ui:repeat> + </h:form> + </p:layoutUnit> + + <p:layoutUnit position="south" header="Control" resizable="true" collapsible="true"> + <h:form id="controllerForm"> + <p:commandButton value="Instantiate Analysis Controller" action="#{currentControllerBean.instantiateAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="Clean Analysis" action="#{currentControllerBean.cleanAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="Start Analysis" action="#{currentControllerBean.startAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="Stop Analysis" action="#{currentControllerBean.stopAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:poll interval="1" update=":ledsForm"/> + </h:form> + <hr/> + <h:form id="ledsForm"> + <div align="center"> + <h:graphicImage id="iconLEDRed1" url="../img/LEDs/Icon_LED_Red.png" height="50px" rendered="#{currentControllerBean.isAnalysisNotAvailable()}"/> + <h:graphicImage id="iconLEDRed1_2" url="../img/LEDs/Icon_LED_Gray.png" height="50px" rendered="#{not currentControllerBean.isAnalysisNotAvailable()}"/> + <p:spacer height="0" width="15px"/> + <h:graphicImage id="iconLEDYellow" url="../img/LEDs/Icon_LED_Yellow.png" height="50px" rendered="#{currentControllerBean.isAnalysisReady()}"/> + <h:graphicImage id="iconLEDYellow_2" url="../img/LEDs/Icon_LED_Gray.png" height="50px" rendered="#{not currentControllerBean.isAnalysisReady()}"/> + <p:spacer height="0" width="15px"/> + <h:graphicImage id="iconLEDGreen" url="../img/LEDs/Icon_LED_Green.png" height="50px" rendered="#{currentControllerBean.isAnalysisRunning()}"/> + <h:graphicImage id="iconLEDGreen_2" url="../img/LEDs/Icon_LED_Gray.png" height="50px" rendered="#{not currentControllerBean.isAnalysisRunning()}"/> + <p:spacer height="0" width="15px"/> + <h:graphicImage id="iconLEDRed2" url="../img/LEDs/Icon_LED_Red.png" height="50px" rendered="#{currentControllerBean.isAnalysisTerminated() or currentControllerBean.isAnalysisFailed()}"/> + <h:graphicImage id="iconLEDRed2_2" url="../img/LEDs/Icon_LED_Gray.png" height="50px" rendered="#{not (currentControllerBean.isAnalysisTerminated() or currentControllerBean.isAnalysisFailed())}"/> + + <p:tooltip for="iconLEDRed1" value="Indicates that the AnalysisController has not been instantiated yet."/> + <p:tooltip for="iconLEDYellow" value="Indicates that the AnalysisController has been instantiated, but not yet started."/> + <p:tooltip for="iconLEDGreen" value="Indicates that the AnalysisController has been started and is running."/> + <p:tooltip for="iconLEDRed2" value="Indicates that the AnalysisController has been terminated or has failed."/> + <p:tooltip for="iconLEDRed1_2" value="Indicates that the AnalysisController has not been instantiated yet."/> + <p:tooltip for="iconLEDYellow_2" value="Indicates that the AnalysisController has been instantiated, but not yet started."/> + <p:tooltip for="iconLEDGreen_2" value="Indicates that the AnalysisController has been started and is running."/> + <p:tooltip for="iconLEDRed2_2" value="Indicates that the AnalysisController has been terminated or has failed."/> + </div> + </h:form> + + </p:layoutUnit> + </p:layout> + + <p:growl id="messages" life="1500" showDetail="true" autoUpdate="false" sticky="true"/> + + <!-- Include the dialog for the configuration. --> + <ui:include src="dialogs/settingsDialog.xhtml" /> + + <!-- Include the about-dialog. --> + <ui:include src="dialogs/aboutDialog.xhtml" /> + + </h:body> + </f:view> </html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/Login.xhtml b/Kieker.WebGUI/src/main/webapp/Login.xhtml index 0665d838..0f86c8d3 100644 --- a/Kieker.WebGUI/src/main/webapp/Login.xhtml +++ b/Kieker.WebGUI/src/main/webapp/Login.xhtml @@ -2,47 +2,50 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" - xmlns:p="http://primefaces.org/ui"> + xmlns:p="http://primefaces.org/ui" + xmlns:f="http://java.sun.com/jsf/core"> - <h:head> - <title>Kieker.WebGUI</title> - <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/Login.css" /> - </h:head> + <f:view locale="#{currentConfigurationBean.locale}"> + <h:head> + <title>Kieker.WebGUI</title> + <link rel="stylesheet" type="text/css" href="../css/Common.css" /> + <link rel="stylesheet" type="text/css" href="../css/Login.css" /> + </h:head> - - <h:body onload="showWelcomeMessage();"> - <h:form> - <p:remoteCommand action="#{userBean.showWelcomeMessage()}" name="showWelcomeMessage"/> - </h:form> - <div align="center" > - <img src="../img/kieker-header.jpg"/> - </div> - <div align="center" class="stretch"> - <div class="custom-background"> - <br/> - <p:spacer width="0" height="100"/> - <!-- The following is the login form --> - <h:form> - <div class="stretch" align="center"> - <p:panel header="Welcome to the Kieker.WebGUI" styleClass="login-panel"> - <h:panelGrid columnClasses="col1 , col2" styleClass="grid" columns="2" cellpadding="5"> - <h:outputLabel for="username" value="Username:" /> - <p:inputText styleClass="input" id="username" required="true" value="#{userBean.userName}" label="username"/> + <h:body onload="showWelcomeMessage();"> + <h:form> + <p:remoteCommand action="#{userBean.showWelcomeMessage()}" name="showWelcomeMessage"/> + </h:form> + <div align="center" > + <img src="../img/kieker-header.jpg"/> + </div> + <div align="center" class="stretch"> + <div class="custom-background"> + <br/> + <p:spacer width="0" height="100"/> + + <!-- The following is the login form --> + <h:form> + <div class="stretch" align="center"> + <p:panel header="#{localizedMessages.shortWelcomeMessage}" styleClass="login-panel"> + <h:panelGrid columnClasses="col1 , col2" styleClass="grid" columns="2" cellpadding="5" > + <h:outputLabel for="username" value="#{localizedMessages.username}:" /> + <p:inputText styleClass="input" id="username" required="true" value="#{userBean.userName}" label="username"/> - <h:outputLabel for="password" value="Password:" /> - <p:password styleClass="input" id="password" required="false" label="password" /> - </h:panelGrid> - <hr/> - <div align="right"> - <p:commandButton value="Login" ajax="false" action="#{userBean.login}" /> - </div> - </p:panel> - <p:growl sticky="true" autoUpdate="true" widgetVar="growlComp"/> - </div> - </h:form> + <h:outputLabel for="password" value="#{localizedMessages.password}:" /> + <p:password styleClass="input" id="password" required="false" value="#{userBean.password}" label="password" /> + </h:panelGrid> + <hr/> + <div align="right"> + <p:commandButton value="#{localizedMessages.login}" ajax="false" action="#{userBean.login}" /> + </div> + </p:panel> + <p:growl sticky="true" autoUpdate="true" widgetVar="growlComp"/> + </div> + </h:form> + </div> </div> - </div> - </h:body> + </h:body> + </f:view> </html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/ProjectOverview.xhtml b/Kieker.WebGUI/src/main/webapp/ProjectOverview.xhtml index fd67f460..917acbe5 100644 --- a/Kieker.WebGUI/src/main/webapp/ProjectOverview.xhtml +++ b/Kieker.WebGUI/src/main/webapp/ProjectOverview.xhtml @@ -6,107 +6,109 @@ xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"> - <h:head> - <title>Kieker.WebGUI</title> - <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/ProjectOverview.css" /> - </h:head> - - <h:body> - <p:layout fullPage="true"> - <p:layoutUnit position="north"> - <h:form id="menuForm"> - <p:toolbar> - <p:toolbarGroup align="left"> - <h:outputText styleClass="kieker-title" value="Kieker"/> - </p:toolbarGroup> - <p:toolbarGroup align="right"> - <p:commandButton styleClass="perspective-button" icon="ui-icon-home" disabled="true" action="ProjectOverview.xhtml" /> - <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Analysis Editor" style="white-space: none" outcome="AnalysisEditor.xhtml?faces-redirect=true"> - <f:param name="projectName" value="#{currentProjectOverviewBean.projectName}" rendered="#{not empty currentProjectOverviewBean.projectName}"/> - </p:button> - <p:button styleClass="perspective-button" icon="ui-icon-circle-triangle-e" value="Analysis" style="white-space: none" outcome="Controller.xhtml?faces-redirect=true"> - <f:param name="projectName" value="#{currentProjectOverviewBean.projectName}" rendered="#{not empty currentProjectOverviewBean.projectName}"/> - </p:button> - <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Cockpit Editor" disabled="true"> - </p:button> - <p:button styleClass="perspective-button" icon="ui-icon-image" value="Cockpit" disabled="true"> - </p:button> - </p:toolbarGroup> - </p:toolbar> - - <p:menubar> - <p:submenu label="File"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-document" value=" New Project" onclick="newProjectDialog.show()" ajax="true"/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-folder-open" value=" Import Project" ajax="true" disabled="true"/> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-refresh" value=" Refresh Projects List" update=":projectsListForm" action="#{currentProjectOverviewBean.updateLists()}" ajax="true"/> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-gear" value=" Settings" onclick="settingsDlg.show()" ajax="true"/> - </p:submenu> - - <p:submenu label="Help"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-help" value=" User Guide" ajax="true" disabled="true"/> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-comment" value=" About..." onclick="aboutDlg.show()" ajax="true"/> - </p:submenu> - - <p:menuitem styleClass="logOutButton" icon="ui-icon-power" value="#{userBean.userName}" ajax="true" url="login"/> - </p:menubar> - </h:form> - </p:layoutUnit> - - <!-- Abstand zu Icons --> - <p:layoutUnit position="center"> - <h:form id="projectsListForm"> - <p:dataTable rows="15" paginator="true" paginatorPosition="both" var="project" rowsPerPageTemplate="5,10,15,25,50" value="#{currentProjectOverviewBean.projects}" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" selection="#{currentProjectOverviewBean.projectName}" rowKey="#{project}" selectionMode="single"> - <!-- Makes sure that rows are selected instantaneously. --> - <p:ajax event="rowSelect" listener="#{currentProjectOverviewBean.onRowSelect}" update=":menuForm" /> - - <p:column headerText="Project Name" id="modelHeader" sortBy="#{project}"> - <p:commandLink id="dynaButton" value="#{project}"/> - - <p:menu overlay="true" trigger="dynaButton" my="left top" at="left bottom" style="width:210px"> - <p:menuitem icon="ui-icon-wrench" id="openButton" value=" Analysis Editor" styleClass="element-with-whitespace" ajax="false" url="analysisEditor?projectName=#{project}"/> - <p:menuitem icon="ui-icon-circle-triangle-e" id="controlAnalysis" styleClass="element-with-whitespace" value=" Analysis" ajax="false" url="controller?projectName=#{project}" /> + <f:view locale="#{currentConfigurationBean.locale}"> + <h:head> + <title>Kieker.WebGUI</title> + <link rel="stylesheet" type="text/css" href="../css/Common.css" /> + <link rel="stylesheet" type="text/css" href="../css/ProjectOverview.css" /> + </h:head> + + <h:body> + <p:layout fullPage="true"> + <p:layoutUnit position="north"> + <h:form id="menuForm"> + <p:toolbar> + <p:toolbarGroup align="left"> + <h:outputText styleClass="kieker-title" value="Kieker"/> + </p:toolbarGroup> + <p:toolbarGroup align="right"> + <p:commandButton styleClass="perspective-button" icon="ui-icon-home" disabled="true" action="ProjectOverview.xhtml" /> <p:separator/> + <p:button styleClass="perspective-button" icon="ui-icon-analysisEditor" value="#{localizedMessages.analysisEditor}" style="white-space: none" outcome="AnalysisEditor.xhtml?faces-redirect=true"> + <f:param name="projectName" value="#{currentProjectOverviewBean.projectName}" rendered="#{not empty currentProjectOverviewBean.projectName}"/> + </p:button> + <p:button styleClass="perspective-button" icon="ui-icon-analysis" value="#{localizedMessages.analysis}" style="white-space: none" outcome="Controller.xhtml?faces-redirect=true"> + <f:param name="projectName" value="#{currentProjectOverviewBean.projectName}" rendered="#{not empty currentProjectOverviewBean.projectName}"/> + </p:button> + <p:separator/> + <p:button styleClass="perspective-button" icon="ui-icon-cockpitEditor" value="#{localizedMessages.cockpitEditor}" disabled="true"> + </p:button> + <p:button styleClass="perspective-button" icon="ui-icon-cockpit" value="#{localizedMessages.cockpit}" disabled="true"> + </p:button> + </p:toolbarGroup> + </p:toolbar> + + <p:menubar> + <p:submenu label="#{localizedMessages.file}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newProject" value=" #{localizedMessages.newProject}" onclick="newProjectDialog.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-importProject" value=" #{localizedMessages.importProject}" ajax="true" disabled="true"/> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value=" #{localizedMessages.refreshProjectsList}" update=":projectsListForm" action="#{currentProjectOverviewBean.updateLists()}" ajax="true"/> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> + </p:submenu> - <p:menuitem icon="ui-icon-wrench" id="editAnalysisViews" styleClass="element-with-whitespace" value=" Cockpit Editor" ajax="false" disabled="true" /> - <p:menuitem icon="ui-icon-image" id="showAnalysis" styleClass="element-with-whitespace" value=" Cockpit" ajax="false" disabled="true" /> + <p:submenu label="#{localizedMessages.help}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-userGuide" value=" #{localizedMessages.userGuide}" ajax="true" disabled="true"/> <p:separator/> - <p:menuitem id="copyButton" icon="ui-icon-copy" styleClass="element-with-whitespace" value=" Copy Project" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="copyProjectDialog.show()"/> - <p:menuitem id="renameButton" icon="ui-icon-pencil" styleClass="element-with-whitespace" value=" Rename Project" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="renameProjectDialog.show()" disabled="true"/> - <p:menuitem id="deleteButton" icon="ui-icon-trash" styleClass="element-with-whitespace" value=" Delete Project" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="deleteProjectDialog.show()" disabled="true"/> - </p:menu> - </p:column> - <p:column headerText="State" style="text-align: center" sortBy="#{projectsBean.getAnalysisControllerState(project)}"> - <h:outputText value="#{projectsBean.getAnalysisControllerState(project)}"/> - </p:column> - - <p:column headerText="Last Modification" sortBy="#{projectsBean.getCurrTimeStamp(project)}" style="text-align: center"> - <h:outputText value="#{projectsBean.getCurrTimeStamp(project)}" /> - </p:column> - - <p:column headerText="Owner" style="text-align: center" rendered="false"> - <h:outputText value="N/A" /> - </p:column> - - </p:dataTable> - </h:form> - </p:layoutUnit> - - </p:layout> - - <p:growl id="messages" life="1500" showDetail="true" autoUpdate="false" sticky="true"/> - - <!-- Include the about-dialog. --> - <ui:include src="dialogs/aboutDialog.xhtml" /> - <!-- Include the dialogs for the project managment. --> - <ui:include src="dialogs/projectDialogs.xhtml" /> - <!-- Include the dialog for the configuration. --> - <ui:include src="dialogs/settingsDialog.xhtml" /> - - </h:body> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-about" value=" #{localizedMessages.about}" onclick="aboutDlg.show()" ajax="true"/> + </p:submenu> + + <p:menuitem styleClass="logOutButton element-with-whitespace" icon="ui-icon-logout" value=" #{userBean.userName}" ajax="true" url="login"/> + </p:menubar> + </h:form> + </p:layoutUnit> + + <!-- Abstand zu Icons --> + <p:layoutUnit position="center"> + <h:form id="projectsListForm"> + <p:dataTable rows="15" paginator="true" paginatorPosition="both" var="project" rowsPerPageTemplate="5,10,15,25,50" value="#{currentProjectOverviewBean.projects}" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" selection="#{currentProjectOverviewBean.projectName}" rowKey="#{project}" selectionMode="single"> + <!-- Makes sure that rows are selected instantaneously. --> + <p:ajax event="rowSelect" listener="#{currentProjectOverviewBean.onRowSelect}" update=":menuForm" /> + + <p:column headerText="#{localizedMessages.projectName}" id="modelHeader" sortBy="#{project}"> + <p:commandLink id="dynaButton" value="#{project}"/> + + <p:menu overlay="true" trigger="dynaButton" my="left top" at="left bottom" style="width:210px"> + <p:menuitem icon="ui-icon-wrench" id="openButton" value=" #{localizedMessages.analysisEditor}" styleClass="element-with-whitespace" ajax="false" url="analysisEditor?projectName=#{project}"/> + <p:menuitem icon="ui-icon-circle-triangle-e" id="controlAnalysis" styleClass="element-with-whitespace" value=" #{localizedMessages.analysis}" ajax="false" url="controller?projectName=#{project}" /> + <p:separator/> + + <p:menuitem icon="ui-icon-wrench" id="editAnalysisViews" styleClass="element-with-whitespace" value=" #{localizedMessages.cockpitEditor}" ajax="false" disabled="true" /> + <p:menuitem icon="ui-icon-image" id="showAnalysis" styleClass="element-with-whitespace" value=" #{localizedMessages.cockpit}" ajax="false" disabled="true" /> + <p:separator/> + <p:menuitem id="copyButton" icon="ui-icon-copy" styleClass="element-with-whitespace" value=" #{localizedMessages.copyProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="copyProjectDialog.show()"/> + <p:menuitem id="renameButton" icon="ui-icon-pencil" styleClass="element-with-whitespace" value=" #{localizedMessages.renameProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="renameProjectDialog.show()" disabled="true"/> + <p:menuitem id="deleteButton" icon="ui-icon-trash" styleClass="element-with-whitespace" value=" #{localizedMessages.deleteProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="deleteProjectDialog.show()" disabled="true"/> + </p:menu> + </p:column> + <p:column headerText="#{localizedMessages.state}" style="text-align: center" sortBy="#{projectsBean.getAnalysisControllerState(project)}"> + <h:outputText value="#{projectsBean.getAnalysisControllerState(project)}"/> + </p:column> + + <p:column headerText="#{localizedMessages.lastModification}" sortBy="#{projectsBean.getCurrTimeStamp(project)}" style="text-align: center"> + <h:outputText value="#{projectsBean.getCurrTimeStamp(project)}" /> + </p:column> + + <p:column headerText="#{localizedMessages.owner}" style="text-align: center" rendered="false"> + <h:outputText value="N/A" /> + </p:column> + + </p:dataTable> + </h:form> + </p:layoutUnit> + + </p:layout> + + <p:growl id="messages" life="1500" showDetail="true" autoUpdate="false" sticky="true"/> + + <!-- Include the about-dialog. --> + <ui:include src="dialogs/aboutDialog.xhtml" /> + <!-- Include the dialogs for the project managment. --> + <ui:include src="dialogs/projectDialogs.xhtml" /> + <!-- Include the dialog for the configuration. --> + <ui:include src="dialogs/settingsDialog.xhtml" /> + + </h:body> + </f:view> </html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml b/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 00000000..6dfa9de1 --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,21 @@ +<?xml version='1.0' encoding='UTF-8'?> + +<!-- =========== FULL CONFIGURATION FILE ================================== --> + +<faces-config version="2.1" + xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"> + + <application> + <locale-config> + <default-locale>en</default-locale> + <supported-locale>de</supported-locale> + </locale-config> + <resource-bundle> + <base-name>messages</base-name> + <var>localizedMessages</var> + </resource-bundle> + </application> + +</faces-config> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/AnalysisEditor.css b/Kieker.WebGUI/src/main/webapp/css/AnalysisEditor.css index 40e4f2f4..8574703e 100644 --- a/Kieker.WebGUI/src/main/webapp/css/AnalysisEditor.css +++ b/Kieker.WebGUI/src/main/webapp/css/AnalysisEditor.css @@ -11,4 +11,35 @@ /* This is necessary to remove the border from the datalist */ .ui-datalist * { border : 0px !important; +} + +#center-container { + height:100%; +} + +#center-container { + width:100%; +} + +#infovis { + width:100%; + height:100%; + margin:auto; + overflow:hidden; +} + +.tip { + color: #111; + width: 139px; + background-color: white; + border:1px solid #ccc; + -moz-box-shadow:#555 2px 2px 8px; + -webkit-box-shadow:#555 2px 2px 8px; + -o-box-shadow:#555 2px 2px 8px; + box-shadow:#555 2px 2px 8px; + opacity:0.9; + filter:alpha(opacity=90); + font-size:10px; + font-family:Verdana, Geneva, Arial, Helvetica, sans-serif; + padding:7px; } \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/Common.css b/Kieker.WebGUI/src/main/webapp/css/Common.css index 690ce0ef..da437091 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Common.css +++ b/Kieker.WebGUI/src/main/webapp/css/Common.css @@ -73,4 +73,172 @@ .kieker-title { font-size: 25px !important; +} + +.ui-icon-close { + background: url('../img/icons/Close.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-reload { + background: url('../img/icons/Reload.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-settings { + background: url('../img/icons/Settings.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-logout { + background: url('../img/icons/Logout.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-scaleToFitSmall { + background: url('../img/icons/ScaleToFitSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-scaleToFit { + background: url('../img/icons/ScaleToFit.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-snapEnabled { + background: url('../img/icons/SnapEnabled.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-snapDisabled { + background: url('../img/icons/SnapDisabled.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-snapEnabledSmall { + background: url('../img/icons/SnapEnabledSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-snapDisabledSmall { + background: url('../img/icons/SnapDisabledSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-gridEnabled { + background: url('../img/icons/GridEnabled.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-gridDisabled { + background: url('../img/icons/GridDisabled.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-gridEnabledSmall { + background: url('../img/icons/GridEnabledSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-gridDisabledSmall { + background: url('../img/icons/GridDisabledSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-autoLayoutSmall { + background: url('../img/icons/AutoLayoutSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-autoLayout { + background: url('../img/icons/AutoLayout.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-home { + background: url('../img/icons/Home.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-analysisEditor { + background: url('../img/icons/AnalysisEditor.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-analysis { + background: url('../img/icons/Analysis.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-cockpitEditor { + background: url('../img/icons/CockpitEditor.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-cockpit { + background: url('../img/icons/Cockpit.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-save { + background: url('../img/icons/Save.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-saveAs { + background: url('../img/icons/SaveAs.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-newProject { + background: url('../img/icons/NewProject.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-importProject { + background: url('../img/icons/ImportProject.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-userGuide { + background: url('../img/icons/UserGuide.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-about { + background: url('../img/icons/About.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-manageLibraries { + background: url('../img/icons/ManageLibraries.png') no-repeat !important; + height:16px; + width:16px; } \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/Login.css b/Kieker.WebGUI/src/main/webapp/css/Login.css index 979aa28d..c45311e1 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Login.css +++ b/Kieker.WebGUI/src/main/webapp/css/Login.css @@ -6,6 +6,7 @@ .col1 { width: fit-content !important; + text-align: right; } .col2 { diff --git a/Kieker.WebGUI/src/main/webapp/css/base.css b/Kieker.WebGUI/src/main/webapp/css/base.css deleted file mode 100644 index 4e050017..00000000 --- a/Kieker.WebGUI/src/main/webapp/css/base.css +++ /dev/null @@ -1,31 +0,0 @@ -#center-container { - height:100%; -} - -#center-container { - width:100%; -} - - -#infovis { - width:100%; - height:100%; - margin:auto; - overflow:hidden; -} - -.tip { - color: #111; - width: 139px; - background-color: white; - border:1px solid #ccc; - -moz-box-shadow:#555 2px 2px 8px; - -webkit-box-shadow:#555 2px 2px 8px; - -o-box-shadow:#555 2px 2px 8px; - box-shadow:#555 2px 2px 8px; - opacity:0.9; - filter:alpha(opacity=90); - font-size:10px; - font-family:Verdana, Geneva, Arial, Helvetica, sans-serif; - padding:7px; -} \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/js-graph-it.css b/Kieker.WebGUI/src/main/webapp/css/js-graph-it.css deleted file mode 100644 index 46757760..00000000 --- a/Kieker.WebGUI/src/main/webapp/css/js-graph-it.css +++ /dev/null @@ -1,24 +0,0 @@ -.draggable -{ - position: absolute; - cursor: move; - z-index: 1; -} - -.connector -{ - background-color: black; -} - -.dock_point -{ - height: 1px; - width: 1px; - overflow: hidden; - padding: 0px !important; - border: none !important; - margin: 0px !important; - position: absolute; - font-size: 1px; - visibility: hidden; -} \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/aboutDialog.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/aboutDialog.xhtml index 622a4bac..ae2ae151 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/aboutDialog.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/aboutDialog.xhtml @@ -6,7 +6,7 @@ xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui"> - <p:dialog header="About..." resizable="false" modal="true" widgetVar="aboutDlg"> + <p:dialog header="#{localizedMessages.about}" resizable="false" modal="true" widgetVar="aboutDlg"> <h:form> <img src="../img/kieker-logo-transparent.png" alt="Kieker-Logo" width="491" height="150" /> <hr/> diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml index f87e5871..a88d652e 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml @@ -5,21 +5,21 @@ xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> - <p:dialog id="manageLibrariesDlg" header="Libraries" resizable="false" + <p:dialog id="manageLibrariesDlg" header="#{localizedMessages.libraries}" resizable="false" modal="true" widgetVar="manageLibrariesDialog"> <h:form id="dependenciesForm"> <p:dataTable id="currentDependencies" value="#{currentAnalysisEditorBean.libraries}" var="dependency" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" > - <p:column headerText="Filename"> + <p:column headerText="#{localizedMessages.fileName}"> <h:outputText value="#{dependency}"/> </p:column> - <p:column headerText="Size" style="text-align: center"> + <p:column headerText="#{localizedMessages.fileSize}" style="text-align: center"> <h:outputText value="N/A [MiByte]"/> </p:column> - <p:column headerText="Options" style="text-align: center; width:40px"> + <p:column headerText="#{localizedMessages.libOptions}" style="text-align: center; width:40px"> <p:commandButton id="deleteButton" icon="ui-icon-trash" disabled="true"/> <p:tooltip for="deleteButton" value="Delete Library"/> </p:column> @@ -29,7 +29,7 @@ <p:spacer width="0" height="5"/> <div> <!-- This is the form for the uploading. --> - <h:outputText value="Currently only *.jar-Dependencies can be uploaded. The maximal file size is limited to 100 [MiByte]." /> + <h:outputText value="#{localizedMessages.msgOnlyJar}" /> <br /> <br /> <h:form enctype="multipart/form-data"> @@ -39,7 +39,7 @@ <hr/> <div style="text-align: right"> <h:form> - <p:commandButton value="Ok" ajax="true" onclick="manageLibrariesDialog.hide()" /> + <p:commandButton value="#{localizedMessages.ok}" ajax="true" onclick="manageLibrariesDialog.hide()" /> </h:form> </div> </p:dialog> diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/projectDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/projectDialogs.xhtml index 076b390b..ec56dba0 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/projectDialogs.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/projectDialogs.xhtml @@ -8,21 +8,21 @@ <!-- ******************************************************************************** --> <!-- This is the dialog to create a new project. --> - <p:dialog id="newProjectDlg" header="New Project" resizable="false" modal="true" widgetVar="newProjectDialog"> + <p:dialog id="newProjectDlg" header="#{localizedMessages.newProject}" resizable="false" modal="true" widgetVar="newProjectDialog"> <!-- Make sure that closing of the dialog also clears the input field. --> <p:ajax event="close" update="newProjectDialogForm:newProjectInputText" /> <h:form id="newProjectDialogForm"> <div style="text-align: center"> - <h:outputText value="Name: " /> + <h:outputText value="#{localizedMessages.name}: " /> <p:inputText id="newProjectInputText" value="#{stringBean.string}" /> </div> <hr/> <div style="text-align: right"> - <p:commandButton value="Ok" action="#{projectsBean.addProject(stringBean.string)}" update=":projectsListForm :messages" oncomplete="newProjectDialog.hide()" /> + <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.addProject(stringBean.string)}" update=":projectsListForm :messages" oncomplete="newProjectDialog.hide()" /> <p:spacer width="10px" height="10" /> - <p:commandButton value="Cancel" onclick="newProjectDialog.hide()" /> + <p:commandButton value="#{localizedMessages.cancel}" onclick="newProjectDialog.hide()" /> </div> </h:form> </p:dialog> @@ -34,50 +34,50 @@ <h:form id="renameProjectDialogForm"> <div style="text-align: center"> - <h:outputText value="New Name: " /> + <h:outputText value="#{localizedMessages.newName}: " /> <p:inputText id="renameProjectInputText" value="#{stringBean.string}" /> </div> <hr/> <div style="text-align: right"> - <p:commandButton value="Ok" action="#{projectsBean.renameProject(currentProjectOverviewBean.projectName, stringBean.string)}" update=":projectsListForm :messages" oncomplete="renameProjectDialog.hide()" /> + <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.renameProject(currentProjectOverviewBean.projectName, stringBean.string)}" update=":projectsListForm :messages" oncomplete="renameProjectDialog.hide()" /> <p:spacer width="10px" height="10" /> - <p:commandButton value="Cancel" onclick="renameProjectDialog.hide()" /> + <p:commandButton value="#{localizedMessages.cancel}" onclick="renameProjectDialog.hide()" /> </div> </h:form> </p:dialog> - <p:dialog id="deleteProjectDlg" header="Delete Project" resizable="false" modal="true" widgetVar="deleteProjectDialog"> + <p:dialog id="deleteProjectDlg" header="#{localizedMessages.deleteProject}" resizable="false" modal="true" widgetVar="deleteProjectDialog"> <h:form id="deleteProjectDialogForm"> <div style="text-align: center"> - <h:outputText value="Do you really want to delete the selected project?" /> + <h:outputText value="#{localizedMessages.msgReallyDeleteProject}" /> </div> <hr/> <div style="text-align: right"> - <p:commandButton value="Ok" action="#{projectsBean.deleteProject(currentProjectOverviewBean.projectName)}" update=":projectsListForm :messages" oncomplete="deleteProjectDialog.hide()" /> + <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.deleteProject(currentProjectOverviewBean.projectName)}" update=":projectsListForm :messages" oncomplete="deleteProjectDialog.hide()" /> <p:spacer width="10px" height="10" /> - <p:commandButton value="Cancel" onclick="deleteProjectDialog.hide()" /> + <p:commandButton value="#{localizedMessages.cancel}" onclick="deleteProjectDialog.hide()" /> </div> </h:form> </p:dialog> - <p:dialog id="copyProjectDlg" header="Copy Project" resizable="false" modal="true" widgetVar="copyProjectDialog"> + <p:dialog id="copyProjectDlg" header="#{localizedMessages.copyProject}" resizable="false" modal="true" widgetVar="copyProjectDialog"> <!-- Make sure that closing of the dialog also clears the input field. --> <p:ajax event="close" update="copyProjectDialogForm:copyProjectDialogInputText" /> <h:form id="copyProjectDialogForm"> <div style="text-align: center"> - <h:outputText value="Name: " /> + <h:outputText value="#{localizedMessages.name}: " /> <p:inputText id="copyProjectDialogInputText" value="#{stringBean.string}" /> </div> <hr/> <div style="text-align: right"> - <p:commandButton value="Ok" action="#{projectsBean.copyProject(currentProjectOverviewBean.projectName, stringBean.string)}" update=":projectsListForm :messages" oncomplete="copyProjectDialog.hide()" /> + <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.copyProject(currentProjectOverviewBean.projectName, stringBean.string)}" update=":projectsListForm :messages" oncomplete="copyProjectDialog.hide()" /> <p:spacer width="10px" height="10" /> - <p:commandButton value="Cancel" onclick="copyProjectDialog.hide()" /> + <p:commandButton value="#{localizedMessages.cancel}" onclick="copyProjectDialog.hide()" /> </div> </h:form> </p:dialog> diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/settingsDialog.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/settingsDialog.xhtml index ee5efc2b..114993ea 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/settingsDialog.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/settingsDialog.xhtml @@ -5,49 +5,49 @@ xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> - <p:dialog id="settingsDialog" header="Settings" resizable="false" + <p:dialog id="settingsDialog" header="#{localizedMessages.settings}" resizable="false" modal="true" widgetVar="settingsDlg"> <h:form> <p:tabView> - <p:tab title="Common"> + <p:tab title="#{localizedMessages.common}"> <h:panelGrid columns="2" cellpadding="10"> - <h:outputText value="Look and Feel:" /> - <p:themeSwitcher value="#{currentConfigurationBean.lookAndFeel}" - style="width:150px" effect="fade"> - <f:selectItem itemLabel="Choose Theme" itemValue="" /> + <h:outputText value="#{localizedMessages.lookAndFeel}:" /> + <p:themeSwitcher value="#{currentConfigurationBean.lookAndFeel}" style="width:150px" effect="fade"> + <f:selectItem itemLabel="#{localizedMessages.chooseTheme}" itemValue="" /> <f:selectItems value="#{themeSwitcherBean.themes}" /> </p:themeSwitcher> - <h:outputText value="Language:"/> - <p:selectOneMenu effectDuration="20" style="width:150px"> - <f:selectItem itemLabel="English"/> + <h:outputText value="#{localizedMessages.language}:"/> + <p:selectOneMenu value="#{currentConfigurationBean.locale}" style="width:150px"> + <f:selectItem itemValue="en" itemLabel="English"/> + <f:selectItem itemValue="de" itemLabel="Deutsch"/> </p:selectOneMenu> </h:panelGrid> </p:tab> - <p:tab title="Analysis Editor"> + <p:tab title="#{localizedMessages.analysisEditor}"> <h:panelGrid columns="2" cellpadding="10"> - <h:outputText value="Tool Palette"/> + <h:outputText value="#{localizedMessages.toolPalette}:"/> <p:selectOneMenu style="width:150px"> - <f:selectItem itemLabel="Lists"/> + <f:selectItem itemLabel="#{localizedMessages.lists}"/> </p:selectOneMenu> - <h:outputText value="Grid-Size:"/> + <h:outputText value="#{localizedMessages.gridSize}:"/> <p:spinner value="#{currentConfigurationBean.gridSize}" valueChangeListener="#{currentAnalysisEditorBean.gridSizeListener}" suffix=" [px]"/> - <h:outputText value="Grid-Color:"/> + <h:outputText value="#{localizedMessages.gridColor}:"/> <p:colorPicker value="#{currentConfigurationBean.gridColor}" valueChangeListener="#{currentAnalysisEditorBean.gridColorListener}"/> </h:panelGrid> </p:tab> - <p:tab title="Analysis Controller" disabled="true"> + <p:tab title="#{localizedMessages.analysisController}" disabled="true"> </p:tab> - <p:tab title="Cockpit Editor" disabled="true"> + <p:tab title="#{localizedMessages.cockpitEditor}" disabled="true"> </p:tab> - <p:tab title="Cockpit" disabled="true"> + <p:tab title="#{localizedMessages.cockpit}" disabled="true"> </p:tab> </p:tabView> <hr/> <div style="text-align: right"> - <p:commandButton value="Ok" oncomplete="settingsDlg.hide();" /> + <p:commandButton value="#{localizedMessages.ok}" oncomplete="settingsDlg.hide();" update="@all" /> </div> </h:form> </p:dialog> diff --git a/Kieker.WebGUI/src/main/webapp/img/Icon_LED_Gray.png b/Kieker.WebGUI/src/main/webapp/img/LEDs/Icon_LED_Gray.png similarity index 100% rename from Kieker.WebGUI/src/main/webapp/img/Icon_LED_Gray.png rename to Kieker.WebGUI/src/main/webapp/img/LEDs/Icon_LED_Gray.png diff --git a/Kieker.WebGUI/src/main/webapp/img/Icon_LED_Green.png b/Kieker.WebGUI/src/main/webapp/img/LEDs/Icon_LED_Green.png similarity index 100% rename from Kieker.WebGUI/src/main/webapp/img/Icon_LED_Green.png rename to Kieker.WebGUI/src/main/webapp/img/LEDs/Icon_LED_Green.png diff --git a/Kieker.WebGUI/src/main/webapp/img/Icon_LED_Red.png b/Kieker.WebGUI/src/main/webapp/img/LEDs/Icon_LED_Red.png similarity index 100% rename from Kieker.WebGUI/src/main/webapp/img/Icon_LED_Red.png rename to Kieker.WebGUI/src/main/webapp/img/LEDs/Icon_LED_Red.png diff --git a/Kieker.WebGUI/src/main/webapp/img/Icon_LED_Yellow.png b/Kieker.WebGUI/src/main/webapp/img/LEDs/Icon_LED_Yellow.png similarity index 100% rename from Kieker.WebGUI/src/main/webapp/img/Icon_LED_Yellow.png rename to Kieker.WebGUI/src/main/webapp/img/LEDs/Icon_LED_Yellow.png diff --git a/Kieker.WebGUI/src/main/webapp/img/FilterIcon.png b/Kieker.WebGUI/src/main/webapp/img/graphIcons/FilterIcon.png similarity index 100% rename from Kieker.WebGUI/src/main/webapp/img/FilterIcon.png rename to Kieker.WebGUI/src/main/webapp/img/graphIcons/FilterIcon.png diff --git a/Kieker.WebGUI/src/main/webapp/img/ReaderIcon.png b/Kieker.WebGUI/src/main/webapp/img/graphIcons/ReaderIcon.png similarity index 100% rename from Kieker.WebGUI/src/main/webapp/img/ReaderIcon.png rename to Kieker.WebGUI/src/main/webapp/img/graphIcons/ReaderIcon.png diff --git a/Kieker.WebGUI/src/main/webapp/img/RepositoryIcon.png b/Kieker.WebGUI/src/main/webapp/img/graphIcons/RepositoryIcon.png similarity index 100% rename from Kieker.WebGUI/src/main/webapp/img/RepositoryIcon.png rename to Kieker.WebGUI/src/main/webapp/img/graphIcons/RepositoryIcon.png diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/About.png b/Kieker.WebGUI/src/main/webapp/img/icons/About.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b743767a05334354e9d3106fa09d3173dea34c GIT binary patch literal 780 zcmV+n1M~ceP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008hNkl<Zc-oDV zOK4Pg6vlt&&b>2<nMdOojnPCKU!WGFC@6}q6tw8V7SS$>58B#lp`uV)D3WeOAqz$E z0Scn13!f-OEiPIVq##+uLKAiJP@@%-n9M7gduL8hT=*y{^bZ&A<(%(3|L^<G73_Q* zsJm47BqlWMeZiTohdj_FGRV8<o;nljN$iO8O$dVDlmnMs$;)tUdP%DnzT|#GImsV7 z`E{t97V0=dl4h!;M3+|5#wMc7-!+X5zQXkwi&`Uc_ccK{(9!V}$D<i$Kbgt)Aj>0q z*+Lb+;PHY^wh`w%W5`!`(o`BC)<2iEL$0*HCZJax(kw90TI%_k2sy$`<QYGrgcwf~ zc~T78S3jRxUxFG=FhP8Iqp?fl2K(M%CvEB@&n4*%aIhrg{1`imMP4z)C?3$rX!bK% z9uLFb67;KBc^2J#Cvl$E3M*$j%*#TlRk`(CxnZ|(DK|kOt`L*L`vg7ufywyRNG4Qx z)U7CE@#zThv>CR(K<Z9`n|>ctsNj^zJ4ZtNHw13CRtDYdw)q!Le_Oc7nwf(f{JjEi zNYNEpa?LJ#DdPfvv)l&tjEZtDS0jO}wge>2kyMz@jxdcGPcjsB&ZI17$2&|K&b&FG zJs0D1v#>>!s<I9m7ktRAsc=<hr1gs}%CY--vX>Jq8%SH)KCA3vi_EOs1XR+;N9Owx zbKpuMOmbtMKN=#8ITo-^$_u)%rj0{A9=)$z?ppgpVhqs39NU8?6X}`%o6W#_ODSzp zM(UI`V+$l(XYrYcubvhehhuY#26Szv!&ut+a$FsI!Vbm9UF@Wmt5$z%k7r)ggaXQJ zd;SzgIvI`9!B6XE;8!}hM_UXs#qy6y-@jW&CdjE1vOV}J!?n1%xG%)kQi$V3CHQ{? z!_k(swmQXOC!pflRKE6I`D>)U|0Iw=9aZ~%>{W!9>Pm5>zJCDi4+>lv6B+;j0000< KMNUMnLSTX!`fQW{ literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Analysis.png b/Kieker.WebGUI/src/main/webapp/img/icons/Analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c8c2227de5f36a5300571cfcd12ed47cd6b426 GIT binary patch literal 879 zcmV-#1CacQP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0009vNkl<Zc-n1~ zYiLtv7{~u_lGD@N)3i<Esn|;-ja`)%#cH$xjV)I3IxnC_#x~fdh*(5$j0u9Gh$t#L z=9f+IgE!FW)Q(OqC~BRxYPC_5rO9lXCbqe>Ik}vib9P#xP}>I{-Y@_EkN3F|OcAyn z<+PlVRZ}_zBMRVomJdKg&zs{O{&OvvVBB6-sVi3hXfLf?UtuZNX!G?DB|?;q;{69t z#Pgr`LUx!t{N|K*U=qOkUCH;09P>{soavyAN+W7Y>M+QL@h<XGf&hY)$!rR3-EBkf zy1mWrGrhOR0j15w->zEM_-mD=ipb@_qOwMOVV*Yzc1ND$aiA4BUaCa^aybzXJr6S- z?Jt&le+%9xOp~6eTUY(I-tN@oDF_q_z*)8ivx?`BmllY*ao2YdX)X&+0%SN5*B{*Q z`aAloh;@r`-{x(r4;8BQpecZ&2%IxE!d~Q<(5!GWfZOlSA(0+NCM&`p{eVAyzqgju z?yy|@a>I%>`FRARNlRHjy&088=cMVx(_vihIf7_1jyRjb<@0wAlDZaCTkTSdi_u$P zR2!hA6<ExC4V%F=)r4`?eGpxtztI;9;mM`YG2&=3x79T0TspN3T9q7nl@c!IC)o9C zCz<~V-og$4Ua%Ps@uYx97Y2`!IopgE8@?*qq*ckFmmnJHb(;3Wrr9vT+&y#+?ctv# zGmnI1jt%o@{UyAgR4mi(T)EqPvSeBwbZP>f^aF?S0LoQO<7Qv76`hF_7|8~aV0pwx z1pMpIp!I0TMGCBWCdUt^t|d#0rWp)84Ebiv*6f5$yZTf2GhOhqHxcK&h;eSIc}WaJ z1pIaN<5Ty|SpC={mDDOXHSA%|FPLqk%PkBjn846=P*DZo1Qzj}4^i$dQhXRa{(d~| z^hMiG4=f*eo$eR|7^YJ)otfI&u*-DZYAq|Qwk$?P!CaV>cI3nig2|Wg4nD)H{zve< z>hHaOHu6oVCw+I)F%{0BD(y~fOHGr0g~>`YaygNW-hs5fd|!9U*ZF7cO7C;_)KGv6 zPI--^p(&CRk%y7WC#AGXZk7~6D#7;&ycif6<P)Fk{|979Pq12>LXZFe002ovPDHLk FV1mFqsowwq literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/AnalysisEditor.png b/Kieker.WebGUI/src/main/webapp/img/icons/AnalysisEditor.png new file mode 100644 index 0000000000000000000000000000000000000000..89089ece36d97f143555d5ee32808b454b87e156 GIT binary patch literal 789 zcmV+w1M2*VP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008qNkl<Zc-nQ6 zTS!xJ7{LGkb2fKX=W>+WG~3v6n|7fGnN%CiE)NE&Dcvt1JxNeK6g`wh7b+hD5qgNi z9s(bt3uU2(4t;0@#hja)jHNSWx;d7(?d)vltnWy|)b+vtaQH62?}`z~=;)|0lgVth zTCLM4k4#NXVIGgyNRs5CL?YqWYPFrKHq3pTPUmhg^p%&FpH-{XgX;moVDPnAEIvuo z^h`V+uh;2xlWPF~vYY~^M-vkhJ1rJVbXD*3`79ENWSGzAqevuTHJMEIKp;>IrcWA; zW-rdoG%_+$%P>qwI2=CS($W&=bY8Fb8~}Q<*(`zz9PmyHg~FGqRI0{cFqGi+<qi!E z9e{aUTUuIb2BF+;w-Eqt03(bsA_xL;|MT<ny>)eUCpG{$vD@v(mY0{g%xx-_>J1Ff z3Yl|*gJ8EbG&D@*1#seUINBlOJ-J+7oJ=M&zovudG0HNTbee?<`&L`b3-J5>3UKPD zlGHAOB#<-0eEvg78{4hA)Oz0y0I%1llu9K73kzXmDn+5;Sw0HzRY)l#-lJ@``Hpo9 z^Irf=d@CHxSDH?13k#*_`%l-0TlVxqQK_O$zfFOZ3dt*I<HCKLD!T#T^ZN7zNe-mb z=?X3ww(w&z5Zr(L-7FQMaBo$$u~}ca36&|NT@UM(m)8KG=PFq9AOx3)L_#r4{C6}O ztu>p?bDUk;`mCTpAo^Hk(jVj?3YqxslOyWeD*#vt31>XUGHeefZ~`X&AQTGiv)OFU z-1bDR&m{t3!GOuAH|r|psI;W;O6TFSr+9I3(GZKpJaDQZilPML<Kt(Vnwt9ZZD-G= zF4+uSWY-zC@2ECZ#)_nZ3hZ*Z2snx_aH=&PkLN9v{ta5-fj=)NmW9XAET-oYeA!q= zbF*40xcK7g(f*Ygba!_XkX;P-Eo50%05BdL(Ha2gxb@KtB2o#4j6d$UL34(`AEIAR TWf-c+00000NkvXXu0mjfD5Y$f literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/AutoLayout.png b/Kieker.WebGUI/src/main/webapp/img/icons/AutoLayout.png new file mode 100644 index 0000000000000000000000000000000000000000..32b25356a9e754123e2c572f229acfabd66b1fcd GIT binary patch literal 2367 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 literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/AutoLayoutSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/AutoLayoutSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..9a22a2d31ec6e33d4377a8127bb58ee8e80ca6f0 GIT binary patch literal 837 zcmV-L1G@Z)P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0009FNkl<Zc-p0t zUr1AN6vw}Jf9}1zUhixhSuSTj*c=oQg%asY4<S8B5~RbjMcRr;5+)_fgh8W+uzctx zTnrII45h666I%8Mvl&R)A2pSN%GPwI+njgTd%G?WB&mna%kRfIhtD~`-#K3b|7pbE zf<B**V_9~mMx)7M7$&Q&t<7P#+b7oq3=9mYNs`>kaa{ItvLs1a27@6}DVuzc=QKAr zR~8o+Us(lcYHBLY&CRvxbh;fBMKR0Hg^^(>Mg|cH$G{yr4w6(u6h-v+_dm<Y$;n*> zsHv&BT3uazRxT8GELZz<>n2i$+To{+m?^A8M!EqslK`IQ1-IL6a=BdJRsba>CB^mi z^^MB_f*>I9QG9sX4U>5*pj<>W+zGX|2o$3Qt)bD_*l4%eY&TW_+1c6Vo}Qlfa{Gk1 zBw%*<C=Bc@J_ipYtjd5s(FfLa5?`i*Fr_5o$>S#-d3kyJR{&<SnUVit%wn;mOi#}O zKia_198|j9nBhs#2^?sOMQn+{q7a10hZkB}TDCjN9b<7oW@aW)QBl!pwOaSRot#5( zQ2`yR#+DRHZdrv1e+bE1J$ONqA)*|MVeV(}d+VLnJ>~ZD@%R`W4u{+6bXN6^2?(i^ zuz?ICCxgbvuU`?0Bq4Q!R-Qrx5rF}z5J4jltE#Fx@AY_V<AD79`~r{1(>fJgk{3h5 zW+R7CY#u5>g{eS@C$*bMEhESf3DY5^c;%AQH97w7Qs2Y-LL4B!KdrmF`=dN2jE;>? zr|(Kn?rQIPG5Th7!d7-VU$5W7ex7_iQ+wHU{n)7sMeMp{<)hx7UG8(XU>smFnMis2 z4*3245o4-R>3!gRrIeIWj^$`!ftDikiurr(cRLbDsWY+=-D@p5QP}%@sG;=W?y^6$ zVA*ET)OqX1)6&v5`X2k<^*$WzJ5zblN>UmPttJ$lMxj&?ApCOz?`gPQu%?)bjubg# zi!o~O<*RF2z0r`QTc7t^HWK2hkU+?%6beTt)&%JEI=PBM3<LtwzvTQ2=;t>BaAu`i P00000NkvXXu0mjfyU>Sn literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Close.png b/Kieker.WebGUI/src/main/webapp/img/icons/Close.png new file mode 100644 index 0000000000000000000000000000000000000000..b50dc52f5cdf1af9989bdadd5d37f215985842f5 GIT binary patch literal 932 zcmV;V16%xwP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV000APNkl<Zc-nPS zYe-vX7=FIw<Y>%h(j>-Q%vy`92?mF?8dTg61X+u1XGeGGWew}-)-hqAV<^bRK-M2p z*yfKirqEXBCe@ZmW67jxDce#ntFEm&4WspBNz^oJT+HowzMVKIg}V3O$M;^I_j#U| z;D2J&Vo_-rra(#vf;{ivJ3AZMDvvz<7~a19d81r@T31nVR99A3l4UXxhz*h)M^~n& z?}x_6`$EZN_kN!*`b>jMdi~24c6-0Mx!DB2AGmV|!umRpN<ku*1C^D4*$l3``>#o_ z_vk^6yZ)p>k5c(c(}4pn<>ABfjln_q@7=@V@^WnU;lp6&-<FrBuP!W9$XZ(gwHncj z7n37S=c`9nSFe*cmQ@_LSZ0emI?U<bUW`snh0X>7UH3&$`8hc&#cH*=W7n=LwqwVN zpi*rjgUtqCXQ%(ixj73tL&(Y2mX>cxEC!d;`QT%YYn-R__snExb@iTFjpmB7vC#;Y zMe6EREQkn;9S%sv)w=uoPLp0j`cLfJ_ZA<CV87RU$i?$Rnc|;oYnyf(jpws!Y80Rp z@sSZsxZUw{z`)t;Y)4)qfeVBTlJ5y|ze#DmU!@ASq|+}9#A54{<>jB0snwmNs7MMy z!1}@hydKX=t00_A6Eb!oJKI;9NaPOyW28rv+yOMCb-H91rG<?K!xtqi`z|&%0EGha zwKa^*%>2<#>Dx2F<Poh_+OAM6S|gDiy~(7Tv;*IKzHQrw(%f8xwc4OYF4sdQ0~Oik z7Z=e#J$<taI4+X%AhX(cH8oWZp1&omtx4ME=g*M_psru9|4FUYN;X+mDuMib(1{89 z<=wk|ml@`x+o{ywnPShWQzh0|Y*ZHt75JBy=zDW>4a5e>-T{7SuB?2GHJLVb&Oq-O zA0G}IjUVhOFOM6vT5C=`{)XZ4<M(CD%krqthp$~O=Vjo~rjcF}XSRt>e%)@blGN7& z;yTdj0F4I7$^t~j5siXAdW3(5hH&Y|joV)V2Y&+sPpoVe)AzFMXP=gqp3v6SJqN4x zKQyA=SXu)0co4jHEp{fAI`0NLM5C=fb4)uJMnV|o#VWnNY4^^Z_JZ780||%0aa?dJ z5cu_%L}Hi%3x5I|TVCVSA*vw}1c4!<iKLYBE9tbbRo=f$!D6-^r{fy{0000<MNUMn GLSTZ0h{}cl literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Cockpit.png b/Kieker.WebGUI/src/main/webapp/img/icons/Cockpit.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d971efa0cada3bc89f5f2e3f11f17abbe46ebc GIT binary patch literal 840 zcmV-O1GoH%P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0009INkl<Zc-oDV zdq`7p6vw~!?rzR!rRLOSX<BMfW;L^Skyc_hLn<XOOQ;E9h(RhA^nfTRdKg$iWKdZ| zK`Skb?CDZVDlP3z_@3L`!+E#+>^4XW4Lb1q<M-v959fS2hroZv@swr$U;B*1XWH8N zKXqcP<oX<~7kDl~Ay;TXDKwmn()h}#*owM`X%~NVKNu76dDpf)xu1U$*WIa6io#4P zB;1R(Sio=s7(tXCaI5wGp+oOJ>>ULtUXn!U(o(-gWp0e5uU~=?tb*G*2xgdu7(N+f zR16f+(_r}c>B%~+cKIlPL6@)e3GjXtH-G*Dn&rXA#6u<(F+2~7qTqJB!8j}+DaBBE z;pWh)J5A0JK<A#_Wx)}X3dMxkDpHdSyWI|!Wj%!~%fQim5&q0q1cXin$Iy7&aR2qW z_O9Zq)y5|t!0r6J(;3T`?xg(#;H}Mq(P)Gq2p+n%em|xs#Dff9I?}RT>Z+*mIIF*+ z&l<Sw&=Ut&t{A^%RZ5#GRHc^X<YLff13?flbv#ETe-&O+q>)K!Qb}`*BC72)%shvR zx|2P<_j+SI9#m##Y}meDd)<|?28^#CIF6HAKa5CqAE5LGWF$lha$&%RoA!2eSiZpG zbb-A>rg#9QOBNC7a})K6Tl3RJ$!(|83E{&*ga*Bk02H7gVIB%Vg(D2lt+nXq2QciG z!&;@-JhBHzR;NzQ)#=^^uU+T+%LlRZ8q|Sj0UsIQMZsxRqq}(%Ah>X%?e1d(T4>`v zbNOGJSXrPe$v<`au*qZs@90GkN}-(Sl02Z`vPZ*Q8wYhn2y87)!qaDlR}G)PT=)x6 zkelms;MlQ#xm@n|>)+FQ!xk0&+D|zlUS{cGoR!(<^=0$IvthG9WEd1Tbe$Y^3;Rm; z99<k3m{wU+Q#R<f)+bJ3XC*J3Q52?%h;FQU)l?iiZihI~gR0hk!=>-0^f8YqE+|Oe zVK%dWYHR04l6iBI%Y1k?Q~&bK&32>d)MJxvXiUJrV%6j@!sMih7PD3Ot^EXpxKI0b SNutC60000<MNUMnLSTYJqLuIf literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/CockpitEditor.png b/Kieker.WebGUI/src/main/webapp/img/icons/CockpitEditor.png new file mode 100644 index 0000000000000000000000000000000000000000..89089ece36d97f143555d5ee32808b454b87e156 GIT binary patch literal 789 zcmV+w1M2*VP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008qNkl<Zc-nQ6 zTS!xJ7{LGkb2fKX=W>+WG~3v6n|7fGnN%CiE)NE&Dcvt1JxNeK6g`wh7b+hD5qgNi z9s(bt3uU2(4t;0@#hja)jHNSWx;d7(?d)vltnWy|)b+vtaQH62?}`z~=;)|0lgVth zTCLM4k4#NXVIGgyNRs5CL?YqWYPFrKHq3pTPUmhg^p%&FpH-{XgX;moVDPnAEIvuo z^h`V+uh;2xlWPF~vYY~^M-vkhJ1rJVbXD*3`79ENWSGzAqevuTHJMEIKp;>IrcWA; zW-rdoG%_+$%P>qwI2=CS($W&=bY8Fb8~}Q<*(`zz9PmyHg~FGqRI0{cFqGi+<qi!E z9e{aUTUuIb2BF+;w-Eqt03(bsA_xL;|MT<ny>)eUCpG{$vD@v(mY0{g%xx-_>J1Ff z3Yl|*gJ8EbG&D@*1#seUINBlOJ-J+7oJ=M&zovudG0HNTbee?<`&L`b3-J5>3UKPD zlGHAOB#<-0eEvg78{4hA)Oz0y0I%1llu9K73kzXmDn+5;Sw0HzRY)l#-lJ@``Hpo9 z^Irf=d@CHxSDH?13k#*_`%l-0TlVxqQK_O$zfFOZ3dt*I<HCKLD!T#T^ZN7zNe-mb z=?X3ww(w&z5Zr(L-7FQMaBo$$u~}ca36&|NT@UM(m)8KG=PFq9AOx3)L_#r4{C6}O ztu>p?bDUk;`mCTpAo^Hk(jVj?3YqxslOyWeD*#vt31>XUGHeefZ~`X&AQTGiv)OFU z-1bDR&m{t3!GOuAH|r|psI;W;O6TFSr+9I3(GZKpJaDQZilPML<Kt(Vnwt9ZZD-G= zF4+uSWY-zC@2ECZ#)_nZ3hZ*Z2snx_aH=&PkLN9v{ta5-fj=)NmW9XAET-oYeA!q= zbF*40xcK7g(f*Ygba!_XkX;P-Eo50%05BdL(Ha2gxb@KtB2o#4j6d$UL34(`AEIAR TWf-c+00000NkvXXu0mjfD5Y$f literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/GridDisabled.png b/Kieker.WebGUI/src/main/webapp/img/icons/GridDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..c39a62f447089f3c7c95bce9a1d69152d7c95cc3 GIT binary patch literal 898 zcmV-|1AY97P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80009?Nkl<Zc-p;} zJ4{+p7{@O*CUtaTVQ_GCG@K?~-HiiF!$i^nA3PNwNmHZvK%)X_I*@c|7qJ8kL2+<! zW#I@RzTzW9qp5>2lKAFAzwe~SQ187$FW!F1336@@-|zmv$NAI=e=HV@nL9c<zBhmg zD(&Inp?G$7W^Ze2`&#Q69sgrwWW+x{K5kdzxLhs^q9_W*Vo|ufyetER&1f`!`B#7d z0NB(3lu9M$9M{dwjc|2!RX#pG{s@YGs~KQ;csStodQ}17+dn=&GJw0gJE5tmNdOhZ zy}dn4XJ_Y+{|12T`ubYX>-9{D)6-LNcX!v))zzg4@dPk5G!&San5Y{7<QEJE1Ir79 zI5{~Hx3{+~CX-1P;t61Ia4;}AIjK4a&^c6raB*=Vw6wIaeGUQnAZ9Wdi`i_JK)eb7 zI>PuP1jL>Ju^-pz*urOpLP1QY)8^jZ-moly$KzoDc%U8?_~JmgkAP@vYip_V^Yizk zqoXAWz`(#jU}|bgH2{aeFz}MZ+~8^;#Ky)3&1SR2=kpa60aSahfZ)z?p<^B*4gg9^ z0s8y<>sEjpcZx7v0R&iIU#FX!n*_>T9sqNoj;r8BAXEc#fPxX|xKaSO+szcv0)U4i znM_hBM=~}xCIxW0T(1^_=Wox$fB={SiU9SLVKwKK0J0%)I-Rdl1xn5<0c4X90n~QF zTAZV;tgO&nE=S<bkpegzj=B}#<;OeUb4w%=3_!LI*zI-(pmeyJ<H}DZi^t=1Yio;u zA9(-_0ZLbEB3652B>>r0Y_r)I0Cp_)pbCT<rIweM>CVm$nVFf92f%@Z1889|c~h8> z$n5N_JOGYlc!g?Z(P)&yoJi*8=A-~HD6kOVb*hy`A`!a3zfb1p=j8z~1X?Pvw6sJI z4i3n|!h$@2)*%Ro!}Rd*kof(6DL_w84+GFL1dEG{^yuh_1cN~-KzDaH1GvAx*AxJ& zAQTEo0jySQV0wDmc6)pK*CC~Pf4*O>FW^i70O?dJ^$z-h6ri=W^+R7@-{;20#)irc z$1j$bzE|7lYjt(?C;Zp+2__@yRNUU){uUC%029$0J{8sa_O<K-T)DZq`By%lFH}DJ Y4fIs*Khyt6djJ3c07*qoM6N<$g4v^)sQ>@~ literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/GridDisabledSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/GridDisabledSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddf3bf9c96c5e53d5531866cfef0766fbb5b39f GIT binary patch literal 471 zcmV;|0Vw{7P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004=Nkl<Zc-oEA zJ8QyF6ae6x&0pXYce}bc_`*m2fkS^qX{Y{(4$>O&5k*819DJdo#$B$HAc~6Uls20V z4hm{+?}JEcqvXKNg(T<WoO2Tn;1~{vvdiTXz@0ds&qz^}cc;_&ar=xTm%(5FL!pq{ zEEypLj>jX|@Aqi4*}Qo?p3i@PEXyz)4x0j+rh&uZKzF>*cszc^?|xYZ^a{4yEwI^a zv=WTGM59sh3iSJZ7>Pto0TP$Xg;qfpo(EX3*Wblr(UHw&5e0g^-a|ld<#akxY_(dc zsZ@%WBuS${x7&q+AUp(&EiD!cH6D-inM{TOoleIRK$1x%qyhq5D`>adcZYb}20;iQ ziXxxO<rvUvwH}^=o~*}mxl|L01fS368PIGtVK5k^0LO8E67}5}^Z8s&CX;-jP+&l# z(SUxx-_j6`K&ez>K)qgvKA+DrFq_TPbUMwK%Vh@CYBlKfdMyLf>68MMN`(Q{Y8B$2 z#BJ8E*&HU5$xkd6bKozS0f9i^*>1N#kr(x|Htx6gce|Z38jU29`wLP+C?M`c*^mGL N002ovPDHLkV1gM;)J*^Y literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/GridEnabled.png b/Kieker.WebGUI/src/main/webapp/img/icons/GridEnabled.png new file mode 100644 index 0000000000000000000000000000000000000000..3df73e6c43482f389dd45ea1477495103959df85 GIT binary patch literal 1270 zcmV<S1PS|zP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000ENNkl<Zc-pm> zNk}Y57=TOXx#5QUf{F((d3co9dF1LbARfGgAqOD`w;A^hLd1Q+Wh4Y5BoHrZL`B>V z9=r;{RuMN`a2=hvG3vO?Oi#c6FQz)}bdS!AFFzF3UDnk9^}p4xA92d~__#JZJNqwx z5aOd)tya6yXw+wBX8z{sZ~WLpeSLjjQ&W@P7sa9|5<w7%-EJp0H#g#`(Wv7-efrf~ z00RK%d;xGc98@`uhldAZHk-wxqobd|qJMY{P*+!HXl`z%0HYQ{{uS8i_=(P0K4fbm ze7#_`!LXAblb%RONC*K}2;1A+`8hc`gI)s^UJ+tq0D@By&UWW4UxOjq1R?@}<Jm@j z|7alz2?^8^r>CdF*49>jZf@@2n*g=7wT70K77FmaiI9J+&aY&O)rRwLq7@!MIeD@X z{<E2+q@>WeK#1exV_{=sBR?-MZ}3%snwlCzYilb7sJO6`4abN7EC9m}hkx)7kQ6)Y z0)6%uHSq2rA^=$LAIP8Im`QqiI{hhwfOrsAR#x)0TJ4}m02db*BrY!Q#m2L<Gm?~) zB)#9=-O)KbJe(@R06aN4q1k{zNe}n)qw6@|-rfpJOH10~;^JXdfa>aM3V@rv1)#AC zO2OPDCMJg1Y&NPG=gZ4W5)~Ci_sq@BEt*WG?;08!914J{swzWUTN?!clhH_)3*@(S z5X#fj6P<&DgQd0W>uVAg7AB=6TI2EYkt8Q4Q!6bjEbyzVt6WD%hutjzJ|lH(Z0rkw z^Ye3(n3yQN-{0TU85PR+#K*@=%5mUX(b3U#jRAnAl>n8Mm68QKae*2D+k;<=1KomW zp<57Oetw=`US8%P-PHjw2Jk94JUk?Ufq^dopt_OB$Vln^`T3d7K|w)o_n^T2K+@9E zs5Kx4cn}UMt`eZ4qJmlg0p4o?x!_so0<_5N>?{xI$Tc=LDgnyN%Ow}QCkEtu<NzoL zfHB|}fTba3fvXE3k4Z#C#H%iF-GhQzfG&^&sJfu6tn8~~0o%iZP<|EzPz^!^V3qK_ z08BZ`)zuZv0+i|LX?|^Oje|Q!2~b*EDp>%tKyF$T*9ccDM7W1lM!Bn)3#O)~D1d4m z(ChUS0O`H80R9FAv%ob7<!4P!PV(#P>m2A&2S68~>9C|Sv%Lm@ibF#~B><@Nv=@+z z+yx9kwG``gItqXl3ojK{7q~_^bHQ6#fQ2YEHI+V3Oib{bo10u`XQw&<HY5ljr)J{% zb!tKQmIa{m=AlF4y1Kg50k9>*E7TJJi^W1`bb+S;V`F1H^od+|cefG%8U^YCG#NG) zU#k$|dDx<%jE;`-J3BjEPfw3J0J^|a3;5!Kk&zL8cXyZT?d??u@Wutc01OWg^Lu-H zTwh<G5}>H4hytL=u=`=D#RS0u0s^FWyk1c>8jagMQ~}&AtdklV8shi&_qqQ5ekDL* zVIc)zzWqN00Wb>&1_qP>1qB6$_V#ui-d=KXwS>EMcl+cP1AwK)#l>%-9w-4aGBSQB zDJl5{Oz6*ADtT-5+WTAUY|PBe{0%YkGjvAEt~e_zD;NSK1v(-P`w!jIulHmf;6#Xp g^MiwfTlwF<0F!tOT{wRjaR2}S07*qoM6N<$f;Rs>UH||9 literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/GridEnabledSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/GridEnabledSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..a24f021ddb43517639631603f5d23b9b89a6ce0b GIT binary patch literal 592 zcmV-W0<ZmvP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006PNkl<Zc-n=N zNsAgm6vs;^&?+8s@(_Bi!9Xsq?Gg}1a?8=fe2S2q@)ZI(NTTA7h$47!L&fbfCn*m> z@vcPBj5jBaOS^TYsyf{mb&?0KU%y&@_5S^;6#!ei-EJC<#<$=J+wb>iJRX12>-Aqw z=M?18YPH~N*A4e$j}wGlICccKYaYD3dPKwF@T1e|{CWmxHk<Il=H@>C!pRQ%=8tbN zj~4)XT!TBO00com-EQ}T+wJ~#26$n6!+l2#J$19<0rN~H#w!LaALiiQ^94|;RA4@z zqh7D~-sAE3Wk93RfE+fZQc0<+)e2}d8aXZ&3!qRa0MGMayWN86bUI0;QrEFq3{gP6 zUWX2cgCmQHkqug{_OD3hcDo&Y#~<`Q6biA?XjGtpTCE0cHXA4Dl1^T)*FddS%Q-QG z5SUCR_dcJGjYJ|Mpjxd`04ej51Syiuhr@wLpa8joN~HqrcKbgikchiLVMK!8?`Pxj zxCkhh%g}1IK3TzXxujB#B?JNiHjzk(fKsUhEf$LmIMz;DC*=}=R1gdX*<>;)0*b{V zG@H%;l^|6&8jUC*olc8@LZJW+2E)Y)j=LdMKmg%zn9XD|A|Rj7LzBrQw{f%C0ES`C zqGW@?fC94FtO&^EauEL{9HC#b)A4@4|I_RBUgH}q0$eWFtxl(VMHUh#?K+O9<Fnap e-05_pWbbd^O@$zRSdE4N0000<MNUMnLSTa1&I^zL literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Home.png b/Kieker.WebGUI/src/main/webapp/img/icons/Home.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7d58db9a686cf07c74b6419fc68138d547d37c GIT binary patch literal 779 zcmV+m1N8ifP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008gNkl<Zc-nna zZAepL7(MsiZLPV@nw#@ufo5xcO`#M^(NQK+A(kN{s6>rIE2DlCL=uI6D(sIzn3{?P zsg+VBk{=mGU?NRjDoN?YZMtkaU2eMVu2&5yHJ{6Uf1Puluk%n?C4y4k(+qdr7BA~j zfTGFAnpltP>quR^XE~Pom-sfAFOpx4RtKEetrE+EBs3_37@hE<v)^X@q_@;Mri^z+ z>JtW62>2y6Xf>MHM;S>Xv5=1i;(8vy(16_uc)fsQ7N~5o&$P6)U$neVe7qzej;~5h zO-rje9K~g5LSPs`6#yvZ08J1><BLgLq=9Y&(Aw?sKCOO{G1;oEp!gAazB@H%2eOib zWgHG5^9ACRfW&9zY$j)b+77_&2CAB@Q$1~EN{Sy@ka;@$a%mXJ7^ecFLKe$jE#}+M z8-b=Tz~C5AUR-j85@|{cPiAFYhzw<s5&IwJvUsUui3p9VvdT(Il2}$65}%$a-{`>( zKPT>KebyuwG&;~cz=6fa#ZcSB=aeMjL9sF^=ZsK9)+hxkj<22l`WvAAJMe27_||y8 zhGJB?dGWb-Z}SB_D2PDOk+lVGwgDZ)1#?apJ`~+5px_s~XIpxCyL#_tMkoMoM7kgo zGsFiJG2x#*&p%{<P8W;(k2DNF$=^Th)fJyRKtZTtsNj?*2hU&9s?=l^@IdavBG8wD zl#GM;7!wZSMmu1hB3^JY7&VOJU3p1^t*`Frq7#K%{RQgm`WWr8eVQ15Y?ARICDjCp z0hR@fq~CGk0kd@$I{i5G%}u)D*23f&)8~;TD>LFysW@zZzVcAcsqkIFg76R#6cYYI z?Pl8?2FC0#7=O(6zACCVb+ufZHujFLI3}(rkYPBS?NViAT7W7dTB=aUd0d*ZTg?`8 ze^-a8uk#t}_Vi4T4Y^mn#=nCn+(7Pv=FSh(%d#%#^n_<M+;0LL1U4E^JVO8g002ov JPDHLkV1l{lWP<<z literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png new file mode 100644 index 0000000000000000000000000000000000000000..1279be4f8df032f4f93395f70ef9fa87fd001920 GIT binary patch literal 759 zcmV<T0to$yP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008MNkl<Zc-m!? zUr1A76u{5@w|Vb2r&p1Iq(lZ~WdHQ$LoY2Ke3F7aCG=qQ&`TN#AsIyYkVu<2U$mGA zk;>J|(Rz>wbquzLAP^S#(x4@lju2~`clW!ubMJJ2+6Ra4`_6aH?>pyw-=UynBoc{c zQ4|@LWi?|@2w`<yw^I~VkK#f(hWn;?JpNviq>y1l9XSsVKb8guA4CluP1C?I3>b6i z8UdzlFc@5!o}TUwg+h7((B0j0V`1U-8vqUP7S!k^u~A^LaA37sP0;f4@+Ys?+qJ&F zUIcV@Uh~W^EXusVgGzMJG#zyP$Q?jc|A4E(fgp<s@cDdQ;c&PJkS@DDb90L_!&yxL zITV#(EfAL8Pr;c}A_#(Dq+kLfkw_8HA-O$IpUuk6O-{TW4xJIA<{<~^9cXK<1D@wi z!1(xhS2P+e0@^#=p1TiU%7UGTlTAW-1O_Ct4Q;3E%m`*?W`dKGlh-#lH;aHv2)Hv8 zkQ2K)NUaX2cd%su>R=mMPdH$8b#-H4V4ydZN^O)q<3$AYJ(`ub{!&<J3R+xNa8<K~ zH0%}~8XbG!^N#wbrl#%{-{){#Xm@*VJ$WVnRvG*Vc{R^cP%qFR;0y?%GrwR(9-9aR z0{s<$^B6(z$h@4TxdK4P>T5&;O(8&IBn{e6hz6hg*Vfkh@z?5QfO81AIl3rw78V#f ze}KNAAS9<~Kn@6q*&h&lJLbna^e2<a{{dG$ecmP6Ze@XE@;U>6evroSGYY1#6({ff z_lIJ!*jPmh$6L<2dxl=j3W7y-@*Kx96hm~1O6LG}Gek}9DcNt~5Am-{Be!!oWv2ol z*wBq-uh^Ypqs>uU!#kW#-d<bH*=lUS*Vxo5vFiKhkC9a3%S2{>SE~RN6gaR4jK(u6 pL1SYvxW=}|%vdf>R3%$#{}0+zOdvRkjx_)P002ovPDHLkV1k&zQpW%Q literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Logout.png b/Kieker.WebGUI/src/main/webapp/img/icons/Logout.png new file mode 100644 index 0000000000000000000000000000000000000000..099e1fbc1341adfbc2a09d6f7e297f4dffb81143 GIT binary patch literal 954 zcmV;r14aCaP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV000AlNkl<Zc-muR zzyZSZI~CHCV)p+1^Y_Q%<trQ(^_0EFrj8Mp0s7wQu?58yi$Dt6TI=0z?On8+paFZ% zKIC9vVwP|*lzE`<of@B%Te*M{sAOh;lShb`^IbD5dz&wxKW_?m(t3wsz{KVIEKT&a zR&a50$gSV7A#dBE)1N}p$`&v(GBV6)$n-8QsqPgJlhI&f{QK(ajoYz}scyUA285JO zGl~fGKFH6@#ly_Z#L(0+aqg$jZ;u3I*3AF&pMhaoo}a%(c+Hd`XCv8PzyC6P|Nism zuKkC+xA&#)Wi;^1V)h7#Ja4M2s{0RUUfYsm?=P;XOV+cp;qxzOU-0qQe};{XiC*__ z-IZ1Ht!&8*wiIRf_n+a?oyU*&Zd<RxXb@cFlAB+=o0XNBVb%T{pSH9|M=&$|*`@Cu z8slBow}63>iD5%iy2thX8~6PA&tzkhJ8zAfm6piq`yUyOZe145=#bP<6B3)+%*f2l zP*s@U^Xb;1ivORV|CKQI2}y6Cx%%JVfB$D!CfU8Xu=@xj2R{?9vQ<S=!<5!zcRw&Z zIk9Onqg{MWyH9LZ1rrMk!<5Qo^9RQ_p8|yohkyjXki2^Szdygee}46J>ettgzJbJr zRE(7Ds#e{7^YJ^w<3lSKFzN)CwuYt`SFy9RGMwADHfdF3+I)BvF*Ab$`TyU)|6yVd znXSG8meHHOe*M94Z`Z;(i~{<8$+68d=Lqw2Ffjl5_Uz;1>y|wUE|0J!n*6!DMSt?j z9{Kp6R}B~w4CfZqS2D5+NXt3bth%70uOrCM%fTSV@$b0|+mA9yLC#fHk{rK48u#9L z%kt{$f4>Lc*?OLQ{;&Au%MXTcuU~xM-WX=e$igei#3!d;5z#WgMMPGTQJ9OFL7ba` zL6-af7XjA)H~#$l|NqqwCbe518Tns)`OEO-%TES|uOAsUb`|u#ymq1j>_=8!5gu_J z`}UyX_6!3Zc@|NAHU?2H1_mBB28J&{H@pG{-^(vRec%5uynXfJ-^NLeOYR)mlK<`9 zix2Rm%*HLi#VsruZW5YR;Oy<AqbkMEBmp$&?|(*y4?q4gy#M^;-@!e*Zta}gKjq!i z`-{GReD@h6GcmJq0Qvt#Ik@?ZWi|CJM5UyqSXr1EKfHSW;=#2`r#`=bcN!QoFMoae c@(-p50P|^fo!raHwg3PC07*qoM6N<$f(@Mc+5i9m literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png b/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png new file mode 100644 index 0000000000000000000000000000000000000000..7f06b149360c48b1aeada49f841fcf87db0c20fd GIT binary patch literal 914 zcmV;D18w|?P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV000A7Nkl<Zc-l=; zYiJy06g}U}WcHbvJlZYU#x>Z|)-*BI5^FWCCYXg5yV#frR>4A;#fpfiNc>Y{i&~^= zE!fBqMFPbi7O~KFZPh}F{u0#SBcWZJu4#5jVz$}5HuL<vvn$0rocV?s&bjxTxeQbf zKKa>5bMJv<P!SOf0RcbYmjPJ<I0sA{STljuRbV0q%un6K-=ib1O{L!)W|7T%#g^`Y z$;PgZJHpjKh)_!+bpaBp0$dVUCUSwubBn-i0VvL|VdCuZGuiWp`&d)kv$0LdcW<cM zH!@WvG9gN62m>lj;*h{Rk#kExzDQ&b3&7-$=Vq42PB*f99~<c1_4L4({)mDg5kdro zx+`>seSjpA2-&oG1)e2NFJ^CKaQ4&p+gNnR3)-Fgj_5*Z0+IDKkZEk6#Nj$7EMo<J zA48CYJOq4|Y}RjxfD1Oh_~7jX+t8ZQwk8kj*5y9L<8d&?s2`(F9Ajg@!f{-9uLMCr zp-@0RpGV(wFQFm67iUhqMFK4;t$F{T-W~WH9UUD|DTw;|df2v&TrLMyQBhl02Q}ow z_3>Zu-iaY}?eE8=FNSlcNFYK2t-VL}4|`_N)YJq~6mP>dmSL|fz+5T7S}npR{5+9` zd{-yZQxd)#CV_R^Q`#d3kLk$=B=qg9@`eW^|D52OC9>j{?Z7+fvbcm|RTL+`xrX%c zkp!!6PHDRiyrb{g>EM~xBFy<o2%<!uNsN3~@^I<oWg*vbFs<&!P&$LlBS#agZd*!g z+xN2Gv)jcJcdvoZ{YgX#<?=dLs5FsHL%0y-0Io`H_~gnh{Pgul30AW;rETguq(A;p z0R8O-O5^GB1YS4pSa2)@+%`#+a`A;A5w2D3z{ybuzg-+kFl9?hi^UJ=$%n&u{{BTQ z{eA(A+c4L)ptd?x_C7b0hy70mhUFq_N0E`+@k7SO`1hw0ta@|5wr$Vrde5U_ME$qW z-Eb4;;tcIR$BIykStE$)1s5f;hL%T$At_LTGQJv}!qrR1Da6M6Hg<M)4ZiW}!KW<K zw8N4mmevdxKE+QVGH<aQD%*Ap@0q|E6XX|P89a79``5?b+MywKPYgn!y^{KW#c$ur oe*)}(pIny<eEHky>>o@20*2jadLKRM@&Et;07*qoM6N<$f^HAFkN^Mx literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddf3bf9c96c5e53d5531866cfef0766fbb5b39f GIT binary patch literal 471 zcmV;|0Vw{7P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004=Nkl<Zc-oEA zJ8QyF6ae6x&0pXYce}bc_`*m2fkS^qX{Y{(4$>O&5k*819DJdo#$B$HAc~6Uls20V z4hm{+?}JEcqvXKNg(T<WoO2Tn;1~{vvdiTXz@0ds&qz^}cc;_&ar=xTm%(5FL!pq{ zEEypLj>jX|@Aqi4*}Qo?p3i@PEXyz)4x0j+rh&uZKzF>*cszc^?|xYZ^a{4yEwI^a zv=WTGM59sh3iSJZ7>Pto0TP$Xg;qfpo(EX3*Wblr(UHw&5e0g^-a|ld<#akxY_(dc zsZ@%WBuS${x7&q+AUp(&EiD!cH6D-inM{TOoleIRK$1x%qyhq5D`>adcZYb}20;iQ ziXxxO<rvUvwH}^=o~*}mxl|L01fS368PIGtVK5k^0LO8E67}5}^Z8s&CX;-jP+&l# z(SUxx-_j6`K&ez>K)qgvKA+DrFq_TPbUMwK%Vh@CYBlKfdMyLf>68MMN`(Q{Y8B$2 z#BJ8E*&HU5$xkd6bKozS0f9i^*>1N#kr(x|Htx6gce|Z38jU29`wLP+C?M`c*^mGL N002ovPDHLkV1gM;)J*^Y literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Reload.png b/Kieker.WebGUI/src/main/webapp/img/icons/Reload.png new file mode 100644 index 0000000000000000000000000000000000000000..494964cc71d2c52576356eaf6fb74f4c7f166990 GIT binary patch literal 792 zcmV+z1LypSP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008tNkl<Zc-oDV zdq|T}7{;IPbIWO#Zdit7rOkxWl#->CrC`#<(k_C{Ot2slvrG$R7+RX>DoN0!Fi;y> zUZ_8eE|xPZF)S%1r>(+i^AcOGHK)6MoqbA%|JVx;=Wq`1?>y(_eJLyu)ft<j*7*uW zJnMu~Z?ruP%WTp9drvI{sK^Mrd-8Hq0&HgJmCuZyJDP5)$Fw>7a@!~W3veS<Bul$g zB?iOH9M~*SJdt*Ff9TsOmUc}n3`q8trJYF=gYOT}i^vH95!iECUPEM-JdTp3dTsIZ z<gJ;sI?A`_^p4F36zqj8Nd)m?HvwF?T>!PzhdsCGhneeFr6E*tysPxQq$tz$Q^}}R zUp^W2KU$}W%r>S?lr^B)9l+h{M4O{x18^u><hFqyo=Y4!uuf|3lonBW(a66j$(DfQ zJY$cQ87BRpZFF?_<FI<PwYyK<QrG^w^GJ}jAtn8IIJheSD}&1F+Is3#7><=mVyh@8 zPx42S>_9|gcD2JSm{iJfIRBgLN_RTyR^h>VP%gkP1uAMg8maw(*xZmE(8U#yzj2s3 z*<I4pnCgEAMUPfj{MtcyHh%eik!XDc3`)Q-i1K>WQ6WBXeRK|^d{1{CocRFH3E)yJ zgqa$LMyX*Q_Ta^i5XV)*wa&gUX^1H+7(I|%j(jS3H8`b7=nV~mA9&<dN4q${B6`*d z5oMjJjg2h!tqIV)g*EXuLfJm3Jb?$vF^FLS_E<t>-*bsLn5hZdL`0<j44uHWX4E$K zAdv+W#^Fj<GO}$(K-)+1NWZxFlE=NtrQ0lEia1x1+I0bqJ$O^`5(nO^FwO!_N8)Hn zJZgr9V9I`s5+4DC3BlOo!H1KhfaDV=76b5A1zlMis$MCPrx=0u?=0-vh`@qq$kQ8< zGOoitoe?xmL+I~?h-EJDA)RYc>(D<i0=WYXl}f{YW^NjV9^j1W;Gv(w_l0I-e*6JX W)F5xftF~AG0000<MNUMnLSTZ$26Siu literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Save.png b/Kieker.WebGUI/src/main/webapp/img/icons/Save.png new file mode 100644 index 0000000000000000000000000000000000000000..76613eca1233548d23d83e418273aaf0c65b299e GIT binary patch literal 623 zcmV-#0+9WQP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006uNkl<Zc-o~? zJ%}1n5T57%|4$SP<3T{HKsYc>Bt_uL7!W~76BJZbRMMF?LAWY*N+7k31RDu9C#VEL zf*>}cWjKg}Xt40#)y=$@d*%Y^9GKm=J2T&Y^UW-QGmX%TR;!gLmC7e-wHhQ6$x#$V zKo^e3qd?=wKPKQi7CRgc>-l^>Jpo9i(l?Pvr090L=@|$iAP5570nq~3@AvG!*=(TQ zZXfIQ`U^a_7yuT$FBA$N0)YSn;2_*62r^(!0rL4g<Z`(bK7V3aDwXQ<_4Rcu7z~~O zsB`1Rl+|vxgHR|0wOZ{XhTbs%qtW;^lgYeFBoZK(%ULmMabm#%Xd9Hl)zuXYhr=%z zdQC8ySgqDhDwTRl0Tc?we;IHc7K;Uh!(nK(THo=VhhTxs;c)zjMxzf=NCqI2$xaNo zkd*#*yM^_74cTlKDwWF5<#PFm;0QHNr}LNDY*yNAHZT|r4209CV7!0c%3v^n>2xZL z$KwaYWHMb`US8gEddXyx6;XG&T>psL@AskEY{G0d1Ka}&^qAP~_GccCr%h=hC5Xjh zP_0%$uh&C5oo1p^r-0pV7mCFqJJZ}=ulJHzESBe9ulE~{QbH-yT_}}GpwsCf9*?tR zzF4Et2+HO1N!U)OlO(vla*all^!xo;WTW%>d{h@g86hYu<UW~9#73hbu2w77?#<23 zTfRsHM{<Eh8vLRZCm_4Oh4;2mz`VoVWJJ{E_V2!)^EaMjzX2Y#M|Qp#{cHdL002ov JPDHLkV1h8I8lwOJ literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png b/Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png new file mode 100644 index 0000000000000000000000000000000000000000..76613eca1233548d23d83e418273aaf0c65b299e GIT binary patch literal 623 zcmV-#0+9WQP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006uNkl<Zc-o~? zJ%}1n5T57%|4$SP<3T{HKsYc>Bt_uL7!W~76BJZbRMMF?LAWY*N+7k31RDu9C#VEL zf*>}cWjKg}Xt40#)y=$@d*%Y^9GKm=J2T&Y^UW-QGmX%TR;!gLmC7e-wHhQ6$x#$V zKo^e3qd?=wKPKQi7CRgc>-l^>Jpo9i(l?Pvr090L=@|$iAP5570nq~3@AvG!*=(TQ zZXfIQ`U^a_7yuT$FBA$N0)YSn;2_*62r^(!0rL4g<Z`(bK7V3aDwXQ<_4Rcu7z~~O zsB`1Rl+|vxgHR|0wOZ{XhTbs%qtW;^lgYeFBoZK(%ULmMabm#%Xd9Hl)zuXYhr=%z zdQC8ySgqDhDwTRl0Tc?we;IHc7K;Uh!(nK(THo=VhhTxs;c)zjMxzf=NCqI2$xaNo zkd*#*yM^_74cTlKDwWF5<#PFm;0QHNr}LNDY*yNAHZT|r4209CV7!0c%3v^n>2xZL z$KwaYWHMb`US8gEddXyx6;XG&T>psL@AskEY{G0d1Ka}&^qAP~_GccCr%h=hC5Xjh zP_0%$uh&C5oo1p^r-0pV7mCFqJJZ}=ulJHzESBe9ulE~{QbH-yT_}}GpwsCf9*?tR zzF4Et2+HO1N!U)OlO(vla*all^!xo;WTW%>d{h@g86hYu<UW~9#73hbu2w77?#<23 zTfRsHM{<Eh8vLRZCm_4Oh4;2mz`VoVWJJ{E_V2!)^EaMjzX2Y#M|Qp#{cHdL002ov JPDHLkV1h8I8lwOJ literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ScaleToFit.png b/Kieker.WebGUI/src/main/webapp/img/icons/ScaleToFit.png new file mode 100644 index 0000000000000000000000000000000000000000..e91690a13bc84413af70f84509c52b35b2a68daf GIT binary patch literal 1776 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 SP%(7?0000<MNUMnLSTXgCOU2a literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ScaleToFitSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/ScaleToFitSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2c924d9894f491c5622664a60b2f423167ee2f GIT binary patch literal 749 zcmV<J0uud+P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008CNkl<Zc-noF zZ%7ki9LJyM+-|wpZqAmDJDIE(Z7RKRu^^}jCDIpyHlhf65jBbERr*2*ioiEk6cQOD z!H~39zKQC^G*H{bnPEXT-HT}cTl=SZyY9B@?&-O6in!GezW3Zc_xwKh`##U_Ajrq~ z_&9+Ox`=Nt==FLAj|u!d0wL^oyWJxAM?mE=F)_IhA$i1Rvo%?**8DUAnG6Tw@%SW! zpvmEIaQ^{J^g0~Qn?|D%K)Ce+Aw>v?q6k=a^Epk^*NOsy!6_3?jM?pW9Z70|EX!CZ z4?$Qm;CVsfdEUt|bff?f3WZKrR8+pVSPpJY?5aSqp^Uj)7TaO3S5;L#D*(*Qd~CqJ zM~y}b5Cnk*cK}KyvMgah4scwiqq^GmumCVUJzZ|K(yJ6jkqQ9sx+*0ZAqhwlQmw45 ztu)ux*1RjaiSzT{p3pRNL#x%ORc!m0BpFKr>+9*oR4Q5La=FB!fN(ghGZ>6RCX=a^ zBuS-!o#aF!f#&9BXJtuhY;E)WDhk++@b{JTRH>%Dgn+d;d6VOQ`{VJSL$O$Fa4GsD zv$DF@-qX`FRRCzYKczchAW!NvAl`S?^?C1Cd_LciU@$ntFpRLgyxcr6Fc8=Q9KG|w zU^9`y{d%%agK@FVZ1>xaW4HH0y1KgBu+?F+*(^k((PqEjuR@@^J9Op5VRQe3bBBP8 zH?HB)XHk?<S)jANpmn`oZ`;Dc!mvi8Q6Z5?BmmF!g)cWc%`ZAnS=2?BUM*!=mMeSh zb@Ihp*W>Z1kaRjNB$LUr@YZ0UwA@}ZT3<~a7iEAxeObJxi+z1e<r2!@sl`QMW9U!* zXmcAI8(D0nWo&HpC2sq>u=lC25|`ejE3?$g0!IR#%@RaO30|(<bxOD|p#s5ufOrgI fQ>hd$2*R7cy}nz<*U#iF00000NkvXXu0mjfk1}aA literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Settings.png b/Kieker.WebGUI/src/main/webapp/img/icons/Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ef615d92c514dd66527d3161d54753fa8698ba GIT binary patch literal 927 zcmV;Q17Q4#P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV000AKNkl<Zc-nQ7 zc}x>o9LIk%ZKs!|LrcX<-Jn1%qCizJ;%YXa5#mL##Fil76^rg_uo{((A{*EEhwExk z6OVYsgG2=rBI>fK8#R#)D4rD$M2gS~J)kq~l<7=smxQLq_4CI|Uh>W7z4v|ZArJ*t zXpYUuPN~C#Zi;XX8oj(9@&dG<>HKqs8NLJZ-;ip0i?b}VGC&M=;o9VT2bU?Kv300B zR>~8pl%n{Wokt9gJEr>Y3S>V&zjCH(y5VWJpP7*;;C2o8;gzKy0&EDzC&Yo5;gM}^ zJ;x}D64>57+etR9qrVa$`oAoh^U_kQ3nqg3g%ch&JpweyL{{M_;vqXX1G@Y|XsNB* z0#A?DMFhCMCDG%wotv-E|EWAj0Y}e1^!1z1H3xjd?*({*MwwZ#NGOqtgFFnJlhdHD z`TAjB!)jARFs}0Pwcj?*)Csu&!4N==am_Yw*W)9U{Y40iO+k1Pg=R`#<$2}woa_<4 z5c))lAYmPN<b8H;1KC*m8bQk*{JU~RdUirAACltu&{$u8$b7)CBf6;ZvkmgpLQ|_O zacc4aUkq-F0c*p>i{#Dq<p{F;>TOUZ<zsvv{Hjj}#!nLM=G$4#wfZ;F60PxkiF$F_ zWnXxwAKvu^IuDmuu%FCV5F~k3F2Y4~VRl7jY4KcH)?^8|TyE=Un_YLpFs*G&uwYk% za#BuVKSzjw)8!4kY`SUcxl~$*j0Jw&-_c&QG;<b)hPw#Q{Y;3Zh~Y+|P}Cd()Z=gy z^SCj16~!Q6AEsfL42JISDVj1WkgU3!2CDd%Wd$1WkbbZalCUgm0>lV7fQA!n*f_!h zkl~xP^b&C4&Kr=?&H>`qZuO`@kW;N;Gz(k#I4)(pBaA?daZ@LXVUKR=sK7zc;o?{j zi3QNvN5S#4EsnrHzprI%ZB3CQ2+~(C0jcU2_U)~`Qq97$ImJd}O>qi`6Hc7`y9aDT zG-%avAeT$vkFA?(t@lswi@d}!P*EH==yNdY75k8x`6Zw8GUN&gh6bxm+mFxDZ7#uL zaJl74$H&(V`xlYD9q+#pM58<Sz>=j^Yi^u6bhWp$y+W3#HE{V@QFr^@y&h}F^RNEG z{~=YSNtpnhgz<PE-JdM3aY_wBdxuckV`rmtUjR@8WE)_+($D|^002ovPDHLkV1oIL Bzy|;T literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SnapDisabled.png b/Kieker.WebGUI/src/main/webapp/img/icons/SnapDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..2edea5e0e0ae8f57384446794bd4351474c9d2ca GIT binary patch literal 1620 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 SHw4B20000<MNUMnLSTZCDFhV& literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SnapDisabledSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/SnapDisabledSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..e5416ea6efbd3c3108899c23aec5fffd13a292c9 GIT binary patch literal 685 zcmV;e0#f~nP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007XNkl<Zc-muR zzycO5Sm36lq?G;f<45i9-@h|TOH1GQ^5x4ycX#(y=xQ0!1*T7*ULFw<(SHB_{Vzw4 z9=-kd@85sM#>OhTy1D`f4<4N9@9&?1(}1wBFrDh^>hnN_XFEGP6Tf}?cK^?xKmXa; z*(KA`(k5kQX8Lw?ba+plI&~XX12Qr)T2oU~E7Q}{P0yS;a~4@nO-)T2=(Ss`fuO&? zKLM)&K#8fYuC6JGiHSm|PoMsZW&q3N$&>G127;235+9rfI5;?@02K)B-MbgX04FCW zmg3^#JNNG0yPBJu>y2SROG}Hfj*d>Bva+)E#fuk<EiEm7@$m34u&}T&FflPP0L7RD z1qGWvefsna7{Ix4ad8Jw3;>4ws@mGxP;PE+um%ne4hB|MRxkz`!pzJJRtGeQVaJXg zr+_ZB*uQ`Of4BjWk&$aAOqdY-|Nno6pFe*xu(7d$G0YH<0gQ}{3@1*UU;xI_>22G# znIAiL3}HZQZ0wr0wzgo9?Z1BgVgN=RTr<o75IA}ABnY40v}u$1kt0VC1^`2TO-)Tr zFi0`X0GJDqy>RN(DUdf#uU)&={P5w!2m^o#WldpWVK7J&F!7+c0NH?Z=gu))zkdDn ziWMu&4;?y$Fd!!<XALkB1%osKlP^3BK$?*a044*5J9qA!Ub=Lt`GErm5C#C_cujP4 zbTCLEC?L@d0EG<*+`4s(;lYCkrxz|<XpRyK6%`e0LPA1<K_Lyo=>CVf;OWz+40rF| zJw0jCBy(V3A`DPeR16Ri5wQemgasfBgEas9_YWL4zkmN`c=P7XbzpQZ0O<n&A8{QZ T(Hq&-00000NkvXXu0mjfrS~nG literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SnapEnabled.png b/Kieker.WebGUI/src/main/webapp/img/icons/SnapEnabled.png new file mode 100644 index 0000000000000000000000000000000000000000..e263e16486b028c3d2e13cac5c081f68f4b4ffd9 GIT binary patch literal 1611 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 JPDHLkV1i2@^>hFL literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SnapEnabledSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/SnapEnabledSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..4f177f48f4a88e51e8542727e86e22a99ef32856 GIT binary patch literal 701 zcmV;u0z&<XP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007nNkl<Zc-muR zKm$EJJ&e-Q(kY6HirFkIEZRSR{$vEwH@|=XzVO+zXZ=x8QNNMZGol-?V8MdPfq{WJ zhYufqdf>o;bASK-{bz1&uIuXRs&ww$xh+SI9Pw{#Z2X7Sfbj5ei>j)sW2;xM-VQV< z`RmuOum1e`!@$A8A>ild*I8d*pVHCM5jAbvwB=Y0$j!~|N=!^FPD@MEI&<dCO=LMW zH8qjBbLZaMv}x0p?(Xg=tOoS;^-Xnib4!Vjj~6<7_Uu<=Idye)mPwN)-MxDC>Xo9R zB5$k)L_|d9Dl02_?A^OJ<iv>+-;w1kEiGB<>gpanc<|sxW@e@nh5-!?4f4N!{Zjq? z`!|Dyg$1*LfdLa27Z(FC1{j!_m>3QnI>am~DLMDuyLS&?zI+)E^y+mK0}>JvR+N^O zhI4asgEavIj)9ex70d=<W@cuvx*IocFl^nr^+b7jxh0ALk&%&WCQO(R3}XNI@q>Yl zjSY-JhJY~007gbehLa~xGVI^K|Md3l+s%(1JN6%LKx}O6nzpvKV30y!;$dKCXNMaA za{<TzVAy~RISq^rb6}c47y$IsnwpxLV2}n-I3T+K*$bynpJq6J{`~26>(-eA6C1(+ zVBD`MEG!HL*$hfNFayxT0GJvXu3fu!dgaQM=D>hO7?7Qvy(T?9Js70v-@kt-{)fc` z$P1S)U1GR>`}XOjOP87-Ja`acKyh*Ln&{~0V36Yf|NmnIAj}0fZ{B3MfB*jJg$oy& z1M>>PfXd3sH30zu!5~{e7?%MLA3kJw^ytxPV17W21#NBZRA3f%0cpS%g&<b}b0#=^ jo;-PSao4V0Z6JLBQpy`3q@6G&00000NkvXXu0mjfB|k;9 literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/UserGuide.png b/Kieker.WebGUI/src/main/webapp/img/icons/UserGuide.png new file mode 100644 index 0000000000000000000000000000000000000000..abe5d5dab5305320c447e6e6bf0dd8692896a453 GIT binary patch literal 801 zcmV++1K#|JP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008$Nkl<Zc-obc zNobQn7>1wulO}DGw$U!crP3G|#54_7#Z=LQ(yCC@iqeA@af^py5tkkm5!{Qo)Ey5h zs7TdARa~Hmd#y`s-A!FE#ie!mTTIf%CUFvKv?z!#%<#<&-!tF$&Io?fZ6QiTB(g{k zP6bj_`1BO6cwlEGT;(qk(WxGigb+u~7R!vRvN9Mkg0Rtu;`0%ztD~u^DtyH2-T4fb zpM|bJ0C(WDwV+@|+L|@^0s#`8P7<=R2+5e17L@1Dd0kP#2Df|5W2mTuNE~nrO8RGJ zp6a)DEq=L?>~bNzUU0h!<>a8r%Y$pzh%_{CWA*B;Wvc4D4R_-Jxwz;kDk{|3?F1bT zbfu+GDLelBnRcCy)OG6!*VOQR>sHzt8!1=S12@3+wz~?^0PVI(lTwtVBuGdAvl(Os z-=guVRTykG{Nu(EuCI^XxC0*Sf-xVVGX{7lNyDvHgrdZa@yq1Mi4!Cb8icxgKP^qo zBz^RfcA<ttfk4xGaI}Ii2DlEbPK_o*bSH=9XrDeEQ*|{DpS+_{n~vU~p-Xz-&*SF& z>?wEmwW;IPNH`D!?1hu_6lJDXh<F8E(u?+khdGyMCD*Da7>wYTWQ`WiZ`yqB%<&`B z9($gJVgUK-;};tYmxraL#e4W_vEW&`kyrLH4Ct*vrxO@;pvX&J-hc9FYX0!t9{*q| zY%9;nDbLQxh;4Qh7xQM0i+h+zH)-hKOQDxcPLBSWn~fKX#^z1#0hj>Vfv|o-cJ|WT zAw#rAgMkinAI_94B6YN#z9xlC3HaXnmD-w1m2>BpuIK@XYM6`@A%7?=uo;b`Q}ue| z8?9dLoLkmbFtyO4_=C;9=H}X=S-x2VzU)zh9i7F4T@C6l=em_HK|zomqm{;oO&R9k z`%fQ2KhIxO&)S}C8@c4&^<#Iw`6GpY0RE->`zH!rifP|K$Eby#+UolM21Ipb+eD#H f?OpZCZ_ob$XX*f>&YR7t00000NkvXXu0mjfNZgAR literal 0 HcmV?d00001 -- GitLab