From 48b30c5c5820c8fe5d7547b7c60a6b41e1d873c3 Mon Sep 17 00:00:00 2001 From: Nils Christian Ehmke <nie@informatik.uni-kiel.de> Date: Fri, 7 Jun 2013 15:22:39 +0200 Subject: [PATCH] Started with refactoring of the pages --- .../bin/data/Advanced Example/meta.dat | 5 -- .../Bookstore-Example/Bookstore-Example.kax | 6 -- .../bin/data/Bookstore-Example/meta.dat | 4 +- .../CPU-and-Memory-Example.kax | 14 +++- .../bin/data/CPU-and-Memory-Example/meta.dat | 6 +- .../Timer-Counter-Example.kax | 3 - .../bin/data/Timer-Counter-Example/meta.dat | 6 +- .../Trace-Reconstruction-Example.kax} | 0 .../Trace-Reconstruction-Example/meta.dat | 5 ++ ...kieker-20100830-082225582-UTC-Thread-2.dat | 0 .../testdata/kieker.map | 0 .../kieker/webgui/common/ClassContainer.java | 7 ++ .../kieker/webgui/domain/DisplayType.java | 5 +- .../webgui/service/impl/utility/Analysis.java | 5 ++ .../web/beans/view/CurrentCockpitBean.java | 79 +++++++++++++++++- .../web/beans/view/CurrentControllerBean.java | 10 +++ .../lang/CockpitEditorPage_de.properties | 5 +- .../lang/CockpitEditorPage_en.properties | 5 +- .../resources/lang/CockpitPage_de.properties | 3 - .../resources/lang/CockpitPage_en.properties | 5 +- .../main/resources/lang/Common_de.properties | 1 + .../main/resources/lang/Common_en.properties | 1 + .../resources/lang/LoginPage_de.properties | 13 ++- .../resources/lang/LoginPage_en.properties | 14 ++-- .../lang/ProjectOverviewPage_de.properties | 22 +++-- .../lang/ProjectOverviewPage_en.properties | 22 +++-- Kieker.WebGUI/src/main/webapp/LoginPage.xhtml | 36 +++++--- .../main/webapp/css/AnalysisEditorPage.css | 14 ++++ Kieker.WebGUI/src/main/webapp/css/Common.css | 5 +- Kieker.WebGUI/src/main/webapp/css/Icons.css | 43 +++++----- .../src/main/webapp/css/LoginPage.css | 20 ++--- .../main/webapp/css/ProjectOverviewPage.css | 59 ++++++++++++- .../dialogs/ProjectOverviewPageDialogs.xhtml | 37 ++++---- .../src/main/webapp/img/icons/CopyProject.png | Bin 0 -> 494 bytes .../main/webapp/img/icons/DeleteProject.png | Bin 0 -> 694 bytes .../main/webapp/img/icons/ImportProject.png | Bin 759 -> 1953 bytes .../webapp/img/icons/ImportProjectSmall.png | Bin 0 -> 720 bytes .../main/webapp/img/icons/ManageLibraries.png | Bin 914 -> 2551 bytes .../webapp/img/icons/ManageLibrariesSmall.png | Bin 0 -> 914 bytes .../src/main/webapp/img/icons/NewProject.png | Bin 471 -> 898 bytes .../main/webapp/img/icons/NewProjectSmall.png | Bin 0 -> 471 bytes .../src/main/webapp/img/icons/Reload.png | Bin 792 -> 2018 bytes .../src/main/webapp/img/icons/ReloadSmall.png | Bin 0 -> 792 bytes .../main/webapp/img/icons/RenameProject.png | Bin 0 -> 667 bytes .../src/main/webapp/img/icons/Save.png | Bin 623 -> 1445 bytes .../src/main/webapp/img/icons/SaveAs.png | Bin 623 -> 1445 bytes .../src/main/webapp/img/icons/SaveAsSmall.png | Bin 0 -> 623 bytes .../src/main/webapp/img/icons/SaveSmall.png | Bin 0 -> 623 bytes .../webapp/pages/AnalysisEditorPage.xhtml | 16 +++- .../main/webapp/pages/CockpitEditorPage.xhtml | 9 -- .../src/main/webapp/pages/CockpitPage.xhtml | 12 +-- .../main/webapp/pages/ControllerPage.xhtml | 3 + .../webapp/pages/ProjectOverviewPage.xhtml | 35 ++++++-- 53 files changed, 363 insertions(+), 172 deletions(-) delete mode 100644 Kieker.WebGUI/bin/data/Advanced Example/meta.dat rename Kieker.WebGUI/bin/data/{Advanced Example/Advanced Example.kax => Trace-Reconstruction-Example/Trace-Reconstruction-Example.kax} (100%) create mode 100644 Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/meta.dat rename Kieker.WebGUI/bin/data/{Advanced Example => Trace-Reconstruction-Example}/testdata/kieker-20100830-082225582-UTC-Thread-2.dat (100%) rename Kieker.WebGUI/bin/data/{Advanced Example => Trace-Reconstruction-Example}/testdata/kieker.map (100%) create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/CopyProject.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/DeleteProject.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/ImportProjectSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/ManageLibrariesSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/NewProjectSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/ReloadSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/RenameProject.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/SaveAsSmall.png create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/SaveSmall.png diff --git a/Kieker.WebGUI/bin/data/Advanced Example/meta.dat b/Kieker.WebGUI/bin/data/Advanced Example/meta.dat deleted file mode 100644 index f46da07d..00000000 --- a/Kieker.WebGUI/bin/data/Advanced Example/meta.dat +++ /dev/null @@ -1,5 +0,0 @@ -# -#Sun May 19 16:38:30 CEST 2013 -owner=admin -last\ user=admin -analysis\ layout=id0 -593 -253 348 72;id1 -611 -32 312 72;id2 -243 -32 336 72;id3 133 -38 288 132;id4 479 -26 276 108;id5 1187 -41 468 96;id6 2055 -23 816 144;id7 1119 213 876 84;id8 2033 365 804 84;id9 2051 201 840 144;id10 2817 44 564 72;id11 2919 -71 360 72;id12 3349 -50 372 72;\#id2.2 id3.6 -43.5 -20 -43.5 10;id2.2 id3.5 -43.5 -20 -43.5 -14;id4.12 id5.14 648.5 -26 648.5 -29;id4.12 id7.20 648.5 -26 648.5 225;id5.0 id12.R 1588.5 -47 1588.5 -177 3130.5 -177 3130.5 -38;id6.1 id12.R 2502.5 -53 2502.5 -38;id6.17 id10.29 2502.5 -17 2502.5 56;id7.21 id8.23 1598.5 213 1598.5 365;id7.22 id8.24 1588.5 237 1588.5 389;id9.2 id12.R 3130.5 171 3130.5 -38;id9.27 id10.29 2502.5 231 2502.5 56;id10.3 id12.R 3130.5 56 3130.5 -38;id11.4 id12.R 3130.5 -59 3130.5 -38; diff --git a/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax b/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax index cd65e801..a4892db1 100644 --- a/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax +++ b/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax @@ -48,12 +48,6 @@ </plugins> <dependencies filePath="BookstoreApplication.jar"/> <dependencies filePath="commons-cli-1.2.jar"/> - <views name="Counter View" description="Shows the available counters"> - <displayConnectors name="Invalid Counter" display="//@plugins.3/@displays.2"/> - <displayConnectors name="Valid Counter" display="//@plugins.4/@displays.2"/> - <displayConnectors name="Global Counter" display="//@plugins.5/@displays.2"/> - <displayConnectors name="Global Counter (Meter Gauge)" display="//@plugins.5/@displays.3"/> - </views> <properties name="recordsTimeUnit" value="NANOSECONDS"/> <properties name="projectName" value="AnalysisProject"/> </Project> diff --git a/Kieker.WebGUI/bin/data/Bookstore-Example/meta.dat b/Kieker.WebGUI/bin/data/Bookstore-Example/meta.dat index 684ae968..30e4b3f5 100644 --- a/Kieker.WebGUI/bin/data/Bookstore-Example/meta.dat +++ b/Kieker.WebGUI/bin/data/Bookstore-Example/meta.dat @@ -1,6 +1,6 @@ # -#Tue Jun 04 10:45:34 CEST 2013 +#Thu Jun 06 21:28:46 CEST 2013 owner=admin -cockpit\ layout=0 0 0 1 1 0 1 1 last\ user=user +cockpit\ layout= analysis\ layout=id0 -593 -253 348 72;id1 -671 -51 192 72;id2 -55 -63 336 84;id3 655 35 276 72;id4 315 47 276 84;id5 315 -93 252 84;id6 -399 -51 264 84;id7 643 -97 252 72;\#id2.2 id5.8 144.5 -63 144.5 -81;id2.3 id4.5 144.5 -39 144.5 59;id5.9 id7.14 484.5 -93 484.5 -85; diff --git a/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/CPU-and-Memory-Example.kax b/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/CPU-and-Memory-Example.kax index 298e2d4f..fba9424a 100644 --- a/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/CPU-and-Memory-Example.kax +++ b/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/CPU-and-Memory-Example.kax @@ -10,12 +10,22 @@ <plugins xsi:type="Reader" name="FSReader" classname="kieker.analysis.plugin.reader.filesystem.FSReader"> <properties name="inputDirs" value="data/CPU-and-Memory-Example/testdata"/> <properties name="ignoreUnknownRecordTypes" value="false"/> - <outputPorts name="monitoringRecords" subscribers="//@plugins.0/@inputPorts.0"/> + <outputPorts name="monitoringRecords" subscribers="//@plugins.2/@inputPorts.0"/> </plugins> - <views name="View" description="No description available."> + <plugins xsi:type="Filter" name="RealtimeRecordDelayFilter" classname="kieker.analysis.plugin.filter.forward.RealtimeRecordDelayFilter"> + <properties name="numWorkers" value="1"/> + <properties name="additionalShutdownDelaySeconds" value="5"/> + <properties name="warnOnNegativeSchedTimeSeconds" value="2"/> + <properties name="timerPrecision" value="MILLISECONDS"/> + <outputPorts name="outputRecords" subscribers="//@plugins.0/@inputPorts.0"/> + <inputPorts name="inputRecords"/> + </plugins> + <views name="CPU View" description="No description available."> <displayConnectors name="XYPlot CPU utilization Display" display="//@plugins.0/@displays.0"/> <displayConnectors name="Meter Gauge CPU total utilization Display" display="//@plugins.0/@displays.1"/> </views> + <views name="Memory View" description="No description available."> + </views> <properties name="recordsTimeUnit" value="NANOSECONDS"/> <properties name="projectName" value="AnalysisProject"/> </Project> diff --git a/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/meta.dat b/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/meta.dat index 68896c1d..366b9e18 100644 --- a/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/meta.dat +++ b/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/meta.dat @@ -1,6 +1,6 @@ # -#Thu Jun 06 09:16:16 CEST 2013 +#Thu Jun 06 12:48:33 CEST 2013 owner=admin +last\ user=user cockpit\ layout=0 0 1 0 0 1 -last\ user=admin -analysis\ layout=id0 -1418 -586 336 72;id1 -1140 -428 420 72;id2 -1490 -428 192 72;\#; +analysis\ layout=id0 -495 -241 336 72;id1 223 -83 420 72;id2 -567 -83 192 72;id3 -229 -83 396 72;\#; diff --git a/Kieker.WebGUI/bin/data/Timer-Counter-Example/Timer-Counter-Example.kax b/Kieker.WebGUI/bin/data/Timer-Counter-Example/Timer-Counter-Example.kax index ac222a44..15e805d1 100644 --- a/Kieker.WebGUI/bin/data/Timer-Counter-Example/Timer-Counter-Example.kax +++ b/Kieker.WebGUI/bin/data/Timer-Counter-Example/Timer-Counter-Example.kax @@ -47,9 +47,6 @@ <displayConnectors name="Timestamp Records (Meter Gauge)" display="//@plugins.3/@displays.3"/> <displayConnectors name="Timestamps (Meter Gauge)" display="//@plugins.4/@displays.3"/> </views> - <views name="Only Records View" description="No description available."> - <displayConnectors name="Timestamp Records" display="//@plugins.3/@displays.1"/> - </views> <properties name="recordsTimeUnit" value="NANOSECONDS"/> <properties name="projectName" value="AnalysisProject"/> </Project> diff --git a/Kieker.WebGUI/bin/data/Timer-Counter-Example/meta.dat b/Kieker.WebGUI/bin/data/Timer-Counter-Example/meta.dat index 8fbfbb64..3b4da792 100644 --- a/Kieker.WebGUI/bin/data/Timer-Counter-Example/meta.dat +++ b/Kieker.WebGUI/bin/data/Timer-Counter-Example/meta.dat @@ -1,6 +1,6 @@ # -#Sun Jun 02 11:24:25 CEST 2013 +#Thu Jun 06 21:29:55 CEST 2013 owner=admin -last\ user=admin -cockpit\ layout=0 0 0 1 0 2 1 0 1 1 1 2 0 3 1 3 0 0 +cockpit\ layout=0 0 0 1 0 2 1 0 1 1 1 2 0 3 1 3 +last\ user=user analysis\ layout=id0 -2221 -900 336 72;id1 -2281 -618 216 84;id2 -1547 -748 204 72;id3 -1547 -618 204 72;id4 -1911 -606 396 84;id5 -1911 -740 312 84;\#id1.0 id5.9 -2142.5 -619.5 -2142.5 -729.5;id5.10 id2.2 -1682.5 -741.5 -1682.5 -737.5; diff --git a/Kieker.WebGUI/bin/data/Advanced Example/Advanced Example.kax b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/Trace-Reconstruction-Example.kax similarity index 100% rename from Kieker.WebGUI/bin/data/Advanced Example/Advanced Example.kax rename to Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/Trace-Reconstruction-Example.kax diff --git a/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/meta.dat b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/meta.dat new file mode 100644 index 00000000..a4c86b3b --- /dev/null +++ b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/meta.dat @@ -0,0 +1,5 @@ +# +#Thu Jun 06 21:28:29 CEST 2013 +owner=admin +last\ user=user +analysis\ layout=id0 -495 -241 336 72;id1 -507 -20 312 72;id2 -139 -20 336 72;id3 237 -26 288 132;id4 583 -14 276 108;id5 1291 -29 468 96;id6 2159 -11 816 144;id7 1223 225 876 84;id8 2137 377 804 84;id9 2155 213 840 144;id10 2921 56 564 72;id11 3023 -59 360 72;id12 3453 -38 372 72;\#id2.2 id3.6 60.5 -8.5 60.5 21.5;id2.2 id3.5 60.5 -8.5 60.5 -2.5;id4.12 id5.15 752.5 -14.5 752.5 -17.5;id4.12 id7.22 752.5 -14.5 752.5 236.5;id5.14 id12.R 1692.5 -35.5 1692.5 -165.5 3234.5 -165.5 3234.5 -26.5;id6.17 id12.R 2606.5 -41.5 2606.5 -26.5;id6.19 id10.33 2606.5 -5.5 2606.5 67.5;id7.23 id8.25 1702.5 224.5 1702.5 376.5;id7.24 id8.26 1692.5 248.5 1692.5 400.5;id9.27 id12.R 3234.5 182.5 3234.5 -26.5;id9.30 id10.33 2606.5 242.5 2606.5 67.5;id10.32 id12.R 3234.5 67.5 3234.5 -26.5;id11.34 id12.R 3234.5 -47.5 3234.5 -26.5; diff --git a/Kieker.WebGUI/bin/data/Advanced Example/testdata/kieker-20100830-082225582-UTC-Thread-2.dat b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/testdata/kieker-20100830-082225582-UTC-Thread-2.dat similarity index 100% rename from Kieker.WebGUI/bin/data/Advanced Example/testdata/kieker-20100830-082225582-UTC-Thread-2.dat rename to Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/testdata/kieker-20100830-082225582-UTC-Thread-2.dat diff --git a/Kieker.WebGUI/bin/data/Advanced Example/testdata/kieker.map b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/testdata/kieker.map similarity index 100% rename from Kieker.WebGUI/bin/data/Advanced Example/testdata/kieker.map rename to Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/testdata/kieker.map diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassContainer.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassContainer.java index fecc5c8d..b8215482 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassContainer.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassContainer.java @@ -24,6 +24,7 @@ import kieker.analysis.display.HtmlText; import kieker.analysis.display.Image; import kieker.analysis.display.MeterGauge; import kieker.analysis.display.PlainText; +import kieker.analysis.display.TagCloud; import kieker.analysis.display.XYPlot; import kieker.analysis.display.annotation.Display; import kieker.analysis.plugin.AbstractPlugin; @@ -66,6 +67,7 @@ public class ClassContainer { private Class<?> htmlTextClass; private Class<?> xyPlotClass; private Class<?> meterGaugeClass; + private Class<?> tagCloudClass; private Class<? extends Annotation> pluginAnnotationClass; private Class<? extends Annotation> repositoryAnnotationClass; @@ -101,6 +103,7 @@ public class ClassContainer { this.imageClass = classLoader.loadClass(Image.class.getName()); this.xyPlotClass = classLoader.loadClass(XYPlot.class.getName()); this.meterGaugeClass = classLoader.loadClass(MeterGauge.class.getName()); + this.tagCloudClass = classLoader.loadClass(TagCloud.class.getName()); // Now we load the more specific annotation classes this.pluginAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Plugin.class.getName()); @@ -197,4 +200,8 @@ public class ClassContainer { return this.meterGaugeClass; } + public Class<?> getTagCloudClass() { + return this.tagCloudClass; + } + } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/DisplayType.java b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/DisplayType.java index d9f48669..a3fd472e 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/DisplayType.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/DisplayType.java @@ -32,6 +32,7 @@ public enum DisplayType { /** Represents the image display type. */ IMAGE, /** Represents the meter gauge display type. */ - METER_GAUGE - + METER_GAUGE, + /** Represents the tag cloud display type. */ + TAG_CLOUD } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/utility/Analysis.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/utility/Analysis.java index 1707f71c..66c411ec 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/utility/Analysis.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/utility/Analysis.java @@ -186,6 +186,9 @@ public class Analysis { if (STATE.TERMINATED.toString().equals(state.toString())) { retState = STATE.TERMINATED; } + if (STATE.TERMINATING.toString().equals(state.toString())) { + retState = STATE.TERMINATING; + } } return retState; } catch (final MirrorException ex) { @@ -267,6 +270,8 @@ public class Analysis { return DisplayType.XY_PLOT; } else if (parameter == this.classContainer.getMeterGaugeClass()) { return DisplayType.METER_GAUGE; + } else if (parameter == this.classContainer.getTagCloudClass()) { + return DisplayType.TAG_CLOUD; } else { return null; } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java index 831d78e1..cac899a9 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java @@ -20,12 +20,15 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; import javax.faces.application.Application; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; +import javax.faces.component.UISelectItem; import javax.faces.component.html.HtmlOutputText; import javax.faces.context.FacesContext; +import javax.faces.model.SelectItem; import kieker.analysis.AnalysisController; import kieker.analysis.model.analysisMetaModel.MIDisplayConnector; @@ -48,6 +51,7 @@ import org.primefaces.component.chart.metergauge.MeterGaugeChart; import org.primefaces.component.dashboard.Dashboard; import org.primefaces.component.panel.Panel; import org.primefaces.component.selectcheckboxmenu.SelectCheckboxMenu; +import org.primefaces.component.tagcloud.TagCloud; import org.primefaces.model.DashboardColumn; import org.primefaces.model.DashboardModel; import org.primefaces.model.DefaultDashboardColumn; @@ -55,6 +59,9 @@ import org.primefaces.model.DefaultDashboardModel; import org.primefaces.model.chart.CartesianChartModel; import org.primefaces.model.chart.LineChartSeries; import org.primefaces.model.chart.MeterGaugeChartModel; +import org.primefaces.model.tagcloud.DefaultTagCloudItem; +import org.primefaces.model.tagcloud.DefaultTagCloudModel; +import org.primefaces.model.tagcloud.TagCloudModel; import net.vidageek.mirror.dsl.Mirror; import net.vidageek.mirror.exception.MirrorException; @@ -234,6 +241,16 @@ public class CurrentCockpitBean { return false; } + public boolean isAnalysisTerminating() { + try { + return this.projectService.getCurrentState(this.projectName) == AnalysisController.STATE.TERMINATING; + } catch (final NullPointerException ex) { + // This exception can occur, when the projectsBean has not been initialized + LOG.warn("A null pointer exception occured.", ex); + } + return false; + } + /** * Checks whether the analysis is currently in the failed state. * @@ -280,6 +297,9 @@ public class CurrentCockpitBean { case METER_GAUGE: this.updateMeterGaugeDisplay(component, displayConnector.getName()); break; + case TAG_CLOUD: + this.updateTagCloudDisplay(component, displayConnector.getName()); + break; default: // Unknown type this.updateDisplayWithDefaultContent(component); @@ -435,6 +455,54 @@ public class CurrentCockpitBean { } } + @SuppressWarnings("unchecked") + private void updateTagCloudDisplay(final UIComponent component, final String displayConnectorName) { + final boolean isAlreadyCorrectlyInitialized = (component.getChildCount() == 1) && (component.getChildren().get(0) instanceof MeterGaugeChart); + + final TagCloudModel tagCloudModel; + + // Avoid unnecessary component creation. Use the existing components if they are already existing and from the correct type. + if (isAlreadyCorrectlyInitialized) { + final TagCloud tagCloud = (TagCloud) component.getChildren().get(0); + tagCloudModel = tagCloud.getModel(); + } else { + final FacesContext facesContext = FacesContext.getCurrentInstance(); + final Application application = facesContext.getApplication(); + + // Create the Primefaces chart component + final TagCloud tagCloud = (TagCloud) application.createComponent(facesContext, "org.primefaces.component.TagCloud", + "org.primefaces.component.TagCloudRenderer"); + + // Add the corresponding model + tagCloudModel = new DefaultTagCloudModel(); + tagCloud.setModel(tagCloudModel); + + component.getChildren().clear(); + component.getChildren().add(tagCloud); + } + + try { + final Object displayObj = this.projectService.getDisplay(this.projectName, this.activeView.getName(), displayConnectorName); + + final Map<String, AtomicLong> counters = (Map<String, AtomicLong>) new Mirror().on(displayObj).invoke().method("getCounters").withoutArgs(); + System.out.println(counters); + tagCloudModel.clear(); + for (final Map.Entry<String, AtomicLong> counter : counters.entrySet()) { + tagCloudModel.addTag(new DefaultTagCloudItem(counter.getKey(), (int) counter.getValue().get())); + } + + } catch (final DisplayNotFoundException ex) { + CurrentCockpitBean.LOG.warn("Display not found.", ex); + this.updateDisplayWithDefaultContent(component); + } catch (final MirrorException ex) { + CurrentCockpitBean.LOG.warn("Reflection exception.", ex); + this.updateDisplayWithDefaultContent(component); + } catch (final InvalidAnalysisStateException ex) { + CurrentCockpitBean.LOG.info("Project is in invalid state.", ex); + this.updateDisplayWithDefaultContent(component); + } + } + @SuppressWarnings("unchecked") private void updateMeterGaugeDisplay(final UIComponent component, final String displayConnectorName) { final boolean isAlreadyCorrectlyInitialized = (component.getChildCount() == 1) && (component.getChildren().get(0) instanceof MeterGaugeChart); @@ -472,6 +540,7 @@ public class CurrentCockpitBean { meterGaugeChartModel.setValue(0); } else { final List<Number> intervals = (List<Number>) new Mirror().on(displayObj).invoke().method("getIntervals").withArgs(keys.iterator().next()); + final List<String> colors = (List<String>) new Mirror().on(displayObj).invoke().method("getIntervalColors").withArgs(keys.iterator().next()); final Number value = (Number) new Mirror().on(displayObj).invoke().method("getValue").withArgs(keys.iterator().next()); if (intervals.isEmpty()) { @@ -480,7 +549,7 @@ public class CurrentCockpitBean { } else { meterGaugeChartModel.setIntervals(intervals); meterGaugeChart.setShadow(true); - meterGaugeChart.setSeriesColors("66cc66, 93b75f, E7E658, cc6666"); + meterGaugeChart.setSeriesColors(colors.toString().replace("[", "").replace("]", "")); final Number maxInterval = intervals.get(intervals.size() - 1); if (value.doubleValue() <= maxInterval.doubleValue()) { meterGaugeChartModel.setValue(value); @@ -543,6 +612,13 @@ public class CurrentCockpitBean { final Object displayObj = this.projectService.getDisplay(this.projectName, this.activeView.getName(), displayConnectorName); final Set<String> keys = (Set<String>) new Mirror().on(displayObj).invoke().method("getKeys").withoutArgs(); + selectCheckboxMenu.getChildren().clear(); + for (final String key : keys) { + final UISelectItem item = new UISelectItem(); + item.setValue(new SelectItem(key)); + selectCheckboxMenu.getChildren().add(item); + } + if (keys.isEmpty()) { lineChartSeries.set(0, 0); } else { @@ -566,5 +642,4 @@ public class CurrentCockpitBean { } } - } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java index 33c53437..1c345b02 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java @@ -158,6 +158,16 @@ public class CurrentControllerBean { return false; } + public boolean isAnalysisTerminating() { + try { + return this.projectService.getCurrentState(this.projectName) == AnalysisController.STATE.TERMINATING; + } catch (final NullPointerException ex) { + // This exception can occur, when the projectsBean has not been initialized + CurrentControllerBean.LOG.warn("A null pointer exception occured.", ex); + } + return false; + } + /** * Checks whether the analysis is currently in the ready state. * diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties index 2cbc58d6..870ad76d 100644 --- a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties @@ -10,7 +10,4 @@ copyView = Ansicht Kopieren renameView = Ansicht Umbenennen deleteView = Ansicht L�schen -name = Name - -msgCockpitEditorWelcomeShort = Entwicklungsphase -msgCockpitEditorWelcome = Der Cockpit Editor befindet sich zur Zeit noch in der Entwicklungsphase. \ No newline at end of file +name = Name \ 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 index 55dadc86..71f62abf 100644 --- a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties @@ -10,7 +10,4 @@ copyView = Copy View renameView = Rename View deleteView = Delete View -name = Name - -msgCockpitEditorWelcomeShort = Development Stage -msgCockpitEditorWelcome = The cockpit editor is still in the development stage. \ No newline at end of file +name = Name \ 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 index 629ae3d3..1476d0e5 100644 --- a/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties @@ -4,6 +4,3 @@ # welche innerhalb des Cockpits benutzt werden. # #------------------------------------------------------------------------------ - -msgCockpitWelcomeShort = Entwicklungsphase -msgCockpitWelcome = Das Cockpit befindet sich zur Zeit noch in der Entwicklungsphase. \ 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 index 868dd2a1..0836a7cf 100644 --- a/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties @@ -3,7 +3,4 @@ # This file contains all messages, button captions etc. which are used within # the cockpit page. # -#------------------------------------------------------------------------------ - -msgCockpitWelcomeShort = Development Stage -msgCockpitWelcome = The cockpit is still in the development stage. \ No newline at end of file +#------------------------------------------------------------------------------ \ 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 index e1738aca..efe5c8b5 100644 --- a/Kieker.WebGUI/src/main/resources/lang/Common_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/Common_de.properties @@ -48,6 +48,7 @@ stateReady = Bereit stateRunning = L�uft stateTerminated = Beendet stateFailed = Absturz +stateTerminating = Beim Beenden #------------------------------------------------------------------------------ # diff --git a/Kieker.WebGUI/src/main/resources/lang/Common_en.properties b/Kieker.WebGUI/src/main/resources/lang/Common_en.properties index badbab4a..3124574c 100644 --- a/Kieker.WebGUI/src/main/resources/lang/Common_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/Common_en.properties @@ -48,6 +48,7 @@ stateReady = Ready stateRunning = Running stateTerminated = Terminated stateFailed = Failed +stateTerminating = Terminating #------------------------------------------------------------------------------ # diff --git a/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties index 185013d2..270f895c 100644 --- a/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties @@ -1,18 +1,17 @@ -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- # -# Diese Datei beinhaltet s\u00e4mtliche Nachrichten, Buttonbeschriftungen etc., -# welche innerhalb der Anmeldeseite benutzt werden. +# Diese Datei beinhaltet s\u00e4mtliche lokalisierten Texte, 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. Benutzen sie den Benutzer "admin" mit dem Passwort "kieker" um sich anzumelden und fortzufahren. +msgWelcome = Dies ist eine Beta Version der Kieker Web GUI. Deshalb kann diese noch Bugs enthalten und einige Funktionalit\u00e4ten sind m\u00f6glicherweise noch nicht implementiert. Benutzen sie den Benutzer "admin" mit dem Passwort "kieker" um sich anzumelden und fortzufahren. + username = Benutzername password = Passwort - login = Anmelden -loginFailed = Login fehlgeschlagen. +loginFailed = Login fehlgeschlagen. logout = Sie haben sich erfolgreich ausgeloggt. hint = Hinweis: Die Kieker.WebGUI ben\u00f6tigt 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 index 00fc5c59..f5349597 100644 --- a/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties @@ -1,19 +1,17 @@ -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- # -# This file contains all messages, button captions etc. which are used within -# the login page. +# This file contains all localized texts, 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. Use the user "admin" with the password "kieker" to login and continue. +msgWelcome = This is a beta version of the Kieker Web GUI. Therefore it may contain bugs and some functionality may have not been implemented yet. Use the user "admin" with the password "kieker" to login and continue. username = Username password = Password - login = Login -loginFailed = Login failed. +loginFailed = Login failed. logout = You have logged out successfully. -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 +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 index f26b7405..7234f9e8 100644 --- a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties @@ -1,17 +1,22 @@ -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- # -# Diese Datei beinhaltet s\u00e4mtliche Nachrichten, Buttonbeschriftungen etc., -# welche innerhalb der Projekt\u00fcbersichtsseite benutzt werden. +# Diese Datei beinhaltet s\u00e4mtliche Texte, welche innerhalb der Projekt\u00fcbersichtsseite benutzt werden. # -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- + +msgReallyDeleteProject = M\u00f6chten Sie das ausgew\u00e4hlte Projekt wirklich l\u00f6schen? + +tooltipNewProject = Erstellt ein neues Projekt +tooltipImportProject = Importiert ein bereits existentes Projekt in die Anwendung +tooltipReloadProjectsList = Aktualisiert die Liste von verfügbaren Projekten newProject = Neues Projekt importProject = Projekt Importieren refreshProjectsList = Projektliste Aktualisieren projectName = Projektname -state = Status -lastModification = Letzte \u00c4nderung +state = Status der Analyse +lastModification = \u00c4nderungsdatum owner = Besitzer lastEditor = Letzter Bearbeiter @@ -20,6 +25,5 @@ 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 +file = Datei +newName = Neuer Name \ 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 index b915b322..100d37ee 100644 --- a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties @@ -1,17 +1,22 @@ -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- # -# This file contains all messages, button captions etc. which are used within -# the project overview page. +# This file contains all texts, which are used within the project overview page. # -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- + +msgReallyDeleteProject = Do you really want to delete the selected project? + +tooltipNewProject = Creates a new project +tooltipImportProject = Imports an already existing project into the application +tooltipReloadProjectsList = Refreshes the list of available projects newProject = New Project importProject = Import Project refreshProjectsList = Refresh Projects List projectName = Project Name -state = State -lastModification = Last Modification +state = State of the Analysis +lastModification = Date of Change owner = Owner lastEditor = Last Editor @@ -20,6 +25,5 @@ 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 +file = File +newName = New Name \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml b/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml index c6b6a1ee..85faf4ac 100644 --- a/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml @@ -8,71 +8,81 @@ xmlns:c="http://java.sun.com/jsp/jstl/core"> <h:head/> - + <h:body> <ui:composition template="#{root}/templates/DefaultTemplate.xhtml"> + <!-- We use a view parameter named "state" here. It defines whether a login failed or whether the user just logged out. --> <ui:define name="metadata"> - <f:metadata> + <f:metadata> <f:viewParam id="state" name="state"/> </f:metadata> </ui:define> + <!-- Import the localized strings. --> <ui:define name="bundleIncludes"> <f:loadBundle var="localizedLoginMessages" basename="lang.LoginPage"/> </ui:define> + <!-- Import the CSS file for this page. --> <ui:define name="additionalCssIncludes"> <link rel="stylesheet" type="text/css" href="#{root}/css/LoginPage.css" /> </ui:define> + <!-- This JavaScript code will be executed in the onload-part of the body. It shows a localized welcome message using the growl component. --> <ui:define name="js"> - <!-- This javascript code will be executed in the onload-part of the body and shows a localized welcome message via the growl-component. --> <script> bodyLoaded = function() { - msgs.renderMessage({summary : '#{localizedLoginMessages.msgWelcomeShort}', detail : '#{localizedLoginMessages.msgWelcome}', severity: 'info'}); - } + msgs.renderMessage({ + summary : '#{localizedLoginMessages.msgWelcomeShort}', + detail : '#{localizedLoginMessages.msgWelcome}', + severity: 'info'}); + }; </script> </ui:define> + <!-- This definition contains the login form. It uses the Spring framework to perform the actual login. --> <ui:define name="inner-content"> <form id="loginForm" action="#{root}/j_spring_security_check" method="post"> - <p:panel header="#{localizedLoginMessages.msgWelcomeShort}" styleClass="login-panel"> - <h:panelGrid columnClasses="col1 , col2" styleClass="grid" columns="2" cellpadding="5" > + <p:panel header="#{localizedLoginMessages.msgWelcomeShort}" styleClass="login-form-panel"> + <h:panelGrid columnClasses="login-form-col-1, login-form-col-2" styleClass="login-form-grid" columns="2" cellpadding="5" > <h:outputLabel for="j_username" value="#{localizedLoginMessages.username}:" /> - <p:inputText styleClass="input" id="j_username" required="true" label="username" /> + <p:inputText styleClass="login-form-input" id="j_username" required="true" /> <h:outputLabel for="j_password" value="#{localizedLoginMessages.password}:" /> - <p:password styleClass="input" id="j_password" required="false" label="password" /> + <p:password styleClass="login-form-input" id="j_password" required="false" /> </h:panelGrid> <hr/> <div align="right"> + <!-- There are problems with the button and the command button of Primefaces. We therefore use a default button and add some additional + skins. --> <button type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"> <span class="ui-button-text">#{localizedLoginMessages.login}</span> </button> </div> </p:panel> + <!-- This code shows a hint panel depending on the given view parameter. --> <c:if test="#{state == 'logout'}"> - <div class="hint-panel"> + <div class="login-form-hint-panel"> <p:spacer width="0" height="25"/> <h:outputText value="#{localizedLoginMessages.logout}"/><br/> </div> </c:if> <c:if test="#{state == 'fail'}"> - <div class="hint-panel"> + <div class="login-form-hint-panel"> <p:spacer width="0" height="25" /> <h:outputText style="color: red" value="#{localizedLoginMessages.loginFailed}"/><br/> </div> </c:if> <p:spacer width="0" height="40"/> - <div class="hint-panel"> + <div class="login-form-hint-panel"> <h:outputText value="#{localizedLoginMessages.hint}"/> </div> </form> </ui:define> </ui:composition> - + </h:body> </html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css b/Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css index 1889c5a7..8ad1e4b7 100644 --- a/Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css +++ b/Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css @@ -32,4 +32,18 @@ font-size:10px; font-family:Verdana, Geneva, Arial, Helvetica, sans-serif; padding:7px; +} + +/* The following code is for icon definition. */ + +.ui-icon-manageLibraries { + background: url('../img/icons/ManageLibraries.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-manageLibrariesSmall { + background: url('../img/icons/ManageLibrariesSmall.png') no-repeat !important; + height:16px; + width:16px; } \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/Common.css b/Kieker.WebGUI/src/main/webapp/css/Common.css index 6cf1da11..6f59699e 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Common.css +++ b/Kieker.WebGUI/src/main/webapp/css/Common.css @@ -1,11 +1,11 @@ @charset "UTF-8"; .ui-growl { - width: 500px + width: 35% !important; } .ui-growl-message { - width: 400px; + width: 90% !important; text-align: justify; } @@ -15,6 +15,7 @@ .ui-layout-north { z-index: 20 !important; overflow: visible !important; + border-style: none !important; } .ui-layout-north .ui-layout-unit-content { diff --git a/Kieker.WebGUI/src/main/webapp/css/Icons.css b/Kieker.WebGUI/src/main/webapp/css/Icons.css index 88818fe7..fdf90f2c 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Icons.css +++ b/Kieker.WebGUI/src/main/webapp/css/Icons.css @@ -6,12 +6,6 @@ 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; @@ -141,24 +135,24 @@ .ui-icon-save { background: url('../img/icons/Save.png') no-repeat !important; - height:16px; - width:16px; + height:32px; + width:32px; } .ui-icon-saveAs { background: url('../img/icons/SaveAs.png') no-repeat !important; - height:16px; - width:16px; + height:32px; + width:32px; } -.ui-icon-newProject { - background: url('../img/icons/NewProject.png') no-repeat !important; +.ui-icon-saveSmall { + background: url('../img/icons/SaveSmall.png') no-repeat !important; height:16px; width:16px; } -.ui-icon-importProject { - background: url('../img/icons/ImportProject.png') no-repeat !important; +.ui-icon-saveAsSmall { + background: url('../img/icons/SaveAsSmall.png') no-repeat !important; height:16px; width:16px; } @@ -175,12 +169,6 @@ 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; @@ -197,4 +185,17 @@ background: url('../img/icons/Delete.png') no-repeat !important; height:16px; width:16px; -} \ No newline at end of file +} + +.ui-icon-reload { + background: url('../img/icons/Reload.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-reloadSmall { + background: url('../img/icons/ReloadSmall.png') no-repeat !important; + height:16px; + width:16px; +} + diff --git a/Kieker.WebGUI/src/main/webapp/css/LoginPage.css b/Kieker.WebGUI/src/main/webapp/css/LoginPage.css index ad91576c..d6febd73 100644 --- a/Kieker.WebGUI/src/main/webapp/css/LoginPage.css +++ b/Kieker.WebGUI/src/main/webapp/css/LoginPage.css @@ -1,37 +1,37 @@ @charset "UTF-8"; -.ui-panel { - font-size: 12px; -} - -.col1 { +.login-form-col-1 { width: fit-content !important; text-align: right; } -.col2 { +.login-form-col-2 { width: 100% !important; } -.input { +.login-form-input { width: 100% !important; } -.grid { +.login-form-grid { width: 100% !important; } -.login-panel { +.login-form-panel { width: 50%; text-align: center; } -.hint-panel { +.login-form-hint-panel { width: 50%; text-align: center; font-size: 11px; } +.ui-panel { + font-size: 12px; +} + .ui-growl { width: 500px } diff --git a/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css b/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css index f506fa16..babbf995 100644 --- a/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css +++ b/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css @@ -1,9 +1,66 @@ @charset "UTF-8"; +.import-dialog-col-1 { + width: fit-content !important; + text-align: right; +} + +.import-dialog-col-2 { + +} + .ui-datatable-header { font-size: 12px; } .ui-datatable-footer { - font-size: 12px; + font-size: 12px; +} + +.ui-layout-center { + border-style: none !important; +} + +/* The following code is for icon definition. */ + +.ui-icon-newProjectSmall { + background: url('../img/icons/NewProjectSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-newProject { + background: url('../img/icons/NewProject.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-importProject { + background: url('../img/icons/ImportProject.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-importProjectSmall { + background: url('../img/icons/ImportProjectSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-copyProject { + background: url('../img/icons/CopyProject.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-renameProject { + background: url('../img/icons/RenameProject.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-deleteProject { + background: url('../img/icons/DeleteProject.png') no-repeat !important; + height:16px; + width:16px; } \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml index 99ea950a..1e41117e 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml @@ -24,6 +24,8 @@ </p:dialog> <!-- ******************************************************************************** --> + <!-- ******************************************************************************** --> + <!-- This is the dialog to rename a project. --> <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" /> @@ -40,7 +42,10 @@ </div> </h:form> </p:dialog> + <!-- ******************************************************************************** --> + <!-- ******************************************************************************** --> + <!-- This is the dialog to delete a project. --> <p:dialog id="deleteProjectDlg" header="#{localizedProjectOverviewMessages.deleteProject}" resizable="false" modal="true" widgetVar="deleteProjectDialog"> <h:form id="deleteProjectDialogForm"> @@ -54,7 +59,10 @@ </div> </h:form> </p:dialog> + <!-- ******************************************************************************** --> + <!-- ******************************************************************************** --> + <!-- This is the dialog to copy a project. --> <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" /> @@ -71,37 +79,28 @@ </div> </h:form> </p:dialog> + <!-- ******************************************************************************** --> - <p:dialog header="Save Project" resizable="false" modal="true" widgetVar="forceSaveDlg"> - <h:form> - <div style="text-align: center"> - <h:outputText value="The project has been modified externally in the meanwhile. Do you want to overwrite the changes?" /> - </div> - <hr/> - <div style="text-align: right"> - <p:commandButton value="Yes" action="#{currentCockpitEditorBean.saveProject(true)}" oncomplete="forceSaveDlg.hide()" update=":messages" /> - <p:spacer width="10px" height="10" /> - <p:commandButton value="Cancel" onclick="forceSaveDlg.hide()" /> - </div> - </h:form> - </p:dialog> - + <!-- ******************************************************************************** --> + <!-- This is the dialog to import a project. --> <p:dialog id="importProjectDlg" header="#{localizedProjectOverviewMessages.importProject}" resizable="false" modal="true" widgetVar="importProjectDialog"> <!-- Make sure that closing of the dialog also clears the input field. --> <p:ajax event="close" update="importProjectDialogForm:newProjectInputText" /> <h:form id="importProjectDialogForm" enctype="multipart/form-data"> - <div style="text-align: left"> + <h:panelGrid columnClasses="import-dialog-col-1, import-dialog-col-2" styleClass="login-form-grid" columns="2" cellpadding="5" > <h:outputText value="#{localizedProjectOverviewMessages.name}: " /> - <p:inputText id="newProjectInputText" value="#{stringBean.string}" style="width: 95%" /> - <br/> <br/> - <p:fileUpload allowTypes="kax" mode="simple" value="#{uploadFileBean.file}"/> - </div> + <p:inputText id="newProjectInputText" value="#{stringBean.string}" /> + <h:outputText value="#{localizedProjectOverviewMessages.file}: " /> + <p:fileUpload allowTypes="kax" mode="simple" value="#{uploadFileBean.file}"/> + </h:panelGrid> <hr/> <div style="text-align: right"> <p:commandButton value="#{localizedMessages.ok}" update=":projectsListForm :messages" action="#{projectsBean.uploadProject(stringBean.string, uploadFileBean.file, currentProjectOverviewBean, userBean)}" ajax="false" oncomplete="importProjectDialog.hide()" /> </div> </h:form> </p:dialog> + <!-- ******************************************************************************** --> + </ui:composition> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/CopyProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/CopyProject.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f287c47e2e4f05b95781f0059212e25ecc4f73 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7w|crbhE&{|I_Y%QAqSDR zbd7t9O(g>7EAE)!74sq}R>Vu&tK_BEcfG5v4-S=IcvI7`&!O-#Ta<=~$V;v2l~bhl zD41nE_mS@S*!1_Ifn?j~kN=;uO!r!PI&JgMa|S*fGq=R(?H6&~Da!ItP*zY+gv-%$ zlF0PaPfhG{wnv-HK6{~R?>`y7_9Uf=FaAm!%s>C~d(y^$-+%x4YE7-O;VKZCDQ`ZT z_lU!+WefS0w%@L`m*81aV)b_ydx3?_IcC0<!VJD@!cRU{T&S>-JGrUG_t!lQh56^_ zv%FwpkTfZER_d+Vdr!7;Pk_Vn%a#(3<qWJ0(^4;%ShXHJRO5Cx&%DPqa0$a^<_x2G zt5zw^KkxpYL1C$>6tCR#B1^6fx8JHOGc-K5XfeF@d{OA?P`UKYHxqW>waaF!+g~p~ z;bh9Wq6N%6voF5-YSlmaq{{8At@BRw?fs?PSSZ$gbk%cq$9E124zdj=%<32mI$e}{ zu4e6RU|WB^JA3ObXA`Ntw|+kUCsq2Ep+`%sd&U)GMvmo5vaA!fJ}TO&b3DoLpv1u) zK^L;NUecQCB_Y4)_~XKPXB1NMOy=G<o9+9LadM)7+>(t-jSLJ744$rjF6*2UngFw~ B*4_XB literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/DeleteProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/DeleteProject.png new file mode 100644 index 0000000000000000000000000000000000000000..a546aad5eab4f6668e5daefabc07e11e6a483484 GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!toYCT;XLn>}1rz{XK;L~IF z@?LGRbjgy(y1Hk#rlc-C`twJ{&Koyw{QLLg<Kx$>!}I6e+x7LqndScRVeW3f{vOYA zh>cC&vTIk`@`VczDn~}HoG&9I!{g)A!&CqNUvkCwcgn{ntDk@R{@&i#a&mG7lB*fl zu9e-Ws_M$Uum1nP=kM?DkKeI#=f8~`HZ&}`VPEs(&+EIp%jdZF%We1a>Dk$Fwc*^k zc{iGx_OR}+|Nryf|Nr~@=gg7e>FMd=`Ty_l<C?#}{(jew-^cOhe*FP0TU*ZEjIpt` z8!Ibse*XXG=kLc~zh9ppwm0_R*YE%1-QpGR|8J^y*<bhjS7^fZb$i1sEi-q-To9i< zd9vaE`}_af-}2x7xAx@Urk~IE&+qBcpDAH|w(8#g+TVN`2l7@wdKB}9ZOiuW$I?=l zp1WUHdi;L1{kuAUGyh*|2h<K+*s?#;VYcu0)mH1(u77)Ly*4Y$YoqjqOP6G4PZ2S% z|Fp34zkR`;|Aq&%4=p#}f6u_*&Sd8QyNCJrKmIyt=Jwp%iC1q$b>D4Rwrt&vj*baG z&+oJU8C$fd<Knp+@4j!}e_tX$cK^{^Nq0W}`@Q=9p4;2sZ+P`G^H`pPudnx-)vF&f z85&Ofum8_JJtZ|gx#IIz-sT(ioNUMPb?oQcR-fEb{ax>~r1399-h{NY#7$dEJ?5F^ ze$tVY%q;lw_ut>?j5D|-_tpJ9_u<pi?6%w6<^Q~Y{d&XBvbT>46Rdvrzhm;Vv#aZ0 zwCK}KPR_zZN=i*UYu2oBc=-Q7$%pw5-`@VtQ~X@7=E9{Q@lU_M>rdeRw?LX9so2QS zkh8P9`}OM8*&5v3+#mn3H<{<(+q1v!@2|7l^Y6zo7TGg>^q--|Fq7L%AvT2}kb!}L N!PC{xWt~$(69AGEc!2-_ literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png index 1279be4f8df032f4f93395f70ef9fa87fd001920..a29d2103e2793e548afd5ee04f3a502ad034af9a 100644 GIT binary patch literal 1953 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 literal 759 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to_IbKEhE&{2ogD8GoG5bO z{NL@B@6DEnPi$P`!j_uy|I0IHeO>vQNlmt@UlP7t@Rs6Klyvzq!DF^X{FWIU6Hi?| zb+Kv!M=8&?b_D^kAD0%WPU{oMo?ZTZ_x9rVCH1%1+u#2_SAOoj_4Ath3m2rQ2z90f zibzgNHBI*CNGy%r9xM{t|H#R*?f0?@n}2bWmP|-=mbK*Px1YwwF7LuC>wEct0gpuS zODV=>xdsw3Gw02F$Jgpq#dzWF-QwiLhhL=`ct40;d7-*7Fkxds!qzC?3!grHQeS`l z_SSv-;#f+`;y$0z*EzN4K(klL1rynlzb9lJLjO0cKG>+x&H3SHP3*&h9UK$%cH0&g zcN-m!^kuLVnVO(0FzufI!I{BI98C#J5}1@GdI(-n+-d7S|Lm!=zJ7aT`Q{2PdZx(! zQZ^%dE%UtRz6XB%s0cTa(q+13eP`Zo{`gZ(bK58TI#sf;sch!WUH<wEM_O81)8xsM zubZ2jcQ<%*>@XIYAiUekV=do`@(rmBuM(uA{4EknOG}dz5*C<G^~#-M``DG`i|wqb z+y4bcWO7BtgcXEtZZ&x$CMzXd{or%oujR{@y%W9vydWl{ygJXeQuTkB<R6Yo)AK<A z`WF-)@Ng_N-k;zqH=Bcn>91(RX9>smC-%%)x|7M__^WIeW?w~zWEI|9{vB-de_y|L z?bpZauTmR|Id)j?(kK=ald!69*tbAIWqF1JA4kVcd4X!{XUDC+s82rmpE2CF_MYm^ zywt|zPgcwgbrX(#Fy>meK~(+ypYQES8*fCoavhI8x2w7>?hIFxYw0JM<3=LRC0$<6 z8On@ZeBWu_%zw!LalN<l_F~J_<xC1UF7&3ZzcDvy@!7!W!`5^B?!`r)y_uDB;QEa# zS{q;ee%?PZ<k4xDwEFPX3?d>H8`yh}8EZKvCmZfKw(Z!N2tD5r)#$AM{I`OA6f8RX SOc@v$7(8A5T-G@yGywpZ!BWQn diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ImportProjectSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/ImportProjectSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..f97a121d48058e85664303edf0aac817028b5a30 GIT binary patch literal 720 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!torhB?LhE&{2PC3BjQ{*f3 z=FJ<U88c=a_;bI$&iKuZeaau7HO;<$@v2dh@d1mQ8%n(%PtkH)@TOkjzxaiQmRAwK ze|yWxE1hd7d3){ECan#OJORv7RoQRXpI1p}sGaIMW!1K(|Nd>?cYRCao24NChrRkC z|KWX$e}DVD$#c)Xf=@-aZ=MX-OEPuPjap;5&t^qibMw^3#;4-U#>UJyTJG0NNX+<G zU|>^I{Qv!}U(Ry=-|KEPUu|e95Ki~|Z9n<u+?gh<madW&Gg~F={{BDr;n8#5w(s)u zjScjs-#ziSZ+YFTJBw%No!~Nk-1%i|#jk&#tM?sm(wF>qqr;%1NW<vQukXzdueQJD zdDK2r@<;s#!-8VYySJ*}tV%n6r}lpU&kL<@-4_ByBI>@s%WeDrzwzBPv6KxS9*IAG zyi+~=l=ZYk#Qy(@44l$ZvkheIejnJC^=MkM2HTpsleRv*f8G4wd;8kNgtSCP?~UCa zMt^?%>1=#?y}Tgd&;Re!9o@X<Jbaqo_Oftk@umlC5mFjPQ;*)9b9s{Zg><Gi8DZs3 zH+vj<>m?)_3x7R-Z_gHR=~nT(lh@8%`)XGZ+9q|WhxOsH<0eaY=-Aa(FpC|V=J4<D z@8b$97o6Gf_{rf^RpBzX#TAKhYwz0?`*I$iZ@;hk=Ys-<<xDI;{=c_xZdf64c$u^L za`CUZ=ba1_yjDI>E6?_wf8Tz;a*(8ne#736|K%?<)bq@-so~)^pO=+Cr*;9?(S|;m z=~EZZTb5Yga8gX0q3z)R{q>R-J9kQot+$Q|G=A)$-o^Nr_1x#$J32xZJ1P$_vTdBp zIWejs?iaJqrTTsKi8Cz9qn|A?eV)ERB4M%aJ6)|a+5CJC8`3&93qCx+k;u&a{Os=Y g-F)$tm7*$K4Dn`M3L)VyLFtvj)78&qol`;+066txQ2+n{ literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png b/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png index 7f06b149360c48b1aeada49f841fcf87db0c20fd..38cc1ddc88f4fc351980786048489cded4016ce0 100644 GIT binary patch literal 2551 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNv`#fD7Ln>~qot~W|b5->C zf8*Vot#`+*zkdG6`}CaSeg$$r1iO7X1hRxUnx<_L3Jq0Xd1cx+=hhVtp;zlPvR<!R z>m@HAwLoZ9lvK!MmPs>s1%y7aeJXe~A)#HRE+<EL|F?&C=N|Vvzt=c9Kg+Ic&F1u) z^74QCtIzFxeor(ZmiOTE>!E9JeO$JFCD*z;Iv#oslNh!?o$Gg5hVL|sgNpHs-Bx=g zG8KH6WjCZndNI1CGfdqx$t$_&0kcb+zO2cVo#}2)`pagnOJJU|_TRP7v*l~wO|N|G ztD<*6Gx8A6ft?%=)C$wp7&@1q45^y4YVw3UrxjWgd>F5*W%e*L1keAjY-VU<S@`Se zt(T{NCv!7Q%`Uh4(|WdA%G~B(%C}WgJ7#1o+vqW&@<dA01es+w8LT?BQ#6JACaH!L zU)x-m(55rhh;fl{q7QFv(}&LK)@f|_tTr=j*z?aYzx1{7^v|>2t^5|E+kTsOhfeZ$ z9p1=kmBtD#7g;Xo6sp<yiz$DU;5;U*GRH*uphD0`kwed&CG3B%7k@XW`foTl!|7Ms zuA12Wc(foUUUgUZpMujWhZs_X54hiRx3gwGbT&vS>fv?YhdZ*k+=G|-8(dtXn)mag zx4Yrrn<t%LUAge>!^-{HG7FY`Jh}e*{r{h@Ki$e(@LT1C7z4ZF>1EaSmHTh+`M&c^ z$p(!LhmsT19|d~X^yxS?eg5`lrvI#qGj>@v?A-V|__O@~oxiUAJRF#Kb(uVOYu)4R zvbXDgD2L}t>f249T0X6QT6O-hGr5~DA5c1Q$bP+ERE%M*lVSJ7^-Q0nr036dQ?Y4T zoc|~9@zmsMJCRk_YJ#KUc7F`WJbjJ*=q91Khkn^BJr})vYpD77o|!mv*{lUQTQ^+s zxF%tq`LUXBno;c0R$=+1`}T3aGhf_a|JO-lMV$lR6&ul0xv#jorcSL{={d9M+|lZj zmF68OoV(Y0oRs{&?Ph~n!@89g#XI<q-+%Xa>$)s`j(tzxe%kabzqr96RPdSK|4z9# z4xyo{|C<yx=r6C_+STOP>we%y#0)O2llO}+M5U~5tPK<K$?xyHHp4?-PHWk;-}{{Y zF5{Bld%r!Hy{h`r#7L%yYijz@S7o`@yx|g?c5=s$_EHT!J-6y=>->Nw1)Yx{D`b9u zf4`h<am~x$|6j+3gy`z(zPR&``AWHM&u8~v1-}CF{d4k;F=f2tdn({ixK(^}zFp_8 zT~;P0CJ#>QISQ=QbLn#EVhFK2R@HcO%GuMdye+OTPE7o6XlQtlaa;cVzCUfc8g~R- z{$I44Q`@eTz${`qTTo;DXT|4#Hp?tnw5aK_cSvBP1H;apl_$=hS1wey`}>7!(M65> z3@%;8Wo3L!U+UuG<hZ!FUewDcZIp=n`8s~X_qEMiLN4FfS*#v()3?BE`=d`A?P`j4 zY)`LaT(HvmiF(5<H~V)p|0!EpTL%UQbMLp8j>{LDFM3*;Iq8_3g{7tE`=3A3RaUu~ z<y}x)u=LRdA;A?NGmpG$DSUUybkC;m8f9;9wR$dQ*?8&dj-oyM;`cT)Y|?3%b8Ov% zuF#z~rfn6sE_<`!>*`N8H?rTpw{QFZ^rl@#{I;h4hYVkIYFvuq$~0w-O||3fee=EA z@6pEN^AAi3XnXz6E5`O_ySF=sLK36Mx+NR}4xev1y;*17y=`0Asnr`@Cd_P>V*Z?^ z)ON*Z#`=~m>n3bC)p~hWlB3GbmskGX+x>?%Y)gs4%j^T49(-*6-xD7+-<!w6u8}pF zJAzAUSCfD4dWXsb2d3?k__X5rtwl4BiE4hoRns!(Sa<)yO<qsr+Crzcg-&M^`rstE z`NzF|=?;faD!+g5%8;o;s9`!|0Lv!M2M^m%8I~MB@cmlr#>`U2`Ihx9vl<*XKXTjL zx-MNtmFHjjI<~`dM)7NwN?ca;u{=HDX<_pHhNi{u+YKuAY*&}u%<xHix3e8nMMkma zEbo=&=lc@AA6E77;c@J)Jt(iz!N*io;J@}*7u$vv84<$f@1nM?`I^-xoILO9hpLn> z-<B7AdXdO8_sv_+!iGa;mi>%Z%300xqx!Z*2`bNzKU^Fi-T1NpUW?CEzKatlGO@pB zefGvk;mwA_eRh8XV>hhmxN<(fD*9nTdh&l&)^z_p-RJ!y1wR-xw7m<s*0nAny_jXL zubq!?+s5kKUM}nRxl0ReO^j<vdd7L~ofmiFxfdQ&)aIU_qaXiDTIuOOwpD_Hp9?#( z9-LbKcSq%|E(YckYv1!#W|^^@ukm{H&$P1RoL}Pc+S3dB>YO<D<erT<Bar;iZ+5le z{H+Onf%OTknM=<8x&4UgrtC_g>sz_@6dQIejCPi=yL@}G0mDtE38$@^UcWC)`g|)! zWzpszZs~k;b@CJ|KP$^MwoXWAC~$nmnzPL<>bao7Wf#F>kC;0qoSfl;=T^M_@b0H( zPal8s51sA<CX6CmPBJnTOkKl2Ez~O``_wW&v+noXj|N1<G<FKFzod9H*Y3)?O1t2@ zbJnhl{%#dNZ;c15kcjL$9tLrq<?QTJbuH`++!@RT{#C^H3#l`dJFcD+yxmx3>Kfj# zu=ItCExFr-9LxWvuh><t&G!GZ@vX;8TTk*YXVUn7<ZO*}nAVBoyyg*8D=r7}t(ImA zIx^)_=Hp8|cN`V_I-?Ekczb&J9(-$M7IUau{U&~+@e`dm@tiEKgk*0q7u~ky+UyG9 zrAlTW%zAD-ahiMf$=&W_rf<E=JhxfK+J5riu~lQzm&Xpt_Iw?`s&<Jjc4IZESJh4C zoZrgZbH}2+)4RPYgiYc3`suY>cRQcEbS>faE~cEw_eZx*)aa5;u2`~H=IAlqC2H$* zIecA2ricVLUOKPXdhRioY-jMQ#*Hf)CTg;3hAWCRFFn8*Iz_Nl<l~kfFBM)ciLxs6 zJ^bP8<sXaw2lR{0PGQJS@jqMc6m<0117_(@A2W7~hvx-+zW8io;ZpwGr)<yM^#Tq` ze_=jy;O)swj(bc#+HyXt<<7ji*>Tw2-e%ICh`XDv=fv!B-N2S6w*I>BbB<SvzxBFy zm{!P?|Kk6WF>&H^*7}!f>C;3ickTV$c--2|?$Wmx&vre^&@o)E;d$__$dOM@^RxAA zR%mCsM~SL9mp<FEa)rxg{Ttnfbp)&wRabs|A(OB%^26FWW`@fh81(nnJcubt`*7@F zZT_B+fXh|W>h-p-IA(2c9{1tQ=KYmlU#>5^<IUfh{-vz(?f+~4nPdZE7M=M0anj;& zrHLM!-tE3%`cnH_ozwY(rM!U^Nyp3UC-wAx+f`G!S$O-p72FH9e$8HTb4PZ#!u~C- za^>aD@kNq{rt|8(oZ`Ly%a60c_1*4y@i9IA$3#!8|FG=xu5Q`g@3J=jZ|~N<zGa>C lzd3(?yf|BTR_?$4$;&;ltJ42gGcYhPc)I$ztaD0e0svCL*#-ar literal 914 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!toBRyRlLn?0h24!c+q>9+y zKa=up=1iMgx;KxR-newl#PF(6w&^;x8LeWwZ_MBbJLojyXjjJyk3Yf5-BC-jbZ?vx zaAi6wFShYQS?*P*&VNEz9w;x2oxLuz%rj}*%{^wH|LobUebjo+&o;?(JHOA_$rHkF z_w%Ml@%zS<06{?>Mn?Mw(-|X~EZBXdBa9obh9)SnpYgwY<o;si^}b8*%cM;_TYYre zyT+5p*7aE*y6Vso;H^~3D71<xMkqq9sPRN`_kkQnjdSZ0AHDf#eDibr?}*^rn>YHN zEYDwY+uSHr)kx7RgM(Si_tAs{HWQ1z9rk&o@N*w{(*Hbd+HpVgP1W+!FYbQ*a$x$u zjwS^`CzjS-+9hqZ4Jwm3Zf>b$ou}%jpO&9e@a^*V+Yu$lxo^$=-S@&NlWF2t(+Qb5 z^N&2VQqxIht&?}2&|<?<Gd1U0en$hh*}fkS-m=`jFzeDbHU8Jvp4uIGTxf7?h5TYa zndIdChYDjV*0VS|EDUh4o9}+VSbw47KJj$FJ+4f;nrkcnFSsZBLq=9sHbArE*RQG@ z+j?X4*h2#Yqr=%vpB(=BG5*87PQ{Y9?~gChZ!2Ezq2R={cCY(a{_3;~SFW%GisT<Q zotC&>=Rl0+fhgTWYJY4dw$_BJUkVo5C#}|4dOP@*GJF5alk6&A-mdx7#;*K-&VyO1 zn;uPjd%*hTrX4Lwp(5)0ceZ``Fp*_-zF+2UzCDZI-+cLC<~5}=KRr1Xxy<wIsR{p7 z@bXEj;`Ks<weOAvST&zkb{Afg7wwgO`}?MQn{OW#E??hx{;#JC=hIJC;VVog`a16r zc*?NOEBD8fQ@Ve?e0Apx+ibct_m$NW`+orpf8VlsJ%0I#CC>a^M1c<T9W&1<MIT!g z1lNVWJ#aFReSfTsmqDtxSNBo=mnYi~SN!|us`IywvFEnI^{orGS%rMFGoRf4*PpHJ zsZzH4#EG{*Iv+ds<NI=<HC4s?x8<IHU3GqOqRZdy7w#4aKYPUU*6w&$KzF2a$4gdm z)s1b_+}jj21DcHXNzFZU)%&>Skz>Ej%F4=k_kDbIaJkOqEr%zmPP@h<Zg<pQ(I|hT zjMnWkp7%2kND4m@kC(J5v;BSj_`O>T70dj2oEGez^sD}8{{2(+OmFJv$4uw0`FZ>0 e8+q^lOl@~Fs^o27eqvx?VDNPHb6Mw<&;$T(54n&4 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibrariesSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibrariesSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..7f06b149360c48b1aeada49f841fcf87db0c20fd GIT binary patch literal 914 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!toBRyRlLn?0h24!c+q>9+y zKa=up=1iMgx;KxR-newl#PF(6w&^;x8LeWwZ_MBbJLojyXjjJyk3Yf5-BC-jbZ?vx zaAi6wFShYQS?*P*&VNEz9w;x2oxLuz%rj}*%{^wH|LobUebjo+&o;?(JHOA_$rHkF z_w%Ml@%zS<06{?>Mn?Mw(-|X~EZBXdBa9obh9)SnpYgwY<o;si^}b8*%cM;_TYYre zyT+5p*7aE*y6Vso;H^~3D71<xMkqq9sPRN`_kkQnjdSZ0AHDf#eDibr?}*^rn>YHN zEYDwY+uSHr)kx7RgM(Si_tAs{HWQ1z9rk&o@N*w{(*Hbd+HpVgP1W+!FYbQ*a$x$u zjwS^`CzjS-+9hqZ4Jwm3Zf>b$ou}%jpO&9e@a^*V+Yu$lxo^$=-S@&NlWF2t(+Qb5 z^N&2VQqxIht&?}2&|<?<Gd1U0en$hh*}fkS-m=`jFzeDbHU8Jvp4uIGTxf7?h5TYa zndIdChYDjV*0VS|EDUh4o9}+VSbw47KJj$FJ+4f;nrkcnFSsZBLq=9sHbArE*RQG@ z+j?X4*h2#Yqr=%vpB(=BG5*87PQ{Y9?~gChZ!2Ezq2R={cCY(a{_3;~SFW%GisT<Q zotC&>=Rl0+fhgTWYJY4dw$_BJUkVo5C#}|4dOP@*GJF5alk6&A-mdx7#;*K-&VyO1 zn;uPjd%*hTrX4Lwp(5)0ceZ``Fp*_-zF+2UzCDZI-+cLC<~5}=KRr1Xxy<wIsR{p7 z@bXEj;`Ks<weOAvST&zkb{Afg7wwgO`}?MQn{OW#E??hx{;#JC=hIJC;VVog`a16r zc*?NOEBD8fQ@Ve?e0Apx+ibct_m$NW`+orpf8VlsJ%0I#CC>a^M1c<T9W&1<MIT!g z1lNVWJ#aFReSfTsmqDtxSNBo=mnYi~SN!|us`IywvFEnI^{orGS%rMFGoRf4*PpHJ zsZzH4#EG{*Iv+ds<NI=<HC4s?x8<IHU3GqOqRZdy7w#4aKYPUU*6w&$KzF2a$4gdm z)s1b_+}jj21DcHXNzFZU)%&>Skz>Ej%F4=k_kDbIaJkOqEr%zmPP@h<Zg<pQ(I|hT zjMnWkp7%2kND4m@kC(J5v;BSj_`O>T70dj2oEGez^sD}8{{2(+OmFJv$4uw0`FZ>0 e8+q^lOl@~Fs^o27eqvx?VDNPHb6Mw<&;$T(54n&4 literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png index 2ddf3bf9c96c5e53d5531866cfef0766fbb5b39f..c39a62f447089f3c7c95bce9a1d69152d7c95cc3 100644 GIT binary patch literal 898 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANOKo}Mm_Ar-gwPPg`n3Y0jm zZ>CmSl9X6bP+~GiE%t6Nv-e?_ON{b1qVk@>i+?yQX3DghP?90Ok%h;xu%ICIA&26= zN6IdXS2i0?`ti(Z|NAA!1K#g-(!W=ClCvm}@BaIL`;Y&;!db5));-hO%4(l^1E<#8 zhYuH4l$E9BXJ`M8dMzpYKRG4kh`pU%Uijl3F?!sKG`Nl?1@73hM~AuPY=%kQ&+rBY zh8tHHrg*77levEOY;QqnX{eo@-9L`5y48{i6%`f_zE*`YKDcdfXJ^!~d$;w%l`B0N zM33y<YwMk!{=EM`Tf^&LzoIU@{_4|t`Eqb!dHMBASFbMR_{d^lVj?nQ#*7ux3{S*) z*qBdqw^&$O3U1%NT~}?gr`RLTgn|MC153-5R_qrnLmCST3l+C)*|MRQkMXBMnvrDp z&75ftd$<^^4*gJOIWmuNqx|)kHx8w@Iyw3*zx?dpy?YyU8je3sWT;pmC;H=&!;b!j zjO^^}m7hO<{=RteVpYxq2M#zSWMz4oGPEBs_%P|nod;P8M~)q1JDaxo$n(#lqKqNc z>l+@ND_oc?r^LtL<<0o(_wUzX4btUZ1~H5*5%KZMXV0F^aw=Aip?E>x>Ibe0A<RV$ zO@c3W1Tk#CeOBZGQ$xGbOrIbPcOx@1HP(WiG3&*ep68!G+`uq{xr^cJltk0#QyDfX z7Ff+)AH?c)PMa}hvH;_ivO`gG7O!2i=0c2~`-5{6nJi@bc8NZCdffVcvA2p4kHa?p z8*j_l7L@Fm_4t&(YWMNSCE3~C4f2%?Jd9r9*-By6$*K%D!*Vv?lwc^+`L=+oMQZ7^ z>C<1HJI6P3=FExg2O3+LGZGCdgJ(=Q@#f7M8-~7=iq@>uiy2c6&GC5l?Aa0q1C0#= z4@y@}byX7FwST|=v**vBG8(W%X>HiD#f6`b@5G@)O*ReJ6gk=tfBEoX!jHdonhyT{ z{LB}OSh~Brzr1+S!P4xg=}=y7&b(v){_7$Ps})4JJQ>%7WhYcs-72fD{(W6>X;uBc z__g{Ed>9yBhG>1|`_(A2VC&Ye&hhd0pC3DRtnC!vas6r2_l4hno?Tk{RsGNPFPv)1 zFGKF!yZ28_=m>-GMQJ<HtG~W&eZw5HbLY;V;db-&L+pO@ehGPJfBC;hH3I_!gQu&X J%Q~loCIH!^nW+E( literal 471 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7=Xts~hE&|@y=<L*C_sea z!R)i~4@Am$@3Q!D$o*fVbG>Wk@_!wCm!v)ly1EF;)GS<dEOy;wg|4m_Q_N=b@o{D4 zy>Ir&TKwd|*;bY3kLMH%^F5H@Yu|MGsnCJB7W2=01WqYme)(tN?;hpp2NM{a7f!gX zBdN&JcU<|#`|lZ>Z|<qInRmXvLFcrA4Bu>~S<4y^KXfSHbD_ef?&$lvNVYFr+ivS_ zxS6v>sArGM;=qqwUw+q0bh`L33Qa%V8s;cAk3C}j_4`MYE>1j~CdgW~_nxyu{?ihx zz?`j7D_4eeO;_<;?6CcIYm<TvOOLLu7`Lfh|L2)LZH#mMjte<V@>E^I#1x~QvHf;= zd&O-wM-GK9rTM3yN?gd=DmSlb-kRe@J41v!S>~UAE_orxEYUz>3B&QidZDj(B|iU* z@l~5#voIjRVe!R=y8ZVr3G_Ow3`ug>8`o|(|GbgG?6X%&tj<n9oyvA4%k;(9DqZHw zFQ+g~^=f6jnkD*Z{*l~k>u<`aO+M+bBUb!Ce+FZt!-Jc7+wCWcf8A{MZu|H0-E)nk edQ~R<<_>bwP<ZEZa{>bc1B0ilpUXO@geCwPOw>&P diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/NewProjectSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/NewProjectSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddf3bf9c96c5e53d5531866cfef0766fbb5b39f GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7=Xts~hE&|@y=<L*C_sea z!R)i~4@Am$@3Q!D$o*fVbG>Wk@_!wCm!v)ly1EF;)GS<dEOy;wg|4m_Q_N=b@o{D4 zy>Ir&TKwd|*;bY3kLMH%^F5H@Yu|MGsnCJB7W2=01WqYme)(tN?;hpp2NM{a7f!gX zBdN&JcU<|#`|lZ>Z|<qInRmXvLFcrA4Bu>~S<4y^KXfSHbD_ef?&$lvNVYFr+ivS_ zxS6v>sArGM;=qqwUw+q0bh`L33Qa%V8s;cAk3C}j_4`MYE>1j~CdgW~_nxyu{?ihx zz?`j7D_4eeO;_<;?6CcIYm<TvOOLLu7`Lfh|L2)LZH#mMjte<V@>E^I#1x~QvHf;= zd&O-wM-GK9rTM3yN?gd=DmSlb-kRe@J41v!S>~UAE_orxEYUz>3B&QidZDj(B|iU* z@l~5#voIjRVe!R=y8ZVr3G_Ow3`ug>8`o|(|GbgG?6X%&tj<n9oyvA4%k;(9DqZHw zFQ+g~^=f6jnkD*Z{*l~k>u<`aO+M+bBUb!Ce+FZt!-Jc7+wCWcf8A{MZu|H0-E)nk edQ~R<<_>bwP<ZEZa{>bc1B0ilpUXO@geCwPOw>&P literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Reload.png b/Kieker.WebGUI/src/main/webapp/img/icons/Reload.png index 494964cc71d2c52576356eaf6fb74f4c7f166990..620b3233cd2c2df95541599efb0d1ef4df651ca8 100644 GIT binary patch literal 2018 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANOqD?MEtLn>}<on9Lt@?7@# z{@vfX${!R~9Pc)GAbF0Bu~KrWND{Bos~dZK7H!*jY*v@cBOX5!PBo7i%PvaJ+_H4- zT(|6*dn|mj*S^%ypSs|XeA5#z6%GBS<G-yd3S`P<%C~Q?eb>7CtHI2)ChN~<HlM%u z?(^S2apnDogk)0l(}R~)T7O+)HS2E42btfo^Oo*g|D$n@!PSrA&QU54J112>zVapD zysd8XX44ygLc?D)OnCj0-F~ZWSi{=Fx@dd*;vHUdih9=EIW}89Vc%~ftM&C)?phz5 z;&JHupVG?@x%*ju-eV|Kys>U)#g>>kC0Cw{GacTv;cMu^pO-j&yY-%k|Mr%?Ezf_T z^-s~qTQ%~9=PoTe?r~M{uYDfR+p53GxnD0a|FK;kBQyWF;L}yR&%fnSTPJ>Q?(RDq z-_AW>^?I7vgM7=Uk8aF4`e+S*$KAGX^>R|Xzf7&Y`_cb4+cY+XDGYOZ^u)Epm^WoO z%w+u0s{5_s_Z-vS2m0@y#x0o2xto7VmW29&tB)$OPOpDgv;5anrkIniI~&+JPUig! zlKQuLv%|{o%r=I{x$nJAe>Z2l`24*;7hgJc(e2fRX$cqig_r~~*{@E$7nA+8{mQMD zO}l*G-<k8To>5Pj!R~yuuM6`*Ez=6md|{4-{uU>4W*%cd`cuAB<kjDh7#8~_@Aj&@ zJ<WWQ_L?VW*X|jT?>21RUVg_c`c0|WyghC2#Utj&E-|#>auDsAaYkZ_3!9>enaIRW zK@Rbcj+~q=Muo~Nrt1H6Im}x0{}y|)`swFkf!d-aGnSpGx2Q<wJns9hvW{!p%jygL zWs$dTS<h}!x@fxFAxwJ`+a0fy*Ck}P@A<f<C;no}6zOLYFBhDXTNIXbcz5)~*$b6& zisY8Oe9u&~GTZywYtH6vLX}H>vsb=IXffT>dhkN;QIj8&jtbl<Ud<P_SM1lv-_Q2_ zYh>Fyah0@rXZG*(AH1xof2TFyYz!&hescfP`_p1R$#|8kC|au2vI_{j=WV{bb#Cb+ zvw4~;Y8s=Y8IK;XzPQOOJ6}U3kbmb%W9y))X|bD&br@_LQkRJvKdwEtd#>}>=42n& z=4pSEuP>OH_v&!lsp}usUwJ#zh-KN1ZJRdB=^Gq2^|1Z(HBYNnbcto=ihJKTFTbqd zU1O10<C^*X4fms(G`U~Z(>HvsjlCkCn^V7Q*0d#VH~;^cz39yJhs(>DcYL4smc_V= zd1dPj-?v_E3SNDim-E@|><?O2t-IWET5)UbLK)*^7VCiKi`Oz!{xo*InU}!+J?+=W zB+=qjR`+@LxxF6s?q4ZBBa0z9ablDML)|{PEv=3Re>!(fKGfl}-r{e^P0j;f+ni(A zcYhO8+kM7BfZO~(=R;dziIcaLy6XQQ_~cd@(luZE8{fz3hK;9Ra%!(!xy5PElN^_i z+8_R$O>R2RyvTe)kLZM3PdPr{Ib@@Er0Hq$hOJwZiVpNuZd#M!{x@CsOR>G@L;c&^ z=IQx+c>iRKuuGWD_^e|?=`~TdwvdAg6H2*m&tc#cjEMbg6(!0g$3LmylGjugmls0M z4^`Ma@=&wQiJdEPebPRsF!^hbUmaavV5QF8`MaD&Ce+29^`Kwf#y&xYz3w+GqZ=3A zPMBxgZK3Xvq_VOl{KA|CZWbIHia9*raxpVB+DCrAs}LixN!Z#u$+CN8pmy@Mz%~WT z`kDJ<JOcX!4EeIx-h1+x;l{7V|0atTzu+>O!yxJJ@aa|Xj$P`~FXb5a-F|y+W>I@v z%!7;TwyNvPG#9=<_wz+$hE16~gV1kI-hhzi%gy`+S2#ahE)`fY?eUq;=^wdNmBd+O zKC(_|HRWAzUhzTgnbZCUUB9F9)huste0h<0=9jHm|Jelxf1a3U60k(*p3Q$LKh6}H zhpzKJNSd%8_<r<V_TJ8tZ)^#3o;>c9w)nnO%sr3)z=KL1MWORo#2;^RIVmW%!(3i9 znN_mxK9ghOMs~3y?VTTwyq$c6`Kxk9{a4{P9^ni3KGKWecc@{xvb8m1viqc5);xyx z=TV;bXD}^E(T(%eJ2FA>Z<|4Y-8=R38_z!Z>p!Vaf^RLOvh{fdbxWc6knNUPjgNOM z(a^9v=^7j(q%`-D%KSAhHHV&f=^pRx`@*51p7iOU^U4!WFWU<Df0}#EN{T5k+1+E0 zwdc8sOEwG5c;@*<;Pm~TDGP%xx9?<)<#%Y4nzToLan^V4ic^C6#q5QWf!7RY{LR%} z^?l7@{;NhU!DZos9iF9KPgJ~A(la_wCqJ2dKC)I!_N6sH$BxCk7ZOgHtkB%sHQA7> z#`96$vt?cE3D>JQlAJy~TyOqhy4s=T%2#aFdfsUt{+Ow}>T7YwDZc~f?(pRJM>2}e zXMLK(ufk$dXzyF;{NTkdHnwT?=8J!RF`XlSd9jiiPwn<ybGJ6QGwqqd)Ft+y_kON( z=iHcF8FzO-$$Lurt6u9i8?1|Dth&~7V4>y;r{)cI#$uAM7YPdM9WF{$_|qe1a9K@a ztFT1w8@KFO=~p^oChJ2I7UbS|{VAWNKqgyh!%idl(CPc!Y9G4FL<_h5&#IE0`|V-! zR3WF$qL(bWn@ZeRc3eLEPXEZ92!_8#^)Hqt&3MQ2Ao{<!9#h0p2Z4<WGjoh)$h7|c w`dxf?&dPq*|J>8q8)li<e6jr&(f^-uuDU^y+>#hM1_lNOPgg&ebxsLQ0MUZWy8r+H literal 792 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to?t8j8hE&|@om}lPIZ)!* z{P)GDGpFT6w52RP+j42jq@`1qCR{ptNw4Xw&jtmd%|6_z5>c~WXn9^(Vh|u56}Q5^ zM{k<3wxN!u>hiURGCvDNuQOe~yLN7^SKI#^-2BfA_};&_dH%FkQ%B&c<m^S)esa0m zylx4~-(t&qI_KiQYJXjp6(=}$SAQxBX39x>G4*`UeCt_xtB!B6{9SZg{Xchsa;S>; z?hsYB!)Ih}=mgkIEGw;laa(g*nXe9y$G2%q=Xwe^zvsWueS(uw@J4ZDoO8-Fo4!d) zt8zbnezJDv7OPX+pMU8)%P#V!RmYR%W0E;z%=TD@tykJ@x4&qg`8s^5Vo2eh)nE23 z(YX92_~eSvcst3j_EF0_&zLRqonpG+rtE>cuUuv?PGT<5h<dWEQGTAcjKv1Otanqy z0xK_`*spPNTEk<T<o>CWYJV5xmX!Q>yrF8#*4_ShgRcME{n=x}Rz=mn6&5?R8MK>E zy}DKPDnz1hs%O$_4R!xd?vvg)xFnZtJ*+b$<W!->|Jkp-%B^07Jv>+ypm#u@RV&L{ zYUSU?8+RtiUN|Z`VSnKa%bT&6F3)&X&+ghE7XIg!V})7W&)SI@wJbbd2MjtsRb2^G zv@57B;agneUoJQ2C&PKp2SGY5Go{+yRwl}QdvLT*;CSevt>^X`WOit3OW00`?yJ$N zFtu3f`GS|XNxtGqsQYe<14>obI0aMZuI%mA`L>qx!k$*sk7iCc?N-<{vY#~UNM!sL z;goW}xYJ_BO3vFZE=&IN%ssF*?TXoVg^8>p#~ylx8EwjSbGYsP$z%VHACr#nJ-PI@ zPC}PO_{3YKjJ>uM!5@X#@2xgC$K>b!D8thxtF0~JR9%mdJYx&z!5fbcwohK%@I+W$ zjQK+-Yiy+SsyNMw%Ox7Wz1MkjtK&dZ#)-?)6OGm#ww)_z;_Lk4eQQUm-Ur3G*@3Sw z*c&kIWagdfb+|4qPpVb!LC?zv3+EsD-kO$N_lME{ibDR8)!QN%7#J8lUHx3vIVCg! E0L2D$XaE2J diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ReloadSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/ReloadSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..494964cc71d2c52576356eaf6fb74f4c7f166990 GIT binary patch literal 792 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to?t8j8hE&|@om}lPIZ)!* z{P)GDGpFT6w52RP+j42jq@`1qCR{ptNw4Xw&jtmd%|6_z5>c~WXn9^(Vh|u56}Q5^ zM{k<3wxN!u>hiURGCvDNuQOe~yLN7^SKI#^-2BfA_};&_dH%FkQ%B&c<m^S)esa0m zylx4~-(t&qI_KiQYJXjp6(=}$SAQxBX39x>G4*`UeCt_xtB!B6{9SZg{Xchsa;S>; z?hsYB!)Ih}=mgkIEGw;laa(g*nXe9y$G2%q=Xwe^zvsWueS(uw@J4ZDoO8-Fo4!d) zt8zbnezJDv7OPX+pMU8)%P#V!RmYR%W0E;z%=TD@tykJ@x4&qg`8s^5Vo2eh)nE23 z(YX92_~eSvcst3j_EF0_&zLRqonpG+rtE>cuUuv?PGT<5h<dWEQGTAcjKv1Otanqy z0xK_`*spPNTEk<T<o>CWYJV5xmX!Q>yrF8#*4_ShgRcME{n=x}Rz=mn6&5?R8MK>E zy}DKPDnz1hs%O$_4R!xd?vvg)xFnZtJ*+b$<W!->|Jkp-%B^07Jv>+ypm#u@RV&L{ zYUSU?8+RtiUN|Z`VSnKa%bT&6F3)&X&+ghE7XIg!V})7W&)SI@wJbbd2MjtsRb2^G zv@57B;agneUoJQ2C&PKp2SGY5Go{+yRwl}QdvLT*;CSevt>^X`WOit3OW00`?yJ$N zFtu3f`GS|XNxtGqsQYe<14>obI0aMZuI%mA`L>qx!k$*sk7iCc?N-<{vY#~UNM!sL z;goW}xYJ_BO3vFZE=&IN%ssF*?TXoVg^8>p#~ylx8EwjSbGYsP$z%VHACr#nJ-PI@ zPC}PO_{3YKjJ>uM!5@X#@2xgC$K>b!D8thxtF0~JR9%mdJYx&z!5fbcwohK%@I+W$ zjQK+-Yiy+SsyNMw%Ox7Wz1MkjtK&dZ#)-?)6OGm#ww)_z;_Lk4eQQUm-Ur3G*@3Sw z*c&kIWagdfb+|4qPpVb!LC?zv3+EsD-kO$N_lME{ibDR8)!QN%7#J8lUHx3vIVCg! E0L2D$XaE2J literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/RenameProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/RenameProject.png new file mode 100644 index 0000000000000000000000000000000000000000..2d223bb3063ba8c5736ce788519d664a399dc107 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!tol001;Ln>~yPQIHRlqhjv zezA<#m7@+P%(fo!|DdN)kj=Ys_lM%T3F4Cy7S}r}y7>N{AfudRe)mn@)dj9T(_d`c zw(Et?`b!x-AuW&diq<}JFZO$D`~1PQrC(!Y?j5eK+yDIW9{p!UI}Q4eZ`KsxcydAg z)z_-U5jt_<T2qU!RF^#!{r=|Qx6Lj!m4cgZ=2U2iC>>4u7@)u7YL?^Lu;#3-RWr`# z#wI7SzxSJCv)3lVNBeHxdEqlzTQ4znx?Bnm(3{?PHqH6z@v`Qv=J6-q$4%Llf4BN~ zTIpA|w2cuNjUifZH8Zx~E@9<hlgnm&HS_j^xlflV7cXIcTl;5yL)YP7<_F5t7JU3^ zx942XfoK1w_D<*450RD+$~}`~_V{4JgefOe_OhPkN?3Y)!+gGjr><FiIR4JTZoay} z@<rP=c6M?`DNH~8Uueth>W2Ecjq_jb-taF~<Xq-5#!#+Km!=C@TYC<q7=2yGaB$5f zlcwbfy4GAxA2~EcxT@4nrcAo<vgCM^gTe(<<~5;hjh954<PTNlvHak06TMX6o?s#+ z$rx3_9gz0TkL6&00`I}Y)8!dfty^ueiuH<>vVjE8j{EQJtvo7Jna^Gco$}LW&Q6hK z)yE3=cnkC&=PY56Y>Zofyw*-$Q>e2oYU}$Azw6{Wa`;pp`&oUSU*Mjw{dPZV-1_NH zKL2#?_D@fIa77^|pqH`#_-oGKja#<3Sjh0XH7u)C(GcNk&=W1NkoggQB+2m5%Mv4| ztx>)0hZBP|M84T}UU^dApJC$V<L76@^lIV7jJ%?qcM@MYzxq^C7rwuAWyr57UQ6c% bztQ(DGA&AeSjWS_z`)??>gTe~DWM4fIp#Od literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Save.png b/Kieker.WebGUI/src/main/webapp/img/icons/Save.png index 76613eca1233548d23d83e418273aaf0c65b299e..599a230e3b01595874c8cbd969d7cf7405c87d94 100644 GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANN<Ii4<#Ar-gYhDCa$x(lrR zedqhvodT|l9gp(pNt(wLa9agVY4|m<gYof`a89Qr4xX$d58CCmI!+0+uUOC_|C2-O zQHOk>;GO9&W(yehxdq<2{`^zW)jj)OmhTn%^z^)mNNN84cdLSzuUfsHrQc>rIl~e0 z`1ttQt5>h~U%O^aPHs-lyEA9be3|s+y-@Q(hgV!*bx%!Anz!X2Uwa{M!NQfdZ%6NS zTl}*+Ir;HgEr#su?B2Nb`Mi95b?=@&b$x$eZgH>MgHNA=%(VEb_V3t{aNgY9T<yS% z+b>^gzIppL_Hi-ey5CRb7>bLFv+w+fPECF4o|u>@AT7-;CMMRfLXttKYMQx}Bj?4_ z=R97_Z4h|T+{`><?%dXe3l(3ycu~>%W|~5WwJ<}*9Y*tialyf#;}Q}SmMmMww9KJQ zuj`gTW5<=r%U=Bc{W~!+kufSd+TGyjd4sD}!VE8bx-+h4XJ_Yb5K~ZAcJ7OM8FR&p z&E>fa!_u|ew~MQ(sV!K)-oO2~QsKWlEDU~Z%BI>+pFR~35n-7*bEXmV|D!DuTVLFX zsA<^BI(P2e3zsf2y?*^#eaBJ$rw%ilOv1yjKU}m(siUv2?aP-E%c`Ye%N%>=xvymj z3=e1T?d{Ex^fEXl{nYT!o#V%scPpuT`uU~txeBffPj+BYv{H|aiQ#E(Zm#iWJ2gS* zfcd|F|4IV`0|O!=I6OT)d#Z$r)=g_`4>~Y+(z3|~Wo2xlqM{e>-aWg$ru9=0TZ4PR zp`%}C{9gZ(Wy-W^OtP-?>Qfb0Eq$=iY5~)pef!dW=4WIiR9_6|y;a-zfalDlrAwDe zuIigGVZ!-4ckeFTwM**5%!Zj87WlLZwM2a^eEITa<Em9!+r;nJAJdIrv@dm9PHwL5 z#SaWd6S~wHXU&@Bu=?sLKFh!Smf=kb&qYlA8DE|}>8YWuo&5U3$Lu-3S!Pe17kPMF z_Ui`^3|>Be{$0`X<*Qdr>FMd$I8Ry{D!Tm-kQeyu-{;A}VYp$-mLpsjZ>$R6U}@{h z@chiAxpU_V2mL>G`Esy#_vK5M4xBvc**9x@Lh3(GiMx_X@9SSk<mKibJaB;Fe$}4c zyI=P!@Ktc_VPazX=cFL^{Q2`wuFh=}B^R9b?9Kc5<D+Bsk?yYMWo3Kz?>`@Dx@O%v zw#3GN2N@FX9ad6Ode)J*s7GtMnc$2mQ$##GJQAd*=0>bFE%r4#cKo>H-x?o(|KNkh zZqJ`Tx3{yjluWZWIF(*lSopU_(Q=uGhq#D{LtUNS>&MpC)^Dt3LtjmM^itqA>-@z@ z*It$wHJm-`E2+|??HE><l;79arz-K%dtzLc9E*av`E<|dXz9Dp-&lX;U|RZYM)szQ z_wMl-8ygqxonU*8V_sL5x%qZ4&fW7{!XJOXQB@!COhPkB*V5Wrde-dOjNI+Dhf5se z;_mJBJ863Lz{QJ#+PgMxH1smm4*Qk3P~`HAS+lBIU+sMI_O0&1&GN-XMf;v!)#3YP z=;`Cr^6OWXg^f*0@x+M}jTkQO+<20K?MP<Y%Ed1-KL|S}S5{U^M4p>uV`HOY5+fro zf4^yBq<~Z0%@l!b=A@*g2(A@fCmky)EK*WaXZ}(B_*mU+&C#Q-5|WZT%d0ZhtX;eI z%-OTHPkTMO+4ecO-+!q3BrQK*UwTmzH!pAN+qb!4H%(T=UY06cQR<;(#kBBSa<jc! zzPr2o{1dx3uv;WeT%yRWA22T=(aYla3pcSdJ>t{uJgnIL^!=XKAJdb#`fu@;I%s9+ z9ji+?&`@_&q01*>_l_MAa`N)^4ae>;KlJpVpr?k^kNV~v`wX(4?r;+;srd6hWN+k$ z<$;ISCq0f;_{i<~R(?YE$D0-E5<l)L#9iLfvhU*yxzat%A6_v0V=Osw;x2nwdo%+B O1B0ilpUXO@geCwr46yA0 literal 623 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to%sgEjLn>}94Yuu&3KW?4 z{QrM{5$?y14yzq34185wADog9aP$xs2?+_gG}Fv+hgO-F!q#3EX-+fs6)cWT3TBH^ zEjpSqHhj2$_3WPM)z6q-%FMXC-P-tm-RHA9jmEtfy2Dma)tGupJ!`9!iqOeG5myKC zzT=A>9v`<?dtfbQEyMTvXN{dLqsP)q<`X@ZyeQlKQj$YafrIG|<3*+$@4vs<cQa?f z-8}i%Uw?7iY?ojV+oLbSCC}8z!2Cerjs}NOf*<3jpEgg5c8b{5Cq-&aef9b4*HRq` zo_P!_iXR`Hay4&zbASfR)~L72ZTAcr7GL~fI{D-tFBKt$>8B$NvkH?AGG<6mIe7J| zC{O!geTgbxgP9R)ulZ?Bt@2_N;W}C`Ss*Lc&DwG}F=K1g{f~3o6B^GvEcnymwwOQA zgH2)bNk5()6Q=wt+ui!LiuY!YnAX%&=bsk+?0CRo>bLy!^qV<hw{px3BzSmQE-z2m zQ-AMNf<eQ}60M%&kJ*o;7{$iK#oa5aI+-#_G_ZVU%>RyC@4qj+nR6(|jQI{T*OwVL z-hNA$>tF7hsifL*G$~+hnB)5E&Q^2N76mPDxSJ>5byUgv@}0Q#-zP=rOnV-;{=0Nv zkdx-+SdFP(3ogG@kn7)^vM*xsMUGQXKY8BpTRvH3$G)Oox5;0A|BXyp{P|~1h`5ua zqK5VpyO};m+!iaY3)8;#?(EsK(fd4D+>07rrT#1uQCHZ#zxDgJzyo^@-%WA3^7PyL hee*t>&r9CVD7V$UY@fv690mpk22WQ%mvv4FO#m>d8lwOJ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png b/Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png index 76613eca1233548d23d83e418273aaf0c65b299e..599a230e3b01595874c8cbd969d7cf7405c87d94 100644 GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANN<Ii4<#Ar-gYhDCa$x(lrR zedqhvodT|l9gp(pNt(wLa9agVY4|m<gYof`a89Qr4xX$d58CCmI!+0+uUOC_|C2-O zQHOk>;GO9&W(yehxdq<2{`^zW)jj)OmhTn%^z^)mNNN84cdLSzuUfsHrQc>rIl~e0 z`1ttQt5>h~U%O^aPHs-lyEA9be3|s+y-@Q(hgV!*bx%!Anz!X2Uwa{M!NQfdZ%6NS zTl}*+Ir;HgEr#su?B2Nb`Mi95b?=@&b$x$eZgH>MgHNA=%(VEb_V3t{aNgY9T<yS% z+b>^gzIppL_Hi-ey5CRb7>bLFv+w+fPECF4o|u>@AT7-;CMMRfLXttKYMQx}Bj?4_ z=R97_Z4h|T+{`><?%dXe3l(3ycu~>%W|~5WwJ<}*9Y*tialyf#;}Q}SmMmMww9KJQ zuj`gTW5<=r%U=Bc{W~!+kufSd+TGyjd4sD}!VE8bx-+h4XJ_Yb5K~ZAcJ7OM8FR&p z&E>fa!_u|ew~MQ(sV!K)-oO2~QsKWlEDU~Z%BI>+pFR~35n-7*bEXmV|D!DuTVLFX zsA<^BI(P2e3zsf2y?*^#eaBJ$rw%ilOv1yjKU}m(siUv2?aP-E%c`Ye%N%>=xvymj z3=e1T?d{Ex^fEXl{nYT!o#V%scPpuT`uU~txeBffPj+BYv{H|aiQ#E(Zm#iWJ2gS* zfcd|F|4IV`0|O!=I6OT)d#Z$r)=g_`4>~Y+(z3|~Wo2xlqM{e>-aWg$ru9=0TZ4PR zp`%}C{9gZ(Wy-W^OtP-?>Qfb0Eq$=iY5~)pef!dW=4WIiR9_6|y;a-zfalDlrAwDe zuIigGVZ!-4ckeFTwM**5%!Zj87WlLZwM2a^eEITa<Em9!+r;nJAJdIrv@dm9PHwL5 z#SaWd6S~wHXU&@Bu=?sLKFh!Smf=kb&qYlA8DE|}>8YWuo&5U3$Lu-3S!Pe17kPMF z_Ui`^3|>Be{$0`X<*Qdr>FMd$I8Ry{D!Tm-kQeyu-{;A}VYp$-mLpsjZ>$R6U}@{h z@chiAxpU_V2mL>G`Esy#_vK5M4xBvc**9x@Lh3(GiMx_X@9SSk<mKibJaB;Fe$}4c zyI=P!@Ktc_VPazX=cFL^{Q2`wuFh=}B^R9b?9Kc5<D+Bsk?yYMWo3Kz?>`@Dx@O%v zw#3GN2N@FX9ad6Ode)J*s7GtMnc$2mQ$##GJQAd*=0>bFE%r4#cKo>H-x?o(|KNkh zZqJ`Tx3{yjluWZWIF(*lSopU_(Q=uGhq#D{LtUNS>&MpC)^Dt3LtjmM^itqA>-@z@ z*It$wHJm-`E2+|??HE><l;79arz-K%dtzLc9E*av`E<|dXz9Dp-&lX;U|RZYM)szQ z_wMl-8ygqxonU*8V_sL5x%qZ4&fW7{!XJOXQB@!COhPkB*V5Wrde-dOjNI+Dhf5se z;_mJBJ863Lz{QJ#+PgMxH1smm4*Qk3P~`HAS+lBIU+sMI_O0&1&GN-XMf;v!)#3YP z=;`Cr^6OWXg^f*0@x+M}jTkQO+<20K?MP<Y%Ed1-KL|S}S5{U^M4p>uV`HOY5+fro zf4^yBq<~Z0%@l!b=A@*g2(A@fCmky)EK*WaXZ}(B_*mU+&C#Q-5|WZT%d0ZhtX;eI z%-OTHPkTMO+4ecO-+!q3BrQK*UwTmzH!pAN+qb!4H%(T=UY06cQR<;(#kBBSa<jc! zzPr2o{1dx3uv;WeT%yRWA22T=(aYla3pcSdJ>t{uJgnIL^!=XKAJdb#`fu@;I%s9+ z9ji+?&`@_&q01*>_l_MAa`N)^4ae>;KlJpVpr?k^kNV~v`wX(4?r;+;srd6hWN+k$ z<$;ISCq0f;_{i<~R(?YE$D0-E5<l)L#9iLfvhU*yxzat%A6_v0V=Osw;x2nwdo%+B O1B0ilpUXO@geCwr46yA0 literal 623 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to%sgEjLn>}94Yuu&3KW?4 z{QrM{5$?y14yzq34185wADog9aP$xs2?+_gG}Fv+hgO-F!q#3EX-+fs6)cWT3TBH^ zEjpSqHhj2$_3WPM)z6q-%FMXC-P-tm-RHA9jmEtfy2Dma)tGupJ!`9!iqOeG5myKC zzT=A>9v`<?dtfbQEyMTvXN{dLqsP)q<`X@ZyeQlKQj$YafrIG|<3*+$@4vs<cQa?f z-8}i%Uw?7iY?ojV+oLbSCC}8z!2Cerjs}NOf*<3jpEgg5c8b{5Cq-&aef9b4*HRq` zo_P!_iXR`Hay4&zbASfR)~L72ZTAcr7GL~fI{D-tFBKt$>8B$NvkH?AGG<6mIe7J| zC{O!geTgbxgP9R)ulZ?Bt@2_N;W}C`Ss*Lc&DwG}F=K1g{f~3o6B^GvEcnymwwOQA zgH2)bNk5()6Q=wt+ui!LiuY!YnAX%&=bsk+?0CRo>bLy!^qV<hw{px3BzSmQE-z2m zQ-AMNf<eQ}60M%&kJ*o;7{$iK#oa5aI+-#_G_ZVU%>RyC@4qj+nR6(|jQI{T*OwVL z-hNA$>tF7hsifL*G$~+hnB)5E&Q^2N76mPDxSJ>5byUgv@}0Q#-zP=rOnV-;{=0Nv zkdx-+SdFP(3ogG@kn7)^vM*xsMUGQXKY8BpTRvH3$G)Oox5;0A|BXyp{P|~1h`5ua zqK5VpyO};m+!iaY3)8;#?(EsK(fd4D+>07rrT#1uQCHZ#zxDgJzyo^@-%WA3^7PyL hee*t>&r9CVD7V$UY@fv690mpk22WQ%mvv4FO#m>d8lwOJ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SaveAsSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/SaveAsSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..76613eca1233548d23d83e418273aaf0c65b299e GIT binary patch literal 623 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to%sgEjLn>}94Yuu&3KW?4 z{QrM{5$?y14yzq34185wADog9aP$xs2?+_gG}Fv+hgO-F!q#3EX-+fs6)cWT3TBH^ zEjpSqHhj2$_3WPM)z6q-%FMXC-P-tm-RHA9jmEtfy2Dma)tGupJ!`9!iqOeG5myKC zzT=A>9v`<?dtfbQEyMTvXN{dLqsP)q<`X@ZyeQlKQj$YafrIG|<3*+$@4vs<cQa?f z-8}i%Uw?7iY?ojV+oLbSCC}8z!2Cerjs}NOf*<3jpEgg5c8b{5Cq-&aef9b4*HRq` zo_P!_iXR`Hay4&zbASfR)~L72ZTAcr7GL~fI{D-tFBKt$>8B$NvkH?AGG<6mIe7J| zC{O!geTgbxgP9R)ulZ?Bt@2_N;W}C`Ss*Lc&DwG}F=K1g{f~3o6B^GvEcnymwwOQA zgH2)bNk5()6Q=wt+ui!LiuY!YnAX%&=bsk+?0CRo>bLy!^qV<hw{px3BzSmQE-z2m zQ-AMNf<eQ}60M%&kJ*o;7{$iK#oa5aI+-#_G_ZVU%>RyC@4qj+nR6(|jQI{T*OwVL z-hNA$>tF7hsifL*G$~+hnB)5E&Q^2N76mPDxSJ>5byUgv@}0Q#-zP=rOnV-;{=0Nv zkdx-+SdFP(3ogG@kn7)^vM*xsMUGQXKY8BpTRvH3$G)Oox5;0A|BXyp{P|~1h`5ua zqK5VpyO};m+!iaY3)8;#?(EsK(fd4D+>07rrT#1uQCHZ#zxDgJzyo^@-%WA3^7PyL hee*t>&r9CVD7V$UY@fv690mpk22WQ%mvv4FO#m>d8lwOJ literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SaveSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/SaveSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..76613eca1233548d23d83e418273aaf0c65b299e GIT binary patch literal 623 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to%sgEjLn>}94Yuu&3KW?4 z{QrM{5$?y14yzq34185wADog9aP$xs2?+_gG}Fv+hgO-F!q#3EX-+fs6)cWT3TBH^ zEjpSqHhj2$_3WPM)z6q-%FMXC-P-tm-RHA9jmEtfy2Dma)tGupJ!`9!iqOeG5myKC zzT=A>9v`<?dtfbQEyMTvXN{dLqsP)q<`X@ZyeQlKQj$YafrIG|<3*+$@4vs<cQa?f z-8}i%Uw?7iY?ojV+oLbSCC}8z!2Cerjs}NOf*<3jpEgg5c8b{5Cq-&aef9b4*HRq` zo_P!_iXR`Hay4&zbASfR)~L72ZTAcr7GL~fI{D-tFBKt$>8B$NvkH?AGG<6mIe7J| zC{O!geTgbxgP9R)ulZ?Bt@2_N;W}C`Ss*Lc&DwG}F=K1g{f~3o6B^GvEcnymwwOQA zgH2)bNk5()6Q=wt+ui!LiuY!YnAX%&=bsk+?0CRo>bLy!^qV<hw{px3BzSmQE-z2m zQ-AMNf<eQ}60M%&kJ*o;7{$iK#oa5aI+-#_G_ZVU%>RyC@4qj+nR6(|jQI{T*OwVL z-hNA$>tF7hsifL*G$~+hnB)5E&Q^2N76mPDxSJ>5byUgv@}0Q#-zP=rOnV-;{=0Nv zkdx-+SdFP(3ogG@kn7)^vM*xsMUGQXKY8BpTRvH3$G)Oox5;0A|BXyp{P|~1h`5ua zqK5VpyO};m+!iaY3)8;#?(EsK(fd4D+>07rrT#1uQCHZ#zxDgJzyo^@-%WA3^7PyL hee*t>&r9CVD7V$UY@fv690mpk22WQ%mvv4FO#m>d8lwOJ literal 0 HcmV?d00001 diff --git a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml index bf71a7c5..5b591383 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml @@ -96,14 +96,14 @@ <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-save" value=" #{localizedMessages.saveProject}" ajax="true" onstart="preSaveProject(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:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveSmall" value=" #{localizedMessages.saveProject}" ajax="true" onstart="preSaveProject(false)" disabled="#{empty currentAnalysisEditorBean.project}"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveAsSmall" value=" #{localizedMessages.saveProjectAs}" update=":messages" ajax="true" disabled="#{true or empty currentAnalysisEditorBean.project}"/> <p:separator /> </c:if> - <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:menuitem styleClass="element-with-whitespace" icon="ui-icon-reloadSmall" value=" #{localizedMessages.reloadProject}" ajax="false" url="analysisEditor?projectName=#{currentAnalysisEditorBean.projectName}" disabled="#{empty currentAnalysisEditorBean.project}" /> <p:separator/> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-manageLibraries" value=" #{localizedAnalysisEditorPageMessages.manageLibraries}" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-manageLibrariesSmall" value=" #{localizedAnalysisEditorPageMessages.manageLibraries}" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> <p:separator /> </c:if> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> @@ -128,6 +128,14 @@ <ui:define name="furtherMenuBar"> <p:spacer height="5"/> <p:menubar> + <p:menuitem id="b1" styleClass="element-with-whitespace" icon="ui-icon-save" ajax="true" onstart="preSaveProject(false)" disabled="#{empty currentAnalysisEditorBean.project}"/> + <!-- A dummy item as a separator between the items. --> + <p:menuitem style="width: 15px" disabled="true"/> + + <p:menuitem id="b2" styleClass="element-with-whitespace" icon="ui-icon-manageLibraries" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> + <!-- A dummy item as a separator between the items. --> + <p:menuitem style="width: 15px" disabled="true"/> + <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"/> diff --git a/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml index 594ed95d..50bb316a 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml @@ -37,15 +37,6 @@ </h:form> </ui:define> - <ui:define name="js"> - <!-- This javascript code will be executed in the onload-part of the body and shows a localized message via the growl-component. --> - <script> - bodyLoaded = function() { - msgs.renderMessage({summary: '#{localizedCockpitEditorPageMessages.msgCockpitEditorWelcomeShort}', detail: '#{localizedCockpitEditorPageMessages.msgCockpitEditorWelcome}', severity: 'info'}); - } - </script> - </ui:define> - <!-- Those are the menu bar entries left from the help-submenu. --> <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> diff --git a/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml index 9a311551..814f33f2 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml @@ -31,15 +31,6 @@ <link rel="stylesheet" type="text/css" href="#{root}/css/CockpitPage.css" /> </ui:define> - <ui:define name="js"> - <!-- This javascript code will be executed in the onload-part of the body and shows a localized message via the growl-component. --> - <script> - bodyLoaded = function() { - msgs.renderMessage({summary : '#{localizedCockpitPageMessages.msgCockpitWelcomeShort}', detail : '#{localizedCockpitPageMessages.msgCockpitWelcome}', severity: 'info'}); - } - </script> - </ui:define> - <!-- Those are the menu bar entries left from the help-submenu. --> <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> @@ -90,6 +81,9 @@ <h:graphicImage url="#{currentCockpitBean.isAnalysisRunning() ? '../img/LEDs/Icon_LED_Green.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> <h:outputText value="#{localizedMessages.stateRunning}"/> + <h:graphicImage url="#{currentCockpitBean.isAnalysisTerminating() ? '../img/LEDs/Icon_LED_Yellow.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> + <h:outputText value="#{localizedMessages.stateTerminating}"/> + <h:graphicImage url="#{currentCockpitBean.isAnalysisTerminated() ? '../img/LEDs/Icon_LED_Red.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> <h:outputText value="#{localizedMessages.stateTerminated}"/> diff --git a/Kieker.WebGUI/src/main/webapp/pages/ControllerPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/ControllerPage.xhtml index f2a20143..8db919a9 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/ControllerPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/ControllerPage.xhtml @@ -96,6 +96,9 @@ <h:graphicImage url="#{currentControllerBean.isAnalysisRunning() ? '../img/LEDs/Icon_LED_Green.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> <h:outputText value="#{localizedMessages.stateRunning}"/> + <h:graphicImage url="#{currentControllerBean.isAnalysisTerminating() ? '../img/LEDs/Icon_LED_Yellow.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> + <h:outputText value="#{localizedMessages.stateTerminating}"/> + <h:graphicImage url="#{currentControllerBean.isAnalysisTerminated() ? '../img/LEDs/Icon_LED_Red.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> <h:outputText value="#{localizedMessages.stateTerminated}"/> diff --git a/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml index fe10ce65..ef884c85 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml @@ -12,33 +12,51 @@ <h:body> <ui:composition template="/templates/PagesTemplate.xhtml"> - <ui:param name="unsavedModifications" value="false"/> + <!-- Those are parameters of the page. They are mostly used by the underlying template pages. --> <ui:param name="projectName" value="#{currentProjectOverviewBean.projectName}"/> + <ui:param name="unsavedModifications" value="false"/> <ui:param name="pagename" value="projectOverview"/> <ui:param name="showProjectName" value="false"/> + <!-- Import the localized strings. --> <ui:define name="bundleIncludes"> <f:loadBundle var="localizedProjectOverviewMessages" basename="lang.ProjectOverviewPage"/> </ui:define> + <!-- Import the CSS file for this page. --> <ui:define name="cssIncludes"> <link rel="stylesheet" type="text/css" href="#{root}/css/ProjectOverviewPage.css" /> </ui:define> - <!-- Those are the menu bar entries left from the help-submenu. --> + <!-- Those are the menu bar entries left from the help menu. --> <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> - <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}" onclick="importProjectDialog.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newProjectSmall" value=" #{localizedProjectOverviewMessages.newProject}" onclick="newProjectDialog.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-importProjectSmall" value=" #{localizedProjectOverviewMessages.importProject}" onclick="importProjectDialog.show()" ajax="true"/> <p:separator/> </c:if> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value=" #{localizedProjectOverviewMessages.refreshProjectsList}" update=":projectsListForm" action="#{currentProjectOverviewBean.updateAvailableProjects()}" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reloadSmall" value=" #{localizedProjectOverviewMessages.refreshProjectsList}" update=":projectsListForm" action="#{currentProjectOverviewBean.updateAvailableProjects()}" ajax="true"/> <p:separator/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> </p:submenu> </ui:define> + <ui:define name="furtherMenuBar"> + <p:spacer height="5"/> + <p:menubar> + <p:menuitem id="btnNewProject" styleClass="element-with-whitespace" icon="ui-icon-newProject" onclick="newProjectDialog.show()" ajax="true" /> + <p:menuitem id="btnImportProject" styleClass="element-with-whitespace" icon="ui-icon-importProject" onclick="importProjectDialog.show()" ajax="true" /> + <!-- A dummy item as a separator between the items. --> + <p:menuitem style="width: 15px" disabled="true"/> + <p:menuitem id="btnReloadProjectList" styleClass="element-with-whitespace" icon="ui-icon-reload" update=":projectsListForm" action="#{currentProjectOverviewBean.updateAvailableProjects()}" ajax="true" /> + </p:menubar> + <p:tooltip for="btnNewProject" value="#{localizedProjectOverviewMessages.tooltipNewProject}"/> + <p:tooltip for="btnImportProject" value="#{localizedProjectOverviewMessages.tooltipImportProject}"/> + <p:tooltip for="btnReloadProjectList" value="#{localizedProjectOverviewMessages.tooltipReloadProjectsList}"/> + </ui:define> + + <!-- The central component contains the currently available projects. --> <ui:define name="centerContent"> <h:form id="projectsListForm"> <p:dataTable emptyMessage="#{localizedMessages.noRecordsFound}" 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"> @@ -68,12 +86,13 @@ </p:menuitem> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> <p:separator/> - <p:menuitem id="copyButton" icon="ui-icon-copy" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.copyProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="copyProjectDialog.show()" update=":messages"/> - <p:menuitem id="renameButton" icon="ui-icon-edit" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.renameProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="renameProjectDialog.show()" disabled="true" update=":messages"/> - <p:menuitem id="deleteButton" icon="ui-icon-delete" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.deleteProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="deleteProjectDialog.show()" update=":messages"/> + <p:menuitem id="copyButton" icon="ui-icon-copyProject" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.copyProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="copyProjectDialog.show()" update=":messages"/> + <p:menuitem id="renameButton" icon="ui-icon-renameProject" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.renameProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="renameProjectDialog.show()" disabled="true" update=":messages"/> + <p:menuitem id="deleteButton" icon="ui-icon-deleteProject" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.deleteProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="deleteProjectDialog.show()" update=":messages"/> </c:if> </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> -- GitLab