Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
CityDoctor
CityDoctor2
Commits
d8d95d41
Commit
d8d95d41
authored
Mar 13, 2025
by
Riegel
Browse files
Fix: Add proper rebuilding of filtered TreeViews
parent
15ef3d5e
Changes
2
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java
View file @
d8d95d41
...
...
@@ -71,7 +71,7 @@ public class CityDoctorController {
private
AtomicInteger
waterChunkNr
=
new
AtomicInteger
(
0
);
private
AtomicInteger
landChunkNr
=
new
AtomicInteger
(
0
);
private
AtomicInteger
cityFurnitureChunkNr
=
new
AtomicInteger
(
0
);
private
AtomicInteger
other
ObjectsChunkNr
=
new
AtomicInteger
(
0
);
private
AtomicInteger
genericCity
ObjectsChunkNr
=
new
AtomicInteger
(
0
);
public
CityDoctorController
(
MainWindow
mainWindow
,
HighlightController
highlightController
,
Renderer
renderer
)
{
this
.
mainWindow
=
mainWindow
;
...
...
@@ -288,7 +288,7 @@ public class CityDoctorController {
waterChunkNr
.
set
(
0
);
landChunkNr
.
set
(
0
);
cityFurnitureChunkNr
.
set
(
0
);
other
ObjectsChunkNr
.
set
(
0
);
genericCity
ObjectsChunkNr
.
set
(
0
);
}
private
void
buildLand
(
CityDoctorModel
model
)
{
...
...
@@ -359,12 +359,12 @@ public class CityDoctorController {
if
(
model
.
getGenericCityObjects
().
isEmpty
())
{
return
;
}
TreeView
<
Renderable
>
otherObjectsView
=
mainWindow
.
get
Other
Object
s
View
();
TreeView
<
Renderable
>
otherObjectsView
=
mainWindow
.
get
GenericCity
ObjectView
();
TreeItem
<
Renderable
>
otherObjectsRoot
=
new
TreeItem
<>(
new
AllOtherObjectsNode
(
model
.
getGenericCityObjects
()));
otherObjectsRoot
.
setExpanded
(
true
);
otherObjectsView
.
setRoot
(
otherObjectsRoot
);
buildTreeFromList
(
model
.
getGenericCityObjects
(),
otherObjectsView
.
getRoot
(),
other
ObjectsChunkNr
);
addMoreButtonIfNecessary
(
model
.
getGenericCityObjects
(),
otherObjectsView
,
otherObjectsRoot
,
other
ObjectsChunkNr
);
buildTreeFromList
(
model
.
getGenericCityObjects
(),
otherObjectsView
.
getRoot
(),
genericCity
ObjectsChunkNr
);
addMoreButtonIfNecessary
(
model
.
getGenericCityObjects
(),
otherObjectsView
,
otherObjectsRoot
,
genericCity
ObjectsChunkNr
);
}
private
void
buildWater
(
CityDoctorModel
model
)
{
...
...
@@ -543,7 +543,7 @@ public class CityDoctorController {
mainWindow
.
getWaterView
().
setRoot
(
null
);
mainWindow
.
getTerrainView
().
setRoot
(
null
);
mainWindow
.
getCityFurnitureView
().
setRoot
(
null
);
mainWindow
.
get
Other
Object
s
View
().
setRoot
(
null
);
mainWindow
.
get
GenericCity
ObjectView
().
setRoot
(
null
);
mainWindow
.
getErrorTree
().
getRoot
().
getChildren
().
clear
();
mainWindow
.
getAttributeView
().
getRoot
().
getChildren
().
clear
();
mainWindow
.
getGlobalErrorsView
().
getItems
().
clear
();
...
...
@@ -612,6 +612,58 @@ public class CityDoctorController {
}
}
private
void
buildVegetationTreeFromList
(
List
<
Vegetation
>
list
,
TreeItem
<
Renderable
>
root
)
{
int
vegetationChunk
=
vegetationChunkNr
.
get
();
for
(
int
i
=
vegetationChunk
*
MAX_FEATURES_PER_CHUNK
;
i
<
(
vegetationChunk
+
1
)
*
MAX_FEATURES_PER_CHUNK
&&
i
<
list
.
size
();
i
++)
{
Vegetation
v
=
list
.
get
(
i
);
VegetationNode
node
=
new
VegetationNode
(
v
);
TreeItem
<
Renderable
>
item
=
new
TreeItem
<>(
node
);
item
.
setExpanded
(
true
);
root
.
getChildren
().
add
(
item
);
createGeometryNodes
(
v
,
item
);
}
}
private
void
buildWaterTreeFromList
(
List
<
WaterObject
>
list
,
TreeItem
<
Renderable
>
root
)
{
int
waterChunk
=
waterChunkNr
.
get
();
for
(
int
i
=
waterChunk
*
MAX_FEATURES_PER_CHUNK
;
i
<
(
waterChunk
+
1
)
*
MAX_FEATURES_PER_CHUNK
&&
i
<
list
.
size
();
i
++)
{
WaterObject
w
=
list
.
get
(
i
);
CityObjectNode
node
=
new
CityObjectNode
(
w
);
TreeItem
<
Renderable
>
item
=
new
TreeItem
<>(
node
);
item
.
setExpanded
(
true
);
root
.
getChildren
().
add
(
item
);
createGeometryNodes
(
w
,
item
);
}
}
private
void
buildCityFurnitureTreeFromList
(
List
<
CityFurniture
>
list
,
TreeItem
<
Renderable
>
root
)
{
int
cityFurnChunk
=
cityFurnitureChunkNr
.
get
();
for
(
int
i
=
cityFurnChunk
*
MAX_FEATURES_PER_CHUNK
;
i
<
(
cityFurnChunk
+
1
)
*
MAX_FEATURES_PER_CHUNK
&&
i
<
list
.
size
();
i
++)
{
CityFurniture
cf
=
list
.
get
(
i
);
CityObjectNode
node
=
new
CityObjectNode
(
cf
);
TreeItem
<
Renderable
>
item
=
new
TreeItem
<>(
node
);
item
.
setExpanded
(
true
);
root
.
getChildren
().
add
(
item
);
createGeometryNodes
(
cf
,
item
);
}
}
private
void
buildGenericCityObjectTreeFromList
(
List
<
GenericCityObject
>
list
,
TreeItem
<
Renderable
>
root
)
{
int
genericObjectChunk
=
genericCityObjectsChunkNr
.
get
();
for
(
int
i
=
genericObjectChunk
*
MAX_FEATURES_PER_CHUNK
;
i
<
(
genericObjectChunk
+
1
)
*
MAX_FEATURES_PER_CHUNK
&&
i
<
list
.
size
();
i
++)
{
GenericCityObject
goc
=
list
.
get
(
i
);
CityObjectNode
node
=
new
CityObjectNode
(
goc
);
TreeItem
<
Renderable
>
item
=
new
TreeItem
<>(
node
);
item
.
setExpanded
(
true
);
root
.
getChildren
().
add
(
item
);
createGeometryNodes
(
goc
,
item
);
}
}
private
void
createTransportSectionNodes
(
TransportationObject
t
,
TreeItem
<
Renderable
>
root
)
{
if
(
t
instanceof
TopLevelTransportFeature
top
)
{
if
(!
top
.
getSections
().
isEmpty
())
{
...
...
@@ -1167,7 +1219,7 @@ public class CityDoctorController {
updateTree
(
mainWindow
.
getCityFurnitureView
().
getRoot
());
updateTree
(
mainWindow
.
getTransportationView
().
getRoot
());
updateTree
(
mainWindow
.
getWaterView
().
getRoot
());
updateTree
(
mainWindow
.
get
Other
Object
s
View
().
getRoot
());
updateTree
(
mainWindow
.
get
GenericCity
ObjectView
().
getRoot
());
updateTree
(
mainWindow
.
getTunnelView
().
getRoot
());
renderer
.
updateErrors
();
}
...
...
@@ -1280,85 +1332,105 @@ public class CityDoctorController {
}
mainWindow
.
unselectEverything
();
resetFeatureChunks
();
if
(
selectedTab
==
FeatureType
.
BUILDING
)
{
List
<
Building
>
foundBuildings
=
filterFeatures
(
searchString
,
model
.
getBuildings
());
TreeView
<
Renderable
>
buildingsView
=
mainWindow
.
getBuildingsView
();
TreeItem
<
Renderable
>
root
=
buildingsView
.
getRoot
();
root
.
getChildren
().
clear
();
buildBuildingTreeFromList
(
foundBuildings
,
root
);
updateTree
(
root
);
addMoreButtonToBuildingsIfNecessary
(
foundBuildings
,
buildingsView
,
root
,
buildingChunkNr
);
}
else
if
(
selectedTab
==
FeatureType
.
BRIDGE
){
List
<
BridgeObject
>
foundBridges
=
filterFeatures
(
searchString
,
model
.
getBridges
());
TreeView
<
Renderable
>
brigdeView
=
mainWindow
.
getBridgeView
();
TreeItem
<
Renderable
>
root
=
brigdeView
.
getRoot
();
root
.
getChildren
().
clear
();
buildBridgeTreeFromList
(
foundBridges
,
root
);
updateTree
(
root
);
addMoreButtonIfNecessary
(
foundBridges
,
brigdeView
,
root
,
bridgeChunkNr
);
}
else
if
(
selectedTab
==
FeatureType
.
TUNNEL
){
List
<
Tunnel
>
foundTunnel
=
filterFeatures
(
searchString
,
model
.
getTunnels
());
TreeView
<
Renderable
>
tunnelView
=
mainWindow
.
getTunnelView
();
TreeItem
<
Renderable
>
root
=
tunnelView
.
getRoot
();
root
.
getChildren
().
clear
();
buildTunnelTreeFromList
(
foundTunnel
,
root
);
updateTree
(
root
);
addMoreButtonIfNecessary
(
foundTunnel
,
tunnelView
,
root
,
bridgeChunkNr
);
}
else
{
TreeView
<
Renderable
>
view
;
List
<?
extends
CityObject
>
cos
;
AtomicInteger
chunkCounter
;
switch
(
selectedTab
)
{
case
VEGETATION:
view
=
mainWindow
.
getVegetationView
();
cos
=
filterFeatures
(
searchString
,
model
.
getVegetation
());
chunkCounter
=
vegetationChunkNr
;
break
;
case
BRIDGE:
view
=
mainWindow
.
getBridgeView
();
cos
=
filterFeatures
(
searchString
,
model
.
getBridges
());
chunkCounter
=
bridgeChunkNr
;
break
;
case
TRANSPORTATION:
view
=
mainWindow
.
getTransportationView
();
cos
=
filterFeatures
(
searchString
,
model
.
getTransportation
());
chunkCounter
=
transportationChunkNr
;
break
;
case
TUNNEL:
view
=
mainWindow
.
getTunnelView
();
cos
=
model
.
getTunnels
();
chunkCounter
=
tunnelChunkNr
;
break
;
case
WATER:
view
=
mainWindow
.
getWaterView
();
cos
=
filterFeatures
(
searchString
,
model
.
getWater
());
chunkCounter
=
waterChunkNr
;
break
;
case
LAND:
view
=
mainWindow
.
getTerrainView
();
cos
=
filterFeatures
(
searchString
,
model
.
getLand
());
chunkCounter
=
landChunkNr
;
break
;
case
CITY_FURNITURE:
view
=
mainWindow
.
getCityFurnitureView
();
cos
=
filterFeatures
(
searchString
,
model
.
getCityFurniture
());
chunkCounter
=
cityFurnitureChunkNr
;
break
;
case
GENERIC_CITY_OBJECT:
view
=
mainWindow
.
getOtherObjectsView
();
cos
=
filterFeatures
(
searchString
,
model
.
getGenericCityObjects
());
chunkCounter
=
otherObjectsChunkNr
;
break
;
default
:
throw
new
IllegalStateException
(
"Unknown selected feature tab"
);
}
TreeItem
<
Renderable
>
root
=
view
.
getRoot
();
root
.
getChildren
().
clear
();
buildTreeFromList
(
cos
,
root
,
chunkCounter
);
updateTree
(
root
);
addMoreButtonIfNecessary
(
cos
,
view
,
root
,
chunkCounter
);
switch
(
selectedTab
)
{
case
BUILDING
->
filterBuildingTree
(
searchString
);
case
BRIDGE
->
filterBridgeTree
(
searchString
);
case
TUNNEL
->
filterTunnelTree
(
searchString
);
case
VEGETATION
->
filterVegetationTree
(
searchString
);
case
TRANSPORTATION
->
filterTransportationTree
(
searchString
);
case
WATER
->
filterWaterTree
(
searchString
);
case
LAND
->
filterLandTree
(
searchString
);
case
CITY_FURNITURE
->
filterCityFurnitureTree
(
searchString
);
case
GENERIC_CITY_OBJECT
->
filterGenericCityObjectTree
(
searchString
);
}
}
private
void
filterBuildingTree
(
String
searchString
)
{
List
<
Building
>
foundBuildings
=
filterFeatures
(
searchString
,
model
.
getBuildings
());
TreeView
<
Renderable
>
buildingsView
=
mainWindow
.
getBuildingsView
();
TreeItem
<
Renderable
>
root
=
buildingsView
.
getRoot
();
root
.
getChildren
().
clear
();
buildBuildingTreeFromList
(
foundBuildings
,
root
);
updateTree
(
root
);
addMoreButtonToBuildingsIfNecessary
(
foundBuildings
,
buildingsView
,
root
,
buildingChunkNr
);
}
private
void
filterBridgeTree
(
String
searchString
)
{
List
<
BridgeObject
>
foundBridges
=
filterFeatures
(
searchString
,
model
.
getBridges
());
TreeView
<
Renderable
>
bridgeView
=
mainWindow
.
getBridgeView
();
TreeItem
<
Renderable
>
root
=
bridgeView
.
getRoot
();
root
.
getChildren
().
clear
();
buildBridgeTreeFromList
(
foundBridges
,
root
);
updateTree
(
root
);
addMoreButtonIfNecessary
(
foundBridges
,
bridgeView
,
root
,
bridgeChunkNr
);
}
private
void
filterTunnelTree
(
String
searchString
)
{
List
<
Tunnel
>
foundTunnel
=
filterFeatures
(
searchString
,
model
.
getTunnels
());
TreeView
<
Renderable
>
tunnelView
=
mainWindow
.
getTunnelView
();
TreeItem
<
Renderable
>
root
=
tunnelView
.
getRoot
();
root
.
getChildren
().
clear
();
buildTunnelTreeFromList
(
foundTunnel
,
root
);
updateTree
(
root
);
addMoreButtonIfNecessary
(
foundTunnel
,
tunnelView
,
root
,
tunnelChunkNr
);
}
private
void
filterVegetationTree
(
String
searchString
)
{
List
<
Vegetation
>
foundVegetation
=
filterFeatures
(
searchString
,
model
.
getVegetation
());
TreeView
<
Renderable
>
vegetationView
=
mainWindow
.
getVegetationView
();
TreeItem
<
Renderable
>
root
=
vegetationView
.
getRoot
();
root
.
getChildren
().
clear
();
buildVegetationTreeFromList
(
foundVegetation
,
root
);
updateTree
(
root
);
addMoreButtonIfNecessary
(
foundVegetation
,
vegetationView
,
root
,
vegetationChunkNr
);
}
private
void
filterTransportationTree
(
String
searchString
)
{
List
<
TransportationObject
>
foundTransportation
=
filterFeatures
(
searchString
,
model
.
getTransportation
());
TreeView
<
Renderable
>
transportationView
=
mainWindow
.
getTransportationView
();
TreeItem
<
Renderable
>
root
=
transportationView
.
getRoot
();
root
.
getChildren
().
clear
();
buildTransportationTreeFromList
(
foundTransportation
,
root
);
updateTree
(
root
);
addMoreButtonIfNecessary
(
foundTransportation
,
transportationView
,
root
,
transportationChunkNr
);
}
private
void
filterWaterTree
(
String
searchString
)
{
List
<
WaterObject
>
foundWater
=
filterFeatures
(
searchString
,
model
.
getWater
());
TreeView
<
Renderable
>
waterView
=
mainWindow
.
getWaterView
();
TreeItem
<
Renderable
>
root
=
waterView
.
getRoot
();
root
.
getChildren
().
clear
();
buildWaterTreeFromList
(
foundWater
,
root
);
addMoreButtonIfNecessary
(
foundWater
,
waterView
,
root
,
waterChunkNr
);
}
private
void
filterLandTree
(
String
searchString
)
{
List
<
CityObject
>
foundLand
=
filterFeatures
(
searchString
,
model
.
getLand
());
TreeView
<
Renderable
>
landView
=
mainWindow
.
getTerrainView
();
TreeItem
<
Renderable
>
root
=
landView
.
getRoot
();
root
.
getChildren
().
clear
();
buildLandFromList
(
foundLand
,
root
);
addMoreButtonIfNecessary
(
foundLand
,
landView
,
root
,
landChunkNr
);
}
private
void
filterCityFurnitureTree
(
String
searchString
)
{
List
<
CityFurniture
>
foundCityFurniture
=
filterFeatures
(
searchString
,
model
.
getCityFurniture
());
TreeView
<
Renderable
>
cityFurnitureView
=
mainWindow
.
getCityFurnitureView
();
TreeItem
<
Renderable
>
root
=
cityFurnitureView
.
getRoot
();
root
.
getChildren
().
clear
();
buildCityFurnitureTreeFromList
(
foundCityFurniture
,
root
);
addMoreButtonIfNecessary
(
foundCityFurniture
,
cityFurnitureView
,
root
,
cityFurnitureChunkNr
);
}
private
void
filterGenericCityObjectTree
(
String
searchString
)
{
List
<
GenericCityObject
>
foundGenericCityObject
=
filterFeatures
(
searchString
,
model
.
getGenericCityObjects
());
TreeView
<
Renderable
>
genericCityObjectView
=
mainWindow
.
getGenericCityObjectView
();
TreeItem
<
Renderable
>
root
=
genericCityObjectView
.
getRoot
();
root
.
getChildren
().
clear
();
buildGenericCityObjectTreeFromList
(
foundGenericCityObject
,
root
);
addMoreButtonIfNecessary
(
foundGenericCityObject
,
genericCityObjectView
,
root
,
genericCityObjectsChunkNr
);
}
private
<
T
extends
CityObject
>
List
<
T
>
filterFeatures
(
String
searchString
,
List
<
T
>
features
)
{
...
...
@@ -1375,72 +1447,7 @@ public class CityDoctorController {
if
(
model
==
null
)
{
return
;
}
resetFeatureChunks
();
if
(
selectedTab
==
FeatureType
.
BUILDING
)
{
// buildings are handled differently, because of surface and building
// installations
TreeItem
<
Renderable
>
root
=
mainWindow
.
getBuildingsView
().
getRoot
();
if
(
root
!=
null
)
{
root
.
getChildren
().
clear
();
buildBuildingTreeFromList
(
model
.
getBuildings
(),
root
);
updateTree
(
root
);
addMoreButtonToBuildingsIfNecessary
(
model
.
getBuildings
(),
mainWindow
.
getBuildingsView
(),
root
,
buildingChunkNr
);
}
}
else
{
TreeView
<
Renderable
>
view
;
List
<?
extends
CityObject
>
cos
;
AtomicInteger
chunkCounter
;
switch
(
selectedTab
)
{
case
VEGETATION:
view
=
mainWindow
.
getVegetationView
();
cos
=
model
.
getVegetation
();
chunkCounter
=
vegetationChunkNr
;
break
;
case
BRIDGE:
view
=
mainWindow
.
getBridgeView
();
cos
=
model
.
getBridges
();
chunkCounter
=
bridgeChunkNr
;
break
;
case
TRANSPORTATION:
view
=
mainWindow
.
getTransportationView
();
cos
=
model
.
getTransportation
();
chunkCounter
=
transportationChunkNr
;
break
;
case
TUNNEL:
view
=
mainWindow
.
getTunnelView
();
cos
=
model
.
getTunnels
();
chunkCounter
=
tunnelChunkNr
;
break
;
case
WATER:
view
=
mainWindow
.
getWaterView
();
cos
=
model
.
getWater
();
chunkCounter
=
waterChunkNr
;
break
;
case
LAND:
view
=
mainWindow
.
getTerrainView
();
cos
=
model
.
getLand
();
chunkCounter
=
landChunkNr
;
break
;
case
CITY_FURNITURE:
view
=
mainWindow
.
getCityFurnitureView
();
cos
=
model
.
getCityFurniture
();
chunkCounter
=
cityFurnitureChunkNr
;
break
;
case
GENERIC_CITY_OBJECT:
view
=
mainWindow
.
getOtherObjectsView
();
cos
=
model
.
getGenericCityObjects
();
chunkCounter
=
otherObjectsChunkNr
;
break
;
default
:
throw
new
IllegalStateException
(
"Unknown selected feature tab"
);
}
TreeItem
<
Renderable
>
root
=
view
.
getRoot
();
root
.
getChildren
().
clear
();
buildTreeFromList
(
cos
,
root
,
chunkCounter
);
updateTree
(
root
);
addMoreButtonIfNecessary
(
cos
,
view
,
root
,
chunkCounter
);
}
buildTrees
();
}
public
Series
<
String
,
Number
>
createErrorSeries
()
{
...
...
@@ -1511,12 +1518,12 @@ public class CityDoctorController {
model
.
getCityFurniture
(),
cityFurnitureChunkNr
);
}
public
void
fillTreeViewWithError
Other
Objects
()
{
public
void
fillTreeViewWithError
GenericCity
Objects
()
{
if
(
model
==
null
)
{
return
;
}
fillTreeViewWithErrorCityObjects
(
mainWindow
.
get
Other
Object
s
View
(),
model
.
getGenericCityObjects
(),
other
ObjectsChunkNr
);
fillTreeViewWithErrorCityObjects
(
mainWindow
.
get
GenericCity
ObjectView
(),
model
.
getGenericCityObjects
(),
genericCity
ObjectsChunkNr
);
}
public
void
fillTreeViewWithErrorTransportation
()
{
...
...
@@ -1601,7 +1608,7 @@ public class CityDoctorController {
break
;
case
GENERIC_CITY_OBJECT:
buildOtherCityObjects
(
model
);
updateTree
(
mainWindow
.
get
Other
Object
s
View
().
getRoot
());
updateTree
(
mainWindow
.
get
GenericCity
ObjectView
().
getRoot
());
break
;
default
:
throw
new
IllegalStateException
();
...
...
@@ -1695,7 +1702,7 @@ public class CityDoctorController {
fillTreeViewWithErrorCityFurniture
();
break
;
case
GENERIC_CITY_OBJECT:
fillTreeViewWithError
Other
Objects
();
fillTreeViewWithError
GenericCity
Objects
();
break
;
default
:
throw
new
IllegalStateException
(
"Unknown selected feature tab: "
+
mainWindow
.
getSelectedTab
());
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/MainWindow.java
View file @
d8d95d41
...
...
@@ -19,13 +19,11 @@ import javafx.application.Application;
import
javafx.application.Platform
;
import
javafx.beans.value.ChangeListener
;
import
javafx.embed.swing.SwingFXUtils
;
import
javafx.event.Event
;
import
javafx.fxml.FXML
;
import
javafx.fxml.FXMLLoader
;
import
javafx.scene.*
;
import
javafx.scene.control.*
;
import
javafx.scene.control.Alert.AlertType
;
import
javafx.scene.control.skin.VirtualFlow
;
import
javafx.scene.image.Image
;
import
javafx.scene.image.ImageView
;
import
javafx.scene.image.WritableImage
;
...
...
@@ -1026,7 +1024,7 @@ public class MainWindow extends Application {
return
attributeView
;
}
public
TreeView
<
Renderable
>
get
Other
Object
s
View
()
{
public
TreeView
<
Renderable
>
get
GenericCity
ObjectView
()
{
return
otherObjectsView
;
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment