tooltips, table selection actions, activation, mandatory

This commit is contained in:
anhefti 2020-02-12 13:48:06 +01:00
parent c9ebeacf1e
commit 6584d6dbfe
23 changed files with 230 additions and 123 deletions

View file

@ -48,8 +48,8 @@ public final class Constants {
public static final Character PERCENTAGE = '%';
public static final Character SLASH = '/';
public static final Character BACKSLASH = '\\';
public static final Character QUOTE = '"';
public static final Character DOUBLE_QUOTE = '\'';
public static final Character QUOTE = '\'';
public static final Character DOUBLE_QUOTE = '"';
public static final Character COMMA = ',';
public static final Character PIPE = '|';
public static final Character AMPERSAND = '&';

View file

@ -328,6 +328,14 @@ public final class Utils {
: null;
}
public static String formatLineBreaks(final String text) {
if (text == null) {
return null;
}
return text.replace("</br>", "\n");
}
public static final String encodeFormURL_UTF_8(final String value) {
if (StringUtils.isBlank(value)) {
return value;

View file

@ -21,6 +21,7 @@ import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.QuizData;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition;
import ch.ethz.seb.sebserver.gui.form.Form;
import ch.ethz.seb.sebserver.gui.form.FormBuilder;
@ -107,7 +108,7 @@ public class IndicatorForm implements TemplateComposer {
final boolean typeSet = indicator.type != null;
final String typeDescription = (typeSet)
? this.i18nSupport.getText(INDICATOR_TYPE_DESC_PREFIX + indicator.type.name)
? Utils.formatLineBreaks(this.i18nSupport.getText(INDICATOR_TYPE_DESC_PREFIX + indicator.type.name))
: Constants.EMPTY_NOTE;
// new PageContext with actual EntityKey

View file

@ -109,7 +109,8 @@ public class InstitutionForm implements TemplateComposer {
.addField(FormBuilder.text(
Domain.INSTITUTION.ATTR_NAME,
FORM_NAME_TEXT_KEY,
institution.name))
institution.name)
.mandatory(!isReadonly))
.addField(FormBuilder.text(
Domain.INSTITUTION.ATTR_URL_SUFFIX,
FORM_URL_SUFFIX_TEXT_KEY,

View file

@ -8,28 +8,23 @@
package ch.ethz.seb.sebserver.gui.content;
import java.util.Set;
import java.util.function.Consumer;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.swt.widgets.Composite;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import ch.ethz.seb.sebserver.gbl.Constants;
import ch.ethz.seb.sebserver.gbl.api.EntityType;
import ch.ethz.seb.sebserver.gbl.model.Domain;
import ch.ethz.seb.sebserver.gbl.model.Entity;
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Tuple;
import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition;
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
import ch.ethz.seb.sebserver.gui.service.page.PageService;
import ch.ethz.seb.sebserver.gui.service.page.PageService.PageActionBuilder;
import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer;
import ch.ethz.seb.sebserver.gui.service.page.event.ActionActivationEvent;
import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitutionPage;
@ -83,7 +78,7 @@ public class InstitutionList implements TemplateComposer {
this.activityFilter = new TableFilterAttribute(
CriteriaType.SINGLE_SELECTION,
Institution.FILTER_ATTR_ACTIVE,
Constants.TRUE_STRING,
StringUtils.EMPTY,
this.pageService.getResourceService()::activityResources);
}
@ -122,7 +117,14 @@ public class InstitutionList implements TemplateComposer {
.withDefaultAction(pageActionBuilder
.newAction(ActionDefinition.INSTITUTION_VIEW_FROM_LIST)
.create())
.withSelectionListener(getSelectionPublisher(pageContext))
.withSelectionListener(this.pageService.getSelectionPublisher(
ActionDefinition.INSTITUTION_TOGGLE_ACTIVITY,
ActionDefinition.INSTITUTION_ACTIVATE,
ActionDefinition.INSTITUTION_DEACTIVATE,
pageContext,
ActionDefinition.INSTITUTION_VIEW_FROM_LIST,
ActionDefinition.INSTITUTION_MODIFY_FROM_LIST,
ActionDefinition.INSTITUTION_TOGGLE_ACTIVITY))
.compose(pageContext.copyOf(content));
// propagate content actions to action-pane
@ -153,28 +155,4 @@ public class InstitutionList implements TemplateComposer {
.publishIf(() -> instGrant.m() && table.hasAnyContent(), false);
}
private final Consumer<Set<Institution>> getSelectionPublisher(final PageContext pageContext) {
return rows -> {
this.pageService.firePageEvent(new ActionActivationEvent(
false,
ActionDefinition.INSTITUTION_VIEW_FROM_LIST,
ActionDefinition.INSTITUTION_MODIFY_FROM_LIST,
ActionDefinition.INSTITUTION_TOGGLE_ACTIVITY),
pageContext);
if (!rows.isEmpty()) {
this.pageService.firePageEvent(new ActionActivationEvent(
true,
new Tuple<>(
ActionDefinition.INSTITUTION_TOGGLE_ACTIVITY,
rows.iterator().next().active
? ActionDefinition.INSTITUTION_DEACTIVATE
: ActionDefinition.INSTITUTION_ACTIVATE),
ActionDefinition.INSTITUTION_VIEW_FROM_LIST,
ActionDefinition.INSTITUTION_MODIFY_FROM_LIST,
ActionDefinition.INSTITUTION_TOGGLE_ACTIVITY),
pageContext);
}
};
}
}

View file

@ -54,7 +54,7 @@ public enum ActionDefinition {
PageStateDefinitionImpl.INSTITUTION_VIEW,
ActionCategory.FORM),
INSTITUTION_SAVE_AND_ACTIVATE(
new LocTextKey("sebserver.institution.action.activate"),
new LocTextKey("sebserver.form.action.save.activate"),
ImageIcon.ACTIVE,
PageStateDefinitionImpl.INSTITUTION_VIEW,
ActionCategory.FORM),
@ -70,7 +70,7 @@ public enum ActionDefinition {
ActionCategory.FORM),
INSTITUTION_TOGGLE_ACTIVITY(
new LocTextKey("sebserver.overall.action.toggle-activity"),
ImageIcon.TOGGLE_OFF,
ImageIcon.SWITCH,
PageStateDefinitionImpl.INSTITUTION_LIST,
ActionCategory.INSTITUTION_LIST),

View file

@ -131,6 +131,7 @@ public class ActionPane implements TemplateComposer {
actionItem.setForeground(null);
} else {
actionItem.setForeground(new Color(parent.getDisplay(), new RGBA(150, 150, 150, 50)));
ActionPane.this.pageService.getPolyglotPageService().injectI18n(actionItem, ad.title);
}
}

View file

@ -24,6 +24,8 @@ import ch.ethz.seb.sebserver.gui.widget.WidgetFactory.CustomVariant;
public abstract class FieldBuilder<T> {
public static final LocTextKey MANDATORY_TEXT_KEY = new LocTextKey("sebserver.form.mandatory");
public static final String TOOLTIP_KEY_SUFFIX_LABEL = ".tooltip";
public static final String TOOLTIP_KEY_SUFFIX_LEFT = ".tooltip.left";
public static final String TOOLTIP_KEY_SUFFIX_RIGHT = ".tooltip.right";
@ -36,9 +38,11 @@ public abstract class FieldBuilder<T> {
boolean readonly = false;
boolean visible = true;
String defaultLabel = null;
boolean isMandatory = false;
final String name;
final LocTextKey label;
final LocTextKey tooltipLabel;
final LocTextKey tooltipKeyLeft;
final LocTextKey tooltipKeyRight;
final T value;
@ -47,6 +51,7 @@ public abstract class FieldBuilder<T> {
this.name = name;
this.label = label;
this.value = value;
this.tooltipLabel = (label != null) ? new LocTextKey(label.name + TOOLTIP_KEY_SUFFIX_LABEL) : null;
this.tooltipKeyLeft = (label != null) ? new LocTextKey(label.name + TOOLTIP_KEY_SUFFIX_LEFT) : null;
this.tooltipKeyRight = (label != null) ? new LocTextKey(label.name + TOOLTIP_KEY_SUFFIX_RIGHT) : null;
}
@ -61,6 +66,16 @@ public abstract class FieldBuilder<T> {
return this;
}
public FieldBuilder<T> mandatory() {
this.isMandatory = true;
return this;
}
public FieldBuilder<T> mandatory(final boolean mandatory) {
this.isMandatory = mandatory;
return this;
}
public FieldBuilder<T> withInputSpan(final int span) {
this.spanInput = span;
return this;
@ -108,7 +123,7 @@ public abstract class FieldBuilder<T> {
}
final Composite infoGrid = new Composite(parent, SWT.NONE);
final GridLayout gridLayout = new GridLayout(3, false);
final GridLayout gridLayout = new GridLayout(4, false);
gridLayout.verticalSpacing = 0;
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
@ -128,14 +143,26 @@ public abstract class FieldBuilder<T> {
info.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
}
final boolean hasLabelTooltip = (fieldBuilder.tooltipLabel != null &&
StringUtils.isNotBlank(builder.i18nSupport.getText(fieldBuilder.tooltipLabel, "")));
final Label label = labelLocalized(
builder.widgetFactory,
infoGrid,
fieldBuilder.label,
fieldBuilder.defaultLabel,
(hasLabelTooltip) ? fieldBuilder.tooltipLabel : null,
1,
fieldBuilder.titleValign);
if (fieldBuilder.isMandatory) {
final Label mandatory = builder.widgetFactory.imageButton(
WidgetFactory.ImageIcon.MANDATORY,
infoGrid,
MANDATORY_TEXT_KEY);
mandatory.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
}
if (fieldBuilder.tooltipKeyRight != null &&
StringUtils.isNotBlank(builder.i18nSupport.getText(fieldBuilder.tooltipKeyRight, ""))) {
@ -156,7 +183,7 @@ public abstract class FieldBuilder<T> {
final String defaultText,
final int hspan) {
return labelLocalized(widgetFactory, parent, locTextKey, defaultText, hspan, SWT.CENTER);
return labelLocalized(widgetFactory, parent, locTextKey, defaultText, null, hspan, SWT.CENTER);
}
public static final Label labelLocalized(
@ -164,13 +191,18 @@ public abstract class FieldBuilder<T> {
final Composite parent,
final LocTextKey locTextKey,
final String defaultText,
final LocTextKey tooltipTextKey,
final int hspan,
final int verticalAlignment) {
final LocTextKey labelKey = StringUtils.isNotBlank(defaultText)
? new LocTextKey(defaultText)
: locTextKey;
final Label label = widgetFactory.labelLocalized(
parent,
locTextKey,
(StringUtils.isNotBlank(defaultText) ? defaultText : locTextKey.name));
labelKey,
tooltipTextKey);
final GridData gridData = new GridData(SWT.LEFT, verticalAlignment, false, false, hspan, 1);
gridData.heightHint = FormBuilder.FORM_ROW_HEIGHT;
label.setLayoutData(gridData);

View file

@ -28,6 +28,7 @@ import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationAttribute;
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationTableValues.TableValue;
import ch.ethz.seb.sebserver.gbl.model.sebconfig.Orientation;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.service.examconfig.ExamConfigurationService;
import ch.ethz.seb.sebserver.gui.service.examconfig.InputField;
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
@ -41,8 +42,9 @@ import ch.ethz.seb.sebserver.gui.widget.WidgetFactory.ImageIcon;
@GuiProfile
public class TableFieldBuilder extends AbstractTableFieldBuilder {
private static final String ADD_TOOLTIP_SUFFIX = ".add.tooltip";
private static final String REMOVE_TOOLTIP_SUFFIX = ".remove.tooltip";
private static final String TOOLTIP_SUFFIX = ".tooltip";
private static final String ADD_TOOLTIP_SUFFIX = ".add" + TOOLTIP_SUFFIX;
private static final String REMOVE_TOOLTIP_SUFFIX = ".remove" + TOOLTIP_SUFFIX;
protected TableFieldBuilder(
final RestService restService,
@ -79,7 +81,7 @@ public class TableFieldBuilder extends AbstractTableFieldBuilder {
columnAttribute.name),
new LocTextKey(ExamConfigurationService.ATTRIBUTE_LABEL_LOC_TEXT_PREFIX +
columnAttribute.name +
".tootltip"));
TOOLTIP_SUFFIX));
column.setWidth(100);
column.setResizable(false);
column.setMoveable(false);
@ -88,15 +90,14 @@ public class TableFieldBuilder extends AbstractTableFieldBuilder {
final TableInputField tableField = new TableInputField(
tableContext,
table);
if (!viewContext.readonly) {
TableColumn column = new TableColumn(table, SWT.NONE);
column.setImage(ImageIcon.ADD_BOX_WHITE.getImage(parent.getDisplay()));
column.setToolTipText(viewContext.i18nSupport.getText(
column.setToolTipText(Utils.formatLineBreaks(viewContext.i18nSupport.getText(
ExamConfigurationService.ATTRIBUTE_LABEL_LOC_TEXT_PREFIX +
attribute.name +
ADD_TOOLTIP_SUFFIX,
"Add new"));
"Add new")));
column.setWidth(20);
column.setResizable(false);
column.setMoveable(false);
@ -107,11 +108,11 @@ public class TableFieldBuilder extends AbstractTableFieldBuilder {
column = new TableColumn(table, SWT.NONE);
column.setImage(ImageIcon.REMOVE_BOX_WHITE.getImage(parent.getDisplay()));
column.setToolTipText(viewContext.i18nSupport.getText(
column.setToolTipText(Utils.formatLineBreaks(viewContext.i18nSupport.getText(
ExamConfigurationService.ATTRIBUTE_LABEL_LOC_TEXT_PREFIX +
attribute.name +
REMOVE_TOOLTIP_SUFFIX,
"Remove Selected"));
"Remove Selected")));
column.setWidth(20);
column.setResizable(false);
column.setMoveable(false);

View file

@ -25,6 +25,7 @@ import ch.ethz.seb.sebserver.gbl.model.sebconfig.AttributeType;
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationAttribute;
import ch.ethz.seb.sebserver.gbl.model.sebconfig.Orientation;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.form.FieldBuilder;
import ch.ethz.seb.sebserver.gui.service.examconfig.ExamConfigurationService;
import ch.ethz.seb.sebserver.gui.service.examconfig.InputField;
@ -91,7 +92,8 @@ public class TextFieldBuilder implements InputFieldBuilder {
attribute,
i18nSupport);
if (toolTipKey != null) {
final Consumer<Text> updateFunction = t -> t.setToolTipText(i18nSupport.getText(toolTipKey));
final Consumer<Text> updateFunction =
t -> t.setToolTipText(Utils.formatLineBreaks(i18nSupport.getText(toolTipKey)));
text.setData(
PolyglotPageService.POLYGLOT_ITEM_TOOLTIP_DATA_KEY,
updateFunction);

View file

@ -30,6 +30,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService;
@ -116,7 +117,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
b.setText(this.i18nSupport.getText(locTextKey));
}
if (locToolTipKey != null) {
b.setToolTipText(this.i18nSupport.getText(locToolTipKey));
b.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(locToolTipKey)));
}
};
button.setData(POLYGLOT_WIDGET_FUNCTION_KEY, buttonFunction);
@ -160,7 +161,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
if (this.i18nSupport.hasText(locTooltipKey)) {
tableColumn.setData(POLYGLOT_ITEM_TOOLTIP_DATA_KEY, locTooltipKey);
tableColumn.setToolTipText(this.i18nSupport.getText(locTooltipKey));
tableColumn.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(locTooltipKey)));
}
}
@ -183,7 +184,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
if (this.i18nSupport.hasText(locTooltipKey)) {
tabItem.setData(POLYGLOT_ITEM_TOOLTIP_DATA_KEY, locTooltipKey);
tabItem.setToolTipText(this.i18nSupport.getText(locTooltipKey));
tabItem.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(locTooltipKey)));
}
}
@ -215,7 +216,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
label.setText(i18nSupport.getText(locTextKey));
}
if (locToolTipKey != null) {
label.setToolTipText(i18nSupport.getText(locToolTipKey));
label.setToolTipText(Utils.formatLineBreaks(i18nSupport.getText(locToolTipKey)));
}
};
}
@ -230,7 +231,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
group.setText(i18nSupport.getText(locTextKey));
}
if (locToolTipKey != null) {
group.setToolTipText(i18nSupport.getText(locToolTipKey, StringUtils.EMPTY));
group.setToolTipText(Utils.formatLineBreaks(i18nSupport.getText(locToolTipKey, StringUtils.EMPTY)));
}
};
}

View file

@ -34,6 +34,7 @@ import ch.ethz.seb.sebserver.gbl.model.Entity;
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
import ch.ethz.seb.sebserver.gbl.model.Page;
import ch.ethz.seb.sebserver.gbl.util.Result;
import ch.ethz.seb.sebserver.gbl.util.Tuple;
import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition;
import ch.ethz.seb.sebserver.gui.form.FormBuilder;
import ch.ethz.seb.sebserver.gui.service.ResourceService;
@ -41,6 +42,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService;
import ch.ethz.seb.sebserver.gui.service.page.PageContext.AttributeKeys;
import ch.ethz.seb.sebserver.gui.service.page.event.ActionActivationEvent;
import ch.ethz.seb.sebserver.gui.service.page.event.PageEvent;
import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction;
import ch.ethz.seb.sebserver.gui.service.page.impl.PageState;
@ -150,6 +152,63 @@ public interface PageService {
};
}
/** Use this to get an table selection action publisher that processes the action
* activation on table selection.
*
* @param pageContext the current PageContext
* @param actionDefinitions list of action definitions that activity should be toggled on table selection
* @return the selection publisher that handles this defines action activation on table selection */
default <T extends Entity> Consumer<Set<T>> getSelectionPublisher(
final PageContext pageContext,
final ActionDefinition... actionDefinitions) {
return rows -> {
firePageEvent(
new ActionActivationEvent(!rows.isEmpty(), actionDefinitions),
pageContext);
};
}
/** Use this to get an table selection action publisher that processes the action
* activation on table selection.
* </p>
* This additional has the ability to define a entity activity action that is toggles in
* case of the selected entity
*
* @param toggle the base entity activity action definition
* @param activate the entity activation action definition
* @param deactivate the entity deactivation action definition
* @param pageContext the current PageContext
* @param actionDefinitions list of action definitions that activity should be toggled on table selection
* @return the selection publisher that handles this defines action activation on table selection */
default <T extends Activatable> Consumer<Set<T>> getSelectionPublisher(
final ActionDefinition toggle,
final ActionDefinition activate,
final ActionDefinition deactivate,
final PageContext pageContext,
final ActionDefinition... actionDefinitions) {
return rows -> {
if (!rows.isEmpty()) {
firePageEvent(
new ActionActivationEvent(
true,
new Tuple<>(
toggle,
rows.iterator().next().isActive()
? deactivate
: activate),
actionDefinitions),
pageContext);
} else {
firePageEvent(
new ActionActivationEvent(false, actionDefinitions),
pageContext);
}
};
}
/** Publishes a given PageEvent to the current page tree
* This goes through the page-tree and collects all listeners the are listen to
* the specified page event type.

View file

@ -40,7 +40,6 @@ public class ComposerServiceImpl implements ComposerService {
private static final Logger log = LoggerFactory.getLogger(ComposerServiceImpl.class);
// TODO configurable
private final Class<? extends PageDefinition> loginPageType = DefaultLoginPage.class;
private final Class<? extends PageDefinition> mainPageType = DefaultMainPage.class;

View file

@ -19,6 +19,8 @@ import ch.ethz.seb.sebserver.gui.table.TableFilter.CriteriaType;
public final class ColumnDefinition<ROW extends Entity> {
private static final String TOOLTIP_TEXT_KEY_SUFFIX = ".tooltip";
final String columnName;
final LocTextKey displayName;
final Function<ROW, ?> valueSupplier;
@ -55,7 +57,7 @@ public final class ColumnDefinition<ROW extends Entity> {
this.columnName = columnName;
this.displayName = displayName;
this.tooltip = tooltip;
this.tooltip = (tooltip != null) ? tooltip : new LocTextKey(displayName.name + TOOLTIP_TEXT_KEY_SUFFIX);
this.widthProportion = widthProportion;
this.valueSupplier = valueSupplier;
this.filterAttribute = filterAttribute;

View file

@ -64,6 +64,8 @@ public class EntityTable<ROW extends Entity> {
private static final Logger log = LoggerFactory.getLogger(EntityTable.class);
private static final LocTextKey DEFAULT_SORT_COLUMN_TOOLTIP_KEY =
new LocTextKey("sebserver.table.column.sort.default.tooltip");
private static final String COLUMN_DEFINITION = "COLUMN_DEFINITION";
private static final String TABLE_ROW_DATA = "TABLE_ROW_DATA";
private static final int HEADER_HEIGHT = 40;
@ -425,11 +427,23 @@ public class EntityTable<ROW extends Entity> {
}
private void createTableColumns() {
final String sortText = this.i18nSupport.getText(DEFAULT_SORT_COLUMN_TOOLTIP_KEY, "");
for (final ColumnDefinition<ROW> column : this.columns) {
final LocTextKey _tooltip = column.getTooltip();
final LocTextKey tooltip = (_tooltip != null && this.i18nSupport.hasText(_tooltip))
? (column.isSortable())
? new LocTextKey(_tooltip.name, sortText)
: new LocTextKey(_tooltip.name, "")
: (column.isSortable())
? DEFAULT_SORT_COLUMN_TOOLTIP_KEY
: null;
final TableColumn tableColumn = this.widgetFactory.tableColumnLocalized(
this.table,
column.displayName,
column.getTooltip());
tooltip);
tableColumn.addListener(SWT.Resize, this::adaptColumnWidthChange);
tableColumn.setData(COLUMN_DEFINITION, column);

View file

@ -31,6 +31,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.ethz.seb.sebserver.gbl.Constants;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
@ -82,7 +83,7 @@ public class FileUploadSelection extends Composite {
this.fileUpload = new FileUpload(this, SWT.NONE);
this.fileUpload.setImage(WidgetFactory.ImageIcon.IMPORT.getImage(parent.getDisplay()));
this.fileUpload.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
this.fileUpload.setToolTipText(this.i18nSupport.getText(PLEASE_SELECT_TEXT));
this.fileUpload.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(PLEASE_SELECT_TEXT)));
this.inputReceiver = new InputReceiver();
this.uploadHandler = new FileUploadHandler(this.inputReceiver);
@ -148,7 +149,7 @@ public class FileUploadSelection extends Composite {
this.fileName.setText(this.i18nSupport.getText(PLEASE_SELECT_TEXT));
}
if (!this.readonly) {
this.fileUpload.setToolTipText(this.i18nSupport.getText(PLEASE_SELECT_TEXT));
this.fileUpload.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(PLEASE_SELECT_TEXT)));
}
}

View file

@ -38,6 +38,7 @@ import org.eclipse.swt.widgets.Composite;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
import ch.ethz.seb.sebserver.gui.service.push.ServerPushContext;
import ch.ethz.seb.sebserver.gui.service.push.ServerPushService;
@ -77,6 +78,7 @@ public final class ImageUploadSelection extends Composite {
gridLayout.horizontalSpacing = 0;
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.marginLeft = 0;
gridLayout.verticalSpacing = 0;
super.setLayout(gridLayout);
@ -87,7 +89,9 @@ public final class ImageUploadSelection extends Composite {
if (!readonly) {
this.fileUpload = new FileUpload(this, SWT.NONE);
this.fileUpload.setImage(WidgetFactory.ImageIcon.IMPORT.getImage(parent.getDisplay()));
this.fileUpload.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
final GridData gridData = new GridData(SWT.LEFT, SWT.TOP, false, false);
gridData.horizontalIndent = 0;
this.fileUpload.setLayoutData(gridData);
final FileUploadHandler uploadHandler = new FileUploadHandler(new ImageReceiver());
this.fileUpload.addListener(SWT.Selection, event -> {
@ -128,7 +132,7 @@ public final class ImageUploadSelection extends Composite {
public void setSelectionText(final String text) {
if (this.fileUpload != null) {
this.fileUpload.setToolTipText(text);
this.fileUpload.setToolTipText(Utils.formatLineBreaks(text));
}
}

View file

@ -24,6 +24,7 @@ import org.eclipse.swt.widgets.Listener;
import ch.ethz.seb.sebserver.gbl.Constants;
import ch.ethz.seb.sebserver.gbl.util.Tuple;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.service.page.PageService;
public final class MultiSelectionCheckbox extends Composite implements Selection {
@ -83,7 +84,7 @@ public final class MultiSelectionCheckbox extends Composite implements Selection
.forEach(tuple -> {
final Button button = this.checkboxes.get(tuple._1);
if (button != null) {
button.setToolTipText(tuple._2);
button.setToolTipText(Utils.formatLineBreaks(tuple._2));
}
});
}

View file

@ -21,6 +21,7 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Listener;
import ch.ethz.seb.sebserver.gbl.util.Tuple;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.service.page.PageService;
public final class RadioSelection extends Composite implements Selection {
@ -80,7 +81,7 @@ public final class RadioSelection extends Composite implements Selection {
.forEach(tuple -> {
final Button button = this.radioButtons.get(tuple._1);
if (button != null) {
button.setToolTipText(tuple._2);
button.setToolTipText(Utils.formatLineBreaks(tuple._2));
}
});
}

View file

@ -50,6 +50,7 @@ import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.IndicatorType;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator.Threshold;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
import ch.ethz.seb.sebserver.gbl.util.Tuple;
import ch.ethz.seb.sebserver.gbl.util.Utils;
import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition;
import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
@ -74,6 +75,7 @@ public class WidgetFactory {
public enum ImageIcon {
MAXIMIZE("maximize.png"),
MINIMIZE("minimize.png"),
MANDATORY("mandatory.png"),
ADD("add.png"),
REMOVE("remove.png"),
ADD_BOX("add_box.png"),
@ -327,16 +329,6 @@ public class WidgetFactory {
return label;
}
public Label labelLocalized(final Composite parent, final LocTextKey locTextKey, final String defaultText) {
final Label label = new Label(parent, SWT.NONE);
if (this.i18nSupport.hasText(locTextKey)) {
this.polyglotPageService.injectI18n(label, locTextKey);
} else {
label.setText(defaultText);
}
return label;
}
public Label labelLocalized(final Composite parent, final LocTextKey locTextKey) {
final Label label = new Label(parent, SWT.NONE);
this.polyglotPageService.injectI18n(label, locTextKey);
@ -637,7 +629,7 @@ public class WidgetFactory {
try {
ss.applyNewMapping(itemsSupplier.get());
if (toolTipTextKey != null) {
ss.setToolTipText(this.i18nSupport.getText(toolTipTextKey));
ss.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(toolTipTextKey)));
}
if (itemsToolTipSupplier != null) {
ss.applyToolTipsForItems(itemsToolTipSupplier.get());

View file

@ -9,7 +9,7 @@ sebserver.overall.about.markup=<span style='font-family: Arial, Helvetica,sans-s
sebserver.overall.help=Documentation
sebserver.overall.help.link=https://www.safeexambrowser.org/news_en.html
sebserver.overall.message.leave.without.save=You have unsaved changes!\nAre you sure you want to leave the page?\The changes will be lost.
sebserver.overall.message.leave.without.save=You have unsaved changes!</b>Are you sure you want to leave the page?\The changes will be lost.
sebserver.overall.upload=Please select a file
sebserver.overall.upload.unsupported.file=This file type is not supported. Supported files are: {0}
sebserver.overall.action.modify.cancel=Cancel
@ -84,6 +84,9 @@ sebserver.form.validation.fieldError.email=Invalid mail address
sebserver.error.unexpected=Unexpected Error
sebserver.page.message=Information
sebserver.dialog.confirm.title=Confirmation
sebserver.form.mandatory=This field is mandatory.
sebserver.form.action.save.activate=Save and Activate
sebserver.table.column.sort.default.tooltip=Click on the column header to sort the table within this column.
sebserver.dialog.confirm.deactivation=Note that there are {0} other entities that belongs to this entity.<br/>Those will also be deactivated by deactivating this entity.<br/><br/>Are You sure to deactivate this entity?
sebserver.dialog.confirm.deactivation.noDependencies=Are You sure you want to deactivate?
@ -107,7 +110,7 @@ sebserver.login.failed.title=Login failed
sebserver.login.failed.message=Access denied: wrong username or password
sebserver.logout=Sign out
sebserver.logout.success.message=You have been successfully signed out.
sebserver.logout.invalid-session.message=You have been signed out because of a user session invalidation.\nPlease sign in again
sebserver.logout.invalid-session.message=You have been signed out because of a user session invalidation.</b>Please sign in again
sebserver.login.password.change=Information
sebserver.login.password.change.success=The password was successfully changed. Please sign in with your new password
@ -135,8 +138,11 @@ sebserver.institution.list.actions=
sebserver.institution.list.empty=No institution has been found. Please adapt the filter or create a new institution
sebserver.institution.list.title=Institutions
sebserver.institution.list.column.name=Name
sebserver.institution.list.column.name.tooltip=The name of the institution.</br></br>Use the filter above to narrow down a specific name.</b>{0}
sebserver.institution.list.column.urlSuffix=URL Suffix
sebserver.institution.list.column.urlSuffix.tooltip=The URL suffix to the institutional login page.</br></br>Use the filter above to narrow down a specific URL suffix.</b>{0}
sebserver.institution.list.column.active=Status
sebserver.institution.list.column.active.tooltip=The activity of the institution.</br></br>Use the filter above to specify the activity.</b>{0}
sebserver.institution.action.list=Institution
sebserver.institution.action.form=Institution
@ -146,6 +152,7 @@ sebserver.institution.action.list.modify=Edit Institution
sebserver.institution.action.modify=Edit Institution
sebserver.institution.action.save=Save Institution
sebserver.institution.action.activate=Activate Institution
sebserver.institution.action.deactivate=Deactivate Institution
sebserver.institution.action.delete=Delete Institution
@ -154,11 +161,11 @@ sebserver.institution.form.title.new=Add Institution
sebserver.institution.form.title=Institution
sebserver.institution.form.name=Name
sebserver.institution.form.name.tooltip.right=
sebserver.institution.form.name.tooltip=The name of the institution
sebserver.institution.form.urlSuffix=URL Suffix
sebserver.institution.form.urlSuffix.tooltip.right=The URL suffix to the institutional login page.\n Institutional URL is: http(s)://<seb-server-name>/<suffix>
sebserver.institution.form.urlSuffix.tooltip=The URL suffix to the institutional login page.</b> Institutional URL is: http(s)://<seb-server-name>/<suffix>
sebserver.institution.form.logoImage=Logo Image
sebserver.institution.form.logoImage.tooltip.right=The Image that is shown as a logo in the specified institutional login page.\nIn edit mode, use the arrow sign to open a upload dialog.
sebserver.institution.form.logoImage.tooltip=The Image that is shown as a logo in the specified institutional login page.</b>In edit mode, use the arrow sign to open a upload dialog.
sebserver.institution.form.logoImage.unsupportedFileType=The selected file is not supported. Supported are: PNG and JPG
@ -419,9 +426,9 @@ sebserver.exam.indicator.list.pleaseSelect=Please select first an indicator from
sebserver.exam.indicator.type.LAST_PING=Last Ping Time
sebserver.exam.indicator.type.ERROR_COUNT=Errors
sebserver.exam.indicator.type.WARN_COUNT=Warnings
sebserver.exam.indicator.type.description.LAST_PING=This indicator shows the time in milliseconds since\n the last ping has been received from a SEB Client.\nThis indicator can be used to track a SEB Client connection and indicate connection losse.\n\nThresholds are defined in milliseconds.
sebserver.exam.indicator.type.description.ERROR_COUNT=This indicator shows the number of error log messages that\n has been received from a SEB Client.\nThis indicator can be used to track errors of connected SEB Clients\n\nThresholds are defined by natural numbers.
sebserver.exam.indicator.type.description.WARN_COUNT=This indicator shows the number of warn log messages that\n has been received from a SEB Client.\nThis indicator can be used to track warnings of connected SEB Clients\n\nThresholds are defined by natural numbers.
sebserver.exam.indicator.type.description.LAST_PING=This indicator shows the time in milliseconds since</b> the last ping has been received from a SEB Client.</b>This indicator can be used to track a SEB Client connection and indicate connection losse.</b></b>Thresholds are defined in milliseconds.
sebserver.exam.indicator.type.description.ERROR_COUNT=This indicator shows the number of error log messages that</b> has been received from a SEB Client.</b>This indicator can be used to track errors of connected SEB Clients</b></b>Thresholds are defined by natural numbers.
sebserver.exam.indicator.type.description.WARN_COUNT=This indicator shows the number of warn log messages that</b> has been received from a SEB Client.</b>This indicator can be used to track warnings of connected SEB Clients</b></b>Thresholds are defined by natural numbers.
sebserver.exam.indicator.info.pleaseSelect=Please select first an indicator from the list
@ -558,9 +565,9 @@ sebserver.examconfig.props.form.views.hooked_keys=Hooked Keys
sebserver.examconfig.props.label.hashedAdminPassword=Administrator password
sebserver.examconfig.props.label.hashedAdminPassword.confirm=Confirm password
sebserver.examconfig.props.label.allowQuit=Allow user to quit SEB
sebserver.examconfig.props.label.allowQuit.tooltip=Users can quit SEB with Control-Q, window close or quit button.\nOtherwise use a quit link in your exam system or shutdown/restart the computer.
sebserver.examconfig.props.label.allowQuit.tooltip=Users can quit SEB with Control-Q, window close or quit button.</b>Otherwise use a quit link in your exam system or shutdown/restart the computer.
sebserver.examconfig.props.label.ignoreExitKeys=Ignore exit keys
sebserver.examconfig.props.label.ignoreExitKeys.tooltip=SEB ignores the exit keys and can only be quit manually by entering the quit password.\n(click Quit button in SEB taskbar, press Ctrl-Q or click the main browser window close button)
sebserver.examconfig.props.label.ignoreExitKeys.tooltip=SEB ignores the exit keys and can only be quit manually by entering the quit password.</b>(click Quit button in SEB taskbar, press Ctrl-Q or click the main browser window close button)
sebserver.examconfig.props.label.hashedQuitPassword=Quit/unlock password
sebserver.examconfig.props.label.hashedQuitPassword.confirm=Confirm password
sebserver.examconfig.props.group.exitSequence=Exit Sequence
@ -600,15 +607,15 @@ sebserver.examconfig.props.label.mainBrowserWindowPositioning.2=Right
sebserver.examconfig.props.group.wintoolbar=Browser Window Toolbar
sebserver.examconfig.props.label.enableBrowserWindowToolbar=Enable browser window toolbar
sebserver.examconfig.props.label.enableBrowserWindowToolbar.tooltip=Displays a toolbar on top of the browser window\nwhich can also be hidden by the user.
sebserver.examconfig.props.label.enableBrowserWindowToolbar.tooltip=Displays a toolbar on top of the browser window</b>which can also be hidden by the user.
sebserver.examconfig.props.label.hideBrowserWindowToolbar=Hide toolbar as default (Mac)
sebserver.examconfig.props.label.hideBrowserWindowToolbar.tooltip=Hide browser window toolbar by default.\nIt can be shown again by using the View menu or Alt-Command-T.
sebserver.examconfig.props.label.hideBrowserWindowToolbar.tooltip=Hide browser window toolbar by default.</b>It can be shown again by using the View menu or Alt-Command-T.
sebserver.examconfig.props.label.showMenuBar=Show menu bar (Mac)
sebserver.examconfig.props.label.showMenuBar.tooltip=Show the OS X menu bar to allow to access settings like Wi-Fi.
sebserver.examconfig.props.group.taskbar=SEB Taskbar/Dock
sebserver.examconfig.props.label.showTaskBar=Show SEB taskbar
sebserver.examconfig.props.label.showTaskBar.tooltip=The SEB task bar shows and switches between open browser windows,\n allowed resources and applications and displays additional controls
sebserver.examconfig.props.label.showTaskBar.tooltip=The SEB task bar shows and switches between open browser windows,</b> allowed resources and applications and displays additional controls
sebserver.examconfig.props.label.taskBarHeight=Taskbar/dock height
sebserver.examconfig.props.label.taskBarHeight.tooltip=Height of SEB dock/task bar in points/pixels
sebserver.examconfig.props.label.showReloadButton=Show reload button
@ -620,9 +627,9 @@ sebserver.examconfig.props.label.showInputLanguage.tooltip=Shows current keyboar
sebserver.examconfig.props.group.zoom=Enable Zoom (Win/Mac)
sebserver.examconfig.props.label.enableZoomPage=Enable page zoom
sebserver.examconfig.props.label.enableZoomPage.tooltip=Pages can be zoomed with ctrl - cmd +/-\n or the commands in the view menu and browser window toolbar (Mac)
sebserver.examconfig.props.label.enableZoomPage.tooltip=Pages can be zoomed with ctrl - cmd +/-</b> or the commands in the view menu and browser window toolbar (Mac)
sebserver.examconfig.props.label.enableZoomText=Enable text zoom
sebserver.examconfig.props.label.enableZoomText.tooltip=Text in browser windows can be zoomed with cmd +/-\n or the commands in the view menu and browser window toolbar (Mac)
sebserver.examconfig.props.label.enableZoomText.tooltip=Text in browser windows can be zoomed with cmd +/-</b> or the commands in the view menu and browser window toolbar (Mac)
sebserver.examconfig.props.group.zoomMode=Zoom Mode Win (Ctrl-Mousewheel)
sebserver.examconfig.props.label.zoomMode.0=Use page zoom
sebserver.examconfig.props.label.zoomMode.0.tooltip=Zoom whole web pages using Ctrl-Mousewheel (Win)"
@ -642,7 +649,7 @@ sebserver.examconfig.props.label.allowSpellCheck=Allow spell checking
sebserver.examconfig.props.label.allowSpellCheck.tooltip=Allow to use "Check spelling" in the SEB browser
sebserver.examconfig.props.label.allowDictionaryLookup=Allow dictionary lookup (Mac)
sebserver.examconfig.props.label.allowDictionaryLookup.tooltip=Allow to use the OS X dictionary lookup using a 3 finger tap
sebserver.examconfig.props.label.allowSpellCheckDictionary=The list below shows all dictionaries currently available for spell checking.\nSEB comes with a list of standard dictionaries that can be activated/deactivated here.
sebserver.examconfig.props.label.allowSpellCheckDictionary=The list below shows all dictionaries currently available for spell checking.</b>SEB comes with a list of standard dictionaries that can be activated/deactivated here.
sebserver.examconfig.props.label.allowSpellCheckDictionary.da-DK=Danish (Denmark) (da-DK)
sebserver.examconfig.props.label.allowSpellCheckDictionary.en-AU=English (Australia) (en-AU)
sebserver.examconfig.props.label.allowSpellCheckDictionary.en-GB=English (United Kingdom) (en-GB)
@ -657,8 +664,8 @@ sebserver.examconfig.props.group.newBrowserWindow=Links requesting to be opened
sebserver.examconfig.props.label.newBrowserWindowByLinkPolicy.0=get generally blocked
sebserver.examconfig.props.label.newBrowserWindowByLinkPolicy.1=open in same window
sebserver.examconfig.props.label.newBrowserWindowByLinkPolicy.2=open in new window
sebserver.examconfig.props.label.newBrowserWindowByLinkBlockForeign=Block when directing\nto a different server
sebserver.examconfig.props.label.newBrowserWindowByLinkBlockForeign.tooltip=USE WITH CARE: Hyperlinks invoked by JavaScript/plug-ins\n which direct to a different host than the one of the current main page will be ignored.
sebserver.examconfig.props.label.newBrowserWindowByLinkBlockForeign=Block when directing</b>to a different server
sebserver.examconfig.props.label.newBrowserWindowByLinkBlockForeign.tooltip=USE WITH CARE: Hyperlinks invoked by JavaScript/plug-ins</b> which direct to a different host than the one of the current main page will be ignored.
sebserver.examconfig.props.group.newwinsize=New browser window size and position
sebserver.examconfig.props.label.newBrowserWindowByLinkWidth=Width
@ -672,19 +679,19 @@ sebserver.examconfig.props.label.newBrowserWindowByLinkPositioning.2=Right
sebserver.examconfig.props.group.browserSecurity=Browser security
sebserver.examconfig.props.label.enablePlugIns=Enable plug-ins (Win: only Flash)
sebserver.examconfig.props.label.enablePlugIns.tooltip=Enables web plugins (Mac) or just Flash (Win).\n For security reasons it\'s recommended to disable this option if you don\'t use any plugin/Flash content.
sebserver.examconfig.props.label.enablePlugIns.tooltip=Enables web plugins (Mac) or just Flash (Win).</b> For security reasons it\'s recommended to disable this option if you don\'t use any plugin/Flash content.
sebserver.examconfig.props.label.enableJavaScript=Enable JavaScript
sebserver.examconfig.props.label.enableJavaScript.tooltip=Enables JavaScript.\n Please note that most modern web-sites need JavaScript for full functionality.
sebserver.examconfig.props.label.enableJavaScript.tooltip=Enables JavaScript.</b> Please note that most modern web-sites need JavaScript for full functionality.
sebserver.examconfig.props.label.enableJava=Enable Java
sebserver.examconfig.props.label.enableJava.tooltip=Enables Java applets.\n Note: Only applets with the highest Java security level will run in SEB.
sebserver.examconfig.props.label.enableJava.tooltip=Enables Java applets.</b> Note: Only applets with the highest Java security level will run in SEB.
sebserver.examconfig.props.label.blockPopUpWindows=Block pop-up windows
sebserver.examconfig.props.label.blockPopUpWindows.tooltip=Disables pop-up windows\n (often advertisement) opened by JavaScript without an user action such as a button click.
sebserver.examconfig.props.label.blockPopUpWindows.tooltip=Disables pop-up windows</b> (often advertisement) opened by JavaScript without an user action such as a button click.
sebserver.examconfig.props.label.allowVideoCapture=Allow video capture (webcam)
sebserver.examconfig.props.label.allowVideoCapture.tooltip=Allow web applications to access camera
sebserver.examconfig.props.label.allowAudioCapture=Allow audio capture (microphone)
sebserver.examconfig.props.label.allowAudioCapture.tooltip=Allow web applications to access microphone
sebserver.examconfig.props.label.allowBrowsingBackForward=Allow navigating back/forward in exam
sebserver.examconfig.props.label.allowBrowsingBackForward.tooltip=Disabling browsing to previously visited pages may increase security,\n because browsing back might allow to leave an exam
sebserver.examconfig.props.label.allowBrowsingBackForward.tooltip=Disabling browsing to previously visited pages may increase security,</b> because browsing back might allow to leave an exam
sebserver.examconfig.props.label.newBrowserWindowNavigation=Allow navigating in additional windows
sebserver.examconfig.props.label.browserWindowAllowReload=Allow reload exam
sebserver.examconfig.props.label.browserWindowAllowReload.tooltip=Allow reload in the exam window with F5 reload button (if displayed)
@ -697,7 +704,7 @@ sebserver.examconfig.props.label.newBrowserWindowShowReloadWarning.tooltip=User
sebserver.examconfig.props.label.removeBrowserProfile=Remove profile (Win)
sebserver.examconfig.props.label.removeBrowserProfile.tooltip=Remove XULRunner browser profile (containing caches and also local storage) when quitting SEB
sebserver.examconfig.props.label.removeLocalStorage=Disable local storage (Mac)
sebserver.examconfig.props.label.removeLocalStorage.tooltip=If your web application uses local storage, you have to be sure data is saved encrypted\n and removed when no longer needed as SEB doesn't remove local storage
sebserver.examconfig.props.label.removeLocalStorage.tooltip=If your web application uses local storage, you have to be sure data is saved encrypted</b> and removed when no longer needed as SEB doesn't remove local storage
sebserver.examconfig.props.label.browserUserAgent=Suffix to be added to any user agent
sebserver.examconfig.props.group.userAgentDesktop=User agent for desktop mode
@ -705,7 +712,7 @@ sebserver.examconfig.props.label.browserUserAgentWinDesktopMode.0=Desktop defaul
sebserver.examconfig.props.label.browserUserAgentWinDesktopMode.0.tooltip=Zoom whole web pages using Ctrl-Mousewheel (Win)
sebserver.examconfig.props.label.browserUserAgentWinDesktopMode.1=Custom
sebserver.examconfig.props.label.browserUserAgentWinDesktopMode.1.tooltip=Zoom only text on web pages using Ctrl-Mousewheel (Win)
sebserver.examconfig.props.label.browserUserAgentWinDesktopModeCustom.tooltip=Custom desktop user agent string\n(SEB appends its version number automatically)
sebserver.examconfig.props.label.browserUserAgentWinDesktopModeCustom.tooltip=Custom desktop user agent string</b>(SEB appends its version number automatically)
sebserver.examconfig.props.group.userAgentTouch=User agent for touch/table mode
sebserver.examconfig.props.label.browserUserAgentWinTouchMode.0=Touch default
@ -719,28 +726,28 @@ sebserver.examconfig.props.label.browserUserAgentMac.1=Custom
sebserver.examconfig.props.label.browserUserAgentMac.1.tooltip=Zoom only text on web pages using Ctrl-Mousewheel (Win)
sebserver.examconfig.props.label.enableSebBrowser=Enable SEB with browser window
sebserver.examconfig.props.label.enableSebBrowser.tooltip=Disable this to start another application in kiosk mode\n(for example a virtual desktop infrastructure client)
sebserver.examconfig.props.label.enableSebBrowser.tooltip=Disable this to start another application in kiosk mode</b>(for example a virtual desktop infrastructure client)
sebserver.examconfig.props.label.browserWindowTitleSuffix=Suffix to be added to every browser window
sebserver.examconfig.props.label.allowDownUploads=Allow downloading and uploading files (Mac)
sebserver.examconfig.props.label.allowDownUpload.tooltip=Usually to be used with permitted third party applications\n for which you want to provide files to be down-loaded.
sebserver.examconfig.props.label.allowDownUpload.tooltip=Usually to be used with permitted third party applications</b> for which you want to provide files to be down-loaded.
sebserver.examconfig.props.label.downloadDirectoryWin=Download directory (Win)
sebserver.examconfig.props.label.downloadDirectoryOSX=Download directory (Mac)
sebserver.examconfig.props.label.openDownloads=Open files after downloading (Mac)
sebserver.examconfig.props.label.chooseFileToUploadPolicy=Choose file to upload (Mac)
sebserver.examconfig.props.label.chooseFileToUploadPolicy.tooltip=SEB can let users choose the file to upload or automatically use the same file which was down-loaded before.\nIf not found, a file requester or an error is presented depending on this setting.
sebserver.examconfig.props.label.chooseFileToUploadPolicy.tooltip=SEB can let users choose the file to upload or automatically use the same file which was down-loaded before.</b>If not found, a file requester or an error is presented depending on this setting.
sebserver.examconfig.props.label.chooseFileToUploadPolicy.0=manually with file requester
sebserver.examconfig.props.label.chooseFileToUploadPolicy.1=by attempting to upload the same file downloaded before
sebserver.examconfig.props.label.chooseFileToUploadPolicy.2=by only allowing to upload the same file downloaded before
sebserver.examconfig.props.label.downloadPDFFiles=Download and open PDF files instead of displaying them inline (Mac)
sebserver.examconfig.props.label.downloadPDFFiles.tooltip=PDF files will not be displayed by SEB but downloaded and openend (if "Open files after downloading" is active!)\n by the application set in Finder (usually Preview or Adobe Acrobat).
sebserver.examconfig.props.label.downloadPDFFiles.tooltip=PDF files will not be displayed by SEB but downloaded and openend (if "Open files after downloading" is active!)</b> by the application set in Finder (usually Preview or Adobe Acrobat).
sebserver.examconfig.props.label.allowPDFPlugIn=Allow using Acrobat Reader PDF plugin (insecure! Mac only)
sebserver.examconfig.props.label.allowPDFPlugIn.tooltip=The Adobe Acrobat Reader browser plugin should only be used on secured managed Mac computers,\n at it allows limited access the file system and unlimited to cloud services
sebserver.examconfig.props.label.allowPDFPlugIn.tooltip=The Adobe Acrobat Reader browser plugin should only be used on secured managed Mac computers,</b> at it allows limited access the file system and unlimited to cloud services
sebserver.examconfig.props.label.downloadAndOpenSebConfig=Download and open SEB Config Files
sebserver.examconfig.props.label.downloadAndOpenSebConfig.tooltip=Download and open .seb config files regardless if downloading and opening other file types is allowed.
sebserver.examconfig.props.group.quitLink=Link to quit SEB after exam
sebserver.examconfig.props.label.quitURL=Place this quit link to the 'feedback' page displayed after an exam was successfully finished.\n Clicking that link will quit SEB without having to enter the quit password.
sebserver.examconfig.props.label.quitURL=Place this quit link to the 'feedback' page displayed after an exam was successfully finished.</b> Clicking that link will quit SEB without having to enter the quit password.
sebserver.examconfig.props.label.quitURLConfirm=Ask user to confirm quitting
sebserver.examconfig.props.group.backToStart=Back to Start Button
@ -753,7 +760,7 @@ sebserver.examconfig.props.label.restartExamPasswordProtected=Protect back to st
sebserver.examconfig.props.label.restartExamPasswordProtected.tooltip=The quit/restart password (if set) must be entered when the back to start button was pressed.
sebserver.examconfig.props.label.allowSwitchToApplications=Allow switching to third party application (Mac)
sebserver.examconfig.props.label.allowSwitchToApplications.tooltip=Decreases security of the kiosk mode by allowing process switcher (Cmd+Tab).\n The blacked out background of SEB also doesn't cover some alerts and modal windows in this mode.
sebserver.examconfig.props.label.allowSwitchToApplications.tooltip=Decreases security of the kiosk mode by allowing process switcher (Cmd+Tab).</b> The blacked out background of SEB also doesn't cover some alerts and modal windows in this mode.
sebserver.examconfig.props.label.allowFlashFullscreen=Allow Flash to switch to fullscreen mode (Mac)
sebserver.examconfig.props.label.permittedProcesses.add.tooltip=Add permitted process
sebserver.examconfig.props.label.permittedProcesses.remove.tooltip=Remove selected permitted process
@ -766,11 +773,11 @@ sebserver.examconfig.props.label.permittedProcesses.os.tooltip=Indicates on whic
sebserver.examconfig.props.label.permittedProcesses.os.0=OS X
sebserver.examconfig.props.label.permittedProcesses.os.1=Win
sebserver.examconfig.props.label.permittedProcesses.title=Title
sebserver.examconfig.props.label.permittedProcesses.title.tooltip=Application title which is displayed in the application chooser.\n Background processes don't have a title, because they can't be selected by users.
sebserver.examconfig.props.label.permittedProcesses.title.tooltip=Application title which is displayed in the application chooser.</b> Background processes don't have a title, because they can't be selected by users.
sebserver.examconfig.props.label.permittedProcesses.description=Description
sebserver.examconfig.props.label.permittedProcesses.description.tooltip=Optional, should explain what kind of process this is,\n because this might not be obvious only from the executable's name.
sebserver.examconfig.props.label.permittedProcesses.description.tooltip=Optional, should explain what kind of process this is,</b> because this might not be obvious only from the executable's name.
sebserver.examconfig.props.label.permittedProcesses.executable=Executable
sebserver.examconfig.props.label.permittedProcesses.executable.tooltip=File name of the executable, which should not contain any parts of a file system path,\n only the filename of the exe file (like calc.exe).
sebserver.examconfig.props.label.permittedProcesses.executable.tooltip=File name of the executable, which should not contain any parts of a file system path,</b> only the filename of the exe file (like calc.exe).
sebserver.examconfig.props.label.permittedProcesses.originalName=Original Name
sebserver.examconfig.props.label.permittedProcesses.allowedExecutables=Window handling process
sebserver.examconfig.props.label.permittedProcesses.path=Path
@ -780,13 +787,13 @@ sebserver.examconfig.props.label.permittedProcesses.arguments.argument=Argument
sebserver.examconfig.props.label.permittedProcesses.arguments.addAction=Add new argument
sebserver.examconfig.props.label.permittedProcesses.arguments.removeAction=Remove this argument
sebserver.examconfig.props.label.permittedProcesses.identifier=Identifier
sebserver.examconfig.props.label.permittedProcesses.identifier.tooltip=(Sub) string in the title of the main window of a tricky third party application (Java, Acrobat etc.).\n Mac OS X: Bundle identifier of the process in reverse domain notation.
sebserver.examconfig.props.label.permittedProcesses.identifier.tooltip=(Sub) string in the title of the main window of a tricky third party application (Java, Acrobat etc.).</b> Mac OS X: Bundle identifier of the process in reverse domain notation.
sebserver.examconfig.props.label.permittedProcesses.iconInTaskbar=Icon in taskbar
sebserver.examconfig.props.label.permittedProcesses.iconInTaskbar.tooltip=Show icon of permitted application in task bar\n (not possible when 'run in background' is enabled).
sebserver.examconfig.props.label.permittedProcesses.iconInTaskbar.tooltip=Show icon of permitted application in task bar</b> (not possible when 'run in background' is enabled).
sebserver.examconfig.props.label.permittedProcesses.autostart=Autostart
sebserver.examconfig.props.label.permittedProcesses.autostart.tooltip=Start the process automatically together with SEB.
sebserver.examconfig.props.label.permittedProcesses.runInBackground=Allow running in background
sebserver.examconfig.props.label.permittedProcesses.runInBackground.tooltip=Allow the permitted process to already be running when SEB starts.\n Such a process can't have an icon in the task bar.
sebserver.examconfig.props.label.permittedProcesses.runInBackground.tooltip=Allow the permitted process to already be running when SEB starts.</b> Such a process can't have an icon in the task bar.
sebserver.examconfig.props.label.permittedProcesses.allowUserToChooseApp=Allow user to select location of application
sebserver.examconfig.props.label.permittedProcesses.strongKill=Force quit (risk of data loss)
sebserver.examconfig.props.label.permittedProcesses.strongKill.tooltip=Terminate process in a not-nice way, which may cause data loss if the application had unsaved data
@ -801,15 +808,15 @@ sebserver.examconfig.props.label.prohibitedProcesses.os=OS
sebserver.examconfig.props.label.prohibitedProcesses.os.0=OS X
sebserver.examconfig.props.label.prohibitedProcesses.os.1=Win
sebserver.examconfig.props.label.prohibitedProcesses.description=Description
sebserver.examconfig.props.label.prohibitedProcesses.description.tooltip=Optional, to explain what kind of process this is,\n because this might not be obvious only from the executable's name.
sebserver.examconfig.props.label.prohibitedProcesses.description.tooltip=Optional, to explain what kind of process this is,</b> because this might not be obvious only from the executable's name.
sebserver.examconfig.props.label.prohibitedProcesses.executable=Executable
sebserver.examconfig.props.label.prohibitedProcesses.executable.tooltip=File name of the executable, which should not contain any parts of a file system path,\n only the filename of the exe file (like calc.exe).
sebserver.examconfig.props.label.prohibitedProcesses.executable.tooltip=File name of the executable, which should not contain any parts of a file system path,</b> only the filename of the exe file (like calc.exe).
sebserver.examconfig.props.label.prohibitedProcesses.originalName=Original Name
sebserver.examconfig.props.label.prohibitedProcesses.originalName.tooltip=Original file name (optional)
sebserver.examconfig.props.label.prohibitedProcesses.identifier=Identifier
sebserver.examconfig.props.label.prohibitedProcesses.identifier.tooltip=Title of the main window of a Java third party application.\n Mac OS X: Bundle identifier of the process in reverse domain notation.
sebserver.examconfig.props.label.prohibitedProcesses.identifier.tooltip=Title of the main window of a Java third party application.</b> Mac OS X: Bundle identifier of the process in reverse domain notation.
sebserver.examconfig.props.label.prohibitedProcesses.strongKill=Force quit (risk of data loss)
sebserver.examconfig.props.label.prohibitedProcesses.strongKill.tooltip=Terminate process in a not-nice way,\n which may cause data loss if the application had unsaved data
sebserver.examconfig.props.label.prohibitedProcesses.strongKill.tooltip=Terminate process in a not-nice way,</b> which may cause data loss if the application had unsaved data
sebserver.examconfig.props.group.urlFilter=Filter
sebserver.examconfig.props.label.URLFilterEnable=Activate URL Filtering
@ -969,7 +976,7 @@ sebserver.examconfig.props.label.insideSebEnableLogOff.tooltip=Activates the but
sebserver.examconfig.props.label.insideSebEnableShutDown=Enable Shut down
sebserver.examconfig.props.label.insideSebEnableShutDown.tooltip=Activates the button "Shutdown"
sebserver.examconfig.props.label.insideSebEnableEaseOfAccess=Enable Ease of Access
sebserver.examconfig.props.label.insideSebEnableEaseOfAccess.tooltip=Shows options when the button "Ease of Access" in the lower left corner is clicked,\nwhich offers help e.g. to visually or aurally handicapped persons, like the Magnifier Glass.
sebserver.examconfig.props.label.insideSebEnableEaseOfAccess.tooltip=Shows options when the button "Ease of Access" in the lower left corner is clicked,</b>which offers help e.g. to visually or aurally handicapped persons, like the Magnifier Glass.
sebserver.examconfig.props.label.insideSebEnableVmWareClientShade=Enable VMware Client Shade
sebserver.examconfig.props.label.insideSebEnableVmWareClientShade.tooltip=Activates the "Shade" bar at the upper edge of a virtual desktop, if existent. If you're not using VMware, this setting doesn't have any effect.
sebserver.examconfig.props.label.insideSebEnableNetworkConnectionSelector=Enable network connection selector

View file

@ -577,6 +577,8 @@ FileUpload:pressed {
border: none;
border-radius: 0px;
text-shadow: none;
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
}
@ -778,15 +780,15 @@ TabItem:selected:hover:first {
Widget-ToolTip {
padding: 10px 5px 10px 5px;
background-color: #82be1e;
padding: 10px 10px 10px 10px;
background-color: #D3D9DB;
border: 1px solid #3C5A0F;
border-radius: 2px 2px 2px 2px;
border-radius: 1px 1px 1px 1px;
color: #4a4a4a;
opacity: 1;
animation: fadeIn 200ms linear, fadeOut 600ms ease-out;
box-shadow: 3px 4px 2px rgba(0, 0, 0, 0.3);
text-align: center;
text-align: left;
}
Widget-ToolTip-Pointer {

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B