diff --git a/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/AddTunnelController.java b/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/AddTunnelController.java index 189b158..88ec75c 100644 --- a/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/AddTunnelController.java +++ b/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/AddTunnelController.java @@ -14,8 +14,9 @@ public class AddTunnelController { @FXML Pane serverTunnelConfigPane; @FXML Pane httpProxyConfigPane; @FXML Pane socksProxyConfigPane; - @FXML Button addButton; + @FXML Button okButton; @FXML Button cancelButton; + @FXML Label tunnelAddEditLabel; @FXML ToggleGroup tunnelType; @FXML RadioButton clientTunnelRadioButton; @FXML RadioButton serverTunnelRadioButton; @@ -30,19 +31,55 @@ public class AddTunnelController { @FXML TextField socksPortField; @FXML TextField httpProxyPortField; + public AddTunnelController() { + super(); + } + + Runnable existingTunnelDestroyer; + void setExistingTunnelDestroyer(Runnable r) { + existingTunnelDestroyer = r; + } - private void updateAddButtonState() { + void setExistingTunnel(Tunnel t) { + switch(t.getType()) { + case "server": + serverTunnelRadioButton.fire(); + TunnelControl.ServerTunnel serverTunnel = (TunnelControl.ServerTunnel) t; + serverHostField.setText(serverTunnel.host); + serverPortField.setText(serverTunnel.port + ""); + serverKeyField.setText(serverTunnel.keyPair.toString()); + break; + case "client": + clientTunnelRadioButton.fire(); + TunnelControl.ClientTunnel clientTunnel = (TunnelControl.ClientTunnel) t; + clientDestAddrField.setText(clientTunnel.dest); + clientPortField.setText(clientTunnel.port + ""); + break; + case "socks": + socksProxyRadioButton.fire(); + TunnelControl.SocksTunnel socksTunnel = (TunnelControl.SocksTunnel) t; + socksPortField.setText(socksTunnel.port + ""); + break; + case "http": + httpProxyRadioButton.fire(); + TunnelControl.HttpClientTunnel httpClientTunnel = (TunnelControl.HttpClientTunnel) t; + socksPortField.setText(httpClientTunnel.port + ""); + break; + } + } + + private void updateOkButtonState() { if(tunnelType.getSelectedToggle().equals(clientTunnelRadioButton)) { - addButton.setDisable(Stream.of(clientDestAddrField, clientPortField).anyMatch(f->f.getText().isBlank())); + okButton.setDisable(Stream.of(clientDestAddrField, clientPortField).anyMatch(f->f.getText().isBlank())); } else if(tunnelType.getSelectedToggle().equals(serverTunnelRadioButton)) { - addButton.setDisable(Stream.of(serverHostField, serverPortField, serverKeyField, serverAddrField).anyMatch(f->f.getText().isBlank())); + okButton.setDisable(Stream.of(serverHostField, serverPortField, serverKeyField, serverAddrField).anyMatch(f->f.getText().isBlank())); } else if(tunnelType.getSelectedToggle().equals(socksProxyRadioButton)) { - addButton.setDisable(Stream.of(socksPortField).anyMatch(f->f.getText().isBlank())); + okButton.setDisable(Stream.of(socksPortField).anyMatch(f->f.getText().isBlank())); } else if(tunnelType.getSelectedToggle().equals(httpProxyRadioButton)) { - addButton.setDisable(Stream.of(httpProxyPortField).anyMatch(f->f.getText().isBlank())); + okButton.setDisable(Stream.of(httpProxyPortField).anyMatch(f->f.getText().isBlank())); } } @@ -53,8 +90,9 @@ public class AddTunnelController { socksProxyConfigPane.setVisible(false); httpProxyConfigPane.setVisible(false); - addButton.setOnAction(ev->{ + okButton.setOnAction(ev->{ try { + if(existingTunnelDestroyer!=null) existingTunnelDestroyer.run(); var controller = Gui.instance.getController(); var tunnelControl = controller.getRouterWrapper().getTunnelControl(); var tunnelList = tunnelControl.getTunnelList(); @@ -80,10 +118,9 @@ public class AddTunnelController { TextField[] allTextFields = new TextField[] {clientDestAddrField, clientPortField, serverHostField, serverPortField, serverKeyField, serverAddrField, socksPortField, httpProxyPortField}; for(TextField f : allTextFields) { - f.textProperty().addListener((observable, oldValue, newValue) -> updateAddButtonState()); + f.textProperty().addListener((observable, oldValue, newValue) -> updateOkButtonState()); } - cancelButton.setOnAction(e->{ clientTunnelConfigPane.getScene().getWindow().hide(); }); @@ -103,7 +140,7 @@ public class AddTunnelController { } if (newToggle.equals(httpProxyRadioButton)) httpProxyConfigPane.setVisible(true); if (newToggle.equals(socksProxyRadioButton)) socksProxyConfigPane.setVisible(true); - updateAddButtonState(); + updateOkButtonState(); } catch (Exception e) { throw new RuntimeException(e); diff --git a/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/Controller.java b/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/Controller.java index f1bd718..9722060 100644 --- a/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/Controller.java +++ b/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/Controller.java @@ -39,6 +39,7 @@ import java.net.URI; import java.text.DecimalFormat; import java.util.Optional; import java.util.Properties; +import java.util.function.Supplier; import java.util.stream.Stream; public class Controller { @@ -50,6 +51,7 @@ public class Controller { @FXML private Label maxBandwidthLabel; @FXML private ImageView masterToggle; @FXML private AnchorPane bandwidthDisabledOverlay; + @FXML private TabPane tabPane; @FXML private Tab bandwidthTab; @FXML private Tab tunnelsTab; @FXML private Tab eepSiteTab; @@ -57,6 +59,7 @@ public class Controller { @FXML private Label statusLabel; @FXML private Button tunnelAddButton; @FXML private Button tunnelRemoveButton; + @FXML private Button tunnelEditButton; @FXML private TableView tunnelsTableView; @FXML private TableColumn typeCol; @FXML private TableColumn stateCol; @@ -115,10 +118,12 @@ public class Controller { tunnelsTableView.getSelectionModel().selectedItemProperty().addListener((observableValue, oldSelection, newSelection) -> { if (newSelection == null) { - tunnelRemoveButton.setDisable(true); + tunnelRemoveButton.setVisible(false); + tunnelEditButton.setVisible(false); } else { - tunnelRemoveButton.setDisable(false); + tunnelRemoveButton.setVisible(true); + tunnelEditButton.setVisible(true); } }); @@ -129,20 +134,43 @@ public class Controller { tunnelRemoveButton.setDisable(true); }); - tunnelAddButton.setOnAction(event->{ + record DialogRefs(Scene scene, Stage stage, AddTunnelController controller){}; + Supplier showAddTunnelDialog = ()->{ try { Stage dialogStage = new Stage(); dialogStage.initModality(Modality.WINDOW_MODAL); dialogStage.initOwner(getStage()); dialogStage.setResizable(false); dialogStage.setTitle("New tunnel"); - Scene dialogScene = new Scene(FXMLLoader.load(getClass().getResource("addTunnel.fxml"))); + FXMLLoader loader = new FXMLLoader(getClass().getResource("addTunnel.fxml")); + Scene dialogScene = new Scene(loader.load()); dialogScene.getStylesheets().add("org/getmonero/i2p/zero/gui/gui.css"); dialogStage.setScene(dialogScene); - dialogStage.show(); + return new DialogRefs(dialogScene, dialogStage, loader.getController()); } catch (Exception e) { throw new RuntimeException(e); } + }; + + tunnelAddButton.setOnAction(event->{ + DialogRefs dialogRefs = showAddTunnelDialog.get(); + dialogRefs.stage.show(); + }); + tunnelEditButton.setOnAction(event->{ + Tunnel existingTunnel = tunnelsTableView.getSelectionModel().getSelectedItem(); + if(existingTunnel.getType().equals("eepsite")) { + tabPane.getSelectionModel().select(eepSiteTab); + } + else { + DialogRefs dialogRefs = showAddTunnelDialog.get(); + dialogRefs.stage.setTitle("Edit tunnel"); + dialogRefs.controller.setExistingTunnel(existingTunnel); + dialogRefs.controller.setExistingTunnelDestroyer(()->{ + getRouterWrapper().getTunnelControl().getTunnelList().removeTunnel(existingTunnel); + existingTunnel.destroy(false); + }); + dialogRefs.stage.show(); + } }); EventHandler tabSelectionEventHandler = e->{ diff --git a/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/addTunnel.fxml b/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/addTunnel.fxml index cd1f017..df1a4c1 100644 --- a/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/addTunnel.fxml +++ b/org.getmonero.i2p.zero.gui/src/org/getmonero/i2p/zero/gui/addTunnel.fxml @@ -10,7 +10,7 @@ -