unit DisplayFormatConfigFrame; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Math, Forms, Controls, StdCtrls, ExtCtrls, ComCtrls, Buttons, Graphics, Spin, LCLType, DividerBevel, IdeDebuggerWatchValueIntf, LazLoggerBase, IdeDebuggerWatchResPrinter, IdeDebuggerStringConstants, IdeDebuggerDisplayFormats; type TValueDisplayFormatArray = array of TValueDisplayFormat; TValueDisplayFormatHexSeperatorArray = array of TValueDisplayFormatHexSeperator; TValueDisplayFormatArrayTypeArray = array of TValueDisplayFormatArrayType; TBoolSet = set of boolean; TRadioButton = class; { TRadioMultiMarker } TRadioMultiMarker = class(TPanel) private FRadio: TRadioButton; procedure DoClicked(Sender: TObject); protected procedure VisibleChanged; override; procedure BoundsChanged; override; public constructor Create(TheOwner: TComponent; TheRadio: TRadioButton); reintroduce; end; { TRadioButton } TRadioButton = class(StdCtrls.TRadioButton) private FMultiMarker: TRadioMultiMarker; protected procedure ClearMultiMarkers; public procedure ShowMultiMarker; procedure HideMultiMarker; end; { TDisplayFormatFrame } TDisplayFormatFrame = class(TFrame) cbAddrSign: TCheckBox; cbAddrNoLeadZero: TCheckBox; cbArrayShowPrefix: TCheckBox; cbForceSingleLine: TCheckBox; cbArrayShowPrefixEmbedded: TCheckBox; cbEnumValSign: TCheckBox; cbArrayHideLen: TCheckBox; cbMemDump: TCheckBox; cbOverrideArray: TCheckBox; cbOverrideEnumVal: TCheckBox; cbOverrideArrayNavBar: TCheckBox; cbOverrideNum2Base: TCheckBox; cbOverridePointerDeref: TCheckBox; cbOverrideAddressFormat: TCheckBox; cbOverrideNumBase: TCheckBox; cbOverrideEnum: TCheckBox; cbOverrideFloat: TCheckBox; cbOverrideIndent: TCheckBox; cbOverrideStruct: TCheckBox; cbNum2Visibile: TCheckBox; cbNumSeparator: TCheckBox; cbNum2Separator: TCheckBox; cbEnumSign: TCheckBox; cbStructAddrTyped: TCheckBox; cbPointerAddrTyped: TCheckBox; cbArrayNavAutoHide: TCheckBox; cbArrayNavEnforceBounds: TCheckBox; DigitSpacer3: TLabel; DigitSpacer4: TLabel; DividerBevelArray: TDividerBevel; DividerBevelEnumVal: TDividerBevel; DividerBevelNum2: TDividerBevel; DividerBevelPointerDeref: TDividerBevel; DividerBevelAddressFormat: TDividerBevel; DividerBevelNum: TDividerBevel; DividerBevelMemDump: TDividerBevel; DividerBevelEnum: TDividerBevel; DividerBevelFloat: TDividerBevel; DividerBevelPointerDeref1: TDividerBevel; DividerBevelArrayNavBar: TDividerBevel; DividerBevelStruct: TDividerBevel; fill1: TLabel; fill10: TLabel; fill2: TLabel; fill3: TLabel; fill4: TLabel; fill5: TLabel; fill6: TLabel; fill7: TLabel; fill8: TLabel; fill9: TLabel; Label1: TLabel; lbArrayCombine: TLabel; lbArrayHideLenIfLess: TLabel; lbForceSingleLineArrayLen: TLabel; lbForceSingleLineStructFld: TLabel; lbForceSingleLineRevDepth: TLabel; lbForceSingleLineEach: TLabel; lbArrayHideLenThresLen: TLabel; lbArrayHideLenKeepDepth: TLabel; lbArrayHideLenThresEach: TLabel; lbForceSingleLineLen: TLabel; lbOverrideArray: TLabel; lbPageSize: TLabel; lbMaxWrapLvl: TLabel; lbOverrideIndent: TLabel; lbOverrideArrayNavBar: TLabel; lbArrayLenMaxNest: TLabel; lbStructAddrTypedFiller: TLabel; Label3: TLabel; lbEnumValBaseSpace: TLabel; lbOverrideEnumVal: TLabel; lpAddrSpace: TLabel; lbEnumBaseSpace: TLabel; lbNum2Digits: TLabel; lbOverrideFloat: TLabel; lbOverridePointerDeref: TLabel; lbOverrideStruct: TLabel; lbOverrideNum2Base: TLabel; lbOverrideEnum: TLabel; lbNumSepGroup: TLabel; lbNumDigits: TLabel; lbOverrideAddressFormat: TLabel; lbOverrideNumBase: TLabel; lbNum2SepGroup: TLabel; PanelAddressLeadZero: TPanel; PanelArray: TPanel; PanelIndentForceSingleLine: TPanel; PanelArrayShowPrefix: TPanel; PanelArrayHideLen: TPanel; PanelEnumVal: TPanel; PanelENumValBase: TPanel; PanelEnumValRb: TPanel; PanelNum2All: TPanel; PanelNum2Digits: TPanel; PanelENumBase: TPanel; PanelNumSepGroup: TPanel; PanelNum2: TPanel; PanelNum2Base: TPanel; PanelNum2Visible: TPanel; PanelNum2Sign: TPanel; PanelNum2SepGroup: TPanel; PanelIndent: TPanel; PanelIndentMax: TPanel; PanelArrayNavBar: TPanel; PanelArrayNavBarOpts: TPanel; PanelArrayPrefixCombine: TPanel; rbClear: TRadioButton; rbClear1: TRadioButton; rbClear10: TRadioButton; rbClear11: TRadioButton; rbClear12: TRadioButton; rbClear13: TRadioButton; rbClear14: TRadioButton; rbClear15: TRadioButton; rbClear16: TRadioButton; rbClear17: TRadioButton; rbClear2: TRadioButton; rbClear3: TRadioButton; rbClear4: TRadioButton; rbClear5: TRadioButton; rbClear6: TRadioButton; rbClear7: TRadioButton; rbClear8: TRadioButton; rbClear9: TRadioButton; rbENumValBin: TRadioButton; rbENumValChar: TRadioButton; rbENumValDec: TRadioButton; rbENumValHex: TRadioButton; rbEnumValName: TRadioButton; rbEnumValNameAndOrd: TRadioButton; rbENumValOct: TRadioButton; rbEnumValOrd: TRadioButton; rbNum2SepByte: TRadioButton; rbNum2SepLong: TRadioButton; rbENumBin: TRadioButton; rbENumChar: TRadioButton; rbENumDec: TRadioButton; rbENumHex: TRadioButton; rbENumOct: TRadioButton; rbAddrNumBin: TRadioButton; rbNumSepNone: TRadioButton; rbNumSepByte: TRadioButton; rbNum2Char: TRadioButton; rbNum2Bin: TRadioButton; rbNum2Dec: TRadioButton; rbNum2Hex: TRadioButton; rbNum2Oct: TRadioButton; rbNum2SepNone: TRadioButton; rbNumSepWord: TRadioButton; rbNumSepLong: TRadioButton; rbNum2SepWord: TRadioButton; rbSign2Auto: TRadioButton; rbSign2Signed: TRadioButton; rbSign2Unsigned: TRadioButton; rbArrayCombineNone: TRadioButton; rbArrayCombineAll: TRadioButton; rbArrayCombineStat: TRadioButton; rbArrayCombineDyn: TRadioButton; Shape10: TShape; Shape11: TShape; Shape12: TShape; Shape13: TShape; Shape16: TShape; Shape17: TShape; Shape18: TShape; Spacer1: TLabel; lbFloatPrec: TLabel; Label5: TLabel; PanelAddressFormat: TPanel; PanelMemDump: TPanel; PanelPointerDeref: TPanel; PanelFloat: TPanel; PanelFloatRb: TPanel; PanelNumBase: TPanel; PanelNumSign: TPanel; PanelNumDigits: TPanel; PanelNum: TPanel; PanelAddressBase: TPanel; PanelStruct: TPanel; PanelEnum: TPanel; PanelPointer: TPanel; PanelStructFld: TPanel; PanelEnumRb1: TPanel; PanelAddressType: TPanel; PanelStructPointer: TPanel; rbPointerDerefOff: TRadioButton; rbAddrNumHex: TRadioButton; rbAddrNumDec: TRadioButton; rbPointerDerefOnly: TRadioButton; rbPointerDerefOn: TRadioButton; rbFloatPoint: TRadioButton; rbFloatScience: TRadioButton; rbNumBin: TRadioButton; rbNumDec: TRadioButton; rbNumHex: TRadioButton; rbNumOct: TRadioButton; rbNumChar: TRadioButton; rbAddrNumOct: TRadioButton; rbSignAuto: TRadioButton; rbSignSigned: TRadioButton; rbSignUnsigned: TRadioButton; rbStructFields: TRadioButton; rbEnumOrd: TRadioButton; rbAddressTyped: TRadioButton; rbStructAddrOn: TRadioButton; rbStructFull: TRadioButton; rbEnumNameAndOrd: TRadioButton; rbStructAddrOnly: TRadioButton; rbStructValOnly: TRadioButton; rbEnumName: TRadioButton; rbAddressPlain: TRadioButton; rbStructAddrOff: TRadioButton; Spacer10: TLabel; Spacer11: TLabel; Spacer12: TLabel; Spacer13: TLabel; Spacer14: TLabel; DigitSpacer1: TLabel; DigitSpacer2: TLabel; Spacer15: TLabel; Spacer16: TLabel; Spacer17: TLabel; Spacer18: TLabel; Spacer19: TLabel; Spacer2: TLabel; Spacer20: TLabel; Spacer21: TLabel; Spacer22: TLabel; Spacer3: TLabel; Spacer4: TLabel; Spacer5: TLabel; Spacer6: TLabel; Spacer7: TLabel; Spacer8: TLabel; Spacer9: TLabel; spinArrayHideLenIfLess: TSpinEdit; spinForceSingleLineArrayLen: TSpinEdit; spinForceSingleLineStructFld: TSpinEdit; spinForceSingleLineRevDepth: TSpinEdit; spinForceSingleLineEach: TSpinEdit; spinArrayHideLenThresLen: TSpinEdit; spinArrayHideLenRevDepth: TSpinEdit; spinArrayHideLenThresEach: TSpinEdit; spinForceSingleLineLen: TSpinEdit; SpinPageSize: TSpinEdit; SpinIndentMaxWrap: TSpinEdit; SpinFloatDigits: TSpinEdit; SpinDigits: TSpinEdit; Spin2Digits: TSpinEdit; spinArrayLenMaxNest: TSpinEdit; tbIndent: TSpeedButton; ToolBar1: TToolBar; tbCurrent: TSpeedButton; tbStruct: TSpeedButton; tbPointer: TSpeedButton; ToolButton12: TToolButton; ToolButton13: TToolButton; ToolButton14: TToolButton; ToolButton15: TToolButton; ToolButton16: TToolButton; ToolButton17: TToolButton; ToolButton2: TToolButton; tbAll: TSpeedButton; ToolButton4: TToolButton; tbNumber: TSpeedButton; tbEnum: TSpeedButton; tbBool: TSpeedButton; tbChar: TSpeedButton; tbFloat: TSpeedButton; tbArray: TSpeedButton; ToolButton5: TToolButton; procedure cbArrayShowPrefixChange(Sender: TObject); procedure DataCheckboxChange(Sender: TObject); procedure cbMemDumpChange(Sender: TObject); procedure CheckLabelClicked(Sender: TObject); procedure FormatAddrTypeChanged(Sender: TObject); procedure FormatNumGroupChanged(Sender: TObject); procedure FormatNumSepChanged(Sender: TObject); procedure FormatRadioChanged(Sender: TObject); procedure FormatSignCBChanged(Sender: TObject); procedure FormatSpinChanged(Sender: TObject); procedure OverrideCheckChanged(Sender: TObject); procedure Spin2DigitsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Spin2DigitsKeyPress(Sender: TObject; var Key: char); procedure tbAllClick(Sender: TObject); procedure tbCurrentClick(Sender: TObject); procedure tbFormatClick(Sender: TObject); procedure tbIndentClick(Sender: TObject); private type TFmtButtons = (bsNum, bsEnum, bsBool, bsChar, bsFloat, bsStruct, bsPtr, bsArray, bsIndent); private FAllowMultiTabs: boolean; FHighlightModifiedTabs: boolean; FShowAll: boolean; FShowArrayNavBarOpts: boolean; FShowCurrent: boolean; FDisplayFormatCount: integer; FDisplayFormat: array of TWatchDisplayFormat; FCurrentResDataType: TWatchResultDataKind; FShowExtraSettings: boolean; FShowFullAddressInMulti: boolean; FShowMemDump: boolean; FShowMultiRadio: boolean; FShowOverrideChecks: boolean; FUpdateCount: integer; FNeedUpdateDisplay, FUpdatingSpin: boolean; FUpdatingDisplay: Integer; FInButtonClick: Boolean; FButtonStates: array[TFmtButtons] of boolean; FSetupDone: boolean; procedure EnableParentOverride(c: TControl; AEnableVisible: Boolean = False); function GetDisplayFormat: TWatchDisplayFormat; function GetDisplayFormats(AIndex: integer): TWatchDisplayFormat; procedure SetCurrentResDataType(AValue: TWatchResultDataKind); procedure SetDisplayFormat(ADispFormat: TWatchDisplayFormat); procedure SetDisplayFormatCount(AValue: integer); procedure SetDisplayFormats(AIndex: integer; AValue: TWatchDisplayFormat); procedure SetHighlightModifiedTabs(AValue: boolean); procedure SetShowAll(AValue: boolean); procedure SetShowArrayNavBarOpts(AValue: boolean); procedure SetShowCurrent(AValue: boolean); procedure SetShowExtraSettings(AValue: boolean); procedure SetShowMemDump(AValue: boolean); procedure SetShowMultiRadio(AValue: boolean); procedure SetShowOverrideChecks(AValue: boolean); protected procedure ClearRadios(APanel: TWinControl; ARecursive: Boolean = False; AnExcludeSelf: boolean = False); procedure ApplyDispForm(APanel: TPanel; ADispForm: TValueDisplayFormats; AnRbOrder: TValueDisplayFormatArray); procedure ApplyDispForm(APanel: TPanel; ADispForm: TValueDisplayFormatHexSeperators; AnRbOrder: TValueDisplayFormatHexSeperatorArray); procedure ApplyDispForm(APanel: TPanel; ADispForm: TValueDisplayFormatArrayTypes; AnRbOrder: TValueDisplayFormatArrayTypeArray); function ReadDispForm(APanel: TPanel; AnRbOrder: TValueDisplayFormatArray): TValueDisplayFormats; function ReadDispForm(APanel: TPanel; AnRbOrder: TValueDisplayFormatHexSeperatorArray): TValueDisplayFormatHexSeperators; function ReadDispForm(APanel: TPanel; AnRbOrder: TValueDisplayFormatArrayTypeArray): TValueDisplayFormatArrayTypes; function BtnDownCount: integer; procedure UpdateButtonStates; procedure UpdateTabs; procedure UpdateVisiblePanels; procedure UpdateNumDigitPanel; procedure UpdateNum2Visibility; procedure UpdateNum2DigitPanel; procedure UpdateDisplay; procedure UpdateFormatOverrides; procedure UpdateFormat; procedure UpdateConstraints; procedure CreateHandle; override; public constructor Create(TheOwner: TComponent); override; procedure Setup; procedure BeginUdpate; procedure EndUdpate; procedure SelectDefaultButton; property DisplayFormat: TWatchDisplayFormat read GetDisplayFormat write SetDisplayFormat; property DisplayFormats [AIndex: integer]: TWatchDisplayFormat read GetDisplayFormats write SetDisplayFormats; property DisplayFormatCount: integer read FDisplayFormatCount write SetDisplayFormatCount; property CurrentResDataType: TWatchResultDataKind read FCurrentResDataType write SetCurrentResDataType; published property ShowCurrent: boolean read FShowCurrent write SetShowCurrent; property ShowAll: boolean read FShowAll write SetShowAll; property AllowMultiTabs: boolean read FAllowMultiTabs write FAllowMultiTabs; property ShowMemDump: boolean read FShowMemDump write SetShowMemDump; property ShowMultiRadio: boolean read FShowMultiRadio write SetShowMultiRadio; property ShowOverrideChecks: boolean read FShowOverrideChecks write SetShowOverrideChecks; property ShowArrayNavBarOpts: boolean read FShowArrayNavBarOpts write SetShowArrayNavBarOpts; // ShowExtraSettings: Show PanelEnumVal (project and global opts) property ShowExtraSettings: boolean read FShowExtraSettings write SetShowExtraSettings; property ShowFullAddressInMulti: boolean read FShowFullAddressInMulti write FShowFullAddressInMulti; property HighlightModifiedTabs: boolean read FHighlightModifiedTabs write SetHighlightModifiedTabs; end; const MULTIOPT_INT_MIX = low(integer); MULTIOPT_INT_UNK = low(integer)+1; procedure UpdateIntSetting(var CurVal: Integer; NewVal: integer); procedure SetSpinEditToInherit(ASpin: TSpinEdit); procedure IntToSpinEdit(ASpin: TSpinEdit; aVal: integer); function BoolsetToCBState(bs: TBoolSet; ARevert: Boolean = True): TCheckBoxState; procedure BoolFromCBState(cs: TCheckBoxState; var b: boolean; ARevert: Boolean = True); procedure BoolFromCB(cb: TCheckBox; var b: boolean; ARevert: Boolean = True); implementation {$R *.lfm} const {$WriteableConst off} RBA_Num: TValueDisplayFormatArray = (vdfBaseDecimal, vdfBaseHex, vdfBaseOct, vdfBaseBin, vdfBaseChar); RBA_Sign: TValueDisplayFormatArray = (vdfSignAuto, vdfSignSigned, vdfSignUnsigned); RBA_Group: TValueDisplayFormatHexSeperatorArray = (vdfhsNone, vdfhsByte, vdfhsWord, vdfhsLong); RBA_Enum: TValueDisplayFormatArray = (vdfEnumName, vdfEnumOrd, vdfEnumNameAndOrd); RBA_Float: TValueDisplayFormatArray = (vdfFloatPoint, vdfFloatScientific); RBA_StructVal: TValueDisplayFormatArray = (vdfStructValOnly, vdfStructFields, vdfStructFull); RBA_StructPtr: TValueDisplayFormatArray = (vdfStructPointerOff, vdfStructPointerOn, vdfStructPointerOnly); RBA_PtrDeref: TValueDisplayFormatArray = (vdfPointerDerefOn, vdfPointerDerefOff, vdfPointerDerefOnly); RBA_Addr: TValueDisplayFormatArray = (vdfAddressPlain, vdfAddressTyped); RBA_AddrNum: TValueDisplayFormatArray = (vdfBaseHex, vdfBaseDecimal, vdfBaseOct, vdfBaseBin); RBA_ArrayCombine: TValueDisplayFormatArrayTypeArray = (vdfatNone, vdfatAll, vdfatStat, vdfatDyn); procedure UpdateIntSetting(var CurVal: Integer; NewVal: integer); begin if (CurVal = MULTIOPT_INT_UNK) or (CurVal = NewVal) then CurVal := NewVal else CurVal := MULTIOPT_INT_MIX; end; procedure SetSpinEditToInherit(ASpin: TSpinEdit); begin ASpin.Tag := 1; ASpin.Value := 0; ASpin.Text := ''; end; procedure IntToSpinEdit(ASpin: TSpinEdit; aVal: integer); begin if (aVal = MULTIOPT_INT_MIX) or (aVal = MULTIOPT_INT_UNK) then begin ASpin.Tag := 2; ASpin.Value := 0; ASpin.Text := ''; ASpin.Tag := 2; end else begin ASpin.Tag := 0; ASpin.Value := aVal; ASpin.Text := IntToStr(aVal); end; end; function BoolsetToCBState(bs: TBoolSet; ARevert: Boolean = True): TCheckBoxState; begin if bs =[False, True] then Result := cbGrayed else if (bs =[False]) xor ARevert then Result := cbUnchecked else Result := cbChecked; end; procedure BoolFromCBState(cs: TCheckBoxState; var b: boolean; ARevert: Boolean = True); begin case cs of cbUnchecked: b := ARevert; cbChecked: b := not ARevert; //cbGrayed: ; end; end; procedure BoolFromCB(cb: TCheckBox; var b: boolean; ARevert: Boolean = True); begin if cb.Visible and cb.Enabled and (cb.Tag = 0) then BoolFromCBState(cb.State, b, ARevert); end; function HexSepCount(hs: TValueDisplayFormatHexSeperators): integer; var d: TValueDisplayFormatHexSeperator; begin Result := 0; for d in TValueDisplayFormatHexSeperators do if d in hs then inc(Result); end; function LenCombineCount(hs: TValueDisplayFormatArrayTypes): integer; var d: TValueDisplayFormatArrayType; begin Result := 0; for d in TValueDisplayFormatArrayTypes do if d in hs then inc(Result); end; procedure AddToStr(var txt: string; add, sep: string); begin if (txt = add) then exit; if txt <> '' then txt := txt + sep; txt := txt + add; end; { TRadioMultiMarker } procedure TRadioMultiMarker.DoClicked(Sender: TObject); begin FRadio.Checked := True; end; procedure TRadioMultiMarker.VisibleChanged; begin inherited VisibleChanged; if IsVisible then BringToFront; end; procedure TRadioMultiMarker.BoundsChanged; begin inherited BoundsChanged; if Parent = nil then exit; BorderSpacing.Left := max(0, (Parent.Height-5) div 2 - 2); //Height := max(1, min(3, (Parent.Height + 3) div 6)); //Width := Height; Height := max(1, min(3, (Parent.Height) div 12)); Width := max(3, min(15, (Parent.Height) div 3)); BorderSpacing.Left := Max(2, (Parent.Height - Width) div 2 - 2); end; constructor TRadioMultiMarker.Create(TheOwner: TComponent; TheRadio: TRadioButton); begin inherited Create(TheOwner); FRadio := TheRadio; Parent := TheRadio.Parent; AutoSize := False; Visible := False; Height := 3; Width := 3; Color := clGrayText; BevelInner := bvNone; BevelOuter := bvNone; AnchorSide[akTop].Control := TheRadio; AnchorSide[akTop].Side := asrCenter; AnchorSide[akLeft].Control := TheRadio; AnchorSide[akLeft].Side := asrTop; BorderSpacing.Left := 5; OnClick := @DoClicked; end; { TRadioButton } procedure TRadioButton.ClearMultiMarkers; var i: Integer; begin for i := 0 to Parent.ControlCount - 1 do if Parent.Controls[i] is TRadioButton then TRadioButton(Parent.Controls[i]).HideMultiMarker; end; procedure TRadioButton.ShowMultiMarker; begin if FMultiMarker = nil then FMultiMarker := TRadioMultiMarker.Create(Owner, Self); FMultiMarker.Visible := True; end; procedure TRadioButton.HideMultiMarker; begin if FMultiMarker <> nil then FMultiMarker.Visible := False; end; { TDisplayFormatFrame } procedure TDisplayFormatFrame.cbMemDumpChange(Sender: TObject); begin if FUpdatingDisplay > 0 then exit; TControl(Sender).Tag := 0; PanelNum.Enabled := not cbMemDump.Checked; PanelEnum.Enabled := not cbMemDump.Checked; PanelFloat.Enabled := not cbMemDump.Checked; PanelStruct.Enabled := not cbMemDump.Checked; PanelPointer.Enabled := not cbMemDump.Checked; PanelAddressFormat.Enabled := not cbMemDump.Checked; end; procedure TDisplayFormatFrame.DataCheckboxChange(Sender: TObject); begin if FUpdatingDisplay > 0 then exit; TControl(Sender).Tag := 0; EnableParentOverride(TControl(Sender)); UpdateFormat; UpdateDisplay; end; procedure TDisplayFormatFrame.cbArrayShowPrefixChange(Sender: TObject); begin cbArrayShowPrefixEmbedded.Enabled := cbArrayShowPrefix.Checked; DataCheckboxChange(Sender); end; procedure TDisplayFormatFrame.CheckLabelClicked(Sender: TObject); var i: Integer; p: TWinControl; begin p := TControl(Sender).Parent; for i := 0 to p.ControlCount-1 do if p.Controls[i] is TCheckBox then begin TCheckBox(p.Controls[i]).Checked := not TCheckBox(p.Controls[i]).Checked; exit; end; end; procedure TDisplayFormatFrame.FormatAddrTypeChanged(Sender: TObject); begin // "ALL" page only. On the "all" page this does not have an "override" checkbox. if FUpdatingDisplay > 0 then exit; TControl(Sender).Tag := 0; UpdateFormat; end; procedure TDisplayFormatFrame.FormatNumGroupChanged(Sender: TObject); begin if FUpdatingDisplay > 0 then exit; TControl(Sender).Tag := 0; EnableParentOverride(TControl(Sender)); UpdateFormat; TRadioButton(Sender).ClearMultiMarkers; end; procedure TDisplayFormatFrame.FormatNumSepChanged(Sender: TObject); begin if FUpdatingDisplay > 0 then exit; TControl(Sender).Tag := 0; EnableParentOverride(TControl(Sender)); UpdateFormat; end; procedure TDisplayFormatFrame.FormatRadioChanged(Sender: TObject); begin if FUpdatingDisplay > 0 then exit; TControl(Sender).Tag := 0; EnableParentOverride(TControl(Sender), True); UpdateFormat; TRadioButton(Sender).ClearMultiMarkers; UpdateDisplay; end; procedure TDisplayFormatFrame.FormatSignCBChanged(Sender: TObject); begin if FUpdatingDisplay > 0 then exit; TControl(Sender).Tag := 0; EnableParentOverride(TControl(Sender), True); UpdateFormat; UpdateDisplay; end; procedure TDisplayFormatFrame.FormatSpinChanged(Sender: TObject); begin if FUpdatingSpin then exit; if FUpdatingDisplay = 0 then TControl(Sender).Tag := 0; if (TSpinEdit(Sender).Tag <> 0) then begin FUpdatingSpin := True; TSpinEdit(Sender).Text := ''; FUpdatingSpin := False; end; if (TSpinEdit(Sender).Tag = 0) and (TSpinEdit(Sender).Value = -1) and (Sender <> SpinFloatDigits) then begin FUpdatingSpin := True; TSpinEdit(Sender).Text := DispFormatNumDigitsFull; TSpinEdit(Sender).SelectAll; FUpdatingSpin := False; end; if (TSpinEdit(Sender).Tag = 0) and (TSpinEdit(Sender).Value = 0) and ( (Sender = spinForceSingleLineStructFld) or (Sender = spinForceSingleLineArrayLen) ) then begin FUpdatingSpin := True; TSpinEdit(Sender).Text := DispFormatForceSingleLineDigitsAny; TSpinEdit(Sender).SelectAll; FUpdatingSpin := False; end; if FUpdatingDisplay > 0 then exit; TControl(Sender).Tag := 0; EnableParentOverride(TControl(Sender), True); UpdateFormat; UpdateDisplay; end; procedure TDisplayFormatFrame.OverrideCheckChanged(Sender: TObject); begin if (FUpdatingDisplay > 0) or not FShowOverrideChecks then exit; TControl(Sender).Tag := 0; UpdateFormatOverrides; UpdateDisplay; end; procedure TDisplayFormatFrame.Spin2DigitsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState ); begin if (TSpinEdit(Sender).Value = -1) then begin if(Key = VK_DOWN) then key := 0; if (key >= VK_0) and (key <= VK_9) then begin TSpinEdit(Sender).Value := Key - VK_0; key := 0; end; end; end; procedure TDisplayFormatFrame.Spin2DigitsKeyPress(Sender: TObject; var Key: char); begin TControl(Sender).Tag := 0; if Key = '-' then begin if (TSpinEdit(Sender).MinValue < 0) and (Sender <> SpinFloatDigits) then TSpinEdit(Sender).Value := -1; Key := #0; end; end; procedure TDisplayFormatFrame.tbAllClick(Sender: TObject); begin if FInButtonClick then exit; FInButtonClick := True; try UpdateFormat; tbCurrent.Down := tbCurrent.Enabled; tbNumber.Down := tbAll.Down; tbEnum.Down := tbAll.Down; tbBool.Down := tbAll.Down; tbChar.Down := tbAll.Down; tbFloat.Down := tbAll.Down; tbStruct.Down := tbAll.Down; tbPointer.Down := tbAll.Down; tbArray.Down := tbAll.Down; tbIndent.Down := False; finally FInButtonClick := False; end; if (not tbAll.Down) and (Sender <> nil) then begin tbCurrentClick(nil); end else UpdateDisplay; end; procedure TDisplayFormatFrame.tbCurrentClick(Sender: TObject); begin if FInButtonClick then exit; if FCurrentResDataType = rdkUnknown then begin FInButtonClick := True; if FShowAll then begin tbAll.Down := True; FInButtonClick := False; tbAllClick(nil); end else begin tbNumber.Down := True; FInButtonClick := False; tbFormatClick(tbNumber); end; exit; end; FInButtonClick := True; try UpdateFormat; tbAll.Down := False; tbCurrent.Down := True; tbNumber.Down := False; tbEnum.Down := False; tbBool.Down := False; tbChar.Down := False; tbFloat.Down := False; tbStruct.Down := False; tbPointer.Down := False; tbArray.Down := False; tbIndent.Down := False; case FCurrentResDataType of rdkError: ; rdkPrePrinted: ; rdkString: ; rdkWideString: ; rdkChar: tbChar.Down := True; rdkSignedNumVal: tbNumber.Down := True; rdkUnsignedNumVal: tbNumber.Down := True; rdkPointerVal: tbPointer.Down := True; rdkFloatVal: tbFloat.Down := True; rdkBool: tbBool.Down := True; rdkEnum: tbEnum.Down := True; rdkEnumVal: tbEnum.Down := True; rdkSet: tbEnum.Down := True; rdkVariant: ; rdkPCharOrString: ; rdkArray: tbArray.Down := True; rdkStruct: tbStruct.Down := True; rdkConvertRes: ; rdkFunction: ; rdkProcedure: ; rdkFunctionRef: ; rdkProcedureRef: ; end; finally FInButtonClick := False; end; UpdateDisplay; end; procedure TDisplayFormatFrame.tbFormatClick(Sender: TObject); begin if FInButtonClick then exit; FInButtonClick := True; try UpdateFormat; tbIndent.Down := False; if (not(ssShift in GetKeyShiftState)) or (not FAllowMultiTabs) or (not(tbNumber.Down or tbEnum.Down or tbBool.Down or tbChar.Down or tbFloat.Down or tbStruct.Down or tbPointer.Down or tbArray.Down)) then begin tbNumber.Down := tbNumber = Sender; tbEnum.Down := tbEnum = Sender; tbBool.Down := tbBool = Sender; tbChar.Down := tbChar = Sender; tbFloat.Down := tbFloat = Sender; tbStruct.Down := tbStruct = Sender; tbPointer.Down := tbPointer = Sender; tbArray.Down := tbArray = Sender; end; case FCurrentResDataType of rdkChar: tbCurrent.Down := tbChar.Down; rdkSignedNumVal: tbCurrent.Down := tbNumber.Down; rdkUnsignedNumVal: tbCurrent.Down := tbNumber.Down; rdkPointerVal: tbCurrent.Down := tbPointer.Down; rdkFloatVal: tbCurrent.Down := tbFloat.Down; rdkBool: tbCurrent.Down := tbBool.Down; rdkEnum: tbCurrent.Down := tbEnum.Down; rdkEnumVal: tbCurrent.Down := tbEnum.Down; rdkSet: tbCurrent.Down := tbEnum.Down; rdkStruct: tbCurrent.Down := tbStruct.Down; rdkArray: tbCurrent.Down := tbArray.Down; else tbCurrent.Down := False; end; if FShowAll then tbAll.Down := tbNumber.Down and tbEnum.Down and tbBool.Down and tbChar.Down and tbFloat.Down and tbStruct.Down and tbPointer.Down and tbArray.Down; finally FInButtonClick := False; end; UpdateDisplay; end; procedure TDisplayFormatFrame.tbIndentClick(Sender: TObject); begin if FInButtonClick then exit; FInButtonClick := True; try UpdateFormat; tbIndent.Down := True; tbCurrent.Down := False; tbAll.Down := False; tbNumber.Down := False; tbEnum.Down := False; tbBool.Down := False; tbChar.Down := False; tbFloat.Down := False; tbStruct.Down := False; tbPointer.Down := False; tbArray.Down := False; finally FInButtonClick := False; end; UpdateDisplay; end; procedure TDisplayFormatFrame.EnableParentOverride(c: TControl; AEnableVisible: Boolean); var pnl: TWinControl; i: Integer; begin if not ShowOverrideChecks then exit; inc(FUpdatingDisplay); try pnl := c.Parent; while (pnl.Parent <> self) do pnl := pnl.Parent; if (pnl = PanelNum2) and AEnableVisible then begin cbNum2Visibile.Tag := 0; cbNum2Visibile.Checked := True; end; for i := 0 to pnl.ControlCount-1 do if pnl.Controls[i] is TCheckBox then begin if TCheckBox(pnl.Controls[i]).State = cbUnchecked then TCheckBox(pnl.Controls[i]).Checked := True; exit; end; finally dec(FUpdatingDisplay); end; end; function TDisplayFormatFrame.GetDisplayFormat: TWatchDisplayFormat; begin UpdateFormat; Result := FDisplayFormat[0]; end; function TDisplayFormatFrame.GetDisplayFormats(AIndex: integer): TWatchDisplayFormat; begin UpdateFormat; Result := FDisplayFormat[AIndex]; end; procedure TDisplayFormatFrame.SetCurrentResDataType(AValue: TWatchResultDataKind); begin if FCurrentResDataType = AValue then Exit; FCurrentResDataType := AValue; UpdateDisplay; end; procedure TDisplayFormatFrame.SetDisplayFormat(ADispFormat: TWatchDisplayFormat); begin FDisplayFormatCount := 1; SetLength(FDisplayFormat, 1); FDisplayFormat[0] := ADispFormat; UpdateDisplay; end; procedure TDisplayFormatFrame.SetDisplayFormatCount(AValue: integer); var l, i: integer; begin if AValue < 1 then AValue := 1; if FDisplayFormatCount = AValue then Exit; FDisplayFormatCount := AValue; l := Length(FDisplayFormat); SetLength(FDisplayFormat, AValue); for i := l to AValue - 1 do FDisplayFormat[i] := DefaultWatchDisplayFormat; UpdateDisplay; end; procedure TDisplayFormatFrame.SetDisplayFormats(AIndex: integer; AValue: TWatchDisplayFormat); begin FDisplayFormat[AIndex] := AValue; UpdateDisplay; end; procedure TDisplayFormatFrame.SetHighlightModifiedTabs(AValue: boolean); begin if FHighlightModifiedTabs = AValue then Exit; FHighlightModifiedTabs := AValue; if not FHighlightModifiedTabs then UpdateTabs; end; procedure TDisplayFormatFrame.SetShowAll(AValue: boolean); begin if FShowAll = AValue then Exit; FShowAll := AValue; tbAll.Visible := AValue; ToolButton4.Visible := FShowCurrent; end; procedure TDisplayFormatFrame.SetShowArrayNavBarOpts(AValue: boolean); begin if FShowArrayNavBarOpts = AValue then Exit; FShowArrayNavBarOpts := AValue; end; procedure TDisplayFormatFrame.SetShowCurrent(AValue: boolean); begin if FShowCurrent = AValue then Exit; FShowCurrent := AValue; tbCurrent.Visible := FShowCurrent; ToolButton2.Visible := FShowCurrent; end; procedure TDisplayFormatFrame.SetShowExtraSettings(AValue: boolean); begin if FShowExtraSettings = AValue then Exit; FShowExtraSettings := AValue; end; procedure TDisplayFormatFrame.SetShowMemDump(AValue: boolean); begin if FShowMemDump = AValue then Exit; FShowMemDump := AValue; PanelMemDump.Visible := FShowMemDump; end; procedure TDisplayFormatFrame.SetShowMultiRadio(AValue: boolean); begin if FShowMultiRadio = AValue then Exit; FShowMultiRadio := AValue; end; procedure TDisplayFormatFrame.SetShowOverrideChecks(AValue: boolean); begin if FShowOverrideChecks = AValue then Exit; FShowOverrideChecks := AValue; cbOverrideNumBase.Visible := FShowOverrideChecks; cbOverrideNum2Base.Visible := FShowOverrideChecks; cbOverrideEnum.Visible := FShowOverrideChecks; cbOverrideEnumVal.Visible := FShowOverrideChecks; cbOverrideFloat.Visible := FShowOverrideChecks; cbOverrideStruct.Visible := FShowOverrideChecks; cbOverridePointerDeref.Visible := FShowOverrideChecks; cbOverrideAddressFormat.Visible := FShowOverrideChecks; cbOverrideIndent.Visible := FShowOverrideChecks; cbOverrideArray.Visible := FShowOverrideChecks; cbOverrideArrayNavBar.Visible := FShowOverrideChecks; end; procedure TDisplayFormatFrame.ClearRadios(APanel: TWinControl; ARecursive: Boolean; AnExcludeSelf: boolean); var i: Integer; begin for i := APanel.ControlCount - 1 downto 0 do begin if (APanel.Controls[i] is TRadioButton) and not AnExcludeSelf and (copy(APanel.Controls[i].Name, 1, 7) = 'rbClear') then TRadioButton(APanel.Controls[i]).Checked := True else if (APanel.Controls[i] is TRadioButton) and not AnExcludeSelf then begin TRadioButton(APanel.Controls[i]).Checked := False; TRadioButton(APanel.Controls[i]).HideMultiMarker; end; if ARecursive then begin if (APanel.Controls[i] is TCheckBox) and not AnExcludeSelf then TCheckBox(APanel.Controls[i]).Checked := False; if APanel.Controls[i] is TWinControl then ClearRadios(TWinControl(APanel.Controls[i]), True); end; end; end; procedure TDisplayFormatFrame.ApplyDispForm(APanel: TPanel; ADispForm: TValueDisplayFormats; AnRbOrder: TValueDisplayFormatArray); var i, j: Integer; begin ClearRadios(APanel); if IdeDebuggerDisplayFormats.DisplayFormatCount(ADispForm) = 1 then begin j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if AnRbOrder[j] in ADispForm then TRadioButton(APanel.Controls[i]).Checked := True; inc(j); if j >= Length(AnRbOrder) then break; end; end else if FShowMultiRadio then begin j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if AnRbOrder[j] in ADispForm then TRadioButton(APanel.Controls[i]).ShowMultiMarker else TRadioButton(APanel.Controls[i]).HideMultiMarker; inc(j); if j >= Length(AnRbOrder) then break; end; end; end; procedure TDisplayFormatFrame.ApplyDispForm(APanel: TPanel; ADispForm: TValueDisplayFormatHexSeperators; AnRbOrder: TValueDisplayFormatHexSeperatorArray); var i, j: Integer; begin ClearRadios(APanel); if HexSepCount(ADispForm) = 1 then begin j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if AnRbOrder[j] in ADispForm then TRadioButton(APanel.Controls[i]).Checked := True; inc(j); if j >= Length(AnRbOrder) then break; end; end else if FShowMultiRadio then begin j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if AnRbOrder[j] in ADispForm then TRadioButton(APanel.Controls[i]).ShowMultiMarker else TRadioButton(APanel.Controls[i]).HideMultiMarker; inc(j); if j >= Length(AnRbOrder) then break; end; end; end; procedure TDisplayFormatFrame.ApplyDispForm(APanel: TPanel; ADispForm: TValueDisplayFormatArrayTypes; AnRbOrder: TValueDisplayFormatArrayTypeArray); var i, j: Integer; begin ClearRadios(APanel); if LenCombineCount(ADispForm) = 1 then begin j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if AnRbOrder[j] in ADispForm then TRadioButton(APanel.Controls[i]).Checked := True; inc(j); if j >= Length(AnRbOrder) then break; end; end else if FShowMultiRadio then begin j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if AnRbOrder[j] in ADispForm then TRadioButton(APanel.Controls[i]).ShowMultiMarker else TRadioButton(APanel.Controls[i]).HideMultiMarker; inc(j); if j >= Length(AnRbOrder) then break; end; end; end; function TDisplayFormatFrame.ReadDispForm(APanel: TPanel; AnRbOrder: TValueDisplayFormatArray): TValueDisplayFormats; var i, j: Integer; begin Result := []; j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if TRadioButton(APanel.Controls[i]).Checked then include(Result, AnRbOrder[j]); inc(j); if j >= Length(AnRbOrder) then break; end end; function TDisplayFormatFrame.ReadDispForm(APanel: TPanel; AnRbOrder: TValueDisplayFormatHexSeperatorArray): TValueDisplayFormatHexSeperators; var i, j: Integer; begin Result := []; j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if TRadioButton(APanel.Controls[i]).Checked then include(Result, AnRbOrder[j]); inc(j); if j >= Length(AnRbOrder) then break; end end; function TDisplayFormatFrame.ReadDispForm(APanel: TPanel; AnRbOrder: TValueDisplayFormatArrayTypeArray): TValueDisplayFormatArrayTypes; var i, j: Integer; begin Result := []; j := 0; for i := 0 to APanel.ControlCount - 1 do begin if not (APanel.Controls[i] is TRadioButton) then continue; if TRadioButton(APanel.Controls[i]).Checked then include(Result, AnRbOrder[j]); inc(j); if j >= Length(AnRbOrder) then break; end end; function TDisplayFormatFrame.BtnDownCount: integer; var i: TFmtButtons; begin Result := 0; for i := low(TFmtButtons) to high(TFmtButtons) do if FButtonStates[i] then inc(Result); end; procedure TDisplayFormatFrame.UpdateButtonStates; begin FButtonStates[bsNum] := tbNumber.Down; FButtonStates[bsEnum] := tbEnum.Down; FButtonStates[bsBool] := tbBool.Down; FButtonStates[bsChar] := tbChar.Down; FButtonStates[bsFloat] := tbFloat.Down; FButtonStates[bsStruct] := tbStruct.Down; FButtonStates[bsPtr] := tbPointer.Down; FButtonStates[bsArray] := tbArray.Down; FButtonStates[bsIndent] := tbIndent.Down; end; procedure TDisplayFormatFrame.UpdateVisiblePanels; var CaptDivEnum, CaptRbEnumName: String; CheckAddrFormatVis, ArrayOnly: Boolean; begin CheckAddrFormatVis := (tbPointer.Down or tbStruct.Down) and (tbNumber.Down or tbEnum.Down or tbBool.Down or tbChar.Down or tbFloat.Down or tbArray.Down) and // any other (not FShowFullAddressInMulti); ArrayOnly := tbArray.Down and not(tbPointer.Down or tbStruct.Down or tbNumber.Down or tbEnum.Down or tbBool.Down or tbChar.Down or tbFloat.Down); // any other PanelNum.Visible := tbNumber.Down; PanelNum2.Visible := tbNumber.Down; PanelEnum.Visible := tbEnum.Down or tbBool.Down or tbChar.Down; PanelEnumVal.Visible := FShowExtraSettings and tbEnum.Down and not(tbNumber.Down or tbFloat.Down or tbStruct.Down or tbPointer.Down); PanelFloat.Visible := tbFloat.Down; PanelStruct.Visible := tbStruct.Down; PanelPointer.Visible := tbPointer.Down; PanelAddressFormat.Visible := (tbPointer.Down or tbStruct.Down) and (not CheckAddrFormatVis); PanelArray.Visible := tbArray.Down; PanelArrayPrefixCombine.Visible := ArrayOnly; PanelArrayHideLen.Visible := ArrayOnly; PanelArrayNavBar.Visible := ArrayOnly and FShowArrayNavBarOpts; PanelIndent.Visible := tbIndent.Down; lbStructAddrTypedFiller.Visible := CheckAddrFormatVis; cbStructAddrTyped.Visible := CheckAddrFormatVis; cbPointerAddrTyped.Visible := CheckAddrFormatVis; CaptRbEnumName := ''; CaptDivEnum := ''; if FButtonStates[bsEnum] then begin CaptDivEnum := DispFormatGroupEnum; CaptRbEnumName := DispFormatEnumName; end; if FButtonStates[bsBool] then begin AddToStr(CaptDivEnum, DispFormatGroupBool, ', '); AddToStr(CaptRbEnumName, DispFormatBoolName, '/'); end; if FButtonStates[bsChar] then begin AddToStr(CaptDivEnum, DispFormatGroupChar, ', '); AddToStr(CaptRbEnumName, DispFormatCharLetter, '/'); end; if rbEnumName.Caption <> CaptRbEnumName then begin rbEnumName.Caption := CaptRbEnumName; rbEnumName.Constraints.MinWidth := 0; end; lbOverrideEnum.Caption := CaptDivEnum; if FButtonStates[bsStruct] and FButtonStates[bsPtr] then lbOverrideAddressFormat.Caption := {DispFormatDlgBtnAdrFormat+ ': ' +} DispFormatDlgBtnStruct + ', ' + DispFormatDlgBtnPointer else lbOverrideAddressFormat.Caption := DispFormatDlgBtnAdrFormat; end; procedure TDisplayFormatFrame.UpdateNumDigitPanel; var d: TValueDisplayFormats; FormatNumDigits, i: integer; begin PanelNumDigits.Enabled := (cbOverrideNumBase.State <> cbUnchecked) or ShowOverrideChecks; d := ReadDispForm(PanelNumBase, RBA_Num); PanelNumSign.Enabled := d <> [vdfBaseChar]; PanelNumDigits.Enabled := d <> [vdfBaseChar]; if vdfBaseBin in d then SpinDigits.MaxValue := 64 else if vdfBaseOct in d then SpinDigits.MaxValue := 22 else if vdfBaseDecimal in d then SpinDigits.MaxValue := 20 else SpinDigits.MaxValue := 16; if SpinDigits.Tag = 0 then begin FormatNumDigits := MULTIOPT_INT_UNK; for i := 0 to FDisplayFormatCount - 1 do UpdateIntSetting(FormatNumDigits, FDisplayFormat[i].Num.MinDigits[FDisplayFormat[i].Num.BaseFormat]); IntToSpinEdit(SpinDigits, FormatNumDigits); end; lbNumSepGroup.Visible := (d * [vdfBaseHex, vdfBaseBin] = d) and (d <> []); PanelNumSepGroup.Visible := (d * [vdfBaseHex, vdfBaseBin] = d) and (d <> []); cbNumSeparator.Enabled := d = [vdfBaseDecimal]; cbNumSeparator.Visible := not lbNumSepGroup.Visible; end; procedure TDisplayFormatFrame.UpdateNum2Visibility; begin PanelNum2All.Visible := ( (BtnDownCount = 1) and (FButtonStates[bsNum]) ) or ( ((cbOverrideNum2Base.State <> cbUnchecked) or (not ShowOverrideChecks)) and (cbNum2Visibile.State <> cbUnchecked) ); end; procedure TDisplayFormatFrame.UpdateNum2DigitPanel; var d: TValueDisplayFormats; FormatNumDigits: LongInt; i: Integer; begin PanelNum2Digits.Enabled := (cbOverrideNum2Base.State <> cbUnchecked) or ShowOverrideChecks; d := ReadDispForm(PanelNum2Base, RBA_Num); PanelNum2Sign.Enabled := d <> [vdfBaseChar]; PanelNum2Digits.Enabled := d <> [vdfBaseChar]; if vdfBaseBin in d then Spin2Digits.MaxValue := 64 else if vdfBaseOct in d then Spin2Digits.MaxValue := 22 else if vdfBaseDecimal in d then Spin2Digits.MaxValue := 20 else Spin2Digits.MaxValue := 16; if Spin2Digits.Tag = 0 then begin FormatNumDigits := MULTIOPT_INT_UNK; for i := 0 to FDisplayFormatCount - 1 do UpdateIntSetting(FormatNumDigits, FDisplayFormat[i].Num2.MinDigits[FDisplayFormat[i].Num2.BaseFormat]); IntToSpinEdit(Spin2Digits, FormatNumDigits); end; lbNum2SepGroup.Visible := (d * [vdfBaseHex, vdfBaseBin] = d) and (d <> []); PanelNum2SepGroup.Visible := (d * [vdfBaseHex, vdfBaseBin] = d) and (d <> []); cbNum2Separator.Enabled := d = [vdfBaseDecimal]; cbNum2Separator.Visible := not lbNum2SepGroup.Visible; end; procedure TDisplayFormatFrame.UpdateFormatOverrides; var i: Integer; begin if not ShowOverrideChecks then exit; for i := 0 to FDisplayFormatCount - 1 do begin if FButtonStates[bsNum] then begin BoolFromCBState(cbOverrideNumBase.State, FDisplayFormat[i].Num.UseInherited); BoolFromCBState(cbOverrideNum2Base.State, FDisplayFormat[i].Num2.UseInherited); end; if FButtonStates[bsEnum] then begin BoolFromCBState(cbOverrideEnum.State, FDisplayFormat[i].Enum.UseInherited); if PanelEnumVal.Visible then BoolFromCBState(cbOverrideEnumVal.State, FDisplayFormat[i].EnumVal.UseInherited); end; if FButtonStates[bsBool] then begin BoolFromCBState(cbOverrideEnum.State, FDisplayFormat[i].Bool.UseInherited); end; if FButtonStates[bsChar] then begin BoolFromCBState(cbOverrideEnum.State, FDisplayFormat[i].Char.UseInherited); end; if FButtonStates[bsFloat] then begin BoolFromCBState(cbOverrideFloat.State, FDisplayFormat[i].Float.UseInherited); end; if FButtonStates[bsStruct] then begin BoolFromCBState(cbOverrideStruct.State, FDisplayFormat[i].Struct.UseInherited); if cbStructAddrTyped.Visible then begin if cbStructAddrTyped.State <> cbGrayed then FDisplayFormat[i].Struct.Address.UseInherited := False; end else BoolFromCBState(cbOverrideAddressFormat.State, FDisplayFormat[i].Struct.Address.UseInherited); end; if FButtonStates[bsPtr] then begin BoolFromCBState(cbOverridePointerDeref.State, FDisplayFormat[i].Pointer.UseInherited); if cbPointerAddrTyped.Visible then begin if cbPointerAddrTyped.State <> cbGrayed then FDisplayFormat[i].Pointer.Address.UseInherited := False; end else BoolFromCBState(cbOverrideAddressFormat.State, FDisplayFormat[i].Pointer.Address.UseInherited); end; if FButtonStates[bsArray] then begin BoolFromCBState(cbOverrideArray.State, FDisplayFormat[i].ArrayLen.UseInherited); if FShowArrayNavBarOpts then BoolFromCBState(cbOverrideArrayNavBar.State, FDisplayFormat[i].ArrayNavBar.UseInherited); end; if FButtonStates[bsIndent] then begin BoolFromCBState(cbOverrideIndent.State, FDisplayFormat[i].MultiLine.UseInherited); end; end; end; procedure TDisplayFormatFrame.UpdateFormat; procedure SpinToValue(ASpinEdit: TSpinEdit; var AValue: integer); begin if (ASpinEdit.Tag = 0) then AValue := ASpinEdit.Value; end; var d: TValueDisplayFormat; ds: TValueDisplayFormats; g: TValueDisplayFormatHexSeperator; gs: TValueDisplayFormatHexSeperators; i: Integer; als: TValueDisplayFormatArrayTypes; al: TValueDisplayFormatArrayType; begin UpdateFormatOverrides; for i := 0 to FDisplayFormatCount - 1 do begin if FButtonStates[bsNum] then begin // Primary format // first values that depend on OLD base if (FDisplayFormat[i].Num.BaseFormat = vdfBaseDecimal) then BoolFromCB(cbNumSeparator, FDisplayFormat[i].Num.SeparatorDec, False); if (FDisplayFormat[i].Num.BaseFormat in [vdfBaseHex, vdfBaseBin]) then begin gs := ReadDispForm(PanelNumSepGroup, RBA_Group); if HexSepCount(gs) = 1 then for g := low(TValueDisplayFormatHexSeperator) to high(TValueDisplayFormatHexSeperator) do if g in gs then FDisplayFormat[i].Num.SeparatorHexBin := g; end; if (FDisplayFormat[i].Num.BaseFormat <> vdfBaseChar) then SpinToValue(SpinDigits, FDisplayFormat[i].Num.MinDigits[FDisplayFormat[i].Num.BaseFormat]); ds := ReadDispForm(PanelNumBase, RBA_Num); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatBase) to high(TValueDisplayFormatBase) do if d in ds then FDisplayFormat[i].Num.BaseFormat := d; ds := ReadDispForm(PanelNumSign, RBA_Sign); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatSign) to high(TValueDisplayFormatSign) do if d in ds then FDisplayFormat[i].Num.SignFormat := d; // 2nd format if PanelNum2All.Visible then begin // first values that depend on OLD base if (FDisplayFormat[i].Num2.BaseFormat = vdfBaseDecimal) then BoolFromCB(cbNum2Separator, FDisplayFormat[i].Num2.SeparatorDec, False); if (FDisplayFormat[i].Num2.BaseFormat in [vdfBaseHex, vdfBaseBin]) then begin gs := ReadDispForm(PanelNum2SepGroup, RBA_Group); if HexSepCount(gs) = 1 then for g := low(TValueDisplayFormatHexSeperator) to high(TValueDisplayFormatHexSeperator) do if g in gs then FDisplayFormat[i].Num2.SeparatorHexBin := g; end; if (FDisplayFormat[i].Num2.BaseFormat <> vdfBaseChar) then SpinToValue(Spin2Digits, FDisplayFormat[i].Num2.MinDigits[FDisplayFormat[i].Num2.BaseFormat]); ds := ReadDispForm(PanelNum2Base, RBA_Num); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatBase) to high(TValueDisplayFormatBase) do if d in ds then FDisplayFormat[i].Num2.BaseFormat := d; ds := ReadDispForm(PanelNum2Sign, RBA_Sign); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatSign) to high(TValueDisplayFormatSign) do if d in ds then FDisplayFormat[i].Num2.SignFormat := d; end; BoolFromCB(cbNum2Visibile, FDisplayFormat[i].Num2.Visible, False); end; if FButtonStates[bsEnum] then begin ds := ReadDispForm(PanelEnumRb1, RBA_Enum); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatEnum) to high(TValueDisplayFormatEnum) do if d in ds then FDisplayFormat[i].Enum.MainFormat := d; ds := ReadDispForm(PanelENumBase, RBA_Num); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatBase) to high(TValueDisplayFormatBase) do if d in ds then FDisplayFormat[i].Enum.BaseFormat := d; if cbEnumSign.Tag = 0 then case cbEnumSign.State of cbUnchecked: FDisplayFormat[i].Enum.SignFormat := vdfSignAuto; cbChecked: FDisplayFormat[i].Enum.SignFormat := vdfSignUnsigned; end; if FShowExtraSettings then begin ds := ReadDispForm(PanelEnumValRb, RBA_Enum); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatEnum) to high(TValueDisplayFormatEnum) do if d in ds then FDisplayFormat[i].EnumVal.MainFormat := d; ds := ReadDispForm(PanelENumValBase, RBA_Num); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatBase) to high(TValueDisplayFormatBase) do if d in ds then FDisplayFormat[i].EnumVal.BaseFormat := d; if cbEnumValSign.Tag = 0 then case cbEnumValSign.State of cbUnchecked: FDisplayFormat[i].EnumVal.SignFormat := vdfSignAuto; cbChecked: FDisplayFormat[i].EnumVal.SignFormat := vdfSignUnsigned; end; end; end; if FButtonStates[bsBool] then begin ds := ReadDispForm(PanelEnumRb1, RBA_Enum); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatEnum) to high(TValueDisplayFormatEnum) do if d in ds then FDisplayFormat[i].Bool.MainFormat := FormatEnumToBool[d]; ds := ReadDispForm(PanelENumBase, RBA_Num); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatBase) to high(TValueDisplayFormatBase) do if d in ds then FDisplayFormat[i].Bool.BaseFormat := d; if cbEnumSign.Tag = 0 then case cbEnumSign.State of cbUnchecked: FDisplayFormat[i].Bool.SignFormat := vdfSignAuto; cbChecked: FDisplayFormat[i].Bool.SignFormat := vdfSignUnsigned; end; end; if FButtonStates[bsChar] then begin ds := ReadDispForm(PanelEnumRb1, RBA_Enum); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatEnum) to high(TValueDisplayFormatEnum) do if d in ds then FDisplayFormat[i].Char.MainFormat := FormatEnumToChar[d]; ds := ReadDispForm(PanelENumBase, RBA_Num); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatBase) to high(TValueDisplayFormatBase) do if d in ds then FDisplayFormat[i].Char.BaseFormat := d; if cbEnumSign.Tag = 0 then case cbEnumSign.State of cbUnchecked: FDisplayFormat[i].Char.SignFormat := vdfSignAuto; cbChecked: FDisplayFormat[i].Char.SignFormat := vdfSignUnsigned; end; end; if FButtonStates[bsFloat] then begin ds := ReadDispForm(PanelFloatRb, RBA_Float); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatFloat) to high(TValueDisplayFormatFloat) do if d in ds then FDisplayFormat[i].Float.NumFormat := d; SpinToValue(SpinFloatDigits, FDisplayFormat[i].Float.Precission); end; if FButtonStates[bsStruct] then begin ds := ReadDispForm(PanelStructFld, RBA_StructVal); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatStruct) to high(TValueDisplayFormatStruct) do if d in ds then FDisplayFormat[i].Struct.DataFormat := d; ds := ReadDispForm(PanelStructPointer, RBA_StructPtr); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatStructPointer) to high(TValueDisplayFormatStructPointer) do if d in ds then FDisplayFormat[i].Struct.ShowPointerFormat := d; if cbStructAddrTyped.Visible then begin case cbStructAddrTyped.State of cbUnchecked: FDisplayFormat[i].Struct.Address.TypeFormat := vdfAddressPlain; cbChecked: FDisplayFormat[i].Struct.Address.TypeFormat := vdfAddressTyped; end; end else begin ds := ReadDispForm(PanelAddressType, RBA_Addr); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatAddress) to high(TValueDisplayFormatAddress) do if d in ds then FDisplayFormat[i].Struct.Address.TypeFormat := d; ds := ReadDispForm(PanelAddressBase, RBA_AddrNum); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatBase) to high(TValueDisplayFormatBase) do if d in ds then FDisplayFormat[i].Struct.Address.BaseFormat := d; BoolFromCB(cbAddrSign, FDisplayFormat[i].Struct.Address.Signed, False); BoolFromCB(cbAddrNoLeadZero, FDisplayFormat[i].Struct.Address.NoLeadZero, False); end; end; if FButtonStates[bsPtr] then begin ds := ReadDispForm(PanelPointerDeref, RBA_PtrDeref); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatPointerDeref) to high(TValueDisplayFormatPointerDeref) do if d in ds then FDisplayFormat[i].Pointer.DerefFormat := d; if cbPointerAddrTyped.Visible then begin case cbPointerAddrTyped.State of cbUnchecked: FDisplayFormat[i].Pointer.Address.TypeFormat := vdfAddressPlain; cbChecked: FDisplayFormat[i].Pointer.Address.TypeFormat := vdfAddressTyped; end; end else begin ds := ReadDispForm(PanelAddressType, RBA_Addr); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatAddress) to high(TValueDisplayFormatAddress) do if d in ds then FDisplayFormat[i].Pointer.Address.TypeFormat := d; ds := ReadDispForm(PanelAddressBase, RBA_AddrNum); if IdeDebuggerDisplayFormats.DisplayFormatCount(ds) = 1 then for d := low(TValueDisplayFormatBase) to high(TValueDisplayFormatBase) do if d in ds then FDisplayFormat[i].Pointer.Address.BaseFormat := d; BoolFromCB(cbAddrSign, FDisplayFormat[i].Pointer.Address.Signed, False); BoolFromCB(cbAddrNoLeadZero, FDisplayFormat[i].Pointer.Address.NoLeadZero, False); end; end; if FButtonStates[bsArray] then begin BoolFromCB(cbArrayShowPrefix, FDisplayFormat[i].ArrayLen.ShowLenPrefix, False); BoolFromCB(cbArrayShowPrefixEmbedded, FDisplayFormat[i].ArrayLen.ShowLenPrefixEmbedded, False); SpinToValue(spinArrayLenMaxNest, FDisplayFormat[i].ArrayLen.LenPrefixMaxNest); BoolFromCB(cbArrayHideLen, FDisplayFormat[i].ArrayLen.HideLen, False); SpinToValue(spinArrayHideLenIfLess, FDisplayFormat[i].ArrayLen.HideLenThresholdCnt); SpinToValue(spinArrayHideLenRevDepth, FDisplayFormat[i].ArrayLen.HideLenKeepDepth); SpinToValue(spinArrayHideLenThresEach, FDisplayFormat[i].ArrayLen.HideLenThresholdEach); SpinToValue(spinArrayHideLenThresLen, FDisplayFormat[i].ArrayLen.HideLenThresholdLen); als := ReadDispForm(PanelArrayPrefixCombine, RBA_ArrayCombine); if LenCombineCount(als) = 1 then for al := low(TValueDisplayFormatArrayType) to high(TValueDisplayFormatArrayType) do if al in als then FDisplayFormat[i].ArrayLen.LenPrefixCombine := al; if FShowArrayNavBarOpts then begin BoolFromCB(cbArrayNavAutoHide, FDisplayFormat[i].ArrayNavBar.AutoHideNavBar, False); BoolFromCB(cbArrayNavEnforceBounds, FDisplayFormat[i].ArrayNavBar.EnforceBounds, False); SpinToValue(SpinPageSize, FDisplayFormat[i].ArrayNavBar.PageSize); end; end; if FButtonStates[bsIndent] then begin SpinToValue(SpinIndentMaxWrap, FDisplayFormat[i].MultiLine.MaxMultiLineDepth); BoolFromCB(cbForceSingleLine, FDisplayFormat[i].MultiLine.ForceSingleLine, False); SpinToValue(spinForceSingleLineRevDepth, FDisplayFormat[i].MultiLine.ForceSingleLineThresholdStructFld); SpinToValue(spinForceSingleLineArrayLen, FDisplayFormat[i].MultiLine.ForceSingleLineThresholdArrayLen); SpinToValue(spinForceSingleLineArrayLen, FDisplayFormat[i].MultiLine.ForceSingleLineReverseDepth); SpinToValue(spinForceSingleLineEach, FDisplayFormat[i].MultiLine.ForceSingleLineThresholdEach); SpinToValue(spinForceSingleLineLen, FDisplayFormat[i].MultiLine.ForceSingleLineThresholdLen); end; BoolFromCBState(cbMemDump.State, FDisplayFormat[i].MemDump, False); end; end; procedure TDisplayFormatFrame.UpdateConstraints; var i, px, py: Integer; c: TControl; begin if not (HandleAllocated and FSetupDone) then exit; DisableAutoSizing; try for i := 0 to ComponentCount - 1 do begin if (not (Components[i] is TControl)) then Continue; c := TControl(Components[i]); if (not ((c is TCheckBox) or (c is TRadioButton) or (c is TLabel) or (c is TCustomEdit))) or (Trim(c.Caption) = '') or (not c.IsVisible) or (c.Constraints.MinWidth > 0) or ((c is TLabel) and (TLabel(c).WordWrap)) then Continue; px := 0; py := 0; if c is TWinControl then TWinControl(c).Handle; c.InvalidatePreferredSize; c.GetPreferredSize(px, py); if (px > c.Constraints.MinWidth) and ((c.Constraints.MaxWidth = 0) or (px < c.Constraints.MaxWidth)) then c.Constraints.MinWidth := px; end; finally EnableAutoSizing; end; end; procedure TDisplayFormatFrame.CreateHandle; begin inc(FUpdatingDisplay); // gtk2 send extra events try inherited; finally dec(FUpdatingDisplay); end; UpdateConstraints; UpdateDisplay; end; procedure TDisplayFormatFrame.UpdateDisplay; procedure SetCheckBoxToInherit(ACheckBox: TCheckBox); begin ACheckBox.State := cbUnchecked; ACheckBox.Tag := 1; end; procedure SetCheckBoxState(ACheckBox: TCheckBox; AValue: TBoolSet; ARevert: boolean = True); begin ACheckBox.State := BoolsetToCBState(AValue, ARevert); ACheckBox.Tag := 0; end; var InherhitNum, InherhitNum2, InherhitEnum, InherhitEnumVal, InherhitFloat, InherhitStruct, InherhitPtr, InherhitAddress, InherhitIndent, InherhitArrayLen, InherhitArrayNav: TBoolSet; FormatNumBase: TValueDisplayFormats; FormatNumSign: TValueDisplayFormats; FormatNumSep: TBoolSet; FormatNumGroup: TValueDisplayFormatHexSeperators; FormatNum2Visible: TBoolSet; FormatNum2Base: TValueDisplayFormats; FormatNum2Sign: TValueDisplayFormats; FormatNum2Sep: TBoolSet; FormatNum2Group: TValueDisplayFormatHexSeperators; FormatEnum: TValueDisplayFormats; FormatEnumBase: TValueDisplayFormats; FormatEnumSign: TBoolSet; FormatEnumVal: TValueDisplayFormats; FormatEnumValBase: TValueDisplayFormats; FormatEnumValSign: TBoolSet; FormatFloat: TValueDisplayFormats; FormatFloatPrec: integer; FormatStruct: TValueDisplayFormats; FormatStructPointer: TValueDisplayFormats; FormatPointerDeref: TValueDisplayFormats; FormatAddress: TValueDisplayFormats; FormatAddressStr_Ty: TBoolSet; FormatAddressPtr_Ty: TBoolSet; FormatAddressBase: TValueDisplayFormats; FormatAddressSign: TBoolSet; FormatAddressLead: TBoolSet; FormatArrayShowLen: TBoolSet; FormatArrayShowLenEmbedded: TBoolSet; FormatArrayLenMaxNest: integer; FormatArrayLenCombine: TValueDisplayFormatArrayTypes; FormatHideLen: TBoolSet; FormatHideLenThresholdCnt: integer; FormatHideLenReverseDepth: integer; FormatHideLenThresholdEach: integer; FormatHideLenThresholdFullLen:integer; FormatArrayNavAutoHide: TBoolSet; FormatArrayNavForceBounds: TBoolSet; FormatPageSize: integer; FormatIndentMaxWrap: integer; FormatForceSingleLine: TBoolSet; FormatForceSingleLineThresholdStructFld: integer; FormatForceSingleLineThresholdArrayLen: integer; FormatForceSingleLineReverseDepth: integer; FormatForceSingleLineThresholdEach: integer; FormatForceSingleLineThresholdLen: integer; FormatIsMemDump: TBoolSet; i: Integer; begin if FUpdateCount > 0 then begin FNeedUpdateDisplay := True; exit; end; inc(FUpdatingDisplay); UpdateButtonStates; DisableAutoSizing; try UpdateTabs; UpdateVisiblePanels; InherhitNum := []; InherhitNum2 := []; InherhitEnum := []; InherhitEnumVal := []; InherhitFloat := []; InherhitStruct := []; InherhitPtr := []; InherhitAddress := []; InherhitArrayLen:= []; InherhitArrayNav:= []; InherhitIndent := []; FormatNumBase := []; FormatNumSign := []; FormatNumSep := []; FormatNumGroup := []; FormatNum2Visible := []; FormatNum2Base := []; FormatNum2Sign := []; FormatNum2Sep := []; FormatNum2Group := []; FormatEnum := []; FormatENumBase := []; FormatENumSign := []; FormatEnumVal := []; FormatENumValBase := []; FormatENumValSign := []; FormatFloat := []; FormatFloatPrec := MULTIOPT_INT_UNK; FormatStruct := []; FormatStructPointer := []; FormatPointerDeref := []; FormatAddress := []; FormatAddressStr_Ty := []; FormatAddressPtr_Ty := []; FormatAddressBase := []; FormatAddressSign := []; FormatAddressLead := []; FormatArrayShowLen := []; FormatArrayShowLenEmbedded := []; FormatArrayLenMaxNest := MULTIOPT_INT_UNK; FormatArrayLenCombine := []; FormatHideLen := []; FormatHideLenReverseDepth := MULTIOPT_INT_UNK; FormatHideLenThresholdCnt := MULTIOPT_INT_UNK; FormatHideLenThresholdEach := MULTIOPT_INT_UNK; FormatHideLenThresholdFullLen := MULTIOPT_INT_UNK; FormatArrayNavAutoHide := []; FormatArrayNavForceBounds := []; FormatPageSize:= MULTIOPT_INT_UNK; FormatIndentMaxWrap := MULTIOPT_INT_UNK; FormatForceSingleLine := []; FormatForceSingleLineThresholdStructFld := MULTIOPT_INT_UNK; FormatForceSingleLineThresholdArrayLen := MULTIOPT_INT_UNK; FormatForceSingleLineReverseDepth := MULTIOPT_INT_UNK; FormatForceSingleLineThresholdEach := MULTIOPT_INT_UNK; FormatForceSingleLineThresholdLen := MULTIOPT_INT_UNK; FormatIsMemDump := []; for i := 0 to FDisplayFormatCount - 1 do begin FormatIsMemDump := FormatIsMemDump + [boolean(FDisplayFormat[i].MemDump)]; if FButtonStates[bsNum] then begin include(InherhitNum, FDisplayFormat[i].Num.UseInherited); if (not FDisplayFormat[i].Num.UseInherited) or (not ShowOverrideChecks) then begin include(FormatNumBase, FDisplayFormat[i].Num.BaseFormat); include(FormatNumSign, FDisplayFormat[i].Num.SignFormat); include(FormatNumSep, FDisplayFormat[i].Num.SeparatorDec); include(FormatNumGroup, FDisplayFormat[i].Num.SeparatorHexBin); end; include(InherhitNum2, FDisplayFormat[i].Num2.UseInherited); if (not FDisplayFormat[i].Num2.UseInherited) or (not ShowOverrideChecks) then begin include(FormatNum2Visible, FDisplayFormat[i].Num2.Visible); include(FormatNum2Base, FDisplayFormat[i].Num2.BaseFormat); include(FormatNum2Sign, FDisplayFormat[i].Num2.SignFormat); include(FormatNum2Sep, FDisplayFormat[i].Num2.SeparatorDec); include(FormatNum2Group, FDisplayFormat[i].Num2.SeparatorHexBin); end; end; if FButtonStates[bsEnum] then begin include(InherhitEnum, FDisplayFormat[i].Enum.UseInherited); if (not FDisplayFormat[i].Enum.UseInherited) or (not ShowOverrideChecks) then begin include(FormatEnum, FDisplayFormat[i].Enum.MainFormat); include(FormatEnumBase, FDisplayFormat[i].Enum.BaseFormat); include(FormatEnumSign, FDisplayFormat[i].Enum.SignFormat = vdfSignUnsigned); end; include(InherhitEnumVal, FDisplayFormat[i].EnumVal.UseInherited); if (not FDisplayFormat[i].EnumVal.UseInherited) or (not ShowOverrideChecks) then begin include(FormatEnumVal, FDisplayFormat[i].EnumVal.MainFormat); include(FormatEnumValBase, FDisplayFormat[i].EnumVal.BaseFormat); include(FormatEnumValSign, FDisplayFormat[i].EnumVal.SignFormat = vdfSignUnsigned); end; end; if FButtonStates[bsBool] then begin include(InherhitEnum, FDisplayFormat[i].Bool.UseInherited); if (not FDisplayFormat[i].Bool.UseInherited) or (not ShowOverrideChecks) then begin include(FormatEnum, FormatBoolToEnum[FDisplayFormat[i].Bool.MainFormat]); include(FormatEnumBase, FDisplayFormat[i].Bool.BaseFormat); include(FormatEnumSign, FDisplayFormat[i].Bool.SignFormat = vdfSignUnsigned); end; end; if FButtonStates[bsChar] then begin include(InherhitEnum, FDisplayFormat[i].Char.UseInherited); if (not FDisplayFormat[i].Char.UseInherited) or (not ShowOverrideChecks) then begin include(FormatEnum, FormatCharToEnum[FDisplayFormat[i].Char.MainFormat]); include(FormatEnumBase, FDisplayFormat[i].Char.BaseFormat); include(FormatEnumSign, FDisplayFormat[i].Char.SignFormat = vdfSignUnsigned); end; end; if FButtonStates[bsFloat] then begin include(InherhitFloat, FDisplayFormat[i].Float.UseInherited); if (not FDisplayFormat[i].Float.UseInherited) or (not ShowOverrideChecks) then begin include(FormatFloat, FDisplayFormat[i].Float.NumFormat); UpdateIntSetting(FormatFloatPrec, FDisplayFormat[i].Float.Precission); end; end; if FButtonStates[bsStruct] then begin include(InherhitStruct, FDisplayFormat[i].Struct.UseInherited); if (not FDisplayFormat[i].Struct.UseInherited) or (not ShowOverrideChecks) then begin include(FormatStruct, FDisplayFormat[i].Struct.DataFormat); include(FormatStructPointer, FDisplayFormat[i].Struct.ShowPointerFormat); end; include(InherhitAddress, FDisplayFormat[i].Struct.Address.UseInherited); if (not FDisplayFormat[i].Struct.Address.UseInherited) or (not ShowOverrideChecks) then begin include(FormatAddress, FDisplayFormat[i].Struct.Address.TypeFormat); include(FormatAddressStr_Ty, FDisplayFormat[i].Struct.Address.TypeFormat = vdfAddressTyped); include(FormatAddressBase, FDisplayFormat[i].Struct.Address.BaseFormat); include(FormatAddressSign, FDisplayFormat[i].Struct.Address.Signed); include(FormatAddressLead, FDisplayFormat[i].Struct.Address.NoLeadZero); end else if (FDisplayFormat[i].Struct.Address.UseInherited) then FormatAddressStr_Ty := [True, False]; end; if FButtonStates[bsPtr] then begin include(InherhitPtr, FDisplayFormat[i].Pointer.UseInherited); if (not FDisplayFormat[i].Pointer.UseInherited) or (not ShowOverrideChecks) then begin include(FormatPointerDeref, FDisplayFormat[i].Pointer.DerefFormat); end; include(InherhitAddress, FDisplayFormat[i].Pointer.Address.UseInherited); if (not FDisplayFormat[i].Pointer.Address.UseInherited) or (not ShowOverrideChecks) then begin include(FormatAddress, FDisplayFormat[i].Pointer.Address.TypeFormat); include(FormatAddressPtr_Ty, FDisplayFormat[i].Pointer.Address.TypeFormat = vdfAddressTyped); include(FormatAddressBase, FDisplayFormat[i].Pointer.Address.BaseFormat); include(FormatAddressSign, FDisplayFormat[i].Pointer.Address.Signed); include(FormatAddressLead, FDisplayFormat[i].Pointer.Address.NoLeadZero); end else if (FDisplayFormat[i].Pointer.Address.UseInherited) then FormatAddressPtr_Ty := [True, False]; end; if FButtonStates[bsArray] then begin include(InherhitArrayLen, FDisplayFormat[i].ArrayLen.UseInherited); if (not FDisplayFormat[i].ArrayLen.UseInherited) or (not ShowOverrideChecks) then begin include(FormatArrayShowLen, FDisplayFormat[i].ArrayLen.ShowLenPrefix); include(FormatArrayShowLenEmbedded, FDisplayFormat[i].ArrayLen.ShowLenPrefixEmbedded); UpdateIntSetting(FormatArrayLenMaxNest, FDisplayFormat[i].ArrayLen.LenPrefixMaxNest); include(FormatArrayLenCombine, FDisplayFormat[i].ArrayLen.LenPrefixCombine); include(FormatHideLen, FDisplayFormat[i].ArrayLen.HideLen); UpdateIntSetting(FormatHideLenReverseDepth, FDisplayFormat[i].ArrayLen.HideLenKeepDepth ); UpdateIntSetting(FormatHideLenThresholdCnt, FDisplayFormat[i].ArrayLen.HideLenThresholdCnt ); UpdateIntSetting(FormatHideLenThresholdEach, FDisplayFormat[i].ArrayLen.HideLenThresholdEach ); UpdateIntSetting(FormatHideLenThresholdFullLen, FDisplayFormat[i].ArrayLen.HideLenThresholdLen); end; include(InherhitArrayNav, FDisplayFormat[i].ArrayNavBar.UseInherited); if (not FDisplayFormat[i].ArrayNavBar.UseInherited) or (not ShowOverrideChecks) then begin include(FormatArrayNavAutoHide, FDisplayFormat[i].ArrayNavBar.AutoHideNavBar); include(FormatArrayNavForceBounds, FDisplayFormat[i].ArrayNavBar.EnforceBounds); UpdateIntSetting(FormatPageSize, FDisplayFormat[i].ArrayNavBar.PageSize); end; end; if FButtonStates[bsIndent] then begin include(InherhitIndent, FDisplayFormat[i].MultiLine.UseInherited); if (not FDisplayFormat[i].MultiLine.UseInherited) or (not ShowOverrideChecks) then begin include(FormatForceSingleLine, FDisplayFormat[i].MultiLine.ForceSingleLine); UpdateIntSetting(FormatIndentMaxWrap, FDisplayFormat[i].MultiLine.MaxMultiLineDepth); UpdateIntSetting(FormatForceSingleLineThresholdStructFld, FDisplayFormat[i].MultiLine.ForceSingleLineThresholdStructFld); UpdateIntSetting(FormatForceSingleLineThresholdArrayLen, FDisplayFormat[i].MultiLine.ForceSingleLineThresholdArrayLen); UpdateIntSetting(FormatForceSingleLineReverseDepth, FDisplayFormat[i].MultiLine.ForceSingleLineReverseDepth ); UpdateIntSetting(FormatForceSingleLineThresholdEach, FDisplayFormat[i].MultiLine.ForceSingleLineThresholdEach ); UpdateIntSetting(FormatForceSingleLineThresholdLen, FDisplayFormat[i].MultiLine.ForceSingleLineThresholdLen ); end; end; end; if ShowOverrideChecks then begin cbOverrideNumBase.State := BoolsetToCBState(InherhitNum); cbOverrideNum2Base.State := BoolsetToCBState(InherhitNum2); cbOverrideEnum.State := BoolsetToCBState(InherhitEnum); cbOverrideEnumVal.State := BoolsetToCBState(InherhitEnumVal); cbOverrideFloat.State := BoolsetToCBState(InherhitFloat); cbOverrideStruct.State := BoolsetToCBState(InherhitStruct); cbOverridePointerDeref.State := BoolsetToCBState(InherhitPtr); cbOverrideAddressFormat.State := BoolsetToCBState(InherhitAddress); cbOverrideArray.State := BoolsetToCBState(InherhitArrayLen); cbOverrideArrayNavBar.State := BoolsetToCBState(InherhitArrayNav); cbOverrideIndent.State := BoolsetToCBState(InherhitIndent); end else begin InherhitNum := [False]; InherhitNum2 := [False]; InherhitEnum := [False]; InherhitEnumVal := [False]; InherhitFloat := [False]; InherhitStruct := [False]; InherhitPtr := [False]; InherhitAddress := [False]; InherhitArrayLen:= [False]; InherhitArrayNav:= [False]; InherhitIndent := [False]; end; if (InherhitNum = [True]) or (not FButtonStates[bsNum]) then begin ClearRadios(PanelNumBase); ClearRadios(PanelNumSign); SetCheckBoxToInherit(cbNumSeparator); ClearRadios(PanelNumSepGroup); SetSpinEditToInherit(SpinDigits); end else begin ApplyDispForm(PanelNumBase, FormatNumBase, RBA_Num); ApplyDispForm(PanelNumSign, FormatNumSign, RBA_Sign); SetCheckBoxState(cbNumSeparator, FormatNumSep, False); ApplyDispForm(PanelNumSepGroup, FormatNumGroup, RBA_Group); SpinDigits.Tag := 0; end; if InherhitNum2 = [True] then begin SetCheckBoxToInherit(cbNum2Visibile); ClearRadios(PanelNum2Base); ClearRadios(PanelNum2Sign); SetCheckBoxToInherit(cbNum2Separator); ClearRadios(PanelNum2SepGroup); SetSpinEditToInherit(Spin2Digits); end else begin SetCheckBoxState(cbNum2Visibile, FormatNum2Visible, False); ApplyDispForm(PanelNum2Base, FormatNum2Base, RBA_Num); ApplyDispForm(PanelNum2Sign, FormatNum2Sign, RBA_Sign); SetCheckBoxState(cbNum2Separator, FormatNum2Sep, False); ApplyDispForm(PanelNum2SepGroup, FormatNum2Group, RBA_Group); Spin2Digits.Tag := 0; end; if InherhitEnum = [True] then begin ClearRadios(PanelEnumRb1); ClearRadios(PanelEnumBase); //ClearRadios(PanelEnumSign); SetCheckBoxToInherit(cbEnumSign); end else begin ApplyDispForm(PanelEnumRb1, FormatEnum, RBA_Enum); ApplyDispForm(PanelEnumBase, FormatEnumBase, RBA_Num); //ApplyDispForm(PanelEnumSign, FormatEnumSign, RBA_Sign); SetCheckBoxState(cbEnumSign, FormatEnumSign, False); end; if InherhitEnumVal = [True] then begin ClearRadios(PanelEnumValRb); ClearRadios(PanelEnumValBase); SetCheckBoxToInherit(cbEnumValSign); end else begin ApplyDispForm(PanelEnumValRb, FormatEnumVal, RBA_Enum); ApplyDispForm(PanelEnumValBase, FormatEnumValBase, RBA_Num); SetCheckBoxState(cbEnumValSign, FormatEnumValSign, False); end; if InherhitFloat = [True] then begin ClearRadios(PanelFloat); SetSpinEditToInherit(SpinFloatDigits) end else begin ApplyDispForm(PanelFloatRb, FormatFloat, RBA_Float); IntToSpinEdit(SpinFloatDigits, FormatFloatPrec); end; if InherhitStruct = [True] then begin ClearRadios(PanelStructFld); ClearRadios(PanelStructPointer); end else begin ApplyDispForm(PanelStructFld, FormatStruct, RBA_StructVal); ApplyDispForm(PanelStructPointer, FormatStructPointer, RBA_StructPtr); end; if InherhitPtr = [True] then begin ClearRadios(PanelPointerDeref); end else begin ApplyDispForm(PanelPointerDeref, FormatPointerDeref, RBA_PtrDeref); end; if InherhitAddress = [True] then begin ClearRadios(PanelAddressType); ClearRadios(PanelAddressBase); SetCheckBoxToInherit(cbAddrSign); SetCheckBoxToInherit(cbAddrNoLeadZero); cbStructAddrTyped.State := cbGrayed; cbPointerAddrTyped.State := cbGrayed; end else begin ApplyDispForm(PanelAddressType, FormatAddress, RBA_Addr); ApplyDispForm(PanelAddressBase, FormatAddressBase, RBA_AddrNum); SetCheckBoxState(cbAddrSign, FormatAddressSign, False); SetCheckBoxState(cbAddrNoLeadZero, FormatAddressLead, False); cbStructAddrTyped.State := BoolsetToCBState(FormatAddressStr_Ty, False); cbPointerAddrTyped.State := BoolsetToCBState(FormatAddressPtr_Ty, False); end; if InherhitArrayLen = [True] then begin SetCheckBoxToInherit(cbArrayShowPrefix); SetCheckBoxToInherit(cbArrayShowPrefixEmbedded); SetCheckBoxToInherit(cbArrayHideLen); SetSpinEditToInherit(spinArrayLenMaxNest); SetSpinEditToInherit(spinArrayHideLenRevDepth); SetSpinEditToInherit(spinArrayHideLenIfLess); SetSpinEditToInherit(spinArrayHideLenThresEach); SetSpinEditToInherit(spinArrayHideLenThresLen); ClearRadios(PanelArrayPrefixCombine); end else begin SetCheckBoxState(cbArrayShowPrefix, FormatArrayShowLen, False); SetCheckBoxState(cbArrayShowPrefixEmbedded, FormatArrayShowLenEmbedded, False); IntToSpinEdit(spinArrayLenMaxNest, FormatArrayLenMaxNest); ApplyDispForm(PanelArrayPrefixCombine, FormatArrayLenCombine, RBA_ArrayCombine); SetCheckBoxState(cbArrayHideLen, FormatHideLen, False); IntToSpinEdit(spinArrayHideLenRevDepth, FormatHideLenReverseDepth ); IntToSpinEdit(spinArrayHideLenIfLess, FormatHideLenThresholdCnt ); IntToSpinEdit(spinArrayHideLenThresEach, FormatHideLenThresholdEach ); IntToSpinEdit(spinArrayHideLenThresLen, FormatHideLenThresholdFullLen); end; if InherhitArrayNav = [True] then begin SetCheckBoxToInherit(cbArrayNavAutoHide); SetCheckBoxToInherit(cbArrayNavEnforceBounds); SetSpinEditToInherit(SpinPageSize); end else begin SetCheckBoxState(cbArrayNavAutoHide, FormatArrayNavAutoHide, False); SetCheckBoxState(cbArrayNavEnforceBounds, FormatArrayNavForceBounds, False); IntToSpinEdit(SpinPageSize, FormatPageSize); end; if InherhitIndent = [True] then begin SetSpinEditToInherit(SpinIndentMaxWrap); SetCheckBoxToInherit(cbForceSingleLine); SetSpinEditToInherit(spinForceSingleLineStructFld); SetSpinEditToInherit(spinForceSingleLineArrayLen); SetSpinEditToInherit(spinForceSingleLineRevDepth); SetSpinEditToInherit(spinForceSingleLineEach); SetSpinEditToInherit(spinForceSingleLineLen); end else begin IntToSpinEdit(SpinIndentMaxWrap, FormatIndentMaxWrap); SetCheckBoxState(cbForceSingleLine, FormatForceSingleLine, False); IntToSpinEdit(spinForceSingleLineStructFld, FormatForceSingleLineThresholdStructFld ); IntToSpinEdit(spinForceSingleLineArrayLen, FormatForceSingleLineThresholdArrayLen ); IntToSpinEdit(spinForceSingleLineRevDepth, FormatForceSingleLineReverseDepth ); IntToSpinEdit(spinForceSingleLineEach, FormatForceSingleLineThresholdEach ); IntToSpinEdit(spinForceSingleLineLen, FormatForceSingleLineThresholdLen); end; UpdateNumDigitPanel; UpdateNum2Visibility; UpdateNum2DigitPanel; cbMemDump.State := BoolsetToCBState(FormatIsMemDump, False); UpdateConstraints; finally EnableAutoSizing; // workaround issue that SpinEdit.Text / EmptyValue don't allways work FormatSpinChanged(SpinDigits); FormatSpinChanged(Spin2Digits); FormatSpinChanged(SpinFloatDigits); FormatSpinChanged(SpinPageSize); FormatSpinChanged(spinArrayLenMaxNest); FormatSpinChanged(spinArrayHideLenRevDepth); FormatSpinChanged(spinArrayHideLenIfLess); FormatSpinChanged(spinArrayHideLenThresEach); FormatSpinChanged(spinArrayHideLenThresLen); FormatSpinChanged(SpinIndentMaxWrap); FormatSpinChanged(spinForceSingleLineStructFld); FormatSpinChanged(spinForceSingleLineArrayLen); FormatSpinChanged(spinForceSingleLineRevDepth); FormatSpinChanged(spinForceSingleLineEach); FormatSpinChanged(spinForceSingleLineLen); dec(FUpdatingDisplay); end; end; procedure TDisplayFormatFrame.UpdateTabs; var MarkTabNumber, MarkTabEnum, MarkTabBool, MarkTabChar, MarkTabFloat, MarkTabStruct, MarkTabPointer, MarkTabArray: Boolean; i: Integer; begin MarkTabNumber := False; MarkTabEnum := False; MarkTabBool := False; MarkTabChar := False; MarkTabFloat := False; MarkTabStruct := False; MarkTabPointer := False; MarkTabArray := False; if FHighlightModifiedTabs then begin for i := 0 to FDisplayFormatCount - 1 do begin MarkTabNumber := MarkTabNumber or ((not FDisplayFormat[i].Num.UseInherited) and ( (FDisplayFormat[i].Num.BaseFormat = DefaultWatchDisplayFormat.Num.BaseFormat) or (FDisplayFormat[i].Num.SignFormat = DefaultWatchDisplayFormat.Num.SignFormat) or (FDisplayFormat[i].Num.MinDigits = DefaultWatchDisplayFormat.Num.MinDigits) or (FDisplayFormat[i].Num.SeparatorDec = DefaultWatchDisplayFormat.Num.SeparatorDec) or (FDisplayFormat[i].Num.SeparatorHexBin = DefaultWatchDisplayFormat.Num.SeparatorHexBin) )) or ((not FDisplayFormat[i].Num2.UseInherited) and ( (FDisplayFormat[i].Num2.Visible = DefaultWatchDisplayFormat.Num2.Visible) or (FDisplayFormat[i].Num2.BaseFormat = DefaultWatchDisplayFormat.Num2.BaseFormat) or (FDisplayFormat[i].Num2.SignFormat = DefaultWatchDisplayFormat.Num2.SignFormat) or (FDisplayFormat[i].Num2.MinDigits = DefaultWatchDisplayFormat.Num2.MinDigits) or (FDisplayFormat[i].Num2.SeparatorDec = DefaultWatchDisplayFormat.Num2.SeparatorDec) or (FDisplayFormat[i].Num2.SeparatorHexBin = DefaultWatchDisplayFormat.Num2.SeparatorHexBin) )); MarkTabEnum := MarkTabEnum or ((not FDisplayFormat[i].Enum.UseInherited) and ( (FDisplayFormat[i].Enum.MainFormat = DefaultWatchDisplayFormat.Enum.MainFormat) or (FDisplayFormat[i].Enum.BaseFormat = DefaultWatchDisplayFormat.Enum.BaseFormat) or (FDisplayFormat[i].Enum.SignFormat = DefaultWatchDisplayFormat.Enum.SignFormat) )) or ((not FDisplayFormat[i].EnumVal.UseInherited) and ( (FDisplayFormat[i].EnumVal.MainFormat = DefaultWatchDisplayFormat.EnumVal.MainFormat) or (FDisplayFormat[i].EnumVal.BaseFormat = DefaultWatchDisplayFormat.EnumVal.BaseFormat) or (FDisplayFormat[i].EnumVal.SignFormat = DefaultWatchDisplayFormat.EnumVal.SignFormat) )); MarkTabBool := MarkTabBool or ((not FDisplayFormat[i].Bool.UseInherited) and ( (FDisplayFormat[i].Bool.MainFormat = DefaultWatchDisplayFormat.Bool.MainFormat) or (FDisplayFormat[i].Bool.BaseFormat = DefaultWatchDisplayFormat.Bool.BaseFormat) or (FDisplayFormat[i].Bool.SignFormat = DefaultWatchDisplayFormat.Bool.SignFormat) )); MarkTabChar := MarkTabChar or ((not FDisplayFormat[i].Char.UseInherited) and ( (FDisplayFormat[i].Char.MainFormat = DefaultWatchDisplayFormat.Char.MainFormat) or (FDisplayFormat[i].Char.BaseFormat = DefaultWatchDisplayFormat.Char.BaseFormat) or (FDisplayFormat[i].Char.SignFormat = DefaultWatchDisplayFormat.Char.SignFormat) )); MarkTabFloat := MarkTabFloat or ((not FDisplayFormat[i].Float.UseInherited) and ( (FDisplayFormat[i].Float.NumFormat = DefaultWatchDisplayFormat.Float.NumFormat) or (FDisplayFormat[i].Float.Precission = DefaultWatchDisplayFormat.Float.Precission) )); MarkTabStruct := MarkTabStruct or ((not FDisplayFormat[i].Struct.UseInherited) and ( (FDisplayFormat[i].Struct.DataFormat = DefaultWatchDisplayFormat.Struct.DataFormat) or (FDisplayFormat[i].Struct.ShowPointerFormat = DefaultWatchDisplayFormat.Struct.ShowPointerFormat) )) or ((not FDisplayFormat[i].Struct.Address.UseInherited) and ( (FDisplayFormat[i].Struct.Address.TypeFormat = DefaultWatchDisplayFormat.Struct.Address.TypeFormat) or (FDisplayFormat[i].Struct.Address.BaseFormat = DefaultWatchDisplayFormat.Struct.Address.BaseFormat) or (FDisplayFormat[i].Struct.Address.Signed = DefaultWatchDisplayFormat.Struct.Address.Signed) )); MarkTabPointer := MarkTabPointer or ((not FDisplayFormat[i].Pointer.UseInherited) and ( (FDisplayFormat[i].Pointer.DerefFormat = DefaultWatchDisplayFormat.Pointer.DerefFormat) )) or ((not FDisplayFormat[i].Pointer.Address.UseInherited) and ( (FDisplayFormat[i].Pointer.Address.TypeFormat = DefaultWatchDisplayFormat.Pointer.Address.TypeFormat) or (FDisplayFormat[i].Pointer.Address.BaseFormat = DefaultWatchDisplayFormat.Pointer.Address.BaseFormat) or (FDisplayFormat[i].Pointer.Address.Signed = DefaultWatchDisplayFormat.Pointer.Address.Signed) )); MarkTabArray := MarkTabBool or ((not FDisplayFormat[i].ArrayLen.UseInherited) and ( (FDisplayFormat[i].ArrayLen.ShowLenPrefix = DefaultWatchDisplayFormat.ArrayLen.ShowLenPrefix) or (FDisplayFormat[i].ArrayLen.ShowLenPrefixEmbedded = DefaultWatchDisplayFormat.ArrayLen.ShowLenPrefixEmbedded) or (FDisplayFormat[i].ArrayLen.LenPrefixMaxNest = DefaultWatchDisplayFormat.ArrayLen.LenPrefixMaxNest) or (FDisplayFormat[i].ArrayLen.LenPrefixCombine = DefaultWatchDisplayFormat.ArrayLen.LenPrefixCombine) )) or ((not FDisplayFormat[i].ArrayNavBar.UseInherited) and FShowArrayNavBarOpts and ( (FDisplayFormat[i].ArrayNavBar.AutoHideNavBar = DefaultWatchDisplayFormat.ArrayNavBar.AutoHideNavBar) or (FDisplayFormat[i].ArrayNavBar.EnforceBounds = DefaultWatchDisplayFormat.ArrayNavBar.EnforceBounds) or (FDisplayFormat[i].ArrayNavBar.PageSize = DefaultWatchDisplayFormat.ArrayNavBar.PageSize) )); end; end; tbNumber.Font.Underline := MarkTabNumber; tbEnum.Font.Underline := MarkTabEnum; tbBool.Font.Underline := MarkTabBool; tbChar.Font.Underline := MarkTabChar; tbFloat.Font.Underline := MarkTabFloat; tbStruct.Font.Underline := MarkTabStruct; tbPointer.Font.Underline := MarkTabPointer; tbArray.Font.Underline := MarkTabArray; end; constructor TDisplayFormatFrame.Create(TheOwner: TComponent); begin inherited Create(TheOwner); DisplayFormatCount := 1; FHighlightModifiedTabs := True; FShowCurrent := True; FShowAll := True; FAllowMultiTabs := True; FShowMemDump := True; FShowMultiRadio := True; FShowOverrideChecks := True; end; procedure TDisplayFormatFrame.Setup; var s: String; begin tbCurrent.Visible := FShowCurrent; tbCurrent.Caption := DispFormatDlgBtnCurrent; tbAll.Caption := DispFormatDlgBtnAll; tbNumber.Caption := DispFormatDlgBtnNumber; tbEnum.Caption := DispFormatDlgBtnEnum; tbBool.Caption := DispFormatDlgBtnBool; tbChar.Caption := DispFormatDlgBtnChar; tbFloat.Caption := DispFormatDlgBtnFloat; tbStruct.Caption := DispFormatDlgBtnStruct; tbPointer.Caption := DispFormatDlgBtnPointer; tbArray.Caption := DispFormatDlgBtnArray; tbIndent.Caption := DispFormatDlgBtnOptions; lbOverrideNumBase.Caption := DispFormatDlgBtnNumber; rbNumDec.Caption := DispFormatBaseDecimal; rbNumHex.Caption := DispFormatBaseHex; rbNumOct.Caption := DispFormatBaseOct; rbNumBin.Caption := DispFormatBaseBin; rbNumChar.Caption := DispFormatBaseChar; rbSignAuto.Caption := DispFormatSignAuto; rbSignSigned.Caption := DispFormatSignSigned; rbSignUnsigned.Caption := DispFormatSignUnsigned; lbNumDigits.Caption := DispFormatNumDigits; cbNumSeparator.Caption := DispFormatNumSeperator; lbNumSepGroup.Caption := DispFormatNumSepGroup; rbNumSepNone.Caption := DispFormatNumSepGroupNone; rbNumSepByte.Caption := DispFormatNumSepGroupByte; rbNumSepWord.Caption := DispFormatNumSepGroupWord; rbNumSepLong.Caption := DispFormatNumSepGroupLong; lbOverrideNum2Base.Caption := DispFormatDlgBtnNumber2; cbNum2Visibile.Caption := DispFormatDlgBtnNum2Visible; rbNum2Dec.Caption := DispFormatBaseDecimal; rbNum2Hex.Caption := DispFormatBaseHex; rbNum2Oct.Caption := DispFormatBaseOct; rbNum2Bin.Caption := DispFormatBaseBin; rbNum2Char.Caption := DispFormatBaseChar; rbSign2Auto.Caption := DispFormatSignAuto; rbSign2Signed.Caption := DispFormatSignSigned; rbSign2Unsigned.Caption := DispFormatSignUnsigned; lbNum2Digits.Caption := DispFormatNumDigits; cbNum2Separator.Caption := DispFormatNumSeperator; lbNum2SepGroup.Caption := DispFormatNumSepGroup; rbNum2SepNone.Caption := DispFormatNumSepGroupNone; rbNum2SepByte.Caption := DispFormatNumSepGroupByte; rbNum2SepWord.Caption := DispFormatNumSepGroupWord; rbNum2SepLong.Caption := DispFormatNumSepGroupLong; lbOverrideEnum.Caption := DispFormatDlgBtnEnum +', ' + DispFormatDlgBtnBool +', ' + DispFormatDlgBtnChar; s := DispFormatEnumName; AddToStr(s, DispFormatBoolName, '/'); AddToStr(s, DispFormatCharLetter, '/'); rbEnumName.Caption := s; rbEnumOrd.Caption := DispFormatEnumOrd; rbEnumNameAndOrd.Caption := DispFormatEnumNameAndOrd; rbENumDec.Caption := DispFormatBaseDecimal; rbENumHex.Caption := DispFormatBaseHex; rbENumOct.Caption := DispFormatBaseOct; rbENumBin.Caption := DispFormatBaseBin; rbENumChar.Caption := DispFormatBaseChar; cbEnumSign.Caption := DispFormatSignUnsigned; lbOverrideEnumVal.Caption := DispFormatDlgBtnEnumVal; rbEnumValName.Caption := DispFormatEnumName; rbEnumValOrd.Caption := DispFormatEnumOrd; rbEnumValNameAndOrd.Caption := DispFormatEnumNameAndOrd; rbENumValDec.Caption := DispFormatBaseDecimal; rbENumValHex.Caption := DispFormatBaseHex; rbENumValOct.Caption := DispFormatBaseOct; rbENumValBin.Caption := DispFormatBaseBin; rbENumValChar.Caption := DispFormatBaseChar; cbEnumValSign.Caption := DispFormatSignUnsigned; lbOverrideFloat.Caption := DispFormatDlgBtnFloat; rbFloatPoint.Caption := DispFormatFloatPoint; rbFloatScience.Caption := DispFormatFloatScientific; lbFloatPrec.Caption := DispFormatNumDigits; lbOverrideStruct.Caption := DispFormatDlgBtnStruct; rbStructValOnly.Caption := DispFormatStructValOnly; rbStructFields.Caption := DispFormatStructFields; rbStructFull.Caption := DispFormatStructFull; rbStructAddrOn.Caption := DispFormatStructAddressOn; rbStructAddrOff.Caption := DispFormatStructAddressOff; rbStructAddrOnly.Caption := DispFormatStructAddressOnly; lbOverridePointerDeref.Caption := DispFormatDlgBtnPointer; rbPointerDerefOff.Caption := DispFormatPointerDerefOff; rbPointerDerefOn.Caption := DispFormatPointerDerefOn; rbPointerDerefOnly.Caption := DispFormatPointerDerefOnly; lbOverrideAddressFormat.Caption := DispFormatDlgBtnAdrFormat; rbAddressPlain.Caption := DispFormatPointerAddressPlain; rbAddressTyped.Caption := DispFormatPointerAddressTyped; rbAddrNumHex.Caption := DispFormatBaseHex; rbAddrNumDec.Caption := DispFormatBaseDecimal; rbAddrNumOct.Caption := DispFormatBaseOct; rbAddrNumBin.Caption := DispFormatBaseBin; cbAddrSign.Caption := DispFormatSignSigned; cbAddrNoLeadZero.Caption := DispFormatNoLeadZero; cbStructAddrTyped.Caption := DispFormatPointerAddressTyped; cbPointerAddrTyped.Caption := DispFormatPointerAddressTyped; lbOverrideIndent.Caption := DispFormatDlgIndent; lbMaxWrapLvl.Caption := DispFormatIndentMaxWrap; cbForceSingleLine.Caption := DispFormatForceSingleLineToggle; lbForceSingleLineStructFld.Caption := DispFormatForceSingleLineStructFld; lbForceSingleLineArrayLen.Caption := DispFormatForceSingleLineArrayLen; lbForceSingleLineRevDepth.Caption := DispFormatForceSingleLineDepth; lbForceSingleLineEach.Caption := DispFormatForceSingleLineEach; lbForceSingleLineLen.Caption := DispFormatForceSingleLineLen; lbOverrideArray.Caption := DispFormatDlgArrayLen; cbArrayShowPrefix.Caption := DispFormatDlgArrayShowPrefix; cbArrayShowPrefixEmbedded.Caption := DispFormatDlgArrayShowPrefixEmbedded; lbArrayLenMaxNest.Caption := DispFormatDlgArrayMaxNest; lbArrayCombine.Caption := DispFormatDlgArrayCombine; rbArrayCombineNone.Caption := DispFormatDlgArrayCombineNone; rbArrayCombineAll.Caption := DispFormatDlgArrayCombineAll; rbArrayCombineStat.Caption := DispFormatDlgArrayCombineStat; rbArrayCombineDyn.Caption := DispFormatDlgArrayCombineDyn; cbArrayHideLen.Caption := DispFormatArrayHideLenToggle; lbArrayHideLenIfLess.Caption := DispFormatArrayHideLenIfLess; lbArrayHideLenKeepDepth.Caption := DispFormatArrayHideLenKeepDepth; lbArrayHideLenThresEach.Caption := DispFormatArrayHideLenThresEach; lbArrayHideLenThresLen.Caption := DispFormatArrayHideLenThresFullLen; lbOverrideArrayNavBar.Caption := DispFormatDlgArrayNav; cbArrayNavAutoHide.Caption := DispFormatArrayNavAutoHide; cbArrayNavEnforceBounds.Caption := DispFormatArrayNavEnforceBounds; lbPageSize.Caption := DispFormatArrayNavPageSize; DividerBevelMemDump.Caption := ''; cbMemDump.Caption := DispFormatCategoryMemDump; FSetupDone := True; UpdateConstraints; end; procedure TDisplayFormatFrame.BeginUdpate; begin inc(FUpdateCount); end; procedure TDisplayFormatFrame.EndUdpate; begin dec(FUpdateCount); if (FUpdateCount = 0) and FNeedUpdateDisplay then UpdateDisplay; end; procedure TDisplayFormatFrame.SelectDefaultButton; begin FInButtonClick := True; try tbCurrent.Down := True; tbCurrent.Enabled := True; tbAll.Down := False; tbNumber.Down := False; tbEnum.Down := False; tbBool.Down := False; tbChar.Down := False; tbFloat.Down := False; tbStruct.Down := False; tbPointer.Down := False; tbArray.Down := False; case FCurrentResDataType of rdkChar: tbChar.Down := True; rdkSignedNumVal: tbNumber.Down := True; rdkUnsignedNumVal: tbNumber.Down := True; rdkPointerVal: tbPointer.Down := True; rdkFloatVal: tbFloat.Down := True; rdkBool: tbBool.Down := True; rdkEnum: tbEnum.Down := True; rdkEnumVal: tbEnum.Down := True; rdkSet: tbEnum.Down := True; rdkStruct: tbStruct.Down := True; rdkArray: tbArray.Down := True; else begin if FShowAll then tbAll.Down := True; tbNumber.Down := True; tbEnum.Down := True; tbBool.Down := True; tbChar.Down := True; tbFloat.Down := True; tbStruct.Down := True; tbPointer.Down := True; tbArray.Down := True; tbCurrent.Down := False; tbCurrent.Enabled := False; end; end; finally FInButtonClick := False; end; UpdateDisplay; end; end.