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
89c2a845
Commit
89c2a845
authored
Nov 13, 2024
by
Riegel
Browse files
Expand ContextMenu functionality for FeatureTabs
parent
14f49201
Pipeline
#10335
passed with stage
in 1 minute and 17 seconds
Changes
5
Pipelines
1
Show whitespace changes
Inline
Side-by-side
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositeCollection.java
View file @
89c2a845
...
@@ -32,6 +32,7 @@ public final class CompositeCollection implements Serializable {
...
@@ -32,6 +32,7 @@ public final class CompositeCollection implements Serializable {
return
childComposites
;
return
childComposites
;
}
}
//TODO stream
public
List
<
ConcretePolygon
>
getCompositeMembers
()
{
public
List
<
ConcretePolygon
>
getCompositeMembers
()
{
List
<
ConcretePolygon
>
copy
=
new
ArrayList
<>(
compositeMembers
);
List
<
ConcretePolygon
>
copy
=
new
ArrayList
<>(
compositeMembers
);
for
(
CompositeCollection
c
:
childComposites
)
{
for
(
CompositeCollection
c
:
childComposites
)
{
...
...
CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties
View file @
89c2a845
...
@@ -18,6 +18,7 @@ CheckDialog.parameterValue=Value
...
@@ -18,6 +18,7 @@ CheckDialog.parameterValue=Value
CheckDialog.parameterUnit
=
Unit
CheckDialog.parameterUnit
=
Unit
CityDoctorController.noDatamodel
=
Datamodel is null, no checks could be done
CityDoctorController.noDatamodel
=
Datamodel is null, no checks could be done
CityDoctorController.noSourceFile
=
Source file is null, no checks could be done
CityDoctorController.noSourceFile
=
Source file is null, no checks could be done
CityDoctorController.exportSuccess
=
Successfully exported feature
ExceptionDialog.stacktrace
=
The exception stacktrace was:
ExceptionDialog.stacktrace
=
The exception stacktrace was:
FilterPane.buildings
=
Buildings
FilterPane.buildings
=
Buildings
FilterPane.bridges
=
Bridges
FilterPane.bridges
=
Bridges
...
@@ -43,7 +44,12 @@ MainWindow.finishedPdf=Finished pdf report
...
@@ -43,7 +44,12 @@ MainWindow.finishedPdf=Finished pdf report
MainWindow.loadFailed
=
Failed to load given gml file: {}
MainWindow.loadFailed
=
Failed to load given gml file: {}
MainWindow.all
=
All
MainWindow.all
=
All
MainWindow.withErrors
=
With errors
MainWindow.withErrors
=
With errors
MainWindow.export
=
Export
MainWindow.export
=
Export feature
MainWindow.copyId
=
Copy GML-ID
MainWindow.delete
=
Delete feature
MainWindow.infoTopLevelExport
=
Only top-level object can be exported!
MainWindow.infoTopLevelCopyID
=
GML-ID can only be copied from top-level object!
mainWindow.warnCopyIdFailed
=
Could not copy GML-ID!
OpenFileDialog.select
=
Select CityGML file
OpenFileDialog.select
=
Select CityGML file
MainWindow.languageChange
=
For the change in language to apply, restart CityDoctor2.
MainWindow.languageChange
=
For the change in language to apply, restart CityDoctor2.
MainWindow.buildingsTab
=
Buildings
MainWindow.buildingsTab
=
Buildings
...
...
CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties
View file @
89c2a845
...
@@ -16,6 +16,7 @@ CheckDialog.parameterValue=Wert
...
@@ -16,6 +16,7 @@ CheckDialog.parameterValue=Wert
CheckDialog.parameterUnit
=
Einheit
CheckDialog.parameterUnit
=
Einheit
CityDoctorController.noDatamodel
=
Datenmodell ist null, keine Pr
\u
00fcfungen konnten ausgef
\u
00fchrt werden
CityDoctorController.noDatamodel
=
Datenmodell ist null, keine Pr
\u
00fcfungen konnten ausgef
\u
00fchrt werden
CityDoctorController.noSourceFile
=
Quelldatei ist null, keine Pr
\u
00fcfungen konnten ausgef
\u
00fchrt werden
CityDoctorController.noSourceFile
=
Quelldatei ist null, keine Pr
\u
00fcfungen konnten ausgef
\u
00fchrt werden
CityDoctorController.exportSuccess
=
Feature export erfolgreich abgeschlossen
ExceptionDialog.stacktrace
=
Der Stacktrace des Fehlers war:
ExceptionDialog.stacktrace
=
Der Stacktrace des Fehlers war:
FilterPane.buildings
=
Geb
\u
00e4ude
FilterPane.buildings
=
Geb
\u
00e4ude
FilterPane.bridges
=
Br
\u
00fccken
FilterPane.bridges
=
Br
\u
00fccken
...
@@ -41,7 +42,12 @@ MainWindow.finishedPdf=Pdf Report abgeschlossen
...
@@ -41,7 +42,12 @@ MainWindow.finishedPdf=Pdf Report abgeschlossen
MainWindow.loadFailed
=
Konnte GML-Datei nicht laden: {}
MainWindow.loadFailed
=
Konnte GML-Datei nicht laden: {}
MainWindow.all
=
Alle
MainWindow.all
=
Alle
MainWindow.withErrors
=
Mit Fehlern
MainWindow.withErrors
=
Mit Fehlern
MainWindow.export
=
Exportieren
MainWindow.export
=
Feature Exportieren
MainWindow.copyId
=
GML-ID kopieren
MainWindow.delete
=
Feature L
\u
00f6schen
MainWindow.infoTopLevelExport
=
Export ist nur f
\u
00fcr Featureobjekt basis m
\u
00f6glich!
MainWindow.infoTopLevelCopyID
=
GML-ID kann nur von Featureobjekt basis kopiert werden!
mainWindow.warnCopyIdFailed
=
Kopieren der ID fehlgeschlagen!
OpenFileDialog.select
=
W
\u
00e4hle CityGML Datei aus
OpenFileDialog.select
=
W
\u
00e4hle CityGML Datei aus
MainWindow.languageChange
=
Um die Spracheinstellung zu
\u
00fcbernehmen muss CityDoctor2 neugestartet werden.
MainWindow.languageChange
=
Um die Spracheinstellung zu
\u
00fcbernehmen muss CityDoctor2 neugestartet werden.
MainWindow.buildingsTab
=
Geb
\u
00e4ude
MainWindow.buildingsTab
=
Geb
\u
00e4ude
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java
View file @
89c2a845
...
@@ -798,13 +798,14 @@ public class CityDoctorController {
...
@@ -798,13 +798,14 @@ public class CityDoctorController {
}
}
}
}
public
void
export
(
Building
b
)
{
public
void
export
(
CityObject
co
)
{
if
(
model
==
null
)
{
if
(
model
==
null
)
{
return
;
return
;
}
}
CityDoctorModel
newModel
=
new
CityDoctorModel
(
model
.
getParserConfig
(),
model
.
getFile
());
CityDoctorModel
newModel
=
new
CityDoctorModel
(
model
.
getParserConfig
(),
model
.
getFile
());
newModel
.
setCityModel
(
new
CityModel
());
newModel
.
setCityModel
(
new
CityModel
());
newModel
.
addBuilding
(
b
);
newModel
.
addCityObject
(
co
);
newModel
.
setParsedCityGMLVersion
(
model
.
getCityGMLVersion
());
FileChooser
fc
=
new
FileChooser
();
FileChooser
fc
=
new
FileChooser
();
fc
.
getExtensionFilters
().
add
(
new
ExtensionFilter
(
"CityGML"
,
"*.gml"
));
fc
.
getExtensionFilters
().
add
(
new
ExtensionFilter
(
"CityGML"
,
"*.gml"
));
...
@@ -819,7 +820,6 @@ public class CityDoctorController {
...
@@ -819,7 +820,6 @@ public class CityDoctorController {
if
(
f
!=
null
)
{
if
(
f
!=
null
)
{
Settings
.
set
(
Settings
.
LAST_OPEN_FOLDER
,
f
.
getParent
());
Settings
.
set
(
Settings
.
LAST_OPEN_FOLDER
,
f
.
getParent
());
try
{
try
{
newModel
.
saveAs
(
f
.
getAbsolutePath
(),
true
);
newModel
.
saveAs
(
f
.
getAbsolutePath
(),
true
);
}
catch
(
CityDoctorWriteException
e
)
{
}
catch
(
CityDoctorWriteException
e
)
{
logger
.
error
(
e
);
logger
.
error
(
e
);
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/MainWindow.java
View file @
89c2a845
...
@@ -5,7 +5,7 @@ import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
...
@@ -5,7 +5,7 @@ import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
import
de.hft.stuttgart.citydoctor2.datastructure.BoundingBox
;
import
de.hft.stuttgart.citydoctor2.datastructure.BoundingBox
;
import
de.hft.stuttgart.citydoctor2.datastructure.FeatureType
;
import
de.hft.stuttgart.citydoctor2.datastructure.FeatureType
;
import
de.hft.stuttgart.citydoctor2.gui.logger.GuiLogger
;
import
de.hft.stuttgart.citydoctor2.gui.logger.GuiLogger
;
import
de.hft.stuttgart.citydoctor2.gui.tree.
Building
Node
;
import
de.hft.stuttgart.citydoctor2.gui.tree.
Feature
Node
;
import
de.hft.stuttgart.citydoctor2.gui.tree.Renderable
;
import
de.hft.stuttgart.citydoctor2.gui.tree.Renderable
;
import
de.hft.stuttgart.citydoctor2.gui.tree.RenderableTreeCell
;
import
de.hft.stuttgart.citydoctor2.gui.tree.RenderableTreeCell
;
import
de.hft.stuttgart.citydoctor2.parameter.ArgumentParser
;
import
de.hft.stuttgart.citydoctor2.parameter.ArgumentParser
;
...
@@ -25,10 +25,7 @@ import javafx.scene.control.Alert.AlertType;
...
@@ -25,10 +25,7 @@ import javafx.scene.control.Alert.AlertType;
import
javafx.scene.image.Image
;
import
javafx.scene.image.Image
;
import
javafx.scene.image.ImageView
;
import
javafx.scene.image.ImageView
;
import
javafx.scene.image.WritableImage
;
import
javafx.scene.image.WritableImage
;
import
javafx.scene.input.Dragboard
;
import
javafx.scene.input.*
;
import
javafx.scene.input.MouseButton
;
import
javafx.scene.input.MouseEvent
;
import
javafx.scene.input.TransferMode
;
import
javafx.scene.layout.BorderPane
;
import
javafx.scene.layout.BorderPane
;
import
javafx.scene.layout.HBox
;
import
javafx.scene.layout.HBox
;
import
javafx.scene.layout.Pane
;
import
javafx.scene.layout.Pane
;
...
@@ -46,6 +43,8 @@ import java.io.FileNotFoundException;
...
@@ -46,6 +43,8 @@ import java.io.FileNotFoundException;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.util.*
;
import
java.util.*
;
import
static
javafx
.
scene
.
input
.
Clipboard
.
getSystemClipboard
;
public
class
MainWindow
extends
Application
{
public
class
MainWindow
extends
Application
{
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
MainWindow
.
class
);
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
MainWindow
.
class
);
...
@@ -734,6 +733,8 @@ public class MainWindow extends Application {
...
@@ -734,6 +733,8 @@ public class MainWindow extends Application {
buildingsView
.
setShowRoot
(
true
);
buildingsView
.
setShowRoot
(
true
);
setupSelectListener
(
buildingsView
);
setupSelectListener
(
buildingsView
);
buildingsView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
buildingsView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
setupBuildingTabContextMenu
();
/*
ContextMenu cMenu = new ContextMenu();
ContextMenu cMenu = new ContextMenu();
MenuItem mi = new MenuItem(Localization.getText("MainWindow.export"));
MenuItem mi = new MenuItem(Localization.getText("MainWindow.export"));
mi.setOnAction(ea -> {
mi.setOnAction(ea -> {
...
@@ -743,29 +744,44 @@ public class MainWindow extends Application {
...
@@ -743,29 +744,44 @@ public class MainWindow extends Application {
}
}
});
});
cMenu.getItems().add(mi);
cMenu.getItems().add(mi);
MenuItem clipMi = new MenuItem(Localization.getText("MainWindow.copyId"));
clipMi.setOnAction(ea -> {
Renderable render = buildingsView.getSelectionModel().getSelectedItem().getValue();
if (render instanceof BuildingNode node) {
Clipboard clipboard = getSystemClipboard();
ClipboardContent content = new ClipboardContent();
content.putString(node.getBuilding().getGmlId().toString());
clipboard.setContent(content);
}
});
cMenu.getItems().add(clipMi);
MenuItem deleteMi = new MenuItem("Delete");
MenuItem deleteMi = new MenuItem("Delete");
deleteMi.setOnAction(ae -> controller.delete(buildingsView.getSelectionModel().getSelectedItem()));
deleteMi.setOnAction(ae -> controller.delete(buildingsView.getSelectionModel().getSelectedItem()));
cMenu.getItems().add(deleteMi);
cMenu.getItems().add(deleteMi);
buildingsView.setContextMenu(cMenu);
buildingsView.setContextMenu(cMenu);
*/
vegetationView
.
setShowRoot
(
true
);
vegetationView
.
setShowRoot
(
true
);
setupSelectListener
(
vegetationView
);
setupSelectListener
(
vegetationView
);
vegetationView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
vegetationView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
v
egetation
View
.
set
ContextMenu
(
cMenu
);
setupV
egetation
Tab
ContextMenu
();
transView
.
setShowRoot
(
true
);
transView
.
setShowRoot
(
true
);
setupSelectListener
(
transView
);
setupSelectListener
(
transView
);
transView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
transView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
tunnelView
.
setShowRoot
(
true
);
tunnelView
.
setShowRoot
(
true
);
setupSelectListener
(
tunnelView
);
setupSelectListener
(
tunnelView
);
tunnelView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
tunnelView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
setupFeatureTabContextMenu
(
tunnelView
);
bridgeView
.
setShowRoot
(
true
);
bridgeView
.
setShowRoot
(
true
);
setupSelectListener
(
bridgeView
);
setupSelectListener
(
bridgeView
);
bridgeView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
bridgeView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
setupFeatureTabContextMenu
(
bridgeView
);
waterView
.
setShowRoot
(
true
);
waterView
.
setShowRoot
(
true
);
setupSelectListener
(
waterView
);
setupSelectListener
(
waterView
);
...
@@ -778,10 +794,12 @@ public class MainWindow extends Application {
...
@@ -778,10 +794,12 @@ public class MainWindow extends Application {
cityFurnitureView
.
setShowRoot
(
true
);
cityFurnitureView
.
setShowRoot
(
true
);
setupSelectListener
(
cityFurnitureView
);
setupSelectListener
(
cityFurnitureView
);
cityFurnitureView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
cityFurnitureView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
setupFeatureTabContextMenu
(
cityFurnitureView
);
otherObjectsView
.
setShowRoot
(
true
);
otherObjectsView
.
setShowRoot
(
true
);
setupSelectListener
(
otherObjectsView
);
setupSelectListener
(
otherObjectsView
);
otherObjectsView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
otherObjectsView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
setupFeatureTabContextMenu
(
otherObjectsView
);
setupSelectListener
(
vertexView
);
setupSelectListener
(
vertexView
);
vertexView
.
setRoot
(
new
TreeItem
<>());
vertexView
.
setRoot
(
new
TreeItem
<>());
...
@@ -798,6 +816,133 @@ public class MainWindow extends Application {
...
@@ -798,6 +816,133 @@ public class MainWindow extends Application {
setupSelectListener
(
attributeView
);
setupSelectListener
(
attributeView
);
attributeView
.
setRoot
(
new
TreeItem
<>());
attributeView
.
setRoot
(
new
TreeItem
<>());
attributeView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
attributeView
.
setCellFactory
(
param
->
new
RenderableTreeCell
());
}
private
void
setupBuildingTabContextMenu
()
{
ContextMenu
menu
=
new
ContextMenu
();
MenuItem
mi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.export"
));
mi
.
setOnAction
(
ea
->
{
Renderable
render
=
buildingsView
.
getSelectionModel
().
getSelectedItem
().
getValue
();
if
(
render
instanceof
FeatureNode
node
)
{
try
{
controller
.
export
(
node
.
getFeature
());
logger
.
info
(
Localization
.
getText
(
"CityDoctorController.export"
));
}
catch
(
Exception
e
)
{
logger
.
error
(
"Export failed: Unexpected error occurred"
);
logger
.
error
(
e
);
}
}
else
{
logger
.
info
(
Localization
.
getText
(
"MainWindow.infoTopLevelExport"
));
}
});
menu
.
getItems
().
add
(
mi
);
MenuItem
clipMi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.copyId"
));
clipMi
.
setOnAction
(
ea
->
{
Renderable
render
=
buildingsView
.
getSelectionModel
().
getSelectedItem
().
getValue
();
if
(
render
instanceof
FeatureNode
node
)
{
Clipboard
clipboard
=
getSystemClipboard
();
ClipboardContent
content
=
new
ClipboardContent
();
content
.
putString
(
node
.
getFeature
().
getGmlId
().
toString
());
if
(!
clipboard
.
setContent
(
content
))
{
logger
.
warn
(
Localization
.
getText
(
"MainWindow.warnCopyIdFailed"
));
}
}
else
{
logger
.
info
(
Localization
.
getText
(
"MainWindow.infoTopLevelCopyID"
));
}
});
menu
.
getItems
().
add
(
clipMi
);
MenuItem
deleteMi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.delete"
));
deleteMi
.
setOnAction
(
ae
->
controller
.
delete
(
buildingsView
.
getSelectionModel
().
getSelectedItem
()));
menu
.
getItems
().
add
(
deleteMi
);
buildingsView
.
setContextMenu
(
menu
);
}
private
void
setupVegetationTabContextMenu
()
{
ContextMenu
menu
=
new
ContextMenu
();
MenuItem
mi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.export"
));
mi
.
setOnAction
(
ea
->
{
Renderable
render
=
vegetationView
.
getSelectionModel
().
getSelectedItem
().
getValue
();
if
(
render
instanceof
FeatureNode
node
)
{
try
{
controller
.
export
(
node
.
getFeature
());
logger
.
info
(
Localization
.
getText
(
"CityDoctorController.export"
));
}
catch
(
Exception
e
)
{
logger
.
error
(
"Export failed: Unexpected error occurred"
);
logger
.
error
(
e
);
}
}
else
{
logger
.
info
(
Localization
.
getText
(
"MainWindow.infoTopLevelExport"
));
}
});
menu
.
getItems
().
add
(
mi
);
MenuItem
clipMi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.copyId"
));
clipMi
.
setOnAction
(
ea
->
{
Renderable
render
=
vegetationView
.
getSelectionModel
().
getSelectedItem
().
getValue
();
if
(
render
instanceof
FeatureNode
node
)
{
Clipboard
clipboard
=
getSystemClipboard
();
ClipboardContent
content
=
new
ClipboardContent
();
content
.
putString
(
node
.
getFeature
().
getGmlId
().
toString
());
if
(!
clipboard
.
setContent
(
content
))
{
logger
.
warn
(
Localization
.
getText
(
"MainWindow.warnCopyIdFailed"
));
}
}
else
{
logger
.
info
(
Localization
.
getText
(
"MainWindow.infoTopLevelCopyID"
));
}
});
menu
.
getItems
().
add
(
clipMi
);
MenuItem
deleteMi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.delete"
));
deleteMi
.
setOnAction
(
ae
->
controller
.
delete
(
vegetationView
.
getSelectionModel
().
getSelectedItem
()));
menu
.
getItems
().
add
(
deleteMi
);
vegetationView
.
setContextMenu
(
menu
);
}
private
void
setupFeatureTabContextMenu
(
TreeView
<
Renderable
>
featureView
)
{
ContextMenu
menu
=
new
ContextMenu
();
MenuItem
mi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.export"
));
mi
.
setOnAction
(
ea
->
{
Renderable
render
=
featureView
.
getSelectionModel
().
getSelectedItem
().
getValue
();
if
(
render
instanceof
FeatureNode
node
)
{
try
{
controller
.
export
(
node
.
getFeature
());
logger
.
info
(
Localization
.
getText
(
"CityDoctorController.export"
));
}
catch
(
Exception
e
)
{
logger
.
error
(
"Export failed: Unexpected error occurred"
);
logger
.
error
(
e
);
}
}
else
{
logger
.
info
(
Localization
.
getText
(
"MainWindow.infoTopLevelExport"
));
}
});
menu
.
getItems
().
add
(
mi
);
MenuItem
clipMi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.copyId"
));
clipMi
.
setOnAction
(
ea
->
{
Renderable
render
=
featureView
.
getSelectionModel
().
getSelectedItem
().
getValue
();
if
(
render
instanceof
FeatureNode
node
)
{
Clipboard
clipboard
=
getSystemClipboard
();
ClipboardContent
content
=
new
ClipboardContent
();
content
.
putString
(
node
.
getFeature
().
getGmlId
().
toString
());
if
(!
clipboard
.
setContent
(
content
))
{
logger
.
warn
(
Localization
.
getText
(
"MainWindow.warnCopyIdFailed"
));
}
}
else
{
logger
.
info
(
Localization
.
getText
(
"MainWindow.infoTopLevelCopyID"
));
}
});
menu
.
getItems
().
add
(
clipMi
);
MenuItem
deleteMi
=
new
MenuItem
(
Localization
.
getText
(
"MainWindow.delete"
));
deleteMi
.
setOnAction
(
ae
->
controller
.
delete
(
featureView
.
getSelectionModel
().
getSelectedItem
()));
menu
.
getItems
().
add
(
deleteMi
);
featureView
.
setContextMenu
(
menu
);
}
}
private
void
setupSelectListener
(
TreeView
<
Renderable
>
view
)
{
private
void
setupSelectListener
(
TreeView
<
Renderable
>
view
)
{
...
...
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