package fi.utu.ville.exercises.stub; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.shared.ui.AlignmentInfo.Bits; import com.vaadin.shared.ui.colorpicker.Color; import com.vaadin.ui.Alignment; import com.vaadin.ui.CheckBox; import com.vaadin.ui.ColorPicker; import com.vaadin.ui.Component; import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Layout; import com.vaadin.ui.NativeSelect; import com.vaadin.ui.Notification; import com.vaadin.ui.Panel; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import fi.utu.ville.standardutils.Localizer; import fi.utu.ville.standardutils.StandardUIConstants; import fi.utu.ville.standardutils.Util; import fi.utu.ville.standardutils.ui.DynamicStyles.DynamicStylesEditor; import fi.utu.ville.standardutils.ui.DynamicStyles.StyleSettings; import fi.utu.ville.standardutils.ui.DynamicStyles.StyleSettings.BorderStyle; /** * Stub-implementor for {@link DynamicStylesEditor}. * * @author Erkki Kaila, Riku Haavisto * */ class StubStyleSettingsEditor extends VerticalLayout implements DynamicStylesEditor { /** * */ private static final long serialVersionUID = -831660054425691649L; /* main & state */ private final Localizer main; /* colors */ private ColorPicker background; private CheckBox transparentBG; private ColorPicker foreground; /* borders */ private NativeSelect borderStyle; private TextField borderWidth; private ColorPicker borderColor; private TextField rounded; /* fonts */ private NativeSelect fontFamily; private NativeSelect fontSize; private CheckBox fontBolded; private CheckBox fontItalic; private final static String[] FONTS = { "sans-serif", "serif", "monospace", "cursive", "fantasy" }; private final static String[] FONT_SIZES = { "100%", "75%", "120%", "8px", "10px", "12px", "13px", "14px", "16px", "18px", "20px", "22px", "24px", "26px", "30px", "36px", "40px", "56px", "72px", "96px" }; /* margin & padding */ private CheckBox marginSymmetric; private TextField marginTop; private TextField marginBottom; private TextField marginLeft; private TextField marginRight; private CheckBox paddingSymmetric; private TextField paddingTop; private TextField paddingBottom; private TextField paddingLeft; private TextField paddingRight; /** * Create new style settings dialog for creating new style settings * * @param main * ViLLE main server object */ public StubStyleSettingsEditor(Localizer main) { this.main = main; // Loads "default" styles and inits the UI loadStyles(new StubStyleSettings()); } @Override public Component getStylesEditor() { return this; } @Override public void loadStyles(StyleSettings toLoad) { removeAllComponents(); addColorPickers(toLoad); addBorderSettings(toLoad); addFontSettings(toLoad); addMarginSettings(toLoad); addPaddingSettings(toLoad); } /** * Adds the color picker section to dialog */ private void addColorPickers(StyleSettings styles) { final Panel p = new Panel(main.getUIText(StandardUIConstants.COLORS)); final Layout pL = new VerticalLayout(); p.setContent(pL); p.setStyleName("light"); final Color initColor = styles.getBackgroundColor().equals( "transparent") ? Color.WHITE : Util.colorFromHexString(styles .getBackgroundColor()); background = new ColorPicker( main.getUIText(StandardUIConstants.BACKGROUND), initColor); // this is probably redundant (and not supported) since 7 // background.setButtonCaption(main.getUIText(UIConstants.BACKGROUND)); transparentBG = new CheckBox( main.getUIText(StandardUIConstants.TRANSPARENT)); transparentBG.setImmediate(true); transparentBG.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = -3985282405650622452L; @Override public void valueChange(ValueChangeEvent event) { background.setEnabled(!transparentBG.getValue()); } }); transparentBG.setValue(styles.getBackgroundColor() .equals("transparent")); foreground = new ColorPicker(main.getUIText(StandardUIConstants.TEXT), Util.colorFromHexString(styles.getForegroundColor())); // foreground.setButtonCaption(main.getUIText(UIConstants.TEXT)); final HorizontalLayout hl = new HorizontalLayout(); hl.setSpacing(true); hl.setWidth("100%"); hl.addComponent(background); hl.addComponent(transparentBG); hl.setComponentAlignment(transparentBG, Alignment.BOTTOM_LEFT); final Label spacer = new Label(" "); hl.addComponent(spacer); hl.addComponent(foreground); hl.setComponentAlignment(foreground, new Alignment(Bits.ALIGNMENT_RIGHT)); hl.setExpandRatio(spacer, 1.0f); pL.addComponent(hl); addComponent(p); } /** * Adds the border settings panel in dialog */ private void addBorderSettings(StyleSettings styles) { final Panel p = new Panel(main.getUIText(StandardUIConstants.BORDER)); final Layout pL = new VerticalLayout(); p.setContent(pL); p.setStyleName("light"); borderStyle = new NativeSelect( main.getUIText(StandardUIConstants.STYLE)); borderStyle.addItem(BorderStyle.NONE); borderStyle.addItem(BorderStyle.SOLID); borderStyle.addItem(BorderStyle.DOTTED); borderStyle.setNullSelectionAllowed(false); borderStyle.setImmediate(true); borderStyle.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 3420396761480784196L; @Override public void valueChange(ValueChangeEvent event) { if (borderStyle.getValue().equals(BorderStyle.NONE)) { borderColor.setEnabled(false); borderWidth.setEnabled(false); rounded.setEnabled(false); } else { borderColor.setEnabled(true); borderWidth.setEnabled(true); rounded.setEnabled(true); } } }); borderColor = new ColorPicker( main.getUIText(StandardUIConstants.COLOR), Util.colorFromHexString(styles.getBorderColor())); borderWidth = new TextField(main.getUIText(StandardUIConstants.WIDTH) + " (px)"); borderWidth.setValue("" + styles.getBorderWidth()); rounded = new TextField(main.getUIText(StandardUIConstants.ROUNDING) + " (px)"); rounded.setValue("" + styles.getBorderRounded()); final GridLayout gl = new GridLayout(2, 2); gl.setWidth("100%"); gl.addComponent(borderStyle); gl.addComponent(borderColor); gl.setComponentAlignment(borderColor, new Alignment( Bits.ALIGNMENT_BOTTOM)); gl.addComponent(borderWidth); gl.addComponent(rounded); pL.addComponent(gl); addComponent(p); borderStyle.select(styles.getBorderStyle()); } /** * Adds the font settings panel in dialog */ private void addFontSettings(StyleSettings styles) { final Panel p = new Panel(main.getUIText(StandardUIConstants.FONT)); final Layout pL = new VerticalLayout(); p.setContent(pL); p.setStyleName("light"); fontFamily = new NativeSelect( main.getUIText(StandardUIConstants.FONT_FAMILY)); fontFamily.setNullSelectionAllowed(false); for (String font : FONTS) { fontFamily.addItem(font); } fontFamily.select(styles.getFontFamily()); fontSize = new NativeSelect( main.getUIText(StandardUIConstants.FONT_SIZE)); fontSize.setNullSelectionAllowed(false); for (String size : FONT_SIZES) { fontSize.addItem(size); } fontSize.select(styles.getFontSize()); fontBolded = new CheckBox(main.getUIText(StandardUIConstants.BOLDED)); fontBolded.setValue(styles.isFontBolded()); fontItalic = new CheckBox(main.getUIText(StandardUIConstants.ITALIC)); fontItalic.setValue(styles.isFontItalic()); final GridLayout gl = new GridLayout(4, 1); gl.setWidth("100%"); gl.addComponent(fontFamily); gl.addComponent(fontSize); gl.addComponent(fontBolded); gl.setComponentAlignment(fontBolded, new Alignment( Bits.ALIGNMENT_BOTTOM)); gl.addComponent(fontItalic); gl.setComponentAlignment(fontItalic, new Alignment( Bits.ALIGNMENT_BOTTOM)); pL.addComponent(gl); addComponent(p); } /** * Adds the margin settings panel in dialog */ private void addMarginSettings(StyleSettings styles) { final Panel p = new Panel(main.getUIText(StandardUIConstants.MARGIN) + " (" + main.getUIText(StandardUIConstants.PIXELS) + ")"); final Layout pL = new VerticalLayout(); p.setContent(pL); p.setStyleName("light"); marginSymmetric = new CheckBox( main.getUIText(StandardUIConstants.SYMMETRIC)); marginSymmetric.setImmediate(true); marginSymmetric.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 2302045222059530058L; @Override public void valueChange(ValueChangeEvent event) { if (marginSymmetric.getValue()) { marginBottom.setEnabled(false); marginLeft.setEnabled(false); marginRight.setEnabled(false); } else { marginBottom.setEnabled(true); marginLeft.setEnabled(true); marginRight.setEnabled(true); } } }); final int[] margin = styles.getMargin(); marginTop = new TextField(main.getUIText(StandardUIConstants.TOP)); marginTop.setImmediate(true); marginTop.addValueChangeListener(new ValueChangeListener() { /** * */ private static final long serialVersionUID = 7807166620568865492L; @Override public void valueChange(ValueChangeEvent event) { if (marginSymmetric.getValue()) { marginBottom.setValue(marginTop.getValue()); marginLeft.setValue(marginTop.getValue()); marginRight.setValue(marginTop.getValue()); } } }); marginRight = new TextField(main.getUIText(StandardUIConstants.RIGHT)); marginBottom = new TextField(main.getUIText(StandardUIConstants.BOTTOM)); marginLeft = new TextField(main.getUIText(StandardUIConstants.LEFT)); marginTop.setValue("" + margin[0]); marginRight.setValue("" + margin[1]); marginBottom.setValue("" + margin[2]); marginLeft.setValue("" + margin[3]); final String width = "75px"; marginTop.setWidth(width); marginRight.setWidth(width); marginBottom.setWidth(width); marginLeft.setWidth(width); // margin is symmetric, if all fields have same value marginSymmetric.setValue(margin[0] == margin[1] && margin[0] == margin[2] && margin[0] == margin[3]); final GridLayout gl = new GridLayout(4, 1); gl.setWidth("100%"); gl.addComponent(marginTop); gl.addComponent(marginRight); gl.addComponent(marginBottom); gl.addComponent(marginLeft); pL.addComponent(marginSymmetric); pL.addComponent(gl); addComponent(p); } /** * Adds the padding settings panel in dialog */ private void addPaddingSettings(StyleSettings styles) { final Panel p = new Panel(main.getUIText(StandardUIConstants.PADDING) + " (" + main.getUIText(StandardUIConstants.PIXELS) + ")"); final Layout pL = new VerticalLayout(); p.setContent(pL); p.setStyleName("light"); paddingSymmetric = new CheckBox( main.getUIText(StandardUIConstants.SYMMETRIC)); paddingSymmetric.setImmediate(true); paddingSymmetric.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 2302045222059530058L; @Override public void valueChange(ValueChangeEvent event) { if (paddingSymmetric.getValue()) { paddingBottom.setEnabled(false); paddingLeft.setEnabled(false); paddingRight.setEnabled(false); } else { paddingBottom.setEnabled(true); paddingLeft.setEnabled(true); paddingRight.setEnabled(true); } } }); final int[] padding = styles.getPadding(); paddingTop = new TextField(main.getUIText(StandardUIConstants.TOP)); paddingTop.setImmediate(true); paddingTop.addValueChangeListener(new ValueChangeListener() { /** * */ private static final long serialVersionUID = 5149244173955440799L; @Override public void valueChange(ValueChangeEvent event) { if (paddingSymmetric.getValue()) { paddingBottom.setValue(paddingTop.getValue()); paddingLeft.setValue(paddingTop.getValue()); paddingRight.setValue(paddingTop.getValue()); } } }); paddingRight = new TextField(main.getUIText(StandardUIConstants.RIGHT)); paddingBottom = new TextField( main.getUIText(StandardUIConstants.BOTTOM)); paddingLeft = new TextField(main.getUIText(StandardUIConstants.LEFT)); paddingTop.setValue("" + padding[0]); paddingRight.setValue("" + padding[1]); paddingBottom.setValue("" + padding[2]); paddingLeft.setValue("" + padding[3]); final String width = "75px"; paddingTop.setWidth(width); paddingRight.setWidth(width); paddingBottom.setWidth(width); paddingLeft.setWidth(width); // Padding is symmetric, if all fields have same value paddingSymmetric.setValue(padding[0] == padding[1] && padding[0] == padding[2] && padding[0] == padding[3]); final GridLayout gl = new GridLayout(4, 1); gl.setWidth("100%"); gl.addComponent(paddingTop); gl.addComponent(paddingRight); gl.addComponent(paddingBottom); gl.addComponent(paddingLeft); pL.addComponent(paddingSymmetric); pL.addComponent(gl); addComponent(p); } /** * Copies the style settings from the dialog to the object associated with this dialog */ @Override public StyleSettings getCurrStyles() { StyleSettings styles = new StubStyleSettings(); // colors if (transparentBG.getValue()) { styles.setBackgroundColor("transparent"); } else { styles.setBackgroundColor(Util.colorToHexString(background .getColor())); } styles.setForegroundColor(Util.colorToHexString(foreground.getColor())); // font styles.setFont((String) fontFamily.getValue(), (String) fontSize.getValue(), fontBolded.getValue(), fontItalic.getValue()); try { // border styles.setBorder((BorderStyle) borderStyle.getValue(), Integer.parseInt(borderWidth.getValue()), Util.colorToHexString(borderColor.getColor()), Integer.parseInt(rounded.getValue())); // margin styles.setMargin(Integer.parseInt(marginTop.getValue()), Integer.parseInt(marginRight.getValue()), Integer.parseInt(marginBottom.getValue()), Integer.parseInt(marginLeft.getValue())); // padding styles.setPadding(Integer.parseInt(paddingTop.getValue()), Integer.parseInt(paddingRight.getValue()), Integer.parseInt(paddingBottom.getValue()), Integer.parseInt(paddingLeft.getValue())); } catch (NumberFormatException nfe) { Notification .show(main .getUIText(StandardUIConstants.INVALID_VALUE_IN_NUMBER_FIELDS), Notification.Type.ERROR_MESSAGE); } return styles; } }