ソースを参照

Fix declarative margin reading in AbstractOrderedLayout (#18229)

Change-Id: Ia212d83568e4f0c891ec1a248b6d8567c0cf0095
tags/7.6.0.alpha2
Johannes Dahlström 9年前
コミット
e4d7e2d500

+ 91
- 0
server/src/com/vaadin/ui/AbstractLayout.java ファイルの表示

@@ -16,7 +16,12 @@

package com.vaadin.ui;

import org.jsoup.nodes.Element;

import com.vaadin.shared.ui.AbstractLayoutState;
import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.ui.declarative.DesignAttributeHandler;
import com.vaadin.ui.declarative.DesignContext;

/**
* An abstract class that defines default implementation for the {@link Layout}
@@ -33,4 +38,90 @@ public abstract class AbstractLayout extends AbstractComponentContainer
return (AbstractLayoutState) super.getState();
}

/**
* Reads margin attributes from a design into a MarginInfo object. This
* helper method should be called from the
* {@link #readDesign(Element, DesignContext) readDesign} method of layouts
* that implement {@link MarginHandler}.
*
* @since 7.5
*
* @param design
* the design from which to read
* @param defMargin
* the default margin state for edges that are not set in the
* design
* @param context
* the DesignContext instance used for parsing the design
* @return the margin info
*/
protected MarginInfo readMargin(Element design, MarginInfo defMargin,
DesignContext context) {

if (design.hasAttr("margin")) {
boolean margin = DesignAttributeHandler.readAttribute("margin",
design.attributes(), boolean.class);
return new MarginInfo(margin);
} else {
boolean left = DesignAttributeHandler.readAttribute("margin-left",
design.attributes(), defMargin.hasLeft(), boolean.class);

boolean right = DesignAttributeHandler.readAttribute(
"margin-right", design.attributes(), defMargin.hasRight(),
boolean.class);

boolean top = DesignAttributeHandler.readAttribute("margin-top",
design.attributes(), defMargin.hasTop(), boolean.class);

boolean bottom = DesignAttributeHandler.readAttribute(
"margin-bottom", design.attributes(),
defMargin.hasBottom(), boolean.class);

return new MarginInfo(top, right, bottom, left);
}
}

/**
* Writes margin attributes from a MarginInfo object to a design. This
* helper method should be called from the
* {@link #readDesign(Element, DesignContext) writeDesign} method of layouts
* that implement {@link MarginHandler}.
*
*
* @since 7.5
*
* @param design
* the design to write to
* @param margin
* the margin state to write
* @param defMargin
* the default margin state to compare against
* @param context
* the DesignContext instance used for parsing the design
*/
protected void writeMargin(Element design, MarginInfo margin,
MarginInfo defMargin, DesignContext context) {
if (margin.hasAll()) {
DesignAttributeHandler.writeAttribute("margin",
design.attributes(), margin.hasAll(), defMargin.hasAll(),
boolean.class);
} else {

DesignAttributeHandler.writeAttribute("margin-left",
design.attributes(), margin.hasLeft(), defMargin.hasLeft(),
boolean.class);

DesignAttributeHandler.writeAttribute("margin-right",
design.attributes(), margin.hasRight(),
defMargin.hasRight(), boolean.class);

DesignAttributeHandler.writeAttribute("margin-top",
design.attributes(), margin.hasTop(), defMargin.hasTop(),
boolean.class);

DesignAttributeHandler.writeAttribute("margin-bottom",
design.attributes(), margin.hasBottom(),
defMargin.hasBottom(), boolean.class);
}
}
}

+ 2
- 49
server/src/com/vaadin/ui/AbstractOrderedLayout.java ファイルの表示

@@ -478,30 +478,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements
// process default attributes
super.readDesign(design, designContext);

// handle margins
if (design.hasAttr("margin")) {
setMargin(DesignAttributeHandler.readAttribute("margin",
design.attributes(), Boolean.class));
} else {
boolean marginLeft = DesignAttributeHandler.readAttribute(
"margin-left", design.attributes(), getMargin().hasLeft(),
Boolean.class);

boolean marginRight = DesignAttributeHandler.readAttribute(
"margin-right", design.attributes(),
getMargin().hasRight(), Boolean.class);

boolean marginTop = DesignAttributeHandler.readAttribute(
"margin-top", design.attributes(), getMargin().hasTop(),
Boolean.class);

boolean marginBottom = DesignAttributeHandler.readAttribute(
"margin-bottom", design.attributes(), getMargin()
.hasBottom(), Boolean.class);

setMargin(new MarginInfo(marginTop, marginBottom, marginLeft,
marginRight));
}
setMargin(readMargin(design, getMargin(), designContext));

// handle children
for (Element childComponent : design.children()) {
@@ -557,31 +534,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements
AbstractOrderedLayout def = (AbstractOrderedLayout) designContext
.getDefaultInstance(this);

// handle margin
MarginInfo marginInfo = getMargin();

if (marginInfo.hasAll()) {
DesignAttributeHandler.writeAttribute("margin",
design.attributes(), marginInfo.hasAll(), def.getMargin()
.hasAll(), Boolean.class);
} else {

DesignAttributeHandler.writeAttribute("margin-left", design
.attributes(), marginInfo.hasLeft(), def.getMargin()
.hasLeft(), Boolean.class);

DesignAttributeHandler.writeAttribute("margin-right", design
.attributes(), marginInfo.hasRight(), def.getMargin()
.hasRight(), Boolean.class);

DesignAttributeHandler.writeAttribute("margin-top", design
.attributes(), marginInfo.hasTop(), def.getMargin()
.hasTop(), Boolean.class);

DesignAttributeHandler.writeAttribute("margin-bottom", design
.attributes(), marginInfo.hasBottom(), def.getMargin()
.hasBottom(), Boolean.class);
}
writeMargin(design, getMargin(), def.getMargin(), designContext);

// handle children
if (!designContext.shouldWriteChildren(this, def)) {

+ 0
- 104
server/tests/src/com/vaadin/tests/server/component/AbstractLayoutDeclarativeMarginTest.java ファイルの表示

@@ -1,104 +0,0 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.server.component;

import org.junit.Test;

import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.tests.design.DeclarativeTestBase;
import com.vaadin.ui.AbstractLayout;
import com.vaadin.ui.VerticalLayout;

public class AbstractLayoutDeclarativeMarginTest extends
DeclarativeTestBase<AbstractLayout> {

@Test
public void testMarginInfo() {
VerticalLayout vl = new VerticalLayout();

String left = getMarginTag(true, false, false, false);
MarginInfo leftInfo = getMarginInfo(true, false, false, false);

String right = getMarginTag(false, true, false, false);
MarginInfo rightInfo = getMarginInfo(false, true, false, false);

String top = getMarginTag(false, false, true, false);
MarginInfo topInfo = getMarginInfo(false, false, true, false);

String bottom = getMarginTag(false, false, false, true);
MarginInfo bottomInfo = getMarginInfo(false, false, false, true);

String topLeft = getMarginTag(true, false, true, false);
MarginInfo topLeftInfo = getMarginInfo(true, false, true, false);

String topRight = getMarginTag(false, true, true, false);
MarginInfo topRightInfo = getMarginInfo(false, true, true, false);

String bottomLeft = getMarginTag(true, false, false, true);
MarginInfo bottomLeftInfo = getMarginInfo(true, false, false, true);

String bottomRight = getMarginTag(false, true, false, true);
MarginInfo bottomRightInfo = getMarginInfo(false, true, false, true);

testRW(vl, left, leftInfo);
testRW(vl, right, rightInfo);
testRW(vl, top, topInfo);
testRW(vl, bottom, bottomInfo);

testRW(vl, topLeft, topLeftInfo);
testRW(vl, topRight, topRightInfo);
testRW(vl, bottomLeft, bottomLeftInfo);
testRW(vl, bottomRight, bottomRightInfo);

// Test special case of all edges margin'ed
testRW(vl, getMarginTag(true, true, true, true), new MarginInfo(true));
}

private void testRW(VerticalLayout vl, String design, MarginInfo margin) {
vl.setMargin(margin);
testWrite(design, vl);
testRead(design, vl);
}

private String getMarginTag(boolean left, boolean right, boolean top,
boolean bottom) {
String s = "<v-vertical-layout ";

if (left && right && top && bottom) {
s += "margin='true'";
} else {
if (left) {
s += "margin-left='true' ";
}
if (right) {
s += "margin-right='true' ";
}
if (top) {
s += "margin-top='true' ";
}
if (bottom) {
s += "margin-bottom='true' ";
}
}
return s + " />";
}

private MarginInfo getMarginInfo(boolean left, boolean right, boolean top,
boolean bottom) {
return new MarginInfo(top, right, bottom, left);
}

}

+ 76
- 0
server/tests/src/com/vaadin/tests/server/component/DeclarativeMarginTest.java ファイルの表示

@@ -0,0 +1,76 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.server.component;

import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.tests.design.DeclarativeTestBase;
import com.vaadin.ui.Layout;
import com.vaadin.ui.Layout.MarginHandler;

@Ignore
public abstract class DeclarativeMarginTest<L extends Layout & MarginHandler>
extends DeclarativeTestBase<L> {

@Test
public void testMargins() {

for (int i = 0; i < 16; ++i) {
boolean top = (i & 1) == 1;
boolean right = (i & 2) == 2;
boolean bottom = (i & 4) == 4;
boolean left = (i & 8) == 8;

MarginInfo m = new MarginInfo(top, right, bottom, left);

String design = getMarginTag(top, right, bottom, left);

// The assertEquals machinery in DeclarativeTestBase uses bean
// introspection and MarginInfo is not a proper bean. It ends up
// considering *all* MarginInfo objects equal... (#18229)
L layout = read(design);
Assert.assertEquals(m, layout.getMargin());

testWrite(design, layout);
}
}

private String getMarginTag(boolean top, boolean right, boolean bottom,
boolean left) {
String s = "<v-vertical-layout ";

if (left && right && top && bottom) {
s += "margin='true'";
} else {
if (left) {
s += "margin-left='true' ";
}
if (right) {
s += "margin-right='true' ";
}
if (top) {
s += "margin-top='true' ";
}
if (bottom) {
s += "margin-bottom='true' ";
}
}
return s + " />";
}
}

+ 16
- 33
server/tests/src/com/vaadin/tests/server/component/abstractorderedlayout/AbstractOrderedLayoutDeclarativeTest.java ファイルの表示

@@ -21,7 +21,7 @@ import java.util.List;
import org.junit.Test;

import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.tests.design.DeclarativeTestBase;
import com.vaadin.tests.server.component.DeclarativeMarginTest;
import com.vaadin.ui.AbstractOrderedLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
@@ -35,58 +35,42 @@ import com.vaadin.ui.VerticalLayout;
* @author Vaadin Ltd
*/
public class AbstractOrderedLayoutDeclarativeTest extends
DeclarativeTestBase<AbstractOrderedLayout> {
DeclarativeMarginTest<AbstractOrderedLayout> {

private List<String> defaultAlignments = Arrays.asList(new String[] {
":top", ":left" });

@Test
public void testMargin() {
String design = getDesign(0, true);
AbstractOrderedLayout layout = getLayout(0, true, null);
testRead(design, layout);
testWrite(design, layout);
design = getDesign(0, false);
layout = getLayout(0, false, null);
testRead(design, layout);
testWrite(design, layout);
}

@Test
public void testExpandRatio() {
String design = getDesign(1, false);
AbstractOrderedLayout layout = getLayout(1, false, null);
String design = getDesign(1);
AbstractOrderedLayout layout = getLayout(1, null);
testRead(design, layout);
testWrite(design, layout);
design = getDesign(0.25f, false);
layout = getLayout(0.25f, false, null);
design = getDesign(0.25f);
layout = getLayout(0.25f, null);
testRead(design, layout);
testWrite(design, layout);
}

@Test
public void testAlignment() {
String design = getDesign(0, false, ":top", ":left");
AbstractOrderedLayout layout = getLayout(0, false, Alignment.TOP_LEFT);
String design = getDesign(0, ":top", ":left");
AbstractOrderedLayout layout = getLayout(0, Alignment.TOP_LEFT);
testRead(design, layout);
testWrite(design, layout);
design = getDesign(0, false, ":middle", ":center");
layout = getLayout(0, false, Alignment.MIDDLE_CENTER);
design = getDesign(0, ":middle", ":center");
layout = getLayout(0, Alignment.MIDDLE_CENTER);
testRead(design, layout);
testWrite(design, layout);
design = getDesign(0, false, ":bottom", ":right");
layout = getLayout(0, false, Alignment.BOTTOM_RIGHT);
design = getDesign(0, ":bottom", ":right");
layout = getLayout(0, Alignment.BOTTOM_RIGHT);
testRead(design, layout);
testWrite(design, layout);
}

private String getDesign(float expandRatio, boolean margin,
String... alignments) {
String result = "<v-vertical-layout caption=test-layout";
if (margin) {
result += " margin=true";
}
result += "><v-label caption=test-label ";
private String getDesign(float expandRatio, String... alignments) {
String result = "<v-vertical-layout caption=test-layout>";
result += "<v-label caption=test-label ";
String ratioString = expandRatio == 1.0f ? "\"\"" : String
.valueOf(expandRatio);
if (expandRatio != 0) {
@@ -110,10 +94,9 @@ public class AbstractOrderedLayoutDeclarativeTest extends
return result;
}

private AbstractOrderedLayout getLayout(float expandRatio, boolean margin,
private AbstractOrderedLayout getLayout(float expandRatio,
Alignment alignment) {
VerticalLayout layout = new VerticalLayout();
layout.setMargin(margin);
layout.setCaption("test-layout");
Label l = new Label();
l.setCaption("test-label");

+ 6
- 0
shared/src/com/vaadin/shared/ui/MarginInfo.java ファイルの表示

@@ -182,4 +182,10 @@ public class MarginInfo implements Serializable {
return bitMask;
}

@Override
public String toString() {
return "MarginInfo(" + hasTop() + ", " + hasRight() + ", "
+ hasBottom() + ", " + hasLeft() + ")";

}
}

読み込み中…
キャンセル
保存