tooltips, table selection actions, activation, mandatory
This commit is contained in:
parent
c9ebeacf1e
commit
6584d6dbfe
23 changed files with 230 additions and 123 deletions
|
@ -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 = '&';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
BIN
src/main/resources/static/images/mandatory.png
Normal file
BIN
src/main/resources/static/images/mandatory.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 678 B |
Loading…
Reference in a new issue