diff --git a/Kieker.WebGUI/bin/data/Bookstore-Example/lib/kieker-1.6-SNAPSHOT_emf.jar b/Kieker.WebGUI/bin/data/Bookstore-Example/lib/kieker-1.6-SNAPSHOT_emf.jar index 3fb1acc5d90fdc62af80378816bb76361ab10491..cc37c36997b46247562a736d8e1268d68a6a8101 100644 Binary files a/Kieker.WebGUI/bin/data/Bookstore-Example/lib/kieker-1.6-SNAPSHOT_emf.jar and b/Kieker.WebGUI/bin/data/Bookstore-Example/lib/kieker-1.6-SNAPSHOT_emf.jar differ diff --git a/Kieker.WebGUI/lib/kieker-1.6-SNAPSHOT_emf.jar b/Kieker.WebGUI/lib/kieker-1.6-SNAPSHOT_emf.jar index 3fb1acc5d90fdc62af80378816bb76361ab10491..cc37c36997b46247562a736d8e1268d68a6a8101 100644 Binary files a/Kieker.WebGUI/lib/kieker-1.6-SNAPSHOT_emf.jar and b/Kieker.WebGUI/lib/kieker-1.6-SNAPSHOT_emf.jar differ diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java index 8690ebb0397e2053a2b5f708f4ad6069150bd59b..27a1a93aeaa1ccb9057d855c866c87af506f8c65 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java @@ -198,7 +198,7 @@ public final class CurrentAnalysisEditorBean { * This method initializes the bean by using the current project name to load the project. <b>Do not call this method manually. It will only be accessed by * JSF.</b> */ - public void initalize() { + public void initialize() { synchronized (this) { // Make sure that the initialization will only be done for the init request. if (!FacesContext.getCurrentInstance().isPostback()) { diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBeanV2.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBeanV2.java index 3c7cc84b71e85629d903007cf87cbdd8fa4f69d0..b503efc2be1bc8f19e64d7980b025c000f115a2e 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBeanV2.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBeanV2.java @@ -203,8 +203,13 @@ public final class CurrentAnalysisEditorBeanV2 { public void setProjectName(final String newName) { synchronized (this) { // Remember the given parameters - this.project = ProjectsBean.getInstance().openProject(newName); this.projectName = newName; + } + } + + public void initialize() { + synchronized (this) { + this.project = ProjectsBean.getInstance().openProject(this.projectName); this.getConnectionsFromProject(); if (this.project != null) { diff --git a/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml b/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml index 85c77e30af4101b1e9a9da06cf5fff640b9500a7..4796358c757fd1b522ead048995d309301047b2d 100644 --- a/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml +++ b/Kieker.WebGUI/src/main/webapp/AnalysisEditor.xhtml @@ -5,37 +5,32 @@ xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" - xmlns:p="http://primefaces.org/ui" - xmlns:c="http://java.sun.com/jsp/jstl/core"> + xmlns:p="http://primefaces.org/ui"> + + <!-- The following part makes sure that the assigned parameter will be used to load the project. --> <f:metadata> <f:viewParam id="projectNameParam" name="projectName" value="#{currentAnalysisEditorBean.projectName}"/> - <f:event type="preRenderView" listener="#{currentAnalysisEditorBean.initalize()}" /> + <f:event type="preRenderView" listener="#{currentAnalysisEditorBean.initialize()}" /> </f:metadata> <h:head> <title>Kieker.WebGUI</title> + + <!-- Load the necessary CSS files. --> <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/ProjectWorkSpace.css" /> - <script type="text/javascript" src="../js/js-graph-it.js"/> <link rel="stylesheet" type="text/css" href="../css/js-graph-it.css"/> - <style> - .block { - position: absolute; - } - .connector { - background-color: #FF9900; - } - .ui-datalist * { - border : 0px !important; - } - </style> + <link rel="stylesheet" type="text/css" href="../css/AnalysisEditor.css" /> + <!-- Load the necessary JS filed. --> + <script type="text/javascript" src="../js/js-graph-it.js"/> </h:head> + <!-- The initPageObjects()-method initializes the graph. --> <h:body onload="initPageObjects();"> - <p:layout id="layout" fullPage="true"> + <p:layout fullPage="true"> <p:layoutUnit position="north"> <h:form> + <!-- The following is the toolbar to navigate between the different pages. --> <p:toolbar> <p:toolbarGroup align="left"> <h:outputText styleClass="kieker-title" value="Kieker » #{stringBean.shortenLongName(currentAnalysisEditorBean.projectName, 30)}"/> @@ -43,26 +38,27 @@ <p:toolbarGroup align="right"> <p:commandButton styleClass="perspective-button" icon="ui-icon-home" action="ProjectOverview.xhtml" /> <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Analysis Editor" style="white-space: none" disabled="true"/> - <p:button styleClass="perspective-button" icon="ui-icon-circle-triangle-e" value="Analysis" style="white-space: none" outcome="Controller.xhtml"> + <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Analysis Editor" disabled="true"/> + <p:button styleClass="perspective-button" icon="ui-icon-circle-triangle-e" value="Analysis" outcome="Controller.xhtml"> <f:param name="projectName" value="#{currentAnalysisEditorBean.projectName}" /> </p:button> <p:separator/> - <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Cockpit Editor" style="white-space: none" outcome="CockpitEditor.xhtml"> + <p:button styleClass="perspective-button" icon="ui-icon-wrench" value="Cockpit Editor" outcome="CockpitEditor.xhtml"> <f:param name="projectName" value="#{currentAnalysisEditorBean.projectName}" /> </p:button> - <p:button styleClass="perspective-button" icon="ui-icon-image" value="Cockpit" style="white-space: none" outcome="Cockpit.xhtml"> + <p:button styleClass="perspective-button" icon="ui-icon-image" value="Cockpit" outcome="Cockpit.xhtml"> <f:param name="projectName" value="#{currentAnalysisEditorBean.projectName}" /> </p:button> </p:toolbarGroup> </p:toolbar> + <!-- The following is the main menu. --> <p:menubar> <p:submenu label="File"> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-disk" value=" Save Project" update=":messages" ajax="true" action="#{currentAnalysisEditorBean.saveProject(false)}" disabled="#{empty currentAnalysisEditorBean.project}"/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-disk" value=" Save Project As" update=":messages" ajax="true" disabled="#{true or empty currentAnalysisEditorBean.project}"/> <p:separator /> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-refresh" value=" Reload Project" ajax="true" disabled="#{empty currentAnalysisEditorBean.project or true}" /> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-refresh" value=" Reload Project" ajax="false" url="analysisEditor?projectName=#{currentAnalysisEditorBean.projectName}" disabled="#{empty currentAnalysisEditorBean.project}" /> <p:separator/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-bookmark" value=" Manage Libraries" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-shuffle" ajax="true" value=" Edit Connections" update=":connectionDialogForm" onclick="connectionDialog.show();" disabled="#{empty currentAnalysisEditorBean.project}"/> @@ -78,11 +74,12 @@ <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-comment" value=" About..." onclick="aboutDlg.show()" ajax="true"/> </p:submenu> - <p:menuitem styleClass="logOutButton" icon="ui-icon-power" value="#{userBean.userName}" ajax="true" disabled="true"/> + <p:menuitem styleClass="logOutButton" icon="ui-icon-power" value="#{userBean.userName}" ajax="true" url="login"/> </p:menubar> </h:form> </p:layoutUnit> + <!-- This is the center component showing the graph and everything. --> <p:layoutUnit style="font-size: 12px" position="center" id="centerLayout"> <h:form id="centerForm" style="height: 100%" rendered="#{not empty currentAnalysisEditorBean.project}"> <div class="canvas" id="mainCanvas" style="width : 100%;height: 100%"> @@ -125,39 +122,40 @@ </h:form> </p:layoutUnit> + <!-- This is the component presenting the available properties. --> <p:layoutUnit style="font-size: 12px" position="south" size="150" header="Properties" resizable="true" collapsible="true"> <h:form id="propertiesForm" > <p:dataTable editable="true" value="#{currentAnalysisEditorBean.advancedPluginProperties}" var="property" rowIndexVar="rowIndex" emptyMessage="No properties available" rendered="#{not empty currentAnalysisEditorBean.selectedPlugin}"> <p:column headerText="Property" style="width:125px"> - <h:outputText value="#{property.name}" rendered="#{rowIndex > 1}"/> - <h:outputText value="Name" rendered="#{rowIndex == 1}"/> + <!-- The first property is always the classname, the second one always the normal name. After that, other properties can follow. --> <h:outputText value="ClassName" rendered="#{rowIndex == 0}"/> + <h:outputText value="Name" rendered="#{rowIndex == 1}"/> + <h:outputText value="#{property.name}" rendered="#{rowIndex > 1}"/> </p:column> + <!-- The classname is not editable, the name is editable with a specific target, other properies are editable normally. --> <p:column headerText="Value" style="width:125px"> - <p:inplace editor="true" rendered="#{rowIndex > 1}"> - <p:inputText value="#{property.value}" /> - </p:inplace> + <h:outputText value="#{currentAnalysisEditorBean.selectedPlugin.classname}" rendered="#{rowIndex == 0}"/> <p:inplace editor="true" rendered="#{rowIndex == 1}" > <p:inputText value="#{currentAnalysisEditorBean.selectedPlugin.name}" /> <p:ajax event="save" update=":centerForm" /> </p:inplace> - <h:outputText value="#{currentAnalysisEditorBean.selectedPlugin.classname}" rendered="#{rowIndex == 0}"/> + <p:inplace editor="true" rendered="#{rowIndex > 1}"> + <p:inputText value="#{property.value}" /> + </p:inplace> </p:column> </p:dataTable> </h:form> </p:layoutUnit> - <!-- tree fuer toolpalette, packages --> - - <p:layoutUnit style="font-size: 12px" position="east" size="300" header="Available Plugins" - resizable="true" collapsible="true"> + <!-- The following is the toolpalette, presenting the available plugins etc. --> + <p:layoutUnit position="east" size="300" header="Available Plugins" resizable="true" collapsible="true"> <h:form id="toolpalette"> - <p:accordionPanel style="font-size: 12px" multiple="true" activeIndex=""> + <p:accordionPanel multiple="true" activeIndex=""> <p:tab title="Reader"> <ui:repeat value="#{currentAnalysisEditorBean.availableReaders}" var="reader"> <p:commandLink id="readerLink" value="#{reader.simpleName}" action="#{currentAnalysisEditorBean.addPlugin(reader)}" update=":centerForm :messages" /><br/> - <p:tooltip style="font-size: 15px" for="readerLink"> + <p:tooltip for="readerLink"> <b><h:outputText value="#{reader.simpleName} (#{reader.name})"/></b> <br/> <h:outputText value="#{currentAnalysisEditorBean.getDescription(reader)}"/> @@ -176,7 +174,7 @@ <p:tab title="Filter"> <ui:repeat value="#{currentAnalysisEditorBean.availableFilters}" var="filter"> <p:commandLink id="filterLink" value="#{filter.simpleName}" action="#{currentAnalysisEditorBean.addPlugin(filter)}" update=":centerForm :messages"/><br/> - <p:tooltip style="font-size: 15px" for="filterLink"> + <p:tooltip for="filterLink"> <b><h:outputText value="#{filter.simpleName} (#{filter.name})"/></b> <br/> <h:outputText value="#{currentAnalysisEditorBean.getDescription(filter)}"/> @@ -199,7 +197,7 @@ <p:tab title="Repositories"> <ui:repeat value="#{currentAnalysisEditorBean.availableRepositories}" var="repository"> <p:commandLink id="repositoryLink" value="#{repository.simpleName}" action="#{currentAnalysisEditorBean.addRepository(repository)}" update=":centerForm :messages"/><br/> - <p:tooltip style="font-size: 15px" for="repositoryLink"> + <p:tooltip for="repositoryLink"> <b><h:outputText value="#{repository.simpleName} repositoryfilter.name})"/></b> <br/> <h:outputText value="#{currentAnalysisEditorBean.getDescription(repository)}"/> @@ -209,7 +207,6 @@ </p:accordionPanel> </h:form> </p:layoutUnit> - <!-- ******************************************************************************** --> </p:layout> <p:dialog header="Save Project" resizable="false" modal="true" widgetVar="forceSaveDlg"> @@ -237,6 +234,7 @@ <!-- Include the dialog to handle the connections. --> <ui:include src="dialogs/connectionDialog.xhtml" /> + <!-- Include the dialog the manage the libraries. --> <ui:include src="dialogs/manageLibrariesDialog.xhtml" /> </h:body> diff --git a/Kieker.WebGUI/src/main/webapp/AnalysisEditor_V2.xhtml b/Kieker.WebGUI/src/main/webapp/AnalysisEditor_V2.xhtml index 4dd6929229b025a813d32b5f587c33ce77e34156..0e42c7eb972b1aac35b9d466062fa6a834d97325 100644 --- a/Kieker.WebGUI/src/main/webapp/AnalysisEditor_V2.xhtml +++ b/Kieker.WebGUI/src/main/webapp/AnalysisEditor_V2.xhtml @@ -9,6 +9,7 @@ <f:metadata> <f:viewParam name="projectName" value="#{currentAnalysisEditorBeanV2.projectName}"/> + <f:event type="preRenderView" listener="#{currentAnalysisEditorBeanV2.initialize()}" /> </f:metadata> <h:head> @@ -17,7 +18,7 @@ <link type="text/css" href="css/base.css" rel="stylesheet" /> <link type="text/css" href="css/FlowEditor.css" rel="stylesheet" /> <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/ProjectWorkSpace.css" /> + <link rel="stylesheet" type="text/css" href="../css/AnalysisEditor.css" /> <script language="javascript" type="text/javascript" src="js/jit.js"></script> <script language="javascript" type="text/javascript" src="js/flowEditor.js"></script> @@ -107,7 +108,7 @@ </p:inplace> <p:inplace editor="true" rendered="#{stringBean.checkString(property)}" > <p:inputText value="#{currentAnalysisEditorBeanV2.selectedPlugin.name}" /> - <!-- <p:ajax event="save" update=":centerForm" /> --> + <!-- <p:ajax event="save" update=":centerForm" /> --> </p:inplace> </p:column> </p:dataTable> diff --git a/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml b/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml index 9471e4890b2f24f9951096bd4b2e1fabb44a3dc1..d8b1420da5e28b8cb7ab8d7f57c4a4e436e67441 100644 --- a/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml +++ b/Kieker.WebGUI/src/main/webapp/Cockpit.xhtml @@ -15,7 +15,7 @@ <h:head> <title>Kieker.WebGUI</title> <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/AnalysisCockpit.css" /> + <link rel="stylesheet" type="text/css" href="../css/Cockpit.css" /> </h:head> <h:body> diff --git a/Kieker.WebGUI/src/main/webapp/CockpitEditor.xhtml b/Kieker.WebGUI/src/main/webapp/CockpitEditor.xhtml index 76ff71d9bf613384b46dcb425ffafb9683e47b4d..452ace230ff8fdb190a5fcacbc37c897501cc80a 100644 --- a/Kieker.WebGUI/src/main/webapp/CockpitEditor.xhtml +++ b/Kieker.WebGUI/src/main/webapp/CockpitEditor.xhtml @@ -15,7 +15,7 @@ <h:head> <title>Kieker.WebGUI</title> <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/AnalysisViewWorkSpace.css" /> + <link rel="stylesheet" type="text/css" href="../css/CockpitEditor.css" /> </h:head> <h:body> @@ -49,9 +49,9 @@ <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-document" value=" New View" onclick="newViewDialog.show()" ajax="true"/> <p:separator/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-disk" value=" Save Project" update=":messages" ajax="true" action="#{currentCockpitEditorBean.saveProject(false)}" disabled="#{empty currentCockpitEditorBean.project}"/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-disk" value=" Save Project As" update=":messages" ajax="true" disabled="#{empty currentCockpitEditorBean.project}"/> - <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-refresh" value=" Reload Project" ajax="true" disabled="#{empty currentCockpitEditorBean.project or true}"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-disk" value=" Save Project As" update=":messages" ajax="true" disabled="#{true or empty currentCockpitEditorBean.project}"/> + <p:separator /> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-refresh" value=" Reload Project" ajax="false" url="cockpitEditor?projectName=#{currentCockpitEditorBean.projectName}" disabled="#{empty currentCockpitEditorBean.project}" /> <p:separator/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-gear" value=" Settings" onclick="settingsDlg.show()" ajax="true"/> <p:separator/> diff --git a/Kieker.WebGUI/src/main/webapp/Controller.xhtml b/Kieker.WebGUI/src/main/webapp/Controller.xhtml index ea1132a68b24e1d840e8f99fb1274cac6cc726e0..3665b9f1c757c74991f6374c77270cd5bf2b5c5f 100644 --- a/Kieker.WebGUI/src/main/webapp/Controller.xhtml +++ b/Kieker.WebGUI/src/main/webapp/Controller.xhtml @@ -15,7 +15,7 @@ <h:head> <title>Kieker.WebGUI</title> <link rel="stylesheet" type="text/css" href="../css/Common.css" /> - <link rel="stylesheet" type="text/css" href="../css/AnalysisController.css" /> + <link rel="stylesheet" type="text/css" href="../css/Controller.css" /> </h:head> <h:body> diff --git a/Kieker.WebGUI/src/main/webapp/css/AnalysisCockpit.css b/Kieker.WebGUI/src/main/webapp/css/AnalysisCockpit.css deleted file mode 100644 index 631605defbc01f3fab1b70d3661f45eaf7729423..0000000000000000000000000000000000000000 --- a/Kieker.WebGUI/src/main/webapp/css/AnalysisCockpit.css +++ /dev/null @@ -1,3 +0,0 @@ -.ui-dashboard-column { - width: 50% -} \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/AnalysisController.css b/Kieker.WebGUI/src/main/webapp/css/AnalysisController.css deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/Kieker.WebGUI/src/main/webapp/css/AnalysisEditor.css b/Kieker.WebGUI/src/main/webapp/css/AnalysisEditor.css new file mode 100644 index 0000000000000000000000000000000000000000..40e4f2f4adb5cd5a0a4680bcb469c8e9fc6c098f --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/css/AnalysisEditor.css @@ -0,0 +1,14 @@ +@charset "UTF-8"; + +/* The following parts are necessary for the configuration of the graph. */ +.block { + position: absolute; +} +.connector { + background-color: #FF9900; +} + +/* This is necessary to remove the border from the datalist */ +.ui-datalist * { + border : 0px !important; +} \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/AnalysisViewWorkSpace.css b/Kieker.WebGUI/src/main/webapp/css/AnalysisViewWorkSpace.css deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/Kieker.WebGUI/src/main/webapp/css/Cockpit.css b/Kieker.WebGUI/src/main/webapp/css/Cockpit.css new file mode 100644 index 0000000000000000000000000000000000000000..92fd9a4cf103854ad8bcbe51e1bc47d740badb4f --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/css/Cockpit.css @@ -0,0 +1,5 @@ +.@charset "UTF-8"; + +ui-dashboard-column { + width: 50% +} \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/CockpitEditor.css b/Kieker.WebGUI/src/main/webapp/css/CockpitEditor.css new file mode 100644 index 0000000000000000000000000000000000000000..03bb3631661a3c2107c4c280efcb29ad6c7410fa --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/css/CockpitEditor.css @@ -0,0 +1 @@ +@charset "UTF-8"; \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/Controller.css b/Kieker.WebGUI/src/main/webapp/css/Controller.css new file mode 100644 index 0000000000000000000000000000000000000000..03bb3631661a3c2107c4c280efcb29ad6c7410fa --- /dev/null +++ b/Kieker.WebGUI/src/main/webapp/css/Controller.css @@ -0,0 +1 @@ +@charset "UTF-8"; \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/ProjectOverview.css b/Kieker.WebGUI/src/main/webapp/css/ProjectOverview.css index 6633a51c07503bb8f798e8df4123fae11ac1321b..f506fa1678f29f8b3f45185ef6bcaff2a5c686f4 100644 --- a/Kieker.WebGUI/src/main/webapp/css/ProjectOverview.css +++ b/Kieker.WebGUI/src/main/webapp/css/ProjectOverview.css @@ -1,7 +1,5 @@ @charset "UTF-8"; - - .ui-datatable-header { font-size: 12px; } diff --git a/Kieker.WebGUI/src/main/webapp/css/ProjectWorkSpace.css b/Kieker.WebGUI/src/main/webapp/css/ProjectWorkSpace.css deleted file mode 100644 index dcb7112953fcc5128dc7f2b1a90b03d5e96168c9..0000000000000000000000000000000000000000 --- a/Kieker.WebGUI/src/main/webapp/css/ProjectWorkSpace.css +++ /dev/null @@ -1,5 +0,0 @@ -@charset "UTF-8"; - -.Force-Save-Project-Button { - white-space: nowrap -} \ No newline at end of file