Simon Grossenbacher 3 tahun lalu
induk
melakukan
5781e6d802
8 mengubah file dengan 185 tambahan dan 120 penghapusan
  1. 33 17
      Example Config.rdproj
  2. TEMPAT SAMPAH
      RESTDebugger.exe
  3. 6 5
      prj/RESTDebugger.dproj
  4. TEMPAT SAMPAH
      prj/RESTDebugger.res
  5. 5 19
      src/_frmAddEditPreset.dfm
  6. 0 2
      src/_frmAddEditPreset.pas
  7. 74 24
      src/_frmMain.dfm
  8. 67 53
      src/_frmMain.pas

+ 33 - 17
Example Config.rdproj

@@ -1,6 +1,6 @@
 {
 	"Presets": {
-		"LastUsed": "f08ab155a960412e988e2decdcd05d1e",
+		"LastUsed": "1e43d67905584d9bad0b965b312a9291",
 		"ConfigVersion": 3
 	},
 	"Preset_faf2be76254543f9ad9cc8fca91cef5e": {
@@ -116,10 +116,10 @@
 		"Category": ""
 	},
 	"Preset_cbbcebba6f30425caec540f517cb3524": {
-		"BaseURL": "",
-		"Method": 0,
+		"BaseURL": "%BaseURL%/patch",
+		"Method": 2,
 		"URLParams": "",
-		"PostData": "",
+		"PostData": "{\r\n  \"Demo\": \"Demo Data\",\r\n  \"BaseURL\": \"%BaseURL%\"\r\n}",
 		"ExtraHeaders": "",
 		"PostDataContentType": "application/json",
 		"UseBasicAuth": false,
@@ -132,13 +132,13 @@
 		"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": "Bhlmcm1NYWluLmN4R3JpZERCVGFibGVWaWV3BhJUY3hHcmlkREJUYWJsZVZpZXcCCQYJU291cmNlRFBJAgYCYAYGRm9vdGVyAgkGBUZhbHNlBgpHcm91cEJ5Qm94AgkGBFRydWUGDEdyb3VwRm9vdGVycwICBgEABgpOZXdJdGVtUm93AgkGBUZhbHNlBhhFZGl0Rm9ybVVzZURlZmF1bHRMYXlvdXQCCQYEVHJ1ZQYTUm93VXNlRGVmYXVsdExheW91dAIJBgRUcnVlBh9Db2x1bW5zUXVpY2tDdXN0b21pemF0aW9uU29ydGVkAgkGBUZhbHNlBgdWZXJzaW9uAgIGAQECBAYYY3hHcmlkREJUYWJsZVZpZXdmbGROYW1lBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAAYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhxjeEdyaWREQlRhYmxlVmlld2ZsZENhdGVnb3J5Bg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAQYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhljeEdyaWREQlRhYmxlVmlld2ZsZE5vdGVzBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgPDqAMGDUFsaWdubWVudEhvcnoCAgYBAAYFSW5kZXgCBgICBgdWaXNpYmxlAgkGBFRydWUGCVNvcnRPcmRlcgIJBgZzb05vbmUGCVNvcnRJbmRleAIGAsO/BhhXYXNWaXNpYmxlQmVmb3JlR3JvdXBpbmcCCQYFRmFsc2UGCkV4cHJlc3Npb24CCRIAAAAAAgAGHUNvbmRpdGlvbmFsRm9ybWF0dGluZ1Byb3ZpZGVyBiRUY3hHcmlkQ29uZGl0aW9uYWxGb3JtYXR0aW5nUHJvdmlkZXICAQYFQ291bnQCBgIAAgA="
+		"GlobalVar": "fldType\tfldName\tfldValue\r\n",
+		"GridViewPresets": "Bhlmcm1NYWluLmN4R3JpZERCVGFibGVWaWV3BhJUY3hHcmlkREJUYWJsZVZpZXcCCQYJU291cmNlRFBJAgYCYAYGRm9vdGVyAgkGBUZhbHNlBgpHcm91cEJ5Qm94AgkGBFRydWUGDEdyb3VwRm9vdGVycwICBgEABgpOZXdJdGVtUm93AgkGBUZhbHNlBhhFZGl0Rm9ybVVzZURlZmF1bHRMYXlvdXQCCQYEVHJ1ZQYTUm93VXNlRGVmYXVsdExheW91dAIJBgRUcnVlBh9Db2x1bW5zUXVpY2tDdXN0b21pemF0aW9uU29ydGVkAgkGBUZhbHNlBgdWZXJzaW9uAgIGAQECAwYYY3hHcmlkREJUYWJsZVZpZXdmbGROYW1lBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAAYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhxjeEdyaWREQlRhYmxlVmlld2ZsZENhdGVnb3J5Bg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAQYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABh1Db25kaXRpb25hbEZvcm1hdHRpbmdQcm92aWRlcgYkVGN4R3JpZENvbmRpdGlvbmFsRm9ybWF0dGluZ1Byb3ZpZGVyAgEGBUNvdW50AgYCAAIA"
 	},
-	"Preset_NmVkNjE2OGZhOWNiNDFlNmI5Njc3YWEzMzk5YjQ2OGI=": {
-		"BaseURL": "",
+	"Preset_f84d0bc1928042ff81d9471447391d3f": {
+		"BaseURL": "add",
 		"Method": 0,
-		"URLParams": "",
+		"URLParams": "      3",
 		"PostData": "",
 		"ExtraHeaders": "",
 		"PostDataContentType": "application/json",
@@ -146,12 +146,28 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"PresetName": "hoi",
-		"Guid": "NmVkNjE2OGZhOWNiNDFlNmI5Njc3YWEzMzk5YjQ2OGI=",
+		"PresetName": "add 3",
+		"Guid": "f84d0bc1928042ff81d9471447391d3f",
 		"Notes": "",
-		"Category": ""
+		"Category": "add"
+	},
+	"Preset_53595bd343c44106b056e39ac93a06eb": {
+		"BaseURL": "add",
+		"Method": 0,
+		"URLParams": "       lkllk",
+		"PostData": "",
+		"ExtraHeaders": "",
+		"PostDataContentType": "application/json",
+		"ResponseAutoFormat": false,
+		"UseBasicAuth": false,
+		"AuthUsername": "",
+		"AuthPassword": "",
+		"PresetName": "Copy of add",
+		"Guid": "53595bd343c44106b056e39ac93a06eb",
+		"Notes": "PGJvZHk+PHA+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnQXJpYWwnIj5TYWxpIGR6dTwvc3Bhbj48YnIvPkhvaTwvcD48cD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdBcmlhbCciPmhvaTwvc3Bhbj48L3A+PHA+U2Fsw7zDvDwvcD48cD5Kb29vPC9wPjwvYm9keT4=",
+		"Category": "add"
 	},
-	"Preset_f08ab155a960412e988e2decdcd05d1e": {
+	"Preset_1e43d67905584d9bad0b965b312a9291": {
 		"BaseURL": "",
 		"Method": 0,
 		"URLParams": "",
@@ -162,9 +178,9 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"PresetName": "sali",
-		"Guid": "f08ab155a960412e988e2decdcd05d1e",
-		"Notes": "",
-		"Category": ""
+		"PresetName": "7",
+		"Guid": "1e43d67905584d9bad0b965b312a9291",
+		"Notes": "PGJvZHk+PHA+SG9pIGR1IHdpZSBnZWl0cz88L3A+PHA+RGFua2UgZ3VldDwvcD48L2JvZHk+",
+		"Category": "7"
 	}
 }

TEMPAT SAMPAH
RESTDebugger.exe


+ 6 - 5
prj/RESTDebugger.dproj

@@ -7,7 +7,7 @@
         <Base>True</Base>
         <Config Condition="'$(Config)'==''">Debug</Config>
         <Platform Condition="'$(Platform)'==''">Win64</Platform>
-        <TargetedPlatforms>2</TargetedPlatforms>
+        <TargetedPlatforms>3</TargetedPlatforms>
         <AppType>Application</AppType>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
@@ -81,7 +81,8 @@
         <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
         <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
         <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
-        <VerInfo_Keys>FileVersion=1.0.5.15;ProductVersion=1.0.0.0</VerInfo_Keys>
+        <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
+        <BT_BuildType>Debug</BT_BuildType>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Base_Win64)'!=''">
         <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
@@ -111,7 +112,7 @@
         <VerInfo_Build>15</VerInfo_Build>
         <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
         <DCC_RemoteDebug>false</DCC_RemoteDebug>
-        <AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
+        <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
         <BT_BuildType>Debug</BT_BuildType>
@@ -136,7 +137,7 @@
         <VerInfo_Release>5</VerInfo_Release>
         <VerInfo_Build>15</VerInfo_Build>
         <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
-        <AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
+        <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
         <BT_BuildType>Debug</BT_BuildType>
@@ -1084,7 +1085,7 @@
                 <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
             </Deployment>
             <Platforms>
-                <Platform value="Win32">False</Platform>
+                <Platform value="Win32">True</Platform>
                 <Platform value="Win64">True</Platform>
             </Platforms>
         </BorlandProject>

TEMPAT SAMPAH
prj/RESTDebugger.res


+ 5 - 19
src/_frmAddEditPreset.dfm

@@ -3,7 +3,7 @@ object frmAddEditPreset: TfrmAddEditPreset
   Top = 0
   BorderStyle = bsDialog
   Caption = 'Preset'
-  ClientHeight = 333
+  ClientHeight = 204
   ClientWidth = 482
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
@@ -30,16 +30,9 @@ object frmAddEditPreset: TfrmAddEditPreset
     Height = 13
     Caption = 'Category:'
   end
-  object Label4: TLabel
-    Left = 25
-    Top = 157
-    Width = 32
-    Height = 13
-    Caption = 'Notes:'
-  end
   object cxButton1: TcxButton
-    Left = 140
-    Top = 295
+    Left = 135
+    Top = 165
     Width = 75
     Height = 25
     Caption = 'Ok'
@@ -47,8 +40,8 @@ object frmAddEditPreset: TfrmAddEditPreset
     OnClick = cxButton1Click
   end
   object cxButton2: TcxButton
-    Left = 225
-    Top = 295
+    Left = 220
+    Top = 165
     Width = 75
     Height = 25
     Caption = 'Cancel'
@@ -91,11 +84,4 @@ object frmAddEditPreset: TfrmAddEditPreset
     TabOrder = 4
     Width = 351
   end
-  object memNotes: TcxMemo
-    Left = 105
-    Top = 154
-    TabOrder = 5
-    Height = 117
-    Width = 351
-  end
 end

+ 0 - 2
src/_frmAddEditPreset.pas

@@ -18,8 +18,6 @@ type
     edtPresetName: TcxTextEdit;
     edtCategory: TcxTextEdit;
     Label3: TLabel;
-    Label4: TLabel;
-    memNotes: TcxMemo;
     procedure cxButton1Click(Sender: TObject);
     procedure cxButton2Click(Sender: TObject);
     procedure FormShow(Sender: TObject);

+ 74 - 24
src/_frmMain.dfm

@@ -247,14 +247,14 @@ object frmMain: TfrmMain
     end
     object Label3: TLabel
       Left = 362
-      Top = 75
+      Top = 11
       Width = 49
       Height = 13
       Caption = 'Base URL:'
     end
     object Label4: TLabel
       Left = 275
-      Top = 329
+      Top = 324
       Width = 42
       Height = 13
       Anchors = [akLeft, akBottom]
@@ -262,7 +262,7 @@ object frmMain: TfrmMain
     end
     object Label6: TLabel
       Left = 273
-      Top = 74
+      Top = 11
       Width = 40
       Height = 13
       Caption = 'Method:'
@@ -289,7 +289,7 @@ object frmMain: TfrmMain
     end
     object edtBaseURL: TcxTextEdit
       Left = 362
-      Top = 91
+      Top = 27
       Anchors = [akLeft, akTop, akRight]
       Properties.OnChange = edtBaseURLPropertiesChange
       TabOrder = 5
@@ -301,7 +301,6 @@ object frmMain: TfrmMain
       Width = 25
       Height = 25
       Hint = 'Add Preset'
-      Anchors = [akTop, akRight]
       OptionsImage.ImageIndex = 0
       OptionsImage.Images = cxImageList
       ParentShowHint = False
@@ -315,7 +314,6 @@ object frmMain: TfrmMain
       Width = 25
       Height = 25
       Hint = 'Delete Preset'
-      Anchors = [akTop, akRight]
       OptionsImage.ImageIndex = 3
       OptionsImage.Images = cxImageList
       ParentShowHint = False
@@ -329,7 +327,6 @@ object frmMain: TfrmMain
       Width = 25
       Height = 25
       Hint = 'Edit Preset'
-      Anchors = [akTop, akRight]
       OptionsImage.ImageIndex = 2
       OptionsImage.Images = cxImageList
       ParentShowHint = False
@@ -343,7 +340,6 @@ object frmMain: TfrmMain
       Width = 25
       Height = 25
       Hint = 'Copy Preset'
-      Anchors = [akTop, akRight]
       OptionsImage.ImageIndex = 1
       OptionsImage.Images = cxImageList
       ParentShowHint = False
@@ -353,7 +349,7 @@ object frmMain: TfrmMain
     end
     object comboMethod: TcxComboBox
       Left = 273
-      Top = 90
+      Top = 27
       Properties.DropDownListStyle = lsFixedList
       Properties.Items.Strings = (
         'GET'
@@ -367,14 +363,14 @@ object frmMain: TfrmMain
     end
     object PageControlParams: TcxPageControl
       Left = 273
-      Top = 127
+      Top = 60
       Width = 436
-      Height = 191
+      Height = 258
       Anchors = [akLeft, akTop, akRight, akBottom]
       TabOrder = 6
       Properties.ActivePage = tabURLParams
       Properties.CustomButtons.Buttons = <>
-      ClientRectBottom = 189
+      ClientRectBottom = 256
       ClientRectLeft = 2
       ClientRectRight = 434
       ClientRectTop = 23
@@ -401,7 +397,7 @@ object frmMain: TfrmMain
           Left = 0
           Top = 27
           Width = 432
-          Height = 139
+          Height = 206
           Align = alBottom
           Anchors = [akLeft, akTop, akRight, akBottom]
           Font.Charset = DEFAULT_CHARSET
@@ -461,7 +457,7 @@ object frmMain: TfrmMain
           Left = 0
           Top = 27
           Width = 432
-          Height = 139
+          Height = 206
           Align = alBottom
           Anchors = [akLeft, akTop, akRight, akBottom]
           Font.Charset = DEFAULT_CHARSET
@@ -570,7 +566,7 @@ object frmMain: TfrmMain
           Left = 0
           Top = 52
           Width = 432
-          Height = 114
+          Height = 181
           Align = alBottom
           Anchors = [akLeft, akTop, akRight, akBottom]
           Font.Charset = DEFAULT_CHARSET
@@ -606,6 +602,69 @@ object frmMain: TfrmMain
           FontSmoothing = fsmNone
         end
       end
+      object tabNotes: TcxTabSheet
+        Caption = 'Notes'
+        ImageIndex = 4
+        object Panel6: TPanel
+          Left = 0
+          Top = 0
+          Width = 432
+          Height = 35
+          Align = alTop
+          BevelOuter = bvNone
+          TabOrder = 0
+          object Label11: TLabel
+            Left = 15
+            Top = 10
+            Width = 32
+            Height = 13
+            Caption = 'Notes:'
+          end
+        end
+        object HtmlEditor: THtmlEditor
+          Left = 0
+          Top = 35
+          Width = 432
+          Height = 198
+          Align = alClient
+          Caption = 'HtmlEditor'
+          Color = clWindow
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = 16
+          Font.Name = 'Times New Roman'
+          Font.Style = []
+          ParentBackground = False
+          ParentFont = False
+          ParentShowHint = False
+          ShowHint = True
+          TabOrder = 1
+          TabStop = True
+          Touch.InteractiveGestures = [igZoom, igPan, igPressAndTap]
+          Touch.InteractiveGestureOptions = [igoPanSingleFingerHorizontal, igoPanSingleFingerVertical, igoPanInertia]
+          Touch.ParentTabletOptions = False
+          Touch.TabletOptions = [toPressAndHold, toSmoothScrolling]
+          HTML.Strings = (
+            '<p>&nbsp;</p>')
+          Styles.Strings = (
+            'body {margin: 8 8; font-size: 11pt; } '
+            'td, th {resize: horizontal}'
+            'img {draggable: true; resize: both}'
+            ''
+            'atd {border: solid red 1px !important}'
+            'atable {border: solid green 1px !important}'
+            'xtemplate {background: #aa80ef70; }'
+            ''
+            '')
+          TouchScroll = False
+          HighlightTextColor = 0
+          PreserveStyleOnNewBlock = True
+          BlockHighlightColor = 1350598816
+          Encoding = heUTF8
+          Options = [eoCaretVisible, eoAnimateCaret, eoEmbedDroppedImages, eoEmbedPastedImages, eoEmbedPastedStyles, eoAddColMarks, eoAddRowMarks, eoUrlDetection, eoSelectionToolbar, eoHighlightCurrentBlock]
+          DefaultParaTag = 'p'
+        end
+      end
     end
     object btnCopyFullURL: TcxButton
       Left = 587
@@ -680,11 +739,6 @@ object frmMain: TfrmMain
           DataBinding.FieldName = 'fldCategory'
           Width = 120
         end
-        object cxGridDBTableViewfldNotes: TcxGridDBColumn
-          Caption = 'Notes'
-          DataBinding.FieldName = 'fldNotes'
-          Width = 1000
-        end
       end
       object cxGridLevel1: TcxGridLevel
         GridView = cxGridDBTableView
@@ -1972,10 +2026,6 @@ object frmMain: TfrmMain
       FieldName = 'fldCategory'
       Size = 50
     end
-    object memDataPresetsfldNotes: TStringField
-      FieldName = 'fldNotes'
-      Size = 1000
-    end
   end
   object dsPresets: TDataSource
     DataSet = memDataPresets

+ 67 - 53
src/_frmMain.pas

@@ -19,7 +19,8 @@ uses
   SynEditCodeFolding, dxCore, Data.DB, dxmdaset, cxStyles, cxCustomData,
   cxFilter, cxData, cxDataStorage, cxNavigator, dxDateRanges,
   dxScrollbarAnnotations, cxDBData, cxGridLevel, cxGridCustomView,
-  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid;
+  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid, cxMemo,
+  htmlcomp, htmledit;
 
 type
   TMethodType = (mtGET, mtPOST, mtPATCH, mtPUT, mtDELETE);
@@ -139,8 +140,10 @@ type
     cxGridDBTableViewfldCategory: TcxGridDBColumn;
     memDataPresetsfldGuid: TStringField;
     cxStyleRepository1: TcxStyleRepository;
-    memDataPresetsfldNotes: TStringField;
-    cxGridDBTableViewfldNotes: TcxGridDBColumn;
+    tabNotes: TcxTabSheet;
+    Panel6: TPanel;
+    Label11: TLabel;
+    HtmlEditor: THtmlEditor;
     procedure FormShow(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
@@ -222,7 +225,7 @@ type
     procedure SaveProject;
     procedure SaveProjectAs(const LoadAfterSave: Boolean);
     procedure Run;
-    procedure AddPreset(const APresetName: string; const APresetCategory: string; APresetNote: string);
+    procedure AddPreset(const AGuid: string; const APresetName: string; const APresetCategory: string);
     procedure LoadPreset;
     procedure SavePreset;
     procedure ShowError(const AErrorText: string);
@@ -230,6 +233,8 @@ type
     procedure DoPOSTRequest(const AMethodType: TMethodType);
     procedure UpdateEditor(const AText: string);
     procedure CheckForUpdate;
+    procedure DeactivatePresetEvents;
+    procedure ActivatePresetEvents;
     function GenerateGuid: string;
     function Encode(const AText: string): string;
     function Decode(const AText: string): string;
@@ -356,19 +361,27 @@ begin
   end;
 end;
 
-procedure TfrmMain.AddPreset(const APresetName: string; const APresetCategory: string; APresetNote: string);
-var
-  guid: string;
+procedure TfrmMain.ActivatePresetEvents;
 begin
-  guid := GenerateGuid;
+  memDataPresets.BeforeScroll := memDataPresetsBeforeScroll;
+  memDataPresets.AfterScroll := memDataPresetsAfterScroll;
+  memDataPresets.AfterEdit := memDataPresetsAfterEdit;
+end;
+
+procedure TfrmMain.AddPreset(const AGuid: string; const APresetName: string; const APresetCategory: string);
+begin
+  DeactivatePresetEvents;
 
   memDataPresets.Append;
   memDataPresetsfldName.Value := APresetName;
   memDataPresetsfldCategory.Value := APresetCategory;
-  memDataPresetsfldNotes.Value := APresetNote;
-  memDataPresetsfldGuid.Value := guid;
+  memDataPresetsfldGuid.Value := AGuid;
   memDataPresets.Post;
 
+  LoadPreset;
+
+  ActivatePresetEvents;
+
   SavePreset;
 end;
 
@@ -376,7 +389,8 @@ procedure TfrmMain.btnAddClick(Sender: TObject);
 begin
   if frmAddEditPreset.ShowModal = mrOk then
   begin
-    AddPreset(frmAddEditPreset.edtPresetName.Text, frmAddEditPreset.edtCategory.Text, frmAddEditPreset.memNotes.Text);
+    SavePreset;
+    AddPreset(GenerateGuid, frmAddEditPreset.edtPresetName.Text, frmAddEditPreset.edtCategory.Text);
   end;
 end;
 
@@ -390,31 +404,28 @@ begin
   begin
     if MessageDlg('Really delete preset "' + memDataPresetsfldName.Value + '"?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
     begin
-      showmessage(memDataPresetsfldGuid.Value);
+      DeactivatePresetEvents;
       FProjectConfig.DeleteSection('Preset_' + memDataPresetsfldGuid.Value);
       memDataPresets.Delete;
       FProjectConfig.Save;
+      LoadPreset;
+      ActivatePresetEvents;
     end;
   end;
 end;
 
 procedure TfrmMain.btnEditClick(Sender: TObject);
-var
-  dmy: string;
-  idx: Integer;
-begin
-  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;
+begin
+  frmAddEditPreset.edtPresetName.Text := memDataPresetsfldName.Value;
+  frmAddEditPreset.edtCategory.Text := memDataPresetsfldCategory.Value;
+  if frmAddEditPreset.ShowModal = mrOk then
+  begin
+    SavePreset;
+    memDataPresets.Edit;
+    memDataPresetsfldName.Value := frmAddEditPreset.edtPresetName.Text;
+    memDataPresetsfldCategory.Value := frmAddEditPreset.edtCategory.Text;
+    memDataPresets.Post;
+  end;
 end;
 
 procedure TfrmMain.btnPasteFullURLClick(Sender: TObject);
@@ -432,13 +443,16 @@ end;
 
 procedure TfrmMain.btnCopyPresetClick(Sender: TObject);
 var
-  idx: Integer;
+  guid: string;
+  name, category: string;
 begin
-  SavePreset;
-//  idx := comboPresets.ItemIndex;
-//  AddPreset('Copy of ' + comboPresets.Text);
-//  FProjectConfig.CopySection('Preset_' + FPresetsList.Names[idx], 'Preset_' + FPresetsList.Names[comboPresets.ItemIndex]);
-//  LoadPreset;
+  guid := GenerateGuid;
+  FProjectConfig.CopySection('Preset_' + memDataPresetsfldGuid.Value, 'Preset_' + guid);
+  FProjectConfig.WriteString('Preset_' + guid, 'Guid', guid);
+  SaveProject;
+  name := 'Copy of ' + memDataPresetsfldName.Value;
+  category := memDataPresetsfldCategory.Value;
+  AddPreset(guid, name, category);
 end;
 
 procedure TfrmMain.btnRunClick(Sender: TObject);
@@ -668,9 +682,20 @@ begin
   ActiveEditor.CutToClipboard;
 end;
 
+procedure TfrmMain.DeactivatePresetEvents;
+begin
+  memDataPresets.BeforeScroll := nil;
+  memDataPresets.AfterScroll := nil;
+  memDataPresets.AfterEdit := nil;
+end;
+
 function TfrmMain.Decode(const AText: string): string;
 begin
-  Result := TNetEncoding.Base64.Decode(AText);
+  try
+    Result := TNetEncoding.Base64.Decode(AText);
+  except
+    Result := '';
+  end;
 end;
 
 procedure TfrmMain.DoGETRequest(const AMethodType: TMethodType);
@@ -1197,6 +1222,8 @@ begin
     comboPostContentType.Text := FProjectConfig.ReadString(preset, 'PostDataContentType', 'application/json');
     chkResponseAutoformat.Checked := FProjectConfig.ReadBool(preset, 'ResponseAutoFormat', false);
 
+    HtmlEditor.HTML.Text := Decode(FProjectConfig.ReadString(preset, 'Notes', ''));
+
     chkUseBasicAuth.Checked := FProjectConfig.ReadBool(preset, 'UseBasicAuth');
     edtAuthUsername.Text := TEncryptStr.DecryptString(FProjectConfig.ReadString(preset, 'AuthUsername'));
     edtAuthPassword.Text := TEncryptStr.DecryptString(FProjectConfig.ReadString(preset, 'AuthPassword'));
@@ -1211,11 +1238,7 @@ var
   strstream: TStringStream;
   strlist: TStringList;
 begin
-  memDataPresets.AfterEdit := nil;
-  memDataPresets.AfterScroll := nil;
-  memDataPresets.BeforeScroll := nil;
-  memDataPresets.AfterEdit := nil;
-
+  DeactivatePresetEvents;
 
   if FIsTempProjectLoaded then
   begin
@@ -1272,7 +1295,7 @@ begin
           memDataPresets.Append;
           memDataPresetsfldGuid.Value := FProjectConfig.ReadString(strlist[i], 'Guid');
           memDataPresetsfldName.Value := FProjectConfig.ReadString(strlist[i], 'PresetName');
-          memDataPresetsfldNotes.Value := FProjectConfig.ReadString(strlist[i], 'Notes');
+          memDataPresetsfldCategory.Value := FProjectConfig.ReadString(strlist[i], 'Category');
           memDataPresets.Post;
         end;
       end;
@@ -1288,7 +1311,7 @@ begin
   if memDataPresets.RecordCount = 0 then
   begin
     // Add default
-    AddPreset('Default', '', '');
+    AddPreset(GenerateGuid, 'Default', '');
     FProjectConfig.Save;
   end
   else
@@ -1320,20 +1343,11 @@ begin
     strstream.Free;
   end;
 
-  memDataPresets.BeforeScroll := memDataPresetsBeforeScroll;
-  memDataPresets.AfterScroll := memDataPresetsAfterScroll;
-  memDataPresets.AfterEdit := memDataPresetsAfterEdit;
-
+  ActivatePresetEvents;
 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;
 
@@ -1650,7 +1664,7 @@ begin
 
     FProjectConfig.WriteString(preset, 'PresetName', memDataPresetsfldName.Value);
     FProjectConfig.WriteString(preset, 'Guid', memDataPresetsfldGuid.Value);
-    FProjectConfig.WriteString(preset, 'Notes', memDataPresetsfldNotes.Value);
+    FProjectConfig.WriteString(preset, 'Notes', Encode(HtmlEditor.Doc.OuterHTML));
     FProjectConfig.WriteString(preset, 'Category', memDataPresetsfldCategory.Value);
 
     FProjectConfig.WriteString('Presets', 'LastUsed', memDataPresetsfldGuid.Value);