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…
	
	Add table
		
		Reference in a new issue