mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-27 06:17:27 +00:00
Merge remote-tracking branch 'origin/master' into bug2775
This commit is contained in:
commit
480544df7a
1787 files changed
+188408
-21549
No files matched your search
@@ -1,2 +1,3 @@
|
||||
eclipse.preferences.version=1
|
||||
entryPointModules=
|
||||
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBW11dPjwvZXh0cmEtYXJncz48dm0tYXJncz48IVtDREFUQVstWG14NTEybV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc3NlLmd3dC5IaWdoY2hhcnRzX0F1dG9pbmplY3Q8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc3NlLmd3dC5Db21tb25Db250cm9sQ1NTX0F1dG9pbmplY3Q8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\=
|
||||
@@ -1,5 +1,7 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties=UTF-8
|
||||
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_de.properties=UTF-8
|
||||
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_ja.properties=UTF-8
|
||||
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_ru.properties=UTF-8
|
||||
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_zh.properties=UTF-8
|
||||
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_zh_CN.properties=UTF-8
|
||||
@@ -43,6 +43,7 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util,
|
||||
com.sap.sse.gwt.client.player,
|
||||
com.sap.sse.gwt.client.sapheader,
|
||||
com.sap.sse.gwt.client.shared.components,
|
||||
com.sap.sse.gwt.client.shared.perspective,
|
||||
com.sap.sse.gwt.client.useragent,
|
||||
com.sap.sse.gwt.common,
|
||||
com.sap.sse.gwt.dispatch.client,
|
||||
|
||||
+7
-7
@@ -30,7 +30,7 @@ import com.google.gwt.view.client.SelectionChangeEvent;
|
||||
public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
|
||||
implements RefreshableSelectionModel<T> {
|
||||
final EntityIdentityComparator<T> comp;
|
||||
private boolean dontcheckSelectionState = false;
|
||||
private boolean dontCheckSelectionState = false;
|
||||
private final ListDataProvider<T> listDataProvider;
|
||||
|
||||
/**
|
||||
@@ -72,7 +72,7 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
|
||||
*/
|
||||
@Override
|
||||
public void setSelected(T item, boolean selected) {
|
||||
if (comp == null || dontcheckSelectionState || item == null || getSelectedSet().isEmpty()) {
|
||||
if (comp == null || dontCheckSelectionState || item == null || getSelectedSet().isEmpty()) {
|
||||
super.setSelected(item, selected);
|
||||
} else {
|
||||
T wasSelectedBefore = null;
|
||||
@@ -94,9 +94,9 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
|
||||
}
|
||||
|
||||
/**
|
||||
* Refreshes the {@link RefreshableMultiSelectionModel} with the <code>newObjects</code>.All objects from the
|
||||
* Refreshes the {@link RefreshableMultiSelectionModel} with the <code>newObjects</code>. All objects from the
|
||||
* current selection that {@link EntityIdentityComparator#representSameEntity(Object, Object) represent the same
|
||||
* entity} as an object from <code>newObjects</code> will be reselected. All others are de-selected. That means a
|
||||
* entity} as an object from <code>newObjects</code> will be reselected. All others are de-selected. That means if a
|
||||
* selected object is not contained in <code>newObjects</code> the object wouldn't be selected anymore. If this
|
||||
* selection model has no {@link EntityIdentityComparator} set, this method will use the {@link #equals(Object)}
|
||||
* method to compare. If an object is reselected it will be replaced with the new version of it.
|
||||
@@ -111,8 +111,8 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
|
||||
*/
|
||||
@Override
|
||||
public void refreshSelectionModel(Iterable<T> newObjects) {
|
||||
if (!dontcheckSelectionState) { // avoid endless recursions
|
||||
dontcheckSelectionState = true;
|
||||
if (!dontCheckSelectionState) { // avoid endless recursions
|
||||
dontCheckSelectionState = true;
|
||||
try {
|
||||
final Set<T> selectedSet = getSelectedSet(); // gets the selected set as a non-live copy, so later
|
||||
// changes to the selection won't change this set anymore
|
||||
@@ -141,7 +141,7 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
|
||||
SelectionChangeEvent.fire(this);
|
||||
}
|
||||
} finally {
|
||||
dontcheckSelectionState = false;
|
||||
dontCheckSelectionState = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
save=保存
|
||||
remove=削除
|
||||
ok=OK
|
||||
cancel=取消
|
||||
add=追加
|
||||
edit=編集
|
||||
serverError=サーバにアクセスしようとしてエラーが発生しました。ネットワーク接続を確認して、再試行してください。
|
||||
close=終了
|
||||
remoteProcedureCall=リモートプロシージャコール
|
||||
serverReplies=サーバ応答
|
||||
errorCommunicatingWithServer=サーバとの通信でエラー発生
|
||||
active=有効
|
||||
setAsActive=有効に設定
|
||||
couldNotTestProperties=プロパティをテストできません
|
||||
couldNotSetProperties=プロパティを設定できません
|
||||
couldNotSetActiveService=有効なサービスを設定できません
|
||||
couldNotLoadActiveService=有効なサービスをロードできません
|
||||
couldNotLoadAvailableServices=利用可能なサービスをロードできません
|
||||
refresh=リフレッシュ
|
||||
name=名称
|
||||
value=値
|
||||
description=内容説明
|
||||
error=エラー
|
||||
configuration=設定
|
||||
settings=設定
|
||||
settingsForComponent={0} の設定
|
||||
pleaseSelect=選択してください:
|
||||
+3
-3
@@ -1,14 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file datatype="javapropertyresourcebundle" original="/usr/sap/ljs/app/Converter_1765894632275589659/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en">
|
||||
<file datatype="javapropertyresourcebundle" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en">
|
||||
<header>
|
||||
<skl>
|
||||
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
|
||||
</skl>
|
||||
<phase-group>
|
||||
<phase company-name="SAP AG" date="2016-04-14T07:19:06Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
|
||||
<phase company-name="SAP AG" date="2016-05-11T12:24:39Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
|
||||
</phase-group>
|
||||
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.0.0"/>
|
||||
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
|
||||
</header>
|
||||
<body>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
|
||||
|
||||
+124
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file datatype="javapropertyresourcebundle" date="2016-05-30T12:19:28Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ja">
|
||||
<header>
|
||||
<skl>
|
||||
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
|
||||
</skl>
|
||||
<phase-group>
|
||||
<phase company-name="SAP AG" date="2016-05-11T12:24:39Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
|
||||
</phase-group>
|
||||
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
|
||||
</header>
|
||||
<body>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
|
||||
<source>Save</source>
|
||||
<target state="signed-off">保存</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remove" resname="remove">
|
||||
<source>Remove</source>
|
||||
<target state="signed-off">削除</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="ok" resname="ok">
|
||||
<source>OK</source>
|
||||
<target state="signed-off">OK</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="cancel" resname="cancel">
|
||||
<source>Cancel</source>
|
||||
<target state="signed-off">取消</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="add" resname="add">
|
||||
<source>Add</source>
|
||||
<target state="signed-off">追加</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="edit" resname="edit">
|
||||
<source>Edit</source>
|
||||
<target state="signed-off">編集</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="serverError" resname="serverError">
|
||||
<source>An error occurred while attempting to contact the server. Please check your network connection and try again.</source>
|
||||
<target state="signed-off">サーバにアクセスしようとしてエラーが発生しました。ネットワーク接続を確認して、再試行してください。</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="close" resname="close">
|
||||
<source>Close</source>
|
||||
<target state="signed-off">終了</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remoteProcedureCall" resname="remoteProcedureCall">
|
||||
<source>Remote Procedure Call</source>
|
||||
<target state="signed-off">リモートプロシージャコール</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="serverReplies" resname="serverReplies">
|
||||
<source>Server replies</source>
|
||||
<target state="signed-off">サーバ応答</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorCommunicatingWithServer" resname="errorCommunicatingWithServer">
|
||||
<source>Error communicating with server</source>
|
||||
<target state="signed-off">サーバとの通信でエラー発生</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="active" resname="active">
|
||||
<source>Active</source>
|
||||
<target state="signed-off">有効</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="setAsActive" resname="setAsActive">
|
||||
<source>Set as active</source>
|
||||
<target state="signed-off">有効に設定</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotTestProperties" resname="couldNotTestProperties">
|
||||
<source>Could not test properties</source>
|
||||
<target state="signed-off">プロパティをテストできません</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotSetProperties" resname="couldNotSetProperties">
|
||||
<source>Could not set properties</source>
|
||||
<target state="signed-off">プロパティを設定できません</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotSetActiveService" resname="couldNotSetActiveService">
|
||||
<source>Could not set active service</source>
|
||||
<target state="signed-off">有効なサービスを設定できません</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotLoadActiveService" resname="couldNotLoadActiveService">
|
||||
<source>Could not load active service</source>
|
||||
<target state="signed-off">有効なサービスをロードできません</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotLoadAvailableServices" resname="couldNotLoadAvailableServices">
|
||||
<source>Could not load available services</source>
|
||||
<target state="signed-off">利用可能なサービスをロードできません</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="refresh" resname="refresh">
|
||||
<source>Refresh</source>
|
||||
<target state="signed-off">リフレッシュ</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="name" resname="name">
|
||||
<source>Name</source>
|
||||
<target state="signed-off">名称</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="value" resname="value">
|
||||
<source>Value</source>
|
||||
<target state="signed-off">値</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="description" resname="description">
|
||||
<source>Description</source>
|
||||
<target state="signed-off">内容説明</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="error" resname="error">
|
||||
<source>Error</source>
|
||||
<target state="signed-off">エラー</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="configuration" resname="configuration">
|
||||
<source>Configuration</source>
|
||||
<target state="signed-off">設定</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settings" resname="settings">
|
||||
<source>Settings</source>
|
||||
<target state="signed-off">設定</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settingsForComponent" resname="settingsForComponent">
|
||||
<source>Settings for <ph id="1">{0}</ph></source>
|
||||
<target state="signed-off"><ph id="1">{0}</ph> の設定</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseSelect" resname="pleaseSelect">
|
||||
<source>Please select</source>
|
||||
<target state="signed-off">選択してください:</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
+3
-3
@@ -1,14 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file datatype="javapropertyresourcebundle" date="2016-04-18T13:56:50Z" original="/usr/sap/ljs/app/Converter_1765894632275589659/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ru">
|
||||
<file datatype="javapropertyresourcebundle" date="2016-05-30T12:19:28Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ru">
|
||||
<header>
|
||||
<skl>
|
||||
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
|
||||
</skl>
|
||||
<phase-group>
|
||||
<phase company-name="SAP AG" date="2016-04-14T07:19:06Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
|
||||
<phase company-name="SAP AG" date="2016-05-11T12:24:39Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
|
||||
</phase-group>
|
||||
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.0.0"/>
|
||||
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
|
||||
</header>
|
||||
<body>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
|
||||
|
||||
+30
-30
@@ -1,123 +1,123 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file datatype="javapropertyresourcebundle" date="2016-04-18T13:56:50Z" original="/usr/sap/ljs/app/Converter_1765894632275589659/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="zh-CN">
|
||||
<file datatype="javapropertyresourcebundle" date="2016-05-30T12:19:28Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="zh-CN">
|
||||
<header>
|
||||
<skl>
|
||||
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
|
||||
</skl>
|
||||
<phase-group>
|
||||
<phase company-name="SAP AG" date="2016-04-14T07:19:06Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
|
||||
<phase company-name="SAP AG" date="2016-05-11T12:24:39Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
|
||||
</phase-group>
|
||||
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.0.0"/>
|
||||
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
|
||||
</header>
|
||||
<body>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
|
||||
<source>Save</source>
|
||||
<target>保存</target>
|
||||
<target state="signed-off">保存</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remove" resname="remove">
|
||||
<source>Remove</source>
|
||||
<target>删除</target>
|
||||
<target state="signed-off">删除</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="ok" resname="ok">
|
||||
<source>OK</source>
|
||||
<target>确定</target>
|
||||
<target state="signed-off">确定</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="cancel" resname="cancel">
|
||||
<source>Cancel</source>
|
||||
<target>取消</target>
|
||||
<target state="signed-off">取消</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="add" resname="add">
|
||||
<source>Add</source>
|
||||
<target>添加</target>
|
||||
<target state="signed-off">添加</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="edit" resname="edit">
|
||||
<source>Edit</source>
|
||||
<target>编辑</target>
|
||||
<target state="signed-off">编辑</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="serverError" resname="serverError">
|
||||
<source>An error occurred while attempting to contact the server. Please check your network connection and try again.</source>
|
||||
<target>尝试联系服务器时出错。请检查网络连接,并重试。</target>
|
||||
<target state="signed-off">尝试联系服务器时出错。请检查网络连接,并重试。</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="close" resname="close">
|
||||
<source>Close</source>
|
||||
<target>关闭</target>
|
||||
<target state="signed-off">关闭</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remoteProcedureCall" resname="remoteProcedureCall">
|
||||
<source>Remote Procedure Call</source>
|
||||
<target>远程过程调用</target>
|
||||
<target state="signed-off">远程过程调用</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="serverReplies" resname="serverReplies">
|
||||
<source>Server replies</source>
|
||||
<target>服务器应答</target>
|
||||
<target state="signed-off">服务器应答</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorCommunicatingWithServer" resname="errorCommunicatingWithServer">
|
||||
<source>Error communicating with server</source>
|
||||
<target>与服务器通信时发生错误</target>
|
||||
<target state="signed-off">与服务器通信时发生错误</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="active" resname="active">
|
||||
<source>Active</source>
|
||||
<target>已激活</target>
|
||||
<target state="signed-off">已激活</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="setAsActive" resname="setAsActive">
|
||||
<source>Set as active</source>
|
||||
<target>设置为已激活</target>
|
||||
<target state="signed-off">设置为已激活</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotTestProperties" resname="couldNotTestProperties">
|
||||
<source>Could not test properties</source>
|
||||
<target>无法测试属性</target>
|
||||
<target state="signed-off">无法测试属性</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotSetProperties" resname="couldNotSetProperties">
|
||||
<source>Could not set properties</source>
|
||||
<target>无法设置属性</target>
|
||||
<target state="signed-off">无法设置属性</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotSetActiveService" resname="couldNotSetActiveService">
|
||||
<source>Could not set active service</source>
|
||||
<target>无法设置已激活的服务</target>
|
||||
<target state="signed-off">无法设置已激活的服务</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotLoadActiveService" resname="couldNotLoadActiveService">
|
||||
<source>Could not load active service</source>
|
||||
<target>无法加载已激活的服务</target>
|
||||
<target state="signed-off">无法加载已激活的服务</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotLoadAvailableServices" resname="couldNotLoadAvailableServices">
|
||||
<source>Could not load available services</source>
|
||||
<target>无法加载可用的服务</target>
|
||||
<target state="signed-off">无法加载可用的服务</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="refresh" resname="refresh">
|
||||
<source>Refresh</source>
|
||||
<target>刷新</target>
|
||||
<target state="signed-off">刷新</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="name" resname="name">
|
||||
<source>Name</source>
|
||||
<target>名称</target>
|
||||
<target state="signed-off">名称</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="value" resname="value">
|
||||
<source>Value</source>
|
||||
<target>值</target>
|
||||
<target state="signed-off">值</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="description" resname="description">
|
||||
<source>Description</source>
|
||||
<target>描述</target>
|
||||
<target state="signed-off">描述</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="error" resname="error">
|
||||
<source>Error</source>
|
||||
<target>错误</target>
|
||||
<target state="signed-off">错误</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="configuration" resname="configuration">
|
||||
<source>Configuration</source>
|
||||
<target>配置</target>
|
||||
<target state="signed-off">配置</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settings" resname="settings">
|
||||
<source>Settings</source>
|
||||
<target>设置</target>
|
||||
<target state="signed-off">设置</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settingsForComponent" resname="settingsForComponent">
|
||||
<source>Settings for <ph id="1">{0}</ph></source>
|
||||
<target><ph id="1">{0}</ph>设置</target>
|
||||
<target state="signed-off"><ph id="1">{0}</ph>设置</target>
|
||||
</trans-unit>
|
||||
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseSelect" resname="pleaseSelect">
|
||||
<source>Please select</source>
|
||||
<target>请选择</target>
|
||||
<target state="signed-off">请选择</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
|
||||
@@ -528,6 +528,10 @@ public abstract class DataEntryDialog<T> {
|
||||
dateEntryDialog.getElement().getStyle().setCursor(cursor);
|
||||
}
|
||||
|
||||
public void center() {
|
||||
dateEntryDialog.center();
|
||||
}
|
||||
|
||||
public void show() {
|
||||
Widget additionalWidget = getAdditionalWidget();
|
||||
if (additionalWidget != null) {
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.sap.sse.gwt.client.panels;
|
||||
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.RequiresResize;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.google.gwt.user.client.ui.WidgetCollection;
|
||||
|
||||
/**
|
||||
* Utility class extending {@link FlowPanel} and implementing {@link RequiresResize} interface. All
|
||||
* {@link #getChildren() children} also implementing {@link RequiresResize} are informed by calling their
|
||||
* {@link RequiresResize#onResize()} method.
|
||||
*/
|
||||
public class ResizableFlowPanel extends FlowPanel implements RequiresResize {
|
||||
@Override
|
||||
public void onResize() {
|
||||
WidgetCollection children = getChildren();
|
||||
for (Widget widget : children) {
|
||||
if (widget instanceof RequiresResize) {
|
||||
((RequiresResize) widget).onResize();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,6 @@
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
|
||||
.siteheaderLeft {
|
||||
position: relative; top:10px;left:10px;
|
||||
display: inline-block;
|
||||
@@ -54,9 +53,9 @@
|
||||
}
|
||||
|
||||
.logotitle {
|
||||
font-size: 1rem;
|
||||
display: inline-block;
|
||||
color: #f6f9fc;
|
||||
font-weight: bold;
|
||||
width: 150px;
|
||||
height: 100%;
|
||||
padding: 17px 15px 0 0;
|
||||
@@ -64,9 +63,7 @@
|
||||
text-align: right;
|
||||
border-right: 1px solid rgb(180,180,180);
|
||||
margin: 0px;
|
||||
|
||||
margin-left: -25px;
|
||||
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.pagetitle {
|
||||
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
|
||||
public abstract class AbstractComponent<SettingsType extends Settings> implements Component<SettingsType> {
|
||||
@Override
|
||||
public String getId() {
|
||||
return getLocalizedShortName();
|
||||
}
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
|
||||
public abstract class AbstractCompositeComponent<SettingsType extends Settings> extends Composite implements Component<SettingsType> {
|
||||
|
||||
@Override
|
||||
public Serializable getId() {
|
||||
return getLocalizedShortName();
|
||||
}
|
||||
}
|
||||
+5
@@ -16,4 +16,9 @@ public abstract class AbstractLazyComponent<SettingsType extends AbstractSetting
|
||||
public String getDependentCssClassName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return getLocalizedShortName();
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,21 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.perspective.Perspective;
|
||||
|
||||
public interface Component<SettingsType extends Settings> {
|
||||
/**
|
||||
* Each component instance has an ID that has to be unique in the context in which the component is used
|
||||
* and has its siblings. In particular, multiple components of the same type but with distinct IDs may
|
||||
* exist, e.g., multiple wind charts showing wind readings coming from different sensors. The uniqueness
|
||||
* constraint applies only to the single level (in a composite pattern of components, such as
|
||||
* {@link Perspective}) in which this component instance is used.
|
||||
*/
|
||||
Serializable getId();
|
||||
|
||||
/**
|
||||
* @return the name to display to a user for quick navigation to this component
|
||||
*/
|
||||
@@ -33,6 +45,11 @@ public interface Component<SettingsType extends Settings> {
|
||||
*/
|
||||
SettingsDialogComponent<SettingsType> getSettingsDialogComponent();
|
||||
|
||||
/**
|
||||
* @return the current settings of the component or {@code null} if the component has no settings.
|
||||
*/
|
||||
SettingsType getSettings();
|
||||
|
||||
/**
|
||||
* Updates the settings of this component. Expected to be called when a settings dialog using this component's
|
||||
* {@link #getSettingsDialogComponent()} has been confirmed.
|
||||
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
|
||||
/**
|
||||
* A {@link ComponentLifecycle} decouples the lifecycle of a component from the corresponding component instance. This way we
|
||||
* can create, e.g., settings for a component with a settings dialog without the need to instantiate the component.
|
||||
*
|
||||
* @param <S>
|
||||
* the Settings type
|
||||
* @param <SDC>
|
||||
* the SettingsDialogComponent type
|
||||
* @author Frank Mittag
|
||||
*/
|
||||
public interface ComponentLifecycle<S extends Settings, SDC extends SettingsDialogComponent<S>> {
|
||||
|
||||
SDC getSettingsDialogComponent(S settings);
|
||||
|
||||
S createDefaultSettings();
|
||||
|
||||
S cloneSettings(S settings);
|
||||
|
||||
/**
|
||||
* @return the display name of the component
|
||||
*/
|
||||
String getLocalizedShortName();
|
||||
|
||||
/**
|
||||
* @return the id of the component
|
||||
*/
|
||||
Serializable getComponentId();
|
||||
|
||||
/**
|
||||
* @return true if the component has settings that a user may change.
|
||||
*/
|
||||
boolean hasSettings();
|
||||
|
||||
}
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
|
||||
public interface ComponentViewer {
|
||||
|
||||
Widget getViewerWidget();
|
||||
|
||||
String getViewerName();
|
||||
|
||||
Component<?> getRootComponent();
|
||||
|
||||
void forceLayout();
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import com.sap.sse.common.settings.AbstractSettings;
|
||||
|
||||
/**
|
||||
* An abstract implementation of the component interfaces indented to use for components without the need of having settings.
|
||||
* @author Frank
|
||||
*
|
||||
*/
|
||||
public abstract class ComponentWithoutSettings extends AbstractComponent<AbstractSettings> {
|
||||
|
||||
@Override
|
||||
public boolean hasSettings() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SettingsDialogComponent<AbstractSettings> getSettingsDialogComponent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractSettings getSettings() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSettings(AbstractSettings newSettings) {
|
||||
// no-op
|
||||
}
|
||||
}
|
||||
+20
-15
@@ -1,26 +1,31 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import com.sap.sse.common.Util;
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sse.common.settings.AbstractSettings;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.perspective.Perspective;
|
||||
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings;
|
||||
|
||||
/**
|
||||
* Groups settings for multiple {@link Component}s. This can be of particular interest when working with
|
||||
* {@link Perspective}s and the perspective's {@link PerspectiveCompositeSettings composite settings}.
|
||||
*/
|
||||
public class CompositeSettings extends AbstractSettings {
|
||||
public static class ComponentAndSettingsPair<SettingsType extends Settings> extends Util.Pair<Component<SettingsType>, SettingsType> {
|
||||
private static final long serialVersionUID = -569811233041583043L;
|
||||
private final Map<Serializable, Settings> settingsPerComponentId;
|
||||
|
||||
public ComponentAndSettingsPair(Component<SettingsType> a, SettingsType b) {
|
||||
super(a, b);
|
||||
}
|
||||
public CompositeSettings(Map<Serializable, Settings> settingsPerComponentId) {
|
||||
this.settingsPerComponentId = new HashMap<>(settingsPerComponentId);
|
||||
}
|
||||
|
||||
public Map<Serializable, Settings> getSettingsPerComponentId() {
|
||||
return Collections.unmodifiableMap(settingsPerComponentId);
|
||||
}
|
||||
|
||||
private final Iterable<ComponentAndSettingsPair<?>> settingsPerComponent;
|
||||
|
||||
public CompositeSettings(Iterable<ComponentAndSettingsPair<?>> settingsPerComponent) {
|
||||
this.settingsPerComponent = settingsPerComponent;
|
||||
public <C extends ComponentLifecycle<S,?>, S extends Settings> Settings findSettingsByComponentId(Serializable componentId) {
|
||||
return settingsPerComponentId.get(componentId);
|
||||
}
|
||||
|
||||
public Iterable<ComponentAndSettingsPair<?>> getSettingsPerComponent() {
|
||||
return settingsPerComponent;
|
||||
}
|
||||
|
||||
}
|
||||
-91
@@ -1,91 +0,0 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
|
||||
|
||||
/**
|
||||
* A component, that contains a collection of settings components in a tabbed panel.
|
||||
*
|
||||
* @author Axel Uhl (d043530), Lennart Hensler (D054527)
|
||||
*/
|
||||
public class CompositeTabbedSettingsComponent implements Component<CompositeSettings> {
|
||||
|
||||
private final Iterable<Component<?>> components;
|
||||
private final String title;
|
||||
|
||||
public CompositeTabbedSettingsComponent(Iterable<Component<?>> components) {
|
||||
this(components, null);
|
||||
}
|
||||
|
||||
public CompositeTabbedSettingsComponent(Iterable<Component<?>> components, String title) {
|
||||
this.components = components;
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSettings() {
|
||||
for (Component<?> component : components) {
|
||||
if (component.hasSettings()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SettingsDialogComponent<CompositeSettings> getSettingsDialogComponent() {
|
||||
return new CompositeTabbedSettingsDialogComponent(components);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSettings(CompositeSettings newSettings) {
|
||||
for (CompositeSettings.ComponentAndSettingsPair<?> componentAndSettings : newSettings.getSettingsPerComponent()) {
|
||||
updateSettings(componentAndSettings);
|
||||
}
|
||||
}
|
||||
|
||||
private <SettingsType extends Settings> void updateSettings(ComponentAndSettingsPair<SettingsType> componentAndSettings) {
|
||||
componentAndSettings.getA().updateSettings(componentAndSettings.getB());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalizedShortName() {
|
||||
if (title != null && !title.isEmpty()) {
|
||||
return title;
|
||||
} else {
|
||||
StringBuilder result = new StringBuilder();
|
||||
boolean first = true;
|
||||
for (Component<?> component : components) {
|
||||
if (first) {
|
||||
first = false;
|
||||
} else {
|
||||
result.append(" / ");
|
||||
}
|
||||
result.append(component.getLocalizedShortName());
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Widget getEntryWidget() {
|
||||
throw new RuntimeException("Virtual composite component doesn't have a widget of its own");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible(boolean visibility) {
|
||||
throw new RuntimeException("Virtual composite component doesn't know how to make itself visible");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDependentCssClassName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import com.sap.sse.gwt.client.StringMessages;
|
||||
|
||||
/**
|
||||
* A composite settings dialog that combines the settings of several {@link Component}s, providing a tab
|
||||
* for each component.
|
||||
*
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public class CompositeTabbedSettingsDialog extends SettingsDialog<CompositeSettings> {
|
||||
|
||||
public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Iterable<Component<?>> components) {
|
||||
this(stringConstants, components, null);
|
||||
}
|
||||
|
||||
public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Iterable<Component<?>> components, final String title) {
|
||||
super(new CompositeTabbedSettingsComponent(components, title), stringConstants);
|
||||
}
|
||||
|
||||
}
|
||||
+5
-9
@@ -1,8 +1,10 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.gwt.user.client.ui.FocusWidget;
|
||||
import com.google.gwt.user.client.ui.TabPanel;
|
||||
@@ -11,7 +13,6 @@ import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
|
||||
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
|
||||
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
|
||||
|
||||
public class CompositeTabbedSettingsDialogComponent implements SettingsDialogComponent<CompositeSettings> {
|
||||
|
||||
@@ -21,7 +22,6 @@ public class CompositeTabbedSettingsDialogComponent implements SettingsDialogCom
|
||||
public ComponentAndDialogComponent(Component<SettingsType> a, SettingsDialogComponent<SettingsType> b) {
|
||||
super(a, b);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final Collection<ComponentAndDialogComponent<?>> components;
|
||||
@@ -52,17 +52,13 @@ public class CompositeTabbedSettingsDialogComponent implements SettingsDialogCom
|
||||
|
||||
@Override
|
||||
public CompositeSettings getResult() {
|
||||
Collection<ComponentAndSettingsPair<?>> settings = new HashSet<>();
|
||||
Map<Serializable, Settings> settings = new HashMap<>();
|
||||
for (ComponentAndDialogComponent<?> component : components) {
|
||||
settings.add(getComponentAndSettings(component));
|
||||
settings.put(component.getA().getId(), component.getB().getResult());
|
||||
}
|
||||
return new CompositeSettings(settings);
|
||||
}
|
||||
|
||||
private <SettingsType extends Settings> ComponentAndSettingsPair<SettingsType> getComponentAndSettings(ComponentAndDialogComponent<SettingsType> component) {
|
||||
return new ComponentAndSettingsPair<SettingsType>(component.getA(), component.getB().getResult());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Validator<CompositeSettings> getValidator() {
|
||||
return new CompositeValidator(components);
|
||||
|
||||
+9
-8
@@ -1,28 +1,29 @@
|
||||
package com.sap.sse.gwt.client.shared.components;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
|
||||
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
|
||||
import com.sap.sse.gwt.client.shared.components.CompositeTabbedSettingsDialogComponent.ComponentAndDialogComponent;
|
||||
|
||||
public class CompositeValidator implements Validator<CompositeSettings> {
|
||||
|
||||
private final Map<Component<?>, Validator<?>> validatorsMappedByComponent;
|
||||
private final Map<Serializable, Validator<?>> validatorsMappedByComponent;
|
||||
|
||||
public CompositeValidator(Iterable<ComponentAndDialogComponent<?>> componentsAndDialogComponents) {
|
||||
validatorsMappedByComponent = new HashMap<>();
|
||||
for (ComponentAndDialogComponent<?> component : componentsAndDialogComponents) {
|
||||
validatorsMappedByComponent.put(component.getA(), component.getB().getValidator());
|
||||
validatorsMappedByComponent.put(component.getA().getId(), component.getB().getValidator());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getErrorMessage(CompositeSettings valueToValidate) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
for (ComponentAndSettingsPair<?> componentAndSettings : valueToValidate.getSettingsPerComponent()) {
|
||||
final StringBuilder result = new StringBuilder();
|
||||
for (Entry<Serializable, Settings> componentAndSettings : valueToValidate.getSettingsPerComponentId().entrySet()) {
|
||||
final String errorMessage = getErrorMessage(componentAndSettings);
|
||||
if (errorMessage != null && !errorMessage.isEmpty()) {
|
||||
result.append(errorMessage);
|
||||
@@ -31,12 +32,12 @@ public class CompositeValidator implements Validator<CompositeSettings> {
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
private <SettingsType extends Settings> String getErrorMessage(ComponentAndSettingsPair<SettingsType> componentAndSettings) {
|
||||
private <SettingsType extends Settings> String getErrorMessage(Entry<Serializable, SettingsType> componentIdAndSettings) {
|
||||
String errorMessage = null;
|
||||
@SuppressWarnings("unchecked")
|
||||
Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponent.get(componentAndSettings.getA());
|
||||
final Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponent.get(componentIdAndSettings.getKey());
|
||||
if (validator != null) {
|
||||
errorMessage = validator.getErrorMessage(componentAndSettings.getB());
|
||||
errorMessage = validator.getErrorMessage(componentIdAndSettings.getValue());
|
||||
if (errorMessage != null && !errorMessage.isEmpty() && !getClass().equals(validator.getClass())) {
|
||||
errorMessage += "; ";
|
||||
}
|
||||
|
||||
+25
-15
@@ -17,6 +17,14 @@ public class SettingsDialog<SettingsType extends Settings> extends DataEntryDial
|
||||
this(component, stringMessages, /* animationEnabled */ true);
|
||||
}
|
||||
|
||||
public SettingsDialog(final Component<SettingsType> component, StringMessages stringMessages, boolean animationEnabled) {
|
||||
this(component, component.getSettingsDialogComponent(), stringMessages, animationEnabled, null);
|
||||
}
|
||||
|
||||
public SettingsDialog(final Component<SettingsType> component, StringMessages stringMessages, DialogCallback<SettingsType> callback) {
|
||||
this(component, component.getSettingsDialogComponent(), stringMessages, /* animationEnabled */ true, callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a settings button for <code>component</code> that, when clicked, opens a settings dialog for that
|
||||
* component and when confirmed, updates that component's settings. The button has no CSS style attached to
|
||||
@@ -43,26 +51,28 @@ public class SettingsDialog<SettingsType extends Settings> extends DataEntryDial
|
||||
*/
|
||||
private SettingsDialog(final Component<SettingsType> component,
|
||||
SettingsDialogComponent<SettingsType> dialogComponent, StringMessages stringMessages,
|
||||
boolean animationEnabled) {
|
||||
boolean animationEnabled, final DialogCallback<SettingsType> callback) {
|
||||
super(stringMessages.settingsForComponent(component.getLocalizedShortName()), null, stringMessages.ok(),
|
||||
stringMessages.cancel(), dialogComponent.getValidator(), animationEnabled,
|
||||
new DialogCallback<SettingsType>() {
|
||||
@Override
|
||||
public void cancel() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ok(SettingsType newSettings) {
|
||||
component.updateSettings(newSettings);
|
||||
}
|
||||
});
|
||||
new DialogCallback<SettingsType>() {
|
||||
@Override
|
||||
public void cancel() {
|
||||
if (callback != null) {
|
||||
callback.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ok(SettingsType newSettings) {
|
||||
component.updateSettings(newSettings);
|
||||
if (callback != null) {
|
||||
callback.ok(newSettings);
|
||||
}
|
||||
}
|
||||
});
|
||||
this.settingsDialogComponent = dialogComponent;
|
||||
}
|
||||
|
||||
public SettingsDialog(final Component<SettingsType> component, StringMessages stringMessages, boolean animationEnabled) {
|
||||
this(component, component.getSettingsDialogComponent(), stringMessages, animationEnabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Widget getAdditionalWidget() {
|
||||
return settingsDialogComponent.getAdditionalWidget(this);
|
||||
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.components.AbstractCompositeComponent;
|
||||
import com.sap.sse.gwt.client.shared.components.Component;
|
||||
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
|
||||
|
||||
/**
|
||||
* An abstract base class for a {@link Perspective} with a widget.
|
||||
*
|
||||
* @author Frank Mittag
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractPerspectiveComposite<PL extends PerspectiveLifecycle<PS>, PS extends Settings>
|
||||
extends AbstractCompositeComponent<PerspectiveCompositeSettings<PS>> implements Perspective<PS> {
|
||||
|
||||
private final PL perspectiveLifecycle;
|
||||
private PS perspectiveOwnSettings;
|
||||
|
||||
protected final List<Component<?>> components;
|
||||
|
||||
protected SettingsDialogComponent<PS> getPerspectiveSettingsDialogComponent(PS perspectiveSettings) {
|
||||
return perspectiveLifecycle.getPerspectiveOwnSettingsDialogComponent(perspectiveSettings);
|
||||
}
|
||||
|
||||
public AbstractPerspectiveComposite(PL perspectiveLifecycle, PS perspectiveSettings) {
|
||||
this.components = new ArrayList<>();
|
||||
this.perspectiveLifecycle = perspectiveLifecycle;
|
||||
this.perspectiveOwnSettings = perspectiveSettings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PerspectiveCompositeSettings<PS> getSettings() {
|
||||
Map<Serializable, Settings> settingsPerComponent = new HashMap<>();
|
||||
for (Component<?> c : getComponents()) {
|
||||
if (c.hasSettings()) {
|
||||
settingsPerComponent.put(c.getId(), c.getSettings());
|
||||
}
|
||||
}
|
||||
return new PerspectiveCompositeSettings<>(perspectiveOwnSettings, settingsPerComponent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSettings(PerspectiveCompositeSettings<PS> newSettings) {
|
||||
for (Entry<Serializable, Settings> componentAndSettings : newSettings.getSettingsPerComponentId().entrySet()) {
|
||||
updateSettings(componentAndSettings);
|
||||
}
|
||||
this.perspectiveOwnSettings = newSettings.getPerspectiveOwnSettings();
|
||||
}
|
||||
|
||||
private <S extends Settings> void updateSettings(Entry<Serializable, S> componentIdAndSettings) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Component<S> component = (Component<S>) findComponentById(componentIdAndSettings.getKey());
|
||||
if (component != null) {
|
||||
component.updateSettings(componentIdAndSettings.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
private Component<?> findComponentById(Serializable componentId) {
|
||||
for (Component<?> component : getComponents()) {
|
||||
if (component.getId().equals(componentId)) {
|
||||
return component;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Widget getEntryWidget() {
|
||||
return this.asWidget();
|
||||
}
|
||||
|
||||
public List<Component<?>> getComponents() {
|
||||
return components;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalizedShortName() {
|
||||
return perspectiveLifecycle.getLocalizedShortName();
|
||||
}
|
||||
|
||||
public boolean hasSettings() {
|
||||
return perspectiveLifecycle.hasSettings();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SettingsDialogComponent<PerspectiveCompositeSettings<PS>> getSettingsDialogComponent() {
|
||||
return new PerspectiveCompositeTabbedSettingsDialogComponent<>(this);
|
||||
}
|
||||
|
||||
protected PS getPerspectiveSettings() {
|
||||
return perspectiveOwnSettings;
|
||||
}
|
||||
|
||||
protected PL getPerspectiveLifecycle() {
|
||||
return perspectiveLifecycle;
|
||||
}
|
||||
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
|
||||
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
|
||||
|
||||
/**
|
||||
* An abstract base class for perspective lifecycle's. Subclasses need to add the {@link ComponentLifecycle} instances
|
||||
* for their child components to the {@link #componentLifecycles} structure in their constructor.
|
||||
*
|
||||
* @param <PS>
|
||||
* the perspective settings type
|
||||
* @author Frank Mittag
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractPerspectiveLifecycle<PS extends Settings> implements PerspectiveLifecycle<PS> {
|
||||
|
||||
protected final List<ComponentLifecycle<?,?>> componentLifecycles;
|
||||
|
||||
public AbstractPerspectiveLifecycle() {
|
||||
componentLifecycles = new ArrayList<>();
|
||||
}
|
||||
|
||||
public PerspectiveCompositeTabbedSettingsDialogComponent<PS> getSettingsDialogComponent(PerspectiveCompositeSettings<PS> settings) {
|
||||
PerspectiveLifecycleWithAllSettings<?, PS> perspectiveLifecycleWithAllSettings = new PerspectiveLifecycleWithAllSettings<>(this, settings);
|
||||
return new PerspectiveCompositeTabbedSettingsDialogComponent<PS>(perspectiveLifecycleWithAllSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PerspectiveCompositeSettings<PS> createDefaultSettings() {
|
||||
PS perspectiveOwnSettings = createPerspectiveOwnDefaultSettings();
|
||||
return new PerspectiveCompositeSettings<>(perspectiveOwnSettings, getComponentIdsAndDefaultSettings().getSettingsPerComponentId());
|
||||
}
|
||||
|
||||
protected CompositeSettings getComponentIdsAndDefaultSettings() {
|
||||
Map<Serializable, Settings> componentIdsAndSettings = new HashMap<>();
|
||||
for (ComponentLifecycle<?,?> componentLifecycle : componentLifecycles) {
|
||||
componentIdsAndSettings.put(componentLifecycle.getComponentId(), componentLifecycle.createDefaultSettings());
|
||||
}
|
||||
CompositeSettings compositeSettings = new CompositeSettings(componentIdsAndSettings);
|
||||
return compositeSettings;
|
||||
}
|
||||
|
||||
public Iterable<ComponentLifecycle<?,?>> getComponentLifecycles() {
|
||||
return componentLifecycles;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Serializable getComponentId() {
|
||||
return getLocalizedShortName();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.components.Component;
|
||||
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
|
||||
|
||||
/**
|
||||
* A perspective is a composition of UI components into a view/page. The perspective itself is also an {@link Component}
|
||||
* and can have {@link Settings}.
|
||||
*
|
||||
* @param <PS>
|
||||
* the {@link Perspective} settings type
|
||||
*/
|
||||
public interface Perspective<PS extends Settings> extends Component<PerspectiveCompositeSettings<PS>> {
|
||||
List<Component<?>> getComponents();
|
||||
|
||||
SettingsDialogComponent<PS> getPerspectiveOwnSettingsDialogComponent();
|
||||
|
||||
boolean hasPerspectiveOwnSettings();
|
||||
}
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.components.AbstractComponent;
|
||||
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
|
||||
|
||||
/**
|
||||
* A component that contains a collection of settings components in a tabbed panel.
|
||||
*
|
||||
* @author Frank (c5163874)
|
||||
* @param <PL>
|
||||
* the {@link PerspectiveLifecycle} type
|
||||
* @param <PS>
|
||||
* the {@link Perspective} settings type
|
||||
*/
|
||||
public class PerspectiveCompositeLifecycleTabbedSettingsComponent<PL extends PerspectiveLifecycle<PS>, PS extends Settings>
|
||||
extends AbstractComponent<PerspectiveCompositeSettings<PS>> {
|
||||
|
||||
private PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings;
|
||||
private final String title;
|
||||
private PerspectiveCompositeSettings<PS> perspectiveCompositeSettings;
|
||||
|
||||
public PerspectiveCompositeLifecycleTabbedSettingsComponent(PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings) {
|
||||
this(perspectiveLifecycleWithAllSettings, null);
|
||||
}
|
||||
|
||||
public PerspectiveCompositeLifecycleTabbedSettingsComponent(PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings, String title) {
|
||||
this.perspectiveLifecycleWithAllSettings = perspectiveLifecycleWithAllSettings;
|
||||
this.perspectiveCompositeSettings = perspectiveLifecycleWithAllSettings.getAllSettings();
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSettings() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SettingsDialogComponent<PerspectiveCompositeSettings<PS>> getSettingsDialogComponent() {
|
||||
return new PerspectiveCompositeTabbedSettingsDialogComponent<PS>(perspectiveLifecycleWithAllSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PerspectiveCompositeSettings<PS> getSettings() {
|
||||
return perspectiveCompositeSettings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSettings(PerspectiveCompositeSettings<PS> newSettings) {
|
||||
this.perspectiveCompositeSettings = newSettings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalizedShortName() {
|
||||
if (title != null && !title.isEmpty()) {
|
||||
return title;
|
||||
}
|
||||
return perspectiveLifecycleWithAllSettings.getPerspectiveLifecycle().getLocalizedShortName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Widget getEntryWidget() {
|
||||
throw new RuntimeException("Virtual composite component doesn't have a widget of its own");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible(boolean visibility) {
|
||||
throw new RuntimeException("Virtual composite component doesn't know how to make itself visible");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDependentCssClassName() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.StringMessages;
|
||||
import com.sap.sse.gwt.client.shared.components.SettingsDialog;
|
||||
|
||||
/**
|
||||
* A composite settings dialog that combines all settings of a perspective provide by a {@link PerspectiveLifecycle}.
|
||||
*
|
||||
* @author Frank Mittag (c5163874)
|
||||
* @param <PL>
|
||||
* the type of the PerspectiveLifecycle
|
||||
* @param <PS>
|
||||
* the type of the Perspective settings
|
||||
*
|
||||
*/
|
||||
public class PerspectiveCompositeLifecycleTabbedSettingsDialog<PL extends PerspectiveLifecycle<PS>, PS extends Settings>
|
||||
extends SettingsDialog<PerspectiveCompositeSettings<PS>> {
|
||||
|
||||
public PerspectiveCompositeLifecycleTabbedSettingsDialog(StringMessages stringConstants, PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings, String title) {
|
||||
super(new PerspectiveCompositeLifecycleTabbedSettingsComponent<PL,PS>(perspectiveLifecycleWithAllSettings, title), stringConstants);
|
||||
}
|
||||
|
||||
public PerspectiveCompositeLifecycleTabbedSettingsDialog(StringMessages stringConstants, PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings,
|
||||
String title, DialogCallback<PerspectiveCompositeSettings<PS>> callback) {
|
||||
super(new PerspectiveCompositeLifecycleTabbedSettingsComponent<PL,PS>(perspectiveLifecycleWithAllSettings, title), stringConstants, callback);
|
||||
}
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.components.Component;
|
||||
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
|
||||
|
||||
/**
|
||||
* A composite settings class for a perspective aggregating the {@link #getPerspectiveOwnSettings() settings of the
|
||||
* perspective itself} as well as the settings of all contained components. The perspective-specific settings are
|
||||
* <em>not</em> part of the general composite settings' {@link #getSettingsPerComponentId()} result (although a
|
||||
* {@link Perspective} is a {@link Component}) to make it clear that the perspective to which these settings belong is
|
||||
* not nested in itself. Note that any of the component of the component/settings pairs returned by
|
||||
* {@link #getSettingsPerComponentId()} may again be a perspective.
|
||||
*
|
||||
* @author Frank Mittag
|
||||
*
|
||||
* @param <PS>
|
||||
* the {@link Perspective}'s own settings type; those could, e.g., hold settings such as how much space
|
||||
* is assigned to which component, or how the perspective displays itself, such as embedded or not
|
||||
*/
|
||||
public class PerspectiveCompositeSettings<PS extends Settings> extends CompositeSettings {
|
||||
private final PS perspectiveOwnSettings;
|
||||
|
||||
public PerspectiveCompositeSettings(PS perspectiveOwnSettings, Map<Serializable, Settings> settingsPerComponent) {
|
||||
super(settingsPerComponent);
|
||||
this.perspectiveOwnSettings = perspectiveOwnSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the perspective-specific settings; those could, e.g., be settings that govern which of the components are
|
||||
* currently visible or how the components are to be displayed in the context of the perspective; these
|
||||
* settings may also control visualization properties for the perspective that are not specific to any
|
||||
* particular component, such as a background color, presence of a general header or general refresh
|
||||
* behavior.
|
||||
*/
|
||||
public PS getPerspectiveOwnSettings() {
|
||||
return perspectiveOwnSettings;
|
||||
}
|
||||
|
||||
public boolean hasSettings() {
|
||||
return getSettingsPerComponentId() != null || perspectiveOwnSettings != null;
|
||||
}
|
||||
|
||||
}
|
||||
+205
@@ -0,0 +1,205 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.gwt.event.logical.shared.SelectionEvent;
|
||||
import com.google.gwt.event.logical.shared.SelectionHandler;
|
||||
import com.google.gwt.user.client.ui.FocusWidget;
|
||||
import com.google.gwt.user.client.ui.TabPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
|
||||
import com.sap.sse.gwt.client.shared.components.Component;
|
||||
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
|
||||
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
|
||||
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
|
||||
|
||||
/**
|
||||
* @author Frank Mittag
|
||||
*
|
||||
* @param <PS>
|
||||
* the type of the perspective own settings
|
||||
**/
|
||||
public class PerspectiveCompositeTabbedSettingsDialogComponent<PS extends Settings>
|
||||
implements SettingsDialogComponent<PerspectiveCompositeSettings<PS>> {
|
||||
|
||||
public static class ComponentIdWithSettingsAndDialogComponent<S extends Settings> {
|
||||
private final Serializable componentId;
|
||||
private final S settings;
|
||||
private final SettingsDialogComponent<S> settingsDialog;
|
||||
private final String componentName;
|
||||
|
||||
public ComponentIdWithSettingsAndDialogComponent(String componentName, Serializable componentId, S settings, SettingsDialogComponent<S> settingsDialog) {
|
||||
this.componentName = componentName;
|
||||
this.componentId = componentId;
|
||||
this.settings = settings;
|
||||
this.settingsDialog = settingsDialog;
|
||||
}
|
||||
|
||||
public Serializable getComponentId() {
|
||||
return componentId;
|
||||
}
|
||||
|
||||
public S getSettings() {
|
||||
return settings;
|
||||
}
|
||||
|
||||
|
||||
public SettingsDialogComponent<S> getSettingsDialog() {
|
||||
return settingsDialog;
|
||||
}
|
||||
|
||||
public String getComponentName() {
|
||||
return componentName;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param <PS>
|
||||
* the {@link Perspective} own settings type
|
||||
*/
|
||||
public static class PerspectiveIdWithSettingsAndDialogComponent<PS extends Settings> {
|
||||
private final PS perspectiveOwnSettings;
|
||||
private final SettingsDialogComponent<PS> settingsDialog;
|
||||
private final String perspectiveName;
|
||||
|
||||
public PerspectiveIdWithSettingsAndDialogComponent(String perspectiveName, PS perspectiveOwnSettings,
|
||||
SettingsDialogComponent<PS> settingsDialog) {
|
||||
this.perspectiveName = perspectiveName;
|
||||
this.perspectiveOwnSettings = perspectiveOwnSettings;
|
||||
this.settingsDialog = settingsDialog;
|
||||
}
|
||||
|
||||
public PS getPerspectiveOwnSettings() {
|
||||
return perspectiveOwnSettings;
|
||||
}
|
||||
|
||||
public SettingsDialogComponent<PS> getSettingsDialog() {
|
||||
return settingsDialog;
|
||||
}
|
||||
|
||||
public String getPerspectiveName() {
|
||||
return perspectiveName;
|
||||
}
|
||||
}
|
||||
|
||||
private final List<ComponentIdWithSettingsAndDialogComponent<?>> componentIdsAndDialogComponents;
|
||||
private final PerspectiveIdWithSettingsAndDialogComponent<PS> perspectiveIdsAndSettingsDialog;
|
||||
|
||||
public PerspectiveCompositeTabbedSettingsDialogComponent(Perspective<PS> perspective) {
|
||||
this.componentIdsAndDialogComponents = new ArrayList<>();
|
||||
for (Component<?> component : perspective.getComponents()) {
|
||||
componentIdsAndDialogComponents.add(createComponentAndDialogComponent(component));
|
||||
}
|
||||
perspectiveIdsAndSettingsDialog = createPerspectiveAndDialogComponent(perspective);
|
||||
}
|
||||
|
||||
/**
|
||||
* From the {@link PerspectiveLifecycle} {@link PerspectiveLifecycleWithAllSettings#getPerspectiveLifecycle()
|
||||
* referenced} by {@code perspectiveLifecycleWithAllSettings}, this constructor grabs all the
|
||||
* {@link ComponentLifecycle} objects for those nested components that have settings,
|
||||
* {@link ComponentLifecycle#getSettingsDialogComponent(Settings) fetches their settings dialog component} and maps
|
||||
* it in {@link #componentIdsAndDialogComponents}. Then, the
|
||||
* {@link #createPerspectiveIdAndDialogComponent(PerspectiveLifecycle, Settings)} method assembles them, together
|
||||
* with the perspective's own settings dialog component.
|
||||
*/
|
||||
public PerspectiveCompositeTabbedSettingsDialogComponent(PerspectiveLifecycleWithAllSettings<?, PS> perspectiveLifecycleWithAllSettings) {
|
||||
this.componentIdsAndDialogComponents = new ArrayList<>();
|
||||
CompositeSettings componentSettings = perspectiveLifecycleWithAllSettings.getComponentSettings();
|
||||
for (ComponentLifecycle<?,?> componentLifecycle : perspectiveLifecycleWithAllSettings.getPerspectiveLifecycle().getComponentLifecycles()) {
|
||||
if (componentLifecycle.hasSettings()) {
|
||||
createComponentIdWithSettingsAndDialogComponent(componentSettings, componentLifecycle);
|
||||
}
|
||||
}
|
||||
perspectiveIdsAndSettingsDialog = createPerspectiveIdAndDialogComponent(perspectiveLifecycleWithAllSettings.getPerspectiveLifecycle(),
|
||||
perspectiveLifecycleWithAllSettings.getAllSettings().getPerspectiveOwnSettings());
|
||||
}
|
||||
|
||||
private <S extends Settings, C extends Component<S>> void createComponentIdWithSettingsAndDialogComponent(CompositeSettings componentSettings,
|
||||
ComponentLifecycle<S, ?> componentLifecycle) {
|
||||
@SuppressWarnings("unchecked")
|
||||
S settingsOfComponent = (S) componentSettings.findSettingsByComponentId(componentLifecycle.getComponentId());
|
||||
this.componentIdsAndDialogComponents.add(new ComponentIdWithSettingsAndDialogComponent<S>(componentLifecycle.getLocalizedShortName(), componentLifecycle.getComponentId(), settingsOfComponent,
|
||||
componentLifecycle.getSettingsDialogComponent(settingsOfComponent)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the dialog for the settings of perspective itself
|
||||
* @param perspectiveLifecycleAndSettings
|
||||
*/
|
||||
private PerspectiveIdWithSettingsAndDialogComponent<PS> createPerspectiveIdAndDialogComponent(PerspectiveLifecycle<PS> perspectiveLifecycle, PS perspectiveOwnSettings) {
|
||||
return new PerspectiveIdWithSettingsAndDialogComponent<PS>(perspectiveLifecycle.getLocalizedShortName(),
|
||||
perspectiveOwnSettings, perspectiveLifecycle.getPerspectiveOwnSettingsDialogComponent(perspectiveOwnSettings));
|
||||
}
|
||||
|
||||
private PerspectiveIdWithSettingsAndDialogComponent<PS> createPerspectiveAndDialogComponent(Perspective<PS> perspective) {
|
||||
PerspectiveIdWithSettingsAndDialogComponent<PS> result = null;
|
||||
if(perspective.hasPerspectiveOwnSettings()) {
|
||||
result = new PerspectiveIdWithSettingsAndDialogComponent<PS>(perspective.getLocalizedShortName(),
|
||||
perspective.getSettings().getPerspectiveOwnSettings(),
|
||||
perspective.getPerspectiveOwnSettingsDialogComponent());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private <SettingsType extends Settings> ComponentIdWithSettingsAndDialogComponent<SettingsType> createComponentAndDialogComponent(Component<SettingsType> component) {
|
||||
return new ComponentIdWithSettingsAndDialogComponent<SettingsType>(component.getLocalizedShortName(), component.getId(), component.getSettings(),
|
||||
component.getSettingsDialogComponent());
|
||||
}
|
||||
|
||||
private PS getPerspectiveOwnSettings(PerspectiveIdWithSettingsAndDialogComponent<PS> perspectiveAndDialog) {
|
||||
return perspectiveAndDialog.getSettingsDialog().getResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Widget getAdditionalWidget(final DataEntryDialog<?> dialog) {
|
||||
TabPanel result = new TabPanel();
|
||||
if(perspectiveIdsAndSettingsDialog != null) {
|
||||
Widget w = perspectiveIdsAndSettingsDialog.getSettingsDialog().getAdditionalWidget((DataEntryDialog<?>) dialog);
|
||||
result.add(w, perspectiveIdsAndSettingsDialog.getPerspectiveName());
|
||||
}
|
||||
for (ComponentIdWithSettingsAndDialogComponent<?> componentAndSettingsDialog : componentIdsAndDialogComponents) {
|
||||
Widget w = componentAndSettingsDialog.getSettingsDialog().getAdditionalWidget((DataEntryDialog<?>) dialog);
|
||||
result.add(w, componentAndSettingsDialog.getComponentName());
|
||||
}
|
||||
result.selectTab(0);
|
||||
result.addSelectionHandler(new SelectionHandler<Integer>() {
|
||||
@Override
|
||||
public void onSelection(SelectionEvent<Integer> event) {
|
||||
dialog.center();
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PerspectiveCompositeSettings<PS> getResult() {
|
||||
PS perspectiveOwnSettings = perspectiveIdsAndSettingsDialog != null ? getPerspectiveOwnSettings(perspectiveIdsAndSettingsDialog) : null;
|
||||
Map<Serializable, Settings> settings = new HashMap<>();
|
||||
for (ComponentIdWithSettingsAndDialogComponent<?> componentAndDialog : componentIdsAndDialogComponents) {
|
||||
settings.put(componentAndDialog.getComponentId(), componentAndDialog.getSettingsDialog().getResult());
|
||||
}
|
||||
return new PerspectiveCompositeSettings<PS>(perspectiveOwnSettings, settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PerspectiveCompositeValidator<PS> getValidator() {
|
||||
return new PerspectiveCompositeValidator<PS>(perspectiveIdsAndSettingsDialog, componentIdsAndDialogComponents);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FocusWidget getFocusWidget() {
|
||||
for (ComponentIdWithSettingsAndDialogComponent<?> componentAndSettingsDialog : componentIdsAndDialogComponents) {
|
||||
FocusWidget fw = componentAndSettingsDialog.getSettingsDialog().getFocusWidget();
|
||||
if (fw != null) {
|
||||
return fw;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
|
||||
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeTabbedSettingsDialogComponent.ComponentIdWithSettingsAndDialogComponent;
|
||||
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeTabbedSettingsDialogComponent.PerspectiveIdWithSettingsAndDialogComponent;
|
||||
|
||||
/**
|
||||
* @author Frank
|
||||
*
|
||||
* @param <PS>
|
||||
* the type of the perspective own settings
|
||||
**/
|
||||
public class PerspectiveCompositeValidator<PS extends Settings> implements Validator<PerspectiveCompositeSettings<PS>> {
|
||||
private final Map<Serializable, Validator<?>> validatorsMappedByComponent;
|
||||
private final Validator<PS> perspectiveValidator;
|
||||
|
||||
public PerspectiveCompositeValidator(PerspectiveIdWithSettingsAndDialogComponent<PS> perspectiveAndDialogComponent, Iterable<ComponentIdWithSettingsAndDialogComponent<?>> componentsAndDialogComponents) {
|
||||
this.perspectiveValidator = perspectiveAndDialogComponent.getSettingsDialog().getValidator();
|
||||
validatorsMappedByComponent = new HashMap<>();
|
||||
for (ComponentIdWithSettingsAndDialogComponent<?> componentsAndSettingsDialog : componentsAndDialogComponents) {
|
||||
validatorsMappedByComponent.put(componentsAndSettingsDialog.getComponentId(), componentsAndSettingsDialog.getSettingsDialog().getValidator());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getErrorMessage(PerspectiveCompositeSettings<PS> valueToValidate) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
for (Entry<Serializable, Settings> componentAndSettings : valueToValidate.getSettingsPerComponentId().entrySet()) {
|
||||
final String errorMessage = getComponentErrorMessage(componentAndSettings);
|
||||
if (errorMessage != null && !errorMessage.isEmpty()) {
|
||||
result.append(errorMessage);
|
||||
}
|
||||
}
|
||||
String perspectiveErrorMessage = getPerspectiveErrorMessage(valueToValidate.getPerspectiveOwnSettings());
|
||||
if (perspectiveErrorMessage != null && !perspectiveErrorMessage.isEmpty()) {
|
||||
result.append(perspectiveErrorMessage);
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
private String getPerspectiveErrorMessage(PS perspectiveSettings) {
|
||||
String errorMessage = null;
|
||||
if (perspectiveValidator != null) {
|
||||
errorMessage = perspectiveValidator.getErrorMessage(perspectiveSettings);
|
||||
}
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
private <SettingsType extends Settings> String getComponentErrorMessage(Entry<Serializable, SettingsType> componentIdAndSettings) {
|
||||
String errorMessage = null;
|
||||
@SuppressWarnings("unchecked")
|
||||
Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponent.get(componentIdAndSettings.getKey());
|
||||
if (validator != null) {
|
||||
errorMessage = validator.getErrorMessage(componentIdAndSettings.getValue());
|
||||
if (errorMessage != null && !errorMessage.isEmpty() && !getClass().equals(validator.getClass())) {
|
||||
errorMessage += "; ";
|
||||
}
|
||||
}
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
|
||||
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
|
||||
|
||||
/**
|
||||
* A lifecycle interface for a {@link Perspective}
|
||||
*
|
||||
* @param <PS>
|
||||
* the perspective specific settings type
|
||||
* @author Frank Mittag
|
||||
*/
|
||||
public interface PerspectiveLifecycle<PS extends Settings> extends
|
||||
ComponentLifecycle<PerspectiveCompositeSettings<PS>, PerspectiveCompositeTabbedSettingsDialogComponent<PS>> {
|
||||
Iterable<ComponentLifecycle<?,?>> getComponentLifecycles();
|
||||
|
||||
PS createPerspectiveOwnDefaultSettings();
|
||||
|
||||
SettingsDialogComponent<PS> getPerspectiveOwnSettingsDialogComponent(PS settings);
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
package com.sap.sse.gwt.client.shared.perspective;
|
||||
|
||||
import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
|
||||
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
|
||||
|
||||
/**
|
||||
* A utility class keeping together a {@link PerspectiveLifecycle} and all it's component settings together with the corresponding ComponentLifecycle's
|
||||
*
|
||||
* @param <PL>
|
||||
* the type of the perspective lifecycle
|
||||
* @param <PS>
|
||||
* the type of the perspective own settings
|
||||
* @author Frank Mittag
|
||||
*/
|
||||
public class PerspectiveLifecycleWithAllSettings<PL extends PerspectiveLifecycle<PS>, PS extends Settings> {
|
||||
|
||||
private final PL perspectiveLifecycle;
|
||||
private PerspectiveCompositeSettings<PS> allSettings;
|
||||
|
||||
public PerspectiveLifecycleWithAllSettings(PL perspectiveLifecycle, PerspectiveCompositeSettings<PS> allSettings) {
|
||||
this.perspectiveLifecycle = perspectiveLifecycle;
|
||||
this.allSettings = allSettings;
|
||||
}
|
||||
|
||||
public PL getPerspectiveLifecycle() {
|
||||
return perspectiveLifecycle;
|
||||
}
|
||||
|
||||
public PS getPerspectiveSettings() {
|
||||
return allSettings.getPerspectiveOwnSettings();
|
||||
}
|
||||
|
||||
public CompositeSettings getComponentSettings() {
|
||||
return allSettings;
|
||||
}
|
||||
|
||||
public PerspectiveCompositeSettings<PS> getAllSettings() {
|
||||
return allSettings;
|
||||
}
|
||||
|
||||
public void setAllSettings(PerspectiveCompositeSettings<PS> allSettings) {
|
||||
this.allSettings = allSettings;
|
||||
}
|
||||
|
||||
public <C extends ComponentLifecycle<S,?>, S extends Settings> S findComponentSettingsByLifecycle(C componentLifecycle) {
|
||||
@SuppressWarnings("unchecked")
|
||||
final S result = (S) allSettings.findSettingsByComponentId(componentLifecycle.getComponentId());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+38
-2
@@ -1,7 +1,13 @@
|
||||
package com.sap.sse.gwt.dispatch.servlets;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.google.gwt.user.client.rpc.SerializationException;
|
||||
import com.google.gwt.user.server.rpc.RPCServletUtils;
|
||||
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
||||
import com.google.gwt.user.server.rpc.SerializationPolicy;
|
||||
|
||||
@@ -29,6 +35,36 @@ public abstract class ProxiedRemoteServiceServlet extends RemoteServiceServlet {
|
||||
}
|
||||
|
||||
return super.doGetSerializationPolicy(request, moduleBaseURL, strongName);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doUnexpectedFailure(Throwable e) {
|
||||
if ((e.getCause() != null && e.getCause().getClass().getName().matches("org\\.apache\\.shiro\\.authz\\..*[Aa]uth.*Exception")) ||
|
||||
(e instanceof SerializationException && e.getMessage().matches("Type 'org\\.apache\\.shiro\\.authz\\..*[Aa]uth.*Exception' was not included in the set of types which can be serialized.*"))) {
|
||||
final HttpServletResponse servletResponse = getThreadLocalResponse();
|
||||
try {
|
||||
servletResponse.reset();
|
||||
} catch (IllegalStateException ex) {
|
||||
throw new RuntimeException("Unable to report failure", e);
|
||||
}
|
||||
ServletContext servletContext = getServletContext();
|
||||
RPCServletUtils.writeResponseForUnexpectedFailure(servletContext, servletResponse, e);
|
||||
servletContext.log("Exception while dispatching incoming RPC call", e.getCause()==null?e:e.getCause());
|
||||
try {
|
||||
servletResponse.setContentType("text/plain");
|
||||
servletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
try {
|
||||
servletResponse.getOutputStream().write((e.getCause()==null?e:e.getCause()).getLocalizedMessage().getBytes("UTF-8"));
|
||||
} catch (IllegalStateException ex) {
|
||||
// Handle the (unexpected) case where getWriter() was previously used
|
||||
servletResponse.getWriter().write("Couldn't write exception");
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
servletContext.log(
|
||||
"respondWithUnexpectedFailure failed while sending the previous failure to the client", ex);
|
||||
}
|
||||
} else {
|
||||
super.doUnexpectedFailure(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user