From 5e272601f34d0d19e8d8beafef2f48994a49f8e7 Mon Sep 17 00:00:00 2001
From: Nils Christian Ehmke <nie@informatik.uni-kiel.de>
Date: Fri, 7 Jun 2013 18:06:42 +0200
Subject: [PATCH] Further page refactoring

---
 .../lang/CockpitEditorPage_de.properties      |   4 +-
 .../lang/CockpitEditorPage_en.properties      |   4 +-
 .../src/main/webapp/css/CockpitEditorPage.css |  14 ++++
 .../src/main/webapp/img/icons/NewView.png     | Bin 0 -> 898 bytes
 .../main/webapp/img/icons/NewViewSmall.png    | Bin 0 -> 471 bytes
 .../webapp/pages/AnalysisEditorPage.xhtml     |  64 ++++++++++--------
 .../main/webapp/pages/CockpitEditorPage.xhtml |  32 +++++++--
 .../src/main/webapp/pages/CockpitPage.xhtml   |   2 +-
 .../webapp/pages/ProjectOverviewPage.xhtml    |  16 +++--
 9 files changed, 90 insertions(+), 46 deletions(-)
 create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/NewView.png
 create mode 100644 Kieker.WebGUI/src/main/webapp/img/icons/NewViewSmall.png

diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties
index 870ad76d..7d08e876 100644
--- a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties
+++ b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties
@@ -10,4 +10,6 @@ copyView = Ansicht Kopieren
 renameView = Ansicht Umbenennen
 deleteView = Ansicht L�schen
 
-name = Name
\ No newline at end of file
+name = Name
+
+edit = Bearbeiten
\ 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 71f62abf..dc0e4a85 100644
--- a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties
+++ b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties
@@ -10,4 +10,6 @@ copyView = Copy View
 renameView = Rename View
 deleteView = Delete View
 
-name = Name
\ No newline at end of file
+name = Name
+
+edit = Edit
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/webapp/css/CockpitEditorPage.css b/Kieker.WebGUI/src/main/webapp/css/CockpitEditorPage.css
index 62e66bd9..6b4de3c5 100644
--- a/Kieker.WebGUI/src/main/webapp/css/CockpitEditorPage.css
+++ b/Kieker.WebGUI/src/main/webapp/css/CockpitEditorPage.css
@@ -12,4 +12,18 @@
 
 .ui-panel {
     cursor: pointer;
+}
+
+/* The following code is for icon definition. */
+
+.ui-icon-newView {
+    background: url('../img/icons/NewView.png') no-repeat !important;
+    height:32px;
+    width:32px;
+}
+
+.ui-icon-newViewSmall {
+    background: url('../img/icons/NewViewSmall.png') no-repeat !important;
+    height:16px;
+    width:16px;
 }
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/NewView.png b/Kieker.WebGUI/src/main/webapp/img/icons/NewView.png
new file mode 100644
index 0000000000000000000000000000000000000000..c39a62f447089f3c7c95bce9a1d69152d7c95cc3
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 0
HcmV?d00001

diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/NewViewSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/NewViewSmall.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/pages/AnalysisEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml
index 85a28a78..2e1ed97e 100644
--- a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml
@@ -113,46 +113,50 @@
                 </p:submenu>
 
                 <p:submenu label="Graph">
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-undoSmall" value="  #{localizedMessages.undo}" ajax="true" disabled="true" />
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-redoSmall" value="  #{localizedMessages.redo}" ajax="true" disabled="true" />
-                    <p:separator/>
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-scaleToFitSmall" value="  #{localizedAnalysisEditorPageMessages.analysisEditorScaleToFit}" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" />
+                    <c:if test="#{sec:areAnyGranted('User, Administrator')}">
+                        <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-undoSmall" value="  #{localizedMessages.undo}" ajax="true" disabled="true" />
+                        <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-redoSmall" value="  #{localizedMessages.redo}" ajax="true" disabled="true" />
+                        <p:separator/>
+                    </c:if>
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-scaleToFitSmall" value="  #{localizedAnalysisEditorPageMessages.analysisEditorScaleToFit}" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}"  disabled="#{empty currentAnalysisEditorBean.project}" />
                     <p:separator/>
-                    <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabledSmall' : 'ui-icon-gridDisabledSmall'}" value="  #{localizedAnalysisEditorPageMessages.grid} #{currentAnalysisEditorGraphBean.gridEnabled ? localizedAnalysisEditorPageMessages.disable : localizedAnalysisEditorPageMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/>
-                    <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabledSmall' : 'ui-icon-snapDisabledSmall'}" value="  #{localizedAnalysisEditorPageMessages.snap} #{currentAnalysisEditorGraphBean.snapEnabled ? localizedAnalysisEditorPageMessages.disable: localizedAnalysisEditorPageMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/>
+                    <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabledSmall' : 'ui-icon-gridDisabledSmall'}" value="  #{localizedAnalysisEditorPageMessages.grid} #{currentAnalysisEditorGraphBean.gridEnabled ? localizedAnalysisEditorPageMessages.disable : localizedAnalysisEditorPageMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"  disabled="#{empty currentAnalysisEditorBean.project}"/>
+                    <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabledSmall' : 'ui-icon-snapDisabledSmall'}" value="  #{localizedAnalysisEditorPageMessages.snap} #{currentAnalysisEditorGraphBean.snapEnabled ? localizedAnalysisEditorPageMessages.disable: localizedAnalysisEditorPageMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"  disabled="#{empty currentAnalysisEditorBean.project}"/>
                     <p:separator/>
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-autoLayoutSmall" value="  #{localizedAnalysisEditorPageMessages.autoLayout}" ajax="true" action="#{currentAnalysisEditorGraphBean.startAutoLayout()}"  />
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-autoLayoutSmall" value="  #{localizedAnalysisEditorPageMessages.autoLayout}" ajax="true" action="#{currentAnalysisEditorGraphBean.startAutoLayout()}"  disabled="#{empty currentAnalysisEditorBean.project}"  />
                 </p:submenu>
             </ui:define>  
 
             <ui:define name="furtherMenuBar">
                 <p:spacer height="5"/>
                 <p:menubar> 
-                    <p:menuitem id="btnSaveProject" 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="btnManageLibraries" 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="btnUndo" styleClass="element-with-whitespace" icon="ui-icon-undo" ajax="true" disabled="true"/>
-                    <p:menuitem id="btnRedo" styleClass="element-with-whitespace" icon="ui-icon-redo" ajax="true" disabled="true"/>
-                    <!-- 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"/>
-                    <p:menuitem id="btnAutoLayout" styleClass="element-with-whitespace" icon="ui-icon-autoLayout" ajax="true" action="#{currentAnalysisEditorGraphBean.startAutoLayout()}" />
-                </p:menubar>
-
-                <p:tooltip for="btnSaveProject"  value="#{localizedAnalysisEditorPageMessages.tooltipSaveProject}"/>
-                <p:tooltip for="btnManageLibraries"  value="#{localizedAnalysisEditorPageMessages.tooltipManageLibraries}"/>
+                    <c:if test="#{sec:areAnyGranted('User, Administrator')}">
+                        <p:menuitem id="btnSaveProject" 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="btnManageLibraries" 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="btnUndo" styleClass="element-with-whitespace" icon="ui-icon-undo" ajax="true" disabled="true"/>
+                        <p:menuitem id="btnRedo" styleClass="element-with-whitespace" icon="ui-icon-redo" ajax="true" disabled="true"/>
+                        <!-- A dummy item as a separator between the items. -->
+                        <p:menuitem style="width: 15px" disabled="true"/>
+                    </c:if>
 
-                <p:tooltip for="btnUndo" value="#{localizedMessages.tooltipUndo}"/>
-                <p:tooltip for="btnRedo"  value="#{localizedMessages.tooltipRedo}"/>
+                    <p:menuitem id="btnScaleToFit" styleClass="element-with-whitespace" icon="ui-icon-scaleToFit" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" disabled="#{empty currentAnalysisEditorBean.project}"/>
+                    <p:menuitem id="btnGrid" styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabled' : 'ui-icon-gridDisabled'}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm" disabled="#{empty currentAnalysisEditorBean.project}"/>
+                    <p:menuitem id="btnSnap" styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabled' : 'ui-icon-snapDisabled'}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm" disabled="#{empty currentAnalysisEditorBean.project}"/>
+                    <p:menuitem id="btnAutoLayout" styleClass="element-with-whitespace" icon="ui-icon-autoLayout" ajax="true" action="#{currentAnalysisEditorGraphBean.startAutoLayout()}" disabled="#{empty currentAnalysisEditorBean.project}" />
+                </p:menubar>
+                <c:if test="#{sec:areAnyGranted('User, Administrator')}">
+                    <p:tooltip for="btnSaveProject"  value="#{localizedAnalysisEditorPageMessages.tooltipSaveProject}"/>
+                    <p:tooltip for="btnManageLibraries"  value="#{localizedAnalysisEditorPageMessages.tooltipManageLibraries}"/>
 
+                    <p:tooltip for="btnUndo" value="#{localizedMessages.tooltipUndo}"/>
+                    <p:tooltip for="btnRedo"  value="#{localizedMessages.tooltipRedo}"/>
+                </c:if>
                 <p:tooltip for="btnScaleToFit" value="#{localizedAnalysisEditorPageMessages.tooltipScaleToFit}"/>
                 <p:tooltip for="btnGrid" value="#{localizedAnalysisEditorPageMessages.tooltipGrid}"/>
                 <p:tooltip for="btnSnap" value="#{localizedAnalysisEditorPageMessages.tooltipSnap}"/>
diff --git a/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml
index aac97ce4..7c8b35c4 100644
--- a/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml
@@ -40,12 +40,12 @@
             <!-- Those are the menu bar entries left from the help-submenu. -->
             <ui:define name="furtherMenuBarEntries">
                 <p:submenu  label="#{localizedMessages.file}">
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newProject" value="  Neues View" update=":messages" ajax="true" onclick="newViewDialog.show();" disabled="#{empty currentCockpitEditorBean.project}"/>
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newViewSmall" value="  Neues View" update=":messages" ajax="true" onclick="newViewDialog.show();" disabled="#{empty currentCockpitEditorBean.project}"/>
                     <p:separator />
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-save" value="  #{localizedMessages.saveProject}" update=":messages" ajax="true" action="#{currentCockpitEditorBean.saveProject(false)}" disabled="#{empty currentCockpitEditorBean.project}"/>
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveAs" value="  #{localizedMessages.saveProjectAs}" update=":messages" ajax="true" disabled="#{true or empty currentCockpitEditorBean.project}"/>
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveSmall" value="  #{localizedMessages.saveProject}" update=":messages" ajax="true" action="#{currentCockpitEditorBean.saveProject(false)}" disabled="#{empty currentCockpitEditorBean.project}"/>
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveAsSmall" value="  #{localizedMessages.saveProjectAs}" update=":messages" ajax="true" disabled="#{true or empty currentCockpitEditorBean.project}"/>
                     <p:separator />
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value="  #{localizedMessages.reloadProject}" ajax="false" url="cockpitEditor?projectName=#{currentCockpitEditorBean.projectName}" disabled="#{empty currentCockpitEditorBean.project}" />
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reloadSmall" value="  #{localizedMessages.reloadProject}" ajax="false" url="cockpitEditor?projectName=#{currentCockpitEditorBean.projectName}" disabled="#{empty currentCockpitEditorBean.project}" />
                     <p:separator/>
                     <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value="  #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/>
                     <p:separator />
@@ -53,12 +53,30 @@
                     <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-close" value="  #{localizedMessages.closeProject}" action="ProjectOverviewPage.xhtml?faces-redirect=true" ajax="false" rendered="#{not currentCockpitEditorBean.unsavedModification}"/>
                 </p:submenu>
 
-                <p:submenu  label="Edit">
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-arrowreturnthick-1-w" value="  Undo" ajax="true" />
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-arrowreturnthick-1-e" value="  Redo" ajax="true"  />
+                <p:submenu label="#{localizedCockpitEditorPageMessages.edit}">
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-undoSmall" value="  #{localizedMessages.undo}" ajax="true" disabled="true" />
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-redoSmall" value="  #{localizedMessages.redo}" ajax="true" disabled="true" />
                 </p:submenu>
             </ui:define>  
 
+            <ui:define name="furtherMenuBar">
+                <p:spacer height="5"/>
+                <p:menubar> 
+                    <p:menuitem id="btnNewView" styleClass="element-with-whitespace" icon="ui-icon-newView" update=":messages" ajax="true" onclick="newViewDialog.show();" disabled="#{empty currentCockpitEditorBean.project}"/>
+                    <!-- A dummy item as a separator between the items. -->
+                    <p:menuitem style="width: 15px" disabled="true"/>
+                    
+                    <p:menuitem id="btnSaveProject" styleClass="element-with-whitespace" icon="ui-icon-save" update=":messages" ajax="true"  action="#{currentCockpitEditorBean.saveProject(false)}" disabled="#{empty currentCockpitEditorBean.project}"/>
+                    <!-- A dummy item as a separator between the items. -->
+                    <p:menuitem style="width: 15px" disabled="true"/>
+
+                    <p:menuitem id="btnUndo" styleClass="element-with-whitespace" icon="ui-icon-undo" ajax="true" disabled="true"/>
+                    <p:menuitem id="btnRedo" styleClass="element-with-whitespace" icon="ui-icon-redo" ajax="true" disabled="true"/>
+                </p:menubar>
+
+                <p:tooltip for="btnUndo" value="#{localizedMessages.tooltipUndo}"/>
+                <p:tooltip for="btnRedo"  value="#{localizedMessages.tooltipRedo}"/>
+            </ui:define>
 
             <ui:define name="centerLayout">
                 <p:layoutUnit position="center">
diff --git a/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml
index fb5e34ba..a82251cd 100644
--- a/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml
@@ -34,7 +34,7 @@
             <!-- Those are the menu bar entries left from the help-submenu. -->
             <ui:define name="furtherMenuBarEntries">
                 <p:submenu label="#{localizedMessages.file}"> 
-                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value="  #{localizedMessages.reloadProject}" ajax="false" url="cockpit?projectName=#{currentCockpitBean.projectName}" disabled="#{empty currentCockpitBean.project}" />
+                    <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reloadSmall" value="  #{localizedMessages.reloadProject}" ajax="false" url="cockpit?projectName=#{currentCockpitBean.projectName}" disabled="#{empty currentCockpitBean.project}" />
                     <p:separator/>
                     <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value="  #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/>
                     <p:separator />
diff --git a/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml
index 46e04bdd..e4b56140 100644
--- a/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml
@@ -45,14 +45,18 @@
             <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"/>
+                    <c:if test="#{sec:areAnyGranted('User, Administrator')}">
+                        <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"/>
+                    </c:if>
                     <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}"/>
+                <c:if test="#{sec:areAnyGranted('User, Administrator')}">
+                    <p:tooltip for="btnNewProject" value="#{localizedProjectOverviewMessages.tooltipNewProject}"/>
+                    <p:tooltip for="btnImportProject"  value="#{localizedProjectOverviewMessages.tooltipImportProject}"/>
+                </c:if>
                 <p:tooltip for="btnReloadProjectList"  value="#{localizedProjectOverviewMessages.tooltipReloadProjectsList}"/>
             </ui:define>
 
-- 
GitLab