From 88d5a82d39a140c05735f7429b8052b1a766349a Mon Sep 17 00:00:00 2001 From: Nils Christian Ehmke <nie@informatik.uni-kiel.de> Date: Tue, 9 Oct 2012 12:45:29 +0200 Subject: [PATCH] Replaced some Icons; Some refactoring; Localization --- .../application/GlobalPropertiesBean.java | 86 +++-- .../kieker/webgui/beans/session/UserBean.java | 19 -- .../beans/view/CurrentAnalysisEditorBean.java | 40 ++- .../src/main/resources/global.properties | 2 +- .../lang/AnalysisEditorPage_de.properties | 50 +++ .../lang/AnalysisEditorPage_en.properties | 50 +++ .../lang/CockpitEditorPage_de.properties | 6 + .../lang/CockpitEditorPage_en.properties | 6 + .../resources/lang/CockpitPage_de.properties | 6 + .../resources/lang/CockpitPage_en.properties | 6 + .../main/resources/lang/Common_de.properties | 64 ++++ .../main/resources/lang/Common_en.properties | 64 ++++ .../lang/ControllerPage_de.properties | 16 + .../lang/ControllerPage_en.properties | 16 + .../resources/lang/LoginPage_de.properties | 16 + .../resources/lang/LoginPage_en.properties | 16 + .../lang/ProjectOverviewPage_de.properties | 24 ++ .../lang/ProjectOverviewPage_en.properties | 24 ++ .../src/main/resources/messages_de.properties | 158 --------- .../src/main/resources/messages_en.properties | 158 --------- .../src/main/webapp/AnalysisEditor.xhtml | 295 ----------------- .../src/main/webapp/AnalysisEditorPage.xhtml | 302 ++++++++++++++++++ ...itEditor.xhtml => CockpitEditorPage.xhtml} | 11 +- .../{Cockpit.xhtml => CockpitPage.xhtml} | 9 +- .../src/main/webapp/Controller.xhtml | 123 ------- .../src/main/webapp/ControllerPage.xhtml | 125 ++++++++ Kieker.WebGUI/src/main/webapp/Login.xhtml | 51 --- Kieker.WebGUI/src/main/webapp/LoginPage.xhtml | 56 ++++ .../src/main/webapp/ProjectOverview.xhtml | 114 ------- .../src/main/webapp/ProjectOverviewPage.xhtml | 116 +++++++ .../src/main/webapp/WEB-INF/faces-config.xml | 6 +- .../src/main/webapp/WEB-INF/pretty-config.xml | 14 +- ...lysisEditor.css => AnalysisEditorPage.css} | 0 ...ockpitEditor.css => CockpitEditorPage.css} | 0 .../css/{Cockpit.css => CockpitPage.css} | 0 Kieker.WebGUI/src/main/webapp/css/Common.css | 168 ---------- .../{Controller.css => ControllerPage.css} | 0 Kieker.WebGUI/src/main/webapp/css/Icons.css | 185 +++++++++++ .../webapp/css/{Login.css => LoginPage.css} | 10 +- ...ctOverview.css => ProjectOverviewPage.css} | 0 ....xhtml => AnalysisEditorPageDialogs.xhtml} | 10 +- ...s.xhtml => CockpitEditorPageDialogs.xhtml} | 0 ...xhtml => ProjectOverviewPageDialogs.xhtml} | 16 +- .../main/webapp/img/graphIcons/FilterIcon.png | Bin 13483 -> 14452 bytes .../main/webapp/img/graphIcons/ReaderIcon.png | Bin 9831 -> 12409 bytes .../webapp/img/graphIcons/RepositoryIcon.png | Bin 10719 -> 11104 bytes .../src/main/webapp/img/icons/Copy.png | Bin 0 -> 494 bytes .../src/main/webapp/img/icons/Delete.png | Bin 0 -> 694 bytes .../src/main/webapp/img/icons/Edit.png | Bin 0 -> 667 bytes .../main/webapp/img/icons/GridDisabled.png | Bin 898 -> 997 bytes .../webapp/img/icons/GridDisabledSmall.png | Bin 471 -> 515 bytes .../src/main/webapp/img/icons/GridEnabled.png | Bin 1270 -> 493 bytes .../webapp/img/icons/GridEnabledSmall.png | Bin 592 -> 368 bytes .../src/main/webapp/img/icons/Home.png | Bin 779 -> 834 bytes .../main/webapp/img/icons/gridDisabled.svg | 100 ++++++ .../src/main/webapp/img/icons/gridEnabled.svg | 130 ++++++++ 56 files changed, 1508 insertions(+), 1160 deletions(-) create mode 100644 Kieker.WebGUI/src/main/resources/lang/AnalysisEditorPage_de.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/AnalysisEditorPage_en.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/Common_de.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/Common_en.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/ControllerPage_de.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/ControllerPage_en.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties create mode 100644 Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties delete mode 100644 Kieker.WebGUI/src/main/resources/messages_de.properties delete mode 100644 Kieker.WebGUI/src/main/resources/messages_en.properties delete mode 100644 Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml create mode 100644 Kieker.WebGUI/src/main/webapp/AnalysisEditorPage.xhtml rename Kieker.WebGUI/src/main/webapp/{CockpitEditor.xhtml => CockpitEditorPage.xhtml} (96%) rename Kieker.WebGUI/src/main/webapp/{Cockpit.xhtml => CockpitPage.xhtml} (95%) delete mode 100644 Kieker.WebGUI/src/main/webapp/Controller.xhtml create mode 100644 Kieker.WebGUI/src/main/webapp/ControllerPage.xhtml delete mode 100644 Kieker.WebGUI/src/main/webapp/Login.xhtml create mode 100644 Kieker.WebGUI/src/main/webapp/LoginPage.xhtml delete mode 100644 Kieker.WebGUI/src/main/webapp/ProjectOverview.xhtml create mode 100644 Kieker.WebGUI/src/main/webapp/ProjectOverviewPage.xhtml rename Kieker.WebGUI/src/main/webapp/css/{AnalysisEditor.css => AnalysisEditorPage.css} (100%) rename Kieker.WebGUI/src/main/webapp/css/{CockpitEditor.css => CockpitEditorPage.css} (100%) rename Kieker.WebGUI/src/main/webapp/css/{Cockpit.css => CockpitPage.css} (100%) rename Kieker.WebGUI/src/main/webapp/css/{Controller.css => ControllerPage.css} (100%) create mode 100644 Kieker.WebGUI/src/main/webapp/css/Icons.css rename Kieker.WebGUI/src/main/webapp/css/{Login.css => LoginPage.css} (85%) rename Kieker.WebGUI/src/main/webapp/css/{ProjectOverview.css => ProjectOverviewPage.css} (100%) rename Kieker.WebGUI/src/main/webapp/dialogs/{manageLibrariesDialog.xhtml => AnalysisEditorPageDialogs.xhtml} (80%) rename Kieker.WebGUI/src/main/webapp/dialogs/{viewDialogs.xhtml => CockpitEditorPageDialogs.xhtml} (100%) rename Kieker.WebGUI/src/main/webapp/dialogs/{projectDialogs.xhtml => ProjectOverviewPageDialogs.xhtml} (80%) create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Copy.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Delete.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/Edit.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/gridDisabled.svg create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/gridEnabled.svg 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 5c83ea36..3ea423fd 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,12 +17,12 @@ 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; +import javax.faces.context.FacesContext; import kieker.common.logging.Log; import kieker.common.logging.LogFactory; @@ -42,19 +42,28 @@ public final class GlobalPropertiesBean { private static final Log LOG = LogFactory.getLog(GlobalPropertiesBean.class); private static final String PROPERTIES_FILE_GLOBAL = "global.properties"; + private static final String RESOURCE_BUNDLE_NAME = "lang.Common"; 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_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 static final String PROPERTY_MSG_PROJECT_LOADING_EXCEPTION = "msgProjectLoadingException"; + private static final String PROPERTY_MSG_PROJECT_SAVED = "msgProjectSaved"; + private static final String PROPERTY_MSG_PLUGIN_CREATION_EXCEPTION = "msgPluginCreationException"; + private static final String PROPERTY_MSG_REPOSITORY_CREATION_EXCEPTION = "msgRepositoryCreationException"; + private static final String PROPERTY_MSG_LIBRARY_UPLOADED = "msgLibraryUploaded"; + private static final String PROPERTY_MSG_PROJECT_CREATED = "msgProjectCreated"; + private static final String PROPERTY_MSG_PROJECT_SAVING_EXCEPTION = "msgProjectSavingException"; + private static final String PROPERTY_MSG_PROJECT_NOT_EXISTING_EXCEPTION = "msgProjectNotExistingException"; + private static final String PROPERTY_MSG_PROJECT_MODIFIED = "msgProjectModified"; + private static final String PROPERTY_MSG_LIBRARY_EXISTING_EXCEPTION = "msgLibraryExistingException"; + private static final String PROPERTY_MSG_LIBRARY_UPLOADING_EXCEPTION = "msgLibraryUploadingException"; private final Properties globalProperties = new Properties(); @@ -108,26 +117,6 @@ public final class GlobalPropertiesBean { return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_PROJECT_OVERVIEW_PAGE); } - /** - * Delivers the welcome message. - * - * @return The value of the property. - */ - public String getWelcomeMessage(final Locale locale) { - // return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_WELCOME_MESSAGE); - return ResourceBundle.getBundle("messages", locale).getString(GlobalPropertiesBean.PROPERTY_WELCOME_MESSAGE); - } - - /** - * Delivers the short welcome message. - * - * @return The value of the property. - */ - 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); - } - /** * Delivers the name of the cookie for the grid size within the analysis editor. * @@ -164,7 +153,52 @@ public final class GlobalPropertiesBean { return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_ANALYSIS_EDITOR_DEFAULT_GRID_COLOR); } - public String getLanguageCookieName() { - return this.globalProperties.getProperty(GlobalPropertiesBean.PROPERTY_LANGUAGE_COOKIE_NAME); + public String getMsgProjectLoadingException() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_PROJECT_LOADING_EXCEPTION); + } + + public String getMsgProjectSaved() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_PROJECT_SAVED); + } + + public String getMsgPluginCreationException() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_PLUGIN_CREATION_EXCEPTION); + } + + public String getMsgRepositoryCreationException() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_REPOSITORY_CREATION_EXCEPTION); + } + + public String getMsgLibraryUploaded() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_LIBRARY_UPLOADED); + } + + public String getMsgProjectCreated() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_PROJECT_CREATED); + } + + public String getMsgProjectSavingException() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_PROJECT_SAVING_EXCEPTION); + } + + public String getMsgProjectNotExistingException() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_PROJECT_NOT_EXISTING_EXCEPTION); + } + + public String getMsgProjectModified() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_PROJECT_MODIFIED); + } + + public String getMsgLibraryExistingException() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_LIBRARY_EXISTING_EXCEPTION); + } + + public String getMsgLibraryUploadingException() { + return GlobalPropertiesBean.getLocalizedString(GlobalPropertiesBean.PROPERTY_MSG_LIBRARY_UPLOADING_EXCEPTION); + } + + private static String getLocalizedString(final String key) { + // Get the correct resource bundle for the current language (taken from the current context) and search it for the given key + return ResourceBundle.getBundle(GlobalPropertiesBean.RESOURCE_BUNDLE_NAME, FacesContext.getCurrentInstance().getELContext().getLocale()).getString(key); } } 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 8141f452..a8234979 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 @@ -19,12 +19,9 @@ package kieker.webgui.beans.session; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.SessionScoped; -import javax.faces.context.FacesContext; import kieker.webgui.beans.application.GlobalPropertiesBean; -import org.primefaces.context.RequestContext; - /** * This bean contains information about the user of this session (like user name and authorization). It provides method to log into the application.<br> * This class is a JSF managed bean with session scope. This means also that it is possible to login the same user multiple times. @@ -36,8 +33,6 @@ import org.primefaces.context.RequestContext; @SessionScoped 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; @@ -109,18 +104,4 @@ public final class UserBean { public void setGlobalPropertiesBean(final GlobalPropertiesBean globalPropertiesBean) { this.globalPropertiesBean = globalPropertiesBean; } - - /** - * 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(FacesContext.getCurrentInstance().getELContext().getLocale()), - this.globalPropertiesBean.getWelcomeMessage(FacesContext.getCurrentInstance().getELContext().getLocale())); - - RequestContext.getCurrentInstance().execute(finalMsg); - } - } - } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java index 6154d015..a86b2db7 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java @@ -53,6 +53,7 @@ import kieker.analysis.plugin.reader.AbstractReaderPlugin; import kieker.analysis.repository.AbstractRepository; import kieker.common.logging.Log; import kieker.common.logging.LogFactory; +import kieker.webgui.beans.application.GlobalPropertiesBean; import kieker.webgui.beans.application.ProjectsBean; import kieker.webgui.beans.session.CurrentConfigurationBean; import kieker.webgui.common.ClassAndMethodContainer; @@ -149,6 +150,9 @@ public final class CurrentAnalysisEditorBean { @ManagedProperty(value = "#{currentConfigurationBean}") private CurrentConfigurationBean currentConfigurationBean; + @ManagedProperty(value = "#{globalPropertiesBean}") + private GlobalPropertiesBean globalPropertiesBean; + /** * Creates a new instance of this class. <b>Do not call this constructor manually. It will only be accessed by JSF.</b> */ @@ -241,11 +245,11 @@ public final class CurrentAnalysisEditorBean { } } catch (final ProjectLoadException ex) { CurrentAnalysisEditorBean.LOG.error("An error occured while loading the project.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured while loading the project."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgProjectLoadingException()); } catch (final NullPointerException ex) { // This exception can occur, when a property has not been initialized CurrentAnalysisEditorBean.LOG.error("An error occured while loading the project.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured while loading the project."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgProjectLoadingException()); } } } @@ -672,7 +676,7 @@ public final class CurrentAnalysisEditorBean { final MIDependency lib; synchronized (this) { this.projectManagerFacade.uploadLibrary(file, this.projectName); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_INFO, "Libary uploaded."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_INFO, this.globalPropertiesBean.getMsgLibraryUploaded()); // As it seem to have worked, we can add the library to our model. lib = this.factory.createDependency(); lib.setFilePath(file.getFileName()); @@ -686,19 +690,19 @@ public final class CurrentAnalysisEditorBean { this.initializeToolPalette(); } catch (final LibraryAlreadyExistingException ex) { CurrentAnalysisEditorBean.LOG.info("A library with the same name exists already.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_WARN, "A library with the same name exists already."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_WARN, this.globalPropertiesBean.getMsgLibraryExistingException()); } catch (final IOException ex) { CurrentAnalysisEditorBean.LOG.error("An error occured while uploading the library.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured while uploading the library."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgLibraryUploadingException()); } catch (final ProjectLoadException ex) { CurrentAnalysisEditorBean.LOG.error("An error occured while uploading the library.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured while uploading the library."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgLibraryUploadingException()); } catch (final ProjectNotExistingException ex) { CurrentAnalysisEditorBean.LOG.error("Project does not exist.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "Project does not exist."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgProjectNotExistingException()); } catch (final LibraryLoadException ex) { CurrentAnalysisEditorBean.LOG.error("An error occured while uploading the library.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured while uploading the library."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgLibraryUploadingException()); } } @@ -763,20 +767,20 @@ public final class CurrentAnalysisEditorBean { synchronized (this) { try { this.projectManagerFacade.saveProject(this.projectName, this.project, this.timeStamp, overwriteNewerProject); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_INFO, "Project saved."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_INFO, this.globalPropertiesBean.getMsgProjectSaved()); // Update the time stamp! this.resetTimeStamp(); } catch (final IOException ex) { CurrentAnalysisEditorBean.LOG.error("An error occured while saving the project.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured while saving the project."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgProjectSavingException()); } catch (final NewerProjectException ex) { CurrentAnalysisEditorBean.LOG.info("The project has been modified externally in the meanwhile.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_WARN, "The project has been modified externally in the meanwhile."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_WARN, this.globalPropertiesBean.getMsgProjectModified()); // Give the user the possibility to force-save the project RequestContext.getCurrentInstance().execute("forceSaveDlg.show()"); } catch (final ProjectNotExistingException ex) { CurrentAnalysisEditorBean.LOG.error("The project does not exist.", ex); - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "The project does not exist."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgProjectNotExistingException()); } } } @@ -894,7 +898,7 @@ public final class CurrentAnalysisEditorBean { } } catch (final NoClassDefFoundError ex) { // This exception can occur if (for example) a class is missing - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured during the creation of the repository. Check the dependencies."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgRepositoryCreationException()); CurrentAnalysisEditorBean.LOG.error("An error occured during the creation of the repository. Check the dependencies.", ex); } } @@ -935,7 +939,7 @@ public final class CurrentAnalysisEditorBean { } } catch (final NoClassDefFoundError ex) { // This exception can occur if (for example) a class is missing - CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, "An error occured during the creation of the plugin. Check the dependencies."); + CurrentAnalysisEditorBean.showMessage(FacesMessage.SEVERITY_ERROR, this.globalPropertiesBean.getMsgPluginCreationException()); CurrentAnalysisEditorBean.LOG.error("An error occured during the creation of the plugin. Check the dependencies.", ex); } } @@ -1190,6 +1194,14 @@ public final class CurrentAnalysisEditorBean { } } + public GlobalPropertiesBean getGlobalPropertiesBean() { + return this.globalPropertiesBean; + } + + public void setGlobalPropertiesBean(final GlobalPropertiesBean globalPropertiesBean) { + this.globalPropertiesBean = globalPropertiesBean; + } + /** * This method should be delivered if an edge between two plugins has been created. * diff --git a/Kieker.WebGUI/src/main/resources/global.properties b/Kieker.WebGUI/src/main/resources/global.properties index 915ffb4c..8733db72 100644 --- a/Kieker.WebGUI/src/main/resources/global.properties +++ b/Kieker.WebGUI/src/main/resources/global.properties @@ -22,4 +22,4 @@ kieker.webgui.config.analysisEditor.defaultGridColor = 0080FF # #------------------------------------------------------------------------------ -kieker.webgui.page.projectOverview = ProjectOverview.xhtml?faces-redirect=true +kieker.webgui.page.projectOverview = ProjectOverviewPage.xhtml?faces-redirect=true diff --git a/Kieker.WebGUI/src/main/resources/lang/AnalysisEditorPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/AnalysisEditorPage_de.properties new file mode 100644 index 00000000..04c380d0 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/AnalysisEditorPage_de.properties @@ -0,0 +1,50 @@ +#------------------------------------------------------------------------------ +# +# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., +# welche innerhalb der Seite des Analyseeditors benutzt werden. +# +#------------------------------------------------------------------------------ + +manageLibraries = Bibliotheken Verwalten + +graph = Graph +analysisEditorScaleToFit = An Fenstergr\u00f6\u00dfe Anpassen +grid = Gitter +snap = Einrasten +autoLayout = Auto-Layout + +disable = Deaktivieren +enable = Aktivieren + +noPropertiesAvailable = Keine Eigenschaften vorhanden + +name = Name +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]. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/AnalysisEditorPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/AnalysisEditorPage_en.properties new file mode 100644 index 00000000..d0169ee3 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/AnalysisEditorPage_en.properties @@ -0,0 +1,50 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used within +# the analysis editor page. +# +#------------------------------------------------------------------------------ + +manageLibraries = Manage Libraries + +graph = Graph +analysisEditorScaleToFit = Scale To Fit +grid = Grid +snap = Snap +autoLayout = Auto-Layout + +disable = Disable +enable = Enable + +noPropertiesAvailable = No properties available + +name = Name +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]. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties new file mode 100644 index 00000000..c7f54336 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties @@ -0,0 +1,6 @@ +#------------------------------------------------------------------------------ +# +# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., +# welche innerhalb der Seite des Cockpiteditors benutzt werden. +# +#------------------------------------------------------------------------------ \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties new file mode 100644 index 00000000..34776ea9 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties @@ -0,0 +1,6 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used within +# the cockpit editor page. +# +#------------------------------------------------------------------------------ \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties new file mode 100644 index 00000000..2e3d90c2 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties @@ -0,0 +1,6 @@ +#------------------------------------------------------------------------------ +# +# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., +# welche innerhalb des Cockpits benutzt werden. +# +#------------------------------------------------------------------------------ \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties new file mode 100644 index 00000000..0836a7cf --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties @@ -0,0 +1,6 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used within +# the cockpit page. +# +#------------------------------------------------------------------------------ \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/Common_de.properties b/Kieker.WebGUI/src/main/resources/lang/Common_de.properties new file mode 100644 index 00000000..5c3f7d72 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/Common_de.properties @@ -0,0 +1,64 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used +# commonly. +# +#------------------------------------------------------------------------------ + +yes = Ja +ok = Ok +cancel = Abbrechen + +choose = Durchsuchen + +file = Datei +settings = Einstellungen + +help = Hilfe +userGuide = User Guide +about = \u00dcber... + +analysisEditor = Analyse Editor +analysis = Analyse +analysisController = Analyse Controller +cockpitEditor = Cockpit Editor +cockpit = Cockpit + +saveProject = Projekt Speichern +saveProjectAs = Projekt Speichern Unter +reloadProject = Projekt Neu Laden +closeProject = Projekt schlie\u00dfen + +#------------------------------------------------------------------------------ +# +# 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 + +#------------------------------------------------------------------------------ +# +# The following are error, exception and log messages. +# +#------------------------------------------------------------------------------ + +msgProjectLoadingException = Beim Laden des Projekts ist ein Fehler aufgetreten. Bitte überprüfen Sie den Log für weitere Details. +msgProjectSaved = Das Projekt wurde erfolgreich gespeichert. +msgPluginCreationException = Beim Erzeugen des Plugins ist ein Fehler aufgetreten. Bitte überprüfen Sie die Abhängigkeiten und den Log für weitere Details. +msgRepositoryCreationException = Beim Erzeugen des Repositories ist ein Fehler aufgetreten. Bitte überprüfen Sie die Abhängigkeiten und den Log für weitere Details. +msgLibraryUploaded = Die Bibliothek wurde erfolgreich hochgeladen. +msgProjectCreated = Das Projekt wurde erfolgreich erstellt. +msgProjectSavingException = Beim Speichern des Projekts ist ein Fehler aufgetreten. Bitte überprüfen Sie den Log für weitere Details. +msgProjectNotExistingException = Das aktuelle Projekt existiert nicht. +msgProjectModified = Das Projekt wurde in der Zwischenzeit au\u00dferhalb dieses Editors modifiziert. +msgLibraryExistingException = Eine Bibliothek mit dem gleichen Namen existiert bereits. +msgLibraryUploadingException = Beim Hochladen der Bibliothek ist ein Fehler aufgetreten. Bitte überprüfen Sie den Log für weitere Details. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/Common_en.properties b/Kieker.WebGUI/src/main/resources/lang/Common_en.properties new file mode 100644 index 00000000..611958bc --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/Common_en.properties @@ -0,0 +1,64 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used +# commonly. +# +#------------------------------------------------------------------------------ + +yes = Yes +ok = Ok +cancel = Cancel + +choose = Choose + +file = File +settings = Settings + +help = Help +userGuide = User Guide +about = About... + +analysisEditor = Analysis Editor +analysis = Analysis +analysisController = Analysis Controller +cockpitEditor = Cockpit Editor +cockpit = Cockpit + +saveProject = Save Project +saveProjectAs = Save Project As +reloadProject = Reload Project +closeProject = Close Project + +#------------------------------------------------------------------------------ +# +# 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 + +#------------------------------------------------------------------------------ +# +# The following are error, exception and log messages. +# +#------------------------------------------------------------------------------ + +msgProjectLoadingException = An error occured during the load process of the project. Please check the log for further details. +msgProjectSaved = The project has been saved successfully. +msgPluginCreationException = An error occured during the creation of the plugin. Please check the dependencies and the log for further details. +msgRepositoryCreationException = An error occured during the creation of the repository. Please check the dependencies and the log for further details. +msgLibraryUploaded = The libary has been uploaded successfully. +msgProjectCreated = The project has been created successfully. +msgProjectSavingException = An error occured while saving the project. +msgProjectNotExistingException = The project does not exist. +msgProjectModified = The project has been modified externally in the meanwhile. +msgLibraryExistingException = A library with the same name exists already. +msgLibraryUploadingException = "An error occured while uploading the library. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/ControllerPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/ControllerPage_de.properties new file mode 100644 index 00000000..1fbc8559 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/ControllerPage_de.properties @@ -0,0 +1,16 @@ +#------------------------------------------------------------------------------ +# +# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., +# welche innerhalb der Seite für die Analysesteuerung benutzt werden. +# +#------------------------------------------------------------------------------ + +analysisControllerInstantiateAnalysisController = Analyse Instanziieren +analysisControllerCleaAnalysisController = Analyse Bereinigen +analysisControllerStartAnalysis = Analyse Starten +analysisControllerStopAnalysis = Analyse Stoppen + +analysisControllerMsgNotInstantiated = Zeigt an, dass der AnalysisController noch nicht instanziiert wurde. +analysisControllerMsgReady = Zeigt an, dass der AnalysisController zwar instanziiert, jedoch noch nicht gestartet wurde. +analysisControllerMsgRunning = Zeigt an, dass der AnalysisController gestartet wurde und zur Zeit läuft. +analysisControllerMsgFailed = Zeigt an, dass der AnalysisController terminiert oder abgestürzt ist. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/ControllerPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/ControllerPage_en.properties new file mode 100644 index 00000000..589350fa --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/ControllerPage_en.properties @@ -0,0 +1,16 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used within +# the analysis controller page. +# +#------------------------------------------------------------------------------ + +analysisControllerInstantiateAnalysisController = Instantiate Analysis +analysisControllerCleaAnalysisController = Clean Analysis +analysisControllerStartAnalysis = Start Analysis +analysisControllerStopAnalysis = Stop Analysis + +analysisControllerMsgNotInstantiated = Indicates that the AnalysisController has not been instantiated yet. +analysisControllerMsgReady = Indicates that the AnalysisController has been instantiated, but not yet started. +analysisControllerMsgRunning = Indicates that the AnalysisController has been started and is running. +analysisControllerMsgFailed = Indicates that the AnalysisController has been terminated or has failed. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties new file mode 100644 index 00000000..09a1715f --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties @@ -0,0 +1,16 @@ +#------------------------------------------------------------------------------ +# +# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., +# welche innerhalb der Anmeldeseite benutzt werden. +# +#------------------------------------------------------------------------------ + +msgWelcomeShort = Willkommen bei der Kieker.WebGUI +msgWelcome = Dies ist eine fr\u00fche Beta 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 + +hint = Hinweis: Die Kieker.WebGUI benötigt Cookies und JavaScript, um korrekt zu funktionieren. Bitte stellen Sie sicher, dass beides aktiviert ist. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties new file mode 100644 index 00000000..31473261 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties @@ -0,0 +1,16 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used within +# the login page. +# +#------------------------------------------------------------------------------ + +msgWelcomeShort = Welcome to the Kieker.WebGUI +msgWelcome = This is an early beta 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 + +hint = Hint: The Kieker.WebGUI requires Cookies and JavaScript in order to work correctly. Please make sure that both is enabled. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties new file mode 100644 index 00000000..dd9d1586 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties @@ -0,0 +1,24 @@ +#------------------------------------------------------------------------------ +# +# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., +# welche innerhalb der Projektübersichtsseite benutzt werden. +# +#------------------------------------------------------------------------------ + +newProject = Neues Projekt +importProject = Projekt Importieren +refreshProjectsList = Projektliste Aktualisieren + +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? \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties new file mode 100644 index 00000000..7e12607f --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties @@ -0,0 +1,24 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used within +# the project overview page. +# +#------------------------------------------------------------------------------ + +newProject = New Project +importProject = Import Project +refreshProjectsList = Refresh Projects List + +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? \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/messages_de.properties b/Kieker.WebGUI/src/main/resources/messages_de.properties deleted file mode 100644 index fa6d9e46..00000000 --- a/Kieker.WebGUI/src/main/resources/messages_de.properties +++ /dev/null @@ -1,158 +0,0 @@ -#------------------------------------------------------------------------------ -# -# These are the messages which are commonly used within all pages. -# -#------------------------------------------------------------------------------ - -yes=Ja -ok=Ok -cancel=Abbrechen - -choose=Durchsuchen - -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. -# -#------------------------------------------------------------------------------ - -analysisControllerInstantiateAnalysisController = Analyse Instanziieren -analysisControllerCleaAnalysisController = Analyse Bereinigen -analysisControllerStartAnalysis = Analyse Starten -analysisControllerStopAnalysis = Analyse Stoppen - -analysisControllerMsgNotInstantiated = Zeigt an, dass der AnalysisController noch nicht instanziiert wurde. -analysisControllerMsgReady = Zeigt an, dass der AnalysisController zwar instanziiert, jedoch noch nicht gestartet wurde. -analysisControllerMsgRunning = Zeigt an, dass der AnalysisController gestartet wurde und zur Zeit läuft. -analysisControllerMsgFailed = Zeigt an, dass der AnalysisController terminiert oder abgestürzt ist. - -#------------------------------------------------------------------------------ -# -# 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 deleted file mode 100644 index d1c6a90e..00000000 --- a/Kieker.WebGUI/src/main/resources/messages_en.properties +++ /dev/null @@ -1,158 +0,0 @@ -#------------------------------------------------------------------------------ -# -# These are the messages which are commonly used within all pages. -# -#------------------------------------------------------------------------------ - -yes=Yes -ok=Ok -cancel=Cancel - -choose=Choose - -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 -analysisEditorScaleToFit=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. -# -#------------------------------------------------------------------------------ - -analysisControllerInstantiateAnalysisController = Instantiate Analysis -analysisControllerCleaAnalysisController = Clean Analysis -analysisControllerStartAnalysis = Start Analysis -analysisControllerStopAnalysis = Stop Analysis - -analysisControllerMsgNotInstantiated = Indicates that the AnalysisController has not been instantiated yet. -analysisControllerMsgReady = Indicates that the AnalysisController has been instantiated, but not yet started. -analysisControllerMsgRunning = Indicates that the AnalysisController has been started and is running. -analysisControllerMsgFailed = 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 deleted file mode 100644 index cc3978dd..00000000 --- a/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml +++ /dev/null @@ -1,295 +0,0 @@ -<?xml version='1.0' encoding='UTF-8' ?> -<!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:ui="http://java.sun.com/jsf/facelets" - xmlns:f="http://java.sun.com/jsf/core" - xmlns:p="http://primefaces.org/ui"> - - <!-- The following part makes sure that the assigned parameter will be used to load the project. --> - <f:metadata> - <f:viewParam id="projectNameParam" name="projectName" value="#{currentAnalysisEditorBean.projectName}"/> - <f:event type="preRenderView" listener="#{currentAnalysisEditorBean.initialize()}" /> - </f:metadata> - - <f:view> - <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> - - <script> - nodeClickListener = function(node, info, e) { - nodeClickCommand([{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}]); - } - - 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> - - <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-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="#{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-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="#{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> - <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 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="#{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="#{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.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.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.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="#{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"/> - - <!-- Include the dialog for the configuration. --> - <ui:include src="dialogs/settingsDialog.xhtml"/> - - <!-- Include the about-dialog. --> - <ui:include src="dialogs/aboutDialog.xhtml" /> - - <!-- Include the dialog the manage the libraries. --> - <ui:include src="dialogs/manageLibrariesDialog.xhtml" /> - - </h:body> - </f:view> -</html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/AnalysisEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/AnalysisEditorPage.xhtml new file mode 100644 index 00000000..f9c018c6 --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/AnalysisEditorPage.xhtml @@ -0,0 +1,302 @@ +<?xml version='1.0' encoding='UTF-8' ?> +<!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:ui="http://java.sun.com/jsf/facelets" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:p="http://primefaces.org/ui"> + + <!-- The following part makes sure that the assigned parameter will be used to load the project. --> + <f:metadata> + <f:viewParam id="projectNameParam" name="projectName" value="#{currentAnalysisEditorBean.projectName}"/> + <f:event type="preRenderView" listener="#{currentAnalysisEditorBean.initialize()}" /> + </f:metadata> + + <f:loadBundle var="localizedMessages" basename="lang.Common"/> + <f:loadBundle var="localizedAnalysisEditorPageMessages" basename="lang.AnalysisEditorPage"/> + + <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/Icons.css" /> + <link rel="stylesheet" type="text/css" href="../css/AnalysisEditorPage.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> + + <script> + nodeClickListener = function(node, info, e) { + nodeClickCommand([{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}]); + } + + 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> + + <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="ProjectOverviewPage.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="ControllerPage.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="#{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=" #{localizedAnalysisEditorPageMessages.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="ProjectOverviewPage.xhtml?faces-redirect=true" ajax="false"/> + </p:submenu> + + <p:submenu label="Graph"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-scaleToFitSmall" value=" #{localizedAnalysisEditorPageMessages.analysisEditorScaleToFit}" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" /> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabledSmall' : 'ui-icon-gridDisabledSmall'}" value=" #{localizedAnalysisEditorPageMessages.grid} #{currentAnalysisEditorGraphBean.gridEnabled ? localizedAnalysisEditorPageMessages.disable : localizedAnalysisEditorPageMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/> + <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabledSmall' : 'ui-icon-snapDisabledSmall'}" value=" #{localizedAnalysisEditorPageMessages.snap} #{currentAnalysisEditorGraphBean.snapEnabled ? localizedAnalysisEditorPageMessages.disable: localizedAnalysisEditorPageMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-autoLayoutSmall" value=" #{localizedAnalysisEditorPageMessages.autoLayout}" 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 element-with-whitespace" icon="ui-icon-logout" value=" #{userBean.userName}" ajax="true" url="login"/> + </p:menubar> + <p:spacer height="5"/> + <p:menubar> + <p:menuitem id="btnScaleToFit" styleClass="element-with-whitespace" icon="ui-icon-scaleToFit" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}"/> + <p:menuitem id="btnGrid" styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabled' : 'ui-icon-gridDisabled'}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/> + <p:menuitem id="btnSnap" styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabled' : 'ui-icon-snapDisabled'}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/> + <p:menuitem id="btnAutoLayout" styleClass="element-with-whitespace" icon="ui-icon-autoLayout" ajax="true" /> + </p:menubar> + <p:tooltip for="btnScaleToFit" value="#{localizedAnalysisEditorPageMessages.analysisEditorScaleToFit}"/> + <p:tooltip for="btnGrid" value="#{localizedAnalysisEditorPageMessages.grid}"/> + <p:tooltip for="btnSnap" value="#{localizedAnalysisEditorPageMessages.snap}"/> + <p:tooltip for="btnAutoLayout" value="#{localizedAnalysisEditorPageMessages.autoLayout}"/> + </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 component presenting the available properties. --> + <p:layoutUnit style="font-size: 12px" position="south" size="150" header="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.className}" rendered="#{rowIndex == 0}"/> + <h:outputText id="nameProperty" value="#{localizedAnalysisEditorPageMessages.name}" rendered="#{rowIndex == 1}"/> + <h:outputText id="normalProperty" value="#{property.name}" rendered="#{rowIndex > 1}"/> + <p:tooltip for="classNameProperty" value="#{localizedAnalysisEditorPageMessages.tooltipClassName}" rendered="#{rowIndex == 0}"/> + <p:tooltip for="nameProperty" value="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.tooltipClassName}" rendered="#{rowIndex == 0}"/> + <p:tooltip for="nameEditor" value="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.availablePlugins}" resizable="true" collapsible="true"> + <h:form id="toolpalette"> + <p:accordionPanel multiple="true" activeIndex="0,1,2"> + <p:tab title="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> + <br/> + <h:outputText value="#{currentAnalysisEditorBean.getDependencies(reader)}"/> + </ui:fragment> + </p:tooltip> + </ui:repeat> + </p:tab> + <p:tab title="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> + <br/> + <h:outputText value="#{currentAnalysisEditorBean.getDependencies(filter)}"/> + </ui:fragment> + </p:tooltip> + </ui:repeat> + </p:tab> + <p:tab title="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedAnalysisEditorPageMessages.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="#{localizedMessages.saveProject}" resizable="false" modal="true" widgetVar="forceSaveDlg"> + <h:form> + <div style="text-align: center"> + <h:outputText value="#{localizedAnalysisEditorPageMessages.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"/> + + <!-- Include the dialog for the configuration. --> + <ui:include src="dialogs/SettingsDialog.xhtml"/> + + <!-- Include the about-dialog. --> + <ui:include src="dialogs/AboutDialog.xhtml" /> + + <!-- Include the dialog the manage the libraries. --> + <ui:include src="dialogs/AnalysisEditorPageDialogs.xhtml" /> + + </h:body> + +</html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/CockpitEditor.xhtml b/Kieker.WebGUI/src/main/webapp/CockpitEditorPage.xhtml similarity index 96% rename from Kieker.WebGUI/src/main/webapp/CockpitEditor.xhtml rename to Kieker.WebGUI/src/main/webapp/CockpitEditorPage.xhtml index d79976f5..b6e59eba 100644 --- a/Kieker.WebGUI/src/main/webapp/CockpitEditor.xhtml +++ b/Kieker.WebGUI/src/main/webapp/CockpitEditorPage.xhtml @@ -12,10 +12,13 @@ <f:event type="preRenderView" listener="#{currentCockpitEditorBean.initalize()}" /> </f:metadata> + <f:loadBundle var="localizedMessages" basename="lang.Common"/> + <f:loadBundle var="localizedCockpitEditorPageMessages" basename="lang.CockpitEditorPage"/> + <h:head> <title>Kieker.WebGUI</title> <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/CockpitEditor.css" /> + <link rel="stylesheet" type="text/css" href="../css/CockpitEditorPage.css" /> </h:head> <h:body> @@ -145,12 +148,12 @@ <p:growl id="messages" life="1500" showDetail="true" autoUpdate="false" sticky="true"/> <!-- Include the dialog for the configuration. --> - <ui:include src="dialogs/settingsDialog.xhtml" /> + <ui:include src="dialogs/SettingsDialog.xhtml" /> <!-- Include the dialogs for the views. --> - <ui:include src="dialogs/viewDialogs.xhtml" /> + <ui:include src="dialogs/CockpitEditorPageDialogs.xhtml" /> <!-- Include the about-dialog. --> - <ui:include src="dialogs/aboutDialog.xhtml" /> + <ui:include src="dialogs/AboutDialog.xhtml" /> </h:body> </html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml b/Kieker.WebGUI/src/main/webapp/CockpitPage.xhtml similarity index 95% rename from Kieker.WebGUI/src/main/webapp/Cockpit.xhtml rename to Kieker.WebGUI/src/main/webapp/CockpitPage.xhtml index f0472a9d..87be9c1a 100644 --- a/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml +++ b/Kieker.WebGUI/src/main/webapp/CockpitPage.xhtml @@ -12,10 +12,13 @@ <f:event type="preRenderView" listener="#{currentCockpitBean.initalize()}" /> </f:metadata> + <f:loadBundle var="localizedMessages" basename="lang.Common"/> + <f:loadBundle var="localizedCockpitPageMessages" basename="lang.CockpitPage"/> + <h:head> <title>Kieker.WebGUI</title> <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/Cockpit.css" /> + <link rel="stylesheet" type="text/css" href="../css/CockpitPage.css" /> </h:head> <h:body> @@ -100,10 +103,10 @@ <p:growl id="messages" life="1500" showDetail="true" autoUpdate="false" sticky="true"/> <!-- Include the dialog for the configuration. --> - <ui:include src="dialogs/settingsDialog.xhtml" /> + <ui:include src="dialogs/SettingsDialog.xhtml" /> <!-- Include the about-dialog. --> - <ui:include src="dialogs/aboutDialog.xhtml" /> + <ui:include src="dialogs/AboutDialog.xhtml" /> </h:body> </html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/Controller.xhtml b/Kieker.WebGUI/src/main/webapp/Controller.xhtml deleted file mode 100644 index 2aea82f2..00000000 --- a/Kieker.WebGUI/src/main/webapp/Controller.xhtml +++ /dev/null @@ -1,123 +0,0 @@ -<?xml version='1.0' encoding='UTF-8' ?> -<!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:ui="http://java.sun.com/jsf/facelets" - xmlns:f="http://java.sun.com/jsf/core" - xmlns:p="http://primefaces.org/ui" - xmlns:c="http://java.sun.com/jsp/jstl/core"> - - <f:metadata> - <f:viewParam name="projectName" value="#{currentControllerBean.projectName}"/> - </f:metadata> - - <f:view> - <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="#{localizedMessages.analysisControllerInstantiateAnalysisController}" action="#{currentControllerBean.instantiateAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> - <p:commandButton value="#{localizedMessages.analysisControllerCleaAnalysisController}" action="#{currentControllerBean.cleanAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> - <p:commandButton value="#{localizedMessages.analysisControllerStartAnalysis}" action="#{currentControllerBean.startAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> - <p:commandButton value="#{localizedMessages.analysisControllerStopAnalysis}" 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="#{localizedMessages.analysisControllerMsgNotInstantiated}"/> - <p:tooltip for="iconLEDYellow" value="#{localizedMessages.analysisControllerMsgReady}"/> - <p:tooltip for="iconLEDGreen" value="#{localizedMessages.analysisControllerMsgRunning}"/> - <p:tooltip for="iconLEDRed2" value="#{localizedMessages.analysisControllerMsgFailed}"/> - <p:tooltip for="iconLEDRed1_2" value="#{localizedMessages.analysisControllerMsgNotInstantiated}"/> - <p:tooltip for="iconLEDYellow_2" value="#{localizedMessages.analysisControllerMsgReady}"/> - <p:tooltip for="iconLEDGreen_2" value="#{localizedMessages.analysisControllerMsgRunning}"/> - <p:tooltip for="iconLEDRed2_2" value="#{localizedMessages.analysisControllerMsgFailed}"/> - </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/ControllerPage.xhtml b/Kieker.WebGUI/src/main/webapp/ControllerPage.xhtml new file mode 100644 index 00000000..ac4df2f6 --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/ControllerPage.xhtml @@ -0,0 +1,125 @@ +<?xml version='1.0' encoding='UTF-8' ?> +<!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:ui="http://java.sun.com/jsf/facelets" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:p="http://primefaces.org/ui"> + + <f:metadata> + <f:viewParam name="projectName" value="#{currentControllerBean.projectName}"/> + </f:metadata> + + <f:loadBundle var="localizedMessages" basename="lang.Common"/> + <f:loadBundle var="localizedControllerPageMessages" basename="lang.ControllerPage"/> + + <h:head> + <title>Kieker.WebGUI</title> + <link rel="stylesheet" type="text/css" href="../css/Common.css" /> + <link rel="stylesheet" type="text/css" href="../css/Icons.css" /> + <link rel="stylesheet" type="text/css" href="../css/ControllerPage.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="ProjectOverviewPage.xhtml?faces-redirect=true" /> + <p:separator/> + <p:button styleClass="perspective-button" icon="ui-icon-analysisEditor" value="#{localizedMessages.analysisEditor}" style="white-space: none" outcome="AnalysisEditorPage.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="ProjectOverviewPage.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="#{localizedControllerPageMessages.analysisControllerInstantiateAnalysisController}" action="#{currentControllerBean.instantiateAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="#{localizedControllerPageMessages.analysisControllerCleaAnalysisController}" action="#{currentControllerBean.cleanAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="#{localizedControllerPageMessages.analysisControllerStartAnalysis}" action="#{currentControllerBean.startAnalysis()}" update=":messages :logList" disabled="#{empty currentControllerBean.projectName}"/> + <p:commandButton value="#{localizedControllerPageMessages.analysisControllerStopAnalysis}" 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="#{localizedControllerPageMessages.analysisControllerMsgNotInstantiated}"/> + <p:tooltip for="iconLEDYellow" value="#{localizedControllerPageMessages.analysisControllerMsgReady}"/> + <p:tooltip for="iconLEDGreen" value="#{localizedControllerPageMessages.analysisControllerMsgRunning}"/> + <p:tooltip for="iconLEDRed2" value="#{localizedControllerPageMessages.analysisControllerMsgFailed}"/> + <p:tooltip for="iconLEDRed1_2" value="#{localizedControllerPageMessages.analysisControllerMsgNotInstantiated}"/> + <p:tooltip for="iconLEDYellow_2" value="#{localizedControllerPageMessages.analysisControllerMsgReady}"/> + <p:tooltip for="iconLEDGreen_2" value="#{localizedControllerPageMessages.analysisControllerMsgRunning}"/> + <p:tooltip for="iconLEDRed2_2" value="#{localizedControllerPageMessages.analysisControllerMsgFailed}"/> + </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> + +</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 deleted file mode 100644 index 567d2d51..00000000 --- a/Kieker.WebGUI/src/main/webapp/Login.xhtml +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version='1.0' encoding='UTF-8' ?> -<!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:f="http://java.sun.com/jsf/core"> - - <f:view> - <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="#{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="#{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> - </h:body> - </f:view> -</html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml b/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml new file mode 100644 index 00000000..654ffa44 --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml @@ -0,0 +1,56 @@ +<?xml version='1.0' encoding='UTF-8' ?> +<!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:f="http://java.sun.com/jsf/core"> + + <!-- Load the localized messages, labels etc. for the login page. --> + <f:loadBundle var="localizedMessages" basename="lang.Common"/> + <f:loadBundle var="localizedLoginMessages" basename="lang.LoginPage"/> + + <h:head> + <title>Kieker.WebGUI</title> + <link rel="stylesheet" type="text/css" href="../css/Common.css" /> + <link rel="stylesheet" type="text/css" href="../css/LoginPage.css" /> + </h:head> + + <!-- The javascript code in the onload-part of the body shows a localized welcome message via the growl-component. --> + <h:body onload="growlComp.renderMessage({summary : '#{localizedLoginMessages.msgWelcomeShort}', detail : '#{localizedLoginMessages.msgWelcome}', severity: 'info'});"> + + <div align="center" > + <img src="../img/kieker-header.jpg"/> + </div> + + <div align="center" class="stretch"> + <p:spacer width="0" height="120"/> + + <h:form> + <div class="stretch" align="center"> + <p:panel header="#{localizedLoginMessages.msgWelcomeShort}" styleClass="login-panel"> + <h:panelGrid columnClasses="col1 , col2" styleClass="grid" columns="2" cellpadding="5" > + <h:outputLabel for="username" value="#{localizedLoginMessages.username}:" /> + <p:inputText styleClass="input" id="username" required="true" value="#{userBean.userName}" label="username"/> + + <h:outputLabel for="password" value="#{localizedLoginMessages.password}:" /> + <p:password styleClass="input" id="password" required="false" value="#{userBean.password}" label="password" /> + </h:panelGrid> + <hr/> + <div align="right"> + <p:commandButton value="#{localizedLoginMessages.login}" ajax="false" action="#{userBean.login}" /> + </div> + </p:panel> + + <p:spacer width="0" height="40"/> + + <div class="hint-panel"> + <h:outputText value="#{localizedLoginMessages.hint}"/> + </div> + + <p:growl sticky="true" autoUpdate="true" widgetVar="growlComp"/> + </div> + </h:form> + </div> + </h:body> + +</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 deleted file mode 100644 index 7bfc480f..00000000 --- a/Kieker.WebGUI/src/main/webapp/ProjectOverview.xhtml +++ /dev/null @@ -1,114 +0,0 @@ -<?xml version='1.0' encoding='UTF-8' ?> -<!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:ui="http://java.sun.com/jsf/facelets" - xmlns:p="http://primefaces.org/ui" - xmlns:f="http://java.sun.com/jsf/core"> - - <f:view> - <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: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> - - <!-- 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/ProjectOverviewPage.xhtml b/Kieker.WebGUI/src/main/webapp/ProjectOverviewPage.xhtml new file mode 100644 index 00000000..d92e1bfa --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/ProjectOverviewPage.xhtml @@ -0,0 +1,116 @@ +<?xml version='1.0' encoding='UTF-8' ?> +<!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:ui="http://java.sun.com/jsf/facelets" + xmlns:p="http://primefaces.org/ui" + xmlns:f="http://java.sun.com/jsf/core"> + + <f:loadBundle var="localizedMessages" basename="lang.Common"/> + <f:loadBundle var="localizedProjectOverviewMessages" basename="lang.ProjectOverviewPage"/> + + <h:head> + <title>Kieker.WebGUI</title> + <link rel="stylesheet" type="text/css" href="../css/Common.css" /> + <link rel="stylesheet" type="text/css" href="../css/Icons.css" /> + <link rel="stylesheet" type="text/css" href="../css/ProjectOverviewPage.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" /> + <p:separator/> + <p:button styleClass="perspective-button" icon="ui-icon-analysisEditor" value="#{localizedMessages.analysisEditor}" style="white-space: none" outcome="AnalysisEditorPage.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="ControllerPage.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=" #{localizedProjectOverviewMessages.newProject}" onclick="newProjectDialog.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-importProject" value=" #{localizedProjectOverviewMessages.importProject}" ajax="true" disabled="true"/> + <p:separator/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value=" #{localizedProjectOverviewMessages.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: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> + + <!-- 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="#{localizedProjectOverviewMessages.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-analysisEditor" id="openButton" value=" #{localizedMessages.analysisEditor}" styleClass="element-with-whitespace" ajax="false" url="analysisEditor?projectName=#{project}"/> + <p:menuitem icon="ui-icon-analysis" id="controlAnalysis" styleClass="element-with-whitespace" value=" #{localizedMessages.analysis}" ajax="false" url="controller?projectName=#{project}" /> + <p:separator/> + + <p:menuitem icon="ui-icon-cockpitEditor" id="editAnalysisViews" styleClass="element-with-whitespace" value=" #{localizedMessages.cockpitEditor}" ajax="false" disabled="true" /> + <p:menuitem icon="ui-icon-cockpit" 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=" #{localizedProjectOverviewMessages.copyProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="copyProjectDialog.show()"/> + <p:menuitem id="renameButton" icon="ui-icon-edit" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.renameProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="renameProjectDialog.show()" disabled="true"/> + <p:menuitem id="deleteButton" icon="ui-icon-delete" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.deleteProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="deleteProjectDialog.show()" disabled="true"/> + </p:menu> + </p:column> + <p:column headerText="#{localizedProjectOverviewMessages.state}" style="text-align: center" sortBy="#{projectsBean.getAnalysisControllerState(project)}"> + <h:outputText value="#{projectsBean.getAnalysisControllerState(project)}"/> + </p:column> + + <p:column headerText="#{localizedProjectOverviewMessages.lastModification}" sortBy="#{projectsBean.getCurrTimeStamp(project)}" style="text-align: center"> + <h:outputText value="#{projectsBean.getCurrTimeStamp(project)}" /> + </p:column> + + <p:column headerText="#{localizedProjectOverviewMessages.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/ProjectOverviewPageDialogs.xhtml" /> + <!-- Include the dialog for the configuration. --> + <ui:include src="dialogs/SettingsDialog.xhtml" /> + + </h:body> +</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 index 6dfa9de1..47d8e1ab 100644 --- a/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml +++ b/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml @@ -11,11 +11,7 @@ <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> + </locale-config> </application> </faces-config> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml b/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml index 411d2880..4555ca09 100644 --- a/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml +++ b/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml @@ -6,37 +6,37 @@ <url-mapping id="home"> <pattern value="/Kieker.WebGUI/" /> - <view-id value="/faces/ProjectOverview.xhtml" /> + <view-id value="/faces/ProjectOverviewPage.xhtml" /> </url-mapping> <url-mapping id="projectOverview"> <pattern value="/Kieker.WebGUI/projectOverview" /> - <view-id value="/faces/ProjectOverview.xhtml" /> + <view-id value="/faces/ProjectOverviewPage.xhtml" /> </url-mapping> <url-mapping id="analysisEditor"> <pattern value="/Kieker.WebGUI/analysisEditor" /> - <view-id value="/faces/AnalysisEditor.xhtml" /> + <view-id value="/faces/AnalysisEditorPage.xhtml" /> </url-mapping> <url-mapping id="cockpitEditor"> <pattern value="/Kieker.WebGUI/cockpitEditor" /> - <view-id value="/faces/CockpitEditor.xhtml" /> + <view-id value="/faces/CockpitEditorPage.xhtml" /> </url-mapping> <url-mapping id="controller"> <pattern value="/Kieker.WebGUI/controller" /> - <view-id value="/faces/Controller.xhtml" /> + <view-id value="/faces/ControllerPage.xhtml" /> </url-mapping> <url-mapping id="cockpit"> <pattern value="/Kieker.WebGUI/cockpit" /> - <view-id value="/faces/Cockpit.xhtml" /> + <view-id value="/faces/CockpitPage.xhtml" /> </url-mapping> <url-mapping id="login"> <pattern value="/Kieker.WebGUI/login" /> - <view-id value="/faces/Login.xhtml" /> + <view-id value="/faces/LoginPage.xhtml" /> </url-mapping> </pretty-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/AnalysisEditorPage.css similarity index 100% rename from Kieker.WebGUI/src/main/webapp/css/AnalysisEditor.css rename to Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css diff --git a/Kieker.WebGUI/src/main/webapp/css/CockpitEditor.css b/Kieker.WebGUI/src/main/webapp/css/CockpitEditorPage.css similarity index 100% rename from Kieker.WebGUI/src/main/webapp/css/CockpitEditor.css rename to Kieker.WebGUI/src/main/webapp/css/CockpitEditorPage.css diff --git a/Kieker.WebGUI/src/main/webapp/css/Cockpit.css b/Kieker.WebGUI/src/main/webapp/css/CockpitPage.css similarity index 100% rename from Kieker.WebGUI/src/main/webapp/css/Cockpit.css rename to Kieker.WebGUI/src/main/webapp/css/CockpitPage.css diff --git a/Kieker.WebGUI/src/main/webapp/css/Common.css b/Kieker.WebGUI/src/main/webapp/css/Common.css index 614fbdd5..182addb7 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Common.css +++ b/Kieker.WebGUI/src/main/webapp/css/Common.css @@ -75,174 +75,6 @@ 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; -} - .rightAlignedColumn { text-align: right !important; } diff --git a/Kieker.WebGUI/src/main/webapp/css/Controller.css b/Kieker.WebGUI/src/main/webapp/css/ControllerPage.css similarity index 100% rename from Kieker.WebGUI/src/main/webapp/css/Controller.css rename to Kieker.WebGUI/src/main/webapp/css/ControllerPage.css diff --git a/Kieker.WebGUI/src/main/webapp/css/Icons.css b/Kieker.WebGUI/src/main/webapp/css/Icons.css new file mode 100644 index 00000000..9e575ab1 --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/css/Icons.css @@ -0,0 +1,185 @@ +.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; +} + +.ui-icon-copy { + background: url('../img/icons/Copy.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-edit { + background: url('../img/icons/Edit.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-delete { + background: url('../img/icons/Delete.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/LoginPage.css similarity index 85% rename from Kieker.WebGUI/src/main/webapp/css/Login.css rename to Kieker.WebGUI/src/main/webapp/css/LoginPage.css index c45311e1..ad91576c 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Login.css +++ b/Kieker.WebGUI/src/main/webapp/css/LoginPage.css @@ -23,7 +23,13 @@ .login-panel { width: 50%; - text-align: center + text-align: center; +} + +.hint-panel { + width: 50%; + text-align: center; + font-size: 11px; } .ui-growl { @@ -38,12 +44,14 @@ html { height: 100%; } + body { background-color: #f1f1f1; margin: 0; padding: 0; height: 100%; } + div.stretch { background: #ffffff; padding: 0 0 0 0; diff --git a/Kieker.WebGUI/src/main/webapp/css/ProjectOverview.css b/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css similarity index 100% rename from Kieker.WebGUI/src/main/webapp/css/ProjectOverview.css rename to Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/AnalysisEditorPageDialogs.xhtml similarity index 80% rename from Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml rename to Kieker.WebGUI/src/main/webapp/dialogs/AnalysisEditorPageDialogs.xhtml index c2f854dc..1e0a36fe 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/manageLibrariesDialog.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/AnalysisEditorPageDialogs.xhtml @@ -11,16 +11,16 @@ <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="#{localizedMessages.fileName}"> + <p:column headerText="#{localizedAnalysisEditorPageMessages.fileName}"> <h:outputText value="#{dependency}"/> </p:column> - <p:column headerText="#{localizedMessages.fileSize}" style="text-align: center"> + <p:column headerText="#{localizedAnalysisEditorPageMessages.fileSize}" style="text-align: center"> <h:outputText value="N/A [MiByte]"/> </p:column> - <p:column headerText="#{localizedMessages.libOptions}" style="text-align: center; width:40px"> - <p:commandButton id="deleteButton" icon="ui-icon-trash" disabled="true"/> + <p:column headerText="#{localizedAnalysisEditorPageMessages.libOptions}" style="text-align: center; width:40px"> + <p:commandButton id="deleteButton" icon="ui-icon-delete" disabled="true"/> <p:tooltip for="deleteButton" value="Delete Library"/> </p:column> </p:dataTable> @@ -29,7 +29,7 @@ <p:spacer width="0" height="5"/> <div> <!-- This is the form for the uploading. --> - <h:outputText value="#{localizedMessages.msgOnlyJar}" /> + <h:outputText value="#{localizedAnalysisEditorPageMessages.msgOnlyJar}" /> <br /> <br /> <h:form enctype="multipart/form-data"> diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/viewDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/CockpitEditorPageDialogs.xhtml similarity index 100% rename from Kieker.WebGUI/src/main/webapp/dialogs/viewDialogs.xhtml rename to Kieker.WebGUI/src/main/webapp/dialogs/CockpitEditorPageDialogs.xhtml diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/projectDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml similarity index 80% rename from Kieker.WebGUI/src/main/webapp/dialogs/projectDialogs.xhtml rename to Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml index ec56dba0..5325a06e 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/projectDialogs.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml @@ -8,13 +8,13 @@ <!-- ******************************************************************************** --> <!-- This is the dialog to create a new project. --> - <p:dialog id="newProjectDlg" header="#{localizedMessages.newProject}" resizable="false" modal="true" widgetVar="newProjectDialog"> + <p:dialog id="newProjectDlg" header="#{localizedProjectOverviewMessages.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="#{localizedMessages.name}: " /> + <h:outputText value="#{localizedProjectOverviewMessages.name}: " /> <p:inputText id="newProjectInputText" value="#{stringBean.string}" /> </div> @@ -28,13 +28,13 @@ </p:dialog> <!-- ******************************************************************************** --> - <p:dialog id="renameProjectDlg" header="Rename Project" resizable="false" modal="true" widgetVar="renameProjectDialog"> + <p:dialog id="renameProjectDlg" header="#{localizedProjectOverviewMessages.renameProject}" resizable="false" modal="true" widgetVar="renameProjectDialog"> <!-- Make sure that closing of the dialog also clears the input field. --> <p:ajax event="close" update="renameProjectDialogForm:renameProjectInputText" /> <h:form id="renameProjectDialogForm"> <div style="text-align: center"> - <h:outputText value="#{localizedMessages.newName}: " /> + <h:outputText value="#{localizedProjectOverviewMessages.newName}: " /> <p:inputText id="renameProjectInputText" value="#{stringBean.string}" /> </div> @@ -47,11 +47,11 @@ </h:form> </p:dialog> - <p:dialog id="deleteProjectDlg" header="#{localizedMessages.deleteProject}" resizable="false" modal="true" widgetVar="deleteProjectDialog"> + <p:dialog id="deleteProjectDlg" header="#{localizedProjectOverviewMessages.deleteProject}" resizable="false" modal="true" widgetVar="deleteProjectDialog"> <h:form id="deleteProjectDialogForm"> <div style="text-align: center"> - <h:outputText value="#{localizedMessages.msgReallyDeleteProject}" /> + <h:outputText value="#{localizedProjectOverviewMessages.msgReallyDeleteProject}" /> </div> <hr/> @@ -63,13 +63,13 @@ </h:form> </p:dialog> - <p:dialog id="copyProjectDlg" header="#{localizedMessages.copyProject}" resizable="false" modal="true" widgetVar="copyProjectDialog"> + <p:dialog id="copyProjectDlg" header="#{localizedProjectOverviewMessages.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="#{localizedMessages.name}: " /> + <h:outputText value="#{localizedProjectOverviewMessages.name}: " /> <p:inputText id="copyProjectDialogInputText" value="#{stringBean.string}" /> </div> diff --git a/Kieker.WebGUI/src/main/webapp/img/graphIcons/FilterIcon.png b/Kieker.WebGUI/src/main/webapp/img/graphIcons/FilterIcon.png index 203f88308a7399448403f54a6b790b1157bcab82..0e32e20e6f6800d98851c079bd2e970b10be1aef 100644 GIT binary patch literal 14452 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 GLSTaITLq#3 literal 13483 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 Z_J4PhnG`x|L%IL}002ovPDHLkV1k~EFS7su diff --git a/Kieker.WebGUI/src/main/webapp/img/graphIcons/ReaderIcon.png b/Kieker.WebGUI/src/main/webapp/img/graphIcons/ReaderIcon.png index edc3e77837261a986b430e52e1b59c0e2da75584..b24a70575bae221a110a5d92e38356f801d531dc 100644 GIT binary patch literal 12409 zcmV-<Fow^GP)<h;3K|Lk000e1NJLTq003YB003YJ1^@s6;+S_h001yRNkl<Zc-rM% z2Vhji);_a+lWcmY_XGk67K%vkJrrqz*s;B5FVCkwpZq=_wr4>>p9qLNnm_<Sy7Ukr zg(QR|goN~LlFe?m*ZF5=@4b6B2@nwU{l6R6ot-;(_Rjgv`R1H6b1w*f=hwp33#C=H zRecVeI?x-W5CI-QxA`X>ont!}bcpP5UK60H+41TQ{Ckf7b`SQNuNli{$PS!5Fw=xg zOM|0>yGT`1<i_L=+~C0;L_XO!4|rHTVD6eRG%sVW49&{k@4(eifGuDE6YNb4O8kpP zs=1Q(U7G6;3BbU222M)NOa1iD@ppEK>lp_QsRK-I6IeY~_BMHZW%{NV5CH<g$M?yX zn|{Amy_vj=N$E1ISLLZ*NgSV8m+@W3?*hW_2Edfhr-bi3y7RN{cXeMdYThW^Nzn<$ zYQ~}jRRUHZ1t9Xm<i#%XSCqxyFEw6*FLJ&>-{*gi8?+4o8Bho3;B6>^jY&@=HRP<! z`OWF*cLQMB=hM2T97|a}Vc~>(2j4juFOFCYZ53^AiO{bG04*DxM)YRdoA|5qUx72# zX@k@76%@di@x$V;R354P&8^_~1Rx>hNXn{N&(0b&J!v}33!4WLB>7E#d-s*y@Yun} zpz?U74UWV2PzWnjF{)f!jm`dB%i;H%10tX&3<nCpfZ2U!<5{7z*!7T^(yPTpZ}~EJ zoi|%<cI=mmU+^Ob9)T-IuGrxOY$O1zBmiU*0Ia{Y7=BLxdJzD=r2x$AGZQC=B(v)g z3!RoZXT~2G+#Dpo`fE@SZFjWtD1PG56Ht1jln3Bz4gkv^4}d?-8j##O8K#9y^LmsR z0~Yz2!Z&=C`4L~|dkgi)E04o7zdQqFN6Q2YP{*h<tu@v^AOOSyrX@|o6GJAl>mfcr z=0ITDO}=}}SVTv-3Dw}MltK8v-?5WbC-Do%UV!qW<$?tS!~|wqYRrF30H!2O!Q+C* zF+uYH(BO*!fIUJz6<{+8x>gzUgY-X^TAhktIsOV%9IFrj(8L928mk)rfB+B*n$&9& zjM0ptLihf8g$^_#=D=Wog5Lki&$OB}c;n<7P<gCUprEjJ;h7C(x<4QQ!~(|m8jnY4 zMlemMDF+S&mWuFrzajGJRcYLWYMQ1cyn^<%Y2ny8?K%9;>35*&Se0M_Q5~W)Yp-bk zU;vEp0x-7cSUfansF3sFh3*0uE0a2bn&4`=psSag<%u%18Th?3??Ls6YCDMo7yvPy zVl!)stN%a%L=pf-5&)i_HDGkl(J&-%2%{X9it{Gmz)AjCnS#L4kw~krU%pCRR&5r1 zaP9-BIa%Wcpa53Jb!n4XRaEhR3xIe3`EO)0n&NV^F5G7}8Sj@X6kTYai23c_p-T{I zF+eg)465_N$J>s1a#+B~#F2Pl;6SG7E=>NwMFozW*oip+m^JuiJ$X&{G|7O9v!5P8 z_<qN->$35u8J|M^86ECk)!)$8*1cXTli3jPXV7b=4ghVBg|X01oi3NoVYi>{cURx< z&F03!Ro{H@tAe**1;CtnPj|1X&@PLOZ!@k(&mJmGaIg>vNhAm><Wi8!q-+3){uJ^7 zP;b|wHTj?8J~I>1u!Ldwo`8FZh+T+iJ%fM>od<vjp8><XAnfySn0MphcnLQt^IlNX zb4WR-J_mo9^(C0kThM~`kKv*5quE6>X(J>Acpid4qtS{iHis}So7IM^E2|*)e0E-C z<>h4oLGo=whmSXY_VJrHmB{;501O>EYg_lko>Pa67%GX1i3W*8!s!o!zyJlP<T5}K z-%qeHa$l<q<?!~;FF>c!?cly1_d)-F{)}db&?yj%diXN?BcIKvr8RG#6?n_!Gf$TX zUuS;}_6rVpbHq}Z)o&iB8(xWcLGZq8b|+NVHG;+J5XND(TH(ye)A+=ZqXil12cPWR zt^3KW^iwyLN4jYMCQW&CkV>gKIc3⑲u7w#*Sa^$d>@TG!F5D^}XDk^Glr>>o$ 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 literal 9831 zcmV-tCYafYP)<h;3K|Lk000e1NJLTq003YB003YJ1^@s6;+S_h001T~Nkl<Zc-rlq z349gR+5ew2bC=xYCLwzQA?%45P!tsrWNAVB`bMqRT0eb#ySNmBfNSga*0#3(YvSI% z)z)gEtti@R?V|Q?U8-dh2q0jP9kTDaN$$N#?!7bTea@Nf%w!S>LU{lGcK8f)?#$eo zxzG1Jzvnq;&P)jWYdWnHIo%iV&p!PNz-gZT=>hch^>G_0isI?-?@u9w1aVH*mnqR` zbX03=>x87Fq&(c`D5Z4EC!c(>Z^DEL(U~)6($9MS|8D{G_V${;4Gn3ONk>P=Xl7WC z$CHc8G@SEr&P*f{S)ouU*XQ%);<jvk&XFW3O_pVfONhtgG#m~ee(}W@SL5*?S-g00 zeD2)2>SwvmlM0}^x|(>sUJ?uj3Dy{X(Jqs%)>yU~vMd_Y_F4EHBo>PW(7+RLGuqKt zg3AD2Ljf-H^<@Scjv3vH#!W`U`f(0oISIG3vT=Mqv+Fm?{K6>(^b%-mYYVShwQ30- z>$Qao7sf8R<dPGH@R<O-_uhN#my$prkbxgB8$W*h0{k(hs;ai*-05n4O2hagYH%6X zVGsd|t&GPl#$^)jOW2PWz+^Lnvh~cEST1CeVSJaZ#C5!^8<DVD%s#UULiK~O^(RtB zZ-L#rcklYa4}Nf6US8gzMT-{2uD$l!6OyA72Jrgpualmh9vL-q%w?Bdc58Na_AU4$ zy+#eC+H}kxb38wseH7QTO(HPkoW^>`cTd>RLzRylInw;lLl52c{PWNMdF|S@k?XFz zP8m@EufF=K^z_qDr`>heUCZXpn|Cit4hve`O<4_LOT&e2Clo%rZ5Jo>q7%Km0p}X( zJSQ^M*Vp$v_~3&-eD>LAS0jKB0*If`HJ-?qe({TEr6-<v+?$!1dBGcRys;`ZHFY98 z7HT5Jtim|1Su>5YxE}NhWh_O{F*b_p2RjBU8!`ie1PSE<+fIfDG&D3szW@F2Kl0pj z&#fvcDQR7~a%KN5x7;#p89E^VD_7p?S+nMa<kHg8OaAt^zrBFE?~6nt9Ds`f2EcHv zw@HUs7WW<QJ_00HfS(mWU0q!iW5DAmK@33iiWMt*moHyFG5{7WTI_%4oxi2cpFjWK z-+%x8RZMa^J3F~#xVgP^otRm;EsuBGaQAaw!)KXlYipSYJo&3%{c3e_ad9I8h~j+e z0o--h-K45&OW^(Y-^)Y*mm`3mG1)-?yk;4d1zaS<t(KyExXP8Y)*5m&*zt_xh{qOS z+rGmtQcsaj*c%W)6ahSi=_m)VY}vBtZMWSv?4UJl0Jq+HhqQhBw&V{#{ChS6C_?~0 z!4@K5BZeRdss~OJ1~ZJF?br+<7~WN0jt9(8@@Ax=gPqrTzTpC>si|QS!~sm1GNrM+ zygYix9e13109Rjqt^Dr0Z>My1g&2U#F$O%zY7@II<_T<OjTHukNt2Noxk-=PY;4mZ z*gg-nzuR}*_7xjfL&?;!rlUuXG6{NWHBJn`(xpqIciwsDsRwY$C6~!>zx^g_^e_Nd zJX-nWW24991J15Bg;jpmglA=3^7Sghi6;`gtmsQ>U5{&{Oq3uoJ92uDxLz<i|7>JS zMp^U*r)M0?0}ufB00Y31B}<~1lAl@t3l}cJOOU1a-uu4{Ko0YO6)PTiZ1m`Sm_7T< zVYx6^jVpq>MHQ4TToPO&6@^)XARLOH_<EJC*AHU=vmMWhDNYzR0B+^M;>1wbj}0*n z;Mc$Y^~eF3KmT)t)s+uEc!vSVWdO>{|Ld`6RDy4Q^K*P36=er4#&*+AAj!w)-ptSg zR#Cp*D03JL4lWga$-Ifh9kyQ4z-jwy7SrTKmO(f8p!0C$=<wmgkr4$@P*6Z7PAujg zux{OZ27t2i^7|j%ySED-c;FgdJL1tWLeQi}Gah9cL3wW(k@45DS|(}LNtP)4xgg70 z&C@I<WHN+;Q9F+}SZYuR^A}bb(2JnIx0fVX=Hu~zB+JC;-NYpi)`VYzJZM07J0Akz z9`Kvr{DuSg*0;VD{r0!NeQE)WA3vF}1a8x&4^lywAO!G;2p|^e<^aGHc1pks2zr?z zVdv&W!s<3FngH0s%!2e*u5KvYz)~EhP~4bYLYSAa{R!@)OOV(Xgdj+yyPNi6f*|>P z902S2#0De>;3h}M%8m{lI>Z6|_P4)XJ$dqE?g6J9K+)KVcvX_TdGkL+2|@rN27vF^ z-xFd0EcxIzwo8d#&?=cm231S@OwDy{7gaw7*w!-+dJM3BhK9?O9W*pBcrq^iDQOHb zbhflW9Jit2%~|&ZQ-+*!1h(^7(}4pAA`d?J;K%|PTQ~t-TaveKU6%@$1XbER00AiR zexli3YZI8Yk##GBCKH5e(qwss<}F%L^AJnMtg@y{`g*OKTK6unzN;TcW6T^%BEDcM zl~YDRS64TY{C>)e&$^}!Z;%advbRypitqFQ1Q2BaUU=b!kpoc30H{Q+s#<RVxP0l7 z`zrSB?=}JScXxmiixJQ@h=5=iN-cM`%9cS508|H{0kVN1x}l9@tESP}dR2?$cx;si z1O4LhqT3Gar0GRdKus$kBq@oa@ofN@963`}!{{Om&`;(Bz+%96zVn?^2p~V76ru#F z3If=s1DH4O@+C{}tK7f8$CRMHP#g0AyX2VJj3qhZHY!SyO}g}bjqj>pty3*&qt4^$ zHQ&4j{MWSoLrC=ZLFUC@1}Q0t%a0G`i7j;irUbdkkXUBRef#!t30kve&By@AM*w5T zq6a9F31A)qSi0oiiUS8D@ZIlziPy}&P%C;spDsa^Cp}iwwaOrRfQ!^vwH~bR8L|WR z{i&;D>E57kYufP-8mc`EW3O6HC`u4BKD(QThNn7&0RdU`0H-(X-@l&+VRnCb!~hf_ z0L223H}B$$%NT$|N1|~5{W^fo7Et>8EXe@7HXGRyv5Y;ypcWtyWJfhZGcjz=%BoRz zJB}Iffi!=N0O}6I=qr~KKmbgF{C>X;fUKv(ZVfai3<iLCfC1p<n{STZefQm`7y!lq zMYRJcUvf|7;iG+U?|oPE{d(J*7y$h`wd>I;w0>=l#+6fo#Py<V4alU#bySlsvngj7 zo;!i2TP?fRL#Xx$<XyfD(DF?GAql03Ee#10<!7iqDmF0*`r!|MIMM*d>i{-z02j}l zTXxHmdn%69#o+FHuHv<>x4jY6{$3$dF@mfiB}M=>Yq+&tuf=BYR;ejnsu++}A*-?l zVZ*zq`CTLFYTLbmhU$+(&Sgsp=s_3(m>%G46TmTgT=(wX8~xFbe)QB!FTKP8+;r1T z(R=Q>=M)0S%i|KHB7m(TfTj0T9IcDPckce84xj<lzFxbOz(AR>(n+^0Nt7-PjOs`| z^~&y&dg_v;XF>XjIe;z%ko9ln0|4k=U;;2&#d@uG&4@nz^wa1=4?T1`01yPQQ2=mv zWo>;N?!4<tzF%(}0_czGD&S~HiBjW~9$iMX$&wpuy}`(y-B_|OW>Cgw?Hbs!{gaKr z0Aze&DI4!%N)VGDRu&~_u*R5J-m_;<gaKH)cJ1m(lO}Nh_uhN&sRl4!_W%vR+&Oc~ zRxG`{qP8Ihx8GjI^Y-RVZ$fI(8D<Voglxu^=j*kX*fW*^a%B&y!Z94}3d56hmlC_f z`FA?1H_@(!8c1KfgplN9GYI3-Rf62IAhFBZ@PL<Je)%*5Sn}<Py2d!%y7DsK_&WG< zCFIQdcOoaHn8q{ue+C%a1TavpgqE^hf(Y0fYmSyP1p&I@G5D>{Js)uZ!O!1Jq?8ob z7;wB<knRB-z$>r3!U5cP<Bie#?z`{Q0m#z<07}r7ZJRUz7hP1gqWn9R_2>aBZn>0S z=Ycg3LLh%4WKN$CHd%1Wie7DvZD!*M>@s3)AJ~^f9p9xOo(oKQV(UYnZiep0T1Z}a z6G*`z=pJCokDCMy)flU;u8#cp$3GrH0J*su04kXP<{*Gum)=#;(9{p*OD^FaaCq%Q z5btRx`SZU@eHnT7S}iujOb>7ms)X7baH<%PopNM$dmF*t=2iTzTxj1G+S6DENegZw z2w;E&v2F>s8#UnQ3o^U`0Yn*q-~H})9Ka1X+z`G0{`*H5!0g!^Kx1<sEV=3P{Nj%M z?qTR{IzZCToJ%vNEdWXOS^$V@@0b%M$k7lJ!I*tMRDj{^3!-38eZ`hAFaTR=Hv;g_ zzlq4HsodyHf*1fj5SuZ;d3zHacgk4#lTSX0KK$^*9Kghh6C1zrjc-IBc;JCk3t$`q zz|$juj|2dBRyH^F!p%2ocf^jqRtddzd%=^M3AuBw1%LJ!?Et(XCU!MDq)C(|Z3lZp zj1H6|H~F#m16i3?*MTZv9^jdK1ITG<10;wo#V%<!IfqV)l7s*v27n0@CNy4u{q<37 zn4Mw(h2!}B00Y297hYI)`_elrnp=9|#;?!gL9_mkk3(<6J}yUr(It>G_bcqqiIw|{ zy_%qRMToh-vlo@xy#btAmDS*KbWNLG7yNVgfhyY5To2@;8;B<@ZO9;eJnewpyLWRB zc=gp+SC1PvuJM{{u8BVO*kdCBfO)`X6TlryZ|4BMdHu!Q=na2)3i=xN6Ro2kAamB$ zBzfFfg04FN0Cj`Hug#DVTW1^@m`PckbRdKq^M(N5)^l(>?PdUGBY^aD696;1?ghhY z3GdpqD_U7u$pI7=7B*gS#TC(~pMH9T0nD0Jc1QUgm8~ri_}W+J@co+J`Y8f90EXxK zG74bS%qzf~o@46=5~W7$)3IeRwmu^FjLB*UQ$uhpIWzC5QRq3e1A3aVkvQuc;LXS| zB}lwGW;~!VSQaF%+qrXRgaLT%wbxdU9zDA8(n~Lmu3EL~)B(uN$syy%j$_IoZ{D_r z1DK5f?p%6XMQdvW{_`sr^4ihz_A}7me2@>v(oR5#zhDYYJNr_QlTw8?finmTH5#mb zA!mjodXeT-_N<DEJ*j%C%FYo!yn}YPG(h6KuM-5|+7&TaJHQCMh6k`w7$1D_LCaH5 zJ@wE#@4WLCrsz!z7A%Nhql_M}Jx>mR3oa<Tv;4M-j<zs-^-C9U321-!S?F&$q}^~Q z8UP}BX!4}<A$96}OPi@mK)fF?!03ZC&_p?Miw)*_qlZE}R^-SI$~>TdrUroB4;ZQ? z3@)<6%4~d6ZEY?5`Okk||C68m<l)A~#yvSXIn8tC%!$7K`s=3{Kw*&vVEa}M;6eoO z?ebeII$C?+x~tFQ7uxan=ONZ|n3!6_e*ha2;)k?z%7`y_;(#D*D7Os&5reSU%`h-H zTel4y?Fo|&C6S{a({M{8^q%uI;>*lDW^brlOPG!9JAC*s#a3|bz4zYxNL^jsHe6ko zm6g>xYu2p3H{X17Bme*csL}wOe?9|H8EWr_Yp*z$@7MX^YKXTVv7bOcixfzMVCiD; zWff^FoGoM!;(@;1ti@C{JKdad!BQcxVgOZb_Y9&nyP&6~2_k1-kLS-aJL8-&z-S2@ zb%)JtjB7_n2W;KCwR`jC%{$htS@T9qOUrKDr55LA%z`?P9zA+$pODc2jOF9ZKC%H= zQPG6}zFang*TAmzzeNBwyw)4-NXw#xct;h`<dOy8Nz2tG$Z_j&u&!&WI;2Uc>Eg|L zGd8G#Lr~INvzsyiJ=6b#__DKYcf_1okT^&Sjn8Vmx^3IG`WIh(@$b0Y9u9}=aeEEU zjjYZsTC^yFvEbA`BbJ+;jWM8zSrY+l;{axzcV5}u<tr<?Izn*GWoPji(7o|Rh<8{3 zhyXwvcm-4r=0M7f%ZcPmruO^9M#r7%(0b=>O|wJVOgF`@3#(0F92Q7l!>2q3gi5YO z8O$|ffU_N705EcYCOL1s@y4fX*RFl1y1M#PT-C;EJ<bix_>(403S$tCZP>73*z$8y z0Nhi)yt1dG6Rx^+8sD#H%gd1HtaClM_*qWPfdG1f9LzSJCIGSXj+iZ8q4g}LuCDhB zs7-dPRx;{$X9GlPc0<?n8$n4)0WYSYZY^Pbj1WI`EEWSyGn;<)v!A_yy1z%S@vS&_ z;69xwJ-rzj8L_IWs#E`*a1H{PFm@~()hTb<zFh+_b0z|~r6SxJf-f#UlS@XV>i3{@ z)|(A6ZK#@1HmWom8k$}}{gW;tQZUQjQg*hQZL;IMPhfP@IdAx@RDeO0{$3hAxC!LN z-z9amwbVCi6!?WS)ae0Cj!@^}`RAYi=<&xN|D|qxCOz!==kWOP<D<#R$#L|Gk$F<y z4ZsBm;9dj}#Q=51q7p7a(d~Z#CDdRuG{8Ur#&B}<0OBuRK&3#sZcwlroxvc6yr|Be zPDe^=NtyOtV^DwwE!KJn(mr<!IkfKxjVKBvXJpuVLk$4NAT3NW0dxHqv4Qn6Xp+-_ zwLXk#XMbN`Ut;&}-Jk6_+F=7IEYtw(*r5S9_uR7k%9mC4hT5TQK`}pC^y5E)+TCb7 zIB}fKc2Z_(e-L~{7l52u$g*58JK)3?@F1;ZQ+~i9OGa};Zw(upe0fvAGvNX_vU@j# z`}@J0mIgk3bcB%!8M6-H>D8-Ozrc)-THiW<{`~&t=4KTeVke~eCk`Mhi%cBLvLK28 zJ~jc|UtV6pM#Eh;Z!(vi{!iWnwX4b25aab)JDuG#c=Xhk#Fq@-+!7)el(POl?b@`* zGpyWStlj2%`*<PeAT27ip4m1DTjTzz3#go$3oS>FlD6h%%7&=~($l#d8N(ErH!uJ{ z{pnAC!k&V`6EvdnJJIm5lVSK10-#Bd1>pR1&MEt^W#tvIPz!wF;z?Xm`m6s6YEQF0 z^Kqo4Vr;NMkuVj^nn*nb)6pvegr)w5)bPqojVx%u&=wGTMyZ)if#E$SG(J=}qmTyA zT!=7&B;3(K4_8+MNl8IR4BF&~0l)zK1loTU9;vCkygc;GGtVSWBY;9C5b{P5K>3o& zL{|%3I%hoJuYd15fC;zR02Aeh9Os!yQaX6@N`Z_T!=JFR57csz9a}~O+Im%xDN)8K ze;NVg^gKwJI-h4@Ea}~~ZXJUFNlcRTF{4dQP4M*7Pd};yXkNa2c~@Ion}R9nNs*u7 z1Hc#{6N&(KY5-=;DEscRZ&fG=VDaoCo;k)3ybm<oYRV3A%8uX}TBbw@b*$rM$xEc{ z$yCZ5kKT}KG}`pqZH~+m9t07BwsG6i0$}g9*1v--bK)x~q5i^Y*wXDGhxYHMsRae* zm{A4*Yy4yEDHuF{)5?`AIRI>soh|@lhz9{|*s+TPI1d4QuN(nj&|Nf(#|Iie^bZ8k zW|JKvWIn`}1=%HNU|FIhDGj7iMI446d<EGtM$f5287#>$x~Roi!M3SJj|Jl|Q{wS~ z_uOmAflv2RDK!<60s$^T48Sjb@r%dVLl_2t_V)I~nl)=i9zb?xCYi(~NR>Byyjufs z_St3MTXu6L^fbWd&MV{xOB`8`xoEqs4`@Jn7?b%+QI_P)NhlLp0G<E{H{1t~ju3BU z^6b?FVY|I)d^geE0<qv&s0);WKRcTN;8_s^@bjPl{BblmmmmZX(mmiar=KSXU<?AF zHUQsWc2foEu7`y)3wWSZYCZzm+hN@gFtQzRNRT570)3^GOImWo%WOS+7A%lS$f!a} z0t|$I;Ba=E<mh2nc&LMlLmTz+MhXH5wRe*G!YgU&*s+k5oXpz?x(7VL2H@h}O)FNc zU;q*?z4X#)@&GPDs=WT=PdI>?XPs5{gJm~X$USwi;GBGJT&2DWptqA-%rvx^h6=HP zk|AOM6#!6TJkZCp7?3;^d_j<cIRw&+w6s+m4F{INZ3DOr2{Rkd+IN(mR%mN!BS&)n zjb=@m0s+j3j2Q6CU;dH-_%#DCefsoJX=!PquC9)*Teogx+W{JY(K>)?6TpMZZm9Hz zYhm75Ieb60VF!CmM!O{`w#10b8HYMMbtzM;Y|06HiZVG1NH7muS$J8p2SbMktot;& z)R-Z_k|-m5C}9Sm0}f?>0T=-E08@gVefHTWFzev}up!ooZ2<-VHf-2%Qe^0}0hm6$ z?1#&~S>X%Uz})HC+AWl(T>!CeVs_{dGO!F*dC=#6!KF-H%2q-|s4o>gBN>P<g-~w_ z<*`Ecf+1m4%!0t`qEN!^(B9HP4rE?RGj$IzBnScU@t+2Oi!Z)7QD0wAH*VZG!XA*3 zfib`Uu!jRU7XkdJ{2LWX(IYUYG?Vb8u(cWi^k}^|#F84b>`X(6V;yyoBcn_OX)?-m zU>UuFP{~Vi)&O{e1UyL^5EeIxq~EirJUdb&9njhmBKt=zrkTaXCIHqDLkVKT519uv zG5~Yu&gB3$ZQ3-l0J0FkWCY+v0P73@)25X@wCwAZf#_kFedZ|sm@e(u2M`ZiM|YDP zavW!;gDj1*Q<lV8HM@+gU9D~;lpexB;3rAjT}ePkUjX)|ErzU;5(or?W<v}CJgEa{ z%FWH~oHJ(*2e5hb=8=^k4M2eo;8PCZ90c%xmVK=vx%VK<IwPHX0E7-AfQVM>*$Jc} zB#1gZ;6x;d4&n`}k?ClG+l;&XJ4VJz%tl#9Je^dhE~43IoZ$?@Z1kH6VD{|Uar6uZ z;B<HZ1E3&)y&8bh(y|}l@}CtceFxzD;xx_Z-AA!85Vd5-Ee4R|$bv)w)TQhOfcG;9 z`>2LjScaxV2S5!N+WPib8u=vU^E7AbROSI3fFVJ@|NZZ602&$^=$0*8P7eSdNyz{B zc%J~^`pVS)eK2!MkROeP>oBe8wdBVw6FSxv&>_}|@}s(xUF67=C2FnWhoY7wwZ~Fn zSJFbrDJ?a#ARWMyufF=K2!Kn_)~#DdSb|24(f~*dz<v&3#+hf9J$%c5RHViC!nu=@ zH3^C~;V<eN=mFs34a1QjbqLRJ$d0(4e^v!a!m=u~DGWJk?Mo#)lNM42z>pvY;JN3X zd&&Tilaph500J0c58wdu5rAR?P_g{0mFe+4Fk@m8KOF6E#UI&k9o@|noM(1k1s$U7 z7J%6#dVo;tZQE2ZJwd;}W_m?yZxD9)7C`Rw=?nl5!f0p);K|osdrbt8&;gtV4=Bth zemNn3`0)V^z|^S>Kt+bK8_t^G*9OPNI`RLw-2=!V9stLP0Wgff3zqKNg0LednA^DZ zwcxCIK#*+nETB37o`#~-a1Z#yAO2thxbVUYxd&8LRgJ6%WFmkmg?T!FgB-xw2%vKL zbrqTFPMAK<uNgYtgPRgV0{}fcIvH7zi|n`pFeFU10I;&E2jLb3P$kcI1@QXouX6y| z+1Z^JTyOyguw%!L{{;ZfIHRm`#aAk`=*KW^oR{xMl_(xnv5tPCT@uHW_luw1g0Kp9 z`EjlnB&jKy3|pmn_@mC|62yWq1HgjtAOHAA6To@royR3;=gyrYD?yp*>14`SCP8ro zaL5Gk$ck$#a$p;rF;><j2x8i;LZ=4|m4*@*38Kf4AaxKqa!QaR2=g+vJizdV=12<p z2<FoK88d7iz|zn^{pn8}KxSrU=ZqOM;@Cc*)z#G_>;W8r;Q<<evr0<J9$oq6id<3! zC51!-Kvb>I^LPNjFeM1Uz578OA_fd*bm{=mlT0?Lb7;Xi=a}sP2H=@zo_Xr6x8C9a zGBPqcOG``REiEl{-@bjP3jp(g!zO^oR$fz?D{q71F~$+u4Oijll29J3O)!)Mxh=)A zTlT{y1&%2_;<~2p0BlNJ1o`Kl3(0y{#L=TiS!djnfBoxUIe_%^^v;r!l0;iu8$ERB z(CLt%Tphp>4q$q5aoOW5uc^rOA%M|(O_yM34<N(v02pTG<5G5dgfj>m`!#h1$fnpu zbo9)bkd%_bFJ=Au_3*|UZ&bef?z?O8NR6qfsi8@eCdE5CI%rKz&B%H{Mp_yvF3KAS z;MOlyWRUGpI{r8SNW{H6`dD2NgLFaL3=4u`2g`z-WkHUbLP=y}-$iuH`RB8NT7(7K z4I4JZUVi!Ia+IPfJW_Ko7z`B^6~#lL5M|p(9KhtlT$1EvEnywNlqqG8-~Oe_OnC>K zIZhvU!X!unOJ*d1A+w;tdPa{WJ#O6%;;g{n^5Y^$jUhj5jLzl~RNvIZ9z#_y(|H^9 z|G#mMBRIDf7Z-=H9;n^j-IR@v8&Lr17?>s%<{$u7-mvQ^e{bltDN`<g^0uogv-~^Z zj3Tk7!@ycUNI)La1CAv@ZkZ40WyR`@8?4qNByB&1LVbsq{H68`+UoHrdk-9F-oJnU zhkN(#{U8>Lu_5VfP;UFwsZ+zzXjBP@!?eA<ePlf#4Rvw+=xh#Pb9F6$Z|JnilP`br z_Nyy%lXt=7LaM!hRno1;y4oe;E<tWFfPi}zL|tGE*7#BeX^06%rwP0og}t9z1yxar znoy}4SD>LyR)4cSzkB_WBYO_j)NIF8b025}au0*{JV4jPi4&uJeSK;q5`nI+u8{?h znw(6==4BxOMcTHn!36Ns9alY?o3abWX7}Q6Rd7~8j{}$uv6rM`15IL29<m`g67V<M zO2Ye@-Lj#f?gzVNL4))I@zHUL%4ap9y=R(#PN<OR?^oiz;Y6Y@99M8|?MatbRTVd^ z-LT=Wp-6;1{nDh*toDa+j*J;IrXMHD{!|M>7+C;pDlQsL{OAF@4mR<(r<YEeRQAMe zS3Z)Jv_;BJX^bgKB+mYZ5~Y0#8}K1{{4&D8e=?CgK3VqqC0X{f0r<q{59sd$ARtQ~ zZIlWhmaa!}&PX<lP1t*v^l@C;j(R^o=+Z(}h1G6UXl87M;*7>lQ2u82{(e=B$CN~W zucGwzCK9m-d#SWS^f-Z+s<uaSeXFXb)x5H4)7nrpdJwm?fc7*@2hLIUAO@aVK}k~C zgBv)HJb+1sdBo?T(w-wN{O<=87ZrW}dpBS8;KZDrxjDW~&8pg~atV@|3g}0dwdY@$ zcHlO`1BB#}7!dvo&^06?v-d$WnPEoPC5V~YD`~Q$KQ}=2VJ<4sr3SQ7Zp`S+*l2gA zf@(ajYBGcRlE5<73Bva?Jw}fQz~TVc&W=c~clDNOht_V|^vlj@bU$us$GHpVut%0- zfj}UksH&R4W3h+!*yE}r4q*J~T;h{eX<uzyG6Rr3YSi?buex&O+-dQJB{}c5gWB9r zb@^d^46Ljf9mI^t{H(v~8BB|7Ih1x`)Vi0eJsqu=snwm#-{fbkSM>F&{<?NWKbT>3 ztzky_emVe2(U;5v!a3emA5Gi0cJt<+c0?jf|5?qCpz-^Ifq>G7P~(Y&s{b8>lVbc~ z17I;AC*4O{L*YPeOAq_=h2y49m~h@#Fa5%ev!~Wh$xr#H)9()@WKWzL1~)+nDJc~p zfL?Z+21`AMYTX(@#2T+yV077`paG(W7qs_edsl6ozGv;0EswT`!wf(u;FbCcMg^6& za9j;z@Kr6tpB?~gnm#FCYVQjB8rs5X_;EDOg(XEr)2^C7_lwgfc*f_Xw<h`hQR<On zDpnqqND1)zq6uc^q@+-S)q0=5OOfO_e`1n*h^6!d%qQ{m^_rnA-Dm6dnrkbo`aVWk z0V@kKjBdz|0YK%R!k>q2?#%PAUSG2F<*i#QJEGA8xL0>^Zc=|t@u&<y1cNWNSBcXD z;EZuOB-9i2Hg!bU2-$3$^Vpo3mNpjW(c|;;bH*1GWcj@y=Zp$w_`H%YH6W$=yq@G_ zzY<9Dd($MjPh}SJdZUWh*Q=n%sDb1z_TU3aPU(orasvE;F2&~$D>m6tby=a7aR;3h zds*}dYIIR3pv3^(w!3C(>d)Sj-g<k_p8rOnsn1RIbdOH=#X6%zZI2|V4ggL&fN}Ym zB$z}<b7#cY*44*?@hF@#br>l)vjI2k=71KCt+uda%-E*zmW~^jC(E)YD>XICkEv0> z?@#x6y~$o#PD%25({L#TlMt6LMpJ`v+3QJ=U@*%5=!TS<8d5MB@CA~(6Fy&9kudVg zMB&5S_!4d8A#wJ4F1&yQU&m{G0yOV1JV0S%f(V3q(!H;&pPBgMuIfjs8ynZ*UQJ^& zygfNVZ@eu`Xh)O-FoqVL)M?lN*fgPF6bbl1YG{x6L*Y0xIs=ie17J6YeS-02p)5Jd zWUz9;=ktuo${K}jHyMLqD&|dIpU0DoK`{w;@L-uqAWX{5&6MRh%}A9~d>-%w0}0%Z z1d@|_Nx(~jUQeHjQm#rwRec_mMTF(|#1t7=sw$Dr?x63}+I;oZs`?kU*3|r^Us2dY z&Mk!*-Y5b{w1t7zc1BOS;Xf0AoQxp;IF`;+8NI;U6OFT4pDY+(^Z*frxb%RLsJicC z^BNe~!^A&lq@=L(VtVXJVz6Wcg-aiMpd8EWdf?omqC(bS$Vv5Q`#rKR*$2UZS58$F zsx*dT_3IASY~0)2ydkcttmWIB;v*f!`F?CPNGLx5ofyKRCn@hgDFBQqD=me1WcIgs zh};s2GJ|>)MPZ4&VO+P`ZG3hb-8s8?jSO~ZWRUO6gPhaZJ;<T~8^XbEWVh;bXMUQe zXUr&XysD=6l-2x`0>GG1zgatqb@h<`Se)JHmh|o(zK&>5X0Y|7KOT3h$!-RchM2|e zgL&9s>x`LAEDW<(y|clryy2CVB1gt$`TDli^q$bmH%<!xejwrXg8H*zX4yc%%GjFZ zWyxHvLt?Lq(aQ*lV8h1=L%hX57{p`26G0dN*mJ+V3_?b-94$!q#xRU0_BNgR+J903 z4C8#%Q8w2Rp#kjCUYZ1^2U%s1C9NFp>n8~Y)cPHgUJ<l)_)k$(i4OEEQGyhYMB+(a zIhGalBv`*)U1#5j82@wtIH{8)c$W4i9Nyy%x>xa4{c-KjtMfmlWc_Bb-<1Zu9))#9 zb@le2w1@AGclv)Cz==+hE|=;_?9(~X>7Nq7|EB3*08aDtF94@``X5@n{uDHsdHetX N002ovPDHLkV1gf>u?heH diff --git a/Kieker.WebGUI/src/main/webapp/img/graphIcons/RepositoryIcon.png b/Kieker.WebGUI/src/main/webapp/img/graphIcons/RepositoryIcon.png index 9bd7f6994e3a6a01213f4e5db6bd2ae35e93bc16..b7f988d0bf6df74e0665af93656c8164e6ca949c 100644 GIT binary patch literal 11104 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 literal 10719 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%0ACLd{g)j)bhpTB`l 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 Rad7|u002ovPDHLkV1ls3ZrA_- diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Copy.png b/Kieker.WebGUI/src/main/webapp/img/icons/Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f287c47e2e4f05b95781f0059212e25ecc4f73 GIT binary patch literal 494 zcmV<K0TKR*P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0005CNkl<Zc-obc z%WA?v6ozLg-lH`bQJ*2WkV;(WQe6~ED@t_fO7||+h2X+>(CmDGzCdx)23jZ-6zM8^ zsgxSLAU0~}OdE*tg8ktz8HV%m|K|jkN~OzYv-!?2ObD5@TrR&9MY$CO;Sn7XE))tu zNs<(o%jGmaY`0r9o6XRAz5W~yhhid;==~copU>&{VzE&B{r*iVm3ll1a1xmxH=7N_ zK$@nZ4<fhQeLolsq;xv{x(9GL9L@s{sS^NACKKfGc+hw}9?7zNP5Ry_AfL~l1n2?) z88mf6B8_^z-W`FwP(Y{CIT%5A00jV+Wzlpxg~7snM%`{Vj73qT0J8&VGM=icBA?Gk z?*JgBH5v^b=W;m;u-ok?BLINoID|3Q=b}}sRUT)v*<icfK5GVkzkeT)$z;xQpaTq> z(dzX&kCVwH+iJC*$d0}GBY|-ii^Zzv2SM&YAV3{}$ToffaEU}BjMZwrfCjJEi)*#o zLo^z_+WF)D8g=aej4Bq3nA9@?2&W<)1(3Dka=9$WVllxO!MIY;YPHfTl}Z>NqQ~QL kp3ER*ZZw_WHk(cU0h3`69;C4%fdBvi07*qoM6N<$g0ryJ-T(jq literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Delete.png b/Kieker.WebGUI/src/main/webapp/img/icons/Delete.png new file mode 100644 index 0000000000000000000000000000000000000000..a546aad5eab4f6668e5daefabc07e11e6a483484 GIT binary patch literal 694 zcmV;n0!jUeP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007gNkl<Zc-muR zpb#()E(1zSt2m{kq~k3u&9!7@rN#O9c)8fv*#7?b@#E{OS8tx)y7l19r%zv2M@IVn z$7(=bU1PMmx@M=Lp}`|rS*f2K92^WxOpFYF|Ndim_wFOdlPAyR@7}%Z9v&WW8LI)U ztsSu?B}EIqfB*jH@87>)xVgFhv9Pd!q}V@v`26eLyLX&Nj~=&5OpLjR)qu{<p4ftd zyam61|M~v^|G$r%oE!{{jEoHb{{7>8{rdg)FJHb0?B9RDDm^_3y8&HYeX)6Y+4KMW z`TOJb_t&3Ry<Nfe_y1o;Um@TBf`3H6e*5}WVArm_RyjFoxLnW|o0F3<|KGp=KiW^X z{e8*(g8ApapNxzznHW3GdfvZ%`wnQpZmZ(rT<iw4xA(?oWu?yFes#y+dq3`ePc~2b zCcq}Z(6ql<K$}hXt2(bH*Y@o@t!ipYu^Z6R(jA+W6gPkJp^5)LaJ>I9!E3^&H^1I6 zPd+r6|J}n6zvK0inYV4*Vb$7Ni`{^xrmonCh>-cuzCZb0a-xXQ&e-nvx4+*QZ(YB| z+G5=C{`;%nyxX_$u<Ge)#%@4OO-rn+tK$MOF_Hf-{y%4AWoKh}^Ysmb*nbHI#&0Y? zpFMlYw0rk1^BFVxF%4j5W?{0mbx58zZSpJ`8EJ6z{r>%z0hkIIzJC4A@bcwrhTFFv z{O{}Qu(@{a;&EU)`H$`bPCh<<kD{XT*$D}8!XhGq46LlIK;i$ubnu_y?c4VZbLTF6 z(9%*D^85EMkPH5x8vtT+GBGg;iHnQttE+1$3kwVJ{s)3LZ{EDWe*OB*w{PEG0dhYA c@lTj00GSImAYEhtQ2+n{07*qoM6N<$f|3(>fdBvi literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Edit.png b/Kieker.WebGUI/src/main/webapp/img/icons/Edit.png new file mode 100644 index 0000000000000000000000000000000000000000..2d223bb3063ba8c5736ce788519d664a399dc107 GIT binary patch literal 667 zcmV;M0%ZM(P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007FNkl<Zc-n=N z-D^@|7{H%%97@#1K*%<=#82=pC~#{HvAghdevlWEV55IQAw*64kQ^gwH{I-R)u2U8 zm*}>(y67yg(rAoSgyU{<t>#B_PVGJC;FhKJTpZrRdw##?<Ge5Ca=9>%$FnIA2;|Tw z>h*e~SS(&wDwT88dv@g&_w2#;vqXG(5wqEBcqkMi#bWVLFSyleL9JGUYPEWp&uv{} zVF&L{oIJfeSWGM3ZqF0UYPHe=iA2&@P%f8&&1OU8$999YH($u_UX;3T-Fy3Hb@c{j zu~=w<R4VN$Xt&#R1qcQnYXRz++u)t$rXzEt1MPkMuYiif`ZvILW}xx;KD^G1z~=sy zjh72AR2v^sZOm*o<H2B%l*weh1<eXzrN^+J4#CRSIPk~rKt7)*5T~NHv5AQZS|FFp z{}QyDdw_qPfuHHSu>NHf&S|CrRSJnjg3xNUjKE|v^{xQHtkN`sr(i8R3WD(nC=?2M zCdp)y(CKu?f<Pe9H3O_whJn%)f*-<qZUp!UMitU<M_@D>839^!3s7eEP6WY^U=6{; zmmdJCuB$kz1=KntFc=KD-|s&<NO&a!&D2$t`8=Gt6sCK|alA_qkH-mg02zT^ug85p zA1M-vhFZ1nu={=<h-?ld<4!vBpKwQDx7&{eUayzr^Z7%IPiJA^)F50?jRB9x>j_h_ zw6sJx91cc+rg<bN6bgVY6>vBl_*cYYF~aF|G6J<)jfcZwQYaMmJ&Dxhe~)N1N=!~p zG6L$M(P(aRx!hsuL+bK$epkPBsZ{!uN~NAt>@Q1lHF9I&ehdHr002ovPDHLkV1ha3 BH_re7 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 index c39a62f447089f3c7c95bce9a1d69152d7c95cc3..91fe2b5d2db5d0dddf6bdc873d8d29db7ca0ed07 100644 GIT binary patch delta 976 zcmV;>126o72jvHlBYyw{b3#c}2nYxWd<bNS00009a7bBm000D1000D10nq3SK>z>% z8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H117b-;K~z|U#n(@W)m0P+ z@XvWOj+106hFOAPGLr<NiIu@XiK37a<1Q_d3Sou{Y*9!MCVv#O$U-TyKSXULTG>J@ zXk3I+F+xn!X52*M!u|+hixvjsuf@G1kJr1uCq1MCmj~bP_uk+6opbIv@7IHGa23zv zFMNRS@Gbtp34DRia1k$JCAMNO9?HMJ<2X)Z3LoPf?!rO*h8LRl?!av@P*s)Ih55LQ zjqUiXc^aome1Fz_h(`+C$-w!ls_u4!EFu=-N>x>Vx8Vk0QNg=DOk!=95tznEfjcip zpdHzR{a9Xe_&s>Eg9B@@w7@NDU}qtE6@JE*nh5vgNY&Xclu|qaXRs8@ur7PH0k`8% z>~6xAV!50ask%?LU>mVy4#PXr4O`Miw-G+YV;I47CVzje!S-V^W0x^phhbrjZjy9g z8*|}ox`O@q0UMgIR^6y{?_2j?(@916T;Um8dofW})zzGnS*WV&N<{Qz=Pu4+O}U%R zzo+q2RaLXidz*C;F^o%vXY6iZk@j{yML1syah=r_;n_L|=HU~pt~vZ(Jl?^970OPo zggtflxPRM~AKq8s4mPBr@GpyqzKEENh_$6xi->&@G2S5p=cJC=&Mx%gSb?0CQgEr} z@UL;9g9F1gXACv)enf1GhzBC#C`81VG-mto>Kqmko11lb2@kgJZPD$*+YvF8*Ws)? zjHw3RD0tV4SCosCG|#tmh`<WvcKt+PrmCttJAWMVpRL<*JT1?Mf@UAayB)_<HRE^$ z%W4iE#P)8-ajB71(!iK4@O0k^CmI+lkn?Z^b@kD0C)^1;{>M)E6{!*RBG8|Sc~~G7 z(EUwVt8PS^h^>3C>GB!R7M`&U-pgx^l=tQM97pk5#ujJn2-Y`Y<I;D-`WoGRIF+$Y z8Gq}?m-rqIVO0h<WzPmPwinx_8!;%=!-A~q$vGTt!CG~PuqR_TXDspyzYJrA{LGjB zhHa?H?~^#up$6W>)&h5c8$XV3#Z3intkXE2j)-;b_^cU?h%+TV+u5ATcJ?C-b<qh| zV{?ZHtis{~cf76<T~8;x1$T6az+UP5ph=w_g8^wM3`mV(3qHa#(nrf%cq(ICvSx12 y!}z6X?+&~x-HZeI<zAPr=1@LwC1#{CKl2ZtWA>LCgq0Bh0000<MNUMnLSTYn-O@e) delta 876 zcmV-y1C#va2Z9HXBYy))Nkl<Zc-p;}J4{+p7{@O*CUtaTVQ_GCG@K?~-HiiF!$i^n zA3PNwNmHZvK%)X_I*@c|7qJ8kL2+<!W#I@RzTzW9qp5>2lKAFAzwe~SQ187$FW!F1 z336@@-|zmv$NAI=e=HV@nL9c<zBhmgD(&Inp?G$7W^Ze2`+r*N86E#)WMsrYK0a<& z<G5Td3!*3r#bQyoyu2&}gw1F)e)(5`007w30F+84<{a0}&5dw%byYq-KK=-beybT^ zcz8JA^?FqS;M+ewJ~Dv2yE~z&sYw78#J#;eOJ`^2kN*aM>-zdy(ChU~iPO_lad&su z($&?a2=N3kG=DS{n3$NT8vx`N3<d+s3xqg1IT5$Fw=E`<NfzP>U~q6SFgZD?ItS1> zRDp1DaUry{w6J{+0r?<iG8v26Y?eU03IIC7_#*_wo&m8R*Xh{8XN5vROsCW4-rnA@ zEP%)3VE}lb9u@fFK)8>9XlrY0sq^#m_oJhuB?-X5z<)qsYHCU~0EfUZ@RG#b;A$Ym z#>NKCX0ycS^A!~VRC}+0;LdTOV;&+707^>%`uqFqR)8CKiZEOO1Xy2Rr<<Fb1j=0= z0CS*@tKdZ-R0DE=f)VJrQUJHx%@oiAfQKTPOj0OEGB!3Q1#r1suNH#mZ_mSk0GI=c z0QHn%HGk)o0J0%)I-Rdl1xn5<0c4X90n~QFTAZV;tgO&nE=S<bkpegzj=B}#<;OeU zb4w%=3_!LI*zI-(pmeyJ<H}DZi^t=1Yio;uA9(-_0ZLbEB3652B>>r0Y_r)I0Cp_) zpbCT<rIweM>CVm$nVFf92f%@Z1889|c~h8>$banYtULgYWO#*YWzlGq!kkFv=H{dT zFetDP;B~5%MIsTpzrRoB=jY`CFa%mEu(Y&94-O8<!oq?)fYu=hhr{&n@R0cZeknjt zPY(moG6ai@i}dK|hy;T{DL{93Hv_o8zt<E1s~{8#Ndc@@YhZeM+ID+;``00*dVjuO ztz|FZOaK7sR4Vlj`hgUnwYBv_Utizn#>U2m$_~dbmY2R)+vjU_b@eCw*YpV{Bk5G! z-roKe62t%#(HlM$)%y0e>;qi6xw-jQKA$gCKKl*yRPI01|44fP0000<MNUMnLSTZH C>Y1tl diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/GridDisabledSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/GridDisabledSmall.png index 2ddf3bf9c96c5e53d5531866cfef0766fbb5b39f..c1f98fb78503dd196f029594cce45aee5fbd21e0 100644 GIT binary patch delta 490 zcmV<G0Tuq&1A_#RBYyw{b3#c}2nYxWd<bNS00009a7bBm0006f0006f0lpGc2mk;8 z8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10f0$FK~y-6jnchpRACUt z@!w?63L!+r#HcAkbd87*l*NxmNZ}m_+KP7(^nSbrYby&uJAb<<28kAaut-3So3YqA z;pBkeRP&!X?|J8W-U&R%3$wU}clcSngi}>(;}%|3z6INvDKp_F<~w{In=M!EK_}my zb3Fd^c#7Y>+NUlw7)8V*e8xqbjfmCi|3VWHE4b9kiil~Q9m5k0F~EJCDIVeq?p3d? zJuV*LX@kSeJb!?QIK;HW)9O!4j))i(i->98gO5GU`}orPX43ayDI&)BhGkrih+*A$ z0t*o_GJ8&#i-@(7v)Z3v0ny<ot^bS$Uo-P{X}W<AnK>yQVIebjj{X?2nVGwl@AW76 zpBVNhn2U%8i9H;a2We*Lr20{{9}zKV<uzu@^APW`fn#;d;{e}r5^H8A9u(ikIb3hB zlbO#-(*SQWbH8{6%bEGM<H6m`d|CO`z6YlrcYU#L>c*(=!B)i4%dKM^5$!T9n(e`z g&Y6vfxKR1lUyK=lvcM;PXaE2J07*qoM6N<$f~KY57XSbN delta 446 zcmV;v0YUzQ1lI$QBYy#&Nkl<Zc-oEAJ8QyF6ae6x&0pXYce}bc_`*m2fkS^qX{Y{( z4$>O&5k*819DJdo#$B$HAc~6Uls20V4hm{+?}JEcqvXKNg(T<WoO2Tn;1~{vvdiTX zz@0ds&qz^}cc;_&ar=xTm%(5FL!pq{EEypLj>jX|@Aqi4*?+uwJf6>gfGo=}91fcT znx=un;Xrr1(0Dw4#qWMu2J{NH+byu!Y_t-LyhNi>@e1_&eHe*EOaT&?%Y{}!7M=%K zuh-wjV$qS!W)TH?z1~AWZ{>74QEatZsi{<omn2D}K)2h4f*?Euj4dq|3pE~(^O;PB z0i90A5<rqkC4Zy>0$eL-x7&Azc-sa+2q20gpUdSK&}y|Fo`RmN$8xz;6Nv<$&*vG? zY&Kyq7^DElaeor^-5B%vTummEe4$WaK%>!se!t(+5RE{oRANBAUWY!P&oVHZ&D3-{ z&6mq%2GnXb==FLn1Jmi00+mXI0o7_1;-AEA*00$dCO4DGPb?O5;4hc~fk5EdZnr;? o7xl9??zi`MyPYx`jU<x$3sOQTAnrujkN^Mx07*qoM6N<$f=E%)m;e9( diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/GridEnabled.png b/Kieker.WebGUI/src/main/webapp/img/icons/GridEnabled.png index 3df73e6c43482f389dd45ea1477495103959df85..61d279d3ef60956b5f820010b63a5c3e98bba59a 100644 GIT binary patch delta 468 zcmV;_0W1FY3GD-rBYyw{b3#c}2nYxWd<bNS00009a7bBm000C|000C|0YZzD`~Uy| z8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10cuG^K~z|U?bpGI6G0Hh z@n6MBHcDg{S@7;7cnavjR}nA1g-3l0Pl6{w_9A!?Joywpfqx8$5Lb7T_K;r4#;)<C zIXDGP5B$HX`ex{!=?SdyRXc9t2Q~?xqQm!u!vYtz&VC$2UrMn*aDsv-EnYQmu*!JV zoa0r(`pJOve-fjCgB$2DiHK!`E$VzP;c#al|0*UpO*9d<TWB_rT<T~=)RAq|Kh;=4 zk9lL<tw~Q4K7YsCS|sCh+imzdVSNXsl=I(iEn;3TFIv26)>;0J2G&WB!!N?oz-XYu zG$LL$*wwq?aYQ^!^6z7o<nQ)aCYtWxPk`|}FdF#Z4Rl=l^6kb^ou>(h8w2^*beSgb z4Y!iSzkMM2+2Ilo8gPO4c#gBA_zNuYXu!Zne895?drjA&lu|zJlZZH}m!Dg_YI<xk zUNswhNqTG!z6eJH2R9Igf6s5*{x@7Ed}jMDSq=0!sy$jYj(-6pg6>efFA!G%0000< KMNUMnLSTYdD9^wE delta 1251 zcmV<91RVSA1NI4!BYy<FNkl<Zc-pm>Nk}Y57=TOXx#5QUf{F((d3co9dF1LbARfGg zAqOD`w;A^hLd1Q+Wh4Y5BoHrZL`B>V9=r;{RuMN`a2=hvG3vO?Oi#c6FQz)}bdS!A zFFzF3UDnk9^}p4xA92d~__#JZJNqwx5aOd)tya6yXw+wBW`F+X>2LhlLw$XHUsF?) z-WSE9C=x*sh}~`{H#axpsnMw8K7IPtTL1$9=zIZiI2=?tj)#W_Vm6z_qobprz@mS6 z3{Y2BXJ~G2rU0WBLjD!l>G+AxSw3WIB7D7IwZX8HACsO)NJt0)R|wnN+xa;;IfGsU z6kZWxVgQ0u5r58h=PX}?A=(5Y0)XS$Mt=WjAqfcy)Dowsr^43OR(@`7?%<mMwY9Z| zmX;O@@V$wUf2_{0WQx^>^KYUR9zZ#HvJw8XnWUto(6~T|<KtstV`C#fFE4NKRe+kB z8bfPqD+Q>yu#*kPhyN@9!w!dk@DGp_JM02|_7^qq?tdU609fxI$e-VsNqTxZ{V9Wh zco0@rR`Ru4?Vv{h7Z(>KE-voH#<R0Cl9ZGrz2Dv4(K$RkoGQWqJUKa`*?>Vw5BKw< z>p0)u-U>@gOWNY%;$c;Q>gs9=fSbJqps@-{!Q3P!CWhE-HmVrs%gaj=6%|GI%+1X$ znoOqe8h;uZ914J{swzWUTN?!clhH_)3*@(S5X#fj6P<&DgQd0W>uVAg7AB=6TI2EY zkt8Q4Q!6bjEbyzVt6WD%hutjzJ|lH(Z0rkw^Ye3(n3yQN-{0TU85PR+#K*@=%5mUX z(b3U#jRAnAl>n8Mm68QKae*2D+k;<=1KomWp?_NtV19m{UtV73Al=mgFb41{I6OQg zfq{W90HC^&$jC_P{rUNs&Ot#zZug+T{Xo*v(x^2c26zw-Dy|ZsqN0LY00G`>0lDB= z=mNCJ?CdNL>Bu!UHYx$i%gZGfye9_ad*lEp2!Ju*7J#K8W`U~<Adg8zM8vBuaNUD~ zS$}{okOQc?pscLyt7HM&!-7zL76VWXLIhxy@Vx*`Im*@570m*a>FH^HZEcN%J4Xpn zT3RYu0JA`DS`^m^S1UxghgC+otC$O>rlu%>Y8}w)^%MZ<y|n=T1_iUgH3;QrO-@eo z>+9<r=urni7oh2|q%yO;27rn~LqjD1sDJac7m$nG1q?v76zg<43V;<0FBMl8xJEd0 z!CP5?g(x*Ol|D~QOz@kVn_OpSr#b*OBnTj<X5#vFYC-sx1)%fhp+n-jy1LW>uqDGQ z)Dr-U#X@Ivfu{gtV`Dt@iClMgw-Nvv1?mDc88#MQs}SLN*rK6~j*jv>J3CxYPk)a( z0J^|a3;5!Kk&zL8cXyZT?d??u@Wutc01OWg^Lu-HTwh<G5}>H4hytL=u=`=D#RS0u z0s^FWyk1c>8jagMQ~}&AtdklV8shi&_qqQ5ekDL*VIc)zzWqN00Wb>&1_qP>1qB6$ z_V#ui-d=KXwS>EMcl+cP1AwK)#azX2p&lp!GBPrLC@CrV1x)DAS}J*K_1gPe>uk)- z%=`^8@-uWs%C0yoD=QcRBn3Jm4f_w>)35hr9pFTWh4X`hgIoFEz5tVW3|%;X7;yjq N002ovPDHLkV1j9gKTQAt diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/GridEnabledSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/GridEnabledSmall.png index a24f021ddb43517639631603f5d23b9b89a6ce0b..c2eadcbb920b4da7b02e68387ab4c03450dc90a3 100644 GIT binary patch delta 342 zcmV-c0jd7b1n>foBYyw{b3#c}2nYxWd<bNS00009a7bBm0006h0006h0UDba_5c6? z8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10PRUcK~y-6&C)GP15gyk z@!#1d4#cL(xgdxp!C)R34PrIeR`v}B`zmHdFl!QDz;B_&tbf5EC^E0XJ3QEAK_9sA z{LjOIdk!aXj%#1q!7ZLEucCuX-|FMA`W_5RDM~4Dg^k3098I{^?vfuiOsT*b9xCtF z5uPfqV+j|jXCKGaFTe=x`fjk5cz~0{ZQLh6YGGVTd4-7hz+2+?oYz`O`FQFbw9t)+ zy)@HyM66WaL{BH>Fqe3F>L2jechEvJBHEQ3m`yzMBZo-b44mSz7Jhq3UH-!kdJ!?< oc^pK<WP~*=M#M1nyd>^@0@N3dYd>Hdf&c&j07*qoM6N<$f`u87oB#j- delta 568 zcmV-80>}OE0?-7IBYy%HNkl<Zc-n=NNsAgm6vs;^&?+8s@(_Bi!9Xsq?Gg}1a?8=f ze2S2q@)ZI(NTTA7h$47!L&fbfCn*m>@vcPBj5jBaOS^TYsyf{mb&?0KU%y&@_5S^; z6#!ei-EJC<#<$=J+wb>iJRX12>-Aqw=M?18YPH~N*A4e$kAD+{T{w0Gwrd`|ym~~# z;qar=>HK;IXf~Vh!RF>Z|H8=*`{s{tF^?AjdR&7$rvL;&K;3TlgWK)?b_RH1d&7N4 z3_W$T;sNtaCB`cTEFb3J-SY)dsZ?M-pQB!{_uk|2_+>z&(SRH_rBX?$tJMl<G#WWB z77L(IC;-p%V1K*ag6VWRNu^TPu~-aIK)qgv4u^vyi;0m9TCMi4Nal9C9eu|i^ga{{ zvC(K$pnzJf25mMQC+U(-Ua!|ctyar9F@zA9OeXg}pO1}1A|jw#tx^Cf^O6K9lFf(1 zfk>bLxq?ci0_}GDKP8ZeyFg(?g5U3F<MFr%D3{C7YJaspS;2C-q*9J01Ofpzkw}Pu zQmF(j7K;ox)=pX{<r08Y5DW&{WHKoNip3%{o6Y}~AXPUSjVK_UPK$s-p#TjA!^H}Y zyCGFT0O4?$&15nnAfL}elgT8vakJR~hGEX4WP`zg0<zhx2*~Af5dS0`p<lAo@qWMm z)9dwK<1rg70$eWFtxl(VMHUh#?K+O9<Fnap-05_pWbbd^O@$zRSdE4N0000<MNUMn GLSTYXq6)bH diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Home.png b/Kieker.WebGUI/src/main/webapp/img/icons/Home.png index 2e7d58db9a686cf07c74b6419fc68138d547d37c..9120d2240f9cd433d8515bda24ad18f829ffba72 100644 GIT binary patch delta 812 zcmV+{1JnGA2EqoABYy)4Nkl<Zc-no_dq`7J90&04-F7#f^SWt8S~Q$1R%SZcG&2iQ z>yPyye5_>zl|7^gf{KVxC@6^fqk<Ylf25#h!&fTniGNg76s7i#@=;3SrrUJe-OJnA zoupKD?;rP^bAP|jJ->6#rSPB2w9S|UaGtvQhOThGqs<Z<AAhgN3<QHid22R&36D{; zB^yhNbH<&cR)K)>$1;k7x?7g6j<&|^3~l<eAK!nNvsSLHm=)MYlD!jS*3DZ>86WG# z{k!cpsZ3sA*kp(@Y~1v$zpvN4B3<`yz(kV$9;bCnk&#g?)_~(Ue16}Jjyuh^tW|lZ z%J-F<2L}4h+JDTPzk%%}IpA?vOH4bNB&CX!&mnvZg+hG&_!ic-*5L7~DiQ1TnzR2b zA)Gwvby;`p-pgpxwD5S`plLB=G8tShC&Xe2x?Vg*dut<d*A<$}_aB-DOeIA*9P6^~ zIdG6k%gjccTn^jF2wdai1fdBM1BF6?u`vf;K7NSWnty6L9TS&dQ*Y^_N=k~CjSlvA zo;-D8?h1V_7)B1V@?gCzCMMjVD2fLpQ4&l}au~G_<JFT+T)22;Fg|hNYJLXi&z(`4 z%8Y$-#T@cQ318CNClBEK*~_;R7HOc-=kaaUI{};B2DLhs`dvaxi$$r|Yx`s}IYc5c zA9(N5QGa;e-{S*hx?<$-t>njjtQ!u;7?M>>X8_F>rB0tQ1<-t8=hYK%_gMKhlU0hm zT_+=e&%*;M)v{@zx#_l2r%UgX#>A2>ivZ7WRKnlW0XH3wgp5My%Z~Bm0Y6K2#Q{~y z@@b%{sUZSL2_O*hfp4l$Bk<`V0wE64%&o{MJ%17b0xZ9+DeAOoz<lkp(qLF00fZ6Y zUF})m%Oi+ILijZXq!t~X0(@{1Ks^HxXw%b{RO~i>5RelW9um+|5DkAqLdZ_K6o!TK zfVs(-4Eo7?j;w<p*KamNzv+JG3j-2qbadi^r1=`LnC54YtWs0tFmdDv)8rgb;s3#I q8zl+#_kIh7LO~uF7#w;{p7vj-zce_H+*Eu30000<MNUMnLSTYyeu=>V delta 756 zcmV<Q0t@}Z28#xeBYy(YNkl<Zc-nnaZAepL7(MsiZLPV@nw#@ufo5xcO`#M^(NQK+ zA(kN{s6>rIE2DlCL=uI6D(sIzn3{?Psg+VBk{=mGU?NRjDoN?YZMtkaU2eMVu2&5y zHJ{6Uf1Puluk%n?C4y4k(+qdr7BA~jfTGFAnpltP>quR^XMZ`C`j_}Nm@krFjaCPo z*sT)Ff+RF3f*76fqO;#-{iL_lI;M<wM(Ps=R|xneHE1=O*hd*jBC(K<1>$-hz|er* z33$DLV-~1vvCp)$wO_QnPJFy1Adas}O-)OyIUL1hXhL8ZKotNe<p50(L*t7{T%>_+ z1JK&-@jk77k$*ASs;!{-5qZ8lHD?F1l7nR&4j}Ud;*@~IXXR`rXMoxc!0iUAnygbj zZDmS|A6bxjI{R{I7|9r?0-{0|%U&(!+t3?<rZ2$Y7*JkZa)lCUN()bBWn731Wswp4 zALg=nsbh%<jjFQBN=lMgRvHqYo+;nx!45ws?rDA2B!3q)I?z18fyKtfP}{@jlqBIn zu`(&=j8H_@C<Q8xubut+8=(C=@M{|Q)_A{$VpO?#@ws<z^94L8h(OViwFPdr0Ug8z zb50jN6x}MI;1|1RTY7oBdhcdNC;)Cmx*!uX#0L~H;h#OvKV*PT7mNIlGz>q<-#_ft z6`wmmL4T-XsNj?*2hU&9s?=l^@IdavBG8wDl#GM;7!wZSMmu1hB3^JY7&VOJU3p1^ zt*`Frq7#K%{RQgm`WWr8eVQ15Y?ARICDjCp0hR@fq~CGk0kd@$I{i5G%}u)D*23f& z)8~;TD>LFysW@zZzVcAcsqkIFg76R#6cYYI?QLe;90tbhFc^Q#_P#2rHg&aJn>O~2 zt~e&HD3D<|ob6I&WLkhKB3i0Y$a!3vvRlm-bAMNdsju@H>-O|aj}5t3y~e+TC)_~p mg67T-)623h=k$bUHQa9k90WERPdq~a0000<MNUMnLSTa3m}B|? diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/gridDisabled.svg b/Kieker.WebGUI/src/main/webapp/img/icons/gridDisabled.svg new file mode 100644 index 00000000..91986885 --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/img/icons/gridDisabled.svg @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="102.5625" + height="102.53125" + id="svg2" + version="1.1" + inkscape:version="0.48.2 r9819" + sodipodi:docname="gridDisabled.svg" + inkscape:export-filename="C:\HiWi\kieker.webgui (working copy)\Kieker.WebGUI\src\main\webapp\img\icons\gridEnabled.png" + inkscape:export-xdpi="14.04" + inkscape:export-ydpi="14.04"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.9525" + inkscape:cx="12.916116" + inkscape:cy="44.387869" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1680" + inkscape:window-height="1000" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Ebene 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(4.875,3709.4063)"> + <rect + style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3,3;stroke-dashoffset:0" + id="rect2985" + width="99.549774" + height="99.549774" + x="-3.3704739" + y="-3707.9121" /> + <path + style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4,4;stroke-dashoffset:0" + d="m 19.462225,-3707.1769 0,98.8476" + id="path3755" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path3757" + d="m 74.519853,-3707.9451 0,98.8476" + style="fill:#00000c;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4,4;stroke-dashoffset:0" /> + <path + inkscape:connector-curvature="0" + id="path3757-1" + d="m 46.991037,-3707.4329 0,98.8476" + style="fill:#00000c;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4,4;stroke-dashoffset:0" /> + <path + inkscape:connector-curvature="0" + id="path3784-0" + d="m 95.4441,-3685.6661 -98.8476,0" + style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4,4;stroke-dashoffset:0" /> + <path + style="fill:#00000c;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4,4;stroke-dashoffset:0" + d="m 96.2123,-3630.6084 -98.8476,0" + id="path3786-9" + inkscape:connector-curvature="0" /> + <path + style="fill:#00000c;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4,4;stroke-dashoffset:0" + d="m 95.7001,-3658.1373 -98.8476,0" + id="path3788-4" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/gridEnabled.svg b/Kieker.WebGUI/src/main/webapp/img/icons/gridEnabled.svg new file mode 100644 index 00000000..4a597e6f --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/img/icons/gridEnabled.svg @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="102.5625" + height="102.53125" + id="svg2" + version="1.1" + inkscape:version="0.48.2 r9819" + sodipodi:docname="gridEnabled.svg" + inkscape:export-filename="C:\HiWi\kieker.webgui (working copy)\Kieker.WebGUI\src\main\webapp\img\icons\gridEnabled.png" + inkscape:export-xdpi="28.080439" + inkscape:export-ydpi="28.080439"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="3.905" + inkscape:cx="21.048893" + inkscape:cy="40.977722" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1680" + inkscape:window-height="1000" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Ebene 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(4.875,3709.4063)"> + <rect + style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" + id="rect2985" + width="99.549774" + height="99.549774" + x="-3.3704739" + y="-3707.9121" /> + <g + id="g3777" + transform="translate(-2.723877e-6,0)" + style="fill:none;stroke:#000000;stroke-opacity:0.99215686000000003"> + <path + inkscape:connector-curvature="0" + id="path3755" + d="m 19.462228,-3707.1769 0,98.8476" + style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" /> + <path + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" + d="m 74.519856,-3707.9451 0,98.8476" + id="path3757" + inkscape:connector-curvature="0" /> + <path + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" + d="m 46.99104,-3707.4329 0,98.8476" + id="path3757-1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(-2.723877e-6,0)" + id="g3782" + style="fill:none;stroke:#000000;stroke-opacity:0.99215686000000003"> + <path + style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" + d="m 19.462228,-3707.1769 0,98.8476" + id="path3784" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path3786" + d="m 74.519856,-3707.9451 0,98.8476" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" /> + <path + inkscape:connector-curvature="0" + id="path3788" + d="m 46.99104,-3707.4329 0,98.8476" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" /> + </g> + <g + transform="matrix(0,1,-1,0,-3611.7328,-3705.1283)" + id="g3782-4" + style="fill:none;stroke:#000000;stroke-opacity:0.99215686000000003"> + <path + style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" + d="m 19.462228,-3707.1769 0,98.8476" + id="path3784-0" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path3786-9" + d="m 74.519856,-3707.9451 0,98.8476" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" /> + <path + inkscape:connector-curvature="0" + id="path3788-4" + d="m 46.99104,-3707.4329 0,98.8476" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.99215686000000003;stroke-dasharray:none" /> + </g> + </g> +</svg> -- GitLab