Commit 89c2a845 authored by Riegel's avatar Riegel
Browse files

Expand ContextMenu functionality for FeatureTabs

parent 14f49201
Pipeline #10335 passed with stage
in 1 minute and 17 seconds
...@@ -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) {
......
...@@ -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
......
...@@ -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\u00fcfungen konnten ausgef\u00fchrt werden CityDoctorController.noDatamodel=Datenmodell ist null, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden
CityDoctorController.noSourceFile=Quelldatei ist null, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden CityDoctorController.noSourceFile=Quelldatei ist null, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden
CityDoctorController.exportSuccess=Feature export erfolgreich abgeschlossen
ExceptionDialog.stacktrace=Der Stacktrace des Fehlers war: ExceptionDialog.stacktrace=Der Stacktrace des Fehlers war:
FilterPane.buildings=Geb\u00e4ude FilterPane.buildings=Geb\u00e4ude
FilterPane.bridges=Br\u00fccken FilterPane.bridges=Br\u00fccken
...@@ -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\u00f6schen
MainWindow.infoTopLevelExport=Export ist nur f\u00fcr Featureobjekt basis m\u00f6glich!
MainWindow.infoTopLevelCopyID=GML-ID kann nur von Featureobjekt basis kopiert werden!
mainWindow.warnCopyIdFailed=Kopieren der ID fehlgeschlagen!
OpenFileDialog.select=W\u00e4hle CityGML Datei aus OpenFileDialog.select=W\u00e4hle CityGML Datei aus
MainWindow.languageChange=Um die Spracheinstellung zu \u00fcbernehmen muss CityDoctor2 neugestartet werden. MainWindow.languageChange=Um die Spracheinstellung zu \u00fcbernehmen muss CityDoctor2 neugestartet werden.
MainWindow.buildingsTab=Geb\u00e4ude MainWindow.buildingsTab=Geb\u00e4ude
......
...@@ -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);
......
...@@ -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.BuildingNode; import de.hft.stuttgart.citydoctor2.gui.tree.FeatureNode;
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());
vegetationView.setContextMenu(cMenu); setupVegetationTabContextMenu();
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) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment