diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java index ca95600e83d55024182ed26f09800edf6aedef2f..66a14b0784e2f74e16bdec0d9aa11bd1baf4d607 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java @@ -56,7 +56,8 @@ public abstract class AbstractBuilding extends CityObject { private final List<Installation> buildingInstallations = new ArrayList<>(2); private final List<BoundarySurface> boundarySurfaceList = new ArrayList<>(); private final List<BuildingRoom> buildingRooms = new ArrayList<>(); - private final List<AbstractBuildingSubdivision> buildingSubdivisions = new ArrayList<>(); + private final List<Storey> buildingStoreys = new ArrayList<>(); + private final List<BuildingUnit> buildingUnits = new ArrayList<>(); private final List<BuildingRoomFurniture> buildingRoomFurnitureList = new ArrayList<>(); private org.citygml4j.core.model.building.AbstractBuilding ab; @@ -102,8 +103,11 @@ public abstract class AbstractBuilding extends CityObject { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { bfr.unsetGmlGeometries(); } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - abs.unsetGmlGeometries(); + for (Storey storey : buildingStoreys) { + storey.unsetGmlGeometries(); + } + for (BuildingUnit bu : buildingUnits) { + bu.unsetGmlGeometries(); } } @@ -130,8 +134,11 @@ public abstract class AbstractBuilding extends CityObject { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { bfr.reCreateGeometries(factory, config); } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - abs.reCreateGeometries(factory, config); + for (Storey storey : buildingStoreys) { + storey.reCreateGeometries(factory, config); + } + for (BuildingUnit bu : buildingUnits) { + bu.reCreateGeometries(factory, config); } } @@ -208,8 +215,11 @@ public abstract class AbstractBuilding extends CityObject { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { bfr.accept(c); } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - abs.accept(c); + for (Storey storey : buildingStoreys) { + storey.accept(c); + } + for (BuildingUnit bu : buildingUnits) { + bu.accept(c); } } @@ -228,8 +238,11 @@ public abstract class AbstractBuilding extends CityObject { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { bfr.collectContainedErrors(errors); } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - abs.collectContainedErrors(errors); + for (Storey storey : buildingStoreys) { + storey.collectContainedErrors(errors); + } + for (BuildingUnit bu : buildingUnits) { + bu.collectContainedErrors(errors); } } @@ -248,8 +261,11 @@ public abstract class AbstractBuilding extends CityObject { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { bfr.clearAllContainedCheckResults(); } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - abs.clearAllContainedCheckResults(); + for (Storey storey : buildingStoreys) { + storey.clearAllContainedCheckResults(); + } + for (BuildingUnit bu : buildingUnits) { + bu.clearAllContainedCheckResults(); } } @@ -279,8 +295,13 @@ public abstract class AbstractBuilding extends CityObject { return true; } } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - if (abs.containsError(checkIdentifier)) { + for (Storey storey : buildingStoreys) { + if (storey.containsError(checkIdentifier)) { + return true; + } + } + for (BuildingUnit bu : buildingUnits) { + if (bu.containsError(checkIdentifier)) { return true; } } @@ -313,8 +334,13 @@ public abstract class AbstractBuilding extends CityObject { return true; } } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - if (abs.containsAnyError()) { + for (Storey storey : buildingStoreys) { + if (storey.containsAnyError()) { + return true; + } + } + for (BuildingUnit bu : buildingUnits) { + if (bu.containsAnyError()) { return true; } } @@ -345,8 +371,12 @@ public abstract class AbstractBuilding extends CityObject { roomFurniture.setParent(this); } - public void addAbstractBuildingSubdivision(AbstractBuildingSubdivision abs) { - buildingSubdivisions.add(abs); + public void addStorey(Storey storey) { + buildingStoreys.add(storey); + } + + public void addBuildingUnit(BuildingUnit buildingUnit) { + buildingUnits.add(buildingUnit); } public void setGmlObject(org.citygml4j.core.model.building.AbstractBuilding ab) { @@ -365,8 +395,12 @@ public abstract class AbstractBuilding extends CityObject { return buildingRoomFurnitureList; } - public List<AbstractBuildingSubdivision> getBuildingSubdivisions() { - return buildingSubdivisions; + public List<Storey> getBuildingStoreys() { + return buildingStoreys; + } + + public List<BuildingUnit> getBuildingUnits() { + return buildingUnits; } @Override @@ -384,8 +418,11 @@ public abstract class AbstractBuilding extends CityObject { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { bfr.prepareForChecking(); } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - abs.prepareForChecking(); + for (Storey storey : buildingStoreys) { + storey.prepareForChecking(); + } + for (BuildingUnit bu : buildingUnits) { + bu.prepareForChecking(); } } @@ -404,8 +441,11 @@ public abstract class AbstractBuilding extends CityObject { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { bfr.clearMetaInformation(); } - for (AbstractBuildingSubdivision abs : buildingSubdivisions) { - abs.clearMetaInformation(); + for (Storey storey : buildingStoreys) { + storey.clearMetaInformation(); + } + for (BuildingUnit bu : buildingUnits) { + bu.clearMetaInformation(); } } @@ -416,7 +456,8 @@ public abstract class AbstractBuilding extends CityObject { handler.addInstance(buildingInstallations); handler.addInstance(buildingRooms); handler.addInstance(buildingRoomFurnitureList); - handler.addInstance(buildingSubdivisions); + handler.addInstance(buildingStoreys); + handler.addInstance(buildingUnits); } @Override @@ -435,8 +476,11 @@ public abstract class AbstractBuilding extends CityObject { for (BuildingRoomFurniture originalBFR : originalAb.buildingRoomFurnitureList) { buildingRoomFurnitureList.add(handler.getCopyInstance(originalBFR)); } - for (AbstractBuildingSubdivision originalBSub : originalAb.buildingSubdivisions) { - buildingSubdivisions.add(handler.getCopyInstance(originalBSub)); + for (Storey originalBStoreys : originalAb.buildingStoreys) { + buildingStoreys.add(handler.getCopyInstance(originalBStoreys)); + } + for (BuildingUnit originalBun : originalAb.buildingUnits) { + buildingUnits.add(handler.getCopyInstance(originalBun)); } ab = originalAb.ab; } diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java index 4094f5b35df67ec5296b110644dc0ddc48d97254..3b394c190b2dee04b755ca3ef9ab1fd8109082c3 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java @@ -41,6 +41,8 @@ import org.citygml4j.core.model.bridge.BridgePart; import org.citygml4j.core.model.bridge.BridgePartProperty; import org.citygml4j.core.model.building.*; import org.citygml4j.core.model.building.BuildingFurniture; +import org.citygml4j.core.model.building.BuildingUnit; +import org.citygml4j.core.model.building.Storey; import org.citygml4j.core.model.construction.AbstractConstruction; import org.citygml4j.core.model.core.AbstractCityObject; import org.citygml4j.core.model.core.AbstractFeatureWithLifespan; @@ -605,6 +607,22 @@ public class Citygml3FeatureMapper extends ObjectWalker { cdBuilding.addBuildingRoom(br); } + for(AbstractBuildingSubdivisionProperty abs : gmlAb.getBuildingSubdivisions()) { + var gmlABS = abs.getObject(); + if (gmlABS == null) { + continue; + } + if (gmlABS instanceof Storey gmlStorey) { + de.hft.stuttgart.citydoctor2.datastructure.Storey storey = mapBuildingStorey(gmlStorey); + cdBuilding.addStorey(storey); + } + else if (gmlABS instanceof BuildingUnit gmlBU){ + de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit bu = mapBuildingUnit(gmlBU); + cdBuilding.addBuildingUnit(bu); + } + } + + SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, vertexMap, config); for (AbstractSpaceBoundaryProperty surfaceProp : gmlAb.getBoundaries()) { if (!surfaceProp.isSetObject()) { @@ -711,6 +729,54 @@ public class Citygml3FeatureMapper extends ObjectWalker { } + private de.hft.stuttgart.citydoctor2.datastructure.Storey mapBuildingStorey(Storey gmlStorey){ + de.hft.stuttgart.citydoctor2.datastructure.Storey storey = new de.hft.stuttgart.citydoctor2.datastructure.Storey(); + storey.setGmlObject(gmlStorey); + mapAbstractSpace(gmlStorey, storey); + storey.unsetGmlGeometries(); + SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, vertexMap, config); + for (AbstractSpaceBoundaryProperty surfaceProp : gmlStorey.getBoundaries()) { + if (!surfaceProp.isSetObject()) { + continue; + } + AbstractSpaceBoundary surface = surfaceProp.getObject(); + surface.accept(surfaceMapper); + } + for (BoundarySurface bs : surfaceMapper.getSurfaces()) { + storey.addBoundarySurface(bs); + for (Geometry geom : bs.getGeometries()) { + for (Polygon p : geom.getPolygons()) { + p.setPartOfSurface(bs); + } + } + } + return storey; + } + + private de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit mapBuildingUnit(BuildingUnit gmlBU){ + de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit bu = new de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit(); + bu.setGmlObject(gmlBU); + mapAbstractSpace(gmlBU, bu); + bu.unsetGmlGeometries(); + SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, vertexMap, config); + for (AbstractSpaceBoundaryProperty surfaceProp : gmlBU.getBoundaries()) { + if (!surfaceProp.isSetObject()) { + continue; + } + AbstractSpaceBoundary surface = surfaceProp.getObject(); + surface.accept(surfaceMapper); + } + for (BoundarySurface bs : surfaceMapper.getSurfaces()) { + bu.addBoundarySurface(bs); + for (Geometry geom : bs.getGeometries()) { + for (Polygon p : geom.getPolygons()) { + p.setPartOfSurface(bs); + } + } + } + return bu; + } + private void updatePartOfSurface(AbstractBuilding cdBuilding, SurfaceMapper surfaceMapper) { for (BoundarySurface bs : surfaceMapper.getSurfaces()) { cdBuilding.addBoundarySurface(bs); diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java index 0a0fb478c29146be3b962c0f89f4b65f534027ad..50e773bacebf6e05a207bd157787724725b9e55f 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java @@ -433,6 +433,8 @@ public class CityDoctorController { createBuildingInstallationNodes(b, item); createBuildingRoomNodes(b, item); createBuildingFurnitureNodes(b, item); + createBuildingStoreyNodes(b, item); + createBuildingUnitNodes(b, item); createBuildingPartNodes(b, item); } } @@ -541,6 +543,43 @@ public class CityDoctorController { } + private void createBuildingStoreyNodes(Building ab, TreeItem<Renderable> root){ + List<Storey> storeys = ab.getBuildingStoreys(); + if (storeys.isEmpty()) { + return; + } + AllStoreysNode allSNode = new AllStoreysNode(storeys); + TreeItem<Renderable> allSNodeTextItem = new TreeItem<>(allSNode); + root.getChildren().add(allSNodeTextItem); + for (Storey storey : storeys) { + StoreyNode storeyNode = new StoreyNode(storey); + TreeItem<Renderable> storeyNodeTextItem = new TreeItem<>(storeyNode); + storeyNodeTextItem.setExpanded(true); + allSNodeTextItem.getChildren().add(storeyNodeTextItem); + createGeometryNodes(storey, storeyNodeTextItem); + createBoundarySurfaceNodes(storey.getBoundarySurfaces(), storeyNodeTextItem); + } + } + + + public void createBuildingUnitNodes(Building ab, TreeItem<Renderable> root) { + List<BuildingUnit> buildingUnits = ab.getBuildingUnits(); + if (buildingUnits.isEmpty()) { + return; + } + AllBuildingUnitsNode allSNode = new AllBuildingUnitsNode(buildingUnits); + TreeItem<Renderable> allSNodeTextItem = new TreeItem<>(allSNode); + root.getChildren().add(allSNodeTextItem); + for (BuildingUnit buildingUnit : buildingUnits) { + BuildingUnitNode buildingUnitNode = new BuildingUnitNode(buildingUnit); + TreeItem<Renderable> storeyNodeTextItem = new TreeItem<>(buildingUnitNode); + storeyNodeTextItem.setExpanded(true); + allSNodeTextItem.getChildren().add(storeyNodeTextItem); + createGeometryNodes(buildingUnit, storeyNodeTextItem); + createBoundarySurfaceNodes(buildingUnit.getBoundarySurfaces(), storeyNodeTextItem); + } + } + private void createBuildingFurnitureNodes(Building ab, TreeItem<Renderable> root) { createFurnitureNodes(ab.getBuildingRoomFurnitureList(), root); } diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java index c152b4a16781fed28b4c5dc450b3f5aacf4f81a0..fe246e572ad6bd341898a1ee5ae379cea626c44a 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java @@ -288,6 +288,56 @@ public class Renderer { return polygons; } + public void render(Storey storey){ + refresher = () -> { + Set<ConcretePolygon> setupStoreyPolygons = setupStoreyPolygons(storey); + mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupStoreyPolygons)); + render(setupStoreyPolygons); + Platform.runLater(() -> { + errorUpdater = () -> displayErrors(storey); + errorUpdater.run(); + }); + }; + refresher.run(); + } + + public Set<ConcretePolygon> setupStoreyPolygons(Storey storey) { + Set<ConcretePolygon> polygons = new HashSet<>(); + addPolygons(storey, polygons); + for (BoundarySurface bs : storey.getBoundarySurfaces()) { + addPolygons(bs, polygons); + for (Opening op : bs.getOpenings()) { + addPolygons(op, polygons); + } + } + return polygons; + } + + public void render(BuildingUnit buildingUnit){ + refresher = () -> { + Set<ConcretePolygon> setupBuildingUnitPolgons = setupBuildingUnitPolygons(buildingUnit); + mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupBuildingUnitPolgons)); + render(setupBuildingUnitPolgons); + Platform.runLater(() -> { + errorUpdater = () -> displayErrors(buildingUnit); + errorUpdater.run(); + }); + }; + refresher.run(); + } + + public Set<ConcretePolygon> setupBuildingUnitPolygons(BuildingUnit buildingUnit) { + Set<ConcretePolygon> polygons = new HashSet<>(); + addPolygons(buildingUnit, polygons); + for (BoundarySurface bs : buildingUnit.getBoundarySurfaces()) { + addPolygons(bs, polygons); + for (Opening op : bs.getOpenings()) { + addPolygons(op, polygons); + } + } + return polygons; + } + public void render(BridgeObject bridge) { refresher = () -> { Set<ConcretePolygon> setupBridgePolygons = setupBridgePolygons(bridge); diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingUnitsNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingUnitsNode.java new file mode 100644 index 0000000000000000000000000000000000000000..e91e9600b300d7b40eba5c7a48bc094506d64dff --- /dev/null +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllBuildingUnitsNode.java @@ -0,0 +1,46 @@ +package de.hft.stuttgart.citydoctor2.gui.tree; + +import de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit; +import de.hft.stuttgart.citydoctor2.gui.CheckStatus; +import de.hft.stuttgart.citydoctor2.gui.Renderer; + +import java.util.List; + +public class AllBuildingUnitsNode extends Renderable{ + + private final List<BuildingUnit> buildingUnits; + + public AllBuildingUnitsNode(List<BuildingUnit> buildingUnits) { + this.buildingUnits = buildingUnits; + } + + @Override + public String getText() { + return "Building Units"; + } + + @Override + public void visit(Renderer renderer) { + renderer.clearCurrentRender(); + } + + @Override + public void refreshTextColor() { + boolean wasChecked = false; + for (BuildingUnit buildingUnit : buildingUnits) { + if (buildingUnit.isValidated()) { + wasChecked = true; + if (buildingUnit.containsAnyError()) { + setStatus(CheckStatus.ERROR); + return; + } + } + } + if (wasChecked) { + setStatus(CheckStatus.OK); + } else { + setStatus(CheckStatus.NOT_CHECKED); + } + } + +} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllStoreysNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllStoreysNode.java new file mode 100644 index 0000000000000000000000000000000000000000..9a2df0777e834dc1a3d22c31e12711ac8052a802 --- /dev/null +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllStoreysNode.java @@ -0,0 +1,46 @@ +package de.hft.stuttgart.citydoctor2.gui.tree; + +import de.hft.stuttgart.citydoctor2.datastructure.Storey; +import de.hft.stuttgart.citydoctor2.gui.CheckStatus; +import de.hft.stuttgart.citydoctor2.gui.Renderer; + +import java.util.List; + +public class AllStoreysNode extends Renderable{ + + private final List<Storey> storeys; + + public AllStoreysNode(List<Storey> storeys) { + this.storeys = storeys; + } + + @Override + public String getText() { + return "Building Storeys"; + } + + @Override + public void visit(Renderer renderer) { + renderer.clearCurrentRender(); + } + + @Override + public void refreshTextColor() { + boolean wasChecked = false; + for (Storey storey : storeys) { + if (storey.isValidated()) { + wasChecked = true; + if (storey.containsAnyError()) { + setStatus(CheckStatus.ERROR); + return; + } + } + } + if (wasChecked) { + setStatus(CheckStatus.OK); + } else { + setStatus(CheckStatus.NOT_CHECKED); + } + } + +} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingUnitNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingUnitNode.java new file mode 100644 index 0000000000000000000000000000000000000000..805b7503a7ca69501555564feb55d2edee826e8f --- /dev/null +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/BuildingUnitNode.java @@ -0,0 +1,38 @@ +package de.hft.stuttgart.citydoctor2.gui.tree; + +import de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit; +import de.hft.stuttgart.citydoctor2.gui.CheckStatus; +import de.hft.stuttgart.citydoctor2.gui.Renderer; + +public class BuildingUnitNode extends Renderable{ + + private final BuildingUnit buildingUnit; + + public BuildingUnitNode(BuildingUnit buildingUnit) { + this.buildingUnit = buildingUnit; + } + + @Override + public String getText() { + return buildingUnit.getGmlId().getGmlString(); + } + + + @Override + public void visit(Renderer renderer) { + renderer.render(buildingUnit); + } + + @Override + public void refreshTextColor() { + if (!buildingUnit.isValidated()) { + setStatus(CheckStatus.NOT_CHECKED); + } else if (buildingUnit.containsAnyError()) { + setStatus(CheckStatus.ERROR); + } else { + setStatus(CheckStatus.OK); + } + } + + +} diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/StoreyNode.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/StoreyNode.java new file mode 100644 index 0000000000000000000000000000000000000000..c0b0fe0ba052bc83610415044b90213ed49d00b6 --- /dev/null +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/StoreyNode.java @@ -0,0 +1,37 @@ +package de.hft.stuttgart.citydoctor2.gui.tree; + +import de.hft.stuttgart.citydoctor2.datastructure.Storey; +import de.hft.stuttgart.citydoctor2.gui.CheckStatus; +import de.hft.stuttgart.citydoctor2.gui.Renderer; + +public class StoreyNode extends Renderable{ + + private final Storey storey; + + public StoreyNode(Storey storey) { + this.storey = storey; + } + + @Override + public String getText() { + return storey.getGmlId().getGmlString(); + } + + + @Override + public void visit(Renderer renderer) { + renderer.render(storey); + } + + @Override + public void refreshTextColor() { + if (!storey.isValidated()) { + setStatus(CheckStatus.NOT_CHECKED); + } else if (storey.containsAnyError()) { + setStatus(CheckStatus.ERROR); + } else { + setStatus(CheckStatus.OK); + } + } + +}