diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF
deleted file mode 100644
index 091c70a..0000000
--- a/src/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: ovh.alexisdelhaie.endpoint.Main
-
diff --git a/src/ovh/alexisdelhaie/endpoint/Application.java b/src/ovh/alexisdelhaie/endpoint/Application.java
new file mode 100644
index 0000000..07adf0a
--- /dev/null
+++ b/src/ovh/alexisdelhaie/endpoint/Application.java
@@ -0,0 +1,18 @@
+package ovh.alexisdelhaie.endpoint;
+
+import com.formdev.flatlaf.FlatIntelliJLaf;
+
+import javax.swing.*;
+
+public class Application {
+
+ public static void main(String[] args) throws UnsupportedLookAndFeelException {
+ UIManager.setLookAndFeel(new FlatIntelliJLaf());
+ MainWindow dialog = new MainWindow();
+ dialog.pack();
+ dialog.setTitle("EndPoint");
+ dialog.setVisible(true);
+ dialog.centerFrame();
+ }
+
+}
diff --git a/src/ovh/alexisdelhaie/endpoint/Main.java b/src/ovh/alexisdelhaie/endpoint/Main.java
deleted file mode 100644
index 00cd5e6..0000000
--- a/src/ovh/alexisdelhaie/endpoint/Main.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package ovh.alexisdelhaie.endpoint;
-
-import javafx.application.Application;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.scene.image.Image;
-import javafx.stage.Stage;
-import ovh.alexisdelhaie.endpoint.controllers.Controller;
-
-public class Main extends Application {
-
- @Override
- public void start(Stage primaryStage) throws Exception{
- FXMLLoader loader = new FXMLLoader(getClass().getResource("mainwindow.fxml"));
- Parent root = loader.load();
- Controller controller = loader.getController();
- controller.setStageAndSetupListeners(primaryStage);
- primaryStage.setTitle("EndPoint");
- primaryStage.setScene(new Scene(root, 1067, 644));
- primaryStage.setMinWidth(1067);
- primaryStage.setMinHeight(644);
- primaryStage.setMaximized(true);
- primaryStage.getIcons().add( new Image(
- Main.class.getResourceAsStream( "icon.png" )));
- primaryStage.show();
- }
-
-
- public static void main(String[] args) {
- launch(args);
- }
-}
diff --git a/src/ovh/alexisdelhaie/endpoint/MainWindow.form b/src/ovh/alexisdelhaie/endpoint/MainWindow.form
new file mode 100644
index 0000000..6953221
--- /dev/null
+++ b/src/ovh/alexisdelhaie/endpoint/MainWindow.form
@@ -0,0 +1,61 @@
+
+
diff --git a/src/ovh/alexisdelhaie/endpoint/MainWindow.java b/src/ovh/alexisdelhaie/endpoint/MainWindow.java
new file mode 100644
index 0000000..9ce2885
--- /dev/null
+++ b/src/ovh/alexisdelhaie/endpoint/MainWindow.java
@@ -0,0 +1,95 @@
+package ovh.alexisdelhaie.endpoint;
+
+import ovh.alexisdelhaie.endpoint.builder.TabBuilder;
+import ovh.alexisdelhaie.endpoint.configuration.ConfigurationProperties;
+import ovh.alexisdelhaie.endpoint.http.HttpClient;
+import ovh.alexisdelhaie.endpoint.http.Request;
+import ovh.alexisdelhaie.endpoint.http.RequestBuilder;
+import ovh.alexisdelhaie.endpoint.http.Response;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Optional;
+
+public class MainWindow extends JFrame {
+
+ // Constants
+ public final static int WIDTH = 1280;
+ public final static int HEIGHT = 720;
+
+ private JPanel contentPane;
+ private JComboBox comboBox1;
+ private JTextField textField1;
+ private JButton sendButton;
+ private JTabbedPane tabbedPane1;
+ private JButton newTabButton;
+
+ private ConfigurationProperties props;
+
+ public MainWindow() {
+ props = new ConfigurationProperties();
+ setContentPane(contentPane);
+ setMinimumSize(new Dimension(WIDTH, HEIGHT));
+ setSize(WIDTH, HEIGHT);
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ TabBuilder.create(tabbedPane1, "New request");
+ newTabButton.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ super.mouseClicked(e);
+ TabBuilder.create(tabbedPane1, "New request");
+ }
+ });
+ sendButton.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ super.mouseClicked(e);
+ try {
+ sendRequest();
+ } catch (IOException | NoSuchAlgorithmException | KeyManagementException ioException) {
+ ioException.printStackTrace();
+ }
+ }
+ });
+ }
+
+ public void centerFrame() {
+ Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
+ int y = (int)( screen.getHeight() / 2 ) - this.getHeight() / 2;
+ int x = (int)( screen.getWidth() / 2 ) - this.getWidth() / 2;
+ this.setLocation(x, y);
+ }
+
+ private void sendRequest() throws IOException, NoSuchAlgorithmException, KeyManagementException {
+ Optional possibleTab = getSelectedTab();
+ if (possibleTab.isPresent()) {
+ JSplitPane tab = possibleTab.get();
+ String url = textField1.getText();
+ HttpClient h = new HttpClient(props);
+ Request r = new RequestBuilder(url)
+ .build();
+ Optional possibleRes = h.get(r);
+ if (possibleRes.isPresent()) {
+ Response res = possibleRes.get();
+ int i = tabbedPane1.indexOfComponent(tab);
+ JTextArea t = TabBuilder.getResponseArea(i);
+ t.setText(res.getBody());
+ }
+ }
+
+ }
+
+ private Optional getSelectedTab() {
+ Component c = tabbedPane1.getSelectedComponent();
+ if (c instanceof JSplitPane) {
+ return Optional.of((JSplitPane) c);
+ }
+ return Optional.empty();
+ }
+
+}
diff --git a/src/ovh/alexisdelhaie/endpoint/builder/TabBuilder.java b/src/ovh/alexisdelhaie/endpoint/builder/TabBuilder.java
new file mode 100644
index 0000000..bde3569
--- /dev/null
+++ b/src/ovh/alexisdelhaie/endpoint/builder/TabBuilder.java
@@ -0,0 +1,95 @@
+package ovh.alexisdelhaie.endpoint.builder;
+
+import javax.swing.*;
+import javax.swing.table.TableColumn;
+import java.awt.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.HashMap;
+
+public class TabBuilder {
+
+ private static HashMap indexes = new HashMap<>();
+
+ public static void create(JTabbedPane tab, String label) {
+ Component c = tab.add("", buildMainPanel());
+ int index = tab.indexOfComponent(c);
+ updateIndexes(index);
+ tab.setTabComponentAt(index, buildTabPanel(tab, c, label));
+ tab.setSelectedComponent(c);
+ }
+
+ private static void updateIndexes(int index) {
+ indexes.put("main[" + index + "].responseTextArea", indexes.get("main[waiting].responseTextArea"));
+ indexes.remove("main[waiting].responseTextArea");
+ }
+
+ private static JPanel buildTabPanel(JTabbedPane tab, Component c, String label) {
+ JPanel p = new JPanel(new GridBagLayout());
+ p.setOpaque(false);
+ JLabel l = new JLabel(label);
+ GridBagConstraints g = new GridBagConstraints();
+ g.gridx = 0;
+ g.gridy = 0;
+ g.weightx = 1;
+ p.add(l, g);
+ g.gridx++;
+ g.weightx = 0;
+ p.add(buildCloseButton(tab, c), g);
+ return p;
+ }
+
+ private static JButton buildCloseButton(JTabbedPane tab, Component c) {
+ JButton b = new JButton("×");
+ b.setBorderPainted(false);
+ b.setFocusPainted(false);
+ b.setOpaque(false);
+ b.setContentAreaFilled(false);
+ b.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ super.mouseClicked(e);
+ tab.remove(c);
+ }
+ });
+ return b;
+ }
+
+ private static JSplitPane buildMainPanel() {
+ JTextArea t = new JTextArea();
+ t.setBackground(Color.WHITE);
+ t.setEditable(false);
+ JScrollPane sp = new JScrollPane(t);
+ indexes.put("main[waiting].responseTextArea", t);
+ return new JSplitPane(
+ JSplitPane.VERTICAL_SPLIT,
+ buildParametersTabbedPane(),
+ sp
+ );
+ }
+
+ private static JTabbedPane buildParametersTabbedPane() {
+ JTabbedPane p = new JTabbedPane();
+ p.add("Params", buildTable());
+ p.add("Authorization", new JPanel());
+ p.add("Headers", buildTable());
+ p.add("Body", new JTextArea());
+ return p;
+ }
+
+ private static JTable buildTable() {
+ JTable t = new JTable();
+ TableColumn keyCol = new TableColumn();
+ keyCol.setHeaderValue("Keys");
+ TableColumn valCol = new TableColumn();
+ valCol.setHeaderValue("Values");
+ t.addColumn(keyCol);
+ t.addColumn(valCol);
+ return t;
+ }
+
+ public static JTextArea getResponseArea(int index) {
+ return (JTextArea) indexes.get("main[" + index + "].responseTextArea");
+ }
+
+}
diff --git a/src/ovh/alexisdelhaie/endpoint/configuration/ConfigurationProperties.java b/src/ovh/alexisdelhaie/endpoint/configuration/ConfigurationProperties.java
index a2a5b21..052170d 100644
--- a/src/ovh/alexisdelhaie/endpoint/configuration/ConfigurationProperties.java
+++ b/src/ovh/alexisdelhaie/endpoint/configuration/ConfigurationProperties.java
@@ -2,7 +2,7 @@ package ovh.alexisdelhaie.endpoint.configuration;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
-import javafx.scene.control.Alert;
+import ovh.alexisdelhaie.endpoint.utils.MessageDialog;
import java.io.File;
import java.io.IOException;
@@ -56,11 +56,7 @@ public class ConfigurationProperties {
try {
mapper.writeValue(new File(filepath), properties);
} catch (Exception e) {
- Alert alert = new Alert(Alert.AlertType.ERROR);
- alert.setTitle("Cannot save settings");
- alert.setHeaderText("There was an error while saving settings file");
- alert.setContentText(e.getMessage());
- alert.showAndWait();
+ MessageDialog.error("Cannot save settings", "There was an error while saving settings file");
}
}
@@ -71,11 +67,7 @@ public class ConfigurationProperties {
properties = mapper.readValue(f, new TypeReference