Commit 38c8db7d authored by Riegel's avatar Riegel
Browse files

Refactor: Generalize FeatureTab-node implementation

parent ac5a3aa7
...@@ -6,7 +6,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.BoundingBox; ...@@ -6,7 +6,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.BoundingBox;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject; import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
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.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;
...@@ -45,7 +44,6 @@ import java.io.FileNotFoundException; ...@@ -45,7 +44,6 @@ 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 {
...@@ -789,46 +787,35 @@ public class MainWindow extends Application { ...@@ -789,46 +787,35 @@ public class MainWindow extends Application {
private void setupFeatureTabContextMenu(TreeView<Renderable> featureView) { private void setupFeatureTabContextMenu(TreeView<Renderable> featureView) {
ContextMenu menu = new ContextMenu(); ContextMenu menu = new ContextMenu();
MenuItem mi = new MenuItem(Localization.getText("MainWindow.export")); MenuItem exportOption = new MenuItem(Localization.getText("MainWindow.export"));
mi.setOnAction(ea -> { exportOption.setOnAction(ea -> {
Renderable render = featureView.getSelectionModel().getSelectedItem().getValue(); Renderable node = featureView.getSelectionModel().getSelectedItem().getValue();
if (render instanceof FeatureNode node) { fetchExportAction(node);
try {
controller.export(node.getFeature());
logger.info(Localization.getText("CityDoctorController.exportSuccess"));
} catch (Exception e) {
logger.error("Export failed: Unexpected error occurred");
logger.error(e);
}
} else {
logger.info(Localization.getText("MainWindow.infoTopLevelExport"));
}
}); });
menu.getItems().add(mi); menu.getItems().add(exportOption);
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"));
}
MenuItem copyToClipboardOption = new MenuItem(Localization.getText("MainWindow.copyId"));
copyToClipboardOption.setOnAction(ea -> {
Renderable node = featureView.getSelectionModel().getSelectedItem().getValue();
fetchCopyAction(node);
}); });
menu.getItems().add(clipMi); menu.getItems().add(copyToClipboardOption);
MenuItem deleteMi = new MenuItem(Localization.getText("MainWindow.delete")); MenuItem deleteOption = new MenuItem(Localization.getText("MainWindow.delete"));
deleteMi.setOnAction(ae -> controller.delete(featureView.getSelectionModel().getSelectedItem())); deleteOption.setOnAction(ae -> controller.delete(featureView.getSelectionModel().getSelectedItem()));
menu.getItems().add(deleteMi); menu.getItems().add(deleteOption);
featureView.setContextMenu(menu); featureView.setContextMenu(menu);
} }
public void fetchCopyAction(Renderable node) {
node.getClipboardAction(this);
}
public void fetchExportAction(Renderable node) {
node.getFeatureExportAction(this);
}
private void setupSelectListener(TreeView<Renderable> view) { private void setupSelectListener(TreeView<Renderable> view) {
view.getSelectionModel().selectedItemProperty().addListener((obs, oldI, newI) -> { view.getSelectionModel().selectedItemProperty().addListener((obs, oldI, newI) -> {
if (newI != null) { if (newI != null) {
......
package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.gui.Renderer;
import javafx.scene.paint.Color;
import java.util.List;
public class CityObjectGroupNode extends Renderable {
private final List<? extends CityObject> cityObjects;
private final Color renderColor;
private final String nodeText;
public CityObjectGroupNode(List<? extends CityObject> cityObjects, String nodeText, Color renderColor) {
this.cityObjects = cityObjects;
this.nodeText = nodeText;
this.renderColor = renderColor;
}
@Override
public void refreshTextColor() {
// no color changes
}
@Override
public String getText() {
return nodeText;
}
@Override
public void visit(Renderer renderer) {
renderer.renderCityObjects(cityObjects, renderColor);
}
}
...@@ -3,9 +3,13 @@ package de.hft.stuttgart.citydoctor2.gui.tree; ...@@ -3,9 +3,13 @@ package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject; import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
import de.hft.stuttgart.citydoctor2.gui.Renderer; import de.hft.stuttgart.citydoctor2.gui.Renderer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class CityObjectNode extends Renderable implements FeatureNode{ public class CityObjectNode extends Renderable implements FeatureNode{
private static final Logger logger = LogManager.getLogger(CityObjectNode.class);
private final CityObject co; private final CityObject co;
public CityObjectNode(CityObject co) { public CityObjectNode(CityObject co) {
...@@ -38,4 +42,5 @@ public class CityObjectNode extends Renderable implements FeatureNode{ ...@@ -38,4 +42,5 @@ public class CityObjectNode extends Renderable implements FeatureNode{
return co; return co;
} }
} }
package de.hft.stuttgart.citydoctor2.gui.tree; package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
import de.hft.stuttgart.citydoctor2.gui.MainWindow;
import de.hft.stuttgart.citydoctor2.gui.Renderer; import de.hft.stuttgart.citydoctor2.gui.Renderer;
import de.hft.stuttgart.citydoctor2.utils.Localization;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.input.Clipboard;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static javafx.scene.input.Clipboard.getSystemClipboard;
public abstract class Renderable { public abstract class Renderable {
private final ObjectProperty<CheckStatus> statusProperty = new SimpleObjectProperty<>(); private final ObjectProperty<CheckStatus> statusProperty = new SimpleObjectProperty<>();
private static Logger logger = LogManager.getLogger(Renderable.class);
/** /**
* @return the status * @return the status
*/ */
...@@ -31,4 +40,18 @@ public abstract class Renderable { ...@@ -31,4 +40,18 @@ public abstract class Renderable {
public abstract String getText(); public abstract String getText();
public abstract void visit(Renderer renderer); public abstract void visit(Renderer renderer);
public void getClipboardAction(MainWindow mainWindow) {
Clipboard clipboard = getSystemClipboard();
clipboard.clear();
if (logger.isInfoEnabled()) {
logger.info(Localization.getText("MainWindow.infoTopLevelCopyID"));
}
}
public void getFeatureExportAction(MainWindow mainWindow) {
if (logger.isInfoEnabled()) {
logger.info(Localization.getText("MainWindow.infoTopLevelExport"));
}
}
} }
package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.gui.MainWindow;
import de.hft.stuttgart.citydoctor2.utils.Localization;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static javafx.scene.input.Clipboard.getSystemClipboard;
public class TopLevelCityObjectNode extends CityObjectNode {
private static final Logger logger = LogManager.getLogger(TopLevelCityObjectNode.class);
public TopLevelCityObjectNode(CityObject co) {
super(co);
}
@Override
public void getClipboardAction(MainWindow mainWindow) {
Clipboard clipboard = getSystemClipboard();
ClipboardContent content = new ClipboardContent();
content.putString(this.getFeature().getGmlId().toString());
if (!clipboard.setContent(content)) {
if (logger.isWarnEnabled()) {
logger.warn(Localization.getText("MainWindow.warnCopyIdFailed"));
}
}
}
@Override
public void getFeatureExportAction(MainWindow mainWindow) {
try {
mainWindow.getController().export(this.getFeature());
if (logger.isWarnEnabled()) {
logger.info(Localization.getText("CityDoctorController.exportSuccess"));
}
} catch (Exception e) {
logger.error("Export failed: Unexpected error occurred");
logger.error(e);
}
}
}
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