Simon Grossenbacher 3 éve
szülő
commit
3ced9fb6d7
5 módosított fájl, 183 hozzáadás és 169 törlés
  1. 31 10
      Example Config.rdproj
  2. BIN
      RESTDebugger.exe
  3. 3 3
      prj/RESTDebugger.dproj
  4. 25 51
      src/_frmMain.dfm
  5. 124 105
      src/_frmMain.pas

+ 31 - 10
Example Config.rdproj

@@ -1,7 +1,7 @@
 {
 	"Presets": {
-		"Presets": "faf2be76254543f9ad9cc8fca91cef5e:R0VUOiBTaW1wbGUgR0VU\r\n7d37b798c22748eebf92ffa281ba982a:R0VUOiBHRVQgRXh0cmEgSGVhZGVycw==\r\n777045dda27d466fab6c051d3e8094e8:R0VUOiBVc2UgQmFzaWMgQXV0aCBFeGFtcGxl\r\na0745bab53eb4c78a6034f1a9d4559de:R0VUOiBFeGFtcGxlIFVSTCBQYXJhbWV0ZXJz\r\n292047e733934bc48429c4d746cae53a:UE9TVDogSnNvbiBQb3N0IERhdGE=\r\nc02b437c22474cf7b44a96c72f430f18:REVMRVRFOiBEZWxldGUgRGF0YQ==\r\n9609fe373b9b4865a2ea83a3dd35be30:UFVUOiBKc29uIFB1dCBEYXRh\r\ncbbcebba6f30425caec540f517cb3524:UEFUQ0g6IEpzb24gUGF0Y2ggRGF0YQ==\r\n",
-		"LastUsed": 5,
+		"Presets": "faf2be76254543f9ad9cc8fca91cef5e:R0VUOiBTaW1wbGUgR0VU\r\n7d37b798c22748eebf92ffa281ba982a:R0VUOiBHRVQgRXh0cmEgSGVhZGVycw==\r\n777045dda27d466fab6c051d3e8094e8:R0VUOiBVc2UgQmFzaWMgQXV0aCBFeGFtcGxl\r\na0745bab53eb4c78a6034f1a9d4559de:R0VUOiBFeGFtcGxlIFVSTCBQYXJhbWV0ZXJz\r\n292047e733934bc48429c4d746cae53a:UE9TVDogSnNvbiBQb3N0IERhdGE=\r\nc02b437c22474cf7b44a96c72f430f18:REVMRVRFOiBEZWxldGUgRGF0YQ==\r\n9609fe373b9b4865a2ea83a3dd35be30:UFVUOiBKc29uIFB1dCBEYXRh\r\ncbbcebba6f30425caec540f517cb3524:UEFUQ0g6IEpzb24gUGF0Y2ggRGF0YQ==\r\n:GET: Simple GET\r\n",
+		"LastUsed": "c02b437c22474cf7b44a96c72f430f18",
 		"ConfigVersion": 2
 	},
 	"Preset_faf2be76254543f9ad9cc8fca91cef5e": {
@@ -14,7 +14,8 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"ResponseAutoFormat": true
+		"ResponseAutoFormat": true,
+		"Category": ""
 	},
 	"Preset_7d37b798c22748eebf92ffa281ba982a": {
 		"BaseURL": "%BaseURL%/headers",
@@ -26,7 +27,8 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"ResponseAutoFormat": false
+		"ResponseAutoFormat": false,
+		"Category": ""
 	},
 	"Preset_777045dda27d466fab6c051d3e8094e8": {
 		"BaseURL": "%BaseURL%/basic-auth/user/pwd",
@@ -38,7 +40,8 @@
 		"UseBasicAuth": true,
 		"AuthUsername": "3f0k+uBHWf2sPtwW4tYMUA==",
 		"AuthPassword": "C35R83xuSqKQ93OJME1BZA==",
-		"ResponseAutoFormat": false
+		"ResponseAutoFormat": false,
+		"Category": ""
 	},
 	"Preset_a0745bab53eb4c78a6034f1a9d4559de": {
 		"BaseURL": "%BaseURL%/get",
@@ -50,7 +53,8 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"ResponseAutoFormat": false
+		"ResponseAutoFormat": false,
+		"Category": ""
 	},
 	"Preset_292047e733934bc48429c4d746cae53a": {
 		"BaseURL": "%BaseURL%/post",
@@ -62,7 +66,8 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"ResponseAutoFormat": true
+		"ResponseAutoFormat": true,
+		"Category": "Main"
 	},
 	"Preset_c02b437c22474cf7b44a96c72f430f18": {
 		"BaseURL": "%BaseURL%/delete",
@@ -74,7 +79,8 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"ResponseAutoFormat": false
+		"ResponseAutoFormat": false,
+		"Category": ""
 	},
 	"Preset_9609fe373b9b4865a2ea83a3dd35be30": {
 		"BaseURL": "%BaseURL%/put",
@@ -86,7 +92,8 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"ResponseAutoFormat": false
+		"ResponseAutoFormat": false,
+		"Category": ""
 	},
 	"Preset_cbbcebba6f30425caec540f517cb3524": {
 		"BaseURL": "%BaseURL%/patch",
@@ -98,10 +105,24 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"ResponseAutoFormat": false
+		"ResponseAutoFormat": false,
+		"Category": ""
 	},
 	"Main": {
 		"GlobalVar": "fldType\tfldName\tfldValue\r\nStatic\t%CustomPostData%\tData 1\r\nRegEx\t(?<=User-Agent\": \")(?s)(.\\w*\\s\\w*\\s\\w*\\/)\\d*.\\d*.\\/g\t\r\nStatic\t%BaseURL%\thttps://httpbin.org\r\n",
 		"GridViewPresets": "Bhlmcm1NYWluLmN4R3JpZERCVGFibGVWaWV3BhJUY3hHcmlkREJUYWJsZVZpZXcCCQYJU291cmNlRFBJAgYCYAYGRm9vdGVyAgkGBUZhbHNlBgpHcm91cEJ5Qm94AgkGBFRydWUGDEdyb3VwRm9vdGVycwICBgEABgpOZXdJdGVtUm93AgkGBUZhbHNlBhhFZGl0Rm9ybVVzZURlZmF1bHRMYXlvdXQCCQYEVHJ1ZQYTUm93VXNlRGVmYXVsdExheW91dAIJBgRUcnVlBh9Db2x1bW5zUXVpY2tDdXN0b21pemF0aW9uU29ydGVkAgkGBUZhbHNlBgdWZXJzaW9uAgIGAQECAwYYY3hHcmlkREJUYWJsZVZpZXdmbGROYW1lBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAAYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhxjeEdyaWREQlRhYmxlVmlld2ZsZENhdGVnb3J5Bg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAQYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABh1Db25kaXRpb25hbEZvcm1hdHRpbmdQcm92aWRlcgYkVGN4R3JpZENvbmRpdGlvbmFsRm9ybWF0dGluZ1Byb3ZpZGVyAgEGBUNvdW50AgYCAAIA"
+	},
+	"Preset_": {
+		"BaseURL": "",
+		"Method": 0,
+		"URLParams": "",
+		"PostData": "",
+		"ExtraHeaders": "",
+		"PostDataContentType": "application/json",
+		"ResponseAutoFormat": false,
+		"UseBasicAuth": false,
+		"AuthUsername": "",
+		"AuthPassword": "",
+		"Category": ""
 	}
 }

BIN
RESTDebugger.exe


+ 3 - 3
prj/RESTDebugger.dproj

@@ -5,7 +5,7 @@
         <FrameworkType>VCL</FrameworkType>
         <MainSource>RESTDebugger.dpr</MainSource>
         <Base>True</Base>
-        <Config Condition="'$(Config)'==''">Release</Config>
+        <Config Condition="'$(Config)'==''">Debug</Config>
         <Platform Condition="'$(Platform)'==''">Win64</Platform>
         <TargetedPlatforms>2</TargetedPlatforms>
         <AppType>Application</AppType>
@@ -115,9 +115,9 @@
     </PropertyGroup>
     <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
         <BT_BuildType>Debug</BT_BuildType>
-        <VerInfo_Keys>FileVersion=1.2.16.65;ProductVersion=1.0.0.0;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys>
+        <VerInfo_Keys>FileVersion=1.2.15.65;ProductVersion=1.0.0.0;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys>
         <VerInfo_Build>65</VerInfo_Build>
-        <VerInfo_Release>16</VerInfo_Release>
+        <VerInfo_Release>15</VerInfo_Release>
         <VerInfo_Locale>1033</VerInfo_Locale>
         <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
         <Icon_MainIcon>RESTDebugger_Icon.ico</Icon_MainIcon>

+ 25 - 51
src/_frmMain.dfm

@@ -124,8 +124,6 @@ object frmMain: TfrmMain
     TabOrder = 3
     Properties.ActivePage = tabContent
     Properties.CustomButtons.Buttons = <>
-    ExplicitTop = 458
-    ExplicitHeight = 432
     ClientRectBottom = 432
     ClientRectLeft = 2
     ClientRectRight = 723
@@ -133,8 +131,6 @@ object frmMain: TfrmMain
     object tabContent: TcxTabSheet
       Caption = 'Response Content'
       ImageIndex = 0
-      ExplicitTop = 26
-      ExplicitHeight = 404
       object EditorContent: TSynEdit
         Left = 0
         Top = 31
@@ -171,7 +167,7 @@ object frmMain: TfrmMain
         TabWidth = 2
         WantTabs = True
         FontSmoothing = fsmNone
-        ExplicitHeight = 373
+        ExplicitTop = 32
       end
       object Panel2: TPanel
         Left = 0
@@ -193,8 +189,6 @@ object frmMain: TfrmMain
     object tabHeaders: TcxTabSheet
       Caption = 'Response Headers'
       ImageIndex = 1
-      ExplicitTop = 26
-      ExplicitHeight = 404
       object EditorResponseHeaders: TSynEdit
         Left = 0
         Top = 0
@@ -231,7 +225,6 @@ object frmMain: TfrmMain
         TabWidth = 2
         WantTabs = True
         FontSmoothing = fsmNone
-        ExplicitHeight = 404
       end
     end
   end
@@ -243,12 +236,13 @@ object frmMain: TfrmMain
     Align = alTop
     BevelOuter = bvNone
     TabOrder = 0
+    ExplicitTop = 80
     DesignSize = (
       725
       370)
     object Label2: TLabel
-      Left = 273
-      Top = 11
+      Left = 10
+      Top = 8
       Width = 40
       Height = 13
       Caption = 'Presets:'
@@ -280,7 +274,7 @@ object frmMain: TfrmMain
       Top = 343
       Anchors = [akLeft, akRight, akBottom]
       Properties.OnChange = edtFullURLPropertiesChange
-      TabOrder = 8
+      TabOrder = 7
       Width = 275
     end
     object btnRun: TcxButton
@@ -292,7 +286,7 @@ object frmMain: TfrmMain
       Caption = 'Run'
       OptionsImage.ImageIndex = 14
       OptionsImage.Images = cxImageList
-      TabOrder = 9
+      TabOrder = 8
       OnClick = btnRunClick
     end
     object edtBaseURL: TcxTextEdit
@@ -300,12 +294,12 @@ object frmMain: TfrmMain
       Top = 91
       Anchors = [akLeft, akTop, akRight]
       Properties.OnChange = edtBaseURLPropertiesChange
-      TabOrder = 6
+      TabOrder = 5
       Width = 345
     end
     object btnAdd: TcxButton
-      Left = 588
-      Top = 25
+      Left = 10
+      Top = 327
       Width = 25
       Height = 25
       Hint = 'Add Preset'
@@ -314,12 +308,12 @@ object frmMain: TfrmMain
       OptionsImage.Images = cxImageList
       ParentShowHint = False
       ShowHint = True
-      TabOrder = 1
+      TabOrder = 0
       OnClick = btnAddClick
     end
     object btnDelete: TcxButton
-      Left = 682
-      Top = 25
+      Left = 103
+      Top = 327
       Width = 25
       Height = 25
       Hint = 'Delete Preset'
@@ -328,21 +322,12 @@ object frmMain: TfrmMain
       OptionsImage.Images = cxImageList
       ParentShowHint = False
       ShowHint = True
-      TabOrder = 4
+      TabOrder = 3
       OnClick = btnDeleteClick
     end
-    object comboPresets: TcxComboBox
-      Left = 273
-      Top = 27
-      Anchors = [akLeft, akTop, akRight]
-      Properties.DropDownListStyle = lsFixedList
-      Properties.OnChange = comboPresetsPropertiesChange
-      TabOrder = 0
-      Width = 309
-    end
     object btnEdit: TcxButton
-      Left = 619
-      Top = 25
+      Left = 41
+      Top = 327
       Width = 25
       Height = 25
       Hint = 'Edit Preset'
@@ -351,12 +336,12 @@ object frmMain: TfrmMain
       OptionsImage.Images = cxImageList
       ParentShowHint = False
       ShowHint = True
-      TabOrder = 2
+      TabOrder = 1
       OnClick = btnEditClick
     end
     object btnCopyPreset: TcxButton
-      Left = 651
-      Top = 25
+      Left = 72
+      Top = 327
       Width = 25
       Height = 25
       Hint = 'Copy Preset'
@@ -365,7 +350,7 @@ object frmMain: TfrmMain
       OptionsImage.Images = cxImageList
       ParentShowHint = False
       ShowHint = True
-      TabOrder = 3
+      TabOrder = 2
       OnClick = btnCopyPresetClick
     end
     object comboMethod: TcxComboBox
@@ -379,7 +364,7 @@ object frmMain: TfrmMain
         'PUT'
         'DELETE')
       Properties.OnChange = comboMethodPropertiesChange
-      TabOrder = 5
+      TabOrder = 4
       Width = 83
     end
     object PageControlParams: TcxPageControl
@@ -388,7 +373,7 @@ object frmMain: TfrmMain
       Width = 436
       Height = 191
       Anchors = [akLeft, akTop, akRight, akBottom]
-      TabOrder = 7
+      TabOrder = 6
       Properties.ActivePage = tabURLParams
       Properties.CustomButtons.Buttons = <>
       ClientRectBottom = 189
@@ -398,8 +383,6 @@ object frmMain: TfrmMain
       object tabURLParams: TcxTabSheet
         Caption = 'URL Parameters'
         ImageIndex = 0
-        ExplicitTop = 26
-        ExplicitHeight = 163
         object Panel3: TPanel
           Left = 0
           Top = 0
@@ -455,14 +438,11 @@ object frmMain: TfrmMain
           WantTabs = True
           OnChange = EditorURLParamsChange
           FontSmoothing = fsmNone
-          ExplicitHeight = 136
         end
       end
       object cxTabSheet2: TcxTabSheet
         Caption = 'Extra Headers'
         ImageIndex = 1
-        ExplicitTop = 26
-        ExplicitHeight = 163
         object Panel4: TPanel
           Left = 0
           Top = 0
@@ -517,14 +497,11 @@ object frmMain: TfrmMain
           TabWidth = 2
           WantTabs = True
           FontSmoothing = fsmNone
-          ExplicitHeight = 136
         end
       end
       object cxTabSheet3: TcxTabSheet
         Caption = 'Authentication'
         ImageIndex = 3
-        ExplicitTop = 26
-        ExplicitHeight = 163
         object Label9: TLabel
           Left = 15
           Top = 47
@@ -562,8 +539,6 @@ object frmMain: TfrmMain
       object tabPostData: TcxTabSheet
         Caption = 'Post Data'
         ImageIndex = 2
-        ExplicitTop = 26
-        ExplicitHeight = 163
         object Panel5: TPanel
           Left = 0
           Top = 0
@@ -631,7 +606,6 @@ object frmMain: TfrmMain
           TabWidth = 2
           WantTabs = True
           FontSmoothing = fsmNone
-          ExplicitHeight = 111
         end
       end
     end
@@ -646,7 +620,7 @@ object frmMain: TfrmMain
       OptionsImage.Images = cxImageList
       ParentShowHint = False
       ShowHint = True
-      TabOrder = 10
+      TabOrder = 9
       OnClick = btnCopyFullURLClick
     end
     object btnPasteFullURL: TcxButton
@@ -660,15 +634,15 @@ object frmMain: TfrmMain
       OptionsImage.Images = cxImageList
       ParentShowHint = False
       ShowHint = True
-      TabOrder = 11
+      TabOrder = 10
       OnClick = btnPasteFullURLClick
     end
     object cxGrid: TcxGrid
       Left = 0
       Top = 27
       Width = 256
-      Height = 337
-      TabOrder = 12
+      Height = 294
+      TabOrder = 11
       object cxGridDBTableView: TcxGridDBTableView
         Navigator.Buttons.CustomButtons = <>
         Navigator.Buttons.First.Visible = False

+ 124 - 105
src/_frmMain.pas

@@ -59,7 +59,6 @@ type
     btnAdd: TcxButton;
     cxImageList: TcxImageList;
     btnDelete: TcxButton;
-    comboPresets: TcxComboBox;
     Label4: TLabel;
     btnEdit: TcxButton;
     btnCopyPreset: TcxButton;
@@ -157,7 +156,6 @@ type
     procedure pmnuCopyJsonContentClick(Sender: TObject);
     procedure btnAddClick(Sender: TObject);
     procedure btnDeleteClick(Sender: TObject);
-    procedure comboPresetsPropertiesChange(Sender: TObject);
     procedure btnSaveClick(Sender: TObject);
     procedure btnEditClick(Sender: TObject);
     procedure btnCopyPresetClick(Sender: TObject);
@@ -203,10 +201,12 @@ type
     procedure EditorEnter(Sender: TObject);
     procedure EditorExit(Sender: TObject);
     procedure tbbtnVariablesClick(Sender: TObject);
+    procedure memDataPresetsAfterScroll(DataSet: TDataSet);
+    procedure memDataPresetsAfterEdit(DataSet: TDataSet);
+    procedure memDataPresetsBeforeScroll(DataSet: TDataSet);
   private
     FProjectConfig: TJSONConfig;
     FActiveProject: string;
-    FActivePreset: string;
     FIsTempProjectLoaded: Boolean;
     FTempProjectFile: string;
     FRoamingSavePath: string;
@@ -228,7 +228,6 @@ type
     procedure DoGETRequest(const AMethodType: TMethodType);
     procedure DoPOSTRequest(const AMethodType: TMethodType);
     procedure UpdateEditor(const AText: string);
-    procedure UpdatePresetsCombobox;
     procedure CheckForUpdate;
     function GenerateGuid: string;
     function Encode(const AText: string): string;
@@ -326,17 +325,6 @@ begin
   end;
 end;
 
-procedure TfrmMain.UpdatePresetsCombobox;
-var
-  i: Integer;
-begin
-  comboPresets.Properties.Items.Clear;
-  for i := 0 to FPresetsList.Count - 1 do
-  begin
-    comboPresets.Properties.Items.Add(Decode(FPresetsList.ValueFromIndex[i]));
-  end;
-end;
-
 procedure TfrmMain.tbbtnAutoOpenLastUsedClick(Sender: TObject);
 begin
   MainConfig.WriteBool('Project', 'AutoOpenLastUsed', tbbtnAutoOpenLastUsed.Down);
@@ -368,11 +356,12 @@ end;
 
 procedure TfrmMain.AddPreset(const APresetName: string);
 begin
-  FPresetsList.AddPair(GenerateGuid, Encode(APresetName));
-  UpdatePresetsCombobox;
-  comboPresets.ItemIndex := comboPresets.Properties.Items.Count - 1;
-
-  FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
+  ShowMessage('not implemented yet');
+//  FPresetsList.AddPair(GenerateGuid, Encode(APresetName));
+//  UpdatePresetsCombobox;
+//  comboPresets.ItemIndex := comboPresets.Properties.Items.Count - 1;
+//
+//  FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
 end;
 
 procedure TfrmMain.btnAddClick(Sender: TObject);
@@ -387,18 +376,19 @@ end;
 
 procedure TfrmMain.btnDeleteClick(Sender: TObject);
 begin
-  if comboPresets.Properties.Items.Count = 1 then
-  begin
-    MessageDlg('Thet last preset can''t be deleted. Please create a new preset if you want to delete this.', mtError, [mbOK], 0);
-  end
-  else
-  begin
-    if MessageDlg('Really delete preset "' + comboPresets.Text + '"?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
-    begin
-      DeletePreset(comboPresets.ItemIndex);
-      FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
-    end;
-  end;
+  ShowMessage('not implemented yet');
+//  if comboPresets.Properties.Items.Count = 1 then
+//  begin
+//    MessageDlg('Thet last preset can''t be deleted. Please create a new preset if you want to delete this.', mtError, [mbOK], 0);
+//  end
+//  else
+//  begin
+//    if MessageDlg('Really delete preset "' + comboPresets.Text + '"?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
+//    begin
+//      DeletePreset(comboPresets.ItemIndex);
+//      FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
+//    end;
+//  end;
 end;
 
 procedure TfrmMain.btnEditClick(Sender: TObject);
@@ -406,17 +396,18 @@ var
   dmy: string;
   idx: Integer;
 begin
-  SavePreset;
-  dmy := comboPresets.Text;
-  idx := comboPresets.ItemIndex;
-  if InputQuery('Edit Preset', 'Rename preset:', dmy) then
-  begin
-    comboPresets.Properties.Items[comboPresets.ItemIndex] := dmy;
-    FPresetsList.ValueFromIndex[idx] := Encode(dmy);
-    comboPresets.ItemIndex := idx;
-
-    FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
-  end;
+  ShowMessage('not implemented yet');
+//  SavePreset;
+//  dmy := comboPresets.Text;
+//  idx := comboPresets.ItemIndex;
+//  if InputQuery('Edit Preset', 'Rename preset:', dmy) then
+//  begin
+//    comboPresets.Properties.Items[comboPresets.ItemIndex] := dmy;
+//    FPresetsList.ValueFromIndex[idx] := Encode(dmy);
+//    comboPresets.ItemIndex := idx;
+//
+//    FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
+//  end;
 end;
 
 procedure TfrmMain.btnPasteFullURLClick(Sender: TObject);
@@ -436,11 +427,12 @@ procedure TfrmMain.btnCopyPresetClick(Sender: TObject);
 var
   idx: Integer;
 begin
-  SavePreset;
-  idx := comboPresets.ItemIndex;
-  AddPreset('Copy of ' + comboPresets.Text);
-  FProjectConfig.CopySection('Preset_' + FPresetsList.Names[idx], 'Preset_' + FPresetsList.Names[comboPresets.ItemIndex]);
-  LoadPreset;
+  ShowMessage('not implemented yet');
+//  SavePreset;
+//  idx := comboPresets.ItemIndex;
+//  AddPreset('Copy of ' + comboPresets.Text);
+//  FProjectConfig.CopySection('Preset_' + FPresetsList.Names[idx], 'Preset_' + FPresetsList.Names[comboPresets.ItemIndex]);
+//  LoadPreset;
 end;
 
 procedure TfrmMain.btnRunClick(Sender: TObject);
@@ -587,17 +579,6 @@ begin
   end;
 end;
 
-procedure TfrmMain.comboPresetsPropertiesChange(Sender: TObject);
-begin
-  if FActivePreset <> '' then
-  begin
-    SavePreset;
-  end;
-
-  FActivePreset := comboPresets.Text;
-  LoadPreset;
-end;
-
 procedure TfrmMain.pmnuBiggerEditorClick(Sender: TObject);
 begin
   frmBiggerEditor.ShowModal;
@@ -683,15 +664,16 @@ end;
 
 procedure TfrmMain.DeletePreset(const AID: Integer);
 begin
-  comboPresets.Properties.OnChange := nil;
-  comboPresets.Properties.Items.Delete(AID);
-  FProjectConfig.DeleteSection('Preset_' + FPresetsList.Names[AID]);
-  FPresetsList.Delete(AID);
-  comboPresets.ItemIndex := comboPresets.Properties.Items.Count - 1;
-
-  FActivePreset := comboPresets.Text;
-  LoadPreset;
-  comboPresets.Properties.OnChange := comboPresetsPropertiesChange;
+  ShowMessage('not implemented yet');
+//  comboPresets.Properties.OnChange := nil;
+//  comboPresets.Properties.Items.Delete(AID);
+//  FProjectConfig.DeleteSection('Preset_' + FPresetsList.Names[AID]);
+//  FPresetsList.Delete(AID);
+//  comboPresets.ItemIndex := comboPresets.Properties.Items.Count - 1;
+//
+//  //FActivePreset := comboPresets.Text;
+//  LoadPreset;
+//  //comboPresets.Properties.OnChange := comboPresetsPropertiesChange;
 end;
 
 function TfrmMain.Decode(const AText: string): string;
@@ -968,6 +950,8 @@ begin
 end;
 
 procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
+var
+  strstream: TStringStream;
 begin
   MainConfig.WriteInteger('MainWindowPos', 'Left', Left);
   MainConfig.WriteInteger('MainWindowPos', 'Top', Top);
@@ -992,6 +976,15 @@ begin
 
   SavePreset;
 
+  // Save presets grid layout
+  strstream := TStringStream.Create;
+  try
+    cxGridDBTableView.StoreToStream(strstream);
+    FProjectConfig.WriteString('Main', 'GridViewPresets', Encode(strstream.DataString));
+  finally
+    strstream.Free;
+  end;
+
   if FProjectConfig.FileModified then
   begin
     if (tbbtnAutoSaveProject.Down) and (not FIsTempProjectLoaded) then
@@ -1027,7 +1020,6 @@ begin
 
   MainConfig := TJSONConfig.Create(FRoamingSavePath + 'AppConfig.json');
   FActiveProject := '';
-  FActivePreset := '';
 
   FPresetsList := TStringList.Create;
   FPresetsList.NameValueSeparator := ':';
@@ -1204,12 +1196,10 @@ end;
 procedure TfrmMain.LoadPreset;
 var
   preset: string;
-  idx: Integer;
 begin
-  idx := comboPresets.Properties.Items.IndexOf(FActivePreset);
-  if idx > -1 then
+  if memDataPresets.RecordCount > 0 then
   begin
-    preset := 'Preset_' + FPresetsList.Names[idx];
+    preset := 'Preset_' + memDataPresetsfldGuid.Value;
     edtBaseURL.Text := FProjectConfig.ReadString(preset, 'BaseURL');
     comboMethod.ItemIndex := FProjectConfig.ReadInteger(preset, 'Method', 0);
     EditorURLParams.Lines.Text := FProjectConfig.ReadString(preset, 'URLParams');
@@ -1232,6 +1222,12 @@ var
   i: Integer;
   strstream: TStringStream;
 begin
+  memDataPresets.AfterEdit := nil;
+  memDataPresets.AfterScroll := nil;
+  memDataPresets.BeforeScroll := nil;
+  memDataPresets.AfterEdit := nil;
+
+
   if FIsTempProjectLoaded then
   begin
     dxStatusBarApp.Panels[1].Text := 'Default project loaded.';
@@ -1278,22 +1274,6 @@ begin
   FPresetsList.Clear;
   FPresetsList.DelimitedText := FProjectConfig.ReadString('Presets', 'Presets');
 
-  UpdatePresetsCombobox;
-
-  if comboPresets.Properties.Items.Count = 0 then
-  begin
-    // Add default
-    AddPreset('Default');
-    FProjectConfig.Save;
-  end
-  else
-  begin
-    comboPresets.ItemIndex := FProjectConfig.ReadInteger('Presets', 'LastUsed', 0);
-  end;
-
-  PageControlParams.ActivePage := tabURLParams;
-  PageControlResponse.ActivePage := tabContent;
-
   memDataPresets.Active := False;
   memDataPresets.Active := True;
   try
@@ -1308,6 +1288,22 @@ begin
     memDataPresets.Active := True;
   end;
 
+  LoadPreset;
+
+  if memDataPresets.RecordCount = 0 then
+  begin
+    // Add default
+    AddPreset('Default');
+    FProjectConfig.Save;
+  end
+  else
+  begin
+    memDataPresets.Locate('fldGuid', FProjectConfig.ReadString('Presets', 'LastUsed'), [loPartialKey]);
+    LoadPreset;
+  end;
+
+  PageControlParams.ActivePage := tabURLParams;
+  PageControlResponse.ActivePage := tabContent;
 
   strlist := TStringList.Create;
   try
@@ -1322,13 +1318,44 @@ begin
   UpdateFullURL;
 
 
-  strstream := TStringStream.Create;
+  strstream := TStringStream.Create(Decode(FProjectConfig.ReadString('Main', 'GridViewPresets')));
   try
-    strstream.DataString := Decode(FProjectConfig.ReadString('Main', 'GridViewPresets'));
-    strstream.
+    cxGridDBTableView.RestoreFromStream(strstream);
   finally
     strstream.Free;
   end;
+
+  memDataPresets.BeforeScroll := memDataPresetsBeforeScroll;
+  memDataPresets.AfterScroll := memDataPresetsAfterScroll;
+  memDataPresets.AfterEdit := memDataPresetsAfterEdit;
+
+end;
+
+procedure TfrmMain.memDataPresetsAfterEdit(DataSet: TDataSet);
+var
+  idx: Integer;
+begin
+//  idx := FPresetsList.inde
+//  FPresetsList.ValueFromIndex[idx] := memDataPresetsfldName.Value;
+//  FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
+//
+  SavePreset;
+end;
+
+procedure TfrmMain.memDataPresetsAfterScroll(DataSet: TDataSet);
+begin
+  if memDataPresets.RecordCount > 0 then
+  begin
+    LoadPreset;
+  end;
+end;
+
+procedure TfrmMain.memDataPresetsBeforeScroll(DataSet: TDataSet);
+begin
+  if memDataPresets.RecordCount > 0 then
+  begin
+    SavePreset;
+  end;
 end;
 
 procedure TfrmMain.pmnuPasteJsonContentClick(Sender: TObject);
@@ -1610,12 +1637,10 @@ end;
 procedure TfrmMain.SavePreset;
 var
   preset: string;
-  idx: Integer;
 begin
-  idx := comboPresets.Properties.Items.IndexOf(FActivePreset);
-  if idx > -1 then
+  if memDataPresets.RecordCount > 0 then
   begin
-    preset := 'Preset_' + FPresetsList.Names[idx];
+    preset := 'Preset_' + memDataPresetsfldGuid.Value;
     FProjectConfig.WriteString(preset, 'BaseURL', edtBaseURL.Text);
     FProjectConfig.WriteInteger(preset, 'Method', comboMethod.ItemIndex);
     FProjectConfig.WriteString(preset, 'URLParams', EditorURLParams.Lines.Text);
@@ -1628,14 +1653,15 @@ begin
     FProjectConfig.WriteString(preset, 'AuthUsername', TEncryptStr.EncryptString(edtAuthUsername.Text));
     FProjectConfig.WriteString(preset, 'AuthPassword', TEncryptStr.EncryptString(edtAuthPassword.Text));
 
-    FProjectConfig.WriteInteger('Presets', 'LastUsed', idx);
+    FProjectConfig.WriteString(preset, 'Category', memDataPresetsfldCategory.Value);
+
+    FProjectConfig.WriteString('Presets', 'LastUsed', memDataPresetsfldGuid.Value);
   end;
 end;
 
 procedure TfrmMain.SaveProject;
 var
   strlist: TStringList;
-  strstream: TStringStream;
 begin
   SavePreset;
 
@@ -1649,13 +1675,6 @@ begin
     strlist.Free;
   end;
 
-  strstream := TStringStream.Create;
-  try
-    cxGridDBTableView.StoreToStream(strstream);
-    FProjectConfig.WriteString('Main', 'GridViewPresets', Encode(strstream.DataString));
-  finally
-    strstream.Free;
-  end;
 
   FProjectConfig.Save;
 end;