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 PERCENTAGE = '%';
|
||||||
public static final Character SLASH = '/';
|
public static final Character SLASH = '/';
|
||||||
public static final Character BACKSLASH = '\\';
|
public static final Character BACKSLASH = '\\';
|
||||||
public static final Character QUOTE = '"';
|
public static final Character QUOTE = '\'';
|
||||||
public static final Character DOUBLE_QUOTE = '\'';
|
public static final Character DOUBLE_QUOTE = '"';
|
||||||
public static final Character COMMA = ',';
|
public static final Character COMMA = ',';
|
||||||
public static final Character PIPE = '|';
|
public static final Character PIPE = '|';
|
||||||
public static final Character AMPERSAND = '&';
|
public static final Character AMPERSAND = '&';
|
||||||
|
|
|
@ -328,6 +328,14 @@ public final class Utils {
|
||||||
: null;
|
: 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) {
|
public static final String encodeFormURL_UTF_8(final String value) {
|
||||||
if (StringUtils.isBlank(value)) {
|
if (StringUtils.isBlank(value)) {
|
||||||
return 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.Indicator;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.exam.QuizData;
|
import ch.ethz.seb.sebserver.gbl.model.exam.QuizData;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
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.content.action.ActionDefinition;
|
||||||
import ch.ethz.seb.sebserver.gui.form.Form;
|
import ch.ethz.seb.sebserver.gui.form.Form;
|
||||||
import ch.ethz.seb.sebserver.gui.form.FormBuilder;
|
import ch.ethz.seb.sebserver.gui.form.FormBuilder;
|
||||||
|
@ -107,7 +108,7 @@ public class IndicatorForm implements TemplateComposer {
|
||||||
|
|
||||||
final boolean typeSet = indicator.type != null;
|
final boolean typeSet = indicator.type != null;
|
||||||
final String typeDescription = (typeSet)
|
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;
|
: Constants.EMPTY_NOTE;
|
||||||
|
|
||||||
// new PageContext with actual EntityKey
|
// new PageContext with actual EntityKey
|
||||||
|
|
|
@ -109,7 +109,8 @@ public class InstitutionForm implements TemplateComposer {
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.INSTITUTION.ATTR_NAME,
|
Domain.INSTITUTION.ATTR_NAME,
|
||||||
FORM_NAME_TEXT_KEY,
|
FORM_NAME_TEXT_KEY,
|
||||||
institution.name))
|
institution.name)
|
||||||
|
.mandatory(!isReadonly))
|
||||||
.addField(FormBuilder.text(
|
.addField(FormBuilder.text(
|
||||||
Domain.INSTITUTION.ATTR_URL_SUFFIX,
|
Domain.INSTITUTION.ATTR_URL_SUFFIX,
|
||||||
FORM_URL_SUFFIX_TEXT_KEY,
|
FORM_URL_SUFFIX_TEXT_KEY,
|
||||||
|
|
|
@ -8,28 +8,23 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.gui.content;
|
package ch.ethz.seb.sebserver.gui.content;
|
||||||
|
|
||||||
import java.util.Set;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Component;
|
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.api.EntityType;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Domain;
|
import ch.ethz.seb.sebserver.gbl.model.Domain;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Entity;
|
import ch.ethz.seb.sebserver.gbl.model.Entity;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
|
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
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.content.action.ActionDefinition;
|
||||||
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
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.PageContext;
|
||||||
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
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.PageService.PageActionBuilder;
|
||||||
import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer;
|
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.page.impl.PageAction;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
|
||||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitutionPage;
|
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(
|
this.activityFilter = new TableFilterAttribute(
|
||||||
CriteriaType.SINGLE_SELECTION,
|
CriteriaType.SINGLE_SELECTION,
|
||||||
Institution.FILTER_ATTR_ACTIVE,
|
Institution.FILTER_ATTR_ACTIVE,
|
||||||
Constants.TRUE_STRING,
|
StringUtils.EMPTY,
|
||||||
this.pageService.getResourceService()::activityResources);
|
this.pageService.getResourceService()::activityResources);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +117,14 @@ public class InstitutionList implements TemplateComposer {
|
||||||
.withDefaultAction(pageActionBuilder
|
.withDefaultAction(pageActionBuilder
|
||||||
.newAction(ActionDefinition.INSTITUTION_VIEW_FROM_LIST)
|
.newAction(ActionDefinition.INSTITUTION_VIEW_FROM_LIST)
|
||||||
.create())
|
.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));
|
.compose(pageContext.copyOf(content));
|
||||||
|
|
||||||
// propagate content actions to action-pane
|
// propagate content actions to action-pane
|
||||||
|
@ -153,28 +155,4 @@ public class InstitutionList implements TemplateComposer {
|
||||||
.publishIf(() -> instGrant.m() && table.hasAnyContent(), false);
|
.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,
|
PageStateDefinitionImpl.INSTITUTION_VIEW,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
INSTITUTION_SAVE_AND_ACTIVATE(
|
INSTITUTION_SAVE_AND_ACTIVATE(
|
||||||
new LocTextKey("sebserver.institution.action.activate"),
|
new LocTextKey("sebserver.form.action.save.activate"),
|
||||||
ImageIcon.ACTIVE,
|
ImageIcon.ACTIVE,
|
||||||
PageStateDefinitionImpl.INSTITUTION_VIEW,
|
PageStateDefinitionImpl.INSTITUTION_VIEW,
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
|
@ -70,7 +70,7 @@ public enum ActionDefinition {
|
||||||
ActionCategory.FORM),
|
ActionCategory.FORM),
|
||||||
INSTITUTION_TOGGLE_ACTIVITY(
|
INSTITUTION_TOGGLE_ACTIVITY(
|
||||||
new LocTextKey("sebserver.overall.action.toggle-activity"),
|
new LocTextKey("sebserver.overall.action.toggle-activity"),
|
||||||
ImageIcon.TOGGLE_OFF,
|
ImageIcon.SWITCH,
|
||||||
PageStateDefinitionImpl.INSTITUTION_LIST,
|
PageStateDefinitionImpl.INSTITUTION_LIST,
|
||||||
ActionCategory.INSTITUTION_LIST),
|
ActionCategory.INSTITUTION_LIST),
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,7 @@ public class ActionPane implements TemplateComposer {
|
||||||
actionItem.setForeground(null);
|
actionItem.setForeground(null);
|
||||||
} else {
|
} else {
|
||||||
actionItem.setForeground(new Color(parent.getDisplay(), new RGBA(150, 150, 150, 50)));
|
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 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_LEFT = ".tooltip.left";
|
||||||
public static final String TOOLTIP_KEY_SUFFIX_RIGHT = ".tooltip.right";
|
public static final String TOOLTIP_KEY_SUFFIX_RIGHT = ".tooltip.right";
|
||||||
|
|
||||||
|
@ -36,9 +38,11 @@ public abstract class FieldBuilder<T> {
|
||||||
boolean readonly = false;
|
boolean readonly = false;
|
||||||
boolean visible = true;
|
boolean visible = true;
|
||||||
String defaultLabel = null;
|
String defaultLabel = null;
|
||||||
|
boolean isMandatory = false;
|
||||||
|
|
||||||
final String name;
|
final String name;
|
||||||
final LocTextKey label;
|
final LocTextKey label;
|
||||||
|
final LocTextKey tooltipLabel;
|
||||||
final LocTextKey tooltipKeyLeft;
|
final LocTextKey tooltipKeyLeft;
|
||||||
final LocTextKey tooltipKeyRight;
|
final LocTextKey tooltipKeyRight;
|
||||||
final T value;
|
final T value;
|
||||||
|
@ -47,6 +51,7 @@ public abstract class FieldBuilder<T> {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.label = label;
|
this.label = label;
|
||||||
this.value = value;
|
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.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;
|
this.tooltipKeyRight = (label != null) ? new LocTextKey(label.name + TOOLTIP_KEY_SUFFIX_RIGHT) : null;
|
||||||
}
|
}
|
||||||
|
@ -61,6 +66,16 @@ public abstract class FieldBuilder<T> {
|
||||||
return this;
|
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) {
|
public FieldBuilder<T> withInputSpan(final int span) {
|
||||||
this.spanInput = span;
|
this.spanInput = span;
|
||||||
return this;
|
return this;
|
||||||
|
@ -108,7 +123,7 @@ public abstract class FieldBuilder<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
final Composite infoGrid = new Composite(parent, SWT.NONE);
|
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.verticalSpacing = 0;
|
||||||
gridLayout.marginHeight = 0;
|
gridLayout.marginHeight = 0;
|
||||||
gridLayout.marginWidth = 0;
|
gridLayout.marginWidth = 0;
|
||||||
|
@ -128,14 +143,26 @@ public abstract class FieldBuilder<T> {
|
||||||
info.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
|
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(
|
final Label label = labelLocalized(
|
||||||
builder.widgetFactory,
|
builder.widgetFactory,
|
||||||
infoGrid,
|
infoGrid,
|
||||||
fieldBuilder.label,
|
fieldBuilder.label,
|
||||||
fieldBuilder.defaultLabel,
|
fieldBuilder.defaultLabel,
|
||||||
|
(hasLabelTooltip) ? fieldBuilder.tooltipLabel : null,
|
||||||
1,
|
1,
|
||||||
fieldBuilder.titleValign);
|
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 &&
|
if (fieldBuilder.tooltipKeyRight != null &&
|
||||||
StringUtils.isNotBlank(builder.i18nSupport.getText(fieldBuilder.tooltipKeyRight, ""))) {
|
StringUtils.isNotBlank(builder.i18nSupport.getText(fieldBuilder.tooltipKeyRight, ""))) {
|
||||||
|
|
||||||
|
@ -156,7 +183,7 @@ public abstract class FieldBuilder<T> {
|
||||||
final String defaultText,
|
final String defaultText,
|
||||||
final int hspan) {
|
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(
|
public static final Label labelLocalized(
|
||||||
|
@ -164,13 +191,18 @@ public abstract class FieldBuilder<T> {
|
||||||
final Composite parent,
|
final Composite parent,
|
||||||
final LocTextKey locTextKey,
|
final LocTextKey locTextKey,
|
||||||
final String defaultText,
|
final String defaultText,
|
||||||
|
final LocTextKey tooltipTextKey,
|
||||||
final int hspan,
|
final int hspan,
|
||||||
final int verticalAlignment) {
|
final int verticalAlignment) {
|
||||||
|
|
||||||
|
final LocTextKey labelKey = StringUtils.isNotBlank(defaultText)
|
||||||
|
? new LocTextKey(defaultText)
|
||||||
|
: locTextKey;
|
||||||
|
|
||||||
final Label label = widgetFactory.labelLocalized(
|
final Label label = widgetFactory.labelLocalized(
|
||||||
parent,
|
parent,
|
||||||
locTextKey,
|
labelKey,
|
||||||
(StringUtils.isNotBlank(defaultText) ? defaultText : locTextKey.name));
|
tooltipTextKey);
|
||||||
final GridData gridData = new GridData(SWT.LEFT, verticalAlignment, false, false, hspan, 1);
|
final GridData gridData = new GridData(SWT.LEFT, verticalAlignment, false, false, hspan, 1);
|
||||||
gridData.heightHint = FormBuilder.FORM_ROW_HEIGHT;
|
gridData.heightHint = FormBuilder.FORM_ROW_HEIGHT;
|
||||||
label.setLayoutData(gridData);
|
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.ConfigurationTableValues.TableValue;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.Orientation;
|
import ch.ethz.seb.sebserver.gbl.model.sebconfig.Orientation;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
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.ExamConfigurationService;
|
||||||
import ch.ethz.seb.sebserver.gui.service.examconfig.InputField;
|
import ch.ethz.seb.sebserver.gui.service.examconfig.InputField;
|
||||||
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
||||||
|
@ -41,8 +42,9 @@ import ch.ethz.seb.sebserver.gui.widget.WidgetFactory.ImageIcon;
|
||||||
@GuiProfile
|
@GuiProfile
|
||||||
public class TableFieldBuilder extends AbstractTableFieldBuilder {
|
public class TableFieldBuilder extends AbstractTableFieldBuilder {
|
||||||
|
|
||||||
private static final String ADD_TOOLTIP_SUFFIX = ".add.tooltip";
|
private static final String TOOLTIP_SUFFIX = ".tooltip";
|
||||||
private static final String REMOVE_TOOLTIP_SUFFIX = ".remove.tooltip";
|
private static final String ADD_TOOLTIP_SUFFIX = ".add" + TOOLTIP_SUFFIX;
|
||||||
|
private static final String REMOVE_TOOLTIP_SUFFIX = ".remove" + TOOLTIP_SUFFIX;
|
||||||
|
|
||||||
protected TableFieldBuilder(
|
protected TableFieldBuilder(
|
||||||
final RestService restService,
|
final RestService restService,
|
||||||
|
@ -79,7 +81,7 @@ public class TableFieldBuilder extends AbstractTableFieldBuilder {
|
||||||
columnAttribute.name),
|
columnAttribute.name),
|
||||||
new LocTextKey(ExamConfigurationService.ATTRIBUTE_LABEL_LOC_TEXT_PREFIX +
|
new LocTextKey(ExamConfigurationService.ATTRIBUTE_LABEL_LOC_TEXT_PREFIX +
|
||||||
columnAttribute.name +
|
columnAttribute.name +
|
||||||
".tootltip"));
|
TOOLTIP_SUFFIX));
|
||||||
column.setWidth(100);
|
column.setWidth(100);
|
||||||
column.setResizable(false);
|
column.setResizable(false);
|
||||||
column.setMoveable(false);
|
column.setMoveable(false);
|
||||||
|
@ -88,15 +90,14 @@ public class TableFieldBuilder extends AbstractTableFieldBuilder {
|
||||||
final TableInputField tableField = new TableInputField(
|
final TableInputField tableField = new TableInputField(
|
||||||
tableContext,
|
tableContext,
|
||||||
table);
|
table);
|
||||||
|
|
||||||
if (!viewContext.readonly) {
|
if (!viewContext.readonly) {
|
||||||
TableColumn column = new TableColumn(table, SWT.NONE);
|
TableColumn column = new TableColumn(table, SWT.NONE);
|
||||||
column.setImage(ImageIcon.ADD_BOX_WHITE.getImage(parent.getDisplay()));
|
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 +
|
ExamConfigurationService.ATTRIBUTE_LABEL_LOC_TEXT_PREFIX +
|
||||||
attribute.name +
|
attribute.name +
|
||||||
ADD_TOOLTIP_SUFFIX,
|
ADD_TOOLTIP_SUFFIX,
|
||||||
"Add new"));
|
"Add new")));
|
||||||
column.setWidth(20);
|
column.setWidth(20);
|
||||||
column.setResizable(false);
|
column.setResizable(false);
|
||||||
column.setMoveable(false);
|
column.setMoveable(false);
|
||||||
|
@ -107,11 +108,11 @@ public class TableFieldBuilder extends AbstractTableFieldBuilder {
|
||||||
|
|
||||||
column = new TableColumn(table, SWT.NONE);
|
column = new TableColumn(table, SWT.NONE);
|
||||||
column.setImage(ImageIcon.REMOVE_BOX_WHITE.getImage(parent.getDisplay()));
|
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 +
|
ExamConfigurationService.ATTRIBUTE_LABEL_LOC_TEXT_PREFIX +
|
||||||
attribute.name +
|
attribute.name +
|
||||||
REMOVE_TOOLTIP_SUFFIX,
|
REMOVE_TOOLTIP_SUFFIX,
|
||||||
"Remove Selected"));
|
"Remove Selected")));
|
||||||
column.setWidth(20);
|
column.setWidth(20);
|
||||||
column.setResizable(false);
|
column.setResizable(false);
|
||||||
column.setMoveable(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.ConfigurationAttribute;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.Orientation;
|
import ch.ethz.seb.sebserver.gbl.model.sebconfig.Orientation;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
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.form.FieldBuilder;
|
||||||
import ch.ethz.seb.sebserver.gui.service.examconfig.ExamConfigurationService;
|
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.examconfig.InputField;
|
||||||
|
@ -91,7 +92,8 @@ public class TextFieldBuilder implements InputFieldBuilder {
|
||||||
attribute,
|
attribute,
|
||||||
i18nSupport);
|
i18nSupport);
|
||||||
if (toolTipKey != null) {
|
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(
|
text.setData(
|
||||||
PolyglotPageService.POLYGLOT_ITEM_TOOLTIP_DATA_KEY,
|
PolyglotPageService.POLYGLOT_ITEM_TOOLTIP_DATA_KEY,
|
||||||
updateFunction);
|
updateFunction);
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
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.I18nSupport;
|
||||||
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
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.i18n.PolyglotPageService;
|
||||||
|
@ -116,7 +117,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
|
||||||
b.setText(this.i18nSupport.getText(locTextKey));
|
b.setText(this.i18nSupport.getText(locTextKey));
|
||||||
}
|
}
|
||||||
if (locToolTipKey != null) {
|
if (locToolTipKey != null) {
|
||||||
b.setToolTipText(this.i18nSupport.getText(locToolTipKey));
|
b.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(locToolTipKey)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
button.setData(POLYGLOT_WIDGET_FUNCTION_KEY, buttonFunction);
|
button.setData(POLYGLOT_WIDGET_FUNCTION_KEY, buttonFunction);
|
||||||
|
@ -160,7 +161,7 @@ public final class PolyglotPageServiceImpl implements PolyglotPageService {
|
||||||
|
|
||||||
if (this.i18nSupport.hasText(locTooltipKey)) {
|
if (this.i18nSupport.hasText(locTooltipKey)) {
|
||||||
tableColumn.setData(POLYGLOT_ITEM_TOOLTIP_DATA_KEY, 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)) {
|
if (this.i18nSupport.hasText(locTooltipKey)) {
|
||||||
tabItem.setData(POLYGLOT_ITEM_TOOLTIP_DATA_KEY, 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));
|
label.setText(i18nSupport.getText(locTextKey));
|
||||||
}
|
}
|
||||||
if (locToolTipKey != null) {
|
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));
|
group.setText(i18nSupport.getText(locTextKey));
|
||||||
}
|
}
|
||||||
if (locToolTipKey != null) {
|
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.EntityKey;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Page;
|
import ch.ethz.seb.sebserver.gbl.model.Page;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
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.content.action.ActionDefinition;
|
||||||
import ch.ethz.seb.sebserver.gui.form.FormBuilder;
|
import ch.ethz.seb.sebserver.gui.form.FormBuilder;
|
||||||
import ch.ethz.seb.sebserver.gui.service.ResourceService;
|
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.LocTextKey;
|
||||||
import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService;
|
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.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.event.PageEvent;
|
||||||
import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction;
|
import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction;
|
||||||
import ch.ethz.seb.sebserver.gui.service.page.impl.PageState;
|
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
|
/** Publishes a given PageEvent to the current page tree
|
||||||
* This goes through the page-tree and collects all listeners the are listen to
|
* This goes through the page-tree and collects all listeners the are listen to
|
||||||
* the specified page event type.
|
* the specified page event type.
|
||||||
|
|
|
@ -40,7 +40,6 @@ public class ComposerServiceImpl implements ComposerService {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ComposerServiceImpl.class);
|
private static final Logger log = LoggerFactory.getLogger(ComposerServiceImpl.class);
|
||||||
|
|
||||||
// TODO configurable
|
|
||||||
private final Class<? extends PageDefinition> loginPageType = DefaultLoginPage.class;
|
private final Class<? extends PageDefinition> loginPageType = DefaultLoginPage.class;
|
||||||
private final Class<? extends PageDefinition> mainPageType = DefaultMainPage.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> {
|
public final class ColumnDefinition<ROW extends Entity> {
|
||||||
|
|
||||||
|
private static final String TOOLTIP_TEXT_KEY_SUFFIX = ".tooltip";
|
||||||
|
|
||||||
final String columnName;
|
final String columnName;
|
||||||
final LocTextKey displayName;
|
final LocTextKey displayName;
|
||||||
final Function<ROW, ?> valueSupplier;
|
final Function<ROW, ?> valueSupplier;
|
||||||
|
@ -55,7 +57,7 @@ public final class ColumnDefinition<ROW extends Entity> {
|
||||||
|
|
||||||
this.columnName = columnName;
|
this.columnName = columnName;
|
||||||
this.displayName = displayName;
|
this.displayName = displayName;
|
||||||
this.tooltip = tooltip;
|
this.tooltip = (tooltip != null) ? tooltip : new LocTextKey(displayName.name + TOOLTIP_TEXT_KEY_SUFFIX);
|
||||||
this.widthProportion = widthProportion;
|
this.widthProportion = widthProportion;
|
||||||
this.valueSupplier = valueSupplier;
|
this.valueSupplier = valueSupplier;
|
||||||
this.filterAttribute = filterAttribute;
|
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 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 COLUMN_DEFINITION = "COLUMN_DEFINITION";
|
||||||
private static final String TABLE_ROW_DATA = "TABLE_ROW_DATA";
|
private static final String TABLE_ROW_DATA = "TABLE_ROW_DATA";
|
||||||
private static final int HEADER_HEIGHT = 40;
|
private static final int HEADER_HEIGHT = 40;
|
||||||
|
@ -425,11 +427,23 @@ public class EntityTable<ROW extends Entity> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createTableColumns() {
|
private void createTableColumns() {
|
||||||
|
final String sortText = this.i18nSupport.getText(DEFAULT_SORT_COLUMN_TOOLTIP_KEY, "");
|
||||||
|
|
||||||
for (final ColumnDefinition<ROW> column : this.columns) {
|
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(
|
final TableColumn tableColumn = this.widgetFactory.tableColumnLocalized(
|
||||||
this.table,
|
this.table,
|
||||||
column.displayName,
|
column.displayName,
|
||||||
column.getTooltip());
|
tooltip);
|
||||||
|
|
||||||
tableColumn.addListener(SWT.Resize, this::adaptColumnWidthChange);
|
tableColumn.addListener(SWT.Resize, this::adaptColumnWidthChange);
|
||||||
tableColumn.setData(COLUMN_DEFINITION, column);
|
tableColumn.setData(COLUMN_DEFINITION, column);
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
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.I18nSupport;
|
||||||
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
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 = new FileUpload(this, SWT.NONE);
|
||||||
this.fileUpload.setImage(WidgetFactory.ImageIcon.IMPORT.getImage(parent.getDisplay()));
|
this.fileUpload.setImage(WidgetFactory.ImageIcon.IMPORT.getImage(parent.getDisplay()));
|
||||||
this.fileUpload.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
|
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.inputReceiver = new InputReceiver();
|
||||||
this.uploadHandler = new FileUploadHandler(this.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));
|
this.fileName.setText(this.i18nSupport.getText(PLEASE_SELECT_TEXT));
|
||||||
}
|
}
|
||||||
if (!this.readonly) {
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.i18n.I18nSupport;
|
||||||
import ch.ethz.seb.sebserver.gui.service.push.ServerPushContext;
|
import ch.ethz.seb.sebserver.gui.service.push.ServerPushContext;
|
||||||
import ch.ethz.seb.sebserver.gui.service.push.ServerPushService;
|
import ch.ethz.seb.sebserver.gui.service.push.ServerPushService;
|
||||||
|
@ -77,6 +78,7 @@ public final class ImageUploadSelection extends Composite {
|
||||||
gridLayout.horizontalSpacing = 0;
|
gridLayout.horizontalSpacing = 0;
|
||||||
gridLayout.marginHeight = 0;
|
gridLayout.marginHeight = 0;
|
||||||
gridLayout.marginWidth = 0;
|
gridLayout.marginWidth = 0;
|
||||||
|
gridLayout.marginLeft = 0;
|
||||||
gridLayout.verticalSpacing = 0;
|
gridLayout.verticalSpacing = 0;
|
||||||
super.setLayout(gridLayout);
|
super.setLayout(gridLayout);
|
||||||
|
|
||||||
|
@ -87,7 +89,9 @@ public final class ImageUploadSelection extends Composite {
|
||||||
if (!readonly) {
|
if (!readonly) {
|
||||||
this.fileUpload = new FileUpload(this, SWT.NONE);
|
this.fileUpload = new FileUpload(this, SWT.NONE);
|
||||||
this.fileUpload.setImage(WidgetFactory.ImageIcon.IMPORT.getImage(parent.getDisplay()));
|
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());
|
final FileUploadHandler uploadHandler = new FileUploadHandler(new ImageReceiver());
|
||||||
this.fileUpload.addListener(SWT.Selection, event -> {
|
this.fileUpload.addListener(SWT.Selection, event -> {
|
||||||
|
@ -128,7 +132,7 @@ public final class ImageUploadSelection extends Composite {
|
||||||
|
|
||||||
public void setSelectionText(final String text) {
|
public void setSelectionText(final String text) {
|
||||||
if (this.fileUpload != null) {
|
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.Constants;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Tuple;
|
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;
|
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
||||||
|
|
||||||
public final class MultiSelectionCheckbox extends Composite implements Selection {
|
public final class MultiSelectionCheckbox extends Composite implements Selection {
|
||||||
|
@ -83,7 +84,7 @@ public final class MultiSelectionCheckbox extends Composite implements Selection
|
||||||
.forEach(tuple -> {
|
.forEach(tuple -> {
|
||||||
final Button button = this.checkboxes.get(tuple._1);
|
final Button button = this.checkboxes.get(tuple._1);
|
||||||
if (button != null) {
|
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 org.eclipse.swt.widgets.Listener;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Tuple;
|
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;
|
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
||||||
|
|
||||||
public final class RadioSelection extends Composite implements Selection {
|
public final class RadioSelection extends Composite implements Selection {
|
||||||
|
@ -80,7 +81,7 @@ public final class RadioSelection extends Composite implements Selection {
|
||||||
.forEach(tuple -> {
|
.forEach(tuple -> {
|
||||||
final Button button = this.radioButtons.get(tuple._1);
|
final Button button = this.radioButtons.get(tuple._1);
|
||||||
if (button != null) {
|
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.model.exam.Indicator.Threshold;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Tuple;
|
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.content.action.ActionDefinition;
|
||||||
import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport;
|
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.LocTextKey;
|
||||||
|
@ -74,6 +75,7 @@ public class WidgetFactory {
|
||||||
public enum ImageIcon {
|
public enum ImageIcon {
|
||||||
MAXIMIZE("maximize.png"),
|
MAXIMIZE("maximize.png"),
|
||||||
MINIMIZE("minimize.png"),
|
MINIMIZE("minimize.png"),
|
||||||
|
MANDATORY("mandatory.png"),
|
||||||
ADD("add.png"),
|
ADD("add.png"),
|
||||||
REMOVE("remove.png"),
|
REMOVE("remove.png"),
|
||||||
ADD_BOX("add_box.png"),
|
ADD_BOX("add_box.png"),
|
||||||
|
@ -327,16 +329,6 @@ public class WidgetFactory {
|
||||||
return label;
|
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) {
|
public Label labelLocalized(final Composite parent, final LocTextKey locTextKey) {
|
||||||
final Label label = new Label(parent, SWT.NONE);
|
final Label label = new Label(parent, SWT.NONE);
|
||||||
this.polyglotPageService.injectI18n(label, locTextKey);
|
this.polyglotPageService.injectI18n(label, locTextKey);
|
||||||
|
@ -637,7 +629,7 @@ public class WidgetFactory {
|
||||||
try {
|
try {
|
||||||
ss.applyNewMapping(itemsSupplier.get());
|
ss.applyNewMapping(itemsSupplier.get());
|
||||||
if (toolTipTextKey != null) {
|
if (toolTipTextKey != null) {
|
||||||
ss.setToolTipText(this.i18nSupport.getText(toolTipTextKey));
|
ss.setToolTipText(Utils.formatLineBreaks(this.i18nSupport.getText(toolTipTextKey)));
|
||||||
}
|
}
|
||||||
if (itemsToolTipSupplier != null) {
|
if (itemsToolTipSupplier != null) {
|
||||||
ss.applyToolTipsForItems(itemsToolTipSupplier.get());
|
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=Documentation
|
||||||
sebserver.overall.help.link=https://www.safeexambrowser.org/news_en.html
|
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=Please select a file
|
||||||
sebserver.overall.upload.unsupported.file=This file type is not supported. Supported files are: {0}
|
sebserver.overall.upload.unsupported.file=This file type is not supported. Supported files are: {0}
|
||||||
sebserver.overall.action.modify.cancel=Cancel
|
sebserver.overall.action.modify.cancel=Cancel
|
||||||
|
@ -84,6 +84,9 @@ sebserver.form.validation.fieldError.email=Invalid mail address
|
||||||
sebserver.error.unexpected=Unexpected Error
|
sebserver.error.unexpected=Unexpected Error
|
||||||
sebserver.page.message=Information
|
sebserver.page.message=Information
|
||||||
sebserver.dialog.confirm.title=Confirmation
|
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=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?
|
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.login.failed.message=Access denied: wrong username or password
|
||||||
sebserver.logout=Sign out
|
sebserver.logout=Sign out
|
||||||
sebserver.logout.success.message=You have been successfully signed 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=Information
|
||||||
sebserver.login.password.change.success=The password was successfully changed. Please sign in with your new password
|
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.empty=No institution has been found. Please adapt the filter or create a new institution
|
||||||
sebserver.institution.list.title=Institutions
|
sebserver.institution.list.title=Institutions
|
||||||
sebserver.institution.list.column.name=Name
|
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=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=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.list=Institution
|
||||||
sebserver.institution.action.form=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.modify=Edit Institution
|
||||||
sebserver.institution.action.save=Save Institution
|
sebserver.institution.action.save=Save Institution
|
||||||
sebserver.institution.action.activate=Activate Institution
|
sebserver.institution.action.activate=Activate Institution
|
||||||
|
|
||||||
sebserver.institution.action.deactivate=Deactivate Institution
|
sebserver.institution.action.deactivate=Deactivate Institution
|
||||||
sebserver.institution.action.delete=Delete 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.title=Institution
|
||||||
|
|
||||||
sebserver.institution.form.name=Name
|
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=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=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
|
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.LAST_PING=Last Ping Time
|
||||||
sebserver.exam.indicator.type.ERROR_COUNT=Errors
|
sebserver.exam.indicator.type.ERROR_COUNT=Errors
|
||||||
sebserver.exam.indicator.type.WARN_COUNT=Warnings
|
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.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\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.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\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.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
|
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=Administrator password
|
||||||
sebserver.examconfig.props.label.hashedAdminPassword.confirm=Confirm password
|
sebserver.examconfig.props.label.hashedAdminPassword.confirm=Confirm password
|
||||||
sebserver.examconfig.props.label.allowQuit=Allow user to quit SEB
|
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=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=Quit/unlock password
|
||||||
sebserver.examconfig.props.label.hashedQuitPassword.confirm=Confirm password
|
sebserver.examconfig.props.label.hashedQuitPassword.confirm=Confirm password
|
||||||
sebserver.examconfig.props.group.exitSequence=Exit Sequence
|
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.group.wintoolbar=Browser Window Toolbar
|
||||||
sebserver.examconfig.props.label.enableBrowserWindowToolbar=Enable 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=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=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.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.group.taskbar=SEB Taskbar/Dock
|
||||||
sebserver.examconfig.props.label.showTaskBar=Show SEB taskbar
|
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=Taskbar/dock height
|
||||||
sebserver.examconfig.props.label.taskBarHeight.tooltip=Height of SEB dock/task bar in points/pixels
|
sebserver.examconfig.props.label.taskBarHeight.tooltip=Height of SEB dock/task bar in points/pixels
|
||||||
sebserver.examconfig.props.label.showReloadButton=Show reload button
|
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.group.zoom=Enable Zoom (Win/Mac)
|
||||||
sebserver.examconfig.props.label.enableZoomPage=Enable page zoom
|
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=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.group.zoomMode=Zoom Mode Win (Ctrl-Mousewheel)
|
||||||
sebserver.examconfig.props.label.zoomMode.0=Use page zoom
|
sebserver.examconfig.props.label.zoomMode.0=Use page zoom
|
||||||
sebserver.examconfig.props.label.zoomMode.0.tooltip=Zoom whole web pages using Ctrl-Mousewheel (Win)"
|
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.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=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.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.da-DK=Danish (Denmark) (da-DK)
|
||||||
sebserver.examconfig.props.label.allowSpellCheckDictionary.en-AU=English (Australia) (en-AU)
|
sebserver.examconfig.props.label.allowSpellCheckDictionary.en-AU=English (Australia) (en-AU)
|
||||||
sebserver.examconfig.props.label.allowSpellCheckDictionary.en-GB=English (United Kingdom) (en-GB)
|
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.0=get generally blocked
|
||||||
sebserver.examconfig.props.label.newBrowserWindowByLinkPolicy.1=open in same window
|
sebserver.examconfig.props.label.newBrowserWindowByLinkPolicy.1=open in same window
|
||||||
sebserver.examconfig.props.label.newBrowserWindowByLinkPolicy.2=open in new 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=Block when directing</b>to 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.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.group.newwinsize=New browser window size and position
|
||||||
sebserver.examconfig.props.label.newBrowserWindowByLinkWidth=Width
|
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.group.browserSecurity=Browser security
|
||||||
sebserver.examconfig.props.label.enablePlugIns=Enable plug-ins (Win: only Flash)
|
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=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=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=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=Allow video capture (webcam)
|
||||||
sebserver.examconfig.props.label.allowVideoCapture.tooltip=Allow web applications to access camera
|
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=Allow audio capture (microphone)
|
||||||
sebserver.examconfig.props.label.allowAudioCapture.tooltip=Allow web applications to access 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=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.newBrowserWindowNavigation=Allow navigating in additional windows
|
||||||
sebserver.examconfig.props.label.browserWindowAllowReload=Allow reload exam
|
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)
|
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=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.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=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.label.browserUserAgent=Suffix to be added to any user agent
|
||||||
sebserver.examconfig.props.group.userAgentDesktop=User agent for desktop mode
|
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.0.tooltip=Zoom whole web pages using Ctrl-Mousewheel (Win)
|
||||||
sebserver.examconfig.props.label.browserUserAgentWinDesktopMode.1=Custom
|
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.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.group.userAgentTouch=User agent for touch/table mode
|
||||||
sebserver.examconfig.props.label.browserUserAgentWinTouchMode.0=Touch default
|
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.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=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.browserWindowTitleSuffix=Suffix to be added to every browser window
|
||||||
|
|
||||||
sebserver.examconfig.props.label.allowDownUploads=Allow downloading and uploading files (Mac)
|
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.downloadDirectoryWin=Download directory (Win)
|
||||||
sebserver.examconfig.props.label.downloadDirectoryOSX=Download directory (Mac)
|
sebserver.examconfig.props.label.downloadDirectoryOSX=Download directory (Mac)
|
||||||
sebserver.examconfig.props.label.openDownloads=Open files after downloading (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=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.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.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.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=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=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=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.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.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.label.quitURLConfirm=Ask user to confirm quitting
|
||||||
|
|
||||||
sebserver.examconfig.props.group.backToStart=Back to Start Button
|
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.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=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.allowFlashFullscreen=Allow Flash to switch to fullscreen mode (Mac)
|
||||||
sebserver.examconfig.props.label.permittedProcesses.add.tooltip=Add permitted process
|
sebserver.examconfig.props.label.permittedProcesses.add.tooltip=Add permitted process
|
||||||
sebserver.examconfig.props.label.permittedProcesses.remove.tooltip=Remove selected 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.0=OS X
|
||||||
sebserver.examconfig.props.label.permittedProcesses.os.1=Win
|
sebserver.examconfig.props.label.permittedProcesses.os.1=Win
|
||||||
sebserver.examconfig.props.label.permittedProcesses.title=Title
|
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=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=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.originalName=Original Name
|
||||||
sebserver.examconfig.props.label.permittedProcesses.allowedExecutables=Window handling process
|
sebserver.examconfig.props.label.permittedProcesses.allowedExecutables=Window handling process
|
||||||
sebserver.examconfig.props.label.permittedProcesses.path=Path
|
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.addAction=Add new argument
|
||||||
sebserver.examconfig.props.label.permittedProcesses.arguments.removeAction=Remove this argument
|
sebserver.examconfig.props.label.permittedProcesses.arguments.removeAction=Remove this argument
|
||||||
sebserver.examconfig.props.label.permittedProcesses.identifier=Identifier
|
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=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=Autostart
|
||||||
sebserver.examconfig.props.label.permittedProcesses.autostart.tooltip=Start the process automatically together with SEB.
|
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=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.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=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
|
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.0=OS X
|
||||||
sebserver.examconfig.props.label.prohibitedProcesses.os.1=Win
|
sebserver.examconfig.props.label.prohibitedProcesses.os.1=Win
|
||||||
sebserver.examconfig.props.label.prohibitedProcesses.description=Description
|
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=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=Original Name
|
||||||
sebserver.examconfig.props.label.prohibitedProcesses.originalName.tooltip=Original file name (optional)
|
sebserver.examconfig.props.label.prohibitedProcesses.originalName.tooltip=Original file name (optional)
|
||||||
sebserver.examconfig.props.label.prohibitedProcesses.identifier=Identifier
|
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=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.group.urlFilter=Filter
|
||||||
sebserver.examconfig.props.label.URLFilterEnable=Activate URL Filtering
|
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=Enable Shut down
|
||||||
sebserver.examconfig.props.label.insideSebEnableShutDown.tooltip=Activates the button "Shutdown"
|
sebserver.examconfig.props.label.insideSebEnableShutDown.tooltip=Activates the button "Shutdown"
|
||||||
sebserver.examconfig.props.label.insideSebEnableEaseOfAccess=Enable Ease of Access
|
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=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.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
|
sebserver.examconfig.props.label.insideSebEnableNetworkConnectionSelector=Enable network connection selector
|
||||||
|
|
|
@ -577,6 +577,8 @@ FileUpload:pressed {
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
|
margin: 0px 0px 0px 0px;
|
||||||
|
padding: 0px 0px 0px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -778,15 +780,15 @@ TabItem:selected:hover:first {
|
||||||
|
|
||||||
|
|
||||||
Widget-ToolTip {
|
Widget-ToolTip {
|
||||||
padding: 10px 5px 10px 5px;
|
padding: 10px 10px 10px 10px;
|
||||||
background-color: #82be1e;
|
background-color: #D3D9DB;
|
||||||
border: 1px solid #3C5A0F;
|
border: 1px solid #3C5A0F;
|
||||||
border-radius: 2px 2px 2px 2px;
|
border-radius: 1px 1px 1px 1px;
|
||||||
color: #4a4a4a;
|
color: #4a4a4a;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
animation: fadeIn 200ms linear, fadeOut 600ms ease-out;
|
animation: fadeIn 200ms linear, fadeOut 600ms ease-out;
|
||||||
box-shadow: 3px 4px 2px rgba(0, 0, 0, 0.3);
|
box-shadow: 3px 4px 2px rgba(0, 0, 0, 0.3);
|
||||||
text-align: center;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget-ToolTip-Pointer {
|
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