diff options
author | Andrew Haines <andrewd207@aol.com> | 2010-11-05 17:28:50 -0400 |
---|---|---|
committer | Andrew Haines <andrewd207@aol.com> | 2010-11-05 17:28:50 -0400 |
commit | e320dfae6add39c66ea554dbb161a844ee06db4d (patch) | |
tree | 78451d8f643babcfb50376c1b6a53da6ef5ff616 /src | |
parent | 917a2daf4ff769ad27631e6c71a7b919c47e4ecb (diff) | |
parent | 735aec8207036adb17f2174ffcb9056bee712ed3 (diff) | |
download | fpGUI-e320dfae6add39c66ea554dbb161a844ee06db4d.tar.xz |
Merge branch 'master' of ssh://fpgui.git.sourceforge.net/gitroot/fpgui/fpgui
Diffstat (limited to 'src')
64 files changed, 9066 insertions, 2658 deletions
diff --git a/src/corelib/fpg_base.pas b/src/corelib/fpg_base.pas index 199004ba..a5289474 100644 --- a/src/corelib/fpg_base.pas +++ b/src/corelib/fpg_base.pas @@ -25,7 +25,8 @@ uses Classes, SysUtils, fpg_impl, - syncobjs; // TCriticalSection usage + syncobjs, // TCriticalSection usage + URIParser, variants, contnrs; type TfpgCoord = integer; // we might use floating point coordinates in the future... @@ -59,7 +60,7 @@ type TMouseCursor = (mcDefault, mcArrow, mcCross, mcIBeam, mcSizeEW, mcSizeNS, mcSizeNWSE, mcSizeNESW, mcSizeSWNE, mcSizeSENW, mcMove, mcHourGlass, - mcHand); + mcHand, mcDrag, mcNoDrop); TGradientDirection = (gdVertical, // Fill vertical gdHorizontal); // Fill Horizontal @@ -70,6 +71,9 @@ type TfpgModalResult = (mrNone, mrOK, mrCancel, mrYes, mrNo, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll, mrYesToAll); + TfpgDropAction = (daIgnore, daCopy, daMove, daLink, daAsk); + TfpgDropActions = set of TfpgDropAction; + const MOUSE_LEFT = 1; MOUSE_RIGHT = 3; @@ -95,21 +99,20 @@ const FPGM_POPUPCLOSE = 17; FPGM_HINTTIMER = 18; FPGM_FREEME = 19; + FPGM_DROPENTER = 20; + FPGM_DROPEXIT = 21; FPGM_USER = 50000; FPGM_KILLME = MaxInt; // The special keys, based on the well-known keyboard scan codes {$I keys.inc} - { Default fpGUI help viewer } - FPG_HELPVIEWER = 'docview'; var FPG_DEFAULT_FONT_DESC: string = 'Arial-10:antialias=true'; const UserNamedColorStart = 128; - {$I predefinedcolors.inc} type @@ -126,6 +129,22 @@ type end; + TfpgPoint = object // not class for static allocations + X: integer; + Y: integer; + procedure SetPoint(AX, AY: integer); + function ManhattanLength: integer; { See URL for explanation http://en.wikipedia.org/wiki/Taxicab_geometry } + function ManhattanLength(const PointB: TfpgPoint): integer; + end; + + + TfpgSize = object // not class for static allocations + W: integer; + H: integer; + procedure SetSize(AWidth, AHeight: integer); + end; + + TfpgMsgParmMouse = record x: TfpgCoord; y: TfpgCoord; @@ -416,6 +435,8 @@ type FSizeIsDirty: Boolean; FPosIsDirty: Boolean; FMouseCursorIsDirty: Boolean; + FOnDragStartDetected: TNotifyEvent; + FDragActive: boolean; function HandleIsValid: boolean; virtual; abstract; procedure DoUpdateWindowPosition; virtual; abstract; procedure DoAllocateWindowHandle(AParent: TfpgWindowBase); virtual; abstract; @@ -426,6 +447,9 @@ type function DoWindowToScreen(ASource: TfpgWindowBase; const AScreenPos: TPoint): TPoint; virtual; abstract; procedure DoSetWindowTitle(const ATitle: string); virtual; abstract; procedure DoSetMouseCursor; virtual; abstract; + procedure DoDNDEnabled(const AValue: boolean); virtual; abstract; + procedure DoAcceptDrops(const AValue: boolean); virtual; abstract; + procedure DoDragStartDetected; virtual; procedure SetParent(const AValue: TfpgWindowBase); virtual; function GetParent: TfpgWindowBase; virtual; function GetCanvas: TfpgCanvasBase; virtual; @@ -438,6 +462,7 @@ type procedure SetWidth(const AValue: TfpgCoord); procedure HandleMove(x, y: TfpgCoord); virtual; procedure HandleResize(AWidth, AHeight: TfpgCoord); virtual; + property OnDragStartDetected: TNotifyEvent read FOnDragStartDetected write FOnDragStartDetected; public // The standard constructor. constructor Create(AOwner: TComponent); override; @@ -453,6 +478,8 @@ type procedure MoveWindow(const x: TfpgCoord; const y: TfpgCoord); function WindowToScreen(ASource: TfpgWindowBase; const AScreenPos: TPoint): TPoint; function HasParent: Boolean; override; + function GetClientRect: TfpgRect; virtual; + function GetBoundsRect: TfpgRect; virtual; procedure ActivateWindow; virtual; abstract; procedure CaptureMouse; virtual; abstract; procedure ReleaseMouse; virtual; abstract; @@ -466,8 +493,8 @@ type property Height: TfpgCoord read FHeight write SetHeight; property MinWidth: TfpgCoord read FMinWidth write FMinWidth; property MinHeight: TfpgCoord read FMinHeight write FMinHeight; - property MaxWidth: TfpgCoord read FMaxWidth write FMaxWidth; - property MaxHeight: TfpgCoord read FMaxHeight write FMaxHeight; + property MaxWidth: TfpgCoord read FMaxWidth write FMaxWidth default 0; + property MaxHeight: TfpgCoord read FMaxHeight write FMaxHeight default 0; property Canvas: TfpgCanvasBase read GetCanvas; property Parent: TfpgWindowBase read GetParent write SetParent; property MouseCursor: TMouseCursor read FMouseCursor write SetMouseCursor; @@ -531,7 +558,7 @@ type procedure DoSetText(const AValue: TfpgString); virtual; abstract; procedure InitClipboard; virtual; abstract; public - constructor Create; + constructor Create; virtual; property Text: TfpgString read DoGetText write DoSetText; end; @@ -605,6 +632,54 @@ type end; + TfpgMimeDataItem = class(TObject) + public + format: TfpgString; { mime string type } + data: Variant; + constructor Create(const AFormat: TfpgString; const AData: variant); reintroduce; + end; + + + TfpgMimeDataBase = class(TObject) + private + { TODO: This is wrong, we must have one Data Storage object } + FDataList: TObjectList; + FUrlList: TList; + function GetItem(AIndex: Integer): TfpgMimeDataItem; + function Geturls: TList; + procedure Seturls(const AValue: TList); + function GetText: TfpgString; + procedure SetText(const AValue: TfpgString); + function GetHTML: TfpgString; + procedure SetHTML(const AValue: TfpgString); + function GetCount: integer; + public + constructor Create; + destructor Destroy; override; + procedure Clear; + function HasFormat(const AMimeType: TfpgString): boolean; + function Formats: TStrings; + function GetData(const AMimeType: TfpgString): Variant; + procedure SetData(const AMimeType: TfpgString; const AData: Variant); + property Items[AIndex: Integer]: TfpgMimeDataItem read GetItem; default; + property urls: TList read Geturls write Seturls; + property Text: TfpgString read GetText write SetText; + property HTML: TfpgString read GetHTML write SetHTML; + property Count: integer read GetCount; + end; + + TfpgDragBase = class(TObject) + protected + FDragging: Boolean; + FMimeData: TfpgMimeDataBase; + public + constructor Create; + destructor Destroy; override; + function Execute(const ADropActions: TfpgDropActions; const ADefaultAction: TfpgDropAction = daCopy): TfpgDropAction; virtual; abstract; + end; + + + { ******** Helper functions ******** } { Keyboard } function KeycodeToText(AKey: Word; AShiftState: TShiftState): string; @@ -628,11 +703,14 @@ procedure SortRect(var ARect: TRect); procedure SortRect(var ARect: TfpgRect); procedure SortRect(var left, top, right, bottom: integer); + + implementation uses fpg_main, // needed for fpgApplication & fpgNamedColor fpg_utils, // needed for fpgFileList + fpg_constants, typinfo, process; @@ -962,11 +1040,15 @@ begin GetPropList(Obj.ClassInfo, tkPropsWithDefault, PropInfos); { Loop through all the selected properties } for Loop := 0 to Count - 1 do + begin with PropInfos^[Loop]^ do + begin { If there is supposed to be a default value... } if Default <> NoDefault then { ...then jolly well set it } SetOrdProp(Obj, PropInfos^[Loop], Default) + end; + end; finally FreeMem(PropInfos, Count * SizeOf(PPropInfo)); end; @@ -1002,6 +1084,35 @@ begin Width := Value - Left + 1; end; + +{ TfpgPoint } + +procedure TfpgPoint.SetPoint(AX, AY: integer); +begin + X := AX; + Y := AY; +end; + +function TfpgPoint.ManhattanLength: integer; +begin + Result := Abs(X) + Abs(Y); +end; + +function TfpgPoint.ManhattanLength(const PointB: TfpgPoint): integer; +begin + Result := Abs(PointB.X-X) + Abs(PointB.Y-Y); +end; + + +{ TfpgSize } + +procedure TfpgSize.SetSize(AWidth, AHeight: integer); +begin + W := AWidth; + H := AHeight; +end; + + { TfpgWindowBase } procedure TfpgWindowBase.SetMouseCursor(const AValue: TMouseCursor); @@ -1030,6 +1141,12 @@ begin Result := MinHeight; end; +procedure TfpgWindowBase.DoDragStartDetected; +begin + if Assigned(FOnDragStartDetected) then + FOnDragStartDetected(self); +end; + procedure TfpgWindowBase.SetParent(const AValue: TfpgWindowBase); begin FParent := AValue; @@ -1150,6 +1267,7 @@ begin FSizeIsDirty := True; FMaxWidth := 0; FMaxHeight := 0; + FDragActive := False; end; procedure TfpgWindowBase.AfterConstruction; @@ -1205,6 +1323,16 @@ begin Result := FParent <> nil; end; +function TfpgWindowBase.GetClientRect: TfpgRect; +begin + Result.SetRect(0, 0, Width, Height); +end; + +function TfpgWindowBase.GetBoundsRect: TfpgRect; +begin + Result.SetRect(Left, Top, Width+1, Height+1); +end; + procedure TfpgWindowBase.SetFullscreen(AValue: Boolean); begin if AValue then @@ -2138,7 +2266,7 @@ var begin // Default location is in same directory as current running application // This location might change in the future. - ext := ExtractFileExt(ParamStr(0)); + ext := fpgExtractFileExt(ParamStr(0)); Result := fpgExtractFilePath(ParamStr(0)) + FPG_HELPVIEWER + ext; end; @@ -2255,6 +2383,7 @@ function TfpgApplicationBase.ContextHelp(const AHelpContext: THelpContext): Bool var p: TProcess; begin + Result := False; p := TProcess.Create(nil); try if fpgFileExists(HelpFile) then @@ -2267,6 +2396,7 @@ begin end else p.CommandLine := GetHelpViewer; + Result := True; p.Execute; finally p.Free; @@ -2277,6 +2407,7 @@ function TfpgApplicationBase.KeywordHelp(const AHelpKeyword: string): Boolean; var p: TProcess; begin + Result := False; p := TProcess.Create(nil); try if fpgFileExists(HelpFile) then @@ -2286,6 +2417,7 @@ begin end else p.CommandLine := GetHelpViewer; + Result := True; p.Execute; finally p.Free; @@ -2296,6 +2428,7 @@ end; constructor TfpgClipboardBase.Create; begin + inherited Create; InitClipboard; end; @@ -2415,7 +2548,7 @@ var begin e := TFileEntry.Create; e.Name := sr.Name; - e.Extension := ExtractFileExt(e.Name); + e.Extension := fpgExtractFileExt(e.Name); e.Size := sr.Size; // e.Attributes := sr.Attr; // this is incorrect and needs to improve! e.ModTime := FileDateToDateTime(sr.Time); @@ -2627,8 +2760,225 @@ begin inherited Create(AOwner); FHelpType := htKeyword; FHelpContext := 0; + FHelpKeyword := ''; FTagPointer := nil; end; +{ TfpgMimeDataItem } + +constructor TfpgMimeDataItem.Create(const AFormat: TfpgString; const AData: variant); +begin + inherited Create; + format := AFormat; + data := AData; +end; + + +{ TfpgMimeDataBase } + +function TfpgMimeDataBase.Geturls: TList; +begin + { TODO: We should only return data related to MIME type: text/uri-list } + Result := nil; +end; + +function TfpgMimeDataBase.GetItem(AIndex: Integer): TfpgMimeDataItem; +begin + Result := TfpgMimeDataItem(FDataList[AIndex]); +end; + +procedure TfpgMimeDataBase.Seturls(const AValue: TList); +begin + if AValue = nil then + raise Exception.Create('Source URI list must not be nil'); + + if Assigned(FUrlList) then + FUrlList.Free; + + { We take ownership of AValue. Can we do this? } + FUrlList := AValue; +// FFormats.Clear; +// Formats.Add('text/uri-list'); +end; + +function TfpgMimeDataBase.GetText: TfpgString; +var + i: integer; + s: string; +begin + { TODO: if no text/plain, but we have HTML, we must strip all tags and return that } + for i := 0 to Count-1 do + begin + if Items[i].format = 'text/plain' then + begin + s := Items[i].data; + Result := s; + break; + end; + end; +end; + +procedure TfpgMimeDataBase.SetText(const AValue: TfpgString); +var + i: integer; + r: TfpgMimeDataItem; +begin + { remove existing 'text/plain' first } + for i := Count-1 downto 0 do + begin + r := Items[i]; + if r.format = 'text/plain' then + begin + FDataList.Remove(r); + break; + end; + end; + { now add new structure } + r := TfpgMimeDataItem.Create('text/plain', AValue); + FDataList.Add(r); +end; + +function TfpgMimeDataBase.GetHTML: TfpgString; +var + i: integer; + s: string; +begin + { TODO: if data was HTML, we must strip all tags - regex will make this easy } + for i := 0 to Count-1 do + begin + if Items[i].format = 'text/html' then + begin + s := Items[i].data; + Result := s; + break; + end; + end; +end; + +procedure TfpgMimeDataBase.SetHTML(const AValue: TfpgString); +var + i: integer; + r: TfpgMimeDataItem; +begin + { remove existing 'text/html' first } + for i := Count-1 downto 0 do + begin + r := Items[i]; + if r.format = 'text/html' then + begin + FDataList.Remove(r); + break; + end; + end; + { now add new structure } + r := TfpgMimeDataItem.Create('text/html', AValue); + FDataList.Add(r); +end; + +function TfpgMimeDataBase.GetCount: integer; +begin + Result := FDataList.Count; +end; + +constructor TfpgMimeDataBase.Create; +begin + inherited Create; + FDataList := TObjectList.Create; +end; + +destructor TfpgMimeDataBase.Destroy; +begin + FDataList.Free; + inherited Destroy; +end; + +procedure TfpgMimeDataBase.Clear; +begin + FUrlList.Clear; + FDataList.Clear; +end; + +function TfpgMimeDataBase.HasFormat(const AMimeType: TfpgString): boolean; +var + i: integer; +begin + Result := False; + for i := 0 to Count-1 do + begin + Result := Items[i].format = AMimeType; + if Result then + break; + end; +end; + +function TfpgMimeDataBase.Formats: TStrings; +var + i: integer; + r: TfpgMimeDataItem; + s: string; +begin + if Count = 0 then + Result := nil + else + begin + Result := TStringList.Create; + for i := 0 to Count-1 do + begin + s := Items[i].format; + Result.Add(s); + end; + end; +end; + +function TfpgMimeDataBase.GetData(const AMimeType: TfpgString): Variant; +var + i: integer; +begin + for i := 0 to Count-1 do + begin + if Items[i].format = AMimeType then + begin + Result := Items[i].data; + break; + end; + end; +end; + +procedure TfpgMimeDataBase.SetData(const AMimeType: TfpgString; const AData: Variant); +var + i: integer; + r: TfpgMimeDataItem; +begin + { remove existing mime type first } + for i := Count-1 downto 0 do + begin + r := Items[i]; + if r.format = AMimeType then + begin + FDataList.Remove(r); + break; + end; + end; + { now add new structure } + r := TfpgMimeDataItem.Create(AMimeType, AData); + FDataList.Add(r); +end; + + +{ TfpgDragBase } + +constructor TfpgDragBase.Create; +begin + inherited Create; + FDragging := False; +end; + +destructor TfpgDragBase.Destroy; +begin + FMimeData.Free; + inherited Destroy; +end; + + end. diff --git a/src/corelib/fpg_constants.pas b/src/corelib/fpg_constants.pas index d93e5208..d83f855b 100644 --- a/src/corelib/fpg_constants.pas +++ b/src/corelib/fpg_constants.pas @@ -30,7 +30,7 @@ unit fpg_constants; interface uses - SysUtils, fpg_base; + SysUtils; resourcestring @@ -92,21 +92,20 @@ const ONE_MILISEC = 1/MSecsPerDay; DEFAULT_HINT_PAUSE = 500; // in milliseconds + + { Default fpGUI help viewer } + FPG_HELPVIEWER = 'docview'; + + FPG_CONFIG_DIR = 'fpgui_toolkit' + PathDelim; + FPG_BOOKMARKS_FILE = 'bookmarks.ini'; + FPG_BOOKMARK_SECTION = 'bookmarks'; -{ This is so that when we support LTR and RTL languages, the colon will be - added at the correct place. } -function fpgAddColon(const AText: TfpgString): TfpgString; implementation -function fpgAddColon(const AText: TfpgString): TfpgString; -begin - { TODO : Check language direction and add colon at appropriate end. } - result := AText + ':'; -end; end. diff --git a/src/corelib/fpg_imgfmt_bmp.pas b/src/corelib/fpg_imgfmt_bmp.pas index 48b25d5b..1ea61551 100644 --- a/src/corelib/fpg_imgfmt_bmp.pas +++ b/src/corelib/fpg_imgfmt_bmp.pas @@ -25,8 +25,7 @@ interface uses Classes, SysUtils, - fpg_main, - fpg_base; + fpg_main; procedure ReadImage_BMP(img: TfpgImage; bmp: Pointer; bmpsize: longword); function LoadImage_BMP(const AFileName: String): TfpgImage; diff --git a/src/corelib/fpg_imgutils.pas b/src/corelib/fpg_imgutils.pas index afb4d4fe..97f33fb7 100644 --- a/src/corelib/fpg_imgutils.pas +++ b/src/corelib/fpg_imgutils.pas @@ -104,7 +104,7 @@ end; initialization GrayConvMatrix := GCM_NTSC; GrayBrightness := True; - GrayBrightnessPercentage := 20; + GrayBrightnessPercentage := 40; end. diff --git a/src/corelib/fpg_main.pas b/src/corelib/fpg_main.pas index c8023408..b5b7fb17 100644 --- a/src/corelib/fpg_main.pas +++ b/src/corelib/fpg_main.pas @@ -29,7 +29,8 @@ uses Classes, SysUtils, fpg_base, - fpg_interface; + fpg_interface, + fpg_impl; type TOrientation = (orVertical, orHorizontal); @@ -43,6 +44,8 @@ type TFButtonFlags = set of (btfIsEmbedded, btfIsDefault, btfIsPressed, btfIsSelected, btfHasFocus, btfHasParentColor, btfFlat, btfHover); + + TfpgMenuItemFlags = set of (mifSelected, mifHasFocus, mifSeparator, mifEnabled, mifChecked, mifSubMenu); TFTextFlags = set of (txtLeft, txtHCenter, txtRight, txtTop, txtVCenter, txtBottom, txtWrap, txtDisabled, txtAutoSize); @@ -177,6 +180,8 @@ type procedure DrawButtonFace(r: TfpgRect; AFlags: TFButtonFlags); procedure DrawControlFrame(x, y, w, h: TfpgCoord); procedure DrawControlFrame(r: TfpgRect); + procedure DrawBevel(x, y, w, h: TfpgCoord; ARaised: Boolean = True); + procedure DrawBevel(r: TfpgRect; ARaised: Boolean = True); procedure DrawDirectionArrow(x, y, w, h: TfpgCoord; direction: TArrowDirection); procedure DrawDirectionArrow(r: TfpgRect; direction: TArrowDirection); procedure DrawFocusRect(r: TfpgRect); @@ -187,10 +192,9 @@ type { This is very basic for now, just to remind us of theming support. Later we - will rework this to use a Style Manager like the previous fpGUI. Styles must - also move out of fpGFX. Also support Bitmap based styles for easier theme - implementations. } - TfpgStyle = class + will rework this to use a Style Manager like the previous fpGUI. + Also support Bitmap based styles for easier theme implementations. } + TfpgStyle = class(TObject) public DefaultFont: TfpgFont; FixedFont: TfpgFont; @@ -201,9 +205,14 @@ type destructor Destroy; override; procedure DrawButtonFace(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord; AFlags: TFButtonFlags); virtual; procedure DrawControlFrame(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord); virtual; + procedure DrawBevel(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord; ARaised: Boolean = True); virtual; procedure DrawDirectionArrow(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord; direction: TArrowDirection); virtual; procedure DrawString(ACanvas: TfpgCanvas; x, y: TfpgCoord; AText: string; AEnabled: boolean = True); virtual; procedure DrawFocusRect(ACanvas: TfpgCanvas; r: TfpgRect); virtual; + procedure DrawMenuRow(ACanvas: TfpgCanvas; r: TfpgRect; AFlags: TfpgMenuItemFlags); virtual; + procedure DrawMenuItem(ACanvas: TfpgCanvas; r: TfpgRect; AFlags: TfpgMenuItemFlags; AText: TfpgString); virtual; + procedure DrawMenuItemSeparator(ACanvas: TfpgCanvas; r: TfpgRect); virtual; + procedure DrawMenuItemImage(ACanvas: TfpgCanvas; x, y: TfpgCoord; r: TfpgRect; AFlags: TfpgMenuItemFlags); virtual; end; @@ -224,6 +233,8 @@ type FHintTimer: TfpgTimer; FHintWidget: TfpgWindow; FHintPos: TPoint; + FOnKeyPress: TKeyPressEvent; + FStartDragDistance: integer; procedure SetHintPause(const AValue: Integer); procedure SetupLocalizationStrings; procedure InternalMsgFreeMe(var msg: TfpgMessageRec); message FPGM_FREEME; @@ -231,6 +242,7 @@ type procedure CreateHintWindow; procedure HintTimerFired(Sender: TObject); procedure SetShowHint(const AValue: boolean); + procedure SetStartDragDistance(const AValue: integer); protected FDisplayParams: string; FScreenWidth: integer; @@ -263,8 +275,10 @@ type property ScreenWidth: integer read FScreenWidth; property ScreenHeight: integer read FScreenHeight; property ShowHint: boolean read FShowHint write SetShowHint default True; + property StartDragDistance: integer read FStartDragDistance write SetStartDragDistance default 5; property StopOnException: Boolean read FStopOnException write FStopOnException; property OnException: TExceptionEvent read FOnException write FOnException; + property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress; end; @@ -278,10 +292,11 @@ type procedure SetInterval(const AValue: integer); public { AInterval is in milliseconds. } - constructor Create(ainterval: integer); + constructor Create(ainterval: integer); virtual; destructor Destroy; override; procedure CheckAlarm(ctime: TDateTime); - procedure Reset; + procedure Reset; virtual; + procedure Pause(ASeconds: integer); property Enabled: boolean read FEnabled write SetEnabled; property NextAlarm: TDateTime read FNextAlarm; { Interval is in milliseconds. } @@ -322,6 +337,25 @@ type end; + TfpgMimeData = class(TfpgMimeDataImpl) + end; + + + TfpgDrag = class(TfpgDragImpl) + private + FTarget: TfpgWinHandle; + procedure SetMimeData(const AValue: TfpgMimeDataBase); + protected + function GetSource: TfpgWindow; reintroduce; + public + constructor Create(ASource: TfpgWindow); + function Execute(const ADropActions: TfpgDropActions = [daCopy]; const ADefaultAction: TfpgDropAction = daCopy): TfpgDropAction; override; + property Source: TfpgWindow read GetSource; + property Target: TfpgWinHandle read FTarget write FTarget; + property MimeData: TfpgMimeDataBase read FMimeData write SetMimeData; + end; + + var fpgStyle: TfpgStyle; { TODO -ograemeg : move this into fpgApplication } fpgCaret: TfpgCaret; { TODO -ograemeg : move this into fpgApplication } @@ -349,6 +383,7 @@ procedure fpgDeleteFirstMessage; function fpgColorToRGB(col: TfpgColor): TfpgColor; function fpgGetNamedColor(col: TfpgColor): TfpgColor; procedure fpgSetNamedColor(colorid, rgbvalue: longword); +function fpgIsNamedColor(col: TfpgColor): boolean; function fpgGetNamedFontDesc(afontid: string): string; procedure fpgSetNamedFont(afontid, afontdesc: string); function fpgGetNamedFontList: TStringlist; @@ -356,10 +391,11 @@ function fpgGetNamedFontList: TStringlist; // Timers rountines procedure fpgInitTimers; procedure fpgCheckTimers; +procedure fpgResetAllTimers; function fpgClosestTimer(ctime: TDateTime; amaxtime: integer): integer; function fpgGetTickCount: DWord; -// Rectangle routines +// Rectangle, Point & Size routines function InflateRect(var Rect: TRect; dx: Integer; dy: Integer): Boolean; function InflateRect(var Rect: TfpgRect; dx: Integer; dy: Integer): Boolean; function OffsetRect(var Rect: TRect; dx: Integer; dy: Integer): Boolean; @@ -368,6 +404,8 @@ function CenterPoint(const Rect: TRect): TPoint; function CenterPoint(const Rect: TfpgRect): TPoint; function fpgRect(ALeft, ATop, AWidth, AHeight: integer): TfpgRect; function fpgRectToRect(const ARect: TfpgRect): TRect; +function fpgPoint(const AX, AY: integer): TfpgPoint; +function fpgSize(const AWidth, AHeight: integer): TfpgSize; // Debug rountines procedure PrintRect(const Rect: TRect); @@ -386,12 +424,34 @@ procedure DebugLn(const s1, s2, s3, s4: TfpgString); // operator overloading of some useful structures operator = (a: TRect; b: TRect): boolean; +operator = (const ASize1, ASize2: TfpgSize) b: Boolean; +operator = (const APoint1, APoint2: TPoint) b: Boolean; +operator + (const APoint1, APoint2: TPoint) p: TPoint; +operator + (const APoint1, APoint2: TfpgPoint) p: TfpgPoint; +operator + (const APoint: TPoint; ASize: TfpgSize) p: TPoint; +operator + (const APoint: TfpgPoint; ASize: TfpgSize) p: TfpgPoint; +operator + (const ASize: TfpgSize; APoint: TPoint) s: TfpgSize; +operator + (const ASize: TfpgSize; APoint: TfpgPoint) s: TfpgSize; +operator + (const ASize1, ASize2: TfpgSize) s: TfpgSize; +operator + (const APoint: TPoint; i: Integer) p: TPoint; +operator + (const APoint: TfpgPoint; i: Integer) p: TfpgPoint; +operator + (const ASize: TfpgSize; i: Integer) s: TfpgSize; +operator - (const APoint1, APoint2: TPoint) p: TPoint; +operator - (const APoint1, APoint2: TfpgPoint) p: TfpgPoint; +operator - (const APoint: TPoint; i: Integer) p: TPoint; +operator - (const APoint: TfpgPoint; i: Integer) p: TfpgPoint; +operator - (const ASize: TfpgSize; const APoint: TPoint) s: TfpgSize; +operator - (const ASize: TfpgSize; const APoint: TfpgPoint) s: TfpgSize; +operator - (const ASize: TfpgSize; i: Integer) s: TfpgSize; +operator = (const AColor1, AColor2: TFPColor) b: Boolean; + implementation uses strutils, math, + dateutils, fpg_imgfmt_bmp, fpg_stdimages, fpg_translations, @@ -446,19 +506,25 @@ var ctime: TDateTime; begin ctime := now; - i := 0; - while i < fpgTimers.Count do + i := fpgTimers.Count; + while i > 0 do begin + dec(i); if fpgTimers[i] = nil then fpgTimers.Delete(i) else - begin TfpgTimer(fpgTimers[i]).CheckAlarm(ctime); - Inc(i); - end; end; end; +procedure fpgResetAllTimers; +var + i: integer; +begin + for i := 0 to fpgTimers.Count-1 do + TfpgTimer(fpgTimers[i]).Reset; +end; + function fpgClosestTimer(ctime: TDateTime; amaxtime: integer): integer; var i: integer; @@ -583,6 +649,16 @@ begin Result.Bottom := ARect.Bottom; end; +function fpgPoint(const AX, AY: integer): TfpgPoint; +begin + Result.SetPoint(AX, AY); +end; + +function fpgSize(const AWidth, AHeight: integer): TfpgSize; +begin + Result.SetSize(AWidth, AHeight); +end; + procedure InitializeDebugOutput; var DebugFileName: string; @@ -789,6 +865,126 @@ begin Result := False; end; +operator = (const ASize1, ASize2: TfpgSize) b: Boolean; +begin + b := (ASize1.w = ASize2.w) and (ASize1.h = ASize2.h); +end; + +operator = (const APoint1, APoint2: TPoint) b: Boolean; +begin + b := (APoint1.X = APoint2.X) and (APoint1.Y = APoint2.Y); +end; + +operator + (const APoint1, APoint2: TPoint) p: TPoint; +begin + p.x := APoint1.x + APoint2.x; + p.y := APoint1.y + APoint2.y; +end; + +operator + (const APoint1, APoint2: TfpgPoint) p: TfpgPoint; +begin + p.x := APoint1.x + APoint2.x; + p.y := APoint1.y + APoint2.y; +end; + +operator + (const APoint: TPoint; ASize: TfpgSize) p: TPoint; +begin + p.x := APoint.x + ASize.w; + p.y := APoint.y + ASize.h; +end; + +operator + (const APoint: TfpgPoint; ASize: TfpgSize) p: TfpgPoint; +begin + p.x := APoint.x + ASize.w; + p.y := APoint.y + ASize.h; +end; + +operator + (const ASize: TfpgSize; APoint: TPoint) s: TfpgSize; +begin + s.w := ASize.w + APoint.x; + s.h := ASize.h + APoint.y; +end; + +operator + (const ASize: TfpgSize; APoint: TfpgPoint) s: TfpgSize; +begin + s.w := ASize.w + APoint.x; + s.h := ASize.h + APoint.y; +end; + +operator + (const ASize1, ASize2: TfpgSize) s: TfpgSize; +begin + s.w := ASize1.w + ASize2.w; + s.h := ASize1.h + ASize2.h; +end; + +operator + (const APoint: TPoint; i: Integer) p: TPoint; +begin + p.x := APoint.x + i; + p.y := APoint.y + i; +end; + +operator + (const APoint: TfpgPoint; i: Integer) p: TfpgPoint; +begin + p.x := APoint.x + i; + p.y := APoint.y + i; +end; + +operator + (const ASize: TfpgSize; i: Integer) s: TfpgSize; +begin + s.w := ASize.w + i; + s.h := ASize.h + i; +end; + +operator - (const APoint1, APoint2: TPoint) p: TPoint; +begin + p.x := APoint1.x - APoint2.x; + p.y := APoint1.y - APoint2.y; +end; + +operator - (const APoint1, APoint2: TfpgPoint) p: TfpgPoint; +begin + p.x := APoint1.x - APoint2.x; + p.y := APoint1.y - APoint2.y; +end; + +operator - (const APoint: TPoint; i: Integer) p: TPoint; +begin + p.x := APoint.x - i; + p.y := APoint.y - i; +end; + +operator - (const APoint: TfpgPoint; i: Integer) p: TfpgPoint; +begin + p.x := APoint.x - i; + p.y := APoint.y - i; +end; + +operator - (const ASize: TfpgSize; const APoint: TPoint) s: TfpgSize; +begin + s.w := ASize.w - APoint.x; + s.h := ASize.h - APoint.y; +end; + +operator - (const ASize: TfpgSize; const APoint: TfpgPoint) s: TfpgSize; +begin + s.w := ASize.w - APoint.x; + s.h := ASize.h - APoint.y; +end; + +operator - (const ASize: TfpgSize; i: Integer) s: TfpgSize; +begin + s.w := ASize.w - i; + s.h := ASize.h - i; +end; + +operator = (const AColor1, AColor2: TFPColor) b: Boolean; +begin + b := (AColor1.Red = AColor2.Red) + and (AColor1.Green = AColor2.Green) + and (AColor1.Blue = AColor2.Blue) + and (AColor1.Alpha = AColor2.Alpha); +end; + { TfpgTimer } procedure TfpgTimer.SetEnabled(const AValue: boolean); @@ -845,6 +1041,14 @@ begin Enabled := True; end; +procedure TfpgTimer.Pause(ASeconds: integer); +begin + if Enabled then + begin + FNextAlarm := incSecond(Now, ASeconds); + end; +end; + function fpgApplication: TfpgApplication; begin if not Assigned(uApplication) then @@ -869,7 +1073,10 @@ end; function fpgGetNamedColor(col: TfpgColor): TfpgColor; begin - Result := fpgNamedColors[col and $FF]; + if fpgIsNamedColor(col) then + Result := col // nothing to do, it is already a named color + else + Result := fpgNamedColors[col and $FF]; end; procedure fpgSetNamedColor(colorid, rgbvalue: longword); @@ -882,6 +1089,11 @@ begin fpgNamedColors[i] := rgbvalue; end; +function fpgIsNamedColor(col: TfpgColor): boolean; +begin + Result := (col and cl_BaseNamedColor) <> 0; +end; + function fpgGetNamedFontDesc(afontid: string): string; var n: integer; @@ -893,9 +1105,9 @@ begin Exit; //==> end; - {.$IFDEF DEBUG} + {$IFDEF DEBUG} Writeln('GetNamedFontDesc error: "' + afontid + '" is missing. Default is used.'); - {.$ENDIF} + {$ENDIF} Result := FPG_DEFAULT_FONT_DESC; end; @@ -952,6 +1164,7 @@ begin FHintPause := DEFAULT_HINT_PAUSE; FHintWidget := nil; // widget the mouse is over and whos hint text we need. FShowHint := True; + FStartDragDistance := 5; // pixels try inherited Create(AParams); @@ -1262,6 +1475,14 @@ begin FShowHint := AValue; end; +procedure TfpgApplication.SetStartDragDistance(const AValue: integer); +begin + if AValue < 0 then + FStartDragDistance := 0 + else + FStartDragDistance := AValue; +end; + procedure TfpgApplication.FreeFontRes(afontres: TfpgFontResource); var n: integer; @@ -1302,11 +1523,11 @@ end; procedure TfpgApplication.ProcessMessages; begin Flush; - while DoMessagesPending do - begin - WaitWindowMessage(0); - Flush; - end; +// while DoMessagesPending do // this blocked timers and other non-OS code +// begin + WaitWindowMessage(250); +// Flush; +// end; end; procedure TfpgApplication.SetMessageHook(AWidget: TObject; const AMsgCode: integer; AListener: TObject); @@ -1389,7 +1610,7 @@ end; procedure TfpgApplication.RunMessageLoop; begin - WaitWindowMessage(1000); + WaitWindowMessage(2000); end; { TfpgFont } @@ -1513,6 +1734,16 @@ begin DrawControlFrame(r.Left, r.Top, r.Width, r.Height); end; +procedure TfpgCanvas.DrawBevel(x, y, w, h: TfpgCoord; ARaised: Boolean); +begin + fpgStyle.DrawBevel(self, x, y, w, h, ARaised); +end; + +procedure TfpgCanvas.DrawBevel(r: TfpgRect; ARaised: Boolean); +begin + DrawBevel(r.Left, r.Top, r.Width, r.Height, ARaised); +end; + procedure TfpgCanvas.DrawDirectionArrow(x, y, w, h: TfpgCoord; direction: TArrowDirection); begin fpgStyle.DrawDirectionArrow(self, x, y, w, h, direction); @@ -1683,7 +1914,7 @@ begin fpgSetNamedColor(clText4, $404000); fpgSetNamedColor(clSelection, $08246A); fpgSetNamedColor(clSelectionText, $FFFFFF); - fpgSetNamedColor(clInactiveSel, $D0D0FF); + fpgSetNamedColor(clInactiveSel, $99A6BF); // win 2000 buttonface = $D4D0C8 fpgSetNamedColor(clInactiveSelText, $000000); fpgSetNamedColor(clScrollBar, $E8E4DB); fpgSetNamedColor(clButtonFace, $D5D2CD); @@ -1694,14 +1925,15 @@ begin fpgSetNamedColor(clInactiveWgFrame, $A0A0A0); fpgSetNamedColor(clTextCursor, $000000); fpgSetNamedColor(clChoiceListBox, $E8E8E8); - fpgSetNamedColor(clUnset, $D0D0FF); + fpgSetNamedColor(clUnset, $99A6BF); // dull (gray) blue fpgSetNamedColor(clMenuText, $000000); fpgSetNamedColor(clMenuDisabled, $909090); fpgSetNamedColor(clHintWindow, $FFFFBF); fpgSetNamedColor(clGridSelection, $08246A); // same as clSelection fpgSetNamedColor(clGridSelectionText, $FFFFFF); // same as clSelectionText - fpgSetNamedColor(clGridInactiveSel, $D0D0FF); // same as clInactiveSel + fpgSetNamedColor(clGridInactiveSel, $99A6BF); // same as clInactiveSel fpgSetNamedColor(clGridInactiveSelText, $000000); // same as clInactiveSelText + fpgSetNamedColor(clSplitterGrabBar, $839EFE); // pale blue // Global Font Objects @@ -1752,7 +1984,12 @@ begin if (btfIsEmbedded in AFlags) then ACanvas.SetColor(clHilite2) else - ACanvas.SetColor(clShadow2); + begin + if (btfFlat in AFlags) or (btfHover in AFlags) then + ACanvas.SetColor(clShadow1) { light shadow } + else + ACanvas.SetColor(clShadow2); { dark shadow } + end; end else ACanvas.SetColor(clHilite2); @@ -1774,14 +2011,27 @@ begin if (btfIsEmbedded in AFlags) then ACanvas.SetColor(clHilite1) else - ACanvas.SetColor(clShadow2); + begin + if (btfFlat in AFlags) or (btfHover in AFlags) then + ACanvas.SetColor(clHilite2) { light shadow } + else + ACanvas.SetColor(clShadow2); { dark shadow } + end; end else - ACanvas.SetColor(clShadow2); - + begin + if btfHover in AFlags then + ACanvas.SetColor(clShadow1) { light shadow } + else + ACanvas.SetColor(clShadow2); { dark shadow } + end; + ACanvas.DrawLine(r.Right, r.Top, r.Right, r.Bottom); // right ACanvas.DrawLine(r.Right, r.Bottom, r.Left-1, r.Bottom); // bottom + if (btfFlat in AFlags) or (btfHover in AFlags) then + exit; { "toolbar" style buttons need a nice thing/flat border } + // Right and Bottom (inner) if btfIsPressed in AFlags then begin @@ -1819,6 +2069,36 @@ begin ACanvas.DrawLine(r.Right-1, r.Bottom-1, r.Left+1, r.Bottom-1); // bottom (inner) end; +procedure TfpgStyle.DrawBevel(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord; ARaised: Boolean); +var + r: TfpgRect; +begin + r.SetRect(x, y, w, h); + ACanvas.SetColor(clWindowBackground); + ACanvas.SetLineStyle(1, lsSolid); + ACanvas.FillRectangle(x, y, w, h); + + if ARaised then + ACanvas.SetColor(clHilite2) + else + ACanvas.SetColor(clShadow1); + + { top } + ACanvas.DrawLine(r.Right-1, r.Top, r.Left, r.Top); + + { left } + ACanvas.DrawLine(r.Left, r.Top, r.Left, r.Bottom); + + if ARaised then + ACanvas.SetColor(clShadow1) + else + ACanvas.SetColor(clHilite2); + + { right, then bottom } + ACanvas.DrawLine(r.Right, r.Top, r.Right, r.Bottom); + ACanvas.DrawLine(r.Right, r.Bottom, r.Left-1, r.Bottom); +end; + procedure TfpgStyle.DrawDirectionArrow(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord; direction: TArrowDirection); var { @@ -1917,6 +2197,50 @@ begin ACanvas.SetLineStyle(oldLineWidth, oldLineStyle); end; +procedure TfpgStyle.DrawMenuRow(ACanvas: TfpgCanvas; r: TfpgRect; AFlags: TfpgMenuItemFlags); +begin + ACanvas.FillRectangle(r); +end; + +procedure TfpgStyle.DrawMenuItem(ACanvas: TfpgCanvas; r: TfpgRect; + AFlags: TfpgMenuItemFlags; AText: TfpgString); +begin + // +end; + +procedure TfpgStyle.DrawMenuItemSeparator(ACanvas: TfpgCanvas; r: TfpgRect); +begin + ACanvas.SetColor(clShadow1); + ACanvas.DrawLine(r.Left+1, r.Top+2, r.Right, r.Top+2); + ACanvas.SetColor(clHilite2); + ACanvas.DrawLine(r.Left+1, r.Top+3, r.Right, r.Top+3); +end; + +procedure TfpgStyle.DrawMenuItemImage(ACanvas: TfpgCanvas; x, y: TfpgCoord; r: TfpgRect; AFlags: TfpgMenuItemFlags); +var + img: TfpgImage; + lx: TfpgCoord; + ly: TfpgCoord; +begin + if mifChecked in AFlags then + begin + img := fpgImages.GetImage('stdimg.check'); // Do NOT localize + if mifSelected in AFlags then + img.Invert; // invert modifies the original image, so we must restore it later + ACanvas.DrawImage(x, y, img); + if mifSelected in AFlags then + img.Invert; // restore image to original state + end; + if mifSubMenu in AFlags then + begin + img := fpgImages.GetImage('sys.sb.right'); // Do NOT localize + lx := (r.height div 2) - 3; + lx := r.right-lx-2; + ly := y + ((r.Height-img.Height) div 2); + ACanvas.DrawImage(lx, ly, img); + end; +end; + { TfpgCaret } @@ -1967,6 +2291,7 @@ procedure TfpgCaret.UnSetCaret(ACanvas: TfpgCanvas); begin if (FCanvas = ACanvas) or (ACanvas = nil) then begin + FTimer.Enabled := False; FEnabled := False; FCanvas := nil; end; @@ -2158,6 +2483,42 @@ begin Result.UpdateImage; end; + +{ TfpgDrag } + +procedure TfpgDrag.SetMimeData(const AValue: TfpgMimeDataBase); +begin + if Assigned(FMimeData) then + FMimeData.Free; + FMimeData := AValue; +end; + +function TfpgDrag.GetSource: TfpgWindow; +begin + Result := TfpgWindow(inherited GetSource); +end; + +constructor TfpgDrag.Create(ASource: TfpgWindow); +begin + inherited Create; + FSource := ASource; +end; + +function TfpgDrag.Execute(const ADropActions: TfpgDropActions; + const ADefaultAction: TfpgDropAction): TfpgDropAction; +begin + {$NOTE These exception messages need to become resource strings } + if not Assigned(FMimeData) then + raise Exception.Create(ClassName + ': No mimedata was set before starting the drag'); + if not Assigned(FSource) then + raise Exception.Create(ClassName + ': No Source window was specified before starting the drag'); + if ADropActions = [] then + raise Exception.Create(ClassName + ': No Drop Action was specified'); + inherited Execute(ADropActions, ADefaultAction); +end; + + + initialization uApplication := nil; uClipboard := nil; diff --git a/src/corelib/fpg_msgqueue.inc b/src/corelib/fpg_msgqueue.inc index 386178d9..00862cc1 100644 --- a/src/corelib/fpg_msgqueue.inc +++ b/src/corelib/fpg_msgqueue.inc @@ -86,10 +86,15 @@ end; function fpgGetFirstMessage: PfpgMessageRec; begin - if UsedFirstMessage <> nil then - Result := @(UsedFirstMessage.msg) - else - Result := nil; + fpgApplication.Lock; + try + if UsedFirstMessage <> nil then + Result := @(UsedFirstMessage.msg) + else + Result := nil; + finally + fpgApplication.Unlock; + end; end; procedure fpgInitMsgQueue; diff --git a/src/corelib/fpg_stdimages.pas b/src/corelib/fpg_stdimages.pas index 2682ce3f..b25890ad 100644 --- a/src/corelib/fpg_stdimages.pas +++ b/src/corelib/fpg_stdimages.pas @@ -72,25 +72,25 @@ procedure fpgCreateStandardImages; begin // system images. Change these to the composite arrow bmp that includes // disabled state - fpgImages.AddBMP( + fpgImages.AddMaskedBMP( // 7x4 image 'sys.sb.up', @stdimg_arrow_up, - sizeof(stdimg_arrow_up)); + sizeof(stdimg_arrow_up), 0, 0); - fpgImages.AddBMP( + fpgImages.AddMaskedBMP( // 7x4 image 'sys.sb.down', @stdimg_arrow_down, - sizeof(stdimg_arrow_down)); + sizeof(stdimg_arrow_down), 0, 3); - fpgImages.AddBMP( + fpgImages.AddMaskedBMP( // 4x7 image 'sys.sb.left', @stdimg_arrow_left, - sizeof(stdimg_arrow_left)); + sizeof(stdimg_arrow_left), 0, 0); - fpgImages.AddBMP( + fpgImages.AddMaskedBMP( // 4x7 image 'sys.sb.right', @stdimg_arrow_right, - sizeof(stdimg_arrow_right)); + sizeof(stdimg_arrow_right), 3, 0); fpgImages.AddMaskedBMP( // 60x12 in total. 5 images of 12x12 each. 'sys.radiobuttons', @@ -225,6 +225,16 @@ begin sizeof(stdimg_folder_open_file_16), 0,0); fpgImages.AddMaskedBMP( + 'stdimg.folderhome', + @stdimg_folder_home_16, + sizeof(stdimg_folder_home_16), 0,0); + + fpgImages.AddMaskedBMP( + 'stdimg.bookmark', + @stdimg_bookmark_16, + sizeof(stdimg_bookmark_16), 0,0); + + fpgImages.AddMaskedBMP( 'stdimg.open', @stdimg_folder_open_16, sizeof(stdimg_folder_open_16), 0,0); @@ -250,6 +260,11 @@ begin sizeof(stdimg_help_16), 0,0); fpgImages.AddMaskedBMP( + 'stdimg.about', + @stdimg_about_16, + sizeof(stdimg_about_16), 0,0); + + fpgImages.AddMaskedBMP( 'stdimg.hidden', @stdimg_hidden, sizeof(stdimg_hidden), 0,0); diff --git a/src/corelib/fpg_stringutils.pas b/src/corelib/fpg_stringutils.pas index f97f1b61..e4d75f86 100644 --- a/src/corelib/fpg_stringutils.pas +++ b/src/corelib/fpg_stringutils.pas @@ -25,6 +25,9 @@ interface uses Classes, SysUtils, fpg_base; +type + TCharToUTF8Table = array[char] of PChar; + function UTF8CharacterLength(p: PChar): integer; function UTF8CharStart(UTF8Str: PChar; Len, Index: integer): PChar; @@ -34,7 +37,7 @@ function UTF8Length(const s: string): integer; function UTF8Length(p: PChar; ByteCount: integer): integer; function UTF8Pos(const SearchForText, SearchInText: string): integer; procedure UTF8Delete(var S: string; Index, Size: integer); -procedure UTF8Insert(const Source: string; var S: string; Index: integer); +procedure UTF8Insert(const SubStr: string; var AText: string; Index: integer); function UTF8CharAtByte(const s: string; const BytePos: integer; out aChar: string): integer; @@ -48,6 +51,16 @@ procedure Insert8(const Source: string; var S: string; Index: integer); function fpgCharAt(const s: TfpgString; Index: integer): TfpgChar; function fpgAppendPathDelim(const Path: TfpgString): TfpgString; function fpgRemovePathDelim(const Path: TfpgString): TfpgString; +function fpgTrimR(const AString, ATrim: TfpgString; ACaseSensitive: boolean = false): TfpgString; + + +// Encoding conversions +function CP437ToUTF8(const s: string): TfpgString; // DOS central europe +function CP850ToUTF8(const s: string): TfpgString; // DOS western europe +function IBMGraphToUTF8(const s: string): TfpgString; // IBM PC / DOS http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/IBMGRAPH.TXT +function IPFToUTF8(const s: string): TfpgString; // minor replacements to improve DocView output +function SingleByteToUTF8(const s: string; const Table: TCharToUTF8Table): TfpgString; + implementation @@ -261,16 +274,16 @@ begin S := b + e; end; -procedure UTF8Insert(const Source: string; var S: string; Index: integer); +procedure UTF8Insert(const SubStr: string; var AText: string; Index: integer); var b: string; e: string; begin - if UTF8Length(Source) = 0 then + if UTF8Length(SubStr) = 0 then Exit; //==> - b := UTF8Copy(S, 1, Index-1); // beginning string - e := UTF8Copy(S, Index, UTF8Length(S)-Index+1); // ending string - S := b + Source + e; + b := UTF8Copy(AText, 1, Index-1); // beginning string + e := UTF8Copy(AText, Index, UTF8Length(AText)-Index+1); // ending string + AText := b + SubStr + e; end; function UTF8CharAtByte(const s: string; const BytePos: integer; out aChar: string): integer; @@ -335,5 +348,1161 @@ begin Result := Path; end; +function fpgTrimR(const AString, ATrim: TfpgString; ACaseSensitive: boolean): TfpgString; +var + li: integer; +begin + if ACaseSensitive then + li := UTF8Pos(ATrim, AString) + else + li := UTF8Pos(UpperCase(ATrim), UpperCase(AString)); + + if li <> 0 then + Result := UTF8Copy(AString, 1, li - 1) + else + Result := AString; +end; + +const + ArrayCP437ToUTF8 : TCharToUTF8Table = ( + #0, // #0 + #1, // #1 + #2, // #2 + #3, // #3 + #4, // #4 + #5, // #5 + #6, // #6 + #$E2#$80#$A2, // #7 bullet + #8, // #8 + #9, // #9 + #10, // #10 + #11, // #11 + #12, // #12 + #13, // #13 + #14, // #14 + #15, // #15 + #16, // #16 + #17, // #17 + #18, // #18 + #19, // #19 + #20, // #20 + #21, // #21 + #22, // #22 + #23, // #23 + #$E2#$86#$91, // #24 up arrow + #$E2#$86#$93, // #25 down arrow + #$E2#$86#$92, // #26 right arrow + #$E2#$86#$90, // #27 left arrow + #28, // #28 + #29, // #29 + #30, // #30 + #31, // #31 + ' ', // ' ' + '!', // '!' + '"', // '"' + '#', // '#' + '$', // '$' + '%', // '%' + '&', // '&' + '''', // '''' + '(', // '(' + ')', // ')' + '*', // '*' + '+', // '+' + ',', // ',' + '-', // '-' + '.', // '.' + '/', // '/' + '0', // '0' + '1', // '1' + '2', // '2' + '3', // '3' + '4', // '4' + '5', // '5' + '6', // '6' + '7', // '7' + '8', // '8' + '9', // '9' + ':', // ':' + ';', // ';' + '<', // '<' + '=', // '=' + '>', // '>' + '?', // '?' + '@', // '@' + 'A', // 'A' + 'B', // 'B' + 'C', // 'C' + 'D', // 'D' + 'E', // 'E' + 'F', // 'F' + 'G', // 'G' + 'H', // 'H' + 'I', // 'I' + 'J', // 'J' + 'K', // 'K' + 'L', // 'L' + 'M', // 'M' + 'N', // 'N' + 'O', // 'O' + 'P', // 'P' + 'Q', // 'Q' + 'R', // 'R' + 'S', // 'S' + 'T', // 'T' + 'U', // 'U' + 'V', // 'V' + 'W', // 'W' + 'X', // 'X' + 'Y', // 'Y' + 'Z', // 'Z' + '[', // '[' + '\', // '\' + ']', // ']' + '^', // '^' + '_', // '_' + '`', // '`' + 'a', // 'a' + 'b', // 'b' + 'c', // 'c' + 'd', // 'd' + 'e', // 'e' + 'f', // 'f' + 'g', // 'g' + 'h', // 'h' + 'i', // 'i' + 'j', // 'j' + 'k', // 'k' + 'l', // 'l' + 'm', // 'm' + 'n', // 'n' + 'o', // 'o' + 'p', // 'p' + 'q', // 'q' + 'r', // 'r' + 's', // 's' + 't', // 't' + 'u', // 'u' + 'v', // 'v' + 'w', // 'w' + 'x', // 'x' + 'y', // 'y' + 'z', // 'z' + '{', // '{' + '|', // '|' + '}', // '}' + '~', // '~' + #127, // #127 + #195#135, // #128 + #195#188, // #129 + #195#169, // #130 + #195#162, // #131 + #195#164, // #132 + #195#160, // #133 + #195#165, // #134 + #195#167, // #135 + #195#170, // #136 + #195#171, // #137 + #195#168, // #138 + #195#175, // #139 + #195#174, // #140 + #195#172, // #141 + #195#132, // #142 + #195#133, // #143 + #195#137, // #144 + #195#166, // #145 + #195#134, // #146 + #195#180, // #147 + #195#182, // #148 + #195#178, // #149 + #195#187, // #150 + #195#185, // #151 + #195#191, // #152 + #195#150, // #153 + #195#156, // #154 + #194#162, // #155 + #194#163, // #156 + #194#165, // #157 + #226#130#167, // #158 + #198#146, // #159 + #195#161, // #160 + #195#173, // #161 + #195#179, // #162 + #195#186, // #163 + #195#177, // #164 + #195#145, // #165 + #194#170, // #166 + #194#186, // #167 + #194#191, // #168 + #226#140#144, // #169 + #194#172, // #170 + #194#189, // #171 + #194#188, // #172 + #194#161, // #173 + #194#171, // #174 + #194#187, // #175 + #226#150#145, // #176 + #226#150#146, // #177 + #226#150#147, // #178 + #226#148#130, // #179 + #226#148#164, // #180 + #226#149#161, // #181 + #226#149#162, // #182 + #226#149#150, // #183 + #226#149#149, // #184 + #226#149#163, // #185 + #226#149#145, // #186 + #226#149#151, // #187 + #226#149#157, // #188 + #226#149#156, // #189 + #226#149#155, // #190 + #226#148#144, // #191 + #226#148#148, // #192 + #226#148#180, // #193 + #226#148#172, // #194 + #226#148#156, // #195 + #226#148#128, // #196 + #226#148#188, // #197 + #226#149#158, // #198 + #226#149#159, // #199 + #226#149#154, // #200 + #226#149#148, // #201 + #226#149#169, // #202 + #226#149#166, // #203 + #226#149#160, // #204 + #226#149#144, // #205 + #226#149#172, // #206 + #226#149#167, // #207 + #226#149#168, // #208 + #226#149#164, // #209 + #226#149#165, // #210 + #226#149#153, // #211 + #226#149#152, // #212 + #226#149#146, // #213 + #226#149#147, // #214 + #226#149#171, // #215 + #226#149#170, // #216 + #226#148#152, // #217 + #226#148#140, // #218 + #226#150#136, // #219 + #226#150#132, // #220 + #226#150#140, // #221 + #226#150#144, // #222 + #226#150#128, // #223 + #206#177, // #224 + #195#159, // #225 + #206#147, // #226 + #207#128, // #227 + #206#163, // #228 + #207#131, // #229 + #194#181, // #230 + #207#132, // #231 + #206#166, // #232 + #206#152, // #233 + #206#169, // #234 + #206#180, // #235 + #226#136#158, // #236 + #207#134, // #237 + #206#181, // #238 + #226#136#169, // #239 + #226#137#161, // #240 + #194#177, // #241 + #226#137#165, // #242 + #226#137#164, // #243 + #226#140#160, // #244 + #226#140#161, // #245 + #195#183, // #246 + #226#137#136, // #247 + #194#176, // #248 + #226#136#153, // #249 + #194#183, // #250 + #226#136#154, // #251 + #226#129#191, // #252 + #194#178, // #253 + #226#150#160, // #254 + #194#160 // #255 + ); + + ArrayCP850ToUTF8 : TCharToUTF8Table = ( + #0, // #0 + #1, // #1 + #2, // #2 + #3, // #3 + #4, // #4 + #5, // #5 + #6, // #6 + #$E2#$80#$A2, // #7 bullet + #8, // #8 + #9, // #9 + #10, // #10 + #11, // #11 + #12, // #12 + #13, // #13 + #14, // #14 + #15, // #15 + #16, // #16 + #17, // #17 + #18, // #18 + #19, // #19 + #20, // #20 + #21, // #21 + #22, // #22 + #23, // #23 + #24, // #24 + #25, // #25 + #26, // #26 + #27, // #27 + #28, // #28 + #29, // #29 + #30, // #30 + #31, // #31 + ' ', // ' ' + '!', // '!' + '"', // '"' + '#', // '#' + '$', // '$' + '%', // '%' + '&', // '&' + '''', // '''' + '(', // '(' + ')', // ')' + '*', // '*' + '+', // '+' + ',', // ',' + '-', // '-' + '.', // '.' + '/', // '/' + '0', // '0' + '1', // '1' + '2', // '2' + '3', // '3' + '4', // '4' + '5', // '5' + '6', // '6' + '7', // '7' + '8', // '8' + '9', // '9' + ':', // ':' + ';', // ';' + '<', // '<' + '=', // '=' + '>', // '>' + '?', // '?' + '@', // '@' + 'A', // 'A' + 'B', // 'B' + 'C', // 'C' + 'D', // 'D' + 'E', // 'E' + 'F', // 'F' + 'G', // 'G' + 'H', // 'H' + 'I', // 'I' + 'J', // 'J' + 'K', // 'K' + 'L', // 'L' + 'M', // 'M' + 'N', // 'N' + 'O', // 'O' + 'P', // 'P' + 'Q', // 'Q' + 'R', // 'R' + 'S', // 'S' + 'T', // 'T' + 'U', // 'U' + 'V', // 'V' + 'W', // 'W' + 'X', // 'X' + 'Y', // 'Y' + 'Z', // 'Z' + '[', // '[' + '\', // '\' + ']', // ']' + '^', // '^' + '_', // '_' + '`', // '`' + 'a', // 'a' + 'b', // 'b' + 'c', // 'c' + 'd', // 'd' + 'e', // 'e' + 'f', // 'f' + 'g', // 'g' + 'h', // 'h' + 'i', // 'i' + 'j', // 'j' + 'k', // 'k' + 'l', // 'l' + 'm', // 'm' + 'n', // 'n' + 'o', // 'o' + 'p', // 'p' + 'q', // 'q' + 'r', // 'r' + 's', // 's' + 't', // 't' + 'u', // 'u' + 'v', // 'v' + 'w', // 'w' + 'x', // 'x' + 'y', // 'y' + 'z', // 'z' + '{', // '{' + '|', // '|' + '}', // '}' + '~', // '~' + #127, // #127 + #195#135, // #128 + #195#188, // #129 + #195#169, // #130 + #195#162, // #131 + #195#164, // #132 + #195#160, // #133 + #195#165, // #134 + #195#167, // #135 + #195#170, // #136 + #195#171, // #137 + #195#168, // #138 + #195#175, // #139 + #195#174, // #140 + #195#172, // #141 + #195#132, // #142 + #195#133, // #143 + #195#137, // #144 + #195#166, // #145 + #195#134, // #146 + #195#180, // #147 + #195#182, // #148 + #195#178, // #149 + #195#187, // #150 + #195#185, // #151 + #195#191, // #152 + #195#150, // #153 + #195#156, // #154 + #195#184, // #155 + #194#163, // #156 + #195#152, // #157 + #195#151, // #158 + #198#146, // #159 + #195#161, // #160 + #195#173, // #161 + #195#179, // #162 + #195#186, // #163 + #195#177, // #164 + #195#145, // #165 + #194#170, // #166 + #194#186, // #167 + #194#191, // #168 + #194#174, // #169 + #194#172, // #170 + #194#189, // #171 + #194#188, // #172 + #194#161, // #173 + #194#171, // #174 + #194#187, // #175 + #226#150#145, // #176 + #226#150#146, // #177 + #226#150#147, // #178 + #226#148#130, // #179 + #226#148#164, // #180 + #195#129, // #181 + #195#130, // #182 + #195#128, // #183 + #194#169, // #184 + #226#149#163, // #185 + #226#149#145, // #186 + #226#149#151, // #187 + #226#149#157, // #188 + #194#162, // #189 + #194#165, // #190 + #226#148#144, // #191 + #226#148#148, // #192 + #226#148#180, // #193 + #226#148#172, // #194 + #226#148#156, // #195 + #226#148#128, // #196 + #226#148#188, // #197 + #195#163, // #198 + #195#131, // #199 + #226#149#154, // #200 + #226#149#148, // #201 + #226#149#169, // #202 + #226#149#166, // #203 + #226#149#160, // #204 + #226#149#144, // #205 + #226#149#172, // #206 + #194#164, // #207 + #195#176, // #208 + #195#144, // #209 + #195#138, // #210 + #195#139, // #211 + #195#136, // #212 + #196#177, // #213 + #195#141, // #214 + #195#142, // #215 + #195#143, // #216 + #226#148#152, // #217 + #226#148#140, // #218 + #226#150#136, // #219 + #226#150#132, // #220 + #194#166, // #221 + #195#140, // #222 + #226#150#128, // #223 + #195#147, // #224 + #195#159, // #225 + #195#148, // #226 + #195#146, // #227 + #195#181, // #228 + #195#149, // #229 + #194#181, // #230 + #195#190, // #231 + #195#158, // #232 + #195#154, // #233 + #195#155, // #234 + #195#153, // #235 + #195#189, // #236 + #195#157, // #237 + #194#175, // #238 + #194#180, // #239 + #194#173, // #240 + #194#177, // #241 + #226#128#151, // #242 + #194#190, // #243 + #194#182, // #244 + #194#167, // #245 + #195#183, // #246 + #194#184, // #247 + #194#176, // #248 + #194#168, // #249 + #194#183, // #250 + #194#185, // #251 + #194#179, // #252 + #194#178, // #253 + #226#150#160, // #254 + #194#160 // #255 + ); + + + + ArrayIBMGraphToUTF8: TCharToUTF8Table = ( + #0, // #0 + #1, // #1 + #2, // #2 + #3, // #3 + #4, // #4 + #5, // #5 + #6, // #6 + #$E2#$80#$A2, // #7 bullet + #8, // #8 + #9, // #9 + #10, // #10 + #11, // #11 + #12, // #12 + #13, // #13 + #14, // #14 + #15, // #15 + #16, // #16 + #$E2#$86#$90, // #17 + #18, // #18 + #19, // #19 + #20, // #20 + #21, // #21 + #22, // #22 + #23, // #23 + #$E2#$86#$91, // #24 up arrow + #$E2#$86#$93, // #25 down arrow + #$E2#$86#$92, // #26 right arrow + #$E2#$86#$90, // #27 left arrow + #28, // #28 + #29, // #29 left arrow + #30, // #30 + #31, // #31 + ' ', // ' ' + '!', // '!' + '"', // '"' + '#', // '#' + '$', // '$' + '%', // '%' + '&', // '&' + '''', // '''' + '(', // '(' + ')', // ')' + '*', // '*' + '+', // '+' + ',', // ',' + '-', // '-' + '.', // '.' + '/', // '/' + '0', // '0' + '1', // '1' + '2', // '2' + '3', // '3' + '4', // '4' + '5', // '5' + '6', // '6' + '7', // '7' + '8', // '8' + '9', // '9' + ':', // ':' + ';', // ';' + '<', // '<' + '=', // '=' + '>', // '>' + '?', // '?' + '@', // '@' + 'A', // 'A' + 'B', // 'B' + 'C', // 'C' + 'D', // 'D' + 'E', // 'E' + 'F', // 'F' + 'G', // 'G' + 'H', // 'H' + 'I', // 'I' + 'J', // 'J' + 'K', // 'K' + 'L', // 'L' + 'M', // 'M' + 'N', // 'N' + 'O', // 'O' + 'P', // 'P' + 'Q', // 'Q' + 'R', // 'R' + 'S', // 'S' + 'T', // 'T' + 'U', // 'U' + 'V', // 'V' + 'W', // 'W' + 'X', // 'X' + 'Y', // 'Y' + 'Z', // 'Z' + '[', // '[' + '\', // '\' + ']', // ']' + '^', // '^' + '_', // '_' + '`', // '`' + 'a', // 'a' + 'b', // 'b' + 'c', // 'c' + 'd', // 'd' + 'e', // 'e' + 'f', // 'f' + 'g', // 'g' + 'h', // 'h' + 'i', // 'i' + 'j', // 'j' + 'k', // 'k' + 'l', // 'l' + 'm', // 'm' + 'n', // 'n' + 'o', // 'o' + 'p', // 'p' + 'q', // 'q' + 'r', // 'r' + 's', // 's' + 't', // 't' + 'u', // 'u' + 'v', // 'v' + 'w', // 'w' + 'x', // 'x' + 'y', // 'y' + 'z', // 'z' + '{', // '{' + '|', // '|' + '}', // '}' + '~', // '~' + #127, // #127 + #195#135, // #128 + #195#188, // #129 + #195#169, // #130 + #195#162, // #131 + #195#164, // #132 + #195#160, // #133 + #195#165, // #134 + #195#167, // #135 + #195#170, // #136 + #195#171, // #137 + #195#168, // #138 + #195#175, // #139 + #195#174, // #140 + #195#172, // #141 + #195#132, // #142 + #195#133, // #143 + #195#137, // #144 + #195#166, // #145 + #195#134, // #146 + #195#180, // #147 + #195#182, // #148 + #195#178, // #149 + #195#187, // #150 + #195#185, // #151 + #195#191, // #152 + #195#150, // #153 + #195#156, // #154 + #194#162, // #155 + #194#163, // #156 + #194#165, // #157 + #226#130#167, // #158 + #198#146, // #159 + #195#161, // #160 + #195#173, // #161 + #195#179, // #162 + #195#186, // #163 + #195#177, // #164 + #195#145, // #165 + #194#170, // #166 + #194#186, // #167 + #194#191, // #168 + #226#140#144, // #169 + #194#172, // #170 + #194#189, // #171 + #194#188, // #172 + #194#161, // #173 + #194#171, // #174 + #194#187, // #175 + #226#150#145, // #176 + #226#150#146, // #177 + #226#150#147, // #178 + #226#148#130, // #179 + #226#148#164, // #180 + #226#149#161, // #181 + #226#149#162, // #182 + #226#149#150, // #183 + #226#149#149, // #184 + #226#149#163, // #185 + #226#149#145, // #186 + #226#149#151, // #187 + #226#149#157, // #188 + #226#149#156, // #189 + #226#149#155, // #190 + #226#148#144, // #191 + #226#148#148, // #192 + #226#148#180, // #193 + #226#148#172, // #194 + #226#148#156, // #195 + #226#148#128, // #196 + #226#148#188, // #197 + #226#149#158, // #198 + #226#149#159, // #199 + #226#149#154, // #200 + #226#149#148, // #201 + #226#149#169, // #202 + #226#149#166, // #203 + #226#149#160, // #204 + #226#149#144, // #205 + #226#149#172, // #206 + #226#149#167, // #207 + #226#149#168, // #208 + #226#149#164, // #209 + #226#149#165, // #210 + #226#149#153, // #211 + #226#149#152, // #212 + #226#149#146, // #213 + #226#149#147, // #214 + #226#149#171, // #215 + #226#149#170, // #216 + #226#148#152, // #217 + #226#148#140, // #218 + #226#150#136, // #219 + #226#150#132, // #220 + #226#150#140, // #221 + #226#150#144, // #222 + #226#150#128, // #223 + #206#177, // #224 + #195#159, // #225 + #206#147, // #226 + #207#128, // #227 + #206#163, // #228 + #207#131, // #229 + #194#181, // #230 + #207#132, // #231 + #206#166, // #232 + #206#152, // #233 + #206#169, // #234 + #206#180, // #235 + #226#136#158, // #236 + #207#134, // #237 + #206#181, // #238 + #226#136#169, // #239 + #226#137#161, // #240 + #194#177, // #241 + #226#137#165, // #242 + #226#137#164, // #243 + #226#140#160, // #244 + #226#140#161, // #245 + #195#183, // #246 + #226#137#136, // #247 + #194#176, // #248 + #226#136#153, // #249 + #194#183, // #250 + #226#136#154, // #251 + #226#129#191, // #252 + #194#178, // #253 + #226#150#160, // #254 + #194#160 // #255 + ); + + ArrayIPFToUTF8 : TCharToUTF8Table = ( + #0, // #0 + #1, // #1 + #2, // #2 + #3, // #3 + #4, // #4 + #5, // #5 + #6, // #6 + #$E2#$80#$A2, // #7 bullet (hard-coded in IPF Compiler) + #8, // #8 + #9, // #9 + #10, // #10 + #$E2#$97#$84, // #11 + #12, // #12 + #13, // #13 + #14, // #14 + #15, // #15 + '>', // #16 + '<', // #17 + #18, // #18 + #19, // #19 + #20, // #20 + #21, // #21 + #22, // #22 + #23, // #23 + #24, // #24 up arrow + #25, // #25 down arrow + #26, // #26 right arrow + #27, // #27 left arrow + #28, // #28 + #29, // #29 + #30, // #30 + #31, // #31 + ' ', // ' ' + '!', // '!' + '"', // '"' + '#', // '#' + '$', // '$' + '%', // '%' + '&', // '&' + '''', // '''' + '(', // '(' + ')', // ')' + '*', // '*' + '+', // '+' + ',', // ',' + '-', // '-' + '.', // '.' + '/', // '/' + '0', // '0' + '1', // '1' + '2', // '2' + '3', // '3' + '4', // '4' + '5', // '5' + '6', // '6' + '7', // '7' + '8', // '8' + '9', // '9' + ':', // ':' + ';', // ';' + '<', // '<' + '=', // '=' + '>', // '>' + '?', // '?' + '@', // '@' + 'A', // 'A' + 'B', // 'B' + 'C', // 'C' + 'D', // 'D' + 'E', // 'E' + 'F', // 'F' + 'G', // 'G' + 'H', // 'H' + 'I', // 'I' + 'J', // 'J' + 'K', // 'K' + 'L', // 'L' + 'M', // 'M' + 'N', // 'N' + 'O', // 'O' + 'P', // 'P' + 'Q', // 'Q' + 'R', // 'R' + 'S', // 'S' + 'T', // 'T' + 'U', // 'U' + 'V', // 'V' + 'W', // 'W' + 'X', // 'X' + 'Y', // 'Y' + 'Z', // 'Z' + '[', // '[' + '\', // '\' + ']', // ']' + '^', // '^' + '_', // '_' + '`', // '`' + 'a', // 'a' + 'b', // 'b' + 'c', // 'c' + 'd', // 'd' + 'e', // 'e' + 'f', // 'f' + 'g', // 'g' + 'h', // 'h' + 'i', // 'i' + 'j', // 'j' + 'k', // 'k' + 'l', // 'l' + 'm', // 'm' + 'n', // 'n' + 'o', // 'o' + 'p', // 'p' + 'q', // 'q' + 'r', // 'r' + 's', // 's' + 't', // 't' + 'u', // 'u' + 'v', // 'v' + 'w', // 'w' + 'x', // 'x' + 'y', // 'y' + 'z', // 'z' + '{', // '{' + '|', // '|' + '}', // '}' + '~', // '~' + #$E2#$8C#$82, // #127 house + #128, // #195#135 + #129, // #195#188 + #130, // #195#169 + #131, // #195#162 + #132, // #195#164 + #133, // #195#160 + #134, // #195#165 + #135, // #195#167 + #136, // #195#170 + #137, // #195#171 + #138, // #195#168 + #139, // #195#175 + #140, // #195#174 + #141, // #195#172 + #142, // #195#132 + #143, // #195#133 + #144, // #195#137 + #145, // #195#166 + #146, // #195#134 + #147, // #195#180 + #148, // #195#182 + #149, // #195#178 + #150, // #195#187 + #151, // #195#185 + #152, // #195#191 + #153, // #195#150 + #154, // #195#156 + #155, // #194#162 + #156, // #194#163 + #157, // #194#165 + #158, // #226#130#167 + #159, // #198#146 + #160, // #195#161 + #161, // #195#173 + #162, // #195#179 + #163, // #195#186 + #164, // #195#177 + #165, // #195#145 + #166, // #194#170 + #167, // #194#186 + #168, // #194#191 + #169, // #226#140#144 + #170, // #194#172 + #171, // #194#189 + #172, // #194#188 + #173, // #194#161 + #174, // #194#171 + #175, // #194#187 + #176, // #226#150#145 + #177, // #226#150#146 + #178, // #226#150#147 + #179, // #226#148#130 + #180, // #226#148#164 + #181, // #226#149#161 + #182, // #226#149#162 + #183, // #226#149#150 + #184, // #226#149#149 + #185, // #226#149#163 + #186, // #226#149#145 + #187, // #226#149#151 + #188, // #226#149#157 + #189, // #226#149#156 + #190, // #226#149#155 + #191, // #226#148#144 + #192, // #226#148#148 + #193, // #226#148#180 + #$E2#$94#$AC, // #226#148#172 + #195, // #226#148#156 + #$E2#$94#$80, // #196 + #197, // #226#148#188 + #198, // #226#149#158 + #199, // #226#149#159 + #200, // #226#149#154 + #201, // #226#149#148 + #202, // #226#149#169 + #203, // #226#149#166 + #204, // #226#149#160 + #205, // #226#149#144 + #206, // #226#149#172 + #207, // #226#149#167 + #208, // #226#149#168 + #209, // #226#149#164 + #210, // #226#149#165 + #211, // #226#149#153 + #212, // #226#149#152 + #213, // #226#149#146 + #214, // #226#149#147 + #215, // #226#149#171 + #216, // #226#149#170 + #217, // #226#148#152 + #218, // #226#148#140 + #219, // #226#150#136 + #220, // #226#150#132 + #221, // #226#150#140 + #222, // #226#150#144 + #223, // #226#150#128 + #224, // #206#177 + #225, // #195#159 + #226, // #206#147 + #227, // #207#128 + #228, // #206#163 + #229, // #207#131 + #230, // #194#181 + #231, // #207#132 + #232, // #206#166 + #233, // #206#152 + #234, // #206#169 + #235, // #206#180 + #236, // #226#136#158 + #237, // #207#134 + #238, // #206#181 + #239, // #226#136#169 + #240, // #226#137#161 + #241, // #194#177 + #242, // #226#137#165 + #243, // #226#137#164 + #244, // #226#140#160 + #245, // #226#140#161 + #246, // #195#183 + #247, // #226#137#136 + #248, // #194#176 + #249, // #226#136#153 + #250, // #194#183 + #251, // #226#136#154 + #252, // #226#129#191 + #253, // #194#178 + #254, // #226#150#160 + #255 // #194#160 + ); + + +function CP437ToUTF8(const s: string): TfpgString; +begin + Result := SingleByteToUTF8(s, ArrayCP437ToUTF8); +end; + +function CP850ToUTF8(const s: string): TfpgString; +begin + Result := SingleByteToUTF8(s, ArrayCP850ToUTF8); +end; + +function IBMGraphToUTF8(const s: string): TfpgString; +begin + Result := SingleByteToUTF8(s, ArrayIBMGraphToUTF8); +end; + +function IPFToUTF8(const s: string): TfpgString; + // Seaches <AValue> and replaces <ADel> with <AIns>. Case sensitive. + function tiStrTran(AValue, ADel, AIns : string): string; + var + i : integer; + sToChange : string; + begin + result := ''; + sToChange := AValue; + i := UTF8Pos(ADel, sToChange); + while i <> 0 do + begin + result := result + UTF8Copy(sToChange, 1, i-1) + AIns; + UTF8Delete(sToChange, 1, i+UTF8length(ADel)-1); + i := UTF8Pos(ADel, sToChange); + end; + result := result + sToChange; + end; + +begin + // IBM Graph CodePage 437 (kind-of) to Unicode mapping. + // Below is what we had before this function + Result := SingleByteToUTF8(s, ArrayIPFToUTF8); + //Result := s; + //Result := StringReplace(Result, Chr($07), #$E2#$80#$A2, [rfReplaceAll, rfIgnoreCase]); // u+2022 small bullet + //Result := tiStrTran(Result, Char(16), '>' ); + //Result := tiStrTran(Result, Char(17), '<' ); + //Result := tiStrTran(Result, Char($1f), '▼' ); + //Result := tiStrTran(Result, Char(179), '│' ); + //Result := tiStrTran(Result, Char(180), '┤' ); + //Result := tiStrTran(Result, Char(191), '┐' ); + //Result := tiStrTran(Result, Char(192), '└' ); + //Result := tiStrTran(Result, Char(193), '┴' ); + //Result := tiStrTran(Result, Char(194), '┬' ); + //Result := tiStrTran(Result, Char(195), '├' ); + //Result := tiStrTran(Result, Char(196), '─' ); + //Result := tiStrTran(Result, Char(197), '┼' ); + //Result := tiStrTran(Result, Char(217), '┘' ); + //Result := tiStrTran(Result, Char(218), '┌' ); +end; + +function SingleByteToUTF8(const s: string; const Table: TCharToUTF8Table): TfpgString; +var + len: Integer; + i: Integer; + Src: PChar; + Dest: PChar; + p: PChar; + c: Char; +begin + if s='' then + begin + Result := s; + exit; + end; + len := length(s); + SetLength(Result, len*4); // UTF-8 is at most 4 bytes + Src := PChar(s); + Dest := PChar(Result); + for i := 1 to len do + begin + c := Src^; + inc(Src); + //if ord(c) < 128 then + //begin + // Dest^ := c; + // inc(Dest); + //end + //else + begin + p := Table[c]; + if p <> nil then + begin + while p^ <> #0 do + begin + Dest^ := p^; + inc(p); + inc(Dest); + end; + end; + end; + end; + SetLength(Result, PtrUInt(Dest)-PtrUInt(Result)); +end; + + end. diff --git a/src/corelib/fpg_utils.pas b/src/corelib/fpg_utils.pas index d4d7886c..822051a5 100644 --- a/src/corelib/fpg_utils.pas +++ b/src/corelib/fpg_utils.pas @@ -31,6 +31,7 @@ uses function fpgToOSEncoding(aString: TfpgString): string; function fpgFromOSEncoding(aString: string): TfpgString; procedure fpgOpenURL(const aURL: TfpgString); +function fpgFileSize(const AFilename: TfpgString): integer; // *** Common functions for all platforms *** @@ -40,6 +41,11 @@ function fpgAppendPathDelim(const Path: TfpgString): TfpgString; function fpgHasSubDirs(const Dir: TfpgString; AShowHidden: Boolean): Boolean; function fpgAllFilesMask: TfpgString; function fpgConvertLineEndings(const s: TfpgString): TfpgString; +function fpgGetToolkitConfigDir: TfpgString; +{ This is so that when we support LTR and RTL languages, the colon will be + added at the correct place. } +function fpgAddColon(const AText: TfpgString): TfpgString; +function fpgIsBitSet(const AData: integer; const AIndex: integer): boolean; // RTL wrapper filesystem functions with platform independant encoding @@ -51,12 +57,16 @@ function fpgGetCurrentDir: TfpgString; function fpgSetCurrentDir(const NewDir: TfpgString): Boolean; function fpgExpandFileName(const FileName: TfpgString): TfpgString; function fpgFileExists(const FileName: TfpgString): Boolean; +function fpgDeleteFile(const FileName: TfpgString): Boolean; function fpgDirectoryExists(const ADirectory: TfpgString): Boolean; function fpgExtractFileDir(const FileName: TfpgString): TfpgString; function fpgExtractFilePath(const FileName: TfpgString): TfpgString; function fpgExtractFileName(const FileName: TfpgString): TfpgString; function fpgExtractFileExt(const FileName: TfpgString): TfpgString; function fpgForceDirectories(const ADirectory: TfpgString): Boolean; +function fpgChangeFileExt(const FileName, Extension: TfpgString): TfpgString; +function fpgGetAppConfigDir(const Global: Boolean): TfpgString; +function fpgGetAppConfigFile(const Global: Boolean; const SubDir: Boolean): TfpgString; implementation @@ -120,6 +130,13 @@ begin Result := FileExists(fpgToOSEncoding(FileName)); end; +function fpgDeleteFile(const FileName: TfpgString): Boolean; +begin + { Don't remove 'SysUtils.' prefix, it is required under Windows, other + FPC tries to use Windows.DeleteFile API - which is wrong } + Result := SysUtils.DeleteFile(fpgToOSEncoding(FileName)); +end; + function fpgDirectoryExists(const ADirectory: TfpgString): Boolean; begin Result := DirectoryExists(fpgToOSEncoding(ADirectory)); @@ -150,6 +167,21 @@ begin Result := ForceDirectories(fpgToOSEncoding(ADirectory)); end; +function fpgChangeFileExt(const FileName, Extension: TfpgString): TfpgString; +begin + Result := ChangeFileExt(fpgToOSEncoding(Filename), Extension); +end; + +function fpgGetAppConfigDir(const Global: Boolean): TfpgString; +begin + Result := fpgFromOSEncoding(GetAppConfigDir(Global)); +end; + +function fpgGetAppConfigFile(const Global: Boolean; const SubDir: Boolean): TfpgString; +begin + Result := fpgFromOSEncoding(GetAppConfigFile(Global, SubDir)); +end; + function fpgAppendPathDelim(const Path: TfpgString): TfpgString; begin if (Path <> '') and (Path[length(Path)] <> PathDelim) then @@ -191,7 +223,7 @@ begin break; until fpgFindNext(FileInfo) <> 0; finally - FindClose(FileInfo); + SysUtils.FindClose(FileInfo); end; end; end; @@ -227,6 +259,22 @@ begin Inc(i); end; +function fpgGetToolkitConfigDir: TfpgString; +begin + Result := fpgTrimR(fpgGetAppConfigDir(False), ApplicationName, True) + FPG_CONFIG_DIR; +end; + +function fpgAddColon(const AText: TfpgString): TfpgString; +begin + { TODO : Check language direction and add colon at appropriate end. This is very crude! } + Result := AText + ':'; +end; + +function fpgIsBitSet(const AData: integer; const AIndex: integer): boolean; +begin + Result := (AData and (1 shl AIndex) <> 0); +end; + end. diff --git a/src/corelib/fpg_widget.pas b/src/corelib/fpg_widget.pas index 39bb4193..5e3ba007 100644 --- a/src/corelib/fpg_widget.pas +++ b/src/corelib/fpg_widget.pas @@ -34,12 +34,19 @@ type THintEvent = procedure(Sender: TObject; var AHint: TfpgString) of object; + TfpgDragEnterEvent = procedure(Sender, Source: TObject; AMimeList: TStringList; var AMimeChoice: TfpgString; var ADropAction: TfpgDropAction; var Accept: Boolean) of object; + TfpgDragDropEvent = procedure(Sender, Source: TObject; X, Y: integer; AData: variant) of object; + TfpgWidget = class(TfpgWindow) private + FAcceptDrops: boolean; FAlignRect: TfpgRect; FOnClick: TNotifyEvent; FOnDoubleClick: TMouseButtonEvent; + FOnDragDrop: TfpgDragDropEvent; + FOnDragEnter: TfpgDragEnterEvent; + FOnDragLeave: TNotifyEvent; FOnEnter: TNotifyEvent; FOnExit: TNotifyEvent; FOnMouseDown: TMouseButtonEvent; @@ -52,9 +59,12 @@ type FOnResize: TNotifyEvent; FOnScreen: boolean; FOnShowHint: THintEvent; + FDragStartPos: TfpgPoint; + alist: TList; procedure SetActiveWidget(const AValue: TfpgWidget); function IsShowHintStored: boolean; procedure SetFormDesigner(const AValue: TObject); + procedure SetAlign(const AValue: TAlign); protected procedure MsgPaint(var msg: TfpgMessageRec); message FPGM_PAINT; procedure MsgResize(var msg: TfpgMessageRec); message FPGM_RESIZE; @@ -69,6 +79,8 @@ type procedure MsgMouseEnter(var msg: TfpgMessageRec); message FPGM_MOUSEENTER; procedure MsgMouseExit(var msg: TfpgMessageRec); message FPGM_MOUSEEXIT; procedure MsgMouseScroll(var msg: TfpgMessageRec); message FPGM_SCROLL; + procedure MsgDropEnter(var msg: TfpgMessageRec); message FPGM_DROPENTER; + procedure MsgDropExit(var msg: TfpgMessageRec); message FPGM_DROPEXIT; protected FFormDesigner: TObject; FVisible: boolean; @@ -85,6 +97,8 @@ type FBackgroundColor: TfpgColor; FTextColor: TfpgColor; FIsContainer: Boolean; + FOnClickPending: Boolean; + procedure SetAcceptDrops(const AValue: boolean); virtual; function GetOnShowHint: THintEvent; virtual; procedure SetOnShowHint(const AValue: THintEvent); virtual; procedure SetBackgroundColor(const AValue: TfpgColor); virtual; @@ -98,7 +112,7 @@ type function GetHint: TfpgString; virtual; procedure SetHint(const AValue: TfpgString); virtual; procedure DoUpdateWindowPosition; override; - procedure DoAlign(AAlign: TAlign); + procedure DoAlignment; procedure DoResize; procedure DoShowHint(var AHint: TfpgString); procedure HandlePaint; virtual; @@ -122,7 +136,7 @@ type procedure InternalHandleShow; virtual; procedure HandleHide; virtual; procedure MoveAndResize(ALeft, ATop, AWidth, AHeight: TfpgCoord); - procedure RePaint; + procedure RePaint; virtual; { property events } property OnClick: TNotifyEvent read FOnClick write FOnClick; property OnDoubleClick: TMouseButtonEvent read FOnDoubleClick write FOnDoubleClick; @@ -141,8 +155,6 @@ type constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure AfterConstruction; override; - function GetClientRect: TfpgRect; virtual; - function GetBoundsRect: TfpgRect; virtual; function InDesigner: boolean; procedure InvokeHelp; virtual; procedure Realign; @@ -153,6 +165,7 @@ type procedure Invalidate; // double check this works as developers expect???? property FormDesigner: TObject read FFormDesigner write SetFormDesigner; property Parent: TfpgWidget read GetParent write SetParent; + property AcceptDrops: boolean read FAcceptDrops write SetAcceptDrops default False; property ActiveWidget: TfpgWidget read FActiveWidget write SetActiveWidget; property IsContainer: Boolean read FIsContainer; property Visible: boolean read FVisible write SetVisible default True; @@ -161,13 +174,16 @@ type { Is the widget allowed to receive keyboard focus. } property Focusable: boolean read FFocusable write FFocusable default False; property Focused: boolean read FFocused write FFocused default False; - property Anchors: TAnchors read FAnchors write FAnchors; - property Align: TAlign read FAlign write FAlign; + property Anchors: TAnchors read FAnchors write FAnchors default [anLeft, anTop]; + property Align: TAlign read FAlign write SetAlign default alNone; property Hint: TfpgString read GetHint write SetHint; property ShowHint: boolean read FShowHint write SetShowHint stored IsShowHintStored; property ParentShowHint: boolean read FParentShowHint write SetParentShowHint default True; property BackgroundColor: TfpgColor read FBackgroundColor write SetBackgroundColor default clWindowBackground; property TextColor: TfpgColor read FTextColor write SetTextColor default clText1; + property OnDragEnter: TfpgDragEnterEvent read FOnDragEnter write FOnDragEnter; + property OnDragLeave: TNotifyEvent read FOnDragLeave write FOnDragLeave; + property OnDragDrop: TfpgDragDropEvent read FOnDragDrop write FOnDragDrop; end; @@ -181,7 +197,8 @@ implementation uses fpg_constants, - fpg_menu; + fpg_menu, + fpg_form; { for OnKeyPress handling } var @@ -202,6 +219,33 @@ begin end; end; +function CompareInts(i1, i2: integer): integer; +begin + if i1 < i2 then + Result := -1 + else if i1 > i2 then + Result := 1 + else + Result := 0; +end; + +function AlignCompare(p1, p2: Pointer): integer; +var + w1: TfpgWidget; + w2: TfpgWidget; +begin + w1 := TfpgWidget(p1); + w2 := TfpgWidget(p2); + case w1.Align of + alTop: Result := CompareInts(w1.Top, w2.Top); + alBottom: Result := CompareInts(w2.Top, w1.Top); + alLeft: Result := CompareInts(w1.Left, w2.Left); + alRight: Result := CompareInts(w2.Left, w1.Left); + else + Result := 0; + end; +end; + { TfpgWidget } @@ -234,6 +278,14 @@ begin FActiveWidget.HandleSetFocus; end; +procedure TfpgWidget.SetAcceptDrops(const AValue: boolean); +begin + if FAcceptDrops = AValue then + exit; + FAcceptDrops := AValue; + DoAcceptDrops(AValue); +end; + function TfpgWidget.GetHint: TfpgString; begin Result := FHint; @@ -256,6 +308,14 @@ begin end; end; +procedure TfpgWidget.SetAlign(const AValue: TAlign); +begin + if FAlign = AValue then + Exit; + FAlign := AValue; + Realign; +end; + procedure TfpgWidget.SetVisible(const AValue: boolean); begin if FVisible = AValue then @@ -341,16 +401,6 @@ begin end; end; -function TfpgWidget.GetClientRect: TfpgRect; -begin - Result.SetRect(0, 0, Width, Height); -end; - -function TfpgWidget.GetBoundsRect: TfpgRect; -begin - Result.SetRect(Left, Top, Width+1, Height+1); -end; - function TfpgWidget.InDesigner: boolean; begin Result := (FFormDesigner <> nil) @@ -416,7 +466,9 @@ begin FShowHint := False; FParentShowHint := True; FBackgroundColor := clWindowBackground; - FTextColor := clText1; + FTextColor := clText1; + FAcceptDrops := False; + FOnClickPending := False; inherited Create(AOwner); @@ -487,6 +539,7 @@ var ss: TShiftState; consumed: boolean; wg: TfpgWidget; + wlast: TfpgWidget; begin if InDesigner then begin @@ -502,13 +555,27 @@ begin HandleKeyPress(key, ss, consumed); if not consumed then begin + { work it's way to one before top level form - forms are not focusable remember } wg := Parent; + wlast := wg; while (not consumed) and (wg <> nil) do begin wg.HandleKeyPress(key, ss, consumed); + wlast := wg; wg := wg.Parent; end; end; + { we should now be at the top level form } + if (not consumed) and (wlast <> nil) then + begin + if (wlast is TfpgForm) and Assigned(wlast.OnKeyPress) then + wlast.OnKeyPress(self, key, ss, consumed); + end; + { now finaly, lets give fpgApplication a chance } + if (not consumed) and Assigned(fpgApplication.OnKeyPress) then + begin + fpgApplication.OnKeyPress(self, key, ss, consumed); + end; end; procedure TfpgWidget.MsgKeyRelease(var msg: TfpgMessageRec); @@ -559,6 +626,7 @@ begin case msg.Params.mouse.Buttons of MOUSE_LEFT: begin + FDragStartPos.SetPoint(msg.Params.mouse.x, msg.Params.mouse.y); mb := mbLeft; HandleLMouseDown(msg.Params.mouse.x, msg.Params.mouse.y, msg.Params.mouse.shiftstate); end; @@ -585,6 +653,7 @@ var IsDblClick: boolean; begin // writeln('TfpgWidget.MsgMouseUp'); + FDragActive := False; if InDesigner then begin FFormDesigner.Dispatch(msg); @@ -600,6 +669,7 @@ begin case msg.Params.mouse.Buttons of MOUSE_LEFT: begin + FOnClickPending := True; mb := mbLeft; if uLastClickWidget = self then IsDblClick := ((fpgGetTickCount - uLastClickTime) <= DOUBLECLICK_MS) @@ -613,7 +683,7 @@ begin uLastClickTime := fpgGetTickCount; if IsDblClick then begin - + FOnClickPending := False; { When Double Click occurs we don't want single click } HandleDoubleClick(msg.Params.mouse.x, msg.Params.mouse.y, msg.Params.mouse.Buttons, msg.Params.mouse.shiftstate); if Assigned(FOnDoubleClick) then FOnDoubleClick(self, mb, msg.Params.mouse.shiftstate, @@ -649,6 +719,16 @@ begin Exit; end; + if (msg.Params.mouse.Buttons and MOUSE_LEFT) = MOUSE_LEFT then + begin + if not FDragActive and (FDragStartPos.ManhattanLength(fpgPoint(msg.Params.mouse.x, msg.Params.mouse.y)) > fpgApplication.StartDragDistance) then + begin + FDragActive := True; + // In Windows dragging is a blocking function, so FDragActive is false after this call + DoDragStartDetected; + end; + end; + HandleMouseMove(msg.Params.mouse.x, msg.Params.mouse.y, msg.Params.mouse.Buttons, msg.Params.mouse.shiftstate); if Assigned(OnMouseMove) then OnMouseMove(self, msg.Params.mouse.shiftstate, @@ -710,6 +790,16 @@ begin msg.Params.mouse.shiftstate, msg.Params.mouse.delta); end; +procedure TfpgWidget.MsgDropEnter(var msg: TfpgMessageRec); +begin + // do nothing +end; + +procedure TfpgWidget.MsgDropExit(var msg: TfpgMessageRec); +begin + // do nothing +end; + function TfpgWidget.GetOnShowHint: THintEvent; begin Result := FOnShowHint; @@ -942,7 +1032,7 @@ end; procedure TfpgWidget.HandleLMouseUp(x, y: integer; shiftstate: TShiftState); begin - if Assigned(FOnClick) then + if FOnClickPending and Assigned(FOnClick) then FOnClick(self); end; @@ -1119,25 +1209,39 @@ var dy: integer; dw: integer; dh: integer; + w: TfpgWidget; begin if (csLoading in ComponentState) then Exit; //==> // writeln('HandleAlignments - ', Classname); FAlignRect := GetClientRect; - DoAlign(alTop); - DoAlign(alBottom); - DoAlign(alLeft); - DoAlign(alRight); - DoAlign(alClient); + alist := TList.Create; + try + for n := 0 to ComponentCount - 1 do + if Components[n] is TfpgWidget then + begin + w := TfpgWidget(Components[n]); + if (w.Align <> alNone) and (w.Visible) then + alist.Add(w); + end; + + DoAlignment; + //DoAlign(alTop); + //DoAlign(alBottom); + //DoAlign(alLeft); + //DoAlign(alRight); + //DoAlign(alClient); + finally + alist.Free; + end; // handle anchors finally for alNone for n := 0 to ComponentCount - 1 do if (Components[n] is TfpgWidget) then begin wg := TfpgWidget(Components[n]); - if (wg.FAlign = alNone) and - ((anBottom in wg.Anchors) or (anRight in wg.Anchors)) then + if (wg.FAlign = alNone) and ([anLeft, anTop] <> wg.Anchors) then begin // we must alter the window dx := 0; @@ -1145,15 +1249,21 @@ begin dw := 0; dh := 0; - if (anLeft in wg.Anchors) and (anRight in wg.Anchors) then - dw := dwidth - else if anRight in wg.Anchors then - dx := dwidth; - - if (anTop in wg.Anchors) and (anBottom in wg.Anchors) then - dh := dheight - else if anBottom in wg.Anchors then - dy := dheight; + if (anRight in wg.Anchors) then + if (anLeft in wg.Anchors) then + dw := dwidth + else + dx := dwidth + else if not (anLeft in wg.Anchors) then + dx := (dwidth div 2); + + if (anBottom in wg.Anchors) then + if (anTop in wg.Anchors) then + dh := dheight + else + dy := dheight + else if not (anTop in wg.Anchors) then + dy := (dheight div 2); wg.MoveAndResizeBy(dx, dy, dw, dh); end; @@ -1188,55 +1298,16 @@ begin MoveAndResize(FLeft + dx, FTop + dy, FWidth + dw, FHeight + dh); end; -function CompareInts(i1, i2: integer): integer; -begin - if i1 < i2 then - Result := -1 - else if i1 > i2 then - Result := 1 - else - Result := 0; -end; - -function AlignCompare(p1, p2: Pointer): integer; +procedure TfpgWidget.DoAlignment; var - w1: TfpgWidget; - w2: TfpgWidget; -begin - w1 := TfpgWidget(p1); - w2 := TfpgWidget(p2); - case w1.Align of - alTop: Result := CompareInts(w1.Top, w2.Top); - alBottom: Result := CompareInts(w2.Top, w1.Top); - alLeft: Result := CompareInts(w1.Left, w2.Left); - alRight: Result := CompareInts(w2.Left, w1.Left); - else - Result := 0; - end; -end; - -procedure TfpgWidget.DoAlign(AAlign: TAlign); -var - alist: TList; w: TfpgWidget; n: integer; begin - alist := TList.Create; - for n := 0 to ComponentCount - 1 do - if Components[n] is TfpgWidget then - begin - w := TfpgWidget(Components[n]); - if (w.Align = AAlign) and (w.Visible) then - alist.Add(w); - end; - - alist.Sort(@AlignCompare); - // and process this list in order for n := 0 to alist.Count - 1 do begin w := TfpgWidget(alist[n]); - case AAlign of + case w.Align of alTop: begin w.MoveAndResize(FAlignRect.Left, FAlignRect.Top, FAlignRect.Width, w.Height); @@ -1267,8 +1338,6 @@ begin w.MoveAndResize(FAlignRect.Left, FAlignRect.Top, FAlignRect.Width, FAlignRect.Height); end; { case } end; - - alist.Free; end; procedure TfpgWidget.DoResize; diff --git a/src/corelib/gdi/fpg_gdi.pas b/src/corelib/gdi/fpg_gdi.pas index e242bfb6..6f95d8a8 100644 --- a/src/corelib/gdi/fpg_gdi.pas +++ b/src/corelib/gdi/fpg_gdi.pas @@ -24,19 +24,25 @@ unit fpg_gdi; {$mode objfpc}{$H+} {.$Define Debug} +{.$Define DND_DEBUG} interface uses - Windows, Classes, SysUtils, + Windows, + ActiveX, fpg_base, - fpg_impl; + fpg_impl + {$IFDEF DEBUG} + ,dbugintf + {$ENDIF DEBUG} + ,fpg_OLEDragDrop + ; { Constants missing on windows unit } const - WM_MOUSEWHEEL = $020a; // we could remove this since FPC 2.0.4 VER_PLATFORM_WIN32_CE = 3; CLEARTYPE_QUALITY = 5; @@ -50,6 +56,8 @@ var type // forward declaration TfpgGDIWindow = class; + TGDIDragManager = class; + TfpgGDIDrag = class; TfpgGDIFontResource = class(TfpgFontResourceBase) @@ -140,13 +148,25 @@ type TfpgGDIWindow = class(TfpgWindowBase) private + FDropManager: TfpgOLEDropTarget; + FDropPos: TPoint; + FUserMimeSelection: TfpgString; + FUserAcceptDrag: Boolean; + function GetDropManager: TfpgOLEDropTarget; + procedure HandleDNDLeave(Sender: TObject); + procedure HandleDNDEnter(Sender: TObject; DataObj: IDataObject; KeyState: Longint; PT: TPoint; var Effect: DWORD); + procedure HandleDNDPosition(Sender: TObject; KeyState: Longint; PT: TPoint; var Effect: TfpgOLEDragDropEffect); + procedure HandleDNDDrop(Sender: TObject; DataObj: IDataObject; KeyState: Longint; PT: TPoint; Effect: TfpgOLEDragDropEffect); + private FMouseInWindow: boolean; FNonFullscreenRect: TfpgRect; FNonFullscreenStyle: longword; FFullscreenIsSet: boolean; FSkipResizeMessage: boolean; + QueueAcceptDrops: boolean; function DoMouseEnterLeaveCheck(AWindow: TfpgGDIWindow; uMsg, wParam, lParam: Cardinal): Boolean; procedure WindowSetFullscreen(aFullScreen, aUpdate: boolean); + property DropManager: TfpgOLEDropTarget read GetDropManager; protected FWinHandle: TfpgWinHandle; FModalForWin: TfpgGDIWindow; @@ -164,9 +184,13 @@ type //procedure MoveToScreenCenter; override; procedure DoSetWindowTitle(const ATitle: string); override; procedure DoSetMouseCursor; override; + procedure DoDNDEnabled(const AValue: boolean); override; + procedure DoAcceptDrops(const AValue: boolean); override; + procedure DoDragStartDetected; override; property WinHandle: TfpgWinHandle read FWinHandle; public constructor Create(AOwner: TComponent); override; + destructor Destroy; override; procedure ActivateWindow; override; procedure CaptureMouse; override; procedure ReleaseMouse; override; @@ -175,6 +199,10 @@ type TfpgGDIApplication = class(TfpgApplicationBase) + private + FDrag: TfpgGDIDrag; + procedure SetDrag(const AValue: TfpgGDIDrag); + property Drag: TfpgGDIDrag read FDrag write SetDrag; protected FDisplay: HDC; WindowClass: TWndClass; @@ -234,6 +262,42 @@ type end; + TfpgGDIMimeDataBase = class(TfpgMimeDataBase) + end; + + + { Used mainly for sending drags - being the source of the drag } + TfpgGDIDrag = class(TfpgDragBase) + private + function StringToHandle(const AString: TfpgString): HGLOBAL; + protected + FSource: TfpgGDIWindow; + function GetSource: TfpgGDIWindow; virtual; + public + destructor Destroy; override; + function Execute(const ADropActions: TfpgDropActions; const ADefaultAction: TfpgDropAction=daCopy): TfpgDropAction; override; + end; + + + { Used mainly for receiving drags - being the target of the drag } + TGDIDragManager = class(TInterfacedObject, IDropTarget) + private + FDropTarget: TfpgWindowBase; { actually a TfpgWidget } + FRegistered: boolean; + { IDropTarget } + function DragEnter(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; + function DragOver(grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; + function DragLeave: HResult;StdCall; + function Drop(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD):HResult;StdCall; + public + constructor Create(ADropTarget: TfpgWindowBase); reintroduce; + destructor Destroy; override; + procedure RegisterDragDrop; + procedure RevokeDragDrop; + property DropTarget: TfpgWindowBase read FDropTarget; { actually a TfpgWidget } + end; + + implementation uses @@ -249,7 +313,7 @@ var wapplication: TfpgApplication; MouseFocusedWH: HWND; OldMousePos: TPoint; // used to detect fake MouseMove events - + NeedToUnitialize: Boolean; // some required keyboard functions {$INCLUDE fpg_keys_gdi.inc} @@ -434,20 +498,68 @@ begin {$ENDIF} end; +{ ********** Some helper conversion functions ************* } + function WinkeystateToShiftstate(keystate: cardinal): TShiftState; begin - result:= []; - if GetKeyState(vk_menu) < 0 then begin + Result := []; + if GetKeyState(vk_menu) < 0 then Include(result, ssAlt); - end; - if GetKeyState(vk_shift) < 0 then begin + if GetKeyState(vk_shift) < 0 then Include(result, ssShift); - end; - if GetKeyState(vk_control) < 0 then begin + if GetKeyState(vk_control) < 0 then Include(result, ssCtrl); - end; end; +function TranslateToFPGDropActions(const pdwEffects: DWORD): TfpgDropActions; +begin + Result := [daIgnore]; + if (pdwEffects and DROPEFFECT_LINK) <> 0 then + Result := Result + [daLink]; + if (pdwEffects and DROPEFFECT_COPY) <> 0 then + Result := Result + [daCopy]; + if (pdwEffects and DROPEFFECT_MOVE) <> 0 then + Result := Result + [daMove]; +end; + +function TranslateToFPGDropAction(const pdwEffects: DWORD): TfpgDropAction; +begin + if (pdwEffects and DROPEFFECT_LINK) <> 0 then + Result := daLink + else if (pdwEffects and DROPEFFECT_COPY) <> 0 then + Result := daCopy + else if (pdwEffects and DROPEFFECT_MOVE) <> 0 then + Result := daMove + else + Result := daIgnore; +end; + +function TranslateToWinDragEffects(const AActions: TfpgDropActions): DWORD; +begin + Result := DROPEFFECT_NONE; + if daLink in AActions then + Result := Result or DROPEFFECT_LINK; + if daCopy in AActions then + Result := Result or DROPEFFECT_COPY; + if daMove in AActions then + Result := Result or DROPEFFECT_MOVE; +end; + +function TranslateToWinDragEffect(const AAction: TfpgDropAction): DWORD; +begin + if AAction = daIgnore then + Result := DROPEFFECT_NONE + else if daLink = AAction then + Result := DROPEFFECT_LINK + else if daCopy = AAction then + Result := DROPEFFECT_COPY + else if daMove = AAction then + Result := DROPEFFECT_MOVE + else + Result := DROPEFFECT_NONE; { fallback, but should never be reached } +end; + + {$IFDEF wince} procedure WinCESetDibBits(BMP: HBITMAP; awidth, aheight: Integer; aimgdata: Pointer; var bi: TBitmapInfo); var @@ -631,7 +743,7 @@ begin if not (w is TfpgGDIWindow) then begin - {$IFDEF DEBUG} writeln('fpGFX/GDI: Unable to detect Window - using DefWindowProc'); {$ENDIF} + {$IFDEF DEBUG} SendDebug('fpGFX/GDI: Unable to detect Window - using DefWindowProc'); {$ENDIF} Result := Windows.DefWindowProc(hwnd, uMsg, wParam, lParam); Exit; //==> end; @@ -646,8 +758,7 @@ begin WM_KEYDOWN, WM_SYSKEYDOWN: begin - {$IFDEF DEBUG} write(w.ClassName + ': '); {$ENDIF} - {$IFDEF DEBUG} writeln('wm_char, wm_keyup, wm_keydown'); {$ENDIF} + {$IFDEF DEBUG} SendDebug(w.ClassName + ': wm_char, wm_keyup, wm_keydown'); {$ENDIF} kwg := FindKeyboardFocus; if kwg <> nil then w := kwg; @@ -725,16 +836,15 @@ begin if uMsg = WM_MOUSEMOVE then begin {$IFDEF DEBUG} - Writeln('old x=', OldMousePos.x, ' y=', OldMousePos.y); - writeln('new x=', msgp.mouse.x, ' y=', msgp.mouse.y); - writeln('---'); + SendDebugFmt('old x=%d y=%d', [OldMousePos.x, OldMousePos.y]); + SendDebugFmt('new x=%d y=%d', [msgp.mouse.x, msgp.mouse.y]); {$ENDIF} // Check for fake MouseMove messages - Windows sucks! if (OldMousePos.x = msgp.mouse.x) and (OldMousePos.y = msgp.mouse.y) then begin {$IFDEF DEBUG} - writeln('We received fake MouseMove messages'); + SendDebug('We received fake MouseMove messages'); {$ENDIF} Exit; //==> end @@ -790,7 +900,7 @@ begin WM_RBUTTONDOWN: begin {$IFDEF DEBUG} - writeln('fpGUI/GDI:', w.ClassName + ': MouseButtonDown event'); + SendDebug('fpGUI/GDI: ' + w.ClassName + ': MouseButtonDown event'); {$ENDIF} // This is temporary and we should try and move it to // the UI Designer code instead. @@ -807,7 +917,7 @@ begin WM_RBUTTONUP: begin {$IFDEF DEBUG} - writeln('fpGFX/GDI:', w.ClassName + ': MouseButtonUp event'); + SendDebug('fpGFX/GDI: '+ w.ClassName + ': MouseButtonUp event'); {$ENDIF} // This is temporary and we should try and move it to // the UI Designer code instead. @@ -875,8 +985,7 @@ begin msgp.rect.Height := smallint((lParam and $FFFF0000) shr 16); {$IFDEF DEBUG} - write(w.ClassName + ': '); - writeln('WM_SIZE: width=',msgp.rect.width, ' height=',msgp.rect.height); + SendDebugFmt('%s: WM_SIZE w=%d h=%d', [w.ClassName, msgp.rect.width, msgp.rect.Height]); {$ENDIF} // skip minimize... if lparam <> 0 then @@ -886,8 +995,7 @@ begin WM_MOVE: begin {$IFDEF DEBUG} - write(w.ClassName + ': '); - writeln('WM_MOVE'); + SendDebug(w.ClassName + ': WM_MOVE'); {$ENDIF} // window decoration correction ... if (GetWindowLong(w.WinHandle, GWL_STYLE) and WS_CHILD) = 0 then @@ -908,8 +1016,7 @@ begin WM_MOUSEWHEEL: begin {$IFDEF DEBUG} - write(w.ClassName + ': '); - writeln('WM_MOUSEWHEEL: wp=',IntToHex(wparam,8), ' lp=',IntToHex(lparam,8)); + SendDebugFmt('%s: WM_MOUSEWHEEL: wp=%s lp=%s', [w.ClassName, IntToHex(wparam,8), IntToHex(lparam,8)]); {$ENDIF} pt.x := GET_X_LPARAM(lParam); pt.y := GET_Y_LPARAM(lParam); @@ -941,7 +1048,7 @@ begin WM_ACTIVATE: // We currently use WM_NCACTIVATE instead! begin {$IFDEF DEBUG} - writeln(w.ClassName + ': WM_ACTIVATE'); + SendDebug(w.ClassName + ': WM_ACTIVATE'); {$ENDIF} if (Lo(wParam) = WA_INACTIVE) then fpgSendMessage(nil, w, FPGM_DEACTIVATE) @@ -955,11 +1062,19 @@ begin Result := 0; end; + WM_TIMECHANGE: + begin + {$IFDEF DEBUG} + SendDebug(w.ClassName + ': WM_TIMECHANGE'); + {$ENDIF} + writeln('fpGUI/GDI: ' + w.ClassName + ': WM_TIMECHANGE'); + fpgResetAllTimers; + end; + WM_NCACTIVATE: begin {$IFDEF DEBUG} - write(w.ClassName + ': WM_NCACTIVATE '); - writeln(wParam); + SendDebugFmt('%s: WM_NCACTIVATE wparam=%d', [w.ClassName, wParam]); {$ENDIF} if (wParam = 0) then fpgSendMessage(nil, w, FPGM_DEACTIVATE) @@ -969,7 +1084,7 @@ begin if (PopupListFirst <> nil) and (PopupListFirst.Visible) then begin {$IFDEF DEBUG} - writeln(' Blockmsg = True (part 1) : ' + PopupListFirst.ClassName); + SendDebug(' Blockmsg = True (part 1) : ' + PopupListFirst.ClassName); {$ENDIF} // This is ugly but needed for now to get TfpgCombobox to work if (PopupListFirst.ClassName <> 'TDropDownWindow') then @@ -1002,8 +1117,7 @@ begin WM_CLOSE: begin {$IFDEF DEBUG} - write(w.ClassName + ': '); - writeln('WM_Close'); + SendDebug(w.ClassName + ': WM_Close'); {$ENDIF} fpgSendMessage(nil, w, FPGM_CLOSE, msgp); end; @@ -1011,8 +1125,7 @@ begin WM_PAINT: begin {$IFDEF DEBUG} - write(w.ClassName + ': '); - writeln('WM_PAINT'); + SendDebug(w.ClassName + ': WM_PAINT'); {$ENDIF} Windows.BeginPaint(w.WinHandle, @PaintStruct); fpgSendMessage(nil, w, FPGM_PAINT, msgp); @@ -1060,6 +1173,13 @@ begin Result.Sort; end; +procedure TfpgGDIApplication.SetDrag(const AValue: TfpgGDIDrag); +begin + if Assigned(FDrag) then + FDrag.Free; + FDrag := AValue; +end; + function TfpgGDIApplication.GetHiddenWindow: HWND; begin if (FHiddenWindow = 0) then @@ -1137,6 +1257,8 @@ end; destructor TfpgGDIApplication.Destroy; begin + if Assigned(FDrag) then + FDrag.Free; UnhookWindowsHookEx(ActivationHook); inherited Destroy; end; @@ -1163,6 +1285,8 @@ begin if (atimeoutms >= 0) and (not DoMessagesPending) then begin + if Assigned(FOnIdle) then + OnIdle(self); if atimeoutms > 0 then timerid := Windows.SetTimer(ltimerWnd, 1, atimeoutms, nil) else @@ -1229,7 +1353,153 @@ end; var // this are required for Windows MouseEnter & MouseExit detection. uLastWindowHndl: TfpgWinHandle; - + +procedure TfpgGDIWindow.HandleDNDLeave(Sender: TObject); +var + wg: TfpgWidget; +begin + {$IFDEF DND_DEBUG} + writeln('TfpgGDIWindow.HandleDNDLeave '); + {$ENDIF} + FUserMimeSelection := ''; + wg := self as TfpgWidget; + if wg.AcceptDrops then { if we get here, this should always be true anyway } + begin + if Assigned(wg.OnDragLeave) then + wg.OnDragLeave(nil); + end; +end; + +procedure TfpgGDIWindow.HandleDNDEnter(Sender: TObject; DataObj: IDataObject; + KeyState: Longint; PT: TPoint; var Effect: DWORD); +var + wg: TfpgWidget; + lMimeList: TStringList; + lMimeChoice: TfpgString; + lAccept: Boolean; + lDropAction: TfpgDropAction; + EnumIntf: IEnumFORMATETC; + msgp: TfpgMessageParams; +begin + {$IFDEF DND_DEBUG} + writeln('TfpgGDIWindow.HandleDNDEnter '); + {$ENDIF} + wg := self as TfpgWidget; + if wg.AcceptDrops then + begin + lAccept := False; + + { enumerate the available formats and return them as a StringList } + lMimeList := EnumDataToStringList(DataObj); + try + if lMimeList.Count > 0 then + lMimeChoice := lMimeList[0] + else + {$NOTE We need to replace this message with a resouce string } + raise Exception.Create('fpGUI/GDI: no mime types available for DND operation'); + + lDropAction := TranslateToFPGDropAction(Effect); + if Assigned(wg.OnDragEnter) then + wg.OnDragEnter(self, nil, lMimeList, lMimeChoice, lDropAction, lAccept); + finally + lMimeList.Free; + end; + if not lAccept then + Effect := DROPEFFECT_NONE + else + begin + Effect := TranslateToWinDragEffect(lDropAction); + FUserMimeSelection := lMimeChoice; + FUserAcceptDrag := True; + end; + + { Notify widget of drag status, so it can update its look } + if lAccept then + begin + FDropPos.x := PT.x; + FDropPos.y := PT.y; + fillchar(msgp, sizeof(msgp), 0); + msgp.mouse.x := PT.x; + msgp.mouse.y := PT.y; + fpgPostMessage(nil, wg, FPGM_DROPENTER, msgp); + end; + end; +end; + +procedure TfpgGDIWindow.HandleDNDPosition(Sender: TObject; KeyState: Longint; PT: TPoint; var Effect: TfpgOLEDragDropEffect); +var + msgp: TfpgMessageParams; + wg: TfpgWidget; +begin + wg := self as TfpgWidget; + { Notify widget of drag status, so it can update its look. We do the pos + check because OLE framework calls DragOver repeatedly even if the mouse + doesn't move, but simply because the mouse is over the widget. We don't + want that, for performance reasons. } + if FDropPos <> PT then + begin + {$IFDEF DND_DEBUG} + writeln('TfpgGDIWindow.HandleDNDPosition '); + {$ENDIF} + FDropPos.x := PT.x; + FDropPos.y := PT.y; + fillchar(msgp, sizeof(msgp), 0); + msgp.mouse.x := PT.x; + msgp.mouse.y := PT.y; + fpgPostMessage(nil, wg, FPGM_DROPENTER, msgp); + end; +end; + +procedure TfpgGDIWindow.HandleDNDDrop(Sender: TObject; DataObj: IDataObject; + KeyState: Longint; PT: TPoint; Effect: TfpgOLEDragDropEffect); +var + FE: FORMATETC; + stgmed: STGMEDIUM; + data: pchar; + wg: TfpgWidget; + CF: DWORD; + lIsTranslated: Boolean; +begin + if not FUserAcceptDrag then + exit; + + {$IFDEF DND_DEBUG} + Writeln('TfpgGDIWindow.HandleDNDDrop'); + {$ENDIF} + + wg := self as TfpgWidget; + { construct a FORMATETC object } + CF := WindowsClipboardLookup(FUserMimeSelection, lIsTranslated); + FE := GetFormatEtc(CF); + + if DataObj.QueryGetData(FE) = S_OK then + begin + if DataObj.GetData(FE, stgmed) = S_OK then + begin + { Yippie! the data is there, so go get it! } + data := GlobalLock(stgmed.HGLOBAL); + if Assigned(wg.OnDragDrop) then + wg.OnDragDrop(self, nil, pt.x, pt.y, data); + GlobalUnlock(stgmed.HGLOBAL); + { release the data using the COM API } + ReleaseStgMedium(stgmed); + end; + end; +end; + +function TfpgGDIWindow.GetDropManager: TfpgOLEDropTarget; +begin + if not Assigned(FDropManager) then + begin + FDropManager := TfpgOLEDropTarget.Create(self); + FDropManager.OnDragLeave := @HandleDNDLeave; + FDropManager.OnDragEnter := @HandleDNDEnter; + FDropManager.OnDragOver := @HandleDNDPosition; + FDropManager.OnDragDrop := @HandleDNDDrop; + end; + Result := FDropManager; +end; + function TfpgGDIWindow.DoMouseEnterLeaveCheck(AWindow: TfpgGDIWindow; uMsg, wParam, lParam: Cardinal): Boolean; var pt, spt: Windows.POINT; @@ -1392,8 +1662,12 @@ begin end else if WindowType = wtModalForm then begin - // set parent window to special hidden window. It helps to hide window taskbar button. - FParentWinHandle := wapplication.GetHiddenWindow; + if FocusRootWidget <> nil then + FParentWinHandle := FocusRootWidget.WinHandle + else + // set parent window to special hidden window. It helps to hide window taskbar button. + FParentWinHandle := wapplication.GetHiddenWindow; + // for modal windows, this is necessary FWinStyle := WS_OVERLAPPEDWINDOW or WS_POPUPWINDOW; FWinStyle := FWinStyle and not (WS_MINIMIZEBOX); @@ -1496,6 +1770,11 @@ begin // the forms require some adjustments before the Window appears SetWindowParameters; FSkipResizeMessage := False; + + if QueueAcceptDrops then + begin + DoAcceptDrops(True); + end; end; procedure TfpgGDIWindow.DoReleaseWindowHandle; @@ -1611,11 +1890,56 @@ begin SetCursor(hc); end; +procedure TfpgGDIWindow.DoDNDEnabled(const AValue: boolean); +begin + { GDI has nothing to do here } +end; + +procedure TfpgGDIWindow.DoAcceptDrops(const AValue: boolean); +begin + if AValue then + begin + if HasHandle then + DropManager.RegisterDragDrop + else + QueueAcceptDrops := True; // we need to do this once we have a winhandle + end + else + begin + if HasHandle then + DropManager.RevokeDragDrop; + QueueAcceptDrops := False; + end; +end; + +procedure TfpgGDIWindow.DoDragStartDetected; +begin + inherited DoDragStartDetected; + { In windows OLE dragging is a blocking function, so it never returns until + OnStartDragDetected is complete. So we need to set FDragActive to False + here. } + FDragActive := False; + if Assigned(wapplication.FDrag) then + FreeAndNil(wapplication.FDrag); +end; + constructor TfpgGDIWindow.Create(AOwner: TComponent); begin inherited Create(AOwner); FWinHandle := 0; + FDropManager := nil; + FDropPos.x := 0; + FDropPos.y := 0; FFullscreenIsSet := false; + FUserMimeSelection := ''; + FUserAcceptDrag := False; +end; + +destructor TfpgGDIWindow.Destroy; +begin + if Assigned(FDropManager) then + FDropManager.Free; + inherited Destroy; end; procedure TfpgGDIWindow.ActivateWindow; @@ -2350,36 +2674,47 @@ begin end; procedure TfpgGDIClipboard.DoSetText(const AValue: TfpgString); +var + mem: THandle; + po2: PWideChar; + str: PWideChar; begin FClipboardText := AValue; - if OpenClipboard(FClipboardWndHandle) then + if OpenClipboard(0) then begin - EmptyClipboard; - SetClipboardData(CF_TEXT, 0); + str := PWideChar(Utf8Decode(AValue)); + if EmptyClipboard then + begin + // Allocate a global memory object for the text. + mem:= globalalloc(GMEM_MOVEABLE or GMEM_DDESHARE, (length(AValue)+1)*2); + if mem <> 0 then + begin + po2:= globallock(mem); + if po2 <> nil then + begin + move(str^, po2^, (length(AValue)+1)*2); + globalunlock(mem); + if SetClipboardData(CF_UNICODETEXT,longword(mem)) <> 0 then + begin + //writeln('Successfully copied to clipboard'); + end; + end + else + begin + globalfree(mem); + end; + end; + end; CloseClipboard; end; end; procedure TfpgGDIClipboard.InitClipboard; begin - {$WARNING This does not work! 'FPGUI' window class was not registered, - so CreateWindowEx always returns 0} - FClipboardWndHandle := Windows.CreateWindowEx( - 0, // extended window style - 'FPGUI', // registered class name - nil, // window name - 0, // window style - 0, // horizontal position of window - 0, // vertical position of window - 10, // window width - 10, // window height - 0, // handle to parent or owner window - 0, // menu handle or child identifier - MainInstance, // handle to application instance - nil // window-creation data - ); + // nothing to do here end; + { TfpgGDIFileList } function TfpgGDIFileList.EncodeAttributesString(attrs: longword @@ -2440,9 +2775,196 @@ begin inherited PopulateSpecialDirs(aDirectory); end; +{ TfpgGDIDrag } + +function TfpgGDIDrag.StringToHandle(const AString: TfpgString): HGLOBAL; +var + dest: HGLOBAL; + l: integer; + p: PChar; +begin + p := PChar(AString); + l := Length(AString)+1; + { allocate and lock a global memory buffer. Make it fixed + data so we don't have to use GlobalLock } + dest := GlobalAlloc(GMEM_FIXED, l); + { Copy the string into the buffer } + Move(p^, PChar(dest)^, l); + Result := dest; +end; + +function TfpgGDIDrag.GetSource: TfpgGDIWindow; +begin + Result := FSource; +end; + +destructor TfpgGDIDrag.Destroy; +begin + {$IFDEF DND_DEBUG} + writeln('TfpgGDIDrag.Destroy '); + {$ENDIF} + inherited Destroy; +end; + +function TfpgGDIDrag.Execute(const ADropActions: TfpgDropActions; const ADefaultAction: TfpgDropAction): TfpgDropAction; +var + dwEffect: DWORD; + dwResult: HRESULT; + i: Integer; + F: PFormatEtc; + S: string; + M: PStgMedium; + itm: TfpgMimeDataItem; + lEffects: DWORD; + FDataObject: TfpgOLEDataObject; + FDropSource: TfpgOLEDropSource; + lIsTranslated: boolean; +begin + { TODO: this still needs to be implemented } + if FDragging then + begin + {$IFDEF DND_DEBUG} + writeln('TfpgGDIDrag.Execute (already dragging)'); + {$ENDIF} + Result := daIgnore; + end + else + begin + {$IFDEF DND_DEBUG} + writeln('TfpgGDIDrag.Execute (new drag)'); + {$ENDIF} + FDragging := True; + wapplication.Drag := self; + lEffects := TranslateToWinDragEffects(ADropActions); + FDataObject := TfpgOLEDataObject.Create; + + for i := 0 to FMimeData.Count-1 do + begin + F := nil; + M := nil; + lIsTranslated := False; + {$Note OLE DND: We are only handling strings at the moment, this needs to be extended to other types too } + itm := FMimeData[i]; + {$IFDEF DND_DEBUG} + writeln(' Processing mime-type: ', itm.Format); + {$ENDIF} + + { description of data we are sending } + New(F); + F^.cfFormat := WindowsClipboardLookup(itm.format, lIsTranslated); + F^.ptd := nil; + F^.dwAspect := DVASPECT_CONTENT; + F^.lindex := -1; + F^.tymed := TYMED_HGLOBAL; + FDataObject.FormatEtcList.Add(F); + + { storage for data we are sending } + s := itm.data; + New(M); + M^.tymed := TYMED_HGLOBAL; + M^.hGlobal := StringToHandle(s); + FDataObject.StgMediumList.Add(M); + + { Original mime type was translated to a known Windows CF_ formats, add + mimetype string as-is as well } + if lIsTranslated then + begin + New(F); + F^.cfFormat := RegisterClipboardFormat(PChar(itm.format)); + F^.ptd := nil; + F^.dwAspect := DVASPECT_CONTENT; + F^.lindex := -1; + F^.tymed := TYMED_HGLOBAL; + FDataObject.FormatEtcList.Add(F); + + { storage for data we are sending } + s := itm.data; + New(M); + M^.tymed := TYMED_HGLOBAL; + M^.hGlobal := StringToHandle(s); + FDataObject.StgMediumList.Add(M); + end; + end; + + { Now let OLE take over from here } + FDropSource := TfpgOLEDropSource.Create; + dwResult := ActiveX.DoDragDrop( FDataObject as IDataObject, + FDropSource as IDropSource, + lEffects, + @dwEffect); + Result := TranslateToFPGDropAction(dwEffect); + + if dwResult = DRAGDROP_S_DROP then + begin + { which action did the user select, and act accordingly } + if dwEffect = DROPEFFECT_COPY then + begin + // nothing to do here + end; + if dwEffect = DROPEFFECT_MOVE then + begin + // Sowehow we need to remove the data from source + end; + end; + +// (FDropSource as IUnknown)._Release; +// (FDataObject as IUnknown)._Release; + end; +end; + +{ TGDIDragManager } + +function TGDIDragManager.DragEnter(const dataObj: IDataObject; + grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult; StdCall; +begin + +end; + +function TGDIDragManager.DragOver(grfKeyState: DWORD; pt: TPoint; + var dwEffect: DWORD): HResult; StdCall; +begin + +end; + +function TGDIDragManager.DragLeave: HResult; StdCall; +begin + +end; + +function TGDIDragManager.Drop(const dataObj: IDataObject; grfKeyState: DWORD; + pt: TPoint; var dwEffect: DWORD): HResult; StdCall; +begin + +end; + +constructor TGDIDragManager.Create(ADropTarget: TfpgWindowBase); +begin + inherited Create; + FDropTarget := ADropTarget; + FRegistered := False; +end; + +destructor TGDIDragManager.Destroy; +begin + if FRegistered then + RevokeDragDrop; + inherited Destroy; +end; + +procedure TGDIDragManager.RegisterDragDrop; +begin + Activex.RegisterDragDrop(TfpgWidget(FDropTarget).WinHandle, self as IDropTarget) +end; + +procedure TGDIDragManager.RevokeDragDrop; +begin + ActiveX.RevokeDragDrop(TfpgWidget(FDropTarget).WinHandle); +end; + initialization wapplication := nil; MouseFocusedWH := 0; + NeedToUnitialize := Succeeded(OleInitialize(nil)); {$IFDEF WinCE} UnicodeEnabledOS := True; @@ -2460,5 +2982,9 @@ initialization FontSmoothingType := ANTIALIASED_QUALITY; {$ENDIF} +finalization + if NeedToUnitialize then + OleUninitialize; + end. diff --git a/src/corelib/gdi/fpg_interface.pas b/src/corelib/gdi/fpg_interface.pas index c75aaa28..ef58e46d 100644 --- a/src/corelib/gdi/fpg_interface.pas +++ b/src/corelib/gdi/fpg_interface.pas @@ -33,6 +33,8 @@ type TfpgApplicationImpl = TfpgGDIApplication; TfpgClipboardImpl = TfpgGDIClipboard; TfpgFileListImpl = TfpgGDIFileList; + TfpgMimeDataImpl = TfpgGDIMimeDataBase; + TfpgDragImpl = TfpgGDIDrag; implementation diff --git a/src/corelib/gdi/fpg_oledragdrop.pas b/src/corelib/gdi/fpg_oledragdrop.pas new file mode 100644 index 00000000..fa17ba67 --- /dev/null +++ b/src/corelib/gdi/fpg_oledragdrop.pas @@ -0,0 +1,1061 @@ +{
+ fpGUI - Free Pascal GUI Toolkit
+
+ Copyright (C) 2006 - 2010 See the file AUTHORS.txt, included in this
+ distribution, for details of the copyright.
+
+ See the file COPYING.modifiedLGPL, included in this distribution,
+ for details about redistributing fpGUI.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ Description:
+ This unit implements the OLE Drag-n-Drop functionality of Windows.
+ This unit is implemented based on the articles posted on
+ http://www.catch22.net/tuts/dragdrop/
+}
+unit fpg_OLEDragDrop;
+
+{$mode delphi}{$H+}
+
+interface
+
+uses
+ Windows, Classes, ActiveX, ShellAPI, fpg_base;
+
+const
+ CFSTR_FILENAMEMAPA = 'FileNameMap'; { CF_FILENAMEMAPA }
+ CFSTR_FILENAMEMAP = CFSTR_FILENAMEMAPA;
+ CFSTR_FILEDESCRIPTORA = 'FileGroupDescriptor'; { CF_FILEGROUPDESCRIPTORA }
+ CFSTR_FILEDESCRIPTOR = CFSTR_FILEDESCRIPTORA;
+ CFSTR_FILECONTENTS = 'FileContents'; { CF_FILECONTENTS }
+
+type
+ TfpgOLEFormatEtcList = class(TList)
+ private
+ function GetFormatEtc(Index: Integer): PFormatEtc;
+ protected
+ procedure Notify(Ptr: Pointer; Action: TListNotification); override;
+ public
+ constructor CreateCopy(AFormatEtcList: TfpgOLEFormatEtcList);
+ property FormatEtc[Index: Integer]: PFormatEtc read GetFormatEtc; default;
+ end;
+
+
+ TfpgOLEStgMediumList = class(TList)
+ private
+ function GetStgMedium(Index: Integer): PStgMedium;
+ protected
+ procedure Notify(Ptr: Pointer; Action: TListNotification); override;
+ public
+ property StgMedium[Index: Integer]: PStgMedium read GetStgMedium; default;
+ end;
+
+
+ TfpgOLEDropSource = class(TInterfacedObject, IDropSource)
+ private
+ { IDropSource }
+ function QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: Longint): HResult; stdcall;
+ function GiveFeedback(dwEffect: Longint): HResult; stdcall;
+ end;
+
+
+ TfpgOLEDragDropEffect = (deNone, deCopy, deMove, deLink);
+ TfpgOLEDragEnterEvent = procedure(Sender: TObject; DataObj: IDataObject; KeyState: Longint; PT: TPoint; var Effect: DWORD) of object;
+ TfpgOLEDragOverEvent = procedure(Sender: TObject; KeyState: Longint; PT: TPoint; var Effect: TfpgOLEDragDropEffect) of object;
+ TfpgOLEDragDropEvent = procedure(Sender: TObject; DataObj: IDataObject; KeyState: Longint; PT: TPoint; Effect: TfpgOLEDragDropEffect) of object;
+
+
+ TfpgOLEDropTarget = class(TObject, IInterface, IDropTarget)
+ private
+ FDropTarget: TfpgWindowBase;
+ FRegistered: Boolean;
+ FOnDragEnter: TfpgOLEDragEnterEvent;
+ FOnDragOver: TfpgOLEDragOverEvent;
+ FOnDragLeave: TNotifyEvent;
+ FOnDragDrop: TfpgOLEDragDropEvent;
+ private
+ { IInterface }
+ function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
+ function _AddRef: Integer; stdcall;
+ function _Release: Integer; stdcall;
+ { IDropTarget }
+ function DragEnter(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall;
+ function DragOver(grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult; stdcall;
+ function DragLeave: HResult; stdcall;
+ function Drop(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult; stdcall;
+ protected
+ procedure DoDragEnter(DataObj: IDataObject; KeyState: Longint; PT: TPoint; var Effect: DWORD); virtual;
+ procedure DoDragOver(KeyState: Longint; PT: TPoint; var Effect: TfpgOLEDragDropEffect); virtual;
+ procedure DoDragLeave;
+ procedure DoDragDrop(DataObj: IDataObject; KeyState: Longint; PT: TPoint; Effect: TfpgOLEDragDropEffect); virtual;
+ public
+ property OnDragEnter: TfpgOLEDragEnterEvent read FOnDragEnter write FOnDragEnter;
+ property OnDragOver: TfpgOLEDragOverEvent read FOnDragOver write FOnDragOver;
+ property OnDragLeave: TNotifyEvent read FOnDragLeave write FOnDragLeave;
+ property OnDragDrop: TfpgOLEDragDropEvent read FOnDragDrop write FOnDragDrop;
+ public
+ constructor Create(ADropTargetWidget: TfpgWindowBase); reintroduce; { Actually a TfpgWidget }
+ destructor Destroy; override;
+ procedure RegisterDragDrop;
+ procedure RevokeDragDrop;
+ property DropTarget: TfpgWindowBase read FDropTarget;
+ end;
+
+
+ TfpgOLEDataObject = class(TInterfacedObject, IDataObject)
+ private
+ FFormatEtcList: TfpgOLEFormatEtcList;
+ FStgMediumList: TfpgOLEStgMediumList;
+ function LookupFormatEtc(AFormat: TFormatEtc): Integer;
+ protected
+ { IDataObject }
+ function GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult; stdcall;
+ function GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult; stdcall;
+ function QueryGetData(const formatetc: TFormatEtc): HResult; stdcall;
+ function GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult; stdcall;
+ function SetData(const formatetc: TFormatEtc; const medium: TStgMedium; fRelease: BOOL): HResult; stdcall;
+ function EnumFormatEtc(dwDirection: DWORD; out enumFormatEtc: IEnumFormatEtc): HResult; stdcall;
+ function DAdvise(const formatetc: TFormatEtc; advf: DWORD; const advSink: IAdviseSink; out dwConnection: DWORD): HResult; stdcall;
+ function DUnadvise(dwConnection: DWORD): HResult; stdcall;
+ function EnumDAdvise(out enumAdvise: IEnumStatData): HResult; stdcall;
+ public
+ constructor Create; overload;
+ constructor Create(AFormatEtcList: TfpgOLEFormatEtcList); overload;
+ destructor Destroy; override;
+ property FormatEtcList: TfpgOLEFormatEtcList read FFormatEtcList;
+ property StgMediumList: TfpgOLEStgMediumList read FStgMediumList;
+ end;
+
+
+ TfpgOLEEnumFormatEtc = class(TInterfacedObject, IEnumFORMATETC)
+ private
+ FFormatEtcList: TfpgOLEFormatEtcList;
+ FIndex: Integer;
+ protected
+ { IEnumFORMATETC }
+ function Next(celt: ULong; out elt:FormatEtc; pceltFetched: pULong=nil): HResult; stdcall;
+ function Skip(celt: ULong): HResult; stdcall;
+ function Reset: HResult; stdcall;
+ function Clone(out Enum: IEnumFormatEtc): HResult; stdcall;
+ public
+ constructor Create(AFormatEtcList: TfpgOLEFormatEtcList);
+ destructor Destroy; override;
+ end;
+
+
+ TDragFilesSource = class(TObject)
+ private
+ FFileNames: TStrings;
+ FAliasFileNames: TStrings;
+ function GetAliasFileNames: TStrings;
+ function GetSourceFileNames: TStrings;
+ procedure SetAliasFileNames(const Value: TStrings);
+ procedure SetSourceFileNames(const Value: TStrings);
+ public
+ constructor Create;
+ destructor Destroy; override;
+ procedure Execute;
+ property SourceFileNames: TStrings read GetSourceFileNames write SetSourceFileNames;
+ property AliasFileNames: TStrings read GetAliasFileNames write SetAliasFileNames;
+ end;
+
+
+ TDragAcceptFilesEvent = function(Sender: TObject; FileNames: TStrings): Boolean of object;
+ TDragAcceptPositionEvent = function(Sender: TObject; PT: TPoint): Boolean of object;
+ TDropFilesEvent = procedure(Sender: TObject; PT: TPoint; FileNames: TStrings) of object;
+
+
+ TDragFilesTarget = class(TfpgOLEDropTarget)
+ private
+ FDragAcceptFiles: Boolean;
+ FOnDragAcceptFiles: TDragAcceptFilesEvent;
+ FOnDragAcceptPosition: TDragAcceptPositionEvent;
+ FOnDropFiles: TDropFilesEvent;
+ procedure GetFileNamesFromDropHandle(DropHandle: HDROP; SL: TStrings);
+ procedure StreamToFile(Stream: IStream; const FileName: string);
+ protected
+ function DoDragAcceptFiles(DataObj: IDataObject): Boolean;
+ function DoDragAcceptPosition(PT: TPoint): Boolean;
+ procedure DoDropFiles(DataObj: IDataObject; PT: TPoint);
+ procedure DoDragEnter(DataObj: IDataObject; KeyState: Longint; PT: TPoint; var Effect: DWORD); override;
+ procedure DoDragOver(KeyState: Longint; PT: TPoint; var Effect: TfpgOLEDragDropEffect); override;
+ procedure DoDragDrop(DataObj: IDataObject; KeyState: Longint; PT: TPoint; Effect: TfpgOLEDragDropEffect); override;
+ public
+ property OnDragAcceptFiles: TDragAcceptFilesEvent read FOnDragAcceptFiles write FOnDragAcceptFiles;
+ property OnDragAcceptPosition: TDragAcceptPositionEvent read FOnDragAcceptPosition write FOnDragAcceptPosition;
+ property OnDropFiles: TDropFilesEvent read FOnDropFiles write FOnDropFiles;
+ end;
+
+
+function WindowsMimeLookup(const CFFormat: string): string;
+function WindowsClipboardLookup(const AMime: string; var IsTranslated: Boolean): DWORD;
+function EnumDataToStringList(DataObj: IDataObject): TStringList;
+function GetFormatEtc(const CFFormat: DWORD): FORMATETC;
+
+implementation
+
+uses
+ SysUtils, ShlObj, fpg_widget;
+
+var
+ CF_FILENAMEMAP: Cardinal;
+ CF_FILEDESCRIPTOR: Cardinal;
+ CF_FILECONTENTS: Cardinal;
+
+
+function WindowsMimeLookup(const CFFormat: string): string;
+begin
+ { replace know clipboard formats with mime types }
+ if CFFormat = 'CF_TEXT' then
+ Result := 'text/plain'
+ else if CFFormat = 'CF_UNICODETEXT' then
+ Result := 'text/plain'
+ else if CFFormat = 'CF_OEMTEXT' then
+ Result := 'text/plain'
+ else if CFFormat = 'CF_HDROP' then
+ Result := 'text/uri-list'
+ else if CFFormat = 'CF_RICHTEXT' then
+ Result := 'text/html'
+ else
+ Result := CFFormat;
+end;
+
+function WindowsClipboardLookup(const AMime: string; var IsTranslated: Boolean): DWORD;
+begin
+ { TODO: We need to improve this implementation }
+ if AMime = 'text/html' then
+ begin
+ { We don't want duplicate CF_TEXT in DataObject, so register some of our
+ known convenience types (from TfpgMimeData) as-is }
+ IsTranslated := False;
+ Result := RegisterClipboardFormat('text/html');
+ end
+ else if Pos('text/', AMime) = 1 then
+ begin
+ IsTranslated := True;
+ Result := CF_TEXT; // fallback result
+ end
+ else
+ begin
+ IsTranslated := False;
+ Result := RegisterClipboardFormat(PChar(AMime));
+ end;
+end;
+
+function WindowsClipboardFormatToString(const CFFormat: integer): string;
+begin
+ { replace know clipboard formats with mime types }
+ case CFFormat of
+ CF_DIF : result := 'CF_DIF';
+ CF_DIB : result := 'CF_DIB';
+ CF_TEXT : result := 'CF_TEXT';
+ CF_SYLK : result := 'CF_SYLK';
+ CF_TIFF : result := 'CF_TIFF';
+ CF_RIFF : result := 'CF_RIFF';
+ CF_WAVE : result := 'CF_WAVE';
+ CF_HDROP : result := 'CF_HDROP';
+ CF_BITMAP : result := 'CF_BITMAP';
+ CF_LOCALE : result := 'CF_LOCALE';
+ CF_OEMTEXT : result := 'CF_OEMTEXT';
+ CF_PALETTE : result := 'CF_PALETTE';
+ CF_PENDATA : result := 'CF_PENDATA';
+ CF_UNICODETEXT : result := 'CF_UNICODETEXT';
+ CF_ENHMETAFILE : result := 'CF_ENHMETAFILE';
+ CF_METAFILEPICT : result := 'CF_METAFILEPICT';
+ else
+ Result := Format('unknown (%d)', [CFFormat]);
+ end;
+end;
+
+function EnumDataToStringList(DataObj: IDataObject): TStringList;
+var
+ FE: FORMATETC;
+ EnumFormats: IEnumFORMATETC;
+ num: integer;
+ lname: string;
+ lMimeName: string;
+ FormatName: array[0..MAX_PATH] of Char;
+ i: integer;
+begin
+ if DataObj.EnumFormatEtc(DATADIR_GET, EnumFormats) <> S_OK then
+ raise Exception.Create('EnumDataToStringList: Failed to get EnumFormatEtc interface');
+
+ Result := TStringList.Create;
+ EnumFormats.Reset;
+ while EnumFormats.Next(1, FE, @num) = S_OK do
+ begin
+ lName := '';
+ i := GetClipboardFormatName(FE.cfFormat,FormatName,MAX_PATH);
+ if i <> 0 then
+ begin
+ lName := FormatName;
+ end
+ else
+ begin
+ lName := WindowsClipboardFormatToString(FE.cfFormat);
+ end;
+ Result.Add(lName);
+ end;
+end;
+
+function GetFormatEtc(const CFFormat: DWORD): FORMATETC;
+begin
+ Result.CfFormat := CFFormat;
+ Result.Ptd := nil;
+ Result.dwAspect := DVASPECT_CONTENT;
+ Result.lindex := -1;
+ Result.tymed := TYMED_HGLOBAL;
+end;
+
+procedure DeepCopyFormatEtc(P1, P2: PFormatEtc);
+begin
+ P2^ := P1^;
+ if P1^.ptd <> nil then begin
+ P2^.ptd := CoTaskMemAlloc(SizeOf(tagDVTARGETDEVICE));
+ P2^.ptd^ := P1^.ptd^;
+ end;
+end;
+
+function DupGlobalMem(hMem: HGLOBAL): HGLOBAL;
+var
+ len: DWORD;
+ Source: Pointer;
+ Dest: HGLOBAL;
+begin
+ len := GlobalSize(hMem);
+ Source := GlobalLock(hMem);
+ Dest := GlobalAlloc(GMEM_FIXED, len);
+ Move(Source^, Pointer(Dest)^, len);
+ GlobalUnlock(hMem);
+ Result := Dest;
+end;
+
+{ TDragFilesSource }
+
+constructor TDragFilesSource.Create;
+begin
+ inherited Create;
+ FFileNames := TStringList.Create;
+ FAliasFileNames := TStringList.Create;
+end;
+
+destructor TDragFilesSource.Destroy;
+begin
+ FreeAndNil(FFileNames);
+ FreeAndNil(FAliasFileNames);
+ inherited Destroy;
+end;
+
+procedure TDragFilesSource.Execute;
+var
+ DataObject: TfpgOLEDataObject;
+ DropSource: TfpgOLEDropSource;
+ dwEffect: DWORD;
+ dwResult: HRESULT;
+ I: Integer;
+ F: PFormatEtc;
+ S: string;
+ M: PStgMedium;
+begin
+ DataObject := TfpgOLEDataObject.Create;
+
+ { append filenames as one long string delimited by #0. ie: something like a PChar }
+ S := '';
+ for I := 0 to FFileNames.Count - 1 do
+ begin
+ SetLength(S, Length(S)+Length(FFileNames[I])+1);
+ Move(FFileNames[I][1], S[Length(S)-Length(FFileNames[I])], Length(FFileNames[I]));
+ S[Length(S)] := #0;
+ end;
+ SetLength(S, Length(S)+1);
+ S[Length(S)] := #0;
+
+ { description of data we are sending }
+ New(F);
+ F^.cfFormat := CF_HDROP;
+ F^.ptd := nil;
+ F^.dwAspect := DVASPECT_CONTENT;
+ F^.lindex := -1;
+ F^.tymed := TYMED_HGLOBAL;
+ DataObject.FormatEtcList.Add(F);
+
+ { storage for data we are sending }
+ New(M);
+ M^.tymed := TYMED_HGLOBAL;
+ M^.hGlobal := Cardinal(GlobalAlloc(GMEM_FIXED, SizeOf(TDropFiles)+Length(S)));
+ PDropFiles(M^.hGlobal)^.pFiles := SizeOf(TDropFiles);
+ PDropFiles(M^.hGlobal)^.pt := Point(0,0);
+ PDropFiles(M^.hGlobal)^.fNC := FALSE;
+ PDropFiles(M^.hGlobal)^.fWide := FALSE;
+ Move(S[1], PChar(M^.hGlobal+SizeOf(TDropFiles))^, Length(S));
+ DataObject.StgMediumList.Add(M);
+
+ if (FAliasFileNames.Count > 0) and (FAliasFileNames.Count = FFileNames.Count) then
+ begin
+ { append filename aliases as one long string delimited by #0. ie: something like a PChar }
+ S := '';
+ for I := 0 to FAliasFileNames.Count - 1 do
+ begin
+ SetLength(S, Length(S)+Length(FAliasFileNames[I])+1);
+ Move(FAliasFileNames[I][1], S[Length(S)-Length(FAliasFileNames[I])], Length(FAliasFileNames[I]));
+ S[Length(S)] := #0;
+ end;
+ SetLength(S, Length(S)+1);
+ S[Length(S)] := #0;
+
+ { description of data we are sending }
+ New(F);
+ F^.cfFormat := CF_FILENAMEMAP;
+ F^.ptd := nil;
+ F^.dwAspect := DVASPECT_CONTENT;
+ F^.lindex := -1;
+ F^.tymed := TYMED_HGLOBAL;
+ DataObject.FormatEtcList.Add(F);
+
+ { storage for data we are sending }
+ New(M);
+ M^.tymed := TYMED_HGLOBAL;
+ M^.hGlobal := Cardinal(GlobalAlloc(GMEM_FIXED, Length(S)));
+ Move(S[1], PChar(M^.hGlobal)^, Length(S));
+ DataObject.StgMediumList.Add(M);
+ end;
+
+ DropSource := TfpgOLEDropSource.Create;
+ dwResult := ActiveX.DoDragDrop(DataObject as IDataObject, DropSource as IDropSource, DROPEFFECT_COPY, @dwEffect);
+
+ if dwResult = DRAGDROP_S_DROP then
+ begin
+ if dwEffect = DROPEFFECT_COPY then
+ begin
+ // nothing to do. If this whas xxx_MOVE, we would remove data from source
+ end;
+ end;
+end;
+
+function TDragFilesSource.GetAliasFileNames: TStrings;
+begin
+ Result := FAliasFileNames;
+end;
+
+function TDragFilesSource.GetSourceFileNames: TStrings;
+begin
+ Result := FFileNames;
+end;
+
+procedure TDragFilesSource.SetAliasFileNames(const Value: TStrings);
+begin
+ FAliasFileNames.Assign(Value);
+end;
+
+procedure TDragFilesSource.SetSourceFileNames(const Value: TStrings);
+begin
+ FFileNames.Assign(Value);
+end;
+
+{ TfpgOLEDropSource }
+
+function TfpgOLEDropSource.GiveFeedback(dwEffect: Integer): HResult;
+begin
+ Result := DRAGDROP_S_USEDEFAULTCURSORS;
+end;
+
+function TfpgOLEDropSource.QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: Integer): HResult;
+begin
+ if FEscapePressed then
+ Result := DRAGDROP_S_CANCEL
+ else if (grfKeyState and (MK_LBUTTON or MK_RBUTTON) = 0) then
+ Result := DRAGDROP_S_DROP
+ else
+ Result := S_OK;
+ {$IFDEF DND_DEBUG}
+ writeln('TfpgOLEDropSource.QueryContinueDrag Result = ', Result);
+ {$ENDIF}
+end;
+
+{ TfpgOLEDataObject }
+
+constructor TfpgOLEDataObject.Create(AFormatEtcList: TfpgOLEFormatEtcList);
+begin
+ inherited Create;
+ FFormatEtcList := TfpgOLEFormatEtcList.CreateCopy(AFormatEtcList);
+ FStgMediumList := TfpgOLEStgMediumList.Create;
+end;
+
+constructor TfpgOLEDataObject.Create;
+begin
+ inherited Create;
+ FFormatEtcList := TfpgOLEFormatEtcList.Create;
+ FStgMediumList := TfpgOLEStgMediumList.Create;
+end;
+
+function TfpgOLEDataObject.DAdvise(const formatetc: TFormatEtc; advf: DWORD;
+ const advSink: IAdviseSink; out dwConnection: DWORD): HResult;
+begin
+ Result := OLE_E_ADVISENOTSUPPORTED;
+end;
+
+destructor TfpgOLEDataObject.Destroy;
+begin
+ FreeAndNil(FFormatEtcList);
+ FreeAndNil(FStgMediumList);
+ inherited Destroy;
+end;
+
+function TfpgOLEDataObject.DUnadvise(dwConnection: DWORD): HResult;
+begin
+ Result := OLE_E_ADVISENOTSUPPORTED;
+end;
+
+function TfpgOLEDataObject.EnumDAdvise(out enumAdvise: IEnumStatData): HResult;
+begin
+ Result := OLE_E_ADVISENOTSUPPORTED;
+end;
+
+function TfpgOLEDataObject.EnumFormatEtc(dwDirection: DWORD;
+ out enumFormatEtc: IEnumFormatEtc): HResult;
+begin
+ if dwDirection = DATADIR_GET then
+ begin
+ enumFormatEtc := TfpgOLEEnumFormatEtc.Create(FFormatEtcList) as IEnumFormatEtc;
+ Result := S_OK;
+ end
+ else begin
+ Result := E_NOTIMPL;
+ end;
+end;
+
+function TfpgOLEDataObject.GetCanonicalFormatEtc(const formatetc: TFormatEtc;
+ out formatetcOut: TFormatEtc): HResult;
+begin
+ // Apparently we have to set this field to NULL even though we don't do anything else
+ formatetcOut.ptd := nil;
+ Result := E_NOTIMPL;
+end;
+
+function TfpgOLEDataObject.GetData(const formatetcIn: TFormatEtc;
+ out medium: TStgMedium): HResult;
+var
+ Idx: Integer;
+begin
+ Idx := LookupFormatEtc(formatetcIn);
+ if Idx = -1 then
+ Result := DV_E_FORMATETC
+ else
+ begin
+ medium.tymed := FFormatEtcList[Idx]^.tymed;
+ medium.PUnkForRelease := nil;
+ if medium.tymed = TYMED_HGLOBAL then
+ begin
+ medium.hGlobal := DupGlobalMem(FStgMediumList[Idx]^.hGlobal);
+ Result := S_OK;
+ end
+ else
+ Result := DV_E_FORMATETC;
+ end;
+end;
+
+function TfpgOLEDataObject.GetDataHere(const formatetc: TFormatEtc;
+ out medium: TStgMedium): HResult;
+begin
+ Result := DV_E_FORMATETC;
+end;
+
+function TfpgOLEDataObject.LookupFormatEtc(AFormat: TFormatEtc): Integer;
+var
+ I: Integer;
+begin
+ Result := -1;
+ for I := 0 to FFormatEtcList.Count - 1 do begin
+ if (FFormatEtcList[I]^.cfFormat = AFormat.cfFormat) and
+ (FFormatEtcList[I]^.dwAspect = AFormat.dwAspect) and
+ (FFormatEtcList[I]^.tymed = AFormat.tymed) then begin
+ Result := I;
+ Break;
+ end;
+ end;
+end;
+
+function TfpgOLEDataObject.QueryGetData(const formatetc: TFormatEtc): HResult;
+begin
+ if LookupFormatEtc(formatetc) >= 0 then begin
+ Result := S_OK;
+ end
+ else begin
+ Result := DV_E_FORMATETC;
+ end;
+end;
+
+function TfpgOLEDataObject.SetData(const formatetc: TFormatEtc;
+ const medium: TStgMedium; fRelease: BOOL): HResult;
+begin
+ Result := E_NOTIMPL;
+end;
+
+{ TfpgOLEEnumFormatEtc }
+
+function TfpgOLEEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HResult;
+var
+ C: TfpgOLEEnumFormatEtc;
+begin
+ // make a duplicate enumerator
+ C := TfpgOLEEnumFormatEtc.Create(FFormatEtcList);
+ // manually set the index state
+ C.FIndex := FIndex;
+ Enum := C as IEnumFormatEtc;
+ Result := S_OK;
+end;
+
+constructor TfpgOLEEnumFormatEtc.Create(AFormatEtcList: TfpgOLEFormatEtcList);
+begin
+ FFormatEtcList := TfpgOLEFormatEtcList.CreateCopy(AFormatEtcList);
+ FIndex := 0;
+end;
+
+destructor TfpgOLEEnumFormatEtc.Destroy;
+begin
+ FreeAndNil(FFormatEtcList);
+ inherited;
+end;
+
+function TfpgOLEEnumFormatEtc.Next(celt: ULong; out elt:FormatEtc;
+ pceltFetched: pULong): HResult;
+var
+ Copied: Integer;
+ OutBuf: PFormatEtc;
+begin
+ // copy the FORMATETC structures into the caller's buffer
+ OutBuf := PFormatEtc(@elt);
+ Copied := 0;
+ while(FIndex < FFormatEtcList.Count) and (Copied < celt) do begin
+ DeepCopyFormatEtc(FFormatEtcList[FIndex], OutBuf);
+ OutBuf := PFormatEtc(Cardinal(OutBuf) + SizeOf(TFormatEtc));
+ Inc(Copied);
+ FIndex := FIndex + 1;
+ end;
+
+ // store result
+ if (pceltFetched <> nil) then
+ pceltFetched^ := Copied;
+
+ // did we copy all that was requested?
+ if (Copied = celt) then Result := S_OK
+ else Result := S_FALSE;
+end;
+
+function TfpgOLEEnumFormatEtc.Reset: HResult;
+begin
+ FIndex := 0;
+ Result := S_OK;
+end;
+
+function TfpgOLEEnumFormatEtc.Skip(celt: ULong): HResult;
+begin
+ FIndex := FIndex + celt;
+ if FIndex <= FFormatEtcList.Count then Result := S_OK
+ else Result := S_FALSE;
+end;
+
+{ TfpgOLEFormatEtcList }
+
+constructor TfpgOLEFormatEtcList.CreateCopy(AFormatEtcList: TfpgOLEFormatEtcList);
+var
+ I: Integer;
+ P: PFormatEtc;
+begin
+ Create;
+ for I := 0 to AFormatEtcList.Count - 1 do begin
+ New(P);
+ DeepCopyFormatEtc(AFormatEtcList[I], P);
+ Add(P);
+ end;
+end;
+
+function TfpgOLEFormatEtcList.GetFormatEtc(Index: Integer): PFormatEtc;
+begin
+ Result := PFormatEtc(Get(Index));
+end;
+
+procedure TfpgOLEFormatEtcList.Notify(Ptr: Pointer; Action: TListNotification);
+begin
+ if Action = lnDeleted then begin
+ if PFormatEtc(Ptr)^.ptd <> nil then begin
+ CoTaskMemFree(PFormatEtc(Ptr)^.ptd);
+ end;
+ Dispose(PFormatEtc(Ptr));
+ end;
+ inherited;
+end;
+
+{ TfpgOLEStgMediumList }
+
+function TfpgOLEStgMediumList.GetStgMedium(Index: Integer): PStgMedium;
+begin
+ Result := PStgMedium(Get(Index));
+end;
+
+procedure TfpgOLEStgMediumList.Notify(Ptr: Pointer; Action: TListNotification);
+begin
+ if Action = lnDeleted then begin
+ if PStgMedium(Ptr)^.hGlobal <> 0 then begin
+ GlobalFree(PStgMedium(Ptr)^.hGlobal);
+ end;
+ Dispose(Ptr);
+ end;
+ inherited;
+end;
+
+{ TfpgOLEDropTarget }
+
+function TfpgOLEDropTarget.DragEnter(const dataObj: IDataObject;
+ grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;
+//var
+// Effect: TfpgOLEDragDropEffect;
+begin
+ //dwEffect := DROPEFFECT_NONE;
+ //Effect := deNone;
+ DoDragEnter(dataObj, grfKeyState, pt, dwEffect);
+ //case Effect of
+ // deNone: dwEffect := DROPEFFECT_NONE;
+ // deCopy: dwEffect := DROPEFFECT_COPY;
+ // deMove: dwEffect := DROPEFFECT_MOVE;
+ // deLink: dwEffect := DROPEFFECT_LINK;
+ //end;
+ Result := S_OK;
+end;
+
+function TfpgOLEDropTarget.DragLeave: HResult;
+begin
+ Result := S_OK;
+ DoDragLeave;
+end;
+
+function TfpgOLEDropTarget.DragOver(grfKeyState: DWORD; pt: TPoint;
+ var dwEffect: DWORD): HResult;
+var
+ Effect: TfpgOLEDragDropEffect;
+begin
+ if ((MK_SHIFT and grfKeyState) = MK_SHIFT) and
+ ((dwEffect and DROPEFFECT_MOVE) = DROPEFFECT_MOVE) then begin
+ Effect := deMove;
+ end;
+ if ((MK_CONTROL and grfKeyState) = MK_CONTROL) and
+ ((dwEffect and DROPEFFECT_COPY) = DROPEFFECT_COPY) then begin
+ Effect := deCopy;
+ end;
+ if dwEffect and DROPEFFECT_COPY > 0 then Effect := deCopy
+ else if dwEffect and DROPEFFECT_MOVE > 0 then Effect := deMove
+ else if dwEffect and DROPEFFECT_LINK > 0 then Effect := deLink
+ else Effect := deNone;
+ DoDragOver(grfKeyState, pt, Effect);
+ case Effect of
+ deNone: dwEffect := DROPEFFECT_NONE;
+ deCopy: dwEffect := DROPEFFECT_COPY;
+ deMove: dwEffect := DROPEFFECT_MOVE;
+ deLink: dwEffect := DROPEFFECT_LINK;
+ end;
+ Result := S_OK;
+end;
+
+function TfpgOLEDropTarget.Drop(const dataObj: IDataObject;
+ grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;
+var
+ Effect: TfpgOLEDragDropEffect;
+begin
+ if dwEffect and DROPEFFECT_COPY > 0 then
+ Effect := deCopy
+ else if dwEffect and DROPEFFECT_MOVE > 0 then
+ Effect := deMove
+ else if dwEffect and DROPEFFECT_LINK > 0 then
+ Effect := deLink
+ else
+ Effect := deNone;
+ DoDragDrop(dataObj, grfKeyState, pt, Effect);
+ Result := S_OK;
+end;
+
+function TfpgOLEDropTarget._AddRef: Integer;
+begin
+ Result := 1;
+end;
+
+function TfpgOLEDropTarget._Release: Integer;
+begin
+ Result := 1;
+end;
+
+function TfpgOLEDropTarget.QueryInterface(const IID: TGUID; out Obj): HResult;
+begin
+ if GetInterface(IID, Obj) then
+ Result := 0
+ else
+ Result := E_NOINTERFACE;
+end;
+
+constructor TfpgOLEDropTarget.Create(ADropTargetWidget: TfpgWindowBase);
+begin
+ inherited Create;
+ FDropTarget := ADropTargetWidget;
+ FRegistered := False;
+end;
+
+procedure TfpgOLEDropTarget.RegisterDragDrop;
+begin
+ ActiveX.RegisterDragDrop(TfpgWidget(FDropTarget).WinHandle, Self as IDropTarget);
+ FRegistered := True;
+end;
+
+procedure TfpgOLEDropTarget.RevokeDragDrop;
+begin
+ FRegistered := False;
+ ActiveX.RevokeDragDrop(TfpgWidget(FDropTarget).WinHandle);
+end;
+
+destructor TfpgOLEDropTarget.Destroy;
+begin
+ if FRegistered then RevokeDragDrop;
+ inherited;
+end;
+
+procedure TfpgOLEDropTarget.DoDragEnter(DataObj: IDataObject;
+ KeyState: LongInt; PT: TPoint; var Effect: DWORD);
+begin
+ if Assigned(FOnDragEnter) then begin
+ FOnDragEnter(Self, DataObj, KeyState, PT, Effect);
+ end;
+end;
+
+procedure TfpgOLEDropTarget.DoDragOver(KeyState: LongInt; PT: TPoint;
+ var Effect: TfpgOLEDragDropEffect);
+begin
+ if Assigned(FOnDragOver) then begin
+ FOnDragOver(Self, KeyState, PT, Effect);
+ end;
+end;
+
+procedure TfpgOLEDropTarget.DoDragLeave;
+begin
+ if Assigned(FOnDragLeave) then
+ FOnDragLeave(self);
+end;
+
+procedure TfpgOLEDropTarget.DoDragDrop(DataObj: IDataObject; KeyState: LongInt;
+ PT: TPoint; Effect: TfpgOLEDragDropEffect);
+begin
+ if Assigned(FOnDragDrop) then begin
+ FOnDragDrop(Self, DataObj, KeyState, PT, Effect);
+ end;
+end;
+
+{ TDragFilesTarget }
+
+function TDragFilesTarget.DoDragAcceptFiles(DataObj: IDataObject): Boolean;
+const
+ FormatEtcHDrop: TFormatEtc = (cfFormat:CF_HDROP;ptd:nil;dwAspect:DVASPECT_CONTENT;lindex:-1;tymed:TYMED_HGLOBAL);
+ FormatEtcFileDescriptor: TFormatEtc = (cfFormat:0;ptd:nil;dwAspect:DVASPECT_CONTENT;lindex:-1;tymed:TYMED_HGLOBAL);
+ FormatEtcFileContents: TFormatEtc = (cfFormat:0;ptd:nil;dwAspect:DVASPECT_CONTENT;lindex:-1;tymed:TYMED_ISTREAM);
+var
+ StgMedium: TStgMedium;
+ DropHandle: HDROP;
+ EnumFormatEtc: IEnumFORMATETC;
+ FE: TFormatEtc;
+ FetchedCount: Longint;
+ FormatName: array[0..MAX_PATH] of Char;
+ FileGroupDescriptor: PFileGroupDescriptorA;
+ I, Count: Integer;
+ FileDescriptor: TFileDescriptorA;
+ FileNames: TStringList;
+begin
+ FileNames := TStringList.Create;
+ try
+ if Assigned(FOnDragAcceptFiles) then
+ begin
+ Result := False;
+ FormatEtcFileDescriptor.cfFormat := CF_FILEDESCRIPTOR;
+ FormatEtcFileContents.cfFormat := CF_FILECONTENTS;
+
+ if (DataObj.QueryGetData(FormatEtcHDrop) = S_OK) and
+ (DataObj.GetData(FormatEtcHDrop,StgMedium) = S_OK) then
+ begin
+ DropHandle := StgMedium.hGlobal;
+ GetFileNamesFromDropHandle(DropHandle, FileNames);
+ Result := FOnDragAcceptFiles(Self, FileNames);
+ ReleaseStgMedium(StgMedium);
+ end
+ else
+ if (DataObj.QueryGetData(FormatEtcFileDescriptor) = S_OK) and
+ (DataObj.QueryGetData(FormatEtcFileContents) = S_OK) and
+ (DataObj.GetData(FormatEtcFileDescriptor,StgMedium) = S_OK) then
+ begin
+ FileGroupDescriptor := GlobalLock(StgMedium.hGlobal);
+ if FileGroupDescriptor <> nil then
+ begin
+ Count := FileGroupDescriptor^.cItems;
+ I := 0;
+ while I < Count do
+ begin
+ FileDescriptor := FileGroupDescriptor^.fgd[I];
+ FileNames.Add(FileDescriptor.cFileName);
+ Inc(I);
+ end;
+ GlobalUnlock(StgMedium.hGlobal);
+ end;
+ Result := FOnDragAcceptFiles(Self, FileNames);
+ ReleaseStgMedium(StgMedium);
+ end
+ else
+ begin
+// DataObj.EnumFormatEtc(DATADIR_GET, EnumFormatEtc);
+// EnumFormatEtc.Reset;
+// while EnumFormatEtc.Next(1, FE, @FetchedCount) = S_OK do begin
+// GetClipboardFormatName(FE.cfFormat,FormatName,MAX_PATH);
+// ShowMessage(FormatName);
+// end;
+ end;
+ end
+ else
+ begin
+ Result := True;
+ end;
+ finally
+ FileNames.Free;
+ end;
+end;
+
+procedure TDragFilesTarget.DoDragEnter(DataObj: IDataObject;
+ KeyState: LongInt; PT: TPoint; var Effect: DWORD);
+begin
+ FDragAcceptFiles := DoDragAcceptFiles(DataObj);
+ if FDragAcceptFiles and DoDragAcceptPosition(PT) then
+ inherited DoDragEnter(DataObj, KeyState, PT, Effect)
+ else
+ Effect := DROPEFFECT_NONE;
+end;
+
+procedure TDragFilesTarget.DoDragOver(KeyState: LongInt; PT: TPoint; var Effect: TfpgOLEDragDropEffect);
+begin
+ if FDragAcceptFiles and DoDragAcceptPosition(PT) then
+ inherited DoDragOver(KeyState, PT, Effect)
+ else
+ Effect := deNone;
+end;
+
+procedure TDragFilesTarget.DoDragDrop(DataObj: IDataObject;
+ KeyState: LongInt; PT: TPoint; Effect: TfpgOLEDragDropEffect);
+begin
+ DoDropFiles(DataObj, PT);
+ inherited;
+end;
+
+function TDragFilesTarget.DoDragAcceptPosition(PT: TPoint): Boolean;
+begin
+ if Assigned(FOnDragAcceptPosition) then begin
+ Result := FOnDragAcceptPosition(Self, PT);
+ end else begin
+ Result := True;
+ end;
+end;
+
+procedure TDragFilesTarget.DoDropFiles(DataObj: IDataObject; PT: TPoint);
+const
+ FormatEtcHDrop: TFormatEtc = (cfFormat:CF_HDROP;ptd:nil;dwAspect:DVASPECT_CONTENT;lindex:-1;tymed:TYMED_HGLOBAL);
+ FormatEtcFileDescriptor: TFormatEtc =
+ (cfFormat:0;ptd:nil;dwAspect:DVASPECT_CONTENT;lindex:-1;tymed:TYMED_HGLOBAL);
+ FormatEtcFileContents: TFormatEtc =
+ (cfFormat:0;ptd:nil;dwAspect:DVASPECT_CONTENT;lindex:-1;tymed:TYMED_ISTREAM);
+var
+ StgMedium, StgMediumContents: TStgMedium;
+ DropHandle: HDROP;
+ FileNames: TStringList;
+ FileGroupDescriptor: PFileGroupDescriptorA;
+ I, Count: Integer;
+ FileDescriptor: TFileDescriptorA;
+ Path: array[0..MAX_PATH] of Char;
+ TempFileName: string;
+begin
+ if not Assigned(FOnDropFiles) then Exit;
+ FileNames := TStringList.Create;
+ try
+ FormatEtcFileDescriptor.cfFormat := CF_FILEDESCRIPTOR;
+ FormatEtcFileContents.cfFormat := CF_FILECONTENTS;
+ if (DataObj.QueryGetData(FormatEtcHDrop) = S_OK) and
+ (DataObj.GetData(FormatEtcHDrop,StgMedium) = S_OK) then begin
+ DropHandle := StgMedium.hGlobal;
+ GetFileNamesFromDropHandle(DropHandle, FileNames);
+ FOnDropFiles(Self, PT, FileNames);
+ ReleaseStgMedium(StgMedium);
+ end else
+ if (DataObj.QueryGetData(FormatEtcFileDescriptor) = S_OK) and
+ (DataObj.QueryGetData(FormatEtcFileContents) = S_OK) and
+ (DataObj.GetData(FormatEtcFileDescriptor,StgMedium) = S_OK) then begin
+ GetTempPath(MAX_PATH, Path);
+ GetTempFileName(Path, 'PXM', 0, Path);
+ FileGroupDescriptor := GlobalLock(StgMedium.hGlobal);
+ if FileGroupDescriptor <> nil then begin
+ Count := FileGroupDescriptor^.cItems;
+ I := 0;
+ while I < Count do begin
+ FileDescriptor := FileGroupDescriptor^.fgd[I];
+ TempFileName := ChangeFileExt(Path, ExtractFileExt(FileDescriptor.cFileName));
+ FormatEtcFileContents.lindex := I;
+ if (DataObj.GetData(FormatEtcFileContents,StgMediumContents) = S_OK) then begin
+ StreamToFile(IStream(StgMediumContents.pstm), TempFileName);
+ FileNames.Clear;
+ FileNames.Add(TempFileName);
+ FOnDropFiles(Self, PT, FileNames);
+ ReleaseStgMedium(StgMediumContents);
+ end;
+ Inc(I);
+ end;
+ GlobalUnlock(StgMedium.hGlobal);
+ end;
+ FOnDropFiles(Self, PT, FileNames);
+ ReleaseStgMedium(StgMedium);
+ ReleaseStgMedium(StgMediumContents);
+ end;
+ finally
+ FileNames.Free;
+ end;
+end;
+
+procedure TDragFilesTarget.GetFileNamesFromDropHandle(DropHandle: HDROP; SL: TStrings);
+var
+ I: Integer;
+ Path: array[0..MAX_PATH] of Char;
+begin
+ for I := 0 to DragQueryFile(DropHandle, $FFFFFFFF, nil, 0) do begin
+ DragQueryFile(DropHandle, I, Path, MAX_PATH);
+ SL.Add(Path);
+ end;
+ DragFinish(DropHandle);
+end;
+
+procedure TDragFilesTarget.StreamToFile(Stream: IStream; const FileName: string);
+const
+ BLOCK_SIZE = 4096;
+var
+ BytesRead: Longint;
+ FileStream: TFileStream;
+ Buffer: array[0..BLOCK_SIZE] of Byte;
+begin
+ FileStream := TFileStream.Create(FileName, fmCreate);
+ try
+ while (Stream.Read(@Buffer[0], BLOCK_SIZE, @BytesRead) = S_OK) and (BytesRead > 0) do begin
+ FileStream.Write(Buffer, BytesRead);
+ end;
+ finally
+ FileStream.Free;
+ end;
+end;
+
+initialization
+ CF_FILENAMEMAP := RegisterClipboardFormat(CFSTR_FILENAMEMAP);
+ CF_FILEDESCRIPTOR := RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR);
+ CF_FILECONTENTS := RegisterClipboardFormat(CFSTR_FILECONTENTS);
+
+finalization
+
+end.
+
diff --git a/src/corelib/gdi/fpg_utils_impl.inc b/src/corelib/gdi/fpg_utils_impl.inc index d3bb2f0c..ab4761ae 100644 --- a/src/corelib/gdi/fpg_utils_impl.inc +++ b/src/corelib/gdi/fpg_utils_impl.inc @@ -1,7 +1,7 @@ {%mainunit fpg_utils.pas} uses - Shellapi; + Shellapi, Windows, fpg_constants, fpg_stringutils; // GDI specific implementations of encoding functions @@ -26,3 +26,22 @@ begin end; end; +function fpgFileSize(const AFilename: TfpgString): integer; +var + FindData: TWIN32FindDataW; + FindHandle: THandle; + Str: widestring; +begin + // Don't assign the widestring to TSearchRec.name because it is of type + // string, which will generate a conversion to the system encoding + Str := UTF8Decode(AFilename); + FindHandle:=Windows.FindFirstFileW(PWideChar(Str), FindData); + if FindHandle=Windows.Invalid_Handle_value then + begin + Result:=-1; + exit; + end; + Result := (int64(FindData.nFileSizeHigh) shl 32)+FindData.nFileSizeLow; + Windows.FindClose(FindHandle); +end; + diff --git a/src/corelib/gdi/fpgui_toolkit.lpk b/src/corelib/gdi/fpgui_toolkit.lpk index 11731043..2f606e9f 100644 --- a/src/corelib/gdi/fpgui_toolkit.lpk +++ b/src/corelib/gdi/fpgui_toolkit.lpk @@ -5,7 +5,7 @@ <Name Value="fpgui_toolkit"/>
<Author Value="Graeme Geldenhuys"/>
<CompilerOptions>
- <Version Value="8"/>
+ <Version Value="9"/>
<PathDelim Value="\"/>
<SearchPaths>
<IncludeFiles Value="..\..\"/>
@@ -16,7 +16,6 @@ <SyntaxOptions>
<AllowLabel Value="False"/>
<CPPInline Value="False"/>
- <UseAnsiStrings Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
@@ -31,7 +30,7 @@ <Description Value="fpGUI Toolkit"/>
<License Value="LGPL 2 with static linking exception."/>
<Version Minor="7"/>
- <Files Count="80">
+ <Files Count="81">
<Item1>
<Filename Value="..\stdimages.inc"/>
<Type Value="Include"/>
@@ -352,6 +351,10 @@ <Filename Value="..\..\VERSION_FILE.inc"/>
<Type Value="Include"/>
</Item80>
+ <Item81>
+ <Filename Value="fpg_oledragdrop.pas"/>
+ <UnitName Value="fpg_OLEDragDrop"/>
+ </Item81>
</Files>
<LazDoc Paths="..\..\..\docs\xml\corelib\;..\..\..\docs\xml\corelib\x11\;..\..\..\docs\xml\corelib\gdi\;..\..\..\docs\xml\gui\"/>
<RequiredPkgs Count="1">
diff --git a/src/corelib/gdi/fpgui_toolkit.pas b/src/corelib/gdi/fpgui_toolkit.pas index 2e3e81b6..adc1c74d 100644 --- a/src/corelib/gdi/fpgui_toolkit.pas +++ b/src/corelib/gdi/fpgui_toolkit.pas @@ -1,4 +1,4 @@ -{ This file was automatically created by Lazarus. do not edit!
+{ This file was automatically created by Lazarus. Do not edit!
This source is only used to compile and install the package.
}
@@ -18,7 +18,7 @@ uses fpg_radiobutton, fpg_scrollbar, fpg_style, fpg_tab, fpg_trackbar, fpg_tree,
fpgui_db, fpg_gdi, fpg_impl, fpg_splitter, fpg_hint, fpg_spinedit,
fpg_extgraphics, fpg_ColorMapping, fpg_ColorWheel, fpg_interface,
- fpg_editbtn, fpg_imgfmt_jpg, fpg_imgutils;
+ fpg_editbtn, fpg_imgfmt_jpg, fpg_imgutils, fpg_OLEDragDrop;
implementation
diff --git a/src/corelib/keys.inc b/src/corelib/keys.inc index f8b24b34..4d62c4bf 100644 --- a/src/corelib/keys.inc +++ b/src/corelib/keys.inc @@ -5,7 +5,7 @@ GII info at <http://www.ggi-project.org/packages/libgii.html> } -{%mainunit gfxbase.pas} +{%mainunit fpg_base.pas} const diff --git a/src/corelib/lang_af.inc b/src/corelib/lang_af.inc index 70598111..6dad1634 100644 --- a/src/corelib/lang_af.inc +++ b/src/corelib/lang_af.inc @@ -7,6 +7,7 @@ rserrnotassigned = '<%s> is nie toegewys nie'; rsnewitemdetected = '''n Nuwe item is opgespoor.'; rsabort = 'Staak'; rsabout = 'Aangaande %s'; +rsaddcurrentdirectory = 'Add current directory'; rsall = 'Alles'; rsallfiles = 'Alle Lêers'; rscollectionallfonts = 'Alle Lettertipes'; @@ -20,9 +21,11 @@ rsbold = 'Vetdruk'; rscancel = 'Kanselleer'; rscannotcreatedir = 'Kan nie die lêergids skep nie'; rschange = 'Verander'; -rscharactermap = 'Character Map'; +rschangetitle = 'Change Title'; +rscharactermap = 'Karakter Kaart'; rsclose = 'Sluit'; rscollection = 'Versameling'; +rsconfigurebookmarks = 'Configure Bookmarks'; rsconfirm = 'Bevestig'; rsconfirmation = 'Bevestiging'; rscopy = 'Kopieer'; @@ -36,6 +39,7 @@ rsshortdec = 'Des'; rslongdec = 'Desember'; rsdelete = 'Skrap'; rsdirectories = 'Lêergidse'; +rsdirectory = 'Directory'; rsdrive = 'Dryf'; rsedit = 'Redigeer'; rslanguage = 'Afrikaans'; @@ -61,7 +65,7 @@ rshelp = 'Help'; rsignore = 'Ignoreer'; rsinformation = 'Informasie'; rsinsert = 'Invoeg'; -rsinsertfromcharactermap = 'Insert from Character Map'; +rsinsertfromcharactermap = 'Voeg in van Karakter Kaart'; rsitalic = 'Kursief'; rserritemofwrongtype = 'Die item is nie van <%s> tiepe nie!'; rsshortjan = 'Jan'; @@ -79,6 +83,8 @@ rsmessage = 'Boodskap'; rsfilemodifiedtime = 'Wysigings Tyd'; rsshortmon = 'Ma'; rslongmon = 'Maandag'; +rsmovedown = 'Move Down'; +rsmoveup = 'Move Up'; rsname = 'Naam'; rsno = 'Nee'; rsnotoall = 'Nee vir Alles'; @@ -113,7 +119,7 @@ rssize = 'Groote'; rsstyle = 'Steil'; rsshortsun = 'So'; rslongsun = 'Sondag'; -rstexttoinsert = 'Text to Insert'; +rstexttoinsert = 'Teks om in te voeg'; rsshortthu = 'Do'; rslongthu = 'Donderdag'; rstoday = 'Vandag'; diff --git a/src/corelib/lang_de.inc b/src/corelib/lang_de.inc index f3f45489..c47c4280 100644 --- a/src/corelib/lang_de.inc +++ b/src/corelib/lang_de.inc @@ -7,6 +7,7 @@ rserrnotassigned = '<%s> nicht zugewiesen'; rsnewitemdetected = 'Es wurde ein neuer Eintrag gefunden.'; rsabort = 'Abbrechen'; rsabout = 'Über %s'; +rsaddcurrentdirectory = 'Add current directory'; rsall = 'Alle'; rsallfiles = 'Alle Dateien'; rscollectionallfonts = 'Alle Schriften'; @@ -20,9 +21,11 @@ rsbold = 'Fett'; rscancel = 'Abbrechen'; rscannotcreatedir = 'Kann Verzeichnis nicht anlegen'; rschange = 'Ändern'; +rschangetitle = 'Change Title'; rscharactermap = 'Character Map'; rsclose = 'Schließen'; rscollection = 'Sammlung'; +rsconfigurebookmarks = 'Configure Bookmarks'; rsconfirm = 'Bestätigen'; rsconfirmation = 'Bestätigung'; rscopy = 'Kopieren'; @@ -36,6 +39,7 @@ rsshortdec = 'Dez'; rslongdec = 'Dezember'; rsdelete = 'Löschen'; rsdirectories = 'Verzeichnisse'; +rsdirectory = 'Directory'; rsdrive = 'Laufwerk'; rsedit = 'Bearbeiten'; rslanguage = 'Englisch'; @@ -79,6 +83,8 @@ rsmessage = 'Meldung'; rsfilemodifiedtime = 'Änderungszeit'; rsshortmon = 'Mon'; rslongmon = 'Montag'; +rsmovedown = 'Move Down'; +rsmoveup = 'Move Up'; rsname = 'Name'; rsno = 'Nein'; rsnotoall = 'Nein zu allem'; diff --git a/src/corelib/lang_en.inc b/src/corelib/lang_en.inc index a7db8859..881c23e5 100644 --- a/src/corelib/lang_en.inc +++ b/src/corelib/lang_en.inc @@ -7,6 +7,7 @@ rserrnotassigned = '<%s> not assigned'; rsnewitemdetected = 'A new item has been detected.'; rsabort = 'Abort'; rsabout = 'About %s'; +rsaddcurrentdirectory = 'Add current directory'; rsall = 'All'; rsallfiles = 'All Files'; rscollectionallfonts = 'All Fonts'; @@ -20,9 +21,11 @@ rsbold = 'Bold'; rscancel = 'Cancel'; rscannotcreatedir = 'Cannot create directory'; rschange = 'Change'; +rschangetitle = 'Change Title'; rscharactermap = 'Character Map'; rsclose = 'Close'; rscollection = 'Collection'; +rsconfigurebookmarks = 'Configure Bookmarks'; rsconfirm = 'Confirm'; rsconfirmation = 'Confirmation'; rscopy = 'Copy'; @@ -36,6 +39,7 @@ rsshortdec = 'Dec'; rslongdec = 'December'; rsdelete = 'Delete'; rsdirectories = 'Directories'; +rsdirectory = 'Directory'; rsdrive = 'Drive'; rsedit = 'Edit'; rslanguage = 'English'; @@ -79,6 +83,8 @@ rsmessage = 'Message'; rsfilemodifiedtime = 'Mod. Time'; rsshortmon = 'Mon'; rslongmon = 'Monday'; +rsmovedown = 'Move Down'; +rsmoveup = 'Move Up'; rsname = 'Name'; rsno = 'No'; rsnotoall = 'No to All'; diff --git a/src/corelib/lang_es.inc b/src/corelib/lang_es.inc index 099f1939..8e3979b0 100644 --- a/src/corelib/lang_es.inc +++ b/src/corelib/lang_es.inc @@ -7,6 +7,7 @@ rserrnotassigned = '<%s> no está asignado'; rsnewitemdetected = 'A new item has been detected.'; rsabort = 'Abortar'; rsabout = 'Acerca de %s'; +rsaddcurrentdirectory = 'Add current directory'; rsall = 'Todos'; rsallfiles = 'Todos los Archivos'; rscollectionallfonts = 'Todas las Fuentes'; @@ -20,9 +21,11 @@ rsbold = 'Negrita'; rscancel = 'Cancelar'; rscannotcreatedir = 'No se puede crear la carpeta'; rschange = 'Cambiar'; +rschangetitle = 'Change Title'; rscharactermap = 'Character Map'; rsclose = 'Cerrar'; rscollection = 'Colección'; +rsconfigurebookmarks = 'Configure Bookmarks'; rsconfirm = 'Confirmar'; rsconfirmation = 'Confirmación'; rscopy = 'Copiar'; @@ -36,6 +39,7 @@ rsshortdec = 'Dec'; rslongdec = 'December'; rsdelete = 'Borrar'; rsdirectories = 'Carpetas'; +rsdirectory = 'Directory'; rsdrive = 'Unidad'; rsedit = 'Editar'; rslanguage = 'Español'; @@ -79,6 +83,8 @@ rsmessage = 'Mensaje'; rsfilemodifiedtime = 'Hora de Modif.'; rsshortmon = 'Lun'; rslongmon = 'Lunes'; +rsmovedown = 'Move Down'; +rsmoveup = 'Move Up'; rsname = 'Nombre'; rsno = 'No'; rsnotoall = 'No a Todo'; diff --git a/src/corelib/lang_fr.inc b/src/corelib/lang_fr.inc index b75ee215..606e333b 100644 --- a/src/corelib/lang_fr.inc +++ b/src/corelib/lang_fr.inc @@ -7,6 +7,7 @@ rserrnotassigned = '<%s> n''''est pas assigné'; rsnewitemdetected = 'Un nouvel item a été détecté'; rsabort = 'Arrêter'; rsabout = 'A propos de %s'; +rsaddcurrentdirectory = 'Add current directory'; rsall = 'Tous'; rsallfiles = 'Tous les fichiers'; rscollectionallfonts = 'Toutes les polices'; @@ -20,9 +21,11 @@ rsbold = 'Gras'; rscancel = 'Annuler'; rscannotcreatedir = 'Impossible de créer le répertoire'; rschange = 'Modifier'; -rscharactermap = 'Character Map'; +rschangetitle = 'Change Title'; +rscharactermap = 'Table de caractères'; rsclose = 'Fermer'; rscollection = 'Collection'; +rsconfigurebookmarks = 'Configure Bookmarks'; rsconfirm = 'Confirmer'; rsconfirmation = 'Confirmation'; rscopy = 'Copier'; @@ -36,6 +39,7 @@ rsshortdec = 'Déc'; rslongdec = 'Décembre'; rsdelete = 'Supprimer'; rsdirectories = 'Répertoires'; +rsdirectory = 'Directory'; rsdrive = 'Disque'; rsedit = 'Editer'; rslanguage = 'Français'; @@ -79,6 +83,8 @@ rsmessage = 'Message'; rsfilemodifiedtime = 'Date modif.'; rsshortmon = 'Lun'; rslongmon = 'Lundi'; +rsmovedown = 'Move Down'; +rsmoveup = 'Move Up'; rsname = 'Nom'; rsno = 'Non'; rsnotoall = 'Non à tous'; @@ -113,7 +119,7 @@ rssize = 'Taille'; rsstyle = 'Style'; rsshortsun = 'Dim'; rslongsun = 'Dimanche'; -rstexttoinsert = 'Text to Insert'; +rstexttoinsert = 'Texte à insérer'; rsshortthu = 'Jeu'; rslongthu = 'Jeudi'; rstoday = 'Aujourd''''hui'; diff --git a/src/corelib/lang_it.inc b/src/corelib/lang_it.inc index ece9f08f..2d056311 100644 --- a/src/corelib/lang_it.inc +++ b/src/corelib/lang_it.inc @@ -7,6 +7,7 @@ rserrnotassigned = '<%s> non assegnato'; rsnewitemdetected = 'E'''' stato rilevato un nuovo elemento.'; rsabort = 'Interrompi'; rsabout = 'Informazioni %s'; +rsaddcurrentdirectory = 'Add current directory'; rsall = 'Tutto'; rsallfiles = 'Tutti i Files'; rscollectionallfonts = 'Tutti i Fonts'; @@ -20,9 +21,11 @@ rsbold = 'Grassetto'; rscancel = 'Annulla'; rscannotcreatedir = 'Non riesco a creare la cartella'; rschange = 'Cambia'; +rschangetitle = 'Change Title'; rscharactermap = 'Character Map'; rsclose = 'Chiudi'; rscollection = 'Collezione'; +rsconfigurebookmarks = 'Configure Bookmarks'; rsconfirm = 'Conferma'; rsconfirmation = 'Conferma'; rscopy = 'Copia'; @@ -36,6 +39,7 @@ rsshortdec = 'Dic'; rslongdec = 'Dicembre'; rsdelete = 'Cancella'; rsdirectories = 'Cartelle'; +rsdirectory = 'Directory'; rsdrive = 'Disco'; rsedit = 'Modifica'; rslanguage = 'Italiano'; @@ -79,6 +83,8 @@ rsmessage = 'Messaggio'; rsfilemodifiedtime = 'Tempo Mod.'; rsshortmon = 'Lun'; rslongmon = 'Lunedì'; +rsmovedown = 'Move Down'; +rsmoveup = 'Move Up'; rsname = 'Nome'; rsno = 'No'; rsnotoall = 'No a Tutto'; diff --git a/src/corelib/lang_pt.inc b/src/corelib/lang_pt.inc index b6a2d330..76b21500 100644 --- a/src/corelib/lang_pt.inc +++ b/src/corelib/lang_pt.inc @@ -7,6 +7,7 @@ rserrnotassigned = '<%s> not assigned'; rsnewitemdetected = 'A new item has been detected.'; rsabort = 'Abortar'; rsabout = 'About %s'; +rsaddcurrentdirectory = 'Add current directory'; rsall = 'Todos'; rsallfiles = 'Todos os arquivos'; rscollectionallfonts = 'All Fonts'; @@ -20,9 +21,11 @@ rsbold = 'Negrito'; rscancel = 'Cancelar'; rscannotcreatedir = 'Não foi possível criar diretório'; rschange = 'Editar'; +rschangetitle = 'Change Title'; rscharactermap = 'Character Map'; rsclose = 'Fechar'; rscollection = 'Coleção'; +rsconfigurebookmarks = 'Configure Bookmarks'; rsconfirm = 'Confirmar'; rsconfirmation = 'Confirmação'; rscopy = 'Copy'; @@ -36,6 +39,7 @@ rsshortdec = 'Dec'; rslongdec = 'December'; rsdelete = 'Deletar'; rsdirectories = 'Diretórios'; +rsdirectory = 'Directory'; rsdrive = 'Drive'; rsedit = 'Editar'; rslanguage = 'Português'; @@ -79,6 +83,8 @@ rsmessage = 'Mensagem'; rsfilemodifiedtime = 'Mod. Time'; rsshortmon = 'Mon'; rslongmon = 'Monday'; +rsmovedown = 'Move Down'; +rsmoveup = 'Move Up'; rsname = 'Nome'; rsno = 'Não'; rsnotoall = 'Não para todos'; diff --git a/src/corelib/lang_ru.inc b/src/corelib/lang_ru.inc index f1571f0b..e989d927 100644 --- a/src/corelib/lang_ru.inc +++ b/src/corelib/lang_ru.inc @@ -7,6 +7,7 @@ rserrnotassigned = 'Значение <%s> не определено'; rsnewitemdetected = 'Обнаружен новый элемент'; rsabort = 'Прервать'; rsabout = 'Информация о %s'; +rsaddcurrentdirectory = 'Add current directory'; rsall = 'Все'; rsallfiles = 'Все файлы'; rscollectionallfonts = 'Все шрифты'; @@ -20,9 +21,11 @@ rsbold = 'Жирный'; rscancel = 'Отмена'; rscannotcreatedir = 'Невозможно создать директорию'; rschange = 'Изменить'; +rschangetitle = 'Change Title'; rscharactermap = 'Character Map'; rsclose = 'Закрыть'; rscollection = 'Группа'; +rsconfigurebookmarks = 'Configure Bookmarks'; rsconfirm = 'Подтвердить'; rsconfirmation = 'Подтверждение'; rscopy = 'Копировать'; @@ -36,6 +39,7 @@ rsshortdec = 'Дек'; rslongdec = 'Декабрь'; rsdelete = 'Удалить'; rsdirectories = 'Директории'; +rsdirectory = 'Directory'; rsdrive = 'Диск'; rsedit = 'Редактировать'; rslanguage = 'Русский'; @@ -79,6 +83,8 @@ rsmessage = 'Сообщение'; rsfilemodifiedtime = 'Изменен'; rsshortmon = 'Пн'; rslongmon = 'Понедельник'; +rsmovedown = 'Move Down'; +rsmoveup = 'Move Up'; rsname = 'Название'; rsno = 'Нет'; rsnotoall = 'Нет для всех'; diff --git a/src/corelib/predefinedcolors.inc b/src/corelib/predefinedcolors.inc index 1e6c4b54..ddb333b9 100644 --- a/src/corelib/predefinedcolors.inc +++ b/src/corelib/predefinedcolors.inc @@ -29,12 +29,13 @@ clMoneyGreen = TfpgColor($C0DCC0); clSkyBlue = TfpgColor($A6CAF0); clMedGray = TfpgColor($A0A0A4); + clUIDesignerGreen = TfpgColor($C0E0C0); // System named color identifiers. DON'T CHANGE THE ORDER! - cl_BaseNamedColor = TfpgColor($80000000); + cl_BaseNamedColor = $80000000; clWindowBackground = TfpgColor(cl_BaseNamedColor + 1); clBoxColor = TfpgColor(cl_BaseNamedColor + 2); @@ -67,6 +68,7 @@ clGridSelectionText = TfpgColor(cl_BaseNamedColor + 29); clGridInactiveSel = TfpgColor(cl_BaseNamedColor + 30); clGridInactiveSelText = TfpgColor(cl_BaseNamedColor + 31); + clSplitterGrabBar = TfpgColor(cl_BaseNamedColor + 32); diff --git a/src/corelib/stdimages.inc b/src/corelib/stdimages.inc index 0c880278..c494f96d 100644 --- a/src/corelib/stdimages.inc +++ b/src/corelib/stdimages.inc @@ -1,347 +1,55 @@ -{%mainunit fpg_stdimages.pas} Const - stdimg_list_add_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0,215, 13, 0, 0,215, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,182,132, - 93,164,101, 52,164,101, 52,182,132, 93,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,164,101, 52,230,206, - 183,230,206,183,164,101, 52,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,164,101, 52,230,206,183,217,173, - 134,164,101, 52,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,164,101, 52,230,206,183,217,173,134,164,101, - 52,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,182,132, 93,164,101, 52,164,101, 52, - 164,101, 52,164,101, 52,217,173,134,217,173,134,164,101, 52,164,101, - 52,164,101, 52,164,101, 52,182,132, 93,255,255,255,255,255,255,255, - 255,255,255,255,255,164,101, 52,229,204,180,219,183,149,219,182,148, - 218,180,146,218,179,144,217,173,134,216,170,131,215,168,127,215,166, - 125,224,190,159,164,101, 52,255,255,255,255,255,255,255,255,255,255, - 255,255,164,101, 52,232,211,192,231,209,187,231,209,188,230,206,183, - 230,206,183,230,206,183,230,206,183,230,205,182,230,204,181,230,204, - 182,164,101, 52,255,255,255,255,255,255,255,255,255,255,255,255,182, - 132, 93,164,101, 52,164,101, 52,164,101, 52,164,101, 52,230,206,183, - 230,206,183,164,101, 52,164,101, 52,164,101, 52,164,101, 52,182,132, - 93,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,164,101, 52,230,206,183,230,206,183, - 164,101, 52,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,164,101, 52,230,206,183,230,206,183,164,101, 52, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,164,101, 52,230,206,183,230,206,183,164,101, 52,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,182, - 132, 93,164,101, 52,164,101, 52,182,132, 93,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255); - -Const - stdimg_menu_saveas_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,216,171,142,205,149,112,189,115, 66,183,104, 53,181,104, - 53,180,103, 52,178,102, 52,176,101, 51,174,100, 51,172, 99, 50,170, - 98, 50,169, 97, 50,168, 96, 49,167, 97, 50,171,105, 60,188,134, 97, - 195,125, 79,235,198,173,234,197,173,254,251,248,254,251,248,254,251, - 248,254,251,248,254,251,248,254,251,248,254,251,248,254,251,248,254, - 251,248,254,251,248,200,154,124,199,152,121,173,107, 64,186,108, 56, - 237,202,179,224,162,122,254,250,247, 98,192,136, 98,192,136, 98,192, - 136, 98,192,136, 98,192,136, 98,192,136, 98,192,136, 98,192,136,253, - 249,246,202,141,101,201,155,124,167, 97, 50,187,108, 56,238,204,182, - 225,162,122,254,250,247,191,220,194,191,220,194,191,220,194,191,220, - 194,191,220,194,191,220,194,191,220,194,191,220,194,253,249,246,205, - 144,104,204,158,129,168, 97, 50,187,107, 56,239,206,184,225,162,121, - 254,250,247, 98,192,136, 98,192,136,206,247,255, 41, 41, 41, 82, 82, - 82,206,247,255, 98,192,136, 98,192,136,253,249,246,207,147,106,206, - 163,132,170, 97, 50,186,106, 54,239,208,187,226,162,122,254,251,248, - 206,247,255,206,247,255,206,247,255,206,247,255,206,247,255,206,247, - 255,206,247,255,206,247,255,254,251,248,211,150,109,210,167,138,171, - 98, 50,187,106, 54,240,210,190,226,163,122,226,163,122,206,247,255, - 206,247,255,206,247,255, 41, 41, 41, 82, 82, 82,206,247,255,206,247, - 255,206,247,255,216,153,113,214,153,112,213,171,142,173, 99, 51,187, - 106, 54,242,213,194,227,163,122,208,242,250,206,247,255,206,247,255, - 206,247,255, 82, 82, 82, 41, 41, 41,132,156,165,206,247,255,206,247, - 255,210,247,254,217,155,115,218,176,149,175,100, 51,187,106, 54,242, - 216,197,227,164,123,181,238,254,181,239,255,181,239,255,181,239,255, - 181,239,255, 82, 82, 82, 41, 41, 41, 82, 82, 82,181,239,255,181,239, - 254,220,157,116,221,181,154,177,101, 52,187,107, 54,244,217,199,230, - 166,125,186,236,250,181,239,255, 41, 41, 41, 82, 82, 82,181,239,255, - 181,239,255, 41, 41, 41, 41, 41, 41,181,239,255,186,239,253,218,156, - 116,225,186,159,179,102, 52,187,108, 55,244,220,201,231,167,125,201, - 230,240,181,239,255, 41, 41, 41, 41, 41, 41,181,239,255,132,156,165, - 41, 41, 41, 41, 41, 41,181,239,255,201,239,249,222,160,119,228,190, - 164,180,103, 52,189,110, 58,245,221,204,231,168,126,250,240,232,181, - 239,255,132,156,165, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 132,156,165,181,239,255,247,229,217,224,162,120,231,194,169,182,104, - 53,192,116, 66,246,223,208,232,168,126,252,246,241,198,242,246,148, - 247,255,148,247,255,148,247,255,148,247,255,148,247,255,148,247,255, - 184,228,232,247,230,219,225,163,122,239,213,195,183,106, 54,198,130, - 85,246,223,209,233,170,128,254,250,246,253,250,246,218,241,243,175, - 244,250,153,246,254,153,246,254,175,244,250,218,241,243,249,236,226, - 248,231,219,238,208,186,236,208,189,189,116, 67,214,165,133,246,224, - 209,247,224,209,254,251,248,254,251,247,253,249,246,252,245,240,250, - 240,234,251,242,237,253,249,246,253,250,247,251,241,235,248,233,223, - 236,209,190,205,146,106,226,197,177,225,189,166,217,171,141,201,137, - 94,192,117, 67,189,110, 58,187,108, 55,187,107, 54,187,106, 54,187, - 106, 54,188,108, 57,189,110, 59,187,109, 58,191,116, 68,201,141,101, - 231,206,188,255,255,255); - -Const - stdimg_help_16 : Array[0..821] of byte = ( + stdimg_edit : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,192,161,139,164,117, 85,142, 85, 45,142, 85, 45,165,119, 87,193, - 161,139,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,198,169,149,147, 91, 53,203,175, - 155,229,214,203,248,244,241,249,245,242,232,219,209,211,186,167,149, - 94, 56,199,171,151,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,163,116, 84,175,134,105,243,237,233,221,201,186,199,165, - 139,187,145,113,193,153,121,213,183,159,233,218,205,248,243,239,183, - 145,117,166,120, 88,255, 0,255,255, 0,255,255, 0,255,199,170,150, - 174,133,105,243,238,233,183,143,114,165,114, 76,179,135,101,255,255, - 255,255,255,255,193,151,116,197,155,120,215,185,160,249,245,241,180, - 140,112,199,171,151,255, 0,255,255, 0,255,146, 91, 52,242,235,230, - 177,135,105,157,103, 64,163,111, 73,178,132, 98,255,255,255,255,255, - 255,189,146,111,193,150,114,197,155,120,214,183,157,247,241,237,147, - 93, 54,255, 0,255,192,161,139,195,166,145,211,188,173,148, 92, 51, - 154,100, 60,161,108, 69,169,120, 82,200,168,143,204,173,148,183,137, - 101,187,143,107,191,147,112,193,150,115,231,215,201,207,181,161,193, - 161,139,162,115, 83,221,204,192,175,134,106,145, 88, 47,151, 96, 56, - 157,103, 64,167,118, 81,228,212,200,229,214,202,180,134, 98,182,135, - 99,185,139,103,186,142,106,209,178,155,230,215,204,165,118, 86,141, - 83, 43,245,240,237,148, 94, 56,142, 83, 42,148, 91, 51,153, 98, 58, - 159,105, 66,243,237,232,255,255,255,208,181,160,176,127, 90,178,131, - 94,180,133, 96,189,148,117,248,243,240,142, 84, 45,141, 83, 43,245, - 240,237,147, 92, 54,138, 79, 37,144, 86, 45,149, 93, 52,154, 99, 59, - 181,139,109,252,251,249,254,254,254,193,157,130,172,122, 84,173,124, - 86,183,141,108,247,243,239,142, 84, 44,162,115, 83,221,204,192,172, - 130,101,135, 74, 32,139, 80, 39,144, 86, 45,149, 92, 52,153, 98, 58, - 194,161,137,255,255,255,243,236,232,165,114, 75,166,115, 77,195,161, - 134,225,210,198,164,117, 85,192,161,139,195,165,144,208,185,169,135, - 74, 32,135, 74, 32,159,110, 75,160,111, 77,148, 91, 50,168,122, 89, - 255,255,255,253,252,251,161,109, 70,159,106, 67,218,198,183,198,170, - 149,192,161,139,255, 0,255,146, 92, 53,241,234,229,165,120, 88,135, - 74, 32,176,136,108,254,253,253,233,222,214,246,242,239,255,255,255, - 220,202,189,152, 96, 56,179,137,107,242,235,230,145, 91, 52,255, 0, - 255,255, 0,255,198,169,149,173,131,103,242,235,231,166,120, 89,156, - 105, 71,222,206,194,247,243,240,241,234,230,208,184,167,160,111, 77, - 173,130,100,243,237,232,171,128, 98,198,169,149,255, 0,255,255, 0, - 255,255, 0,255,163,116, 84,170,127, 97,240,232,227,208,185,169,172, - 130,101,150, 96, 59,150, 96, 59,172,130,101,209,186,170,240,233,228, - 170,128, 98,163,116, 84,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,198,169,149,145, 91, 52,193,162,141,219,201,189,244, - 239,235,244,239,235,219,201,189,193,163,141,145, 90, 51,199,170,150, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,192,161,139,162,115, 83,141, 83, 43,141, - 83, 43,162,115, 83,192,161,139,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255); - -Const - stdimg_dialog_error_32 : Array[0..3125] of byte = ( - 66, 77, 54, 12, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 32, 0, 0, 0, 32, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 12, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,254,254,254,249,249,249,242,242,242,233, - 233,233,225,225,225,219,219,219,213,213,213,208,208,208,204,204,204, - 208,208,208,211,211,211,216,216,216,222,222,222,229,229,229,239,239, - 239,247,247,247,252,252,252,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,245,245,245,231,231, - 231,219,219,219,208,208,208,198,198,198,187,187,187,178,178,178,169, - 169,169,162,162,162,156,156,156,153,153,153,154,154,154,157,157,157, - 162,162,162,170,170,170,179,179,179,189,189,189,199,199,199,209,209, - 209,222,222,222,239,239,239,252,252,252,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,245,245,245,233,233,233,220,220,220,208,208,208,195,195, - 195,183,183,183,159,159,170,102,102,164, 44, 44,169, 20, 20,172, 8, - 8,175, 2, 2,177, 7, 7,174, 19, 19,171, 40, 40,165, 96, 96,158, - 149,149,160,172,172,172,184,184,184,197,197,197,209,209,209,222,222, - 222,235,235,235,252,252,252,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254, - 242,242,242,231,231,231,219,219,219,179,179,204, 60, 60,185, 6, 6, - 179, 16, 18,187, 25, 33,199, 39, 52,207, 49, 65,211, 57, 76,215, 48, - 65,210, 38, 50,203, 24, 32,197, 16, 17,184, 6, 6,178, 59, 59,182, - 171,171,196,209,209,209,221,221,221,232,232,232,244,244,244,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,250,253, - 101,101,208, 10, 10,182, 21, 26,196, 61, 78,218, 54, 70,218, 36, 46, - 211, 25, 30,207, 18, 22,205, 15, 17,203, 18, 22,203, 25, 30,205, 35, - 45,208, 52, 69,213, 55, 75,215, 21, 26,194, 9, 9,181,104,104,206, - 245,245,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,235,235,249, 51, 51,195, 17, 18,191, 59, 74,219, - 51, 64,218, 19, 21,209, 10, 10,206, 10, 10,205, 10, 10,205, 10, 10, - 204, 10, 10,203, 9, 9,203, 9, 9,202, 9, 9,201, 9, 9,200, 19, - 22,203, 47, 62,212, 53, 71,213, 15, 17,187, 54, 54,196,236,236,249, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,239,239,250, 27, - 27,187, 22, 26,198, 66, 82,225, 26, 31,214, 11, 11,210, 11, 11,209, - 11, 11,208, 11, 11,208, 10, 10,207, 10, 10,206, 10, 10,205, 10, 10, - 205, 10, 10,204, 10, 10,204, 9, 9,203, 9, 9,202, 9, 9,202, 24, - 30,206, 59, 78,217, 20, 24,193, 30, 30,188,240,240,250,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,252,252,254, 57, 57,197, 24, 27,202, 64, 78,226, 20, - 22,215, 12, 12,213, 12, 12,212, 12, 12,211, 11, 11,211, 11, 11,210, - 11, 11,209, 11, 11,209, 11, 11,208, 11, 11,207, 10, 10,207, 10, 10, - 206, 10, 10,205, 10, 10,204, 10, 10,204, 10, 10,203, 17, 20,205, 56, - 74,217, 21, 25,194, 60, 60,197,252,252,254,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,120,120, - 216, 19, 20,194, 68, 82,229, 19, 21,218, 13, 13,216, 13, 13,215, 12, - 12,214, 12, 12,214, 12, 12,213, 12, 12,212, 12, 12,211, 11, 11,211, - 11, 11,210, 11, 11,210, 11, 11,209, 11, 11,208, 11, 11,208, 10, 10, - 207, 10, 10,206, 10, 10,205, 10, 10,205, 17, 19,206, 60, 78,219, 18, - 19,191,124,124,217,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,230,230,247, 17, 17,187, 63, 75,228, 28, 31, - 222, 13, 13,219, 13, 13,218, 13, 13,217, 13, 13,216, 13, 13,216, 13, - 13,215, 12, 12,215, 12, 12,214, 12, 12,213, 12, 12,213, 12, 12,212, - 12, 12,211, 11, 11,210, 11, 11,210, 11, 11,209, 11, 11,208, 11, 11, - 208, 11, 11,207, 10, 10,207, 23, 28,210, 53, 69,217, 17, 17,185,232, - 232,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 91, 91,207, 28, 31,208, 53, 61,229, 14, 14,221, 14, 14,221, 14, 14, - 220, 14, 14,220, 14, 14,219, 13, 13,218, 13, 13,218, 13, 13,217, 13, - 13,216, 13, 13,215, 12, 12,215, 12, 12,214, 12, 12,214, 12, 12,213, - 12, 12,212, 12, 12,211, 11, 11,211, 11, 11,210, 11, 11,209, 11, 11, - 209, 11, 11,208, 47, 59,217, 23, 27,200, 94, 94,208,255,255,255,255, - 255,255,255,255,255,255,255,255,240,240,250, 10, 10,183, 70, 82,232, - 29, 30,227, 29, 29,226, 22, 22,224, 14, 14,223, 14, 14,222, 14, 14, - 221, 14, 14,220, 14, 14,220, 14, 14,219, 13, 13,219, 13, 13,218, 13, - 13,217, 13, 13,216, 13, 13,216, 13, 13,215, 12, 12,214, 12, 12,214, - 12, 12,213, 12, 12,213, 12, 12,212, 12, 12,211, 11, 11,210, 18, 21, - 212, 60, 77,222, 9, 10,182,242,242,251,255,255,255,255,255,255,255, - 255,255,166,166,228, 24, 25,197,104,111,238, 84, 84,235, 84, 84,234, - 84, 84,234, 72, 72,232, 51, 51,229, 25, 25,225, 15, 15,223, 14, 14, - 222, 14, 14,221, 14, 14,221, 14, 14,220, 14, 14,219, 13, 13,219, 13, - 13,218, 13, 13,218, 13, 13,217, 13, 13,216, 13, 13,215, 12, 12,215, - 12, 12,214, 12, 12,213, 12, 12,213, 12, 12,212, 58, 72,223, 20, 22, - 193,170,170,229,255,255,255,255,255,255,255,255,255, 78, 78,204, 55, - 58,217,103,107,240, 82, 82,236, 83, 83,236, 83, 83,236, 83, 83,235, - 82, 82,234, 81, 81,234, 58, 58,230, 26, 26,225, 15, 15,224, 15, 15, - 223, 14, 14,223, 14, 14,222, 14, 14,221, 14, 14,220, 14, 14,220, 14, - 14,219, 13, 13,218, 13, 13,218, 13, 13,217, 13, 13,216, 13, 13,216, - 13, 13,215, 12, 12,214, 40, 48,221, 28, 34,205, 82, 82,203,255,255, - 255,255,255,255,255,255,255, 38, 38,193, 88, 94,229, 93, 95,240, 80, - 80,237, 80, 80,237, 80, 80,237,243,243,243,243,243,243,243,243,243, - 243,243,243,243,243,243,241,241,241,239,239,239,239,239,239,239,239, - 239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239, - 239,239,239,239,239,239,239,239, 13, 13,218, 13, 13,217, 23, 23,218, - 51, 56,223, 46, 55,215, 40, 40,192,255,255,255,255,255,255,255,255, - 255, 16, 16,185,109,115,238, 87, 87,240, 79, 79,239, 79, 79,239, 79, - 79,238,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, - 243,243,243,243,243,243,240,240,240,239,239,239,239,239,239,239,239, - 239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239, - 239,239, 23, 23,221, 57, 57,226, 79, 79,229, 87, 89,229, 76, 87,225, - 19, 19,185,255,255,255,255,255,255,255,255,255, 3, 3,180,120,126, - 244, 81, 82,242, 77, 77,241, 77, 77,240, 77, 77,240,243,243,243,243, - 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, - 243,243,243,241,241,241,239,239,239,239,239,239,239,239,239,239,239, - 239,239,239,239,239,239,239,239,239,239,241,241,241, 74, 74,231, 76, - 76,231, 76, 76,230, 82, 84,230, 97,110,233, 5, 5,180,255,255,255, - 255,255,255,255,255,255, 16, 16,185,103,108,239, 84, 85,244, 75, 75, - 243, 75, 75,242, 75, 75,241,243,243,243,243,243,243,243,243,243,243, - 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, - 242,242,242,240,240,240,240,240,240,239,239,239,240,240,240,242,242, - 242,243,243,243,243,243,243, 75, 75,233, 75, 75,232, 75, 75,232, 83, - 85,233, 85, 95,228, 19, 19,186,255,255,255,255,255,255,255,255,255, - 37, 37,193, 82, 86,233, 87, 89,245, 73, 73,244, 73, 73,243, 74, 74, - 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, - 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, - 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, - 243, 73, 73,234, 72, 72,233, 73, 73,233, 87, 90,235, 69, 76,223, 40, - 40,193,255,255,255,255,255,255,255,255,255, 77, 77,205, 53, 56,223, - 97, 99,247, 72, 72,246, 71, 71,245, 71, 71,245, 71, 71,244, 71, 71, - 243, 72, 72,243, 72, 72,243, 71, 71,242, 71, 71,241, 71, 71,241, 71, - 71,240, 72, 72,240, 72, 72,240, 71, 71,239, 71, 71,239, 71, 71,238, - 71, 71,237, 71, 71,236, 71, 71,237, 71, 71,236, 71, 71,236, 71, 71, - 235, 71, 71,234, 94, 99,237, 44, 49,214, 81, 81,204,255,255,255,255, - 255,255,255,255,255,165,165,228, 29, 30,203,113,118,250, 71, 71,247, - 71, 71,247, 71, 71,246, 71, 71,246, 70, 70,245, 70, 70,245, 70, 70, - 244, 70, 70,244, 70, 70,243, 70, 70,242, 69, 69,242, 69, 69,242, 69, - 69,241, 69, 69,240, 70, 70,240, 70, 70,239, 69, 69,239, 69, 69,239, - 69, 69,238, 69, 69,237, 69, 69,237, 70, 70,236, 69, 69,236,108,116, - 241, 25, 26,198,170,170,229,255,255,255,255,255,255,255,255,255,240, - 240,250, 10, 10,184,116,121,249, 77, 78,249, 71, 71,249, 71, 71,248, - 71, 71,248, 71, 71,247, 71, 71,246, 71, 71,246, 71, 71,246, 70, 70, - 245, 70, 70,244, 70, 70,244, 70, 70,243, 70, 70,243, 70, 70,242, 69, - 69,242, 69, 69,241, 69, 69,241, 69, 69,240, 69, 69,239, 68, 68,239, - 68, 68,239, 68, 68,239, 74, 75,239,106,115,240, 11, 11,183,241,241, - 251,255,255,255,255,255,255,255,255,255,255,255,255, 89, 89,208, 45, - 46,223,106,109,252, 71, 71,250, 71, 71,250, 71, 71,250, 71, 71,249, - 71, 71,248, 71, 71,248, 71, 71,247, 71, 71,247, 71, 71,246, 71, 71, - 246, 70, 70,245, 70, 70,245, 70, 70,244, 70, 70,243, 70, 70,243, 70, - 70,242, 69, 69,242, 69, 69,242, 69, 69,241, 69, 69,240, 69, 69,240, - 100,107,242, 43, 45,215, 93, 93,209,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,230,230,247, 17, 17,189,111,115,250, 85, - 86,252, 72, 72,252, 71, 71,251, 71, 71,251, 71, 71,250, 71, 71,250, - 71, 71,249, 71, 71,249, 71, 71,248, 71, 71,247, 71, 71,247, 71, 71, - 246, 71, 71,246, 71, 71,246, 70, 70,245, 70, 70,244, 70, 70,244, 70, - 70,243, 70, 70,242, 69, 69,242, 81, 83,242,104,111,241, 18, 18,188, - 232,232,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,120,120,217, 27, 28,206,122,126,254, 79, 79,253, 72, - 72,253, 72, 72,253, 72, 72,252, 71, 71,251, 71, 71,251, 71, 71,250, - 71, 71,250, 71, 71,250, 71, 71,249, 71, 71,248, 71, 71,248, 71, 71, - 247, 71, 71,246, 71, 71,246, 71, 71,246, 70, 70,245, 70, 70,245, 75, - 76,245,117,124,247, 28, 29,202,123,123,217,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,252, - 254, 55, 55,198, 44, 44,218,121,124,254, 79, 80,254, 72, 72,254, 72, - 72,253, 72, 72,253, 72, 72,253, 72, 72,252, 72, 72,252, 71, 71,251, - 71, 71,250, 71, 71,250, 71, 71,250, 71, 71,249, 71, 71,249, 71, 71, - 248, 71, 71,247, 71, 71,247, 78, 79,247,115,122,248, 43, 45,214, 59, - 59,199,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,238,238,250, 28, 28, - 189, 45, 45,216,125,127,254, 86, 88,254, 72, 72,254, 72, 72,254, 72, - 72,254, 72, 72,254, 72, 72,253, 72, 72,253, 72, 72,253, 72, 72,252, - 71, 71,251, 71, 71,251, 71, 71,250, 71, 71,250, 71, 71,250, 86, 87, - 250,120,126,250, 43, 45,213, 29, 29,189,240,240,250,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,234,234,249, 50, 50,196, 30, 30, - 204,115,117,248,111,114,254, 80, 81,254, 72, 72,254, 72, 72,254, 72, - 72,254, 72, 72,254, 72, 72,254, 72, 72,253, 72, 72,253, 72, 72,253, - 72, 72,252, 81, 82,252,109,113,252,111,116,246, 28, 29,201, 52, 52, - 196,235,235,249,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,249,249,253,105,105,212, 10, 10,184, 53, 54, - 218,122,124,251,117,120,254, 99,100,254, 88, 89,254, 82, 82,254, 77, - 78,254, 82, 82,254, 87, 89,254, 98,100,254,115,119,254,119,123,251, - 50, 51,216, 12, 12,185,105,105,212,250,250,253,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,218,218,244, 74, 74,203, 11, 11,183, 35, 35, - 204, 68, 69,227, 92, 94,239,110,111,246,123,126,252,109,111,246, 91, - 93,238, 67, 68,227, 34, 34,204, 9, 9,183, 77, 77,204,219,219,244, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,237,237,250,162,162,227, 75, 75,204, 38, 38, - 193, 17, 17,186, 4, 4,180, 17, 17,186, 38, 38,194, 77, 77,205,164, - 164,228,238,238,250,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255); + 0, 3, 0, 0,235, 10, 0, 0,235, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 98,146, 94, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98,146, 94, 98,146, 94, + 98,146, 94, 88, 88, 88,220,220,220,255,255,255,255,255,255,255,255, + 255,255,255,255,160,160,160,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255, 0, 0, 0, 98,146, 94, 98,146, 94, 98,146, 94, + 88, 88, 88,220,220,220,160,160,160,160,160,160, 0, 0, 0,160,160, + 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, + 160,160, 0, 0, 0, 98,146, 94, 98,146, 94, 98,146, 94, 88, 88, 88, + 220,220,220,255,255,255,255,255,255, 88, 88, 88, 48, 48, 48, 0, 0, + 64,195,195,195,220,220,220,255,255,255,255,255,255,255,255,255, 0, + 0, 0, 98,146, 94, 98,146, 94, 98,146, 94, 88, 88, 88,220,220,220, + 255,255,255,255,255,255,255,255,255, 88, 88, 88,168,220,255, 0, 88, + 192, 0, 88,192,195,195,195,220,220,220,255,255,255, 0, 0, 0, 98, + 146, 94, 98,146, 94, 98,146, 94, 88, 88, 88,220,220,220,195,195,195, + 195,195,195,195,195,195,160,160,160,168,220,255,168,220,255,168,220, + 255, 0, 88,192, 0, 88,192,160,160,160, 0, 0, 0, 98,146, 94, 98, + 146, 94, 98,146, 94, 88, 88, 88,220,220,220,255,255,255,255,255,255, + 255,255,255,255,255,255, 88,168,255,168,220,255,168,220,255,168,220, + 255,168,220,255, 0, 0, 64, 0, 0, 0, 98,146, 94, 98,146, 94, 98, + 146, 94, 88, 88, 88,220,220,220,255,255,255,255,255,255,255,255,255, + 255,255,255,160,160,160,168,220,255,168,220,255, 0,128,255, 0,128, + 255, 0, 88,192, 48, 48, 48, 98,146, 94, 98,146, 94, 98,146, 94, 88, + 88, 88,220,220,220,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195, 88,168,255,168,220,255, 0,128,255, 0,128,255, 0,128, + 255, 0, 88,192, 48, 48, 48, 98,146, 94, 98,146, 94, 88, 88, 88,220, + 220,220,255,255,255,255,255,255,255,255,255,255,255,255,195,195,195, + 255,255,255, 88,168,255, 88,168,255, 0,128,255, 0,128,255, 0,128, + 255, 0, 88,192, 0, 0, 64, 98,146, 94, 88, 88, 88,220,220,220,255, + 255,255,255,255,255,255,255,255,255,255,255,195,195,195,255,255,255, + 255,255,255, 88,168,255, 88,168,255, 0,128,255, 0,128,255, 0,128, + 255, 0, 88,192, 98,146, 94, 88, 88, 88,220,220,220,195,195,195,195, + 195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195, 88,168,255, 88,168,255, 0,128,255, 0,128,255, 0,128, + 255, 98,146, 94, 88, 88, 88,220,220,220,255,255,255,255,255,255,255, + 255,255,255,255,255,195,195,195,255,255,255,255,255,255,255,255,255, + 255,255,255, 88,168,255, 88,168,255, 0,128,255, 0,128,255, 98,146, + 94, 88, 88, 88,220,220,220,255,255,255,255,255,255,255,255,255,255, + 255,255,195,195,195,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255, 88,168,255, 88,168,255, 0,128,255, 98,146, 94, 88, 88, + 88,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220, + 220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220, + 88, 88, 88, 88,168,255, 88,168,255, 98,146, 94, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 98,146, 94, 98,146, 94); Const stdimg_menu_save_all_16 : Array[0..821] of byte = ( @@ -448,6 +156,110 @@ Const 255,255,255,255,255,255); Const + stdimg_font_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,128,128,128,135,135,135,133, + 133,133,133,133,133,128,128,128,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255, 88, 88, 88,102,102,102,108,108,108, 99, + 99, 99, 83, 83, 83,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255, 81, 81, 81, 84, 84, 84, 81, 81, 81,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255, 60, 77,162, 76, 89,162, 77, 90,161, 74, 87,161, 73, 84, + 156,255, 0,255, 80, 80, 77, 45, 45, 45, 74, 74, 74,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 36, 59,219, 0, 43,255, 0, 47,255, 0, 39,239, 45, 62,197,255, 0, + 255, 65, 65, 63, 7, 7, 7, 60, 60, 60,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 19, 38,213, 0, 32,255, 80, 88,168,255, 0,255,255, 0,255, 55, 55, + 55, 0, 0, 0, 58, 58, 58,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 28, 37,212, + 0, 16,255, 86, 89,166,255, 0,255,255, 0,255, 55, 55, 55, 1, 1, + 1, 58, 58, 58,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255, 27, 28,213, 0, 3,255, + 85, 85,168,255, 0,255,255, 0,255, 55, 55, 55, 0, 0, 0, 58, 58, + 58,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255, 27, 27,213, 0, 0,255, 84, 84,166, + 255, 0,255,255, 0,255, 57, 57, 57, 11, 11, 11, 60, 60, 60,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255, 27, 27,220, 3, 4,166, 62, 62, 88,255, 0,255, + 255, 0,255, 71, 71, 71, 49, 49, 49, 71, 71, 71,255, 0,255,255, 0, + 255,100,100,100,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255, 27, 27,224, 19, 19,138, 52, 52, 32,255, 0,255,255, 0,255, + 78, 78, 78, 93, 93, 93, 76, 76, 76,255, 0,255,255, 0,255, 40, 40, + 40,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 29, + 29,225, 24, 24,153,113,113, 93, 65, 65, 65, 71, 71, 71, 84, 84, 81, + 139,139,138, 75, 75, 75, 74, 74, 74, 66, 66, 66,113,113,113,255, 0, + 255, 78, 78,167, 88, 88,152,255, 0,255,255, 0,255, 48, 48,225, 37, + 38,161,103,103, 98,114,114,111,106,106,103,106,106,115,112,112,115, + 111,111,111,105,105,105,113,113,113,113,113,113,255, 0,255, 83, 83, + 197, 45, 45,204,255, 0,255,255, 0,255, 59, 60,212, 81, 83,247, 72, + 72,146,255, 0,255,255, 0,255, 43, 44,213,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,105,105,181,113,114, + 255, 76, 76,207, 77, 77,191, 97, 98,244,127,128,255, 79, 79,220, 83, + 84,188, 87, 87,223,104,105,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,123,123,178, 80, 80,215, 84, 84, + 223, 80, 80,228, 81, 81,220, 74, 74,218, 79, 79,223, 77, 77,228, 83, + 83,239, 67, 68,231,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); + +Const + stdimg_choice_yes_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255, 12,164, 60, 17,171, 71, 13,173, 73,104,175, + 120,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 87,183,107, 78,224,155, 92,234,170, 92,234,171, 35,192,104, 87,167, + 106,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 32,183, 89, + 102,255,205,104,255,201, 85,255,195, 73,252,184, 24,199,107, 85,166, + 102,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,157,207,165, 22,223,131, 47,255,181, + 45,255,174, 30,255,170, 3,255,160, 17,250,157, 12,190, 93, 68,158, + 86,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255, 68,173, 91, 0,248,147, 1,254,156, 10,254,160, + 18,251,159, 38,250,165, 49,242,160, 70,234,157, 21,183, 87, 74,169, + 94,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255, 7,173, 65, 7,243,144, 45,243,160, 72,243,171,105,199,139, + 96,231,164,112,241,183,110,233,172,102,224,157, 28,169, 74, 57,157, + 75,255, 0,255,255, 0,255,255, 0,255,255, 0,255,148,199,148, 18, + 202,101, 79,235,162,102,241,178, 85,205,129,255, 0,255,172,211,180, + 89,192,126,129,232,178,130,225,170,129,215,157, 45,168, 78, 63,165, + 77,255, 0,255,255, 0,255,255, 0,255,127,196,134, 86,221,149,112, + 231,171,111,233,173,152,207,158,255, 0,255,255, 0,255,255, 0,255, + 101,183,121,151,227,181,150,221,173,157,217,170, 60,168, 84, 44,152, + 56,255, 0,255,255, 0,255,255, 0,255,138,190,142, 97,180,115, 81, + 180,107,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 109,181,120,173,225,187,170,219,179,181,219,181, 84,174,101, 42,147, + 51,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 121,181,123,195,228,198,191,223,191,206,230,203,110,184,122,115,185, + 121,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 126,181,126,218,237,218,228,242,228,169,210,169,173,204,172,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 115,168,114,139,187,139,195,215,194,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); + +Const stdimg_folder_new_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, @@ -500,56 +312,333 @@ Const 255,255,255,255,255,255); Const - stdimg_edit_paste_16 : Array[0..821] of byte = ( + stdimg_arrow_right : Array[0..137] of byte = ( + 66, 77,138, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 4, 0, 0, 0, 7, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 84, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0,255,255, 0,255,255, 0,255, 0, 0, + 0, 0, 0, 0,255, 0,255,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,255, 0,255,255, + 0,255); + +Const + stdimg_folder_up_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,155,181,197, 18, 80,118, 1, 68,108, 1, 68, - 108, 1, 68,108, 1, 68,108, 1, 68,108, 1, 68,108, 1, 68,108, 1, - 68,108, 1, 68,108, 1, 68,108, 19, 80,117,162,186,201,255, 0,255, - 255, 0,255, 13, 76,115, 35,127,186, 59,125,167,100,111,115,104,108, - 106,104,108,106,104,108,106,104,108,106,104,108,106, 61,124,163, 61, - 124,163, 61,124,163, 34,123,179, 16, 78,116,255, 0,255,255, 0,255, - 9, 74,114, 38,135,197, 99,109,112,237,238,237,254,254,254,254,254, - 254,254,254,254,238,239,239,253,254,254,100,105,103, 39,135,197, 39, - 135,197, 39,135,197, 3, 68,108,255, 0,255,255, 0,255, 9, 74,114, - 38,135,197,100,104,102,255,255,255,228,231,231,213,216,216,190,194, - 193,180,183,183,255,255,255,255,255,255,100,105,103, 39,135,197, 40, - 134,194, 3, 68,108,255, 0,255,255, 0,255, 9, 74,114, 38,135,197, - 100,104,102,255,255,255,231,233,233,229,231,231,214,217,217,182,185, - 185,255,255,255,255,255,255,255,255,255,100,105,103, 40,134,194, 3, - 68,108,255, 0,255,255, 0,255, 9, 75,114, 38,135,197,100,104,102, - 255,255,255,234,236,236,232,234,234,230,232,232,203,206,205,182,186, - 185,181,185,184,255,255,255,100,105,103, 40,134,194, 3, 68,108,255, - 0,255,255, 0,255, 9, 75,114, 38,135,197,100,104,102,255,255,255, - 237,238,238,235,236,236,233,235,235,231,233,233,216,218,218,202,205, - 204,255,255,255,100,105,103, 40,134,194, 3, 68,108,255, 0,255,255, - 0,255, 9, 75,114, 38,135,197,100,104,102,255,255,255,239,240,240, - 238,239,239,236,237,237,234,235,235,232,234,234,217,219,219,255,255, - 255,100,105,103, 40,134,194, 3, 68,108,255, 0,255,255, 0,255, 9, - 75,114, 38,135,197,100,104,102,255,255,255,239,240,240,181,181,179, - 181,181,179,180,180,178,178,178,177,232,234,234,255,255,255,100,105, - 103, 40,134,194, 3, 68,108,255, 0,255,255, 0,255, 9, 75,115, 38, - 135,197,100,104,102,255,255,255,239,240,240,239,240,240,239,240,240, - 239,240,240,237,239,239,235,237,237,255,255,255,100,105,103, 40,134, - 194, 3, 68,108,255, 0,255,255, 0,255, 9, 75,115, 38,135,197,100, - 104,102,255,255,255,239,240,240,181,181,179,181,181,179,181,181,179, - 181,181,179,238,239,239,255,255,255,100,105,103, 40,134,194, 3, 68, - 108,255, 0,255,255, 0,255, 9, 75,115, 39,136,198,100,104,102,255, - 255,255,239,240,240,239,240,240,239,240,240,239,240,240,239,240,240, - 239,240,240,255,255,255,100,105,103, 40,134,194, 3, 68,108,255, 0, - 255,255, 0,255, 9, 75,115, 39,136,198,100,111,113,241,241,241,224, - 224,224,187,187,187,187,187,187,187,187,187,187,187,187,224,224,224, - 242,242,242,100,109,110, 39,135,197, 3, 68,108,255, 0,255,255, 0, - 255, 13, 77,116, 36,132,192, 62,126,164,100,109,112, 94, 94, 94,124, - 127,127,125,128,128,125,128,128,123,126,126, 94, 94, 94,100,108,110, - 64,124,161, 35,127,185, 16, 78,117,255, 0,255,255, 0,255,155,182, - 197, 18, 80,119, 1, 68,108, 3, 68,107, 91, 92, 92,137,149,149,138, - 151,151,138,151,151,137,149,149, 91, 92, 92, 3, 68,107, 1, 68,108, - 19, 81,118,162,186,201,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,137,138,138, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92,137,138,138,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255); + 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 198,167,146,138, 78, 37,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, + 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, + 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,169,148,138, 78, 37, + 217,181,149,221,186,154,221,186,154,221,186,154,221,186,154,221,186, + 154,221,186,154,221,186,154,221,186,154,221,186,154,221,186,154,221, + 186,154,221,186,154,217,181,149,138, 79, 37,135, 74, 32,223,192,162, + 213,172,134,213,172,134,213,172,134,213,172,134,213,172,134,213,172, + 134,213,172,134,213,172,134,213,172,134,213,172,134,213,172,134,213, + 172,134,223,192,162,135, 74, 32,135, 74, 32,226,197,170,215,175,138, + 215,175,138,215,175,138,143, 85, 42,143, 85, 42,143, 85, 42,143, 85, + 42,143, 85, 42,143, 85, 42,215,175,138,215,175,138,215,175,138,226, + 197,170,135, 74, 32,135, 74, 32,228,202,177,217,179,143,217,179,143, + 217,179,143,143, 85, 42,217,179,143,217,179,143,217,179,143,217,179, + 143,217,179,143,217,179,143,217,179,143,217,179,143,228,202,177,135, + 74, 32,135, 74, 32,230,205,181,217,179,143,143, 85, 42,205,164,128, + 143, 85, 42,205,164,128,143, 85, 42,217,179,143,217,179,143,217,179, + 143,217,179,143,217,179,143,217,179,143,230,205,181,135, 74, 32,135, + 74, 32,231,207,184,217,179,143,182,133, 95,143, 85, 42,143, 85, 42, + 143, 85, 42,182,133, 95,217,179,143,217,179,143,217,179,143,217,179, + 143,217,179,143,217,179,143,231,207,184,135, 74, 32,135, 74, 32,232, + 210,188,217,179,143,217,179,143,205,164,128,143, 85, 42,205,164,128, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, + 143,217,179,143,232,210,188,135, 74, 32,136, 76, 34,230,209,188,234, + 212,192,234,212,192,234,212,192,234,212,192,234,212,192,226,197,169, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, + 143,234,212,192,135, 74, 32,139, 77, 36,136, 76, 34,135, 74, 32,135, + 74, 32,135, 74, 32,135, 74, 32,140, 82, 42,218,190,167,227,200,173, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,235,215, + 196,135, 74, 32,135, 74, 32,204,164,133,188,136, 95,188,136, 94,188, + 136, 94,188,136, 94,175,120, 80,144, 86, 46,220,194,172,236,217,199, + 236,217,199,236,217,199,236,217,199,236,217,199,233,214,196,138, 79, + 37,135, 74, 32,209,176,151,218,186,158,205,161,124,205,161,123,205, + 161,124,218,186,158,190,150,120,135, 74, 32,135, 74, 32,135, 74, 32, + 135, 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,168,147,225,210, + 200,144, 89, 49,218,191,169,236,217,200,236,217,200,236,217,200,218, + 191,169,144, 89, 49,225,210,200,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,210, + 200,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,225, + 210,200,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255); + +Const + stdimg_ellipse : Array[0..181] of byte = ( + 66, 77,182, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 10, 0, 0, 0, 4, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,229,255, 0,229,255, 0,229,255, 0,229,255, 0, + 229,255, 0,229,255, 0,229,255, 0,229,255, 0,229,255, 0,229, 0, + 0,255, 0,229, 0, 0, 0, 0, 0, 0,255, 0,229, 0, 0, 0, 0, + 0, 0,255, 0,229, 0, 0, 0, 0, 0, 0,255, 0,229, 0, 0,255, + 0,229, 0, 0, 0, 0, 0, 0,255, 0,229, 0, 0, 0, 0, 0, 0, + 255, 0,229, 0, 0, 0, 0, 0, 0,255, 0,229, 0, 0,255, 0,229, + 255, 0,229,255, 0,229,255, 0,229,255, 0,229,255, 0,229,255, 0, + 229,255, 0,229,255, 0,229,255, 0,229, 0, 0); + +Const + stdimg_dialog_warning_32 : Array[0..3125] of byte = ( + 66, 77, 54, 12, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 32, 0, 0, 0, 32, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 12, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,252,252,252,244,244,244,237,237,237,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,237,237,237,242,242,242,248,248,248,254,254,254,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,239,239, + 222,222,222,198,198,207,190,190,201,186,186,197,186,186,197,186,186, + 197,186,186,197,186,186,197,186,186,197,186,186,197,186,186,197,186, + 186,197,186,186,197,186,186,197,186,186,197,186,186,197,186,186,197, + 186,186,197,186,186,197,186,186,197,186,186,197,186,186,197,190,190, + 201,189,189,200,197,197,206,223,223,223,246,246,246,255,255,255,255, + 255,255,255,255,255,244,244,244,178,178,210, 22, 22,165, 0, 0,159, + 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0, + 159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, + 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, + 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0, + 159, 21, 21,165,173,173,209,250,250,250,255,255,255,255,255,255,243, + 243,243, 39, 39,171, 61, 61,196,112,112,224,117,117,226,116,116,226, + 113,113,225,111,111,225,108,108,224,105,105,223,102,102,223,100,100, + 222, 97, 97,222, 94, 94,221, 92, 92,220, 89, 89,220, 86, 86,219, 83, + 83,219, 81, 81,218, 78, 78,218, 75, 75,217, 72, 72,216, 69, 69,216, + 67, 67,215, 64, 64,215, 62, 62,214, 54, 54,212, 28, 28,188, 20, 20, + 166,246,246,246,255,255,255,255,255,255,253,253,253, 15, 15,166,121, + 121,221, 20, 20,208, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, + 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0, + 204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, + 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, + 0, 0,204, 10, 10,206, 56, 56,207, 2, 2,160,247,247,251,255,255, + 255,255,255,255,255,255,255, 90, 90,194, 89, 89,200, 58, 58,216, 0, + 0,204,163,163,219,210,210,224,210,210,224,211,211,225,212,212,226, + 212,212,226,213,213,227,214,214,228,215,215,229,216,216,230,216,216, + 230,217,217,231,217,217,231,218,218,232,218,218,232,219,219,233,220, + 220,234,221,221,235,222,222,236,193,193,231, 0, 0,204, 27, 27,209, + 44, 44,192, 53, 53,181,255,255,255,255,255,255,255,255,255,255,255, + 255,221,221,242, 25, 25,168,117,117,221, 8, 8,206, 80, 80,211,224, + 224,224,225,225,225,225,225,225,226,226,226,227,227,227,227,227,227, + 228,228,228,229,229,229,230,230,230,230,230,230,231,231,231,232,232, + 232,233,233,233,234,234,234,234,234,234,235,235,235,236,236,236,237, + 237,237,105,105,219, 3, 3,205, 59, 59,211, 14, 14,166,193,193,232, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,109,109, + 201, 85, 85,197, 68, 68,218, 2, 2,204,179,179,219,224,224,224,225, + 225,225,225,225,225,226,226,226,227,227,227,227,227,227,228,228,228, + 60, 60, 60, 55, 55, 55,230,230,230,231,231,231,232,232,232,233,233, + 233,234,234,234,234,234,234,235,235,235,205,205,231, 7, 7,205, 36, + 36,211, 47, 47,188, 70, 70,186,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,234,234,247, 23, 23,169,121,121, + 220, 14, 14,207, 59, 59,209,223,223,223,224,224,224,224,224,224,225, + 225,225,226,226,226,226,226,226,227,227,227, 55, 55, 55, 53, 53, 53, + 230,230,230,230,230,230,231,231,231,232,232,232,233,233,233,234,234, + 234,234,234,234, 82, 82,215, 8, 8,206, 67, 67,210, 10, 10,163,212, + 212,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,129,129,208, 74, 74,190, 81, 81,220, 0, 0, + 204,162,162,218,223,223,223,224,224,224,224,224,224,225,225,225,226, + 226,226,226,226,226,215,215,215,215,215,215,229,229,229,230,230,230, + 230,230,230,231,231,231,232,232,232,233,233,233,186,186,227, 1, 1, + 204, 47, 47,213, 46, 46,185, 96, 96,196,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 244,244,251, 25, 25,169,121,121,218, 23, 23,209, 42, 42,208,221,221, + 223,223,223,223,224,224,224,224,224,224,225,225,225,226,226,226, 37, + 37, 37, 37, 37, 37,228,228,228,229,229,229,229,229,229,230,230,230, + 231,231,231,232,232,232, 59, 59,211, 14, 14,207, 73, 73,209, 11, 11, + 164,228,228,245,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,151,151,216, + 63, 63,185, 94, 94,222, 0, 0,204,141,141,215,223,223,223,223,223, + 223,224,224,224,224,224,224,225,225,225, 27, 27, 27, 27, 27, 27,227, + 227,227,228,228,228,229,229,229,229,229,229,230,230,230,164,164,223, + 0, 0,204, 60, 60,215, 41, 41,179,120,120,205,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,251,251,253, 35, 35,174,116,116,215, + 34, 34,211, 27, 27,206,215,215,221,223,223,223,223,223,223,224,224, + 224,224,224,224, 13, 13, 13, 13, 13, 13,226,226,226,227,227,227,228, + 228,228,229,229,229,226,226,228, 40, 40,209, 24, 24,209, 75, 75,206, + 16, 16,167,241,241,250,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,172,172,224, 49, 49,178,106,106,223, 1, 1,204, + 121,121,213,222,222,222,222,222,222,223,223,223,224,224,224, 3, 3, + 3, 3, 3, 3,225,225,225,226,226,226,227,227,227,228,228,228,140, + 140,218, 1, 1,204, 75, 75,218, 34, 34,174,144,144,213,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254, + 254,255, 49, 49,179,109,109,211, 47, 47,213, 16, 16,206,206,206,220, + 222,222,222,222,222,222,215,215,215, 0, 0, 0, 0, 0, 0,217,217, + 217,225,225,225,226,226,226,218,218,226, 25, 25,207, 36, 36,211, 74, + 74,203, 27, 27,171,249,249,253,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,193,193,232, 36, + 36,173,117,117,224, 4, 4,205,102,102,212,221,221,221,222,222,222, + 204,204,204, 0, 0, 0, 0, 0, 0,206,206,206,225,225,225,225,225, + 225,118,118,216, 4, 4,205, 87, 87,219, 27, 27,170,167,167,222,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255, 69, 69,186,100,100,205, 59, + 59,216, 7, 7,205,195,195,219,221,221,221,193,193,193, 0, 0, 0, + 0, 0, 0,195,195,195,224,224,224,206,206,223, 12, 12,205, 49, 49, + 214, 70, 70,199, 45, 45,178,254,254,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,211,211,238, 25, 25,170,124,124,224, 8, 8,206, 82, + 82,210,221,221,221,218,218,218,207,207,207,207,207,207,220,220,220, + 223,223,223, 97, 97,213, 9, 9,206, 98, 98,219, 17, 17,166,189,189, + 230,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255, 92, 92,194, 89, 89,199, 72, 72,218, 2, 2,204,180,180,217,221, + 221,221,221,221,221,222,222,222,222,222,222,192,192,220, 4, 4,204, + 64, 64,217, 65, 65,194, 68, 68,186,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,226,226,244, 20, 20, + 168,128,128,224, 15, 15,207, 63, 63,209,220,220,220,221,221,221,221, + 221,221,222,222,222, 74, 74,210, 17, 17,207,104,104,219, 11, 11,163, + 210,210,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,114,114,202, 79, 79,193, 85, 85, + 220, 0, 0,204,162,162,215,220,220,220,220,220,220,173,173,217, 1, + 1,204, 80, 80,220, 59, 59,189, 92, 92,194,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,238,238,249, 20, 20,167,128,128,222, 25, 25,209, 44, 44, + 207,218,218,219,220,220,220, 53, 53,208, 28, 28,210,106,106,217, 10, + 10,164,226,226,244,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 137,137,211, 67, 67,187, 99, 99,223, 0, 0,204,143,143,214,152,152, + 214, 1, 1,204, 97, 97,223, 51, 51,184,118,118,204,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,246,246,252, 25, 25,169, + 122,122,218, 36, 36,211, 21, 21,206, 23, 23,205, 42, 42,212,104,104, + 215, 14, 14,165,239,239,249,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,158,158,218, 53, 53,181,113,113,225, + 1, 1,204, 3, 3,205,113,113,225, 41, 41,177,142,142,212,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,252,252,254, 37, 37,174,111,111,213, 66, 66,217, 70, 70,218, + 96, 96,210, 25, 25,170,248,248,252,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,180, + 180,227, 22, 22,168,109,109,218,106,106,218, 20, 20,169,165,165,221, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,140,140,211, 12, + 12,165, 8, 8,163,124,124,206,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,252,252,254,251,251,253,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255); + +Const + stdimg_folder_home_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 198,167,146,138, 78, 37,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, + 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, + 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,169,148,138, 78, 37, + 217,181,149,221,186,154, 98,173,106, 89,163, 97, 74,135, 79,117,122, + 118,121,120,121,126,126,126,118,118,118,103,130,106, 95,165,103, 72, + 146, 79, 83,137, 86,217,181,149,138, 79, 37,135, 74, 32,223,192,162, + 213,172,134,195,229,197,142,200,143,101,160,107,216,226,216,149,147, + 149,167,167,167,134,132,134,202,236,206,104,181,114,132,188,135,172, + 203,171,223,192,162,135, 74, 32,135, 74, 32,226,197,170,215,175,138, + 215,175,138,215,175,138,171,172,172,246,245,246,136,136,136,157,157, + 157,127,127,127,254,254,255,130,127,127,215,175,138,215,175,138,226, + 197,170,135, 74, 32,135, 74, 32,228,202,177,217,179,143,217,179,143, + 217,179,143,170,174,177,252,250,248,130,131,131,115,115,115,126,126, + 126,255,255,255,112,116,124,217,179,143,217,179,143,228,202,177,135, + 74, 32,135, 74, 32,230,205,181,217,179,143,217,179,143, 88,152,197, + 94,150,192,218,222,224,245,243,241,237,238,238,247,244,242,193,201, + 212, 60, 97,147, 56, 92,143,217,179,143,230,205,181,135, 74, 32,135, + 74, 32,231,207,184,217,179,143,217,179,143,103,160,205,100,162,205, + 92,149,191,212,215,217,254,248,243,188,202,213, 69,120,167, 91,139, + 179, 71,112,157,217,179,143,231,207,184,135, 74, 32,135, 74, 32,232, + 210,188,217,179,143,217,179,143,217,179,143, 99,156,203, 94,158,204, + 94,150,192,161,185,202, 79,140,186,106,157,196, 78,125,169,217,179, + 143,217,179,143,232,210,188,135, 74, 32,136, 76, 34,230,209,188,234, + 212,192,234,212,192,234,212,192,234,212,192, 95,154,202,102,163,207, + 93,151,194,111,168,206, 78,132,177,217,179,143,217,179,143,217,179, + 143,234,212,192,135, 74, 32,139, 77, 36,136, 76, 34,135, 74, 32,135, + 74, 32,135, 74, 32,135, 74, 32,140, 82, 42, 84,138,186, 79,134,180, + 77,125,171,217,179,143,217,179,143,217,179,143,217,179,143,235,215, + 196,135, 74, 32,135, 74, 32,204,164,133,188,136, 95,188,136, 94,188, + 136, 94,188,136, 94,175,120, 80,144, 86, 46,220,194,172,236,217,199, + 236,217,199,236,217,199,236,217,199,236,217,199,233,214,196,138, 79, + 37,135, 74, 32,209,176,151,218,186,158,205,161,124,205,161,123,205, + 161,124,218,186,158,190,150,120,135, 74, 32,135, 74, 32,135, 74, 32, + 135, 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,168,147,225,210, + 200,144, 89, 49,218,191,169,236,217,200,236,217,200,236,217,200,218, + 191,169,144, 89, 49,225,210,200,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,210, + 200,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,225, + 210,200,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255); + +Const + stdimg_arrow_down : Array[0..149] of byte = ( + 66, 77,150, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 7, 0, 0, 0, 4, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 96, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0, + 255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0,255, 0, 0, 0, + 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); Const stdimg_dialog_confirmation_32 : Array[0..3125] of byte = ( @@ -739,7 +828,73 @@ Const 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255); Const - stdimg_list_remove_16 : Array[0..821] of byte = ( + stdimg_document : Array[0..1061] of byte = ( + 66, 77, 38, 4, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 18, 0, 0, 0, 18, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 240, 3, 0, 0,235, 10, 0, 0,235, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 98, 98, + 98, 91, 91, 91, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 97, 97, 97, + 255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, + 88, 88, 88, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, + 0,255,255, 0,255, 88, 88, 88,182,193,198,182,193,198,172,189,196, + 163,184,195,154,179,194,145,175,192,136,170,191,127,165,190,118,160, + 189,115,158,188, 48, 48, 48, 90, 90, 90,255, 0,255,255, 0,255, 0, + 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, 88,222,222,222,225, + 237,244,216,232,242,208,228,240,200,222,238,191,218,236,184,214,233, + 176,209,231,167,204,229,120,161,188, 48, 48, 48, 90, 90, 90,255, 0, + 255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, + 88,222,222,222,233,241,247,137,144,148,132,141,147,127,139,146,122, + 136,145,117,133,143,112,130,142,176,209,231,127,163,188, 48, 48, 48, + 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255, + 255, 0,255, 88, 88, 88,222,222,222,242,246,250,234,242,248,226,238, + 245,218,233,242,210,228,240,201,224,238,193,220,236,186,214,233,133, + 166,188, 48, 48, 48, 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, + 0,255,255, 0,255,255, 0,255, 88, 88, 88,222,222,222,251,252,252, + 148,151,152,143,148,151,138,145,149,133,142,148,128,139,146,123,136, + 145,194,219,236,138,168,188, 48, 48, 48, 90, 90, 90,255, 0,255,255, + 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, 88,222, + 222,222,255,255,255,252,253,253,244,248,250,235,243,248,228,238,245, + 220,234,243,212,230,241,202,223,236,144,171,188, 48, 48, 48, 90, 90, + 90,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0, + 255, 88, 88, 88,222,222,222,255,255,255,155,155,155,154,154,154,148, + 151,152,143,148,151,139,145,149,134,143,148,212,226,236,151,174,188, + 48, 48, 48, 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, 0,255, + 255, 0,255,255, 0,255, 88, 88, 88,223,223,223,255,255,255,255,255, + 255,255,255,255,254,254,254,245,248,251,237,244,248,227,237,243,220, + 231,238,151,174,188, 48, 48, 48, 90, 90, 90,255, 0,255,255, 0,255, + 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, 88,222,222,222, + 255,255,255,155,155,155,155,155,155,155,155,155,155,155,155,246,249, + 251,236,240,244,217,224,231,175,182,190, 48, 48, 48, 90, 90, 90,255, + 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, + 88, 88,222,222,222,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,245,245,246,222,224,226,177,183,188,132,137,143, 48, 48, + 48, 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0, + 255,255, 0,255, 88, 88, 88,222,222,222,255,255,255,155,155,155,155, + 155,155,155,155,155,255,255,255,137,137,137,112,112,112,107,107,107, + 66, 66, 66, 48, 48, 48, 96, 96, 96,255, 0,255,255, 0,255, 0, 0, + 255, 0,255,255, 0,255,255, 0,255, 88, 88, 88,222,222,222,255,255, + 255,255,255,255,255,255,255,255,255,255,252,252,252,112,112,112,206, + 206,206,255,255,255,153,153,153, 48, 48, 48,135,135,135,255, 0,255, + 255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, 88, + 222,222,222,255,255,255,255,255,255,255,255,255,255,255,255,234,234, + 234,109,109,109,255,255,255,153,153,153, 88, 88, 88,135,135,135,255, + 0,255,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, + 0,255, 88, 88, 88,222,222,222,222,222,222,222,222,222,222,222,222, + 222,222,222,177,183,188, 88, 88, 88,153,153,153, 88, 88, 88,135,135, + 135,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 0, 0,255, 0, + 255,255, 0,255,255, 0,255, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255, 0, 0); + +Const + stdimg_folder_open_file_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 3, 0, 0,215, 13, 0, 0,215, 13, 0, 0, 0, 0, 0, 0, 0, @@ -749,697 +904,245 @@ Const 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,182,132, 93,164,101, 52,164,101, 52, - 164,101, 52,164,101, 52,164,101, 52,164,101, 52,164,101, 52,164,101, - 52,164,101, 52,164,101, 52,182,132, 93,255,255,255,255,255,255,255, - 255,255,255,255,255,164,101, 52,229,204,180,219,183,149,219,182,148, - 218,180,146,218,179,144,217,173,134,216,170,131,215,168,127,215,166, - 125,224,190,159,164,101, 52,255,255,255,255,255,255,255,255,255,255, - 255,255,164,101, 52,232,211,192,231,209,187,231,209,188,230,206,183, - 230,206,183,230,206,183,230,206,183,230,205,182,230,204,181,230,204, - 182,164,101, 52,255,255,255,255,255,255,255,255,255,255,255,255,182, - 132, 93,164,101, 52,164,101, 52,164,101, 52,164,101, 52,164,101, 52, - 164,101, 52,164,101, 52,164,101, 52,164,101, 52,164,101, 52,182,132, - 93,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 165,129,103,139, 82, 41,139, 82, 41,157,108, 74,157,108, 74,157,108, + 74,157,108, 74,157,108, 74,157,108, 74,157,108, 74,157,108, 74,157, + 108, 74,139, 82, 41,145,110, 84,255,255,255,255,255,255,139, 82, 41, + 209,165,123,210,165,124,210,165,124,210,165,124,210,165,124,210,165, + 124,210,165,124,210,165,124,210,165,124,210,165,124,210,165,124,209, + 165,123,139, 82, 41,255,255,255,255,255,255,157,104, 63,208,161,116, + 207,159,114,207,159,114,207,159,114,207,159,114,207,159,114,207,159, + 114,207,159,114,207,159,114,207,159,114,207,159,114,208,161,116,139, + 82, 41,255,255,255,139, 82, 41,196,151,112,208,162,119,207,160,117, + 207,160,117,207,160,117,207,160,117,207,160,117,207,160,117,207,160, + 117,207,160,117,207,160,117,207,160,117,208,162,119,196,151,112,139, + 82, 41,139, 82, 41,206,164,127,210,165,123,209,164,122,209,164,122, + 209,164,122,209,164,122,209,164,122,209,164,122,209,164,122,209,164, + 122,209,164,122,209,164,122,210,166,124,212,169,129,139, 82, 41,139, + 82, 41,215,180,148,220,186,153,220,186,153,220,186,153,220,185,152, + 216,179,143,212,169,130,211,168,127,211,168,127,211,168,127,211,168, + 127,211,168,127,212,168,128,209,169,133,139, 82, 41,139, 82, 41,139, + 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41, + 210,173,142,218,180,145,217,179,145,217,179,145,217,179,145,217,179, + 145,217,180,145,217,183,152,139, 82, 41,255,255,255,139, 82, 41,127, + 120,111,253,253,253,248,249,249,243,241,240,205,137, 89,139, 82, 41, + 139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, + 41,139, 82, 41,139, 82, 41,255,255,255,139, 82, 41,142,136,127,242, + 242,242,241,242,241,241,241,241,205,137, 89,255,247,240,253,231,214, + 253,230,212,252,228,208,251,227,203,254,243,232,205,136, 88,139, 82, + 41,255,255,255,255,255,255,139, 82, 41,177,154,132,151,138,124,150, + 137,123,148,136,121,205,137, 89,255,247,242, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92,253,242,231,205,137, 89,139, 82, 41,255,255, + 255,255,255,255,139, 82, 41,218,183,153,212,172,137,212,172,137,213, + 174,140,205,136, 88,254,247,241,252,228,209,251,226,204,249,221,196, + 247,218,192,252,242,233,205,137, 89,139, 82, 41,255,255,255,255,255, + 255,157,103, 62,197,159,132,213,181,155,213,181,155,211,179,152,204, + 135, 87,255,247,241, 93, 93, 93, 92, 92, 92, 92, 92, 92,254,249,243, + 255,247,240,205,137, 89,255,255,255,255,255,255,255,255,255,255,255, + 255,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,205,137, 89,255, + 247,240,255,247,240,255,247,240,255,247,240,255,247,240,255,247,240, + 205,137, 89,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,205,137, 89,205,137, 89,205, + 137, 89,205,137, 89,205,137, 89,205,137, 89,205,137, 89,205,137, 89, 255,255,255,255,255,255); Const - stdimg_arrow_right : Array[0..89] of byte = ( - 66, 77, 90, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 40, 0, 0, - 0, 4, 0, 0, 0, 7, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 28, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 2, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0,255,255,255, 0,112, 0, 0, 0, 48, 0, - 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 48, 0, 0, - 0,112, 0, 0, 0); - -Const - stdimg_choice_yes_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255, 12,164, 60, 17,171, 71, 13,173, 73,104,175, - 120,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 87,183,107, 78,224,155, 92,234,170, 92,234,171, 35,192,104, 87,167, - 106,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 32,183, 89, - 102,255,205,104,255,201, 85,255,195, 73,252,184, 24,199,107, 85,166, - 102,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,157,207,165, 22,223,131, 47,255,181, - 45,255,174, 30,255,170, 3,255,160, 17,250,157, 12,190, 93, 68,158, - 86,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255, 68,173, 91, 0,248,147, 1,254,156, 10,254,160, - 18,251,159, 38,250,165, 49,242,160, 70,234,157, 21,183, 87, 74,169, - 94,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255, 7,173, 65, 7,243,144, 45,243,160, 72,243,171,105,199,139, - 96,231,164,112,241,183,110,233,172,102,224,157, 28,169, 74, 57,157, - 75,255, 0,255,255, 0,255,255, 0,255,255, 0,255,148,199,148, 18, - 202,101, 79,235,162,102,241,178, 85,205,129,255, 0,255,172,211,180, - 89,192,126,129,232,178,130,225,170,129,215,157, 45,168, 78, 63,165, - 77,255, 0,255,255, 0,255,255, 0,255,127,196,134, 86,221,149,112, - 231,171,111,233,173,152,207,158,255, 0,255,255, 0,255,255, 0,255, - 101,183,121,151,227,181,150,221,173,157,217,170, 60,168, 84, 44,152, - 56,255, 0,255,255, 0,255,255, 0,255,138,190,142, 97,180,115, 81, - 180,107,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 109,181,120,173,225,187,170,219,179,181,219,181, 84,174,101, 42,147, - 51,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 121,181,123,195,228,198,191,223,191,206,230,203,110,184,122,115,185, - 121,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 126,181,126,218,237,218,228,242,228,169,210,169,173,204,172,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 115,168,114,139,187,139,195,215,194,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255); + stdimg_arrow_left : Array[0..137] of byte = ( + 66, 77,138, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 4, 0, 0, 0, 7, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 84, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0, + 255,255, 0,255, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, + 255, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0,255,255, 0,255, 0, + 0, 0); Const - stdimg_checkboxes : Array[0..2601] of byte = ( - 66, 77, 42, 10, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 65, 0, 0, 0, 13, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 244, 9, 0, 0,196, 14, 0, 0,196, 14, 0, 0, 0, 0, 0, 0, 0, + stdimg_dialog_error_32 : Array[0..3125] of byte = ( + 66, 77, 54, 12, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 32, 0, 0, 0, 32, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 12, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,254,254,254,249,249,249,242,242,242,233, + 233,233,225,225,225,219,219,219,213,213,213,208,208,208,204,204,204, + 208,208,208,211,211,211,216,216,216,222,222,222,229,229,229,239,239, + 239,247,247,247,252,252,252,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,245,245,245,231,231, + 231,219,219,219,208,208,208,198,198,198,187,187,187,178,178,178,169, + 169,169,162,162,162,156,156,156,153,153,153,154,154,154,157,157,157, + 162,162,162,170,170,170,179,179,179,189,189,189,199,199,199,209,209, + 209,222,222,222,239,239,239,252,252,252,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,245,245,245,233,233,233,220,220,220,208,208,208,195,195, + 195,183,183,183,159,159,170,102,102,164, 44, 44,169, 20, 20,172, 8, + 8,175, 2, 2,177, 7, 7,174, 19, 19,171, 40, 40,165, 96, 96,158, + 149,149,160,172,172,172,184,184,184,197,197,197,209,209,209,222,222, + 222,235,235,235,252,252,252,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254, + 242,242,242,231,231,231,219,219,219,179,179,204, 60, 60,185, 6, 6, + 179, 16, 18,187, 25, 33,199, 39, 52,207, 49, 65,211, 57, 76,215, 48, + 65,210, 38, 50,203, 24, 32,197, 16, 17,184, 6, 6,178, 59, 59,182, + 171,171,196,209,209,209,221,221,221,232,232,232,244,244,244,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,250,253, + 101,101,208, 10, 10,182, 21, 26,196, 61, 78,218, 54, 70,218, 36, 46, + 211, 25, 30,207, 18, 22,205, 15, 17,203, 18, 22,203, 25, 30,205, 35, + 45,208, 52, 69,213, 55, 75,215, 21, 26,194, 9, 9,181,104,104,206, + 245,245,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,235,235,249, 51, 51,195, 17, 18,191, 59, 74,219, + 51, 64,218, 19, 21,209, 10, 10,206, 10, 10,205, 10, 10,205, 10, 10, + 204, 10, 10,203, 9, 9,203, 9, 9,202, 9, 9,201, 9, 9,200, 19, + 22,203, 47, 62,212, 53, 71,213, 15, 17,187, 54, 54,196,236,236,249, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,239,239,250, 27, + 27,187, 22, 26,198, 66, 82,225, 26, 31,214, 11, 11,210, 11, 11,209, + 11, 11,208, 11, 11,208, 10, 10,207, 10, 10,206, 10, 10,205, 10, 10, + 205, 10, 10,204, 10, 10,204, 9, 9,203, 9, 9,202, 9, 9,202, 24, + 30,206, 59, 78,217, 20, 24,193, 30, 30,188,240,240,250,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,252,252,254, 57, 57,197, 24, 27,202, 64, 78,226, 20, + 22,215, 12, 12,213, 12, 12,212, 12, 12,211, 11, 11,211, 11, 11,210, + 11, 11,209, 11, 11,209, 11, 11,208, 11, 11,207, 10, 10,207, 10, 10, + 206, 10, 10,205, 10, 10,204, 10, 10,204, 10, 10,203, 17, 20,205, 56, + 74,217, 21, 25,194, 60, 60,197,252,252,254,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,120,120, + 216, 19, 20,194, 68, 82,229, 19, 21,218, 13, 13,216, 13, 13,215, 12, + 12,214, 12, 12,214, 12, 12,213, 12, 12,212, 12, 12,211, 11, 11,211, + 11, 11,210, 11, 11,210, 11, 11,209, 11, 11,208, 11, 11,208, 10, 10, + 207, 10, 10,206, 10, 10,205, 10, 10,205, 17, 19,206, 60, 78,219, 18, + 19,191,124,124,217,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,230,230,247, 17, 17,187, 63, 75,228, 28, 31, + 222, 13, 13,219, 13, 13,218, 13, 13,217, 13, 13,216, 13, 13,216, 13, + 13,215, 12, 12,215, 12, 12,214, 12, 12,213, 12, 12,213, 12, 12,212, + 12, 12,211, 11, 11,210, 11, 11,210, 11, 11,209, 11, 11,208, 11, 11, + 208, 11, 11,207, 10, 10,207, 23, 28,210, 53, 69,217, 17, 17,185,232, + 232,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 91, 91,207, 28, 31,208, 53, 61,229, 14, 14,221, 14, 14,221, 14, 14, + 220, 14, 14,220, 14, 14,219, 13, 13,218, 13, 13,218, 13, 13,217, 13, + 13,216, 13, 13,215, 12, 12,215, 12, 12,214, 12, 12,214, 12, 12,213, + 12, 12,212, 12, 12,211, 11, 11,211, 11, 11,210, 11, 11,209, 11, 11, + 209, 11, 11,208, 47, 59,217, 23, 27,200, 94, 94,208,255,255,255,255, + 255,255,255,255,255,255,255,255,240,240,250, 10, 10,183, 70, 82,232, + 29, 30,227, 29, 29,226, 22, 22,224, 14, 14,223, 14, 14,222, 14, 14, + 221, 14, 14,220, 14, 14,220, 14, 14,219, 13, 13,219, 13, 13,218, 13, + 13,217, 13, 13,216, 13, 13,216, 13, 13,215, 12, 12,214, 12, 12,214, + 12, 12,213, 12, 12,213, 12, 12,212, 12, 12,211, 11, 11,210, 18, 21, + 212, 60, 77,222, 9, 10,182,242,242,251,255,255,255,255,255,255,255, + 255,255,166,166,228, 24, 25,197,104,111,238, 84, 84,235, 84, 84,234, + 84, 84,234, 72, 72,232, 51, 51,229, 25, 25,225, 15, 15,223, 14, 14, + 222, 14, 14,221, 14, 14,221, 14, 14,220, 14, 14,219, 13, 13,219, 13, + 13,218, 13, 13,218, 13, 13,217, 13, 13,216, 13, 13,215, 12, 12,215, + 12, 12,214, 12, 12,213, 12, 12,213, 12, 12,212, 58, 72,223, 20, 22, + 193,170,170,229,255,255,255,255,255,255,255,255,255, 78, 78,204, 55, + 58,217,103,107,240, 82, 82,236, 83, 83,236, 83, 83,236, 83, 83,235, + 82, 82,234, 81, 81,234, 58, 58,230, 26, 26,225, 15, 15,224, 15, 15, + 223, 14, 14,223, 14, 14,222, 14, 14,221, 14, 14,220, 14, 14,220, 14, + 14,219, 13, 13,218, 13, 13,218, 13, 13,217, 13, 13,216, 13, 13,216, + 13, 13,215, 12, 12,214, 40, 48,221, 28, 34,205, 82, 82,203,255,255, + 255,255,255,255,255,255,255, 38, 38,193, 88, 94,229, 93, 95,240, 80, + 80,237, 80, 80,237, 80, 80,237,243,243,243,243,243,243,243,243,243, + 243,243,243,243,243,243,241,241,241,239,239,239,239,239,239,239,239, + 239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239, + 239,239,239,239,239,239,239,239, 13, 13,218, 13, 13,217, 23, 23,218, + 51, 56,223, 46, 55,215, 40, 40,192,255,255,255,255,255,255,255,255, + 255, 16, 16,185,109,115,238, 87, 87,240, 79, 79,239, 79, 79,239, 79, + 79,238,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, + 243,243,243,243,243,243,240,240,240,239,239,239,239,239,239,239,239, + 239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239, + 239,239, 23, 23,221, 57, 57,226, 79, 79,229, 87, 89,229, 76, 87,225, + 19, 19,185,255,255,255,255,255,255,255,255,255, 3, 3,180,120,126, + 244, 81, 82,242, 77, 77,241, 77, 77,240, 77, 77,240,243,243,243,243, + 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, + 243,243,243,241,241,241,239,239,239,239,239,239,239,239,239,239,239, + 239,239,239,239,239,239,239,239,239,239,241,241,241, 74, 74,231, 76, + 76,231, 76, 76,230, 82, 84,230, 97,110,233, 5, 5,180,255,255,255, + 255,255,255,255,255,255, 16, 16,185,103,108,239, 84, 85,244, 75, 75, + 243, 75, 75,242, 75, 75,241,243,243,243,243,243,243,243,243,243,243, + 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, + 242,242,242,240,240,240,240,240,240,239,239,239,240,240,240,242,242, + 242,243,243,243,243,243,243, 75, 75,233, 75, 75,232, 75, 75,232, 83, + 85,233, 85, 95,228, 19, 19,186,255,255,255,255,255,255,255,255,255, + 37, 37,193, 82, 86,233, 87, 89,245, 73, 73,244, 73, 73,243, 74, 74, + 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, + 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, + 243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243, + 243, 73, 73,234, 72, 72,233, 73, 73,233, 87, 90,235, 69, 76,223, 40, + 40,193,255,255,255,255,255,255,255,255,255, 77, 77,205, 53, 56,223, + 97, 99,247, 72, 72,246, 71, 71,245, 71, 71,245, 71, 71,244, 71, 71, + 243, 72, 72,243, 72, 72,243, 71, 71,242, 71, 71,241, 71, 71,241, 71, + 71,240, 72, 72,240, 72, 72,240, 71, 71,239, 71, 71,239, 71, 71,238, + 71, 71,237, 71, 71,236, 71, 71,237, 71, 71,236, 71, 71,236, 71, 71, + 235, 71, 71,234, 94, 99,237, 44, 49,214, 81, 81,204,255,255,255,255, + 255,255,255,255,255,165,165,228, 29, 30,203,113,118,250, 71, 71,247, + 71, 71,247, 71, 71,246, 71, 71,246, 70, 70,245, 70, 70,245, 70, 70, + 244, 70, 70,244, 70, 70,243, 70, 70,242, 69, 69,242, 69, 69,242, 69, + 69,241, 69, 69,240, 70, 70,240, 70, 70,239, 69, 69,239, 69, 69,239, + 69, 69,238, 69, 69,237, 69, 69,237, 70, 70,236, 69, 69,236,108,116, + 241, 25, 26,198,170,170,229,255,255,255,255,255,255,255,255,255,240, + 240,250, 10, 10,184,116,121,249, 77, 78,249, 71, 71,249, 71, 71,248, + 71, 71,248, 71, 71,247, 71, 71,246, 71, 71,246, 71, 71,246, 70, 70, + 245, 70, 70,244, 70, 70,244, 70, 70,243, 70, 70,243, 70, 70,242, 69, + 69,242, 69, 69,241, 69, 69,241, 69, 69,240, 69, 69,239, 68, 68,239, + 68, 68,239, 68, 68,239, 74, 75,239,106,115,240, 11, 11,183,241,241, + 251,255,255,255,255,255,255,255,255,255,255,255,255, 89, 89,208, 45, + 46,223,106,109,252, 71, 71,250, 71, 71,250, 71, 71,250, 71, 71,249, + 71, 71,248, 71, 71,248, 71, 71,247, 71, 71,247, 71, 71,246, 71, 71, + 246, 70, 70,245, 70, 70,245, 70, 70,244, 70, 70,243, 70, 70,243, 70, + 70,242, 69, 69,242, 69, 69,242, 69, 69,241, 69, 69,240, 69, 69,240, + 100,107,242, 43, 45,215, 93, 93,209,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,230,230,247, 17, 17,189,111,115,250, 85, + 86,252, 72, 72,252, 71, 71,251, 71, 71,251, 71, 71,250, 71, 71,250, + 71, 71,249, 71, 71,249, 71, 71,248, 71, 71,247, 71, 71,247, 71, 71, + 246, 71, 71,246, 71, 71,246, 70, 70,245, 70, 70,244, 70, 70,244, 70, + 70,243, 70, 70,242, 69, 69,242, 81, 83,242,104,111,241, 18, 18,188, + 232,232,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,120,120,217, 27, 28,206,122,126,254, 79, 79,253, 72, + 72,253, 72, 72,253, 72, 72,252, 71, 71,251, 71, 71,251, 71, 71,250, + 71, 71,250, 71, 71,250, 71, 71,249, 71, 71,248, 71, 71,248, 71, 71, + 247, 71, 71,246, 71, 71,246, 71, 71,246, 70, 70,245, 70, 70,245, 75, + 76,245,117,124,247, 28, 29,202,123,123,217,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,252, + 254, 55, 55,198, 44, 44,218,121,124,254, 79, 80,254, 72, 72,254, 72, + 72,253, 72, 72,253, 72, 72,253, 72, 72,252, 72, 72,252, 71, 71,251, + 71, 71,250, 71, 71,250, 71, 71,250, 71, 71,249, 71, 71,249, 71, 71, + 248, 71, 71,247, 71, 71,247, 78, 79,247,115,122,248, 43, 45,214, 59, + 59,199,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,238,238,250, 28, 28, + 189, 45, 45,216,125,127,254, 86, 88,254, 72, 72,254, 72, 72,254, 72, + 72,254, 72, 72,254, 72, 72,253, 72, 72,253, 72, 72,253, 72, 72,252, + 71, 71,251, 71, 71,251, 71, 71,250, 71, 71,250, 71, 71,250, 86, 87, + 250,120,126,250, 43, 45,213, 29, 29,189,240,240,250,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,234,234,249, 50, 50,196, 30, 30, + 204,115,117,248,111,114,254, 80, 81,254, 72, 72,254, 72, 72,254, 72, + 72,254, 72, 72,254, 72, 72,254, 72, 72,253, 72, 72,253, 72, 72,253, + 72, 72,252, 81, 82,252,109,113,252,111,116,246, 28, 29,201, 52, 52, + 196,235,235,249,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,249,249,253,105,105,212, 10, 10,184, 53, 54, + 218,122,124,251,117,120,254, 99,100,254, 88, 89,254, 82, 82,254, 77, + 78,254, 82, 82,254, 87, 89,254, 98,100,254,115,119,254,119,123,251, + 50, 51,216, 12, 12,185,105,105,212,250,250,253,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255, 0,127,127,127,191,191, - 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 191,191,191,191,191,191,191,191,191,191,191,191,191,191,255,255,255, - 127,127,127,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 191,191,255,255,255,127,127,127,191,191,191,191,191,191,191,191,191, - 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 191,191,191,191,191,191,191,255,255,255,127,127,127,191,191,191,191, - 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 191,191,191,191,191,191,191,191,191,191,191,191,255,255,255,127,127, - 127,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, - 255,255,255, 0,127,127,127, 0, 0, 0,255,255,255,255,255,255,255, + 255,255,255,255,255,255,218,218,244, 74, 74,203, 11, 11,183, 35, 35, + 204, 68, 69,227, 92, 94,239,110,111,246,123,126,252,109,111,246, 91, + 93,238, 67, 68,227, 34, 34,204, 9, 9,183, 77, 77,204,219,219,244, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, - 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255, - 255,255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,191,191,191,255,255,255, 0,127,127,127, 0, - 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,191,191,191,255,255, - 255,127,127,127, 0, 0, 0,255,255,255, 0, 0, 0, 0, 0, 0,255, - 255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,255,255,255, - 191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0, - 127,127,127, 52, 52, 52, 52, 52, 52,127,127,127,127,127,127,127,127, - 127, 52, 52, 52, 52, 52, 52,127,127,127,191,191,191,255,255,255,127, - 127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191, - 191,255,255,255, 0,127,127,127, 0, 0, 0,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,255, - 255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, - 0, 0, 0, 0, 0, 0,255,255,255,191,191,191,255,255,255,127,127, - 127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191, - 255,255,255,127,127,127, 0, 0, 0,127,127,127, 52, 52, 52, 52, 52, - 52, 52, 52, 52,127,127,127, 52, 52, 52, 52, 52, 52, 52, 52, 52,127, - 127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,191,191,191,255,255,255, 0,127,127,127, - 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,191,191,191,255, - 255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, - 255,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, - 0,127,127,127,127,127,127, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52,127,127,127,127,127,127,191,191,191,255,255,255, - 127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191, - 191,191,255,255,255, 0,127,127,127, 0, 0, 0,255,255,255,255,255, + 255,255,255,255,255,255,237,237,250,162,162,227, 75, 75,204, 38, 38, + 193, 17, 17,186, 4, 4,180, 17, 17,186, 38, 38,194, 77, 77,205,164, + 164,228,238,238,250,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0, - 255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0,255,255,255,255,255,255,255,255,255,191,191,191,255,255,255,127, - 127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191, - 191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127, - 127,127, 52, 52, 52, 52, 52, 52, 52, 52, 52,127,127,127,127,127,127, - 127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,191,191,191,255,255,255, 0,127,127, - 127, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,191,191,191, - 255,255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, - 255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, - 0, 0,127,127,127,127,127,127, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52,127,127,127,127,127,127,191,191,191,255,255, - 255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 191,191,191,255,255,255, 0,127,127,127, 0, 0, 0,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, - 0,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,191,191,191,255,255,255, - 127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191, - 191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127, 52, 52, 52, - 52, 52, 52, 52, 52, 52,127,127,127, 52, 52, 52, 52, 52, 52, 52, 52, - 52,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,191,191,191,255,255,255, 0,127, - 127,127, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,191,191, - 191,255,255,255,127,127,127, 0, 0, 0,255,255,255, 0, 0, 0, 0, - 0, 0,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, - 255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, - 0, 0, 0,127,127,127, 52, 52, 52, 52, 52, 52,127,127,127,127,127, - 127,127,127,127, 52, 52, 52, 52, 52, 52,127,127,127,191,191,191,255, - 255,255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,191,191,191,255,255,255, 0,127,127,127, 0, 0, 0,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, - 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,191,191,191,255,255, - 255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,191,191,191,255,255,255, 0, - 127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, - 191,191,255,255,255,127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,191,191,191,255,255,255,127,127,127, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,191,191,191,255,255,255,127,127, - 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,191,191, - 255,255,255,127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,191,191,191,255,255,255, 0,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,255,255,255,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,255, - 255,255,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,255,255,255,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,255,255,255,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,255,255,255, - 0); - -Const - stdimg_arrow_left : Array[0..89] of byte = ( - 66, 77, 90, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 40, 0, 0, - 0, 4, 0, 0, 0, 7, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 28, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 2, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0,255,255,255, 0,224, 0, 0, 0,192, 0, - 0, 0,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,192, 0, 0, - 0,224, 0, 0, 0); - -Const - stdimg_ellipse : Array[0..181] of byte = ( - 66, 77,182, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 10, 0, 0, 0, 4, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,229,255, 0,229,255, 0,229,255, 0,229,255, 0, - 229,255, 0,229,255, 0,229,255, 0,229,255, 0,229,255, 0,229, 0, - 0,255, 0,229, 0, 0, 0, 0, 0, 0,255, 0,229, 0, 0, 0, 0, - 0, 0,255, 0,229, 0, 0, 0, 0, 0, 0,255, 0,229, 0, 0,255, - 0,229, 0, 0, 0, 0, 0, 0,255, 0,229, 0, 0, 0, 0, 0, 0, - 255, 0,229, 0, 0, 0, 0, 0, 0,255, 0,229, 0, 0,255, 0,229, - 255, 0,229,255, 0,229,255, 0,229,255, 0,229,255, 0,229,255, 0, - 229,255, 0,229,255, 0,229,255, 0,229, 0, 0); - -Const - stdimg_refresh_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,197,157,126,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,225,205,189,189,144,108,174,118, 73,166,105, 57,176, - 122, 79,196,156,124,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,164,101, 52,203,167,139,255, 0,255,225,204,188,172,113, - 68,184,134, 93,206,166,132,216,182,151,219,185,153,211,172,138,195, - 149,111,169,109, 63,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 165,104, 56,185,136, 96,180,129, 88,180,128, 86,227,202,180,236,218, - 201,231,209,188,227,201,176,222,190,160,210,171,136,206,165,130,211, - 174,142,169,110, 64,255, 0,255,255, 0,255,255, 0,255,167,105, 58, - 241,228,216,212,178,149,244,233,224,243,232,221,237,220,204,210,173, - 143,179,125, 83,166,104, 56,166,105, 57,166,106, 58,169,109, 61,176, - 120, 76,197,157,125,255, 0,255,255, 0,255,166,104, 57,246,238,230, - 245,236,227,245,237,228,230,210,193,179,126, 84,185,136, 97,255, 0, - 255,255, 0,255,217,191,171,175,117, 74,182,124, 79,167,107, 59,167, - 107, 59,255, 0,255,255, 0,255,165,104, 55,246,238,230,235,215,196, - 234,217,201,164,102, 53,217,191,171,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,173,115, 70,225,196,174,200,158,124,164,101, 52,255, - 0,255,255, 0,255,165,103, 54,245,237,229,246,237,229,245,236,228, - 215,184,157,177,122, 79,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,165,103, 54,255, 0,255,255, - 0,255,166,105, 57,164,102, 53,164,102, 53,165,102, 54,165,103, 54, - 165,103, 55,189,143,108,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,198,158,128,164,101, 52,175,120, 76,178,123, 82,178,123, - 82,178,124, 82,164,101, 52,255, 0,255,255, 0,255,165,103, 54,217, - 189,167,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,187,139,102,209,174,145,246,238,231,242,230,219,246,238, - 230,167,108, 61,255, 0,255,255, 0,255,164,102, 54,168,108, 61,221, - 187,162,174,118, 75,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 221,197,179,164,102, 53,233,215,199,235,216,198,245,236,227,168,109, - 62,255, 0,255,255, 0,255,170,111, 65,171,112, 65,169,109, 61,170, - 112, 66,213,184,162,255, 0,255,255, 0,255,183,134, 95,188,141,103, - 235,219,205,245,235,226,246,238,230,246,238,230,169,109, 62,255, 0, - 255,255, 0,255,202,164,135,192,145,106,197,152,114,168,107, 60,164, - 102, 53,168,108, 60,186,139,101,217,187,161,241,228,216,242,230,219, - 243,232,221,206,168,137,234,216,200,169,110, 63,255, 0,255,255, 0, - 255,255, 0,255,169,111, 65,211,173,140,220,189,157,221,190,161,229, - 203,180,233,211,191,238,221,204,240,226,213,231,210,191,178,124, 82, - 187,141,104,174,117, 73,165,104, 55,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,169,109, 63,193,146,107,211,176,143,223,194,168,222, - 193,168,212,177,147,188,140,102,170,112, 67,224,202,185,255, 0,255, - 219,194,174,164,101, 52,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,200,161,132,178,125, 83,168,108, 61,176,120, 77,190, - 145,110,225,205,189,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 212,182,159,255, 0,255); - -Const - stdimg_arrow_down : Array[0..77] of byte = ( - 66, 77, 78, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 40, 0, 0, - 0, 7, 0, 0, 0, 4, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 2, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0,255,255,255, 0,238, 0, 0, 0,198, 0, - 0, 0,130, 0, 0, 0, 0, 0, 0, 0); - -Const - stdimg_font_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,128,128,128,135,135,135,133, - 133,133,133,133,133,128,128,128,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255, 88, 88, 88,102,102,102,108,108,108, 99, - 99, 99, 83, 83, 83,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255, 81, 81, 81, 84, 84, 84, 81, 81, 81,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255, 60, 77,162, 76, 89,162, 77, 90,161, 74, 87,161, 73, 84, - 156,255, 0,255, 80, 80, 77, 45, 45, 45, 74, 74, 74,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 36, 59,219, 0, 43,255, 0, 47,255, 0, 39,239, 45, 62,197,255, 0, - 255, 65, 65, 63, 7, 7, 7, 60, 60, 60,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 19, 38,213, 0, 32,255, 80, 88,168,255, 0,255,255, 0,255, 55, 55, - 55, 0, 0, 0, 58, 58, 58,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 28, 37,212, - 0, 16,255, 86, 89,166,255, 0,255,255, 0,255, 55, 55, 55, 1, 1, - 1, 58, 58, 58,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255, 27, 28,213, 0, 3,255, - 85, 85,168,255, 0,255,255, 0,255, 55, 55, 55, 0, 0, 0, 58, 58, - 58,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255, 27, 27,213, 0, 0,255, 84, 84,166, - 255, 0,255,255, 0,255, 57, 57, 57, 11, 11, 11, 60, 60, 60,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255, 27, 27,220, 3, 4,166, 62, 62, 88,255, 0,255, - 255, 0,255, 71, 71, 71, 49, 49, 49, 71, 71, 71,255, 0,255,255, 0, - 255,100,100,100,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255, 27, 27,224, 19, 19,138, 52, 52, 32,255, 0,255,255, 0,255, - 78, 78, 78, 93, 93, 93, 76, 76, 76,255, 0,255,255, 0,255, 40, 40, - 40,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 29, - 29,225, 24, 24,153,113,113, 93, 65, 65, 65, 71, 71, 71, 84, 84, 81, - 139,139,138, 75, 75, 75, 74, 74, 74, 66, 66, 66,113,113,113,255, 0, - 255, 78, 78,167, 88, 88,152,255, 0,255,255, 0,255, 48, 48,225, 37, - 38,161,103,103, 98,114,114,111,106,106,103,106,106,115,112,112,115, - 111,111,111,105,105,105,113,113,113,113,113,113,255, 0,255, 83, 83, - 197, 45, 45,204,255, 0,255,255, 0,255, 59, 60,212, 81, 83,247, 72, - 72,146,255, 0,255,255, 0,255, 43, 44,213,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,105,105,181,113,114, - 255, 76, 76,207, 77, 77,191, 97, 98,244,127,128,255, 79, 79,220, 83, - 84,188, 87, 87,223,104,105,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,123,123,178, 80, 80,215, 84, 84, - 223, 80, 80,228, 81, 81,220, 74, 74,218, 79, 79,223, 77, 77,228, 83, - 83,239, 67, 68,231,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255); - -Const - stdimg_radiobuttons : Array[0..2213] of byte = ( - 66, 77,166, 8, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 60, 0, 0, 0, 12, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 112, 8, 0, 0,196, 14, 0, 0,196, 14, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255,255,255,255,255,255,191,191,191,191,191,191,191,191,191, - 191,191,191,255,255,255,255,255,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255,255,255,255,255,255,191,191,191,191,191,191,191, - 191,191,191,191,191,255,255,255,255,255,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255,255,255,255,255,255,191,191,191,191,191, - 191,191,191,191,191,191,191,255,255,255,255,255,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255,255,255,255,255,255,191,191,191, - 191,191,191,191,191,191,191,191,191,255,255,255,255,255,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255,255,255,255,255,255,191, - 191,191,191,191,191,191,191,191,191,191,191,255,255,255,255,255,255, - 255, 0,255,255, 0,255,255, 0,255,127,127,127,191,191,191,191,191, - 191,255,255,255,255,255,255,255,255,255,255,255,255,191,191,191,191, - 191,191,255,255,255,255, 0,255,255, 0,255,127,127,127,191,191,191, - 191,191,191,255,255,255,255,255,255,255,255,255,255,255,255,191,191, - 191,191,191,191,255,255,255,255, 0,255,255, 0,255,127,127,127,191, - 191,191,191,191,191,127,127,127,127,127,127,127,127,127,127,127,127, - 191,191,191,191,191,191,255,255,255,255, 0,255,255, 0,255,127,127, - 127,191,191,191,191,191,191,127,127,127,127,127,127,127,127,127,127, - 127,127,191,191,191,191,191,191,255,255,255,255, 0,255,255, 0,255, - 127,127,127,191,191,191,191,191,191,127,127,127,127,127,127,127,127, - 127,127,127,127,191,191,191,191,191,191,255,255,255,255, 0,255,255, - 0,255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,191,191,191,255,255,255,255, 0, - 255,255, 0,255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,191,191,191,255,255,255, - 255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255, - 255,255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191, - 191,255,255,255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 191,191,191,255,255,255,255, 0,255,127,127,127, 0, 0, 0,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0, - 255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,255,255, - 255,255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, - 0, 0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,191,191,191,255,255,255,127,127, - 127, 0, 0, 0,127,127,127,127,127,127,127,127,127, 0, 0, 0, 0, - 0, 0,127,127,127,127,127,127,127,127,127,191,191,191,255,255,255, - 127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255, - 255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,191,191, - 191,255,255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, - 191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127, - 127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,127, - 127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, - 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, - 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,255,191,191,191,255,255,255,127, - 127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255,255, - 255,127,127,127, 0, 0, 0,127,127,127,127,127,127, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,191,191,191, - 255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191, - 191,191,255,255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,191,191,191,255,255,255,127,127,127, 0, 0, 0,255,255,255,255, - 255,255,255,255,255, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, - 255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0, - 127,127,127,127,127,127,127,127,127, 0, 0, 0, 0, 0, 0,127,127, - 127,127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, - 0, 0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,191,191,191,255,255,255,255, 0, - 255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,191,191,191,255,255,255,255, 0,255, - 255, 0,255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,191,191,191,255,255,255,255, - 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255,255, - 255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191, - 255,255,255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191, - 191,191,255,255,255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, - 0, 0, 0, 0,255,255,255,255, 0,255,255, 0,255,127,127,127, 0, - 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, - 0, 0, 0, 0, 0, 0,255,255,255,255, 0,255,255, 0,255,127,127, - 127, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,127,127,127,127, - 127,127, 0, 0, 0, 0, 0, 0,255,255,255,255, 0,255,255, 0,255, - 127,127,127, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,127,127, - 127,127,127,127, 0, 0, 0, 0, 0, 0,255,255,255,255, 0,255,255, - 0,255,127,127,127, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127, - 127,127,127,127,127,127, 0, 0, 0, 0, 0, 0,255,255,255,255, 0, - 255,255, 0,255,255, 0,255,127,127,127,127,127,127, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,127,127,127,127,127,127, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,127,127,127,127,127,127, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,127,127,127,127, - 127,255, 0,255,255, 0,255,255, 0,255,255, 0,255,127,127,127,127, - 127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,127,127, - 127,127,127,255, 0,255,255, 0,255,255, 0,255,255, 0,255,127,127, - 127,127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, - 127,127,127,127,127,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,127,127,127,127,127,127,127,127,127,127,127, - 127,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,127,127,127,127,127,127,127,127,127, - 127,127,127,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,127,127,127,127,127,127,127, - 127,127,127,127,127,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,127,127,127,127,127, - 127,127,127,127,127,127,127,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,127,127,127, - 127,127,127,127,127,127,127,127,127,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255); - -Const - stdimg_edit : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0,235, 10, 0, 0,235, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 98,146, 94, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98,146, 94, 98,146, 94, - 98,146, 94, 88, 88, 88,220,220,220,255,255,255,255,255,255,255,255, - 255,255,255,255,160,160,160,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255, 0, 0, 0, 98,146, 94, 98,146, 94, 98,146, 94, - 88, 88, 88,220,220,220,160,160,160,160,160,160, 0, 0, 0,160,160, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, - 160,160, 0, 0, 0, 98,146, 94, 98,146, 94, 98,146, 94, 88, 88, 88, - 220,220,220,255,255,255,255,255,255, 88, 88, 88, 48, 48, 48, 0, 0, - 64,195,195,195,220,220,220,255,255,255,255,255,255,255,255,255, 0, - 0, 0, 98,146, 94, 98,146, 94, 98,146, 94, 88, 88, 88,220,220,220, - 255,255,255,255,255,255,255,255,255, 88, 88, 88,168,220,255, 0, 88, - 192, 0, 88,192,195,195,195,220,220,220,255,255,255, 0, 0, 0, 98, - 146, 94, 98,146, 94, 98,146, 94, 88, 88, 88,220,220,220,195,195,195, - 195,195,195,195,195,195,160,160,160,168,220,255,168,220,255,168,220, - 255, 0, 88,192, 0, 88,192,160,160,160, 0, 0, 0, 98,146, 94, 98, - 146, 94, 98,146, 94, 88, 88, 88,220,220,220,255,255,255,255,255,255, - 255,255,255,255,255,255, 88,168,255,168,220,255,168,220,255,168,220, - 255,168,220,255, 0, 0, 64, 0, 0, 0, 98,146, 94, 98,146, 94, 98, - 146, 94, 88, 88, 88,220,220,220,255,255,255,255,255,255,255,255,255, - 255,255,255,160,160,160,168,220,255,168,220,255, 0,128,255, 0,128, - 255, 0, 88,192, 48, 48, 48, 98,146, 94, 98,146, 94, 98,146, 94, 88, - 88, 88,220,220,220,195,195,195,195,195,195,195,195,195,195,195,195, - 195,195,195, 88,168,255,168,220,255, 0,128,255, 0,128,255, 0,128, - 255, 0, 88,192, 48, 48, 48, 98,146, 94, 98,146, 94, 88, 88, 88,220, - 220,220,255,255,255,255,255,255,255,255,255,255,255,255,195,195,195, - 255,255,255, 88,168,255, 88,168,255, 0,128,255, 0,128,255, 0,128, - 255, 0, 88,192, 0, 0, 64, 98,146, 94, 88, 88, 88,220,220,220,255, - 255,255,255,255,255,255,255,255,255,255,255,195,195,195,255,255,255, - 255,255,255, 88,168,255, 88,168,255, 0,128,255, 0,128,255, 0,128, - 255, 0, 88,192, 98,146, 94, 88, 88, 88,220,220,220,195,195,195,195, - 195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, - 195,195,195, 88,168,255, 88,168,255, 0,128,255, 0,128,255, 0,128, - 255, 98,146, 94, 88, 88, 88,220,220,220,255,255,255,255,255,255,255, - 255,255,255,255,255,195,195,195,255,255,255,255,255,255,255,255,255, - 255,255,255, 88,168,255, 88,168,255, 0,128,255, 0,128,255, 98,146, - 94, 88, 88, 88,220,220,220,255,255,255,255,255,255,255,255,255,255, - 255,255,195,195,195,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255, 88,168,255, 88,168,255, 0,128,255, 98,146, 94, 88, 88, - 88,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220, - 220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220, - 88, 88, 88, 88,168,255, 88,168,255, 98,146, 94, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 98,146, 94, 98,146, 94); - -Const - stdimg_menu_quit_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255, 31, 31,163, 31, 31,163, 31, 31,163, 31, 31, - 163, 31, 31,163, 31, 31,163, 31, 31,163, 31, 31,163, 31, 31,163, 31, - 31,163, 31, 31,163, 31, 31,163,255, 0,255,255, 0,255,255, 0,255, - 33, 33,176, 6, 5,193, 0, 0,194, 0, 0,201, 0, 0,206, 0, 0, - 217, 24, 24,228, 26, 26,234, 12, 15,235, 6, 12,236, 26, 36,239, 36, - 48,241, 50, 67,251, 42, 47,189,255, 0,255,255, 0,255, 16, 16,173, - 0, 0,181, 0, 0,190, 0, 0,195,108,108,225,216,216,249,255,255, - 255,255,255,255,227,227,253,133,136,243, 24, 34,233, 31, 43,235, 45, - 60,239, 39, 46,196,255, 0,255,255, 0,255, 16, 16,170, 0, 0,181, - 1, 1,187,142,142,229,255,255,255,223,223,246,144,144,233,139,139, - 235,212,212,246,255,255,255,173,177,248, 32, 44,235, 42, 57,239, 38, - 45,195,255, 0,255,255, 0,255, 18, 18,168, 1, 1,179,105,105,214, - 255,255,255,173,173,233, 10, 10,206, 0, 0,213, 0, 0,221, 2, 2, - 224,149,151,238,255,255,255,147,153,246, 29, 43,237, 37, 44,193,255, - 0,255,255, 0,255, 23, 23,166, 23, 23,185,211,211,242,246,246,252, - 51, 51,207, 30, 30,212, 31, 31,218, 19, 19,222, 0, 0,227, 7, 10, - 227,228,228,250,235,236,254, 41, 53,238, 34, 40,192,255, 0,255,255, - 0,255, 27, 27,164, 51, 51,190,239,239,250,220,220,246, 44, 44,203, - 54, 54,212, 50, 50,217, 54, 54,223, 57, 56,230, 18, 19,230,181,182, - 247,255,255,255, 51, 60,238, 30, 35,190,255, 0,255,255, 0,255, 31, - 31,163, 58, 58,188,227,227,245,239,239,251, 67, 67,206, 61, 61,210, - 155,155,235,158,158,239, 73, 73,227, 74, 74,233,222,222,252,239,240, - 253, 30, 36,234, 28, 31,189,255, 0,255,255, 0,255, 36, 36,162, 65, - 65,188,170,170,222,255,255,255,159,159,229, 74, 74,208,238,238,251, - 244,244,253, 84, 84,224,149,149,239,255,255,255,197,197,244, 14, 16, - 231, 22, 23,187,255, 0,255,255, 0,255, 40, 40,162, 89, 89,193, 97, - 97,194,221,221,238,255,255,255,147,147,224,225,225,247,230,230,249, - 160,160,235,255,255,255,233,233,246,131,131,230, 99, 99,237, 23, 23, - 185,255, 0,255,255, 0,255, 46, 46,163,107,107,195,100,100,195,113, - 113,198,175,175,215,133,133,212,231,231,248,233,233,250,165,165,225, - 208,208,232,135,135,222,123,123,229,141,141,234, 53, 53,186,255, 0, - 255,255, 0,255, 55, 55,165,120,120,195,118,118,196,118,118,200,113, - 113,199,123,123,207,241,241,251,246,246,253,131,131,216,128,128,215, - 137,137,224,143,143,225,150,150,229, 68, 68,186,255, 0,255,255, 0, - 255, 84, 84,167,172,172,222,170,170,219,172,172,222,175,175,225,179, - 179,229,176,176,228,179,179,231,189,189,237,191,191,238,195,195,239, - 197,197,240,209,209,247,163,163,193,255, 0,255,255, 0,255,255, 0, - 255,103,103,175,100,100,172,100,100,171,101,101,172,101,101,172,101, - 101,173,102,102,173,102,102,173,102,102,173,103,103,173,104,104,173, - 104,104,175,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255); - -Const - stdimg_arrow_up : Array[0..77] of byte = ( - 66, 77, 78, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 40, 0, 0, - 0, 7, 0, 0, 0, 4, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 2, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,130, 0, - 0, 0,198, 0, 0, 0,238, 0, 0, 0); - -Const - stdimg_executable_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0,215, 13, 0, 0,215, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, - 54,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218,199,195,195,159, - 157,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,120, 72, 54,218,199,195,188,151,145,204,176,172,221,202, - 200,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54, - 218,199,195,181,142,133,182,144,135,183,145,137,217,197,193,190,154, - 148,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,120, 72, 54,218,199,195,174,136,122, - 175,135,122,176,137,124,193,162,152,216,196,191,188,153,144,181,143, - 133,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,120, 72, 54,218,199,195,201,177,167,200,176,165,187,155,143, - 183,149,136,171,131,116,198,170,161,194,163,153,175,136,123,177,137, - 125,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,120, 72, 54,218, - 199,195,207,185,175,207,186,176,208,187,177,209,187,178,202,178,167, - 187,156,142,205,181,171,209,188,179,173,134,119,171,130,115,172,132, - 117,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,120, 72, 54,218, - 199,195,204,182,171,205,183,172,206,184,173,206,185,174,199,174,162, - 176,140,124,191,162,149,203,179,169,170,130,113,153,111, 86,120, 72, - 54,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, - 199,195,202,180,167,203,180,168,203,181,169,204,182,170,176,142,124, - 180,148,131,177,144,127,153,111, 86,120, 72, 54,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, - 199,195,200,177,163,200,178,164,201,178,165,186,158,141,150,106, 81, - 153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, - 199,195,198,174,159,198,175,160,186,159,141,144,100, 72,120, 72, 54, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, - 199,195,195,171,155,159,122, 95,120, 72, 54,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, - 199,195,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255); + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255); Const stdimg_dialog_information_32 : Array[0..3125] of byte = ( @@ -1629,138 +1332,160 @@ Const 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255); Const - stdimg_link : Array[0..449] of byte = ( - 66, 77,194, 1, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 11, 0, 0, 0, 11, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 140, 1, 0, 0, 18, 11, 0, 0, 18, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128,128,128,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255, 0, 0, 0, 0, 0, 0,128,128,128,255,255,255,255,255,255,255, - 255,255, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255, 0, 0, 0, 0, 0, 0,128,128,128,255,255,255,255,255, - 255, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255, 0, 0, 0, 0, 0, 0,128,128,128,255,255,255, - 255,255,255, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,128,128,128,255, - 255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, - 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,128,128, - 128,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, - 128,128,128,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, - 0, 0,128,128,128,255,255,255,255,255,255,255,255,255, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, - 0, 0, 0, 0,128,128,128,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 0, 0, 0, 0, 0, 0,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128, 0, 0, 0, 0, 0, 0); + stdimg_menu_preferences_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,215,194,180,135, 74, 32,135, 74, 32,135, 74, 32,223,207, + 196,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 135, 74, 32,190,165,146,184,156,134,184,156,134,135, 74, 32,223,207, + 196,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,193, + 196,195,154,158,157,193,196,195,255, 0,255,255, 0,255,135, 74, 32, + 204,187,173,167,145,125,181,149,122,174,139,114,135, 74, 32,223,207, + 196,255, 0,255,255, 0,255,255, 0,255,219,220,220,133,138,136,158, + 161,160,133,138,136,255, 0,255,255, 0,255,135, 74, 32,204,187,173, + 164,141,120,162,138,116,180,149,122,179,147,124,135, 74, 32,255, 0, + 255,255, 0,255,219,220,220,133,138,136,210,211,212,194,195,196,133, + 138,136,255, 0,255,255, 0,255,232,221,213,135, 74, 32,212,200,189, + 164,141,120,164,141,120,190,165,146,135, 74, 32,255, 0,255,219,220, + 220,133,138,136,226,227,228,194,196,198,133,138,136,193,196,195,255, + 0,255,255, 0,255,255, 0,255,243,237,233,135, 74, 32,204,187,173, + 204,187,173,179,147,124,135, 74, 32,193,196,195,133,138,136,211,211, + 212,189,190,191,133,138,136,219,220,220,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,243,237,233,135, 74, 32,135, 74, 32, + 135, 74, 32,133,131,125,170,173,173,200,201,202,189,190,191,133,138, + 136,219,220,220,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 181,183,184,133,138,136,183,184,185,133,138,136,219,220,220,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,219, + 220,220,133,138,136,133,138,136,133,138,136,133,138,136,208,209,210, + 163,164,164,133,138,136,193,196,195,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,219,220,220,133,138,136,243, + 243,243,239,240,240,237,238,238,234,236,236,182,185,186,133,138,136, + 219,220,220,133,138,136,219,220,220,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,133,138,136,245,246,246,169,172,171,133, + 138,136,247,247,247,226,227,229,170,173,173,245,246,246,255, 0,255, + 219,220,220,133,138,136,219,220,220,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,219,220,220,133,138,136,255, 0,255,219,220,220,133, + 138,136,250,250,250,133,138,136,255, 0,255,255, 0,255,255, 0,255, + 219,220,220,133,138,136,135,140,138,179,179,179,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,133,138,136,238, + 240,240,133,138,136,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 133,138,136,240,240,240,133,138,136,179,179,179,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,133,138,136,233,235,236,133,138,136,219, + 220,220,255, 0,255,255, 0,255,255, 0,255,255, 0,255,179,179,179, + 133,138,136,238,239,239,133,138,136,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,219,220,220,133,138,136,219,220,220,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,179,179,179, + 133,138,136,219,220,220,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); Const - stdimg_menu_exit_16 : Array[0..821] of byte = ( + stdimg_folder_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,165,193,214,128,167,197, 99,148,184, 22, 94,147, 29, 99,151, - 153,153,153,113,113,113, 84, 84, 84, 81, 81, 81, 79, 79, 79, 76, 76, - 76, 74, 74, 74, 71, 71, 71, 69, 69, 69, 37,103,157, 50,116,168, 61, - 124,175, 71,132,181, 78,138,186, 62,126,173, 32,101,152,255,255,255, - 255,255,255, 88, 88, 88,162,162,162,162,162,162,163,163,163,164,164, - 164,164,164,164,165,165,165, 47,111,165,120,171,210,120,171,211,115, - 167,209,105,160,205, 64,127,174, 35,103,154,255,255,255,255,255,255, - 92, 92, 92,161,161,161, 60,115, 64,160,161,161,163,163,163,163,163, - 163,164,164,164, 54,116,170,125,175,212, 91,154,201, 84,149,199, 88, - 150,200, 65,128,174, 38,105,157,255,255,255,255,255,255, 96, 96, 96, - 160,160,160, 61,118, 65, 54,113, 57,162,162,162,162,162,162,163,163, - 163, 61,121,176,130,179,215, 98,159,204, 90,154,201, 94,155,202, 67, - 129,175, 44,109,160, 55,130, 62, 52,126, 59, 49,121, 55, 46,117, 52, - 73,145, 80, 70,143, 76, 57,115, 61,161,161,161,162,162,162, 69,126, - 180,136,183,217,103,163,207, 97,158,204, 99,159,204, 69,131,177, 49, - 113,164, 59,135, 66,137,203,146,132,200,141,128,198,136,123,195,131, - 119,193,127, 71,143, 77, 59,116, 63,161,161,161, 76,132,186,141,187, - 219,110,168,209,102,166,209, 95,180,223, 71,133,177, 55,117,169, 62, - 139, 70,143,206,153,125,198,135,120,195,129,115,192,124,116,192,124, - 121,194,129, 73,144, 79, 84,127, 87, 84,137,191,148,191,221,117,173, - 212, 99,184,225, 75,212,255, 66,139,184, 61,122,173, 65,144, 74,148, - 210,159,145,208,154,141,205,150,137,203,146,132,200,141, 81,152, 88, - 65,124, 70,159,159,159, 90,142,196,152,195,224,124,179,215,116,175, - 214, 94,196,237, 75,136,179, 69,127,178, 68,148, 77, 66,145, 75, 63, - 141, 72, 61,137, 69, 93,164,101, 90,160, 97, 69,131, 75,158,158,158, - 158,158,158, 96,146,201,158,199,226,131,184,218,125,180,215,126,179, - 215, 79,137,180, 75,132,183,255,255,255,255,255,255,119,119,119,154, - 154,154, 61,138, 69, 73,138, 79,156,156,156,157,157,157,157,157,157, - 102,150,204,162,203,227,137,189,220,131,185,218,132,185,218, 81,139, - 181, 82,137,188,255,255,255,255,255,255,122,122,122,153,153,153, 82, - 145, 89,153,154,153,155,155,155,156,156,156,156,156,156,108,154,208, - 167,206,229,143,193,223,137,189,220,139,189,220, 83,141,182, 90,142, - 194,255,255,255,255,255,255,125,125,125,153,153,153,153,153,153,154, - 154,154,154,154,154,155,155,155,155,155,155,111,157,211,170,209,231, - 171,209,231,152,199,225,145,194,222, 86,143,183, 96,147,198,255,255, - 255,255,255,255,128,128,128,126,126,126,124,124,124,122,122,122,119, - 119,119,117,117,117,114,114,114,113,158,212,111,158,214,135,178,220, - 171,211,232,169,208,230, 88,144,184,103,151,203,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,132,172,220,109,156,212, - 133,177,218, 90,145,185,109,156,207,255,255,255,255,255,255,255,255, + 198,167,146,138, 78, 37,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, + 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, + 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,169,148,138, 78, 37, + 217,181,149,221,186,154,221,186,154,221,186,154,221,186,154,221,186, + 154,221,186,154,221,186,154,221,186,154,221,186,154,221,186,154,221, + 186,154,221,186,154,217,181,149,138, 79, 37,135, 74, 32,223,192,162, + 213,172,134,213,172,134,213,172,134,213,172,134,213,172,134,213,172, + 134,213,172,134,213,172,134,213,172,134,213,172,134,213,172,134,213, + 172,134,223,192,162,135, 74, 32,135, 74, 32,226,197,170,215,175,138, + 215,175,138,215,175,138,215,175,138,215,175,138,215,175,138,215,175, + 138,215,175,138,215,175,138,215,175,138,215,175,138,215,175,138,226, + 197,170,135, 74, 32,135, 74, 32,228,202,177,217,179,143,217,179,143, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, + 143,217,179,143,217,179,143,217,179,143,217,179,143,228,202,177,135, + 74, 32,135, 74, 32,230,205,181,217,179,143,217,179,143,217,179,143, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, + 143,217,179,143,217,179,143,217,179,143,230,205,181,135, 74, 32,135, + 74, 32,231,207,184,217,179,143,217,179,143,217,179,143,217,179,143, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, + 143,217,179,143,217,179,143,231,207,184,135, 74, 32,135, 74, 32,232, + 210,188,217,179,143,217,179,143,217,179,143,217,179,143,217,179,143, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, + 143,217,179,143,232,210,188,135, 74, 32,136, 76, 34,230,209,188,234, + 212,192,234,212,192,234,212,192,234,212,192,234,212,192,226,197,169, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, + 143,234,212,192,135, 74, 32,139, 77, 36,136, 76, 34,135, 74, 32,135, + 74, 32,135, 74, 32,135, 74, 32,140, 82, 42,218,190,167,227,200,173, + 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,235,215, + 196,135, 74, 32,135, 74, 32,204,164,133,188,136, 95,188,136, 94,188, + 136, 94,188,136, 94,175,120, 80,144, 86, 46,220,194,172,236,217,199, + 236,217,199,236,217,199,236,217,199,236,217,199,233,214,196,138, 79, + 37,135, 74, 32,209,176,151,218,186,158,205,161,124,205,161,123,205, + 161,124,218,186,158,190,150,120,135, 74, 32,135, 74, 32,135, 74, 32, + 135, 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,168,147,225,210, + 200,144, 89, 49,218,191,169,236,217,200,236,217,200,236,217,200,218, + 191,169,144, 89, 49,225,210,200,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,210, + 200,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,225, + 210,200,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,177,202,232, - 108,156,211,112,158,210); + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255); Const - stdimg_menu_save_16 : Array[0..821] of byte = ( + stdimg_edit_delete_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,216,171,142,205,149,112,189,115, 66,183,104, 53,181,104, - 53,180,103, 52,178,102, 52,176,101, 51,174,100, 51,172, 99, 50,170, - 98, 50,169, 97, 50,168, 96, 49,167, 97, 50,171,105, 60,188,134, 97, - 195,125, 79,235,198,173,234,197,173,254,251,248,254,251,248,254,251, - 248,254,251,248,254,251,248,254,251,248,254,251,248,254,251,248,254, - 251,248,254,251,248,200,154,124,199,152,121,173,107, 64,186,108, 56, - 237,202,179,224,162,122,254,250,247, 98,192,136, 98,192,136, 98,192, - 136, 98,192,136, 98,192,136, 98,192,136, 98,192,136, 98,192,136,253, - 249,246,202,141,101,201,155,124,167, 97, 50,187,108, 56,238,204,182, - 225,162,122,254,250,247,191,220,194,191,220,194,191,220,194,191,220, - 194,191,220,194,191,220,194,191,220,194,191,220,194,253,249,246,205, - 144,104,204,158,129,168, 97, 50,187,107, 56,239,206,184,225,162,121, - 254,250,247, 98,192,136, 98,192,136, 98,192,136, 98,192,136, 98,192, - 136, 98,192,136, 98,192,136, 98,192,136,253,249,246,207,147,106,206, - 163,132,170, 97, 50,186,106, 54,239,208,187,226,162,122,254,251,248, - 254,251,248,254,251,248,254,251,248,254,251,248,254,251,248,254,251, - 248,254,251,248,254,251,248,254,251,248,211,150,109,210,167,138,171, - 98, 50,187,106, 54,240,210,190,226,163,122,226,163,122,225,163,122, - 226,163,123,225,163,123,224,161,120,222,159,119,221,159,118,220,157, - 116,217,155,114,216,153,113,214,153,112,213,171,142,173, 99, 51,187, - 106, 54,242,213,194,227,163,122,227,163,122,226,163,123,226,163,123, - 226,164,123,225,162,121,224,161,120,222,160,119,222,158,117,220,157, - 116,218,155,115,217,155,115,218,176,149,175,100, 51,187,106, 54,242, - 216,197,227,164,123,227,163,122,227,164,122,226,164,123,226,163,123, - 225,163,123,225,162,121,223,160,119,222,159,118,221,158,116,219,156, - 114,220,157,116,221,181,154,177,101, 52,187,107, 54,244,217,199,230, - 166,125,200,140,100,201,141,101,201,142,103,203,146,108,203,146,109, - 202,144,105,200,140,101,200,140,100,200,140,100,200,140,100,218,156, - 116,225,186,159,179,102, 52,187,108, 55,244,220,201,231,167,125,249, - 236,225,249,236,225,249,237,227,252,244,238,253,250,247,253,247,243, - 250,237,229,247,231,219,247,229,217,246,229,216,222,160,119,228,190, - 164,180,103, 52,189,110, 58,245,221,204,231,168,126,250,240,232,250, - 240,232,201,141,102,250,240,233,253,248,243,254,250,248,252,244,239, - 249,233,223,247,231,219,247,229,217,224,162,120,231,194,169,182,104, - 53,192,116, 66,246,223,208,232,168,126,252,246,241,252,246,241,200, - 140,100,250,241,233,251,244,238,253,250,247,253,249,246,250,240,232, - 248,232,221,247,230,219,225,163,122,239,213,195,183,106, 54,198,130, - 85,246,223,209,233,170,128,254,250,246,253,250,246,200,140,100,251, - 243,238,251,241,234,252,246,242,254,251,248,252,246,241,249,236,226, - 248,231,219,238,208,186,236,208,189,189,116, 67,214,165,133,246,224, - 209,247,224,209,254,251,248,254,251,247,253,249,246,252,245,240,250, - 240,234,251,242,237,253,249,246,253,250,247,251,241,235,248,233,223, - 236,209,190,205,146,106,226,197,177,225,189,166,217,171,141,201,137, - 94,192,117, 67,189,110, 58,187,108, 55,187,107, 54,187,106, 54,187, - 106, 54,188,108, 57,189,110, 59,187,109, 58,191,116, 68,201,141,101, - 231,206,188,255,255,255); + 0, 0, 0,255,255,255,186,188,188,145,148,147,173,176,175,255,255, + 255,255,255,255,144,148,146,158,161,160,163,166,164,255,255,255,255, + 255,255,219,220,219,151,153,153,189,191,190,255,255,255,255,255,255, + 255,255,255,141,145,144,250,250,250,151,154,153,169,172,171,159,162, + 161,150,154,152,238,239,239,170,174,172,155,158,157,152,155,154,139, + 142,141,255,255,255,172,175,175,255,255,255,255,255,255,255,255,255, + 186,188,188,142,146,145,246,246,246,153,156,155,171,173,172,143,147, + 144,224,225,224,178,180,180,211,213,212,152,155,154,236,236,236,160, + 163,162,212,213,213,255,255,255,255,255,255,255,255,255,255,255,255, + 141,144,143,221,222,221,142,147,144,201,201,201,138,143,140,206,208, + 207,164,166,165,200,200,200,124,128,127,227,228,228,146,149,148,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,117,121,120, + 203,205,204,133,138,135,166,167,166,146,147,147,179,180,179,146,147, + 146,182,183,182,124,128,127,189,190,189,123,126,125,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,106,110,109,205,206,206, + 108,111,111,172,174,173,109,112,111,175,177,176,108,111,110,178,180, + 179,111,115,114,179,180,180,109,113,112,255,255,255,255,255,255,255, + 255,255,165,118, 87,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32, + 135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, + 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,165,118, 87,135, + 74, 32,221,187,156,207,159,114,207,159,114,207,159,114,207,159,114, + 207,159,114,207,159,114,207,159,114,207,159,114,207,159,114,207,159, + 114,207,159,114,207,159,114,221,187,156,135, 74, 32,135, 74, 32,221, + 187,156,221,187,156,221,187,156,221,187,156,221,187,156,221,187,156, + 221,187,156,221,187,156,221,187,156,221,187,156,221,187,156,221,187, + 156,221,187,156,221,187,156,135, 74, 32,135, 74, 32,221,187,156,202, + 138, 88,202,138, 88,202,138, 88,202,138, 88,202,138, 88,202,138, 88, + 202,138, 88,202,138, 88,202,138, 88,202,138, 88,202,138, 88,202,138, + 88,221,187,156,135, 74, 32,135, 74, 32,221,187,156,134, 82, 44,134, + 81, 43,134, 81, 43,134, 81, 43,134, 81, 43,134, 81, 43,134, 82, 44, + 134, 82, 44,134, 82, 44,134, 82, 44,134, 82, 44,134, 82, 44,221,187, + 156,135, 74, 32,135, 74, 32,221,187,156,106, 91, 78,201,201,201,156, + 156,156,156,156,156,156,156,156,155,155,155,155,155,155,155,155,155, + 155,155,155,155,155,155,155,155,155,106, 91, 78,221,187,156,135, 74, + 32,135, 74, 32,221,187,156,119,124,122,217,217,217,189,189,189,189, + 189,189,189,189,189,189,189,189,188,188,188,188,188,188,188,188,188, + 191,191,191,192,192,192,119,124,122,221,187,156,135, 74, 32,195,165, + 144,135, 74, 32,133,138,136,231,231,231,215,215,215,214,214,214,214, + 214,214,214,214,214,214,214,214,213,213,213,213,213,213,218,218,218, + 220,220,220,133,138,136,135, 74, 32,195,165,144,255,255,255,255,255, + 255,133,138,136,241,241,241,235,235,235,235,235,235,235,235,235,234, + 234,234,234,234,234,234,234,234,234,234,234,234,234,234,233,233,233, + 133,138,136,255,255,255,255,255,255,255,255,255,255,255,255,171,174, + 173,133,138,136,133,138,136,133,138,136,133,138,136,133,138,136,133, + 138,136,133,138,136,133,138,136,133,138,136,133,138,136,171,174,173, + 255,255,255,255,255,255); Const stdimg_btn_cancel_16 : Array[0..821] of byte = ( @@ -1815,52 +1540,156 @@ Const 255,255,255,255,255,255); Const - stdimg_folder_up_16 : Array[0..821] of byte = ( + stdimg_edit_paste_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,155,181,197, 18, 80,118, 1, 68,108, 1, 68, + 108, 1, 68,108, 1, 68,108, 1, 68,108, 1, 68,108, 1, 68,108, 1, + 68,108, 1, 68,108, 1, 68,108, 19, 80,117,162,186,201,255, 0,255, + 255, 0,255, 13, 76,115, 35,127,186, 59,125,167,100,111,115,104,108, + 106,104,108,106,104,108,106,104,108,106,104,108,106, 61,124,163, 61, + 124,163, 61,124,163, 34,123,179, 16, 78,116,255, 0,255,255, 0,255, + 9, 74,114, 38,135,197, 99,109,112,237,238,237,254,254,254,254,254, + 254,254,254,254,238,239,239,253,254,254,100,105,103, 39,135,197, 39, + 135,197, 39,135,197, 3, 68,108,255, 0,255,255, 0,255, 9, 74,114, + 38,135,197,100,104,102,255,255,255,228,231,231,213,216,216,190,194, + 193,180,183,183,255,255,255,255,255,255,100,105,103, 39,135,197, 40, + 134,194, 3, 68,108,255, 0,255,255, 0,255, 9, 74,114, 38,135,197, + 100,104,102,255,255,255,231,233,233,229,231,231,214,217,217,182,185, + 185,255,255,255,255,255,255,255,255,255,100,105,103, 40,134,194, 3, + 68,108,255, 0,255,255, 0,255, 9, 75,114, 38,135,197,100,104,102, + 255,255,255,234,236,236,232,234,234,230,232,232,203,206,205,182,186, + 185,181,185,184,255,255,255,100,105,103, 40,134,194, 3, 68,108,255, + 0,255,255, 0,255, 9, 75,114, 38,135,197,100,104,102,255,255,255, + 237,238,238,235,236,236,233,235,235,231,233,233,216,218,218,202,205, + 204,255,255,255,100,105,103, 40,134,194, 3, 68,108,255, 0,255,255, + 0,255, 9, 75,114, 38,135,197,100,104,102,255,255,255,239,240,240, + 238,239,239,236,237,237,234,235,235,232,234,234,217,219,219,255,255, + 255,100,105,103, 40,134,194, 3, 68,108,255, 0,255,255, 0,255, 9, + 75,114, 38,135,197,100,104,102,255,255,255,239,240,240,181,181,179, + 181,181,179,180,180,178,178,178,177,232,234,234,255,255,255,100,105, + 103, 40,134,194, 3, 68,108,255, 0,255,255, 0,255, 9, 75,115, 38, + 135,197,100,104,102,255,255,255,239,240,240,239,240,240,239,240,240, + 239,240,240,237,239,239,235,237,237,255,255,255,100,105,103, 40,134, + 194, 3, 68,108,255, 0,255,255, 0,255, 9, 75,115, 38,135,197,100, + 104,102,255,255,255,239,240,240,181,181,179,181,181,179,181,181,179, + 181,181,179,238,239,239,255,255,255,100,105,103, 40,134,194, 3, 68, + 108,255, 0,255,255, 0,255, 9, 75,115, 39,136,198,100,104,102,255, + 255,255,239,240,240,239,240,240,239,240,240,239,240,240,239,240,240, + 239,240,240,255,255,255,100,105,103, 40,134,194, 3, 68,108,255, 0, + 255,255, 0,255, 9, 75,115, 39,136,198,100,111,113,241,241,241,224, + 224,224,187,187,187,187,187,187,187,187,187,187,187,187,224,224,224, + 242,242,242,100,109,110, 39,135,197, 3, 68,108,255, 0,255,255, 0, + 255, 13, 77,116, 36,132,192, 62,126,164,100,109,112, 94, 94, 94,124, + 127,127,125,128,128,125,128,128,123,126,126, 94, 94, 94,100,108,110, + 64,124,161, 35,127,185, 16, 78,117,255, 0,255,255, 0,255,155,182, + 197, 18, 80,119, 1, 68,108, 3, 68,107, 91, 92, 92,137,149,149,138, + 151,151,138,151,151,137,149,149, 91, 92, 92, 3, 68,107, 1, 68,108, + 19, 81,118,162,186,201,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,137,138,138, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92,137,138,138,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); + +Const + stdimg_help_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,192,161,139,164,117, 85,142, 85, 45,142, 85, 45,165,119, 87,193, + 161,139,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,198,169,149,147, 91, 53,203,175, + 155,229,214,203,248,244,241,249,245,242,232,219,209,211,186,167,149, + 94, 56,199,171,151,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,163,116, 84,175,134,105,243,237,233,221,201,186,199,165, + 139,187,145,113,193,153,121,213,183,159,233,218,205,248,243,239,183, + 145,117,166,120, 88,255, 0,255,255, 0,255,255, 0,255,199,170,150, + 174,133,105,243,238,233,183,143,114,165,114, 76,179,135,101,255,255, + 255,255,255,255,193,151,116,197,155,120,215,185,160,249,245,241,180, + 140,112,199,171,151,255, 0,255,255, 0,255,146, 91, 52,242,235,230, + 177,135,105,157,103, 64,163,111, 73,178,132, 98,255,255,255,255,255, + 255,189,146,111,193,150,114,197,155,120,214,183,157,247,241,237,147, + 93, 54,255, 0,255,192,161,139,195,166,145,211,188,173,148, 92, 51, + 154,100, 60,161,108, 69,169,120, 82,200,168,143,204,173,148,183,137, + 101,187,143,107,191,147,112,193,150,115,231,215,201,207,181,161,193, + 161,139,162,115, 83,221,204,192,175,134,106,145, 88, 47,151, 96, 56, + 157,103, 64,167,118, 81,228,212,200,229,214,202,180,134, 98,182,135, + 99,185,139,103,186,142,106,209,178,155,230,215,204,165,118, 86,141, + 83, 43,245,240,237,148, 94, 56,142, 83, 42,148, 91, 51,153, 98, 58, + 159,105, 66,243,237,232,255,255,255,208,181,160,176,127, 90,178,131, + 94,180,133, 96,189,148,117,248,243,240,142, 84, 45,141, 83, 43,245, + 240,237,147, 92, 54,138, 79, 37,144, 86, 45,149, 93, 52,154, 99, 59, + 181,139,109,252,251,249,254,254,254,193,157,130,172,122, 84,173,124, + 86,183,141,108,247,243,239,142, 84, 44,162,115, 83,221,204,192,172, + 130,101,135, 74, 32,139, 80, 39,144, 86, 45,149, 92, 52,153, 98, 58, + 194,161,137,255,255,255,243,236,232,165,114, 75,166,115, 77,195,161, + 134,225,210,198,164,117, 85,192,161,139,195,165,144,208,185,169,135, + 74, 32,135, 74, 32,159,110, 75,160,111, 77,148, 91, 50,168,122, 89, + 255,255,255,253,252,251,161,109, 70,159,106, 67,218,198,183,198,170, + 149,192,161,139,255, 0,255,146, 92, 53,241,234,229,165,120, 88,135, + 74, 32,176,136,108,254,253,253,233,222,214,246,242,239,255,255,255, + 220,202,189,152, 96, 56,179,137,107,242,235,230,145, 91, 52,255, 0, + 255,255, 0,255,198,169,149,173,131,103,242,235,231,166,120, 89,156, + 105, 71,222,206,194,247,243,240,241,234,230,208,184,167,160,111, 77, + 173,130,100,243,237,232,171,128, 98,198,169,149,255, 0,255,255, 0, + 255,255, 0,255,163,116, 84,170,127, 97,240,232,227,208,185,169,172, + 130,101,150, 96, 59,150, 96, 59,172,130,101,209,186,170,240,233,228, + 170,128, 98,163,116, 84,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,198,169,149,145, 91, 52,193,162,141,219,201,189,244, + 239,235,244,239,235,219,201,189,193,163,141,145, 90, 51,199,170,150, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,192,161,139,162,115, 83,141, 83, 43,141, + 83, 43,162,115, 83,192,161,139,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); + +Const + stdimg_list_remove_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0,215, 13, 0, 0,215, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 198,167,146,138, 78, 37,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, - 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, - 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,169,148,138, 78, 37, - 217,181,149,221,186,154,221,186,154,221,186,154,221,186,154,221,186, - 154,221,186,154,221,186,154,221,186,154,221,186,154,221,186,154,221, - 186,154,221,186,154,217,181,149,138, 79, 37,135, 74, 32,223,192,162, - 213,172,134,213,172,134,213,172,134,213,172,134,213,172,134,213,172, - 134,213,172,134,213,172,134,213,172,134,213,172,134,213,172,134,213, - 172,134,223,192,162,135, 74, 32,135, 74, 32,226,197,170,215,175,138, - 215,175,138,215,175,138,143, 85, 42,143, 85, 42,143, 85, 42,143, 85, - 42,143, 85, 42,143, 85, 42,215,175,138,215,175,138,215,175,138,226, - 197,170,135, 74, 32,135, 74, 32,228,202,177,217,179,143,217,179,143, - 217,179,143,143, 85, 42,217,179,143,217,179,143,217,179,143,217,179, - 143,217,179,143,217,179,143,217,179,143,217,179,143,228,202,177,135, - 74, 32,135, 74, 32,230,205,181,217,179,143,143, 85, 42,205,164,128, - 143, 85, 42,205,164,128,143, 85, 42,217,179,143,217,179,143,217,179, - 143,217,179,143,217,179,143,217,179,143,230,205,181,135, 74, 32,135, - 74, 32,231,207,184,217,179,143,182,133, 95,143, 85, 42,143, 85, 42, - 143, 85, 42,182,133, 95,217,179,143,217,179,143,217,179,143,217,179, - 143,217,179,143,217,179,143,231,207,184,135, 74, 32,135, 74, 32,232, - 210,188,217,179,143,217,179,143,205,164,128,143, 85, 42,205,164,128, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, - 143,217,179,143,232,210,188,135, 74, 32,136, 76, 34,230,209,188,234, - 212,192,234,212,192,234,212,192,234,212,192,234,212,192,226,197,169, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, - 143,234,212,192,135, 74, 32,139, 77, 36,136, 76, 34,135, 74, 32,135, - 74, 32,135, 74, 32,135, 74, 32,140, 82, 42,218,190,167,227,200,173, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,235,215, - 196,135, 74, 32,135, 74, 32,204,164,133,188,136, 95,188,136, 94,188, - 136, 94,188,136, 94,175,120, 80,144, 86, 46,220,194,172,236,217,199, - 236,217,199,236,217,199,236,217,199,236,217,199,233,214,196,138, 79, - 37,135, 74, 32,209,176,151,218,186,158,205,161,124,205,161,123,205, - 161,124,218,186,158,190,150,120,135, 74, 32,135, 74, 32,135, 74, 32, - 135, 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,168,147,225,210, - 200,144, 89, 49,218,191,169,236,217,200,236,217,200,236,217,200,218, - 191,169,144, 89, 49,225,210,200,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,210, - 200,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,225, - 210,200,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,182,132, 93,164,101, 52,164,101, 52, + 164,101, 52,164,101, 52,164,101, 52,164,101, 52,164,101, 52,164,101, + 52,164,101, 52,164,101, 52,182,132, 93,255,255,255,255,255,255,255, + 255,255,255,255,255,164,101, 52,229,204,180,219,183,149,219,182,148, + 218,180,146,218,179,144,217,173,134,216,170,131,215,168,127,215,166, + 125,224,190,159,164,101, 52,255,255,255,255,255,255,255,255,255,255, + 255,255,164,101, 52,232,211,192,231,209,187,231,209,188,230,206,183, + 230,206,183,230,206,183,230,206,183,230,205,182,230,204,181,230,204, + 182,164,101, 52,255,255,255,255,255,255,255,255,255,255,255,255,182, + 132, 93,164,101, 52,164,101, 52,164,101, 52,164,101, 52,164,101, 52, + 164,101, 52,164,101, 52,164,101, 52,164,101, 52,164,101, 52,182,132, + 93,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, @@ -1919,108 +1748,432 @@ Const 255,255,255,255,255,255); Const - stdimg_folder_16 : Array[0..821] of byte = ( + stdimg_edit_cut_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 0, 0, 0,255,255,255,172,172,226, 37, 37,178, 26, 26,175, 29, 29, + 174,209,209,239,255,255,255,255,255,255,255,255,255,255,255,255,172, + 172,226, 70, 70,190, 27, 27,176, 39, 39,179,209,209,239,255,255,255, + 255,255,255, 49, 49,182, 41, 41,219, 36, 36,209, 31, 31,206, 31, 31, + 177,209,209,239,255,255,255,255,255,255,209,209,239, 29, 29,177, 36, + 36,212, 34, 34,208, 31, 31,206, 39, 39,178,255,255,255,255,255,255, + 19, 19,173, 33, 33,208,255,255,255,117,117,213, 35, 35,211, 52, 52, + 184,255,255,255,255,255,255, 59, 59,187, 37, 37,214,114,114,214,255, + 255,255, 35, 35,210, 22, 22,173,255,255,255,255,255,255, 43, 43,179, + 37, 37,213,134,134,213,255,255,255, 38, 38,208, 13, 13,170,255,255, + 255,255,255,255, 5, 5,169, 38, 39,205,255,255,255,137,137,214, 34, + 34,209, 43, 43,179,255,255,255,255,255,255,172,172,226, 7, 7,168, + 35, 35,209, 73, 73,192, 26, 27,194, 1, 1,166,255,255,255,241,242, + 250, 30, 31,205, 25, 27,193, 74, 74,193, 33, 33,206, 7, 7,167,143, + 143,216,255,255,255,255,255,255,255,255,255,142,142,215, 9, 9,170, + 34, 34,210, 31, 31,206, 16, 17,184, 92, 94,196, 6, 7,169, 26, 26, + 201, 34, 34,209, 33, 33,203, 12, 12,170,171,171,225,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127,210, + 33, 33,175, 6, 6,166, 70, 75,163, 2, 2,166, 25, 26,199, 37, 37, + 178,131,131,211,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,212,214,213, + 132,137,137,195,198,197,175,178,179, 52, 55,160,231,232,232,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 198,167,146,138, 78, 37,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, - 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, - 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,169,148,138, 78, 37, - 217,181,149,221,186,154,221,186,154,221,186,154,221,186,154,221,186, - 154,221,186,154,221,186,154,221,186,154,221,186,154,221,186,154,221, - 186,154,221,186,154,217,181,149,138, 79, 37,135, 74, 32,223,192,162, - 213,172,134,213,172,134,213,172,134,213,172,134,213,172,134,213,172, - 134,213,172,134,213,172,134,213,172,134,213,172,134,213,172,134,213, - 172,134,223,192,162,135, 74, 32,135, 74, 32,226,197,170,215,175,138, - 215,175,138,215,175,138,215,175,138,215,175,138,215,175,138,215,175, - 138,215,175,138,215,175,138,215,175,138,215,175,138,215,175,138,226, - 197,170,135, 74, 32,135, 74, 32,228,202,177,217,179,143,217,179,143, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, - 143,217,179,143,217,179,143,217,179,143,217,179,143,228,202,177,135, - 74, 32,135, 74, 32,230,205,181,217,179,143,217,179,143,217,179,143, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, - 143,217,179,143,217,179,143,217,179,143,230,205,181,135, 74, 32,135, - 74, 32,231,207,184,217,179,143,217,179,143,217,179,143,217,179,143, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, - 143,217,179,143,217,179,143,231,207,184,135, 74, 32,135, 74, 32,232, - 210,188,217,179,143,217,179,143,217,179,143,217,179,143,217,179,143, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, - 143,217,179,143,232,210,188,135, 74, 32,136, 76, 34,230,209,188,234, - 212,192,234,212,192,234,212,192,234,212,192,234,212,192,226,197,169, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,217,179, - 143,234,212,192,135, 74, 32,139, 77, 36,136, 76, 34,135, 74, 32,135, - 74, 32,135, 74, 32,135, 74, 32,140, 82, 42,218,190,167,227,200,173, - 217,179,143,217,179,143,217,179,143,217,179,143,217,179,143,235,215, - 196,135, 74, 32,135, 74, 32,204,164,133,188,136, 95,188,136, 94,188, - 136, 94,188,136, 94,175,120, 80,144, 86, 46,220,194,172,236,217,199, - 236,217,199,236,217,199,236,217,199,236,217,199,233,214,196,138, 79, - 37,135, 74, 32,209,176,151,218,186,158,205,161,124,205,161,123,205, - 161,124,218,186,158,190,150,120,135, 74, 32,135, 74, 32,135, 74, 32, - 135, 74, 32,135, 74, 32,135, 74, 32,138, 78, 37,198,168,147,225,210, - 200,144, 89, 49,218,191,169,236,217,200,236,217,200,236,217,200,218, - 191,169,144, 89, 49,225,210,200,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,210, - 200,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,225, - 210,200,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,181,184,183,184,188,187, + 230,232,231,167,172,170,139,144,142,184,187,186,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,231,232,232,136,141,139,223,225,225,245,246,245, + 151,156,154,165,169,168,140,145,143,231,232,232,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,152,156,154,178,182,181,247,247,247,142,147,145,156,160,159, + 179,182,181,182,187,185,172,175,174,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,228,229,229,136, + 141,139,217,220,219,239,240,239,171,175,173,184,187,186,179,184,182, + 203,206,205,137,142,140,197,199,198,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,144,148,146,176,181,179,246, + 247,247,155,159,157,202,204,203,255,255,255,141,146,144,201,206,204, + 172,176,175,156,160,159,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,136,141,139,208,212,210,239,240,239,179, + 183,181,255,255,255,255,255,255,225,227,226,167,172,170,195,200,198, + 142,147,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,143,148,146,247,247,247,170,173,172,202,204,203,255, + 255,255,255,255,255,255,255,255,152,156,155,208,211,210,169,173,171, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,221,223,222,145,149,148,162,166,165,255,255,255,255,255,255,255, + 255,255,255,255,255,185,187,186,148,152,150,255,255,255,255,255,255, 255,255,255,255,255,255); Const - stdimg_folder_open_file_16 : Array[0..821] of byte = ( + stdimg_menu_save_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,216,171,142,205,149,112,189,115, 66,183,104, 53,181,104, + 53,180,103, 52,178,102, 52,176,101, 51,174,100, 51,172, 99, 50,170, + 98, 50,169, 97, 50,168, 96, 49,167, 97, 50,171,105, 60,188,134, 97, + 195,125, 79,235,198,173,234,197,173,254,251,248,254,251,248,254,251, + 248,254,251,248,254,251,248,254,251,248,254,251,248,254,251,248,254, + 251,248,254,251,248,200,154,124,199,152,121,173,107, 64,186,108, 56, + 237,202,179,224,162,122,254,250,247, 98,192,136, 98,192,136, 98,192, + 136, 98,192,136, 98,192,136, 98,192,136, 98,192,136, 98,192,136,253, + 249,246,202,141,101,201,155,124,167, 97, 50,187,108, 56,238,204,182, + 225,162,122,254,250,247,191,220,194,191,220,194,191,220,194,191,220, + 194,191,220,194,191,220,194,191,220,194,191,220,194,253,249,246,205, + 144,104,204,158,129,168, 97, 50,187,107, 56,239,206,184,225,162,121, + 254,250,247, 98,192,136, 98,192,136, 98,192,136, 98,192,136, 98,192, + 136, 98,192,136, 98,192,136, 98,192,136,253,249,246,207,147,106,206, + 163,132,170, 97, 50,186,106, 54,239,208,187,226,162,122,254,251,248, + 254,251,248,254,251,248,254,251,248,254,251,248,254,251,248,254,251, + 248,254,251,248,254,251,248,254,251,248,211,150,109,210,167,138,171, + 98, 50,187,106, 54,240,210,190,226,163,122,226,163,122,225,163,122, + 226,163,123,225,163,123,224,161,120,222,159,119,221,159,118,220,157, + 116,217,155,114,216,153,113,214,153,112,213,171,142,173, 99, 51,187, + 106, 54,242,213,194,227,163,122,227,163,122,226,163,123,226,163,123, + 226,164,123,225,162,121,224,161,120,222,160,119,222,158,117,220,157, + 116,218,155,115,217,155,115,218,176,149,175,100, 51,187,106, 54,242, + 216,197,227,164,123,227,163,122,227,164,122,226,164,123,226,163,123, + 225,163,123,225,162,121,223,160,119,222,159,118,221,158,116,219,156, + 114,220,157,116,221,181,154,177,101, 52,187,107, 54,244,217,199,230, + 166,125,200,140,100,201,141,101,201,142,103,203,146,108,203,146,109, + 202,144,105,200,140,101,200,140,100,200,140,100,200,140,100,218,156, + 116,225,186,159,179,102, 52,187,108, 55,244,220,201,231,167,125,249, + 236,225,249,236,225,249,237,227,252,244,238,253,250,247,253,247,243, + 250,237,229,247,231,219,247,229,217,246,229,216,222,160,119,228,190, + 164,180,103, 52,189,110, 58,245,221,204,231,168,126,250,240,232,250, + 240,232,201,141,102,250,240,233,253,248,243,254,250,248,252,244,239, + 249,233,223,247,231,219,247,229,217,224,162,120,231,194,169,182,104, + 53,192,116, 66,246,223,208,232,168,126,252,246,241,252,246,241,200, + 140,100,250,241,233,251,244,238,253,250,247,253,249,246,250,240,232, + 248,232,221,247,230,219,225,163,122,239,213,195,183,106, 54,198,130, + 85,246,223,209,233,170,128,254,250,246,253,250,246,200,140,100,251, + 243,238,251,241,234,252,246,242,254,251,248,252,246,241,249,236,226, + 248,231,219,238,208,186,236,208,189,189,116, 67,214,165,133,246,224, + 209,247,224,209,254,251,248,254,251,247,253,249,246,252,245,240,250, + 240,234,251,242,237,253,249,246,253,250,247,251,241,235,248,233,223, + 236,209,190,205,146,106,226,197,177,225,189,166,217,171,141,201,137, + 94,192,117, 67,189,110, 58,187,108, 55,187,107, 54,187,106, 54,187, + 106, 54,188,108, 57,189,110, 59,187,109, 58,191,116, 68,201,141,101, + 231,206,188,255,255,255); + +Const + stdimg_arrow_up : Array[0..149] of byte = ( + 66, 77,150, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 7, 0, 0, 0, 4, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 96, 0, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, + 255, 0,255,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255,255, 0,255, 0, 0, 0,255, 0,255,255, 0,255,255, 0,255, 0, + 0, 0,255, 0,255,255, 0,255,255, 0,255, 0, 0, 0); + +Const + stdimg_executable_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 3, 0, 0,215, 13, 0, 0,215, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, + 54,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218,199,195,195,159, + 157,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,120, 72, 54,218,199,195,188,151,145,204,176,172,221,202, + 200,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54, + 218,199,195,181,142,133,182,144,135,183,145,137,217,197,193,190,154, + 148,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,120, 72, 54,218,199,195,174,136,122, + 175,135,122,176,137,124,193,162,152,216,196,191,188,153,144,181,143, + 133,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,120, 72, 54,218,199,195,201,177,167,200,176,165,187,155,143, + 183,149,136,171,131,116,198,170,161,194,163,153,175,136,123,177,137, + 125,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,120, 72, 54,218, + 199,195,207,185,175,207,186,176,208,187,177,209,187,178,202,178,167, + 187,156,142,205,181,171,209,188,179,173,134,119,171,130,115,172,132, + 117,153,111, 86,120, 72, 54,255, 0,255,255, 0,255,120, 72, 54,218, + 199,195,204,182,171,205,183,172,206,184,173,206,185,174,199,174,162, + 176,140,124,191,162,149,203,179,169,170,130,113,153,111, 86,120, 72, + 54,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, + 199,195,202,180,167,203,180,168,203,181,169,204,182,170,176,142,124, + 180,148,131,177,144,127,153,111, 86,120, 72, 54,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, + 199,195,200,177,163,200,178,164,201,178,165,186,158,141,150,106, 81, + 153,111, 86,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, + 199,195,198,174,159,198,175,160,186,159,141,144,100, 72,120, 72, 54, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, + 199,195,195,171,155,159,122, 95,120, 72, 54,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,218, + 199,195,120, 72, 54,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,120, 72, 54,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); + +Const + stdimg_search_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,100,148,186, 34, + 103,157,129,168,198,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,111,156,194, 85,141,188,137,181,221, 24, + 95,151,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,123,164,202,100,151,197,157,193,228,102,153,199, 49,113,165,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,233,207,186, + 219,178,146,211,166,128,208,161,124,210,166,133,174,161,153,117,162, + 204,171,203,232,118,164,206, 64,123,175,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,232,202,176,232,201,174,245,225,205, + 247,229,211,247,229,209,243,221,200,223,186,156,199,168,145,134,174, + 213, 80,135,187,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,241,219,200,237,208,183,248,232,217,245,222,200,243,216,189, + 243,214,187,244,219,194,247,228,210,223,187,157,160,151,149,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,238, + 206,178,247,231,215,246,225,204,244,219,194,244,218,192,243,216,189, + 243,215,187,244,219,194,243,222,201,210,168,135,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,240,206,175,249, + 236,223,245,223,200,245,221,198,244,220,195,244,218,193,243,217,190, + 243,215,189,248,230,211,211,166,128,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,244,211,181,249,237,225,246, + 225,204,245,223,201,245,222,199,244,220,196,244,219,194,244,218,192, + 248,231,214,215,171,135,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,248,219,193,249,235,222,247,231,214,246, + 225,204,245,224,202,245,222,200,245,221,197,246,225,203,245,226,208, + 223,185,153,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,252,234,216,248,226,204,250,238,227,247,231,214,246, + 226,206,246,225,203,246,227,208,249,234,221,236,207,181,236,212,191, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,251,228,206,249,226,205,250,236,222,249,238,226,249, + 237,226,248,233,218,240,213,189,237,208,183,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,252,234,217,250,221,194,246,214,185,244,211,181,243, + 212,184,245,224,205,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); + +Const + stdimg_menu_quit_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255, 31, 31,163, 31, 31,163, 31, 31,163, 31, 31, + 163, 31, 31,163, 31, 31,163, 31, 31,163, 31, 31,163, 31, 31,163, 31, + 31,163, 31, 31,163, 31, 31,163,255, 0,255,255, 0,255,255, 0,255, + 33, 33,176, 6, 5,193, 0, 0,194, 0, 0,201, 0, 0,206, 0, 0, + 217, 24, 24,228, 26, 26,234, 12, 15,235, 6, 12,236, 26, 36,239, 36, + 48,241, 50, 67,251, 42, 47,189,255, 0,255,255, 0,255, 16, 16,173, + 0, 0,181, 0, 0,190, 0, 0,195,108,108,225,216,216,249,255,255, + 255,255,255,255,227,227,253,133,136,243, 24, 34,233, 31, 43,235, 45, + 60,239, 39, 46,196,255, 0,255,255, 0,255, 16, 16,170, 0, 0,181, + 1, 1,187,142,142,229,255,255,255,223,223,246,144,144,233,139,139, + 235,212,212,246,255,255,255,173,177,248, 32, 44,235, 42, 57,239, 38, + 45,195,255, 0,255,255, 0,255, 18, 18,168, 1, 1,179,105,105,214, + 255,255,255,173,173,233, 10, 10,206, 0, 0,213, 0, 0,221, 2, 2, + 224,149,151,238,255,255,255,147,153,246, 29, 43,237, 37, 44,193,255, + 0,255,255, 0,255, 23, 23,166, 23, 23,185,211,211,242,246,246,252, + 51, 51,207, 30, 30,212, 31, 31,218, 19, 19,222, 0, 0,227, 7, 10, + 227,228,228,250,235,236,254, 41, 53,238, 34, 40,192,255, 0,255,255, + 0,255, 27, 27,164, 51, 51,190,239,239,250,220,220,246, 44, 44,203, + 54, 54,212, 50, 50,217, 54, 54,223, 57, 56,230, 18, 19,230,181,182, + 247,255,255,255, 51, 60,238, 30, 35,190,255, 0,255,255, 0,255, 31, + 31,163, 58, 58,188,227,227,245,239,239,251, 67, 67,206, 61, 61,210, + 155,155,235,158,158,239, 73, 73,227, 74, 74,233,222,222,252,239,240, + 253, 30, 36,234, 28, 31,189,255, 0,255,255, 0,255, 36, 36,162, 65, + 65,188,170,170,222,255,255,255,159,159,229, 74, 74,208,238,238,251, + 244,244,253, 84, 84,224,149,149,239,255,255,255,197,197,244, 14, 16, + 231, 22, 23,187,255, 0,255,255, 0,255, 40, 40,162, 89, 89,193, 97, + 97,194,221,221,238,255,255,255,147,147,224,225,225,247,230,230,249, + 160,160,235,255,255,255,233,233,246,131,131,230, 99, 99,237, 23, 23, + 185,255, 0,255,255, 0,255, 46, 46,163,107,107,195,100,100,195,113, + 113,198,175,175,215,133,133,212,231,231,248,233,233,250,165,165,225, + 208,208,232,135,135,222,123,123,229,141,141,234, 53, 53,186,255, 0, + 255,255, 0,255, 55, 55,165,120,120,195,118,118,196,118,118,200,113, + 113,199,123,123,207,241,241,251,246,246,253,131,131,216,128,128,215, + 137,137,224,143,143,225,150,150,229, 68, 68,186,255, 0,255,255, 0, + 255, 84, 84,167,172,172,222,170,170,219,172,172,222,175,175,225,179, + 179,229,176,176,228,179,179,231,189,189,237,191,191,238,195,195,239, + 197,197,240,209,209,247,163,163,193,255, 0,255,255, 0,255,255, 0, + 255,103,103,175,100,100,172,100,100,171,101,101,172,101,101,172,101, + 101,173,102,102,173,102,102,173,102,102,173,103,103,173,104,104,173, + 104,104,175,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); + +Const + stdimg_menu_exit_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,165,193,214,128,167,197, 99,148,184, 22, 94,147, 29, 99,151, + 153,153,153,113,113,113, 84, 84, 84, 81, 81, 81, 79, 79, 79, 76, 76, + 76, 74, 74, 74, 71, 71, 71, 69, 69, 69, 37,103,157, 50,116,168, 61, + 124,175, 71,132,181, 78,138,186, 62,126,173, 32,101,152,255,255,255, + 255,255,255, 88, 88, 88,162,162,162,162,162,162,163,163,163,164,164, + 164,164,164,164,165,165,165, 47,111,165,120,171,210,120,171,211,115, + 167,209,105,160,205, 64,127,174, 35,103,154,255,255,255,255,255,255, + 92, 92, 92,161,161,161, 60,115, 64,160,161,161,163,163,163,163,163, + 163,164,164,164, 54,116,170,125,175,212, 91,154,201, 84,149,199, 88, + 150,200, 65,128,174, 38,105,157,255,255,255,255,255,255, 96, 96, 96, + 160,160,160, 61,118, 65, 54,113, 57,162,162,162,162,162,162,163,163, + 163, 61,121,176,130,179,215, 98,159,204, 90,154,201, 94,155,202, 67, + 129,175, 44,109,160, 55,130, 62, 52,126, 59, 49,121, 55, 46,117, 52, + 73,145, 80, 70,143, 76, 57,115, 61,161,161,161,162,162,162, 69,126, + 180,136,183,217,103,163,207, 97,158,204, 99,159,204, 69,131,177, 49, + 113,164, 59,135, 66,137,203,146,132,200,141,128,198,136,123,195,131, + 119,193,127, 71,143, 77, 59,116, 63,161,161,161, 76,132,186,141,187, + 219,110,168,209,102,166,209, 95,180,223, 71,133,177, 55,117,169, 62, + 139, 70,143,206,153,125,198,135,120,195,129,115,192,124,116,192,124, + 121,194,129, 73,144, 79, 84,127, 87, 84,137,191,148,191,221,117,173, + 212, 99,184,225, 75,212,255, 66,139,184, 61,122,173, 65,144, 74,148, + 210,159,145,208,154,141,205,150,137,203,146,132,200,141, 81,152, 88, + 65,124, 70,159,159,159, 90,142,196,152,195,224,124,179,215,116,175, + 214, 94,196,237, 75,136,179, 69,127,178, 68,148, 77, 66,145, 75, 63, + 141, 72, 61,137, 69, 93,164,101, 90,160, 97, 69,131, 75,158,158,158, + 158,158,158, 96,146,201,158,199,226,131,184,218,125,180,215,126,179, + 215, 79,137,180, 75,132,183,255,255,255,255,255,255,119,119,119,154, + 154,154, 61,138, 69, 73,138, 79,156,156,156,157,157,157,157,157,157, + 102,150,204,162,203,227,137,189,220,131,185,218,132,185,218, 81,139, + 181, 82,137,188,255,255,255,255,255,255,122,122,122,153,153,153, 82, + 145, 89,153,154,153,155,155,155,156,156,156,156,156,156,108,154,208, + 167,206,229,143,193,223,137,189,220,139,189,220, 83,141,182, 90,142, + 194,255,255,255,255,255,255,125,125,125,153,153,153,153,153,153,154, + 154,154,154,154,154,155,155,155,155,155,155,111,157,211,170,209,231, + 171,209,231,152,199,225,145,194,222, 86,143,183, 96,147,198,255,255, + 255,255,255,255,128,128,128,126,126,126,124,124,124,122,122,122,119, + 119,119,117,117,117,114,114,114,113,158,212,111,158,214,135,178,220, + 171,211,232,169,208,230, 88,144,184,103,151,203,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,132,172,220,109,156,212, + 133,177,218, 90,145,185,109,156,207,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 165,129,103,139, 82, 41,139, 82, 41,157,108, 74,157,108, 74,157,108, - 74,157,108, 74,157,108, 74,157,108, 74,157,108, 74,157,108, 74,157, - 108, 74,139, 82, 41,145,110, 84,255,255,255,255,255,255,139, 82, 41, - 209,165,123,210,165,124,210,165,124,210,165,124,210,165,124,210,165, - 124,210,165,124,210,165,124,210,165,124,210,165,124,210,165,124,209, - 165,123,139, 82, 41,255,255,255,255,255,255,157,104, 63,208,161,116, - 207,159,114,207,159,114,207,159,114,207,159,114,207,159,114,207,159, - 114,207,159,114,207,159,114,207,159,114,207,159,114,208,161,116,139, - 82, 41,255,255,255,139, 82, 41,196,151,112,208,162,119,207,160,117, - 207,160,117,207,160,117,207,160,117,207,160,117,207,160,117,207,160, - 117,207,160,117,207,160,117,207,160,117,208,162,119,196,151,112,139, - 82, 41,139, 82, 41,206,164,127,210,165,123,209,164,122,209,164,122, - 209,164,122,209,164,122,209,164,122,209,164,122,209,164,122,209,164, - 122,209,164,122,209,164,122,210,166,124,212,169,129,139, 82, 41,139, - 82, 41,215,180,148,220,186,153,220,186,153,220,186,153,220,185,152, - 216,179,143,212,169,130,211,168,127,211,168,127,211,168,127,211,168, - 127,211,168,127,212,168,128,209,169,133,139, 82, 41,139, 82, 41,139, - 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41, - 210,173,142,218,180,145,217,179,145,217,179,145,217,179,145,217,179, - 145,217,180,145,217,183,152,139, 82, 41,255,255,255,139, 82, 41,127, - 120,111,253,253,253,248,249,249,243,241,240,205,137, 89,139, 82, 41, - 139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, - 41,139, 82, 41,139, 82, 41,255,255,255,139, 82, 41,142,136,127,242, - 242,242,241,242,241,241,241,241,205,137, 89,255,247,240,253,231,214, - 253,230,212,252,228,208,251,227,203,254,243,232,205,136, 88,139, 82, - 41,255,255,255,255,255,255,139, 82, 41,177,154,132,151,138,124,150, - 137,123,148,136,121,205,137, 89,255,247,242, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92,253,242,231,205,137, 89,139, 82, 41,255,255, - 255,255,255,255,139, 82, 41,218,183,153,212,172,137,212,172,137,213, - 174,140,205,136, 88,254,247,241,252,228,209,251,226,204,249,221,196, - 247,218,192,252,242,233,205,137, 89,139, 82, 41,255,255,255,255,255, - 255,157,103, 62,197,159,132,213,181,155,213,181,155,211,179,152,204, - 135, 87,255,247,241, 93, 93, 93, 92, 92, 92, 92, 92, 92,254,249,243, - 255,247,240,205,137, 89,255,255,255,255,255,255,255,255,255,255,255, - 255,139, 82, 41,139, 82, 41,139, 82, 41,139, 82, 41,205,137, 89,255, - 247,240,255,247,240,255,247,240,255,247,240,255,247,240,255,247,240, - 205,137, 89,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,205,137, 89,205,137, 89,205, - 137, 89,205,137, 89,205,137, 89,205,137, 89,205,137, 89,205,137, 89, - 255,255,255,255,255,255); + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,177,202,232, + 108,156,211,112,158,210); + +Const + stdimg_bookmark_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,223,209,197,157,105, 71,135, 74, 32,135, 74, + 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, + 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32, + 255, 0,255,150, 96, 59,168,109, 61,215,169,130,182,134, 96,162,115, + 77,166,122, 85,172,129, 95,177,136,103,181,143,111,185,149,118,189, + 155,126,194,160,133,197,165,139,200,169,144,135, 74, 32,255, 0,255, + 135, 74, 32,188,132, 80,216,169,130,179,130, 90,156,107, 66,147,110, + 75,127,111, 86,166,120, 82,169,124, 87,151,124, 95,150,128,101,179, + 137,103,182,141,108,199,167,142,135, 74, 32,255, 0,255,135, 74, 32, + 188,132, 80,216,169,130,179,130, 90,156,107, 66, 26,104,116, 12,108, + 126, 37,107,116, 68,110,109, 9,103,121, 8,102,120,149,130,106,182, + 141,108,198,165,139,135, 74, 32,255, 0,255,135, 74, 32,188,132, 80, + 216,169,130,179,130, 90,156,107, 66, 23,106,120, 64,207,227, 50,182, + 202, 38,157,176, 72,221,240, 18,114,131,145,129,105,182,141,108,197, + 163,137,135, 74, 32,255, 0,255,135, 74, 32,188,132, 80,216,169,130, + 179,130, 90,156,107, 66, 35,106,115, 52,186,206, 79,233,252, 79,233, + 252, 78,231,250, 3, 99,118,162,133,104,182,141,108,195,161,134,135, + 74, 32,255, 0,255,135, 74, 32,188,132, 80,216,169,130,179,130, 90, + 68,104, 99, 19,118,136, 73,224,242, 79,233,252, 79,233,252, 79,232, + 251, 36,151,170, 33,109,119,169,138,108,194,159,131,135, 74, 32,255, + 0,255,135, 74, 32,188,132, 80,216,169,130,162,127, 93, 3, 98,118, + 60,198,216,113,232,247,194,247,254,215,250,254,135,239,252, 74,216, + 235, 19,121,140,108,122,112,193,157,128,135, 74, 32,255, 0,255,135, + 74, 32,188,132, 80,216,169,130,179,130, 90, 68,104,100, 24,106,119, + 3, 97,119,147,221,232,223,250,253, 10,106,125, 18,106,122, 43,111, + 121,163,137,109,191,155,126,135, 74, 32,255, 0,255,135, 74, 32,188, + 132, 80,216,169,130,179,130, 90,156,107, 66,159,111, 71,111,109, 90, + 47,135,150,122,198,210, 62,112,114,175,133, 98,179,137,103,182,141, + 108,190,153,123,135, 74, 32,255, 0,255,135, 74, 32,188,132, 80,216, + 169,130,179,130, 90,156,107, 66,159,111, 71,162,115, 77, 38,106,115, + 13,102,120,146,123, 95,175,133, 98,179,137,103,182,141,108,189,151, + 120,135, 74, 32,255, 0,255,135, 74, 32,182,128, 81,183,136,102,172, + 124, 92,166,122, 89,167,122, 89,167,123, 89,169,126, 92,170,128, 94, + 174,131, 96,175,133, 98,179,137,103,182,141,108,187,149,118,135, 74, + 32,255, 0,255,135, 74, 32,156,104, 67,153, 98, 60,156,102, 64,153, + 102, 63,159,110, 72,166,119, 84,170,126, 90,172,129, 93,174,131, 96, + 176,135,100,179,137,103,182,141,108,186,146,115,135, 74, 32,255, 0, + 255,135, 74, 32,150, 92, 47,203,188,176,236,233,230,249,246,244,249, + 247,244,250,247,245,250,247,245,250,247,245,250,248,245,250,248,246, + 251,248,246,251,248,246,251,249,247,135, 74, 32,255, 0,255,150, 96, + 59,160,101, 54,213,202,193,210,217,213,214,220,217,218,224,221,222, + 228,225,227,231,229,231,235,233,235,239,237,240,242,241,244,246,245, + 249,250,249,253,253,253,135, 74, 32,255, 0,255,223,209,197,157,105, + 71,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, + 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32, + 135, 74, 32,135, 74, 32); + +Const + stdimg_menu_check_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255, 0, 0, 0, 0, 0, 0, + 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,255, 0,255, + 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255, 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255); Const stdimg_btn_close_16 : Array[0..821] of byte = ( @@ -2075,6 +2228,400 @@ Const 255,255,255,255,255,255); Const + stdimg_bevel : Array[0..1709] of byte = ( + 66, 77,174, 6, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 23, 0, 0, 0, 23, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 120, 6, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255, 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,200,208,212, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0, + 255,128,128,128,200,208,212,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,255,255,255,255, 0,255,255, 0,255, 0, + 0, 0,255, 0,255,128,128,128,255,255,255,200,208,212,200,208,212, + 200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200,208, + 212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200, + 208,212,200,208,212,200,208,212,128,128,128,255,255,255,255, 0,255, + 255, 0,255, 0, 0, 0,255, 0,255,128,128,128,255,255,255,200,208, + 212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200, + 208,212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212, + 200,208,212,200,208,212,200,208,212,200,208,212,128,128,128,255,255, + 255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,128,128,128,255, + 255,255,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212, + 200,208,212,200,208,212,128,128,128,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,200,208,212,128, + 128,128,255,255,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255, + 128,128,128,255,255,255,200,208,212,200,208,212,200,208,212,200,208, + 212,200,208,212,200,208,212,200,208,212,128,128,128,200,208,212,200, + 208,212,200,208,212,200,208,212,200,208,212,200,208,212,255,255,255, + 200,208,212,128,128,128,255,255,255,255, 0,255,255, 0,255, 0, 0, + 0,255, 0,255,128,128,128,255,255,255,200,208,212,200,208,212,200, + 208,212,200,208,212,200,208,212,200,208,212,200,208,212,128,128,128, + 200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200,208, + 212,255,255,255,200,208,212,128,128,128,255,255,255,255, 0,255,255, + 0,255, 0, 0, 0,255, 0,255,128,128,128,255,255,255,200,208,212, + 200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200,208, + 212,128,128,128,200,208,212,200,208,212,200,208,212,200,208,212,200, + 208,212,200,208,212,255,255,255,200,208,212,128,128,128,255,255,255, + 255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,128,128,128,255,255, + 255,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200, + 208,212,200,208,212,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,255,255,255,200,208,212,128,128, + 128,255,255,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,128, + 128,128,255,255,255,200,208,212,200,208,212,200,208,212,200,208,212, + 200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200,208, + 212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200, + 208,212,128,128,128,255,255,255,255, 0,255,255, 0,255, 0, 0, 0, + 255, 0,255,128,128,128,255,255,255,200,208,212,200,208,212,200,208, + 212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200, + 208,212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212, + 200,208,212,200,208,212,128,128,128,255,255,255,255, 0,255,255, 0, + 255, 0, 0, 0,255, 0,255,128,128,128,255,255,255,200,208,212,255, + 255,255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,200,208,212,200,208,212,200,208,212,200,208,212,200,208, + 212,200,208,212,200,208,212,200,208,212,128,128,128,255,255,255,255, + 0,255,255, 0,255, 0, 0, 0,255, 0,255,128,128,128,255,255,255, + 200,208,212,255,255,255,200,208,212,200,208,212,200,208,212,200,208, + 212,200,208,212,128,128,128,200,208,212,200,208,212,200,208,212,200, + 208,212,200,208,212,200,208,212,200,208,212,200,208,212,128,128,128, + 255,255,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,128,128, + 128,255,255,255,200,208,212,255,255,255,200,208,212,200,208,212,200, + 208,212,200,208,212,200,208,212,128,128,128,200,208,212,200,208,212, + 200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200,208, + 212,128,128,128,255,255,255,255, 0,255,255, 0,255, 0, 0, 0,255, + 0,255,128,128,128,255,255,255,200,208,212,255,255,255,200,208,212, + 200,208,212,200,208,212,200,208,212,200,208,212,128,128,128,200,208, + 212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200, + 208,212,200,208,212,128,128,128,255,255,255,255, 0,255,255, 0,255, + 0, 0, 0,255, 0,255,128,128,128,255,255,255,200,208,212,255,255, + 255,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,128, + 128,128,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212, + 200,208,212,200,208,212,200,208,212,128,128,128,255,255,255,255, 0, + 255,255, 0,255, 0, 0, 0,255, 0,255,128,128,128,255,255,255,200, + 208,212,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,128,128,128,200,208,212,200,208,212,200,208,212,200,208, + 212,200,208,212,200,208,212,200,208,212,200,208,212,128,128,128,255, + 255,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,128,128,128, + 255,255,255,200,208,212,200,208,212,200,208,212,200,208,212,200,208, + 212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212,200, + 208,212,200,208,212,200,208,212,200,208,212,200,208,212,200,208,212, + 128,128,128,255,255,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0, + 255,128,128,128,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,200,208,212,255,255,255,255, 0,255,255, 0,255, 0, + 0, 0,255, 0,255,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,200,208,212,255, 0,255, + 255, 0,255, 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255, 0, 0, 0); + +Const + stdimg_choice_no_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255, 98, 98,162,164,164,178,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,152,152,171,101,101,160,255, 0,255,255, 0,255, + 255, 0,255, 48, 48,162, 55, 55,241, 19, 19,202,152,152,172,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,135, + 135,164, 17, 17,205, 48, 48,234, 61, 61,154,255, 0,255,255, 0,255, + 8, 8,224, 72, 72,245, 76, 76,240, 5, 5,200,135,135,163,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,116,116,157, 5, 5,205, 90, + 90,239, 90, 90,244, 9, 9,217,255, 0,255,255, 0,255, 34, 34,254, + 55, 55,255, 89, 89,255, 74, 74,237, 5, 5,199,119,119,156,255, 0, + 255,255, 0,255, 98, 98,152, 8, 8,206, 90, 90,237,115,115,255, 85, + 85,255, 54, 54,253,255, 0,255,255, 0,255, 29, 29,255, 43, 43,255, + 57, 57,255, 86, 86,255, 69, 69,235, 5, 5,196,102,102,148, 85, 85, + 147, 9, 9,203, 84, 84,237,106,106,255, 80, 80,255, 65, 65,255, 52, + 52,255,255, 0,255,255, 0,255,255, 0,255, 30, 30,255, 43, 43,255, + 53, 53,255, 74, 74,255, 55, 55,232, 1, 1,187, 6, 6,192, 68, 68, + 237, 88, 88,255, 71, 71,255, 62, 62,255, 54, 54,249,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255, 31, 31,251, 47, 47,255, + 60, 60,255, 78, 78,255, 49, 49,232, 55, 55,237, 75, 75,255, 56, 56, + 255, 50, 50,255, 55, 55,241,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255, 77, 77,238, 97, 97,255, + 96, 96,255, 96, 96,255, 98, 98,255, 98, 98,255, 91, 91,255, 73, 73, + 227,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255, 43, 43,156, 61, 61,244, 99, 99,255, + 99, 99,255,100,100,255,100,100,255, 54, 54,237, 75, 75,146,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255, 47, 47,123, 0, 0,166, 49, 49,242,107,107,255,106,106,255, + 106,106,255,105,105,255, 33, 33,230, 0, 0,152, 82, 82,127,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 43, 43,115, 0, + 0,164, 55, 55,243,121,121,255,120,120,255,121,121,255,121,121,255, + 120,120,255,116,116,255, 38, 38,229, 0, 0,146, 82, 82,123,255, 0, + 255,255, 0,255,255, 0,255, 45, 45,112, 0, 0,156, 66, 66,242,138, + 138,255,137,137,255,136,136,255,102,102,209,103,103,224,141,141,255, + 136,136,255,132,132,255, 42, 42,227, 0, 0,139, 91, 91,128,255, 0, + 255,255, 0,255, 0, 0,156, 73, 73,242,155,155,255,153,153,255,153, + 153,255,115,115,207,255, 0,255,255, 0,255,110,110,228,158,158,255, + 153,153,255,148,148,255, 47, 47,229, 13, 13,130,255, 0,255,255, 0, + 255, 85, 85,254,174,174,255,169,169,255,168,168,255,119,119,205,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,118,118,228,175,175,255, + 169,169,255,169,169,255, 60, 60,222,255, 0,255,255, 0,255,127,127, + 208,187,187,255,187,187,255,122,122,207,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,126,126,228,200,200,255, + 164,164,255,152,152,199,255, 0,255,255, 0,255,255, 0,255,126,126, + 210,127,127,214,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,121,121,231,154,154,197, + 255, 0,255,255, 0,255); + +Const + stdimg_radiobuttons : Array[0..2213] of byte = ( + 66, 77,166, 8, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 60, 0, 0, 0, 12, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 112, 8, 0, 0,196, 14, 0, 0,196, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255,255,255,255,255,255,191,191,191,191,191,191,191,191,191, + 191,191,191,255,255,255,255,255,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255,255,255,255,255,255,191,191,191,191,191,191,191, + 191,191,191,191,191,255,255,255,255,255,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255,255,255,255,255,255,191,191,191,191,191, + 191,191,191,191,191,191,191,255,255,255,255,255,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255,255,255,255,255,255,191,191,191, + 191,191,191,191,191,191,191,191,191,255,255,255,255,255,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255,255,255,255,255,255,191, + 191,191,191,191,191,191,191,191,191,191,191,255,255,255,255,255,255, + 255, 0,255,255, 0,255,255, 0,255,127,127,127,191,191,191,191,191, + 191,255,255,255,255,255,255,255,255,255,255,255,255,191,191,191,191, + 191,191,255,255,255,255, 0,255,255, 0,255,127,127,127,191,191,191, + 191,191,191,255,255,255,255,255,255,255,255,255,255,255,255,191,191, + 191,191,191,191,255,255,255,255, 0,255,255, 0,255,127,127,127,191, + 191,191,191,191,191,127,127,127,127,127,127,127,127,127,127,127,127, + 191,191,191,191,191,191,255,255,255,255, 0,255,255, 0,255,127,127, + 127,191,191,191,191,191,191,127,127,127,127,127,127,127,127,127,127, + 127,127,191,191,191,191,191,191,255,255,255,255, 0,255,255, 0,255, + 127,127,127,191,191,191,191,191,191,127,127,127,127,127,127,127,127, + 127,127,127,127,191,191,191,191,191,191,255,255,255,255, 0,255,255, + 0,255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,191,191,191,255,255,255,255, 0, + 255,255, 0,255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,191,191,191,255,255,255, + 255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255, + 255,255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191, + 191,255,255,255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 191,191,191,255,255,255,255, 0,255,127,127,127, 0, 0, 0,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0, + 255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,255,255, + 255,255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, + 0, 0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,191,191,191,255,255,255,127,127, + 127, 0, 0, 0,127,127,127,127,127,127,127,127,127, 0, 0, 0, 0, + 0, 0,127,127,127,127,127,127,127,127,127,191,191,191,255,255,255, + 127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255, + 255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,191,191, + 191,255,255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, + 191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127, + 127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,127, + 127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, + 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, + 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,255,255,255,191,191,191,255,255,255,127, + 127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255,255, + 255,127,127,127, 0, 0, 0,127,127,127,127,127,127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,191,191,191, + 255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191, + 191,191,255,255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,191,191,191,255,255,255,127,127,127, 0, 0, 0,255,255,255,255, + 255,255,255,255,255, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, + 255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0, + 127,127,127,127,127,127,127,127,127, 0, 0, 0, 0, 0, 0,127,127, + 127,127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, + 0, 0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,191,191,191,255,255,255,255, 0, + 255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,191,191,191,255,255,255,255, 0,255, + 255, 0,255,127,127,127, 0, 0, 0,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,191,191,191,255,255,255,255, + 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255,255, + 255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191, + 255,255,255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191, + 191,191,255,255,255,255, 0,255,255, 0,255,127,127,127, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0,255,255,255,255, 0,255,255, 0,255,127,127,127, 0, + 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, + 0, 0, 0, 0, 0, 0,255,255,255,255, 0,255,255, 0,255,127,127, + 127, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,127,127,127,127, + 127,127, 0, 0, 0, 0, 0, 0,255,255,255,255, 0,255,255, 0,255, + 127,127,127, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,127,127, + 127,127,127,127, 0, 0, 0, 0, 0, 0,255,255,255,255, 0,255,255, + 0,255,127,127,127, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127, + 127,127,127,127,127,127, 0, 0, 0, 0, 0, 0,255,255,255,255, 0, + 255,255, 0,255,255, 0,255,127,127,127,127,127,127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,127,127,127,127,127,127, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,127,127,127,127,127,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,127,127,127,127,127,127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,127,127,127,127, + 127,255, 0,255,255, 0,255,255, 0,255,255, 0,255,127,127,127,127, + 127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,127,127, + 127,127,127,255, 0,255,255, 0,255,255, 0,255,255, 0,255,127,127, + 127,127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, + 127,127,127,127,127,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,127,127,127,127,127,127,127,127,127,127,127, + 127,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,127,127,127,127,127,127,127,127,127, + 127,127,127,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,127,127,127,127,127,127,127, + 127,127,127,127,127,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,255, 0,255,127,127,127,127,127, + 127,127,127,127,127,127,127,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,127,127,127, + 127,127,127,127,127,127,127,127,127,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255); + +Const + stdimg_refresh_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255, 0,255,197,157,126,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,225,205,189,189,144,108,174,118, 73,166,105, 57,176, + 122, 79,196,156,124,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,164,101, 52,203,167,139,255, 0,255,225,204,188,172,113, + 68,184,134, 93,206,166,132,216,182,151,219,185,153,211,172,138,195, + 149,111,169,109, 63,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 165,104, 56,185,136, 96,180,129, 88,180,128, 86,227,202,180,236,218, + 201,231,209,188,227,201,176,222,190,160,210,171,136,206,165,130,211, + 174,142,169,110, 64,255, 0,255,255, 0,255,255, 0,255,167,105, 58, + 241,228,216,212,178,149,244,233,224,243,232,221,237,220,204,210,173, + 143,179,125, 83,166,104, 56,166,105, 57,166,106, 58,169,109, 61,176, + 120, 76,197,157,125,255, 0,255,255, 0,255,166,104, 57,246,238,230, + 245,236,227,245,237,228,230,210,193,179,126, 84,185,136, 97,255, 0, + 255,255, 0,255,217,191,171,175,117, 74,182,124, 79,167,107, 59,167, + 107, 59,255, 0,255,255, 0,255,165,104, 55,246,238,230,235,215,196, + 234,217,201,164,102, 53,217,191,171,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,173,115, 70,225,196,174,200,158,124,164,101, 52,255, + 0,255,255, 0,255,165,103, 54,245,237,229,246,237,229,245,236,228, + 215,184,157,177,122, 79,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,165,103, 54,255, 0,255,255, + 0,255,166,105, 57,164,102, 53,164,102, 53,165,102, 54,165,103, 54, + 165,103, 55,189,143,108,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, + 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,198,158,128,164,101, 52,175,120, 76,178,123, 82,178,123, + 82,178,124, 82,164,101, 52,255, 0,255,255, 0,255,165,103, 54,217, + 189,167,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,187,139,102,209,174,145,246,238,231,242,230,219,246,238, + 230,167,108, 61,255, 0,255,255, 0,255,164,102, 54,168,108, 61,221, + 187,162,174,118, 75,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 221,197,179,164,102, 53,233,215,199,235,216,198,245,236,227,168,109, + 62,255, 0,255,255, 0,255,170,111, 65,171,112, 65,169,109, 61,170, + 112, 66,213,184,162,255, 0,255,255, 0,255,183,134, 95,188,141,103, + 235,219,205,245,235,226,246,238,230,246,238,230,169,109, 62,255, 0, + 255,255, 0,255,202,164,135,192,145,106,197,152,114,168,107, 60,164, + 102, 53,168,108, 60,186,139,101,217,187,161,241,228,216,242,230,219, + 243,232,221,206,168,137,234,216,200,169,110, 63,255, 0,255,255, 0, + 255,255, 0,255,169,111, 65,211,173,140,220,189,157,221,190,161,229, + 203,180,233,211,191,238,221,204,240,226,213,231,210,191,178,124, 82, + 187,141,104,174,117, 73,165,104, 55,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,169,109, 63,193,146,107,211,176,143,223,194,168,222, + 193,168,212,177,147,188,140,102,170,112, 67,224,202,185,255, 0,255, + 219,194,174,164,101, 52,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,200,161,132,178,125, 83,168,108, 61,176,120, 77,190, + 145,110,225,205,189,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 212,182,159,255, 0,255); + +Const + stdimg_list_add_16 : Array[0..821] of byte = ( + 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 0, 3, 0, 0,215, 13, 0, 0,215, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,182,132, + 93,164,101, 52,164,101, 52,182,132, 93,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,164,101, 52,230,206, + 183,230,206,183,164,101, 52,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,164,101, 52,230,206,183,217,173, + 134,164,101, 52,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,164,101, 52,230,206,183,217,173,134,164,101, + 52,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,182,132, 93,164,101, 52,164,101, 52, + 164,101, 52,164,101, 52,217,173,134,217,173,134,164,101, 52,164,101, + 52,164,101, 52,164,101, 52,182,132, 93,255,255,255,255,255,255,255, + 255,255,255,255,255,164,101, 52,229,204,180,219,183,149,219,182,148, + 218,180,146,218,179,144,217,173,134,216,170,131,215,168,127,215,166, + 125,224,190,159,164,101, 52,255,255,255,255,255,255,255,255,255,255, + 255,255,164,101, 52,232,211,192,231,209,187,231,209,188,230,206,183, + 230,206,183,230,206,183,230,206,183,230,205,182,230,204,181,230,204, + 182,164,101, 52,255,255,255,255,255,255,255,255,255,255,255,255,182, + 132, 93,164,101, 52,164,101, 52,164,101, 52,164,101, 52,230,206,183, + 230,206,183,164,101, 52,164,101, 52,164,101, 52,164,101, 52,182,132, + 93,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,164,101, 52,230,206,183,230,206,183, + 164,101, 52,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,164,101, 52,230,206,183,230,206,183,164,101, 52, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,164,101, 52,230,206,183,230,206,183,164,101, 52,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,182, + 132, 93,164,101, 52,164,101, 52,182,132, 93,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255); + +Const stdimg_edit_copy_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, @@ -2127,297 +2674,58 @@ Const 255,255,255,255,255,255); Const - stdimg_edit_delete_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255,255,255,186,188,188,145,148,147,173,176,175,255,255, - 255,255,255,255,144,148,146,158,161,160,163,166,164,255,255,255,255, - 255,255,219,220,219,151,153,153,189,191,190,255,255,255,255,255,255, - 255,255,255,141,145,144,250,250,250,151,154,153,169,172,171,159,162, - 161,150,154,152,238,239,239,170,174,172,155,158,157,152,155,154,139, - 142,141,255,255,255,172,175,175,255,255,255,255,255,255,255,255,255, - 186,188,188,142,146,145,246,246,246,153,156,155,171,173,172,143,147, - 144,224,225,224,178,180,180,211,213,212,152,155,154,236,236,236,160, - 163,162,212,213,213,255,255,255,255,255,255,255,255,255,255,255,255, - 141,144,143,221,222,221,142,147,144,201,201,201,138,143,140,206,208, - 207,164,166,165,200,200,200,124,128,127,227,228,228,146,149,148,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,117,121,120, - 203,205,204,133,138,135,166,167,166,146,147,147,179,180,179,146,147, - 146,182,183,182,124,128,127,189,190,189,123,126,125,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,106,110,109,205,206,206, - 108,111,111,172,174,173,109,112,111,175,177,176,108,111,110,178,180, - 179,111,115,114,179,180,180,109,113,112,255,255,255,255,255,255,255, - 255,255,165,118, 87,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32, - 135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, - 32,135, 74, 32,135, 74, 32,135, 74, 32,135, 74, 32,165,118, 87,135, - 74, 32,221,187,156,207,159,114,207,159,114,207,159,114,207,159,114, - 207,159,114,207,159,114,207,159,114,207,159,114,207,159,114,207,159, - 114,207,159,114,207,159,114,221,187,156,135, 74, 32,135, 74, 32,221, - 187,156,221,187,156,221,187,156,221,187,156,221,187,156,221,187,156, - 221,187,156,221,187,156,221,187,156,221,187,156,221,187,156,221,187, - 156,221,187,156,221,187,156,135, 74, 32,135, 74, 32,221,187,156,202, - 138, 88,202,138, 88,202,138, 88,202,138, 88,202,138, 88,202,138, 88, - 202,138, 88,202,138, 88,202,138, 88,202,138, 88,202,138, 88,202,138, - 88,221,187,156,135, 74, 32,135, 74, 32,221,187,156,134, 82, 44,134, - 81, 43,134, 81, 43,134, 81, 43,134, 81, 43,134, 81, 43,134, 82, 44, - 134, 82, 44,134, 82, 44,134, 82, 44,134, 82, 44,134, 82, 44,221,187, - 156,135, 74, 32,135, 74, 32,221,187,156,106, 91, 78,201,201,201,156, - 156,156,156,156,156,156,156,156,155,155,155,155,155,155,155,155,155, - 155,155,155,155,155,155,155,155,155,106, 91, 78,221,187,156,135, 74, - 32,135, 74, 32,221,187,156,119,124,122,217,217,217,189,189,189,189, - 189,189,189,189,189,189,189,189,188,188,188,188,188,188,188,188,188, - 191,191,191,192,192,192,119,124,122,221,187,156,135, 74, 32,195,165, - 144,135, 74, 32,133,138,136,231,231,231,215,215,215,214,214,214,214, - 214,214,214,214,214,214,214,214,213,213,213,213,213,213,218,218,218, - 220,220,220,133,138,136,135, 74, 32,195,165,144,255,255,255,255,255, - 255,133,138,136,241,241,241,235,235,235,235,235,235,235,235,235,234, - 234,234,234,234,234,234,234,234,234,234,234,234,234,234,233,233,233, - 133,138,136,255,255,255,255,255,255,255,255,255,255,255,255,171,174, - 173,133,138,136,133,138,136,133,138,136,133,138,136,133,138,136,133, - 138,136,133,138,136,133,138,136,133,138,136,133,138,136,171,174,173, - 255,255,255,255,255,255); - -Const - stdimg_search_16 : Array[0..821] of byte = ( + stdimg_about_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 18, 11, 0, 0, 18, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255,225,188,172,225,188,172,225,188,172,225,188,172,225,188,172,225, + 188,172,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,255, 0,255,255, 0,255,225,188,172,228,195,181,241,224, + 216,250,243,240,255,255,255,254,253,252,250,243,240,241,224,216,228, + 195,181,225,188,172,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255, 0,255,225,188,172,237,214,205,254,253,252,247,243,239,218,196, + 179,202,169,144,204,173,148,225,204,189,249,246,243,254,253,252,237, + 214,205,225,188,172,255, 0,255,255, 0,255,255, 0,255,225,188,172, + 237,214,205,255,255,255,223,205,191,181,138,105,182,139,107,186,144, + 113,189,150,119,194,155,124,200,163,135,234,220,209,255,255,255,237, + 214,205,225,188,172,255, 0,255,255, 0,255,228,195,181,254,253,252, + 220,201,187,170,123, 87,174,128, 94,205,177,155,251,249,247,255,255, + 255,217,193,175,194,155,125,198,161,132,234,220,209,254,253,252,228, + 195,181,255, 0,255,225,188,172,241,224,216,245,239,235,165,116, 81, + 166,118, 81,171,123, 88,174,128, 93,243,236,231,255,255,255,186,144, + 113,190,149,119,194,155,125,200,164,135,249,246,243,241,224,216,225, + 188,172,225,188,172,250,243,240,202,173,153,158,106, 70,162,111, 75, + 166,117, 81,170,123, 88,243,236,230,255,255,255,182,139,106,186,144, + 112,190,149,118,193,155,125,225,205,189,250,243,240,225,188,172,225, + 188,172,254,253,252,169,125, 93,154,101, 63,159,107, 69,162,111, 76, + 166,117, 82,242,235,229,255,255,255,178,134,100,182,139,106,186,144, + 112,190,150,119,205,173,148,254,253,252,225,188,172,225,188,172,254, + 253,252,166,121, 87,151, 96, 57,154,101, 63,158,106, 69,162,112, 75, + 241,234,229,255,255,255,175,128, 94,178,134,101,182,139,106,186,145, + 112,202,169,144,254,253,252,225,188,172,225,188,172,250,243,240,195, + 164,143,146, 91, 50,151, 95, 57,155,101, 63,189,153,127,234,222,214, + 254,254,254,171,123, 88,174,128, 94,178,133,100,182,138,106,218,196, + 179,250,243,240,225,188,172,225,188,172,241,224,216,243,236,232,147, + 90, 52,147, 90, 50,151, 96, 57,155,101, 63,158,107, 69,162,111, 75, + 166,118, 82,171,122, 88,174,128, 94,181,138,106,247,243,239,241,224, + 216,225,188,172,255, 0,255,228,195,181,254,253,252,210,186,170,143, + 85, 44,147, 90, 50,151, 96, 57,215,194,179,232,220,211,163,112, 76, + 166,118, 81,171,123, 88,223,205,192,254,253,252,228,195,181,255, 0, + 255,255, 0,255,225,188,172,237,214,205,255,255,255,210,186,170,147, + 91, 52,147, 90, 51,220,201,187,237,228,221,159,107, 69,166,117, 81, + 220,201,187,255,255,255,237,214,205,225,188,172,255, 0,255,255, 0, + 255,255, 0,255,225,188,172,237,214,205,254,253,252,243,236,232,195, + 164,142,166,120, 88,169,125, 93,202,173,153,245,239,235,254,253,252, + 237,214,205,225,188,172,255, 0,255,255, 0,255,255, 0,255,255, 0, + 255,255, 0,255,225,188,172,228,195,181,241,224,216,250,243,240,255, + 255,255,254,253,252,250,243,240,241,224,216,228,195,181,225,188,172, 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,100,148,186, 34, - 103,157,129,168,198,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,111,156,194, 85,141,188,137,181,221, 24, - 95,151,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,123,164,202,100,151,197,157,193,228,102,153,199, 49,113,165,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,233,207,186, - 219,178,146,211,166,128,208,161,124,210,166,133,174,161,153,117,162, - 204,171,203,232,118,164,206, 64,123,175,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,232,202,176,232,201,174,245,225,205, - 247,229,211,247,229,209,243,221,200,223,186,156,199,168,145,134,174, - 213, 80,135,187,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,241,219,200,237,208,183,248,232,217,245,222,200,243,216,189, - 243,214,187,244,219,194,247,228,210,223,187,157,160,151,149,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,238, - 206,178,247,231,215,246,225,204,244,219,194,244,218,192,243,216,189, - 243,215,187,244,219,194,243,222,201,210,168,135,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,240,206,175,249, - 236,223,245,223,200,245,221,198,244,220,195,244,218,193,243,217,190, - 243,215,189,248,230,211,211,166,128,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,244,211,181,249,237,225,246, - 225,204,245,223,201,245,222,199,244,220,196,244,219,194,244,218,192, - 248,231,214,215,171,135,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,248,219,193,249,235,222,247,231,214,246, - 225,204,245,224,202,245,222,200,245,221,197,246,225,203,245,226,208, - 223,185,153,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,252,234,216,248,226,204,250,238,227,247,231,214,246, - 226,206,246,225,203,246,227,208,249,234,221,236,207,181,236,212,191, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,251,228,206,249,226,205,250,236,222,249,238,226,249, - 237,226,248,233,218,240,213,189,237,208,183,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,252,234,217,250,221,194,246,214,185,244,211,181,243, - 212,184,245,224,205,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, + 255,255, 0,255,255, 0,255,225,188,172,225,188,172,225,188,172,225, + 188,172,225,188,172,225,188,172,255, 0,255,255, 0,255,255, 0,255, 255, 0,255,255, 0,255); Const - stdimg_dialog_warning_32 : Array[0..3125] of byte = ( - 66, 77, 54, 12, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 32, 0, 0, 0, 32, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 12, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,252,252,252,244,244,244,237,237,237,235,235, - 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, - 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, - 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, - 235,235,235,235,237,237,237,242,242,242,248,248,248,254,254,254,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,239,239, - 222,222,222,198,198,207,190,190,201,186,186,197,186,186,197,186,186, - 197,186,186,197,186,186,197,186,186,197,186,186,197,186,186,197,186, - 186,197,186,186,197,186,186,197,186,186,197,186,186,197,186,186,197, - 186,186,197,186,186,197,186,186,197,186,186,197,186,186,197,190,190, - 201,189,189,200,197,197,206,223,223,223,246,246,246,255,255,255,255, - 255,255,255,255,255,244,244,244,178,178,210, 22, 22,165, 0, 0,159, - 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0, - 159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, - 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, - 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0,159, 0, 0, - 159, 21, 21,165,173,173,209,250,250,250,255,255,255,255,255,255,243, - 243,243, 39, 39,171, 61, 61,196,112,112,224,117,117,226,116,116,226, - 113,113,225,111,111,225,108,108,224,105,105,223,102,102,223,100,100, - 222, 97, 97,222, 94, 94,221, 92, 92,220, 89, 89,220, 86, 86,219, 83, - 83,219, 81, 81,218, 78, 78,218, 75, 75,217, 72, 72,216, 69, 69,216, - 67, 67,215, 64, 64,215, 62, 62,214, 54, 54,212, 28, 28,188, 20, 20, - 166,246,246,246,255,255,255,255,255,255,253,253,253, 15, 15,166,121, - 121,221, 20, 20,208, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, - 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0, - 204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, - 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, 0, 0,204, - 0, 0,204, 10, 10,206, 56, 56,207, 2, 2,160,247,247,251,255,255, - 255,255,255,255,255,255,255, 90, 90,194, 89, 89,200, 58, 58,216, 0, - 0,204,163,163,219,210,210,224,210,210,224,211,211,225,212,212,226, - 212,212,226,213,213,227,214,214,228,215,215,229,216,216,230,216,216, - 230,217,217,231,217,217,231,218,218,232,218,218,232,219,219,233,220, - 220,234,221,221,235,222,222,236,193,193,231, 0, 0,204, 27, 27,209, - 44, 44,192, 53, 53,181,255,255,255,255,255,255,255,255,255,255,255, - 255,221,221,242, 25, 25,168,117,117,221, 8, 8,206, 80, 80,211,224, - 224,224,225,225,225,225,225,225,226,226,226,227,227,227,227,227,227, - 228,228,228,229,229,229,230,230,230,230,230,230,231,231,231,232,232, - 232,233,233,233,234,234,234,234,234,234,235,235,235,236,236,236,237, - 237,237,105,105,219, 3, 3,205, 59, 59,211, 14, 14,166,193,193,232, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,109,109, - 201, 85, 85,197, 68, 68,218, 2, 2,204,179,179,219,224,224,224,225, - 225,225,225,225,225,226,226,226,227,227,227,227,227,227,228,228,228, - 60, 60, 60, 55, 55, 55,230,230,230,231,231,231,232,232,232,233,233, - 233,234,234,234,234,234,234,235,235,235,205,205,231, 7, 7,205, 36, - 36,211, 47, 47,188, 70, 70,186,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,234,234,247, 23, 23,169,121,121, - 220, 14, 14,207, 59, 59,209,223,223,223,224,224,224,224,224,224,225, - 225,225,226,226,226,226,226,226,227,227,227, 55, 55, 55, 53, 53, 53, - 230,230,230,230,230,230,231,231,231,232,232,232,233,233,233,234,234, - 234,234,234,234, 82, 82,215, 8, 8,206, 67, 67,210, 10, 10,163,212, - 212,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,129,129,208, 74, 74,190, 81, 81,220, 0, 0, - 204,162,162,218,223,223,223,224,224,224,224,224,224,225,225,225,226, - 226,226,226,226,226,215,215,215,215,215,215,229,229,229,230,230,230, - 230,230,230,231,231,231,232,232,232,233,233,233,186,186,227, 1, 1, - 204, 47, 47,213, 46, 46,185, 96, 96,196,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 244,244,251, 25, 25,169,121,121,218, 23, 23,209, 42, 42,208,221,221, - 223,223,223,223,224,224,224,224,224,224,225,225,225,226,226,226, 37, - 37, 37, 37, 37, 37,228,228,228,229,229,229,229,229,229,230,230,230, - 231,231,231,232,232,232, 59, 59,211, 14, 14,207, 73, 73,209, 11, 11, - 164,228,228,245,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,151,151,216, - 63, 63,185, 94, 94,222, 0, 0,204,141,141,215,223,223,223,223,223, - 223,224,224,224,224,224,224,225,225,225, 27, 27, 27, 27, 27, 27,227, - 227,227,228,228,228,229,229,229,229,229,229,230,230,230,164,164,223, - 0, 0,204, 60, 60,215, 41, 41,179,120,120,205,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,251,251,253, 35, 35,174,116,116,215, - 34, 34,211, 27, 27,206,215,215,221,223,223,223,223,223,223,224,224, - 224,224,224,224, 13, 13, 13, 13, 13, 13,226,226,226,227,227,227,228, - 228,228,229,229,229,226,226,228, 40, 40,209, 24, 24,209, 75, 75,206, - 16, 16,167,241,241,250,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,172,172,224, 49, 49,178,106,106,223, 1, 1,204, - 121,121,213,222,222,222,222,222,222,223,223,223,224,224,224, 3, 3, - 3, 3, 3, 3,225,225,225,226,226,226,227,227,227,228,228,228,140, - 140,218, 1, 1,204, 75, 75,218, 34, 34,174,144,144,213,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254, - 254,255, 49, 49,179,109,109,211, 47, 47,213, 16, 16,206,206,206,220, - 222,222,222,222,222,222,215,215,215, 0, 0, 0, 0, 0, 0,217,217, - 217,225,225,225,226,226,226,218,218,226, 25, 25,207, 36, 36,211, 74, - 74,203, 27, 27,171,249,249,253,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,193,193,232, 36, - 36,173,117,117,224, 4, 4,205,102,102,212,221,221,221,222,222,222, - 204,204,204, 0, 0, 0, 0, 0, 0,206,206,206,225,225,225,225,225, - 225,118,118,216, 4, 4,205, 87, 87,219, 27, 27,170,167,167,222,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255, 69, 69,186,100,100,205, 59, - 59,216, 7, 7,205,195,195,219,221,221,221,193,193,193, 0, 0, 0, - 0, 0, 0,195,195,195,224,224,224,206,206,223, 12, 12,205, 49, 49, - 214, 70, 70,199, 45, 45,178,254,254,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,211,211,238, 25, 25,170,124,124,224, 8, 8,206, 82, - 82,210,221,221,221,218,218,218,207,207,207,207,207,207,220,220,220, - 223,223,223, 97, 97,213, 9, 9,206, 98, 98,219, 17, 17,166,189,189, - 230,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255, 92, 92,194, 89, 89,199, 72, 72,218, 2, 2,204,180,180,217,221, - 221,221,221,221,221,222,222,222,222,222,222,192,192,220, 4, 4,204, - 64, 64,217, 65, 65,194, 68, 68,186,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,226,226,244, 20, 20, - 168,128,128,224, 15, 15,207, 63, 63,209,220,220,220,221,221,221,221, - 221,221,222,222,222, 74, 74,210, 17, 17,207,104,104,219, 11, 11,163, - 210,210,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,114,114,202, 79, 79,193, 85, 85, - 220, 0, 0,204,162,162,215,220,220,220,220,220,220,173,173,217, 1, - 1,204, 80, 80,220, 59, 59,189, 92, 92,194,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,238,238,249, 20, 20,167,128,128,222, 25, 25,209, 44, 44, - 207,218,218,219,220,220,220, 53, 53,208, 28, 28,210,106,106,217, 10, - 10,164,226,226,244,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 137,137,211, 67, 67,187, 99, 99,223, 0, 0,204,143,143,214,152,152, - 214, 1, 1,204, 97, 97,223, 51, 51,184,118,118,204,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,246,246,252, 25, 25,169, - 122,122,218, 36, 36,211, 21, 21,206, 23, 23,205, 42, 42,212,104,104, - 215, 14, 14,165,239,239,249,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,158,158,218, 53, 53,181,113,113,225, - 1, 1,204, 3, 3,205,113,113,225, 41, 41,177,142,142,212,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,252,252,254, 37, 37,174,111,111,213, 66, 66,217, 70, 70,218, - 96, 96,210, 25, 25,170,248,248,252,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,180, - 180,227, 22, 22,168,109,109,218,106,106,218, 20, 20,169,165,165,221, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,140,140,211, 12, - 12,165, 8, 8,163,124,124,206,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,252,252,254,251,251,253,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255); - -Const stdimg_hidden : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, @@ -2470,277 +2778,240 @@ Const 255,255,255, 0, 0, 0); Const - stdimg_document : Array[0..1061] of byte = ( - 66, 77, 38, 4, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 18, 0, 0, 0, 18, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 240, 3, 0, 0,235, 10, 0, 0,235, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 98, 98, - 98, 91, 91, 91, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 97, 97, 97, - 255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, - 88, 88, 88, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, - 0,255,255, 0,255, 88, 88, 88,182,193,198,182,193,198,172,189,196, - 163,184,195,154,179,194,145,175,192,136,170,191,127,165,190,118,160, - 189,115,158,188, 48, 48, 48, 90, 90, 90,255, 0,255,255, 0,255, 0, - 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, 88,222,222,222,225, - 237,244,216,232,242,208,228,240,200,222,238,191,218,236,184,214,233, - 176,209,231,167,204,229,120,161,188, 48, 48, 48, 90, 90, 90,255, 0, - 255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, - 88,222,222,222,233,241,247,137,144,148,132,141,147,127,139,146,122, - 136,145,117,133,143,112,130,142,176,209,231,127,163,188, 48, 48, 48, - 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255, - 255, 0,255, 88, 88, 88,222,222,222,242,246,250,234,242,248,226,238, - 245,218,233,242,210,228,240,201,224,238,193,220,236,186,214,233,133, - 166,188, 48, 48, 48, 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, - 0,255,255, 0,255,255, 0,255, 88, 88, 88,222,222,222,251,252,252, - 148,151,152,143,148,151,138,145,149,133,142,148,128,139,146,123,136, - 145,194,219,236,138,168,188, 48, 48, 48, 90, 90, 90,255, 0,255,255, - 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, 88,222, - 222,222,255,255,255,252,253,253,244,248,250,235,243,248,228,238,245, - 220,234,243,212,230,241,202,223,236,144,171,188, 48, 48, 48, 90, 90, - 90,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0, - 255, 88, 88, 88,222,222,222,255,255,255,155,155,155,154,154,154,148, - 151,152,143,148,151,139,145,149,134,143,148,212,226,236,151,174,188, - 48, 48, 48, 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, 0,255, - 255, 0,255,255, 0,255, 88, 88, 88,223,223,223,255,255,255,255,255, - 255,255,255,255,254,254,254,245,248,251,237,244,248,227,237,243,220, - 231,238,151,174,188, 48, 48, 48, 90, 90, 90,255, 0,255,255, 0,255, - 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, 88,222,222,222, - 255,255,255,155,155,155,155,155,155,155,155,155,155,155,155,246,249, - 251,236,240,244,217,224,231,175,182,190, 48, 48, 48, 90, 90, 90,255, - 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, - 88, 88,222,222,222,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,245,245,246,222,224,226,177,183,188,132,137,143, 48, 48, - 48, 90, 90, 90,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0, - 255,255, 0,255, 88, 88, 88,222,222,222,255,255,255,155,155,155,155, - 155,155,155,155,155,255,255,255,137,137,137,112,112,112,107,107,107, - 66, 66, 66, 48, 48, 48, 96, 96, 96,255, 0,255,255, 0,255, 0, 0, - 255, 0,255,255, 0,255,255, 0,255, 88, 88, 88,222,222,222,255,255, - 255,255,255,255,255,255,255,255,255,255,252,252,252,112,112,112,206, - 206,206,255,255,255,153,153,153, 48, 48, 48,135,135,135,255, 0,255, - 255, 0,255, 0, 0,255, 0,255,255, 0,255,255, 0,255, 88, 88, 88, - 222,222,222,255,255,255,255,255,255,255,255,255,255,255,255,234,234, - 234,109,109,109,255,255,255,153,153,153, 88, 88, 88,135,135,135,255, - 0,255,255, 0,255,255, 0,255, 0, 0,255, 0,255,255, 0,255,255, - 0,255, 88, 88, 88,222,222,222,222,222,222,222,222,222,222,222,222, - 222,222,222,177,183,188, 88, 88, 88,153,153,153, 88, 88, 88,135,135, - 135,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 0, 0,255, 0, - 255,255, 0,255,255, 0,255, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255, 0, 0); - -Const - stdimg_menu_preferences_16 : Array[0..821] of byte = ( + stdimg_menu_saveas_16 : Array[0..821] of byte = ( 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,215,194,180,135, 74, 32,135, 74, 32,135, 74, 32,223,207, - 196,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 135, 74, 32,190,165,146,184,156,134,184,156,134,135, 74, 32,223,207, - 196,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,193, - 196,195,154,158,157,193,196,195,255, 0,255,255, 0,255,135, 74, 32, - 204,187,173,167,145,125,181,149,122,174,139,114,135, 74, 32,223,207, - 196,255, 0,255,255, 0,255,255, 0,255,219,220,220,133,138,136,158, - 161,160,133,138,136,255, 0,255,255, 0,255,135, 74, 32,204,187,173, - 164,141,120,162,138,116,180,149,122,179,147,124,135, 74, 32,255, 0, - 255,255, 0,255,219,220,220,133,138,136,210,211,212,194,195,196,133, - 138,136,255, 0,255,255, 0,255,232,221,213,135, 74, 32,212,200,189, - 164,141,120,164,141,120,190,165,146,135, 74, 32,255, 0,255,219,220, - 220,133,138,136,226,227,228,194,196,198,133,138,136,193,196,195,255, - 0,255,255, 0,255,255, 0,255,243,237,233,135, 74, 32,204,187,173, - 204,187,173,179,147,124,135, 74, 32,193,196,195,133,138,136,211,211, - 212,189,190,191,133,138,136,219,220,220,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,243,237,233,135, 74, 32,135, 74, 32, - 135, 74, 32,133,131,125,170,173,173,200,201,202,189,190,191,133,138, - 136,219,220,220,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 181,183,184,133,138,136,183,184,185,133,138,136,219,220,220,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,219, - 220,220,133,138,136,133,138,136,133,138,136,133,138,136,208,209,210, - 163,164,164,133,138,136,193,196,195,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,219,220,220,133,138,136,243, - 243,243,239,240,240,237,238,238,234,236,236,182,185,186,133,138,136, - 219,220,220,133,138,136,219,220,220,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,133,138,136,245,246,246,169,172,171,133, - 138,136,247,247,247,226,227,229,170,173,173,245,246,246,255, 0,255, - 219,220,220,133,138,136,219,220,220,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,219,220,220,133,138,136,255, 0,255,219,220,220,133, - 138,136,250,250,250,133,138,136,255, 0,255,255, 0,255,255, 0,255, - 219,220,220,133,138,136,135,140,138,179,179,179,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,133,138,136,238, - 240,240,133,138,136,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 133,138,136,240,240,240,133,138,136,179,179,179,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,133,138,136,233,235,236,133,138,136,219, - 220,220,255, 0,255,255, 0,255,255, 0,255,255, 0,255,179,179,179, - 133,138,136,238,239,239,133,138,136,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,219,220,220,133,138,136,219,220,220,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,179,179,179, - 133,138,136,219,220,220,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255); + 0, 0, 0,216,171,142,205,149,112,189,115, 66,183,104, 53,181,104, + 53,180,103, 52,178,102, 52,176,101, 51,174,100, 51,172, 99, 50,170, + 98, 50,169, 97, 50,168, 96, 49,167, 97, 50,171,105, 60,188,134, 97, + 195,125, 79,235,198,173,234,197,173,254,251,248,254,251,248,254,251, + 248,254,251,248,254,251,248,254,251,248,254,251,248,254,251,248,254, + 251,248,254,251,248,200,154,124,199,152,121,173,107, 64,186,108, 56, + 237,202,179,224,162,122,254,250,247, 98,192,136, 98,192,136, 98,192, + 136, 98,192,136, 98,192,136, 98,192,136, 98,192,136, 98,192,136,253, + 249,246,202,141,101,201,155,124,167, 97, 50,187,108, 56,238,204,182, + 225,162,122,254,250,247,191,220,194,191,220,194,191,220,194,191,220, + 194,191,220,194,191,220,194,191,220,194,191,220,194,253,249,246,205, + 144,104,204,158,129,168, 97, 50,187,107, 56,239,206,184,225,162,121, + 254,250,247, 98,192,136, 98,192,136,206,247,255, 41, 41, 41, 82, 82, + 82,206,247,255, 98,192,136, 98,192,136,253,249,246,207,147,106,206, + 163,132,170, 97, 50,186,106, 54,239,208,187,226,162,122,254,251,248, + 206,247,255,206,247,255,206,247,255,206,247,255,206,247,255,206,247, + 255,206,247,255,206,247,255,254,251,248,211,150,109,210,167,138,171, + 98, 50,187,106, 54,240,210,190,226,163,122,226,163,122,206,247,255, + 206,247,255,206,247,255, 41, 41, 41, 82, 82, 82,206,247,255,206,247, + 255,206,247,255,216,153,113,214,153,112,213,171,142,173, 99, 51,187, + 106, 54,242,213,194,227,163,122,208,242,250,206,247,255,206,247,255, + 206,247,255, 82, 82, 82, 41, 41, 41,132,156,165,206,247,255,206,247, + 255,210,247,254,217,155,115,218,176,149,175,100, 51,187,106, 54,242, + 216,197,227,164,123,181,238,254,181,239,255,181,239,255,181,239,255, + 181,239,255, 82, 82, 82, 41, 41, 41, 82, 82, 82,181,239,255,181,239, + 254,220,157,116,221,181,154,177,101, 52,187,107, 54,244,217,199,230, + 166,125,186,236,250,181,239,255, 41, 41, 41, 82, 82, 82,181,239,255, + 181,239,255, 41, 41, 41, 41, 41, 41,181,239,255,186,239,253,218,156, + 116,225,186,159,179,102, 52,187,108, 55,244,220,201,231,167,125,201, + 230,240,181,239,255, 41, 41, 41, 41, 41, 41,181,239,255,132,156,165, + 41, 41, 41, 41, 41, 41,181,239,255,201,239,249,222,160,119,228,190, + 164,180,103, 52,189,110, 58,245,221,204,231,168,126,250,240,232,181, + 239,255,132,156,165, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 132,156,165,181,239,255,247,229,217,224,162,120,231,194,169,182,104, + 53,192,116, 66,246,223,208,232,168,126,252,246,241,198,242,246,148, + 247,255,148,247,255,148,247,255,148,247,255,148,247,255,148,247,255, + 184,228,232,247,230,219,225,163,122,239,213,195,183,106, 54,198,130, + 85,246,223,209,233,170,128,254,250,246,253,250,246,218,241,243,175, + 244,250,153,246,254,153,246,254,175,244,250,218,241,243,249,236,226, + 248,231,219,238,208,186,236,208,189,189,116, 67,214,165,133,246,224, + 209,247,224,209,254,251,248,254,251,247,253,249,246,252,245,240,250, + 240,234,251,242,237,253,249,246,253,250,247,251,241,235,248,233,223, + 236,209,190,205,146,106,226,197,177,225,189,166,217,171,141,201,137, + 94,192,117, 67,189,110, 58,187,108, 55,187,107, 54,187,106, 54,187, + 106, 54,188,108, 57,189,110, 59,187,109, 58,191,116, 68,201,141,101, + 231,206,188,255,255,255); Const - stdimg_choice_no_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255, 98, 98,162,164,164,178,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,152,152,171,101,101,160,255, 0,255,255, 0,255, - 255, 0,255, 48, 48,162, 55, 55,241, 19, 19,202,152,152,172,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,135, - 135,164, 17, 17,205, 48, 48,234, 61, 61,154,255, 0,255,255, 0,255, - 8, 8,224, 72, 72,245, 76, 76,240, 5, 5,200,135,135,163,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,116,116,157, 5, 5,205, 90, - 90,239, 90, 90,244, 9, 9,217,255, 0,255,255, 0,255, 34, 34,254, - 55, 55,255, 89, 89,255, 74, 74,237, 5, 5,199,119,119,156,255, 0, - 255,255, 0,255, 98, 98,152, 8, 8,206, 90, 90,237,115,115,255, 85, - 85,255, 54, 54,253,255, 0,255,255, 0,255, 29, 29,255, 43, 43,255, - 57, 57,255, 86, 86,255, 69, 69,235, 5, 5,196,102,102,148, 85, 85, - 147, 9, 9,203, 84, 84,237,106,106,255, 80, 80,255, 65, 65,255, 52, - 52,255,255, 0,255,255, 0,255,255, 0,255, 30, 30,255, 43, 43,255, - 53, 53,255, 74, 74,255, 55, 55,232, 1, 1,187, 6, 6,192, 68, 68, - 237, 88, 88,255, 71, 71,255, 62, 62,255, 54, 54,249,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255, 31, 31,251, 47, 47,255, - 60, 60,255, 78, 78,255, 49, 49,232, 55, 55,237, 75, 75,255, 56, 56, - 255, 50, 50,255, 55, 55,241,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255, 77, 77,238, 97, 97,255, - 96, 96,255, 96, 96,255, 98, 98,255, 98, 98,255, 91, 91,255, 73, 73, - 227,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255, 43, 43,156, 61, 61,244, 99, 99,255, - 99, 99,255,100,100,255,100,100,255, 54, 54,237, 75, 75,146,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255, 47, 47,123, 0, 0,166, 49, 49,242,107,107,255,106,106,255, - 106,106,255,105,105,255, 33, 33,230, 0, 0,152, 82, 82,127,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 43, 43,115, 0, - 0,164, 55, 55,243,121,121,255,120,120,255,121,121,255,121,121,255, - 120,120,255,116,116,255, 38, 38,229, 0, 0,146, 82, 82,123,255, 0, - 255,255, 0,255,255, 0,255, 45, 45,112, 0, 0,156, 66, 66,242,138, - 138,255,137,137,255,136,136,255,102,102,209,103,103,224,141,141,255, - 136,136,255,132,132,255, 42, 42,227, 0, 0,139, 91, 91,128,255, 0, - 255,255, 0,255, 0, 0,156, 73, 73,242,155,155,255,153,153,255,153, - 153,255,115,115,207,255, 0,255,255, 0,255,110,110,228,158,158,255, - 153,153,255,148,148,255, 47, 47,229, 13, 13,130,255, 0,255,255, 0, - 255, 85, 85,254,174,174,255,169,169,255,168,168,255,119,119,205,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,118,118,228,175,175,255, - 169,169,255,169,169,255, 60, 60,222,255, 0,255,255, 0,255,127,127, - 208,187,187,255,187,187,255,122,122,207,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,126,126,228,200,200,255, - 164,164,255,152,152,199,255, 0,255,255, 0,255,255, 0,255,126,126, - 210,127,127,214,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,121,121,231,154,154,197, - 255, 0,255,255, 0,255); + stdimg_link : Array[0..449] of byte = ( + 66, 77,194, 1, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 11, 0, 0, 0, 11, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 140, 1, 0, 0, 18, 11, 0, 0, 18, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,128,128,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255, 0, 0, 0, 0, 0, 0,128,128,128,255,255,255,255,255,255,255, + 255,255, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255, 0, 0, 0, 0, 0, 0,128,128,128,255,255,255,255,255, + 255, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255, 0, 0, 0, 0, 0, 0,128,128,128,255,255,255, + 255,255,255, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,128,128,128,255, + 255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, + 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,128,128, + 128,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, + 128,128,128,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, + 0, 0,128,128,128,255,255,255,255,255,255,255,255,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0,128,128,128,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 0, 0, 0, 0, 0, 0,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128, 0, 0, 0, 0, 0, 0); Const - stdimg_edit_cut_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255,255,255,172,172,226, 37, 37,178, 26, 26,175, 29, 29, - 174,209,209,239,255,255,255,255,255,255,255,255,255,255,255,255,172, - 172,226, 70, 70,190, 27, 27,176, 39, 39,179,209,209,239,255,255,255, - 255,255,255, 49, 49,182, 41, 41,219, 36, 36,209, 31, 31,206, 31, 31, - 177,209,209,239,255,255,255,255,255,255,209,209,239, 29, 29,177, 36, - 36,212, 34, 34,208, 31, 31,206, 39, 39,178,255,255,255,255,255,255, - 19, 19,173, 33, 33,208,255,255,255,117,117,213, 35, 35,211, 52, 52, - 184,255,255,255,255,255,255, 59, 59,187, 37, 37,214,114,114,214,255, - 255,255, 35, 35,210, 22, 22,173,255,255,255,255,255,255, 43, 43,179, - 37, 37,213,134,134,213,255,255,255, 38, 38,208, 13, 13,170,255,255, - 255,255,255,255, 5, 5,169, 38, 39,205,255,255,255,137,137,214, 34, - 34,209, 43, 43,179,255,255,255,255,255,255,172,172,226, 7, 7,168, - 35, 35,209, 73, 73,192, 26, 27,194, 1, 1,166,255,255,255,241,242, - 250, 30, 31,205, 25, 27,193, 74, 74,193, 33, 33,206, 7, 7,167,143, - 143,216,255,255,255,255,255,255,255,255,255,142,142,215, 9, 9,170, - 34, 34,210, 31, 31,206, 16, 17,184, 92, 94,196, 6, 7,169, 26, 26, - 201, 34, 34,209, 33, 33,203, 12, 12,170,171,171,225,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127,210, - 33, 33,175, 6, 6,166, 70, 75,163, 2, 2,166, 25, 26,199, 37, 37, - 178,131,131,211,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,212,214,213, - 132,137,137,195,198,197,175,178,179, 52, 55,160,231,232,232,255,255, + stdimg_checkboxes : Array[0..2601] of byte = ( + 66, 77, 42, 10, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, + 0, 65, 0, 0, 0, 13, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, + 244, 9, 0, 0,196, 14, 0, 0,196, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,181,184,183,184,188,187, - 230,232,231,167,172,170,139,144,142,184,187,186,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,231,232,232,136,141,139,223,225,225,245,246,245, - 151,156,154,165,169,168,140,145,143,231,232,232,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,152,156,154,178,182,181,247,247,247,142,147,145,156,160,159, - 179,182,181,182,187,185,172,175,174,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,228,229,229,136, - 141,139,217,220,219,239,240,239,171,175,173,184,187,186,179,184,182, - 203,206,205,137,142,140,197,199,198,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,144,148,146,176,181,179,246, - 247,247,155,159,157,202,204,203,255,255,255,141,146,144,201,206,204, - 172,176,175,156,160,159,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,136,141,139,208,212,210,239,240,239,179, - 183,181,255,255,255,255,255,255,225,227,226,167,172,170,195,200,198, - 142,147,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,143,148,146,247,247,247,170,173,172,202,204,203,255, - 255,255,255,255,255,255,255,255,152,156,155,208,211,210,169,173,171, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,221,223,222,145,149,148,162,166,165,255,255,255,255,255,255,255, - 255,255,255,255,255,185,187,186,148,152,150,255,255,255,255,255,255, - 255,255,255,255,255,255); - -Const - stdimg_menu_check_16 : Array[0..821] of byte = ( - 66, 77, 54, 3, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 19, 11, 0, 0, 19, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255, 0, 0, 0, 0, 0, 0, - 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255, 0, 0, 0,255, 0,255,255, 0,255, - 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255, 0, 0, 0, 0, 0, 0,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255, 0, 0, 0,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0, - 255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, - 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255,255, 0,255, - 255, 0,255,255, 0,255); - - + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255, 0,127,127,127,191,191, + 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 191,191,191,191,191,191,191,191,191,191,191,191,191,191,255,255,255, + 127,127,127,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 191,191,255,255,255,127,127,127,191,191,191,191,191,191,191,191,191, + 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 191,191,191,191,191,191,191,255,255,255,127,127,127,191,191,191,191, + 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 191,191,191,191,191,191,191,191,191,191,191,191,255,255,255,127,127, + 127,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 255,255,255, 0,127,127,127, 0, 0, 0,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, + 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191,255, + 255,255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,191,191,191,255,255,255, 0,127,127,127, 0, + 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,191,191,191,255,255, + 255,127,127,127, 0, 0, 0,255,255,255, 0, 0, 0, 0, 0, 0,255, + 255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,255,255,255, + 191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0, + 127,127,127, 52, 52, 52, 52, 52, 52,127,127,127,127,127,127,127,127, + 127, 52, 52, 52, 52, 52, 52,127,127,127,191,191,191,255,255,255,127, + 127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191, + 191,255,255,255, 0,127,127,127, 0, 0, 0,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,255, + 255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255,255,255,191,191,191,255,255,255,127,127, + 127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191,191, + 255,255,255,127,127,127, 0, 0, 0,127,127,127, 52, 52, 52, 52, 52, + 52, 52, 52, 52,127,127,127, 52, 52, 52, 52, 52, 52, 52, 52, 52,127, + 127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,191,191,191,255,255,255, 0,127,127,127, + 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,191,191,191,255, + 255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, + 255,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, + 0,127,127,127,127,127,127, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52,127,127,127,127,127,127,191,191,191,255,255,255, + 127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191, + 191,191,255,255,255, 0,127,127,127, 0, 0, 0,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0, + 255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0,255,255,255,255,255,255,255,255,255,191,191,191,255,255,255,127, + 127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191,191, + 191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127, + 127,127, 52, 52, 52, 52, 52, 52, 52, 52, 52,127,127,127,127,127,127, + 127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,191,191,191,255,255,255, 0,127,127, + 127, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,191,191,191, + 255,255,255,127,127,127, 0, 0, 0,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, + 255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, + 0, 0,127,127,127,127,127,127, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52,127,127,127,127,127,127,191,191,191,255,255, + 255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 191,191,191,255,255,255, 0,127,127,127, 0, 0, 0,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, + 0,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,191,191,191,255,255,255, + 127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,191, + 191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127, 52, 52, 52, + 52, 52, 52, 52, 52, 52,127,127,127, 52, 52, 52, 52, 52, 52, 52, 52, + 52,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,191,191,191,255,255,255, 0,127, + 127,127, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,191,191, + 191,255,255,255,127,127,127, 0, 0, 0,255,255,255, 0, 0, 0, 0, + 0, 0,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, + 255,255,255,191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,191,191,191,255,255,255,127,127,127, + 0, 0, 0,127,127,127, 52, 52, 52, 52, 52, 52,127,127,127,127,127, + 127,127,127,127, 52, 52, 52, 52, 52, 52,127,127,127,191,191,191,255, + 255,255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,191,191,191,255,255,255, 0,127,127,127, 0, 0, 0,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,191,191,191,255,255,255,127,127,127, 0, + 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,191,191,191,255,255, + 255,127,127,127, 0, 0, 0,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 191,191,191,255,255,255,127,127,127, 0, 0, 0,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,191,191,191,255,255,255,127,127,127, 0, 0, 0, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,191,191,191,255,255,255, 0, + 127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, + 191,191,255,255,255,127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,191,191,191,255,255,255,127,127,127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,191,191,191,255,255,255,127,127, + 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,191,191, + 255,255,255,127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,191,191,191,255,255,255, 0,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,255,255,255,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,255, + 255,255,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,255,255,255,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,255,255,255,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,255,255,255, + 0); diff --git a/src/corelib/x11/fpg_interface.pas b/src/corelib/x11/fpg_interface.pas index c4adf079..3a1e1920 100644 --- a/src/corelib/x11/fpg_interface.pas +++ b/src/corelib/x11/fpg_interface.pas @@ -33,6 +33,8 @@ type TfpgApplicationImpl = TfpgX11Application; TfpgClipboardImpl = TfpgX11Clipboard; TfpgFileListImpl = TfpgX11FileList; + TfpgMimeDataImpl = TfpgX11MimeData; + TfpgDragImpl = TfpgX11Drag; implementation diff --git a/src/corelib/x11/fpg_utils_impl.inc b/src/corelib/x11/fpg_utils_impl.inc index d8625b8c..753b0ea1 100644 --- a/src/corelib/x11/fpg_utils_impl.inc +++ b/src/corelib/x11/fpg_utils_impl.inc @@ -1,7 +1,7 @@ {%mainunit fpg_utils.pas} uses - Unix; + Unix, BaseUnix, fpg_constants, fpg_stringutils; // X11 specific filesystem implementations of encoding functions @@ -40,3 +40,11 @@ begin fpSystem(Helper + ' ' + aURL + '&'); end; +function fpgFileSize(const AFilename: TfpgString): integer; +var + st: baseunix.stat; +begin + if not fpstat(pointer(AFilename),st) >= 0 then + exit(-1); + Result := st.st_size; +end; diff --git a/src/corelib/x11/fpg_x11.pas b/src/corelib/x11/fpg_x11.pas index 3d832130..71f06d39 100644 --- a/src/corelib/x11/fpg_x11.pas +++ b/src/corelib/x11/fpg_x11.pas @@ -19,7 +19,8 @@ unit fpg_x11; {$mode objfpc}{$H+} -{.$Define DEBUG} +{.$Define DEBUG} // general debugging - mostly OS messages though +{.$Define DNDDEBUG} // drag-n-drop specific debugging { TODO : Compiz effects: Menu popup with correct window hint. Same for Combo dropdown window. } @@ -28,6 +29,7 @@ interface uses Classes, SysUtils, + contnrs, X, Xlib, XUtil, @@ -51,6 +53,11 @@ type TfpgGContext = Xlib.TGc; PInt = ^integer; + TAtomArray = array[0..0] of TAtom; + PAtomArray = ^TAtomArray; + + TWindowArray = array[0..0] of TWindow; + PWindowArray = ^TWindowArray; {$HINTS OFF} TXIC = record @@ -119,6 +126,7 @@ type // forward declaration TfpgX11Window = class; + TfpgX11Drag = class; TfpgX11FontResource = class(TfpgFontResourceBase) @@ -205,6 +213,8 @@ type TfpgX11Window = class(TfpgWindowBase) + private + QueueEnabledDrops: boolean; protected FWinFlags: TXWindowStateFlags; FWinHandle: TfpgWinHandle; @@ -220,6 +230,8 @@ type function DoWindowToScreen(ASource: TfpgWindowBase; const AScreenPos: TPoint): TPoint; override; procedure DoUpdateWindowPosition; override; procedure DoSetMouseCursor; override; + procedure DoDNDEnabled(const AValue: boolean); override; + procedure DoAcceptDrops(const AValue: boolean); override; property WinHandle: TfpgWinHandle read FWinHandle; public constructor Create(AOwner: TComponent); override; @@ -235,9 +247,48 @@ type FComposeBuffer: TfpgString; FComposeStatus: TStatus; FEventFilter: TX11EventFilter; + { XDND type list received from Source window } + FDNDTypeList: TObjectList; + { all XDND atoms } + XdndAware: TAtom; + XdndTypeList: TAtom; + XdndSelection: TAtom; + { XDND client messages } + XdndEnter: TAtom; + XdndPosition: TAtom; + XdndStatus: TAtom; + XdndLeave: TAtom; + XdndDrop: TAtom; + XdndFinished: TAtom; + { XDND actions } + XdndActionCopy: TAtom; + XdndActionMove: TAtom; + XdndActionLink: TAtom; + XdndActionAsk: TAtom; + XdndActionPrivate: TAtom; + { XDND variables } + FActionType: TAtom; + FSrcWinHandle: TfpgWinHandle; + FDNDVersion: integer; + FDNDDataType: TAtom; + FSrcTimeStamp: clong; + FLastDropTarget: TfpgWinHandle; + FDropPos: TPoint; + FDrag: TfpgX11Drag; + procedure SetDrag(const AValue: TfpgX11Drag); function ConvertShiftState(AState: Cardinal): TShiftState; function KeySymToKeycode(KeySym: TKeySym): Word; function StartComposing(const Event: TXEvent): TKeySym; + function GetDropActionFromAtom(const AAtom: TAtom): TfpgDropAction; + function GetAtomFromDropAction(const AAction: TfpgDropAction): TAtom; + procedure XdndInit; + procedure ResetDNDVariables; + procedure HandleDNDenter(ATopLevelWindow: TfpgX11Window; const ASource: TWindow; const ev: TXEvent); + procedure HandleDNDleave(ATopLevelWindow: TfpgX11Window; const ASource: TWindow); + procedure HandleDNDposition(ATopLevelWindow: TfpgX11Window; const ASource: TWindow; const x_root: integer; const y_root: integer; const AAction: TAtom; const ATimestamp: x.TTime); + procedure HandleDNDdrop(ATopLevelWindow: TfpgX11Window; const ASource: TWindow; const ATimestamp: x.TTime); + procedure HandleDNDSelection(const ev: TXEvent); + property Drag: TfpgX11Drag read FDrag write SetDrag; protected FDisplay: PXDisplay; DisplayDepth: integer; @@ -251,8 +302,9 @@ type xia_motif_wm_hints: TAtom; xia_wm_protocols: TAtom; xia_wm_delete_window: TAtom; - netlayer: TNETWindowLayer; + xia_wm_state: TAtom; xia_targets: TAtom; + netlayer: TNETWindowLayer; InputMethod: PXIM; InputContext: PXIC; FLastKeySym: TKeySym; // Used for KeyRelease event @@ -295,6 +347,40 @@ type end; + TfpgX11MimeData = class(TfpgMimeDataBase) + end; + + + TfpgX11Drag = class(TfpgDragBase) + private + FLastTarget: TfpgWinHandle; + FUseVersion: integer; + FTargetIsDNDAware: Boolean; + FStatusPending: Boolean; + FDropAccepted: Boolean; + FProposedAction: TAtom; + FAcceptedAction: TAtom; + FMimeTypesArray: array of TAtom; + xia_plain_text: TAtom; + procedure SetTypeListProperty; + procedure InitializeMimeTypesToAtoms; + procedure Dragging(ev: TXEvent); + function IsDNDAware(win: TWindow): boolean; + procedure SendDNDLeave(ATarget: TWindow); + procedure SendDNDEnter(ATarget: TWindow); + procedure SendDNDPosition(ATarget: TWindow; x_root: cint; y_root: cint; AAction: TAtom; ATime: X.TTime); + procedure SendDNDDrop; + procedure HandleDNDStatus(ATarget: TWindow; AAccept: integer; ARect: TfpgRect; AAction: TAtom); + procedure HandleSelectionRequest(ev: TXEvent); + protected + FSource: TfpgX11Window; + function GetSource: TfpgX11Window; virtual; + public + destructor Destroy; override; + function Execute(const ADropActions: TfpgDropActions; const ADefaultAction: TfpgDropAction = daCopy): TfpgDropAction; override; + end; + + function fpgColorToX(col: TfpgColor): longword; @@ -309,13 +395,24 @@ uses fpg_widget, fpg_popupwindow, fpg_stringutils, // used for GetTextWidth + fpg_utils, fpg_form, // for modal event support cursorfont, - xatom; // used for XA_WM_NAME + xatom, // used for XA_WM_NAME + math; + +type + TDNDSrcType = class(TObject) + public + Name: TfpgString; + ID: integer; + end; var xapplication: TfpgApplication; +const + FPG_XDND_VERSION: culong = 4; // our supported XDND version // some externals @@ -335,6 +432,8 @@ function XdbeDeallocateBackBufferName(ADisplay: PXDisplay; ABuffer: TfpgWinHandl function XOpenIM(para1: PDisplay; para2: PXrmHashBucketRec; para3: Pchar; para4: Pchar): PXIM; cdecl; external; function XCreateIC(para1: PXIM; para2: array of const): PXIC; cdecl; external; +const + AltGrMask = 1 shl 13; // missing from X unit function ConvertTo565Pixel(rgb: longword): word; begin @@ -504,9 +603,9 @@ end; procedure ProcessSelection(var ev: TXEvent); var s: string; - actual: TAtom; - format: integer; - count, remaining: longword; + actualformat: TAtom; + actualtype: cint; + count, remaining: culong; data: PChar; begin if ev.xselection._property > 0 then @@ -515,7 +614,7 @@ begin ev.xselection._property, 0, 16000, TBool(false), // delete 0, // type - @actual, @format, @count, @remaining, + @actualformat, @actualtype, @count, @remaining, @data); s := data; @@ -539,7 +638,6 @@ begin e._type := SelectionNotify; e.requestor := ev.xselectionrequest.requestor; e.selection := ev.xselectionrequest.selection; -// e.selection := xapplication.xia_clipboard; e.target := ev.xselectionrequest.target; e.time := ev.xselectionrequest.time; e._property := ev.xselectionrequest._property; @@ -547,18 +645,82 @@ begin if e.target = xapplication.xia_targets then begin a := XA_STRING; - XChangeProperty(xapplication.Display, e.requestor, e._property, - XA_ATOM, 32, PropModeReplace, PByte(@a), Sizeof(TAtom)); // I think last parameter is right? + XChangeProperty(xapplication.Display, e.requestor, e._property, XA_ATOM, + 32, PropModeReplace, PByte(@a), Sizeof(TAtom)); // I think last parameter is right? end else begin XChangeProperty(xapplication.Display, e.requestor, e._property, e.target, - 8, 0, PByte(@fpgClipboard.FClipboardText[1]), Length(fpgClipboard.FClipboardText)); + 8, PropModeReplace, PByte(@fpgClipboard.FClipboardText[1]), Length(fpgClipboard.FClipboardText)); end; XSendEvent(xapplication.Display, e.requestor, false, 0, @e ); end; +function IsTopLevel(AWin: TWindow): Boolean; +var + actualtype: TAtom = None; + actualformat: cint; + count, remaining: culong; + data: pchar = nil; +begin + XGetWindowProperty(xapplication.Display, AWin, xapplication.xia_wm_state, 0, 0, + TBool(False), AnyPropertyType, @actualtype, @actualformat, @count, + @remaining, @data); + if data <> nil then + XFree(data); + Result := actualtype <> None; +end; + +{ find toplevel window that contains mouse co-ordinates x, y (co-ordinates are + from root window) } +function FindWindow(ARoot: TWindow; const x, y: cint): TWindow; +var + wattr: TXWindowAttributes; + r, p: TWindow; + children: PWindowArray = nil; + numchildren: cuint = 0; + i: integer; +begin + XGetWindowAttributes(xapplication.Display, ARoot, @wattr); + if (wattr.map_state <> IsUnmapped) and + ((x >= wattr.x) and (x < (wattr.x + wattr.width))) and + ((y >= wattr.y) and (y < (wattr.y + wattr.height))) then + begin + // mapped and inside, is it a top-level? + if (IsTopLevel(ARoot)) then + begin + Result := ARoot; + exit; + end; + if XQueryTree(xapplication.Display, ARoot, @r, @p, @children, @numchildren) <> 0 then + begin + if (numchildren > 0) then + begin + r := None; + { upon return from XQueryTree, children are listed in the current + stacking order, from bottom-most (first) to top-most (last) } + for i := numchildren-1 downto 0 do + begin + r := FindWindow(children^[i], x - wattr.x, y - wattr.y); + if r <> None then + break; + end; + + XFree(children); + if r <> None then + begin + Result := r; + exit; + end; + Result := ARoot; // a fallback Result - we should never get here though + end; + end; + end + else + Result := None; +end; + // File utils function ExtractTargetSymLinkPath(ALink: string): string; begin @@ -573,6 +735,13 @@ end; { TfpgX11Application } +procedure TfpgX11Application.SetDrag(const AValue: TfpgX11Drag); +begin + if Assigned(FDrag) then + FDrag.Free; + FDrag := AValue; +end; + function TfpgX11Application.ConvertShiftState(AState: Cardinal): TShiftState; begin Result := []; @@ -592,11 +761,12 @@ begin Include(Result, ssAlt); if (AState and Mod2Mask) <> 0 then Include(Result, ssNum); - if (AState and Mod4Mask) <> 0 then + { NOTE: Mod3Mask is normally unused for some reason } + if (AState and Mod4Mask) <> 0 then { aka "Windows key" } Include(Result, ssSuper); if (AState and Mod5Mask) <> 0 then Include(Result, ssScroll); - if (AState and (1 shl 13)) <> 0 then + if (AState and AltGrMask) <> 0 then Include(Result, ssAltGr); end; @@ -627,7 +797,7 @@ begin 0..Ord('a')-1, Ord('z')+1..$bf, $f7: Result := KeySym; Ord('a')..Ord('z'), $c0..$f6, $f8..$ff: - Result := KeySym - 32; + Result := KeySym - 32; // ignore case: convert lowercase a-z to A-Z keysyms; $20a0..$20ac: Result := Table_20aX[KeySym]; $fe20: Result := keyTab; $fe50..$fe60: Result := Table_feXX[KeySym]; @@ -685,6 +855,424 @@ begin Length(FComposeBuffer), @Result, @FComposeStatus); end; +function TfpgX11Application.GetDropActionFromAtom(const AAtom: TAtom): TfpgDropAction; +begin + if AAtom = XdndActionCopy then + Result := daCopy + else if AAtom = XdndActionMove then + Result := daMove + else if AAtom = XdndActionLink then + Result := daLink + else + Result := daCopy; { the safe fallback option } +end; + +function TfpgX11Application.GetAtomFromDropAction(const AAction: TfpgDropAction): TAtom; +begin + case AAction of + daCopy: Result := XdndActionCopy; + daMove: Result := XdndActionMove; + daLink: Result := XdndActionLink; + else + Result := XdndActionCopy; { the safe fallback option } + end; +end; + +procedure TfpgX11Application.XdndInit; +begin + XdndAware := XInternAtom(FDisplay, 'XdndAware', False); + XdndTypeList := XInternAtom(FDisplay, 'XdndTypeList', False); + XdndSelection := XInternAtom(FDisplay, 'XdndSelection', False); + + // client messages + XdndEnter := XInternAtom(FDisplay, 'XdndEnter', False); + XdndPosition := XInternAtom(FDisplay, 'XdndPosition', False); + XdndStatus := XInternAtom(FDisplay, 'XdndStatus', False); + XdndLeave := XInternAtom(FDisplay, 'XdndLeave', False); + XdndDrop := XInternAtom(FDisplay, 'XdndDrop', False); + XdndFinished := XInternAtom(FDisplay, 'XdndFinished', False); + + // actions + XdndActionCopy := XInternAtom(FDisplay, 'XdndActionCopy', False); + XdndActionMove := XInternAtom(FDisplay, 'XdndActionMove', False); + XdndActionLink := XInternAtom(FDisplay, 'XdndActionLink', False); + XdndActionAsk := XInternAtom(FDisplay, 'XdndActionAsk', False); + XdndActionPrivate := XInternAtom(FDisplay, 'XdndActionPrivate', False); +end; + +procedure TfpgX11Application.ResetDNDVariables; +var + msgp: TfpgMessageParams; +begin + if FLastDropTarget <> 0 then + begin + fillchar(msgp, sizeof(msgp), 0); + fpgPostMessage(nil, FindWindowByHandle(FLastDropTarget), FPGM_DROPEXIT, msgp); + end; + FDNDTypeList.Clear; + FActionType := 0; + FSrcWinHandle := 0; + FLastDropTarget := 0; + FDropPos.X := 0; + FDropPos.Y := 0; +end; + +procedure TfpgX11Application.HandleDNDenter(ATopLevelWindow: TfpgX11Window; + const ASource: TWindow; const ev: TXEvent); +var + actualtype: TAtom; + actualformat: cint; + count, remaining: culong; + xdndtypes: PAtomArray; + i: integer; + s: TfpgString; + itm: TDNDSrcType; +begin + {$IFDEF DNDDEBUG} + writeln('TfpgX11Application.HandleDNDenter'); + {$ENDIF} + ResetDNDVariables; + FSrcWinHandle := ASource; + FDNDVersion := min(FPG_XDND_VERSION, (ev.xclient.data.l[1] and $FF000000) shr 24); + {$IFDEF DNDDEBUG} + writeln(Format(' ver(%d) check-XdndTypeList(%s) data=%xh,%d,%d,%d,%d', + [ FDNDVersion, + BoolToStr(fpgIsBitSet(ev.xclient.data.l[1], 0), True), + ev.xclient.data.l[0], + ev.xclient.data.l[1], + ev.xclient.data.l[2], + ev.xclient.data.l[3], + ev.xclient.data.l[4] ])); + writeln(Format(' * We will be using XDND v%d protocol *', [FDNDVersion])); + if fpgIsBitSet(ev.xclient.data.l[1], 0) then + writeln(' ** We need to fetch XdndTypeList (>3 types)'); + {$ENDIF} + + // read typelist + if fpgIsBitSet(ev.xclient.data.l[1], 0) then + begin + // now fetch the data + XGetWindowProperty(Display, FSrcWinHandle, + XdndTypeList, 0, 16000, + TBool(False), + AnyPropertyType, + @actualtype, @actualformat, @count, @remaining, + @xdndtypes); + + {$IFDEF DNDDEBUG} + s := XGetAtomName(Display, actualtype); + writeln('Actual fetch -----------------------'); + writeln(Format(' ActualType: %s (%d)', [s, ActualType])); + writeln(' Actualformat = ', ActualFormat); + writeln(' count = ', count); + writeln(' remaining = ', remaining); + {$ENDIF} + + if (actualtype <> XA_ATOM) or (actualformat <> 32) then + count := 0; + end + else + begin + count := 3; + xdndtypes := @ev.xclient.data.l[2]; + end; + + for i := 0 to count-1 do + begin + if xdndtypes^[i] <> 0 then + begin + s := XGetAtomName(FDisplay, xdndtypes^[i]); + {$IFDEF DNDDEBUG} + writeln(Format(' Format #%d = %s (%d)', [i+1, s, xdndtypes^[i]])); + {$ENDIF} + // store each supported data type for later use + itm := TDNDSrcType.Create; + itm.Name := s; + itm.ID := xdndtypes^[i]; + FDNDTypeList.Add(itm); + end; + end; + if count > 3 then + XFree(xdndtypes); +end; + +procedure TfpgX11Application.HandleDNDleave(ATopLevelWindow: TfpgX11Window; + const ASource: TWindow); +var + wg: TfpgWidget; +begin + {$IFDEF DNDDEBUG} + writeln('TfpgX11Application.HandleDNDleave'); + {$ENDIF} + if FLastDropTarget <> 0 then { 0 would be first time in, so there is no last window } + begin + wg := FindWindowByHandle(FLastDropTarget) as TfpgWidget; + if wg.AcceptDrops then + begin + if Assigned(wg.OnDragLeave) then + wg.OnDragLeave(wg); + end; + end; + ResetDNDVariables; +end; + +procedure TfpgX11Application.HandleDNDposition(ATopLevelWindow: TfpgX11Window; const ASource: TWindow; + const x_root: integer; const y_root: integer; const AAction: TAtom; const ATimestamp: x.TTime); +var + Msg: TXEvent; + dx, dy, dx2, dy2: cint; + child: TWindow; + prevchild: TWindow; + + ret_root: TfpgWinHandle; + ret_child: TfpgWinHandle; + root_x, root_y: integer; + child_x, child_y: integer; + + s: string; + i: integer; + lTargetWinHandle: TWindow; + w: TfpgX11Window; + wg: TfpgWidget; + wg2: TfpgWidget; + msgp: TfpgMessageParams; + lDragEnterEvent: TfpgDragEnterEvent; + lDropAction: TfpgDropAction; + lAccept: Boolean; + lMimeChoice: TfpgString; + lMimeList: TStringList; +begin + {$IFDEF DNDDEBUG} + writeln('TfpgX11Application.HandleDNDposition (toplevel window = ', ATopLevelWindow.Name, ')'); + {$ENDIF} + lAccept := False; + FSrcWinHandle := ASource; + FActionType := AAction; + FSrcTimeStamp := ATimeStamp; + lTargetWinHandle := ATopLevelWindow.WinHandle; + lMimeChoice := 'text/plain'; + + {$IFDEF DNDDEBUG} + s := XGetAtomName(FDisplay, AAction); + writeln(Format(' requested action: %s (%d)', [s, AAction])); + writeln(' x_root: ', x_root, ' y_root: ', y_root); + {$ENDIF} + + // Find window under cursor, and position of cursor inside that window + XTranslateCoordinates(FDisplay, XDefaultRootWindow(FDisplay), ATopLevelWindow.WinHandle, + x_root, y_root, @dx, @dy, @ret_child); + child := ret_child; + prevchild := ATopLevelWindow.WinHandle; + while ret_child <> 0 do // If we have chidren, iterate until we reach the top most child + begin + child := ret_child; + dx2 := dx; + dy2 := dy; + XTranslateCoordinates(FDisplay, prevchild, child, + dx2, dy2, @dx, @dy, @ret_child); + prevchild := child; + end; + + if child <> 0 then + w := FindWindowByHandle(child) + else + w := ATopLevelWindow; + + {$IFDEF DNDDEBUG} + writeln(Format('x:%d y:%d child:%d (%x)', [dx, dy, w.WinHandle, w.WinHandle])); + {$ENDIF} + + if Assigned(w) then + begin + lTargetWinHandle := w.WinHandle; + {$IFDEF DNDDEBUG} + writeln('dragging over window: ', w.Name); + {$ENDIF} + if w is TfpgWidget then // TODO: We could use Interfaces here eg: IDragDropEnabled + begin + wg := TfpgWidget(w); + if FLastDropTarget <> lTargetWinHandle then + begin + if FLastDropTarget <> 0 then { 0 would be first time in, so there is no last window } + begin + wg2 := FindWindowByHandle(FLastDropTarget) as TfpgWidget; + if wg2.AcceptDrops then + begin + if Assigned(wg2.OnDragLeave) then + wg2.OnDragLeave(wg2); + end; + fillchar(msgp, sizeof(msgp), 0); + { Notify the widget so it can reset its looks if needed } + fpgPostMessage(nil, wg2, FPGM_DROPEXIT, msgp); + end; + end; + FLastDropTarget := lTargetWinHandle; + if wg.AcceptDrops then + begin + if Assigned(wg.OnDragEnter) then + begin + lDropAction := GetDropActionFromAtom(AAction); + lMimeList := TStringList.Create; + for i := 0 to FDNDTypeList.Count-1 do + lMimeList.Add(TDNDSrcType(FDNDTypeList[i]).Name); + + { Use the first mime-type as the default option presented. The mime-list + should always be from most specific to least specific. } + if lMimeList.Count > 0 then + lMimeChoice := lMimeList[0] + else + {$NOTE We need to replace this message with a resouce string } + raise Exception.Create('fpGUI/X11: no mime types available for DND operation'); + + { TODO: We need to populate the Source parameter. } + wg.OnDragEnter(self, nil, lMimeList, lMimeChoice, lDropAction, lAccept); + lMimeList.Free; + FActionType := GetAtomFromDropAction(lDropAction); + end; + + { Notify widget of drag status, so it can update its look } + if lAccept then + begin + FDropPos.X := dx; + FDropPos.Y := dy; + fillchar(msgp, sizeof(msgp), 0); + msgp.mouse.x := dx; + msgp.mouse.y := dy; + fpgPostMessage(nil, w, FPGM_DROPENTER, msgp); + end; + end; + end; + end; + + FDNDDataType := None; + for i := 0 to FDNDTypeList.Count-1 do + begin + { This list must be from most specific to least specific } + if TDNDSrcType(FDNDTypeList[i]).Name = lMimeChoice then + begin + FDNDDataType := TDNDSrcType(FDNDTypeList[i]).ID; + break; + end; + end; + + // send message to confirm drop will be accepted in specified rectangle + FillChar(Msg, SizeOf(Msg), 0); + Msg.xany._type := ClientMessage; + Msg.xany.display := FDisplay; + Msg.xclient.window := FSrcWinHandle; // source winhandle msg is going to + Msg.xclient.message_type := XdndStatus; + Msg.xclient.format := 32; + + Msg.xclient.data.l[0] := ATopLevelWindow.WinHandle; // always top-level window + if lAccept then + begin + Msg.xclient.data.l[1] := 1; + Msg.xclient.data.l[4] := FActionType; + end + else + begin + Msg.xclient.data.l[1] := 0; + Msg.xclient.data.l[4] := None; + end; + Msg.xclient.data.l[2] := 0; // x & y co-ordinates + Msg.xclient.data.l[3] := 0; // w & h co-ordinates + + XSendEvent(FDisplay, FSrcWinHandle, False, NoEventMask, @Msg); +end; + +procedure TfpgX11Application.HandleDNDdrop(ATopLevelWindow: TfpgX11Window; + const ASource: TWindow; const ATimestamp: x.TTime); +var + Msg: TXEvent; +begin + {$IFDEF DNDDEBUG} + writeln('TfpgX11Application.HandleDNDdrop'); + {$ENDIF} + { TODO: Must XConvertSelection always be called? } + if FDNDDataType <> None then + XConvertSelection(FDisplay, XdndSelection, FDNDDataType, XdndSelection, ATopLevelWindow.FWinHandle, ATimestamp); + + { send message to signal drop is finished } + FillChar(Msg, SizeOf(Msg), 0); + Msg.xany._type := ClientMessage; + Msg.xany.display := FDisplay; + Msg.xclient.window := FSrcWinHandle; // source winhandle msg is going to + Msg.xclient.message_type := XdndFinished; + Msg.xclient.format := 32; + + Msg.xclient.data.l[0] := ATopLevelWindow.FWinHandle; // winhandle of target window + if FDNDDataType = None then + Msg.xclient.data.l[1] := 0 // drop NOT accepted + else + Msg.xclient.data.l[1] := 1; // drop accepted - target can remove the data + Msg.xclient.data.l[2] := FActionType; // this should be the action we accepted + + XSendEvent(FDisplay, FSrcWinHandle, False, NoEventMask, @Msg); +end; + +procedure TfpgX11Application.HandleDNDSelection(const ev: TXEvent); +var + actualtype: TAtom; + actualformat: cint; + count, remaining, dummy: culong; + s: variant; + data: PChar; + wg: TfpgWidget; +begin + {$IFDEF DNDDEBUG} + writeln('TfpgX11Application.HandleDNDselection'); + {$ENDIF} + if FLastDropTarget <> 0 then { 0 would be first time in, so there is no last window } + begin + wg := FindWindowByHandle(FLastDropTarget) as TfpgWidget; + if not wg.AcceptDrops then + Exit; + end; + + { do not get data yet, just see how much there is } + XGetWindowProperty(FDisplay, ev.xselection.requestor, + ev.xselection._property, 0, 0, + TBool(false), + AnyPropertyType, + @actualtype, @actualformat, @count, @remaining, + @data); + + { we handle the DND selection here } + {$IFDEF DNDDEBUG} + s := XGetAtomName(FDisplay, actualtype); + writeln(Format(' ActualType: %s (%d)', [s, ActualType])); + writeln(' Actualformat = ', ActualFormat); + writeln(' count = ', count); + writeln(' remaining = ', remaining); + writeln('-----------------'); + {$ENDIF} + + if remaining > 0 then { we have data - now fetch it! } + begin + XGetWindowProperty(FDisplay, ev.xselection.requestor, + ev.xselection._property, 0, remaining, + TBool(false), + AnyPropertyType, + @actualtype, @actualformat, @count, @dummy, + @data); + s := data; + end; + + if FLastDropTarget <> 0 then { 0 would be first time in, so there is no last window } + begin + wg := FindWindowByHandle(FLastDropTarget) as TfpgWidget; + if wg.AcceptDrops then + begin + if Assigned(wg.OnDragDrop) then + wg.OnDragDrop(nil, nil, FDropPos.X, FDropPos.Y, s); + end; + end; + {$IFDEF DNDDEBUG} + writeln(' s = ', s); + {$ENDIF} + ResetDNDVariables; +end; + function TfpgX11Application.DoGetFontFaceList: TStringList; var pfs: PFcFontSet; @@ -740,11 +1328,16 @@ begin DefaultColorMap := XDefaultColorMap(FDisplay, DefaultScreen); // Initialize atoms - xia_clipboard := XInternAtom(FDisplay, 'CLIPBOARD', longbool(0)); - xia_targets := XInternAtom(FDisplay, 'TARGETS', longbool(0)); - xia_motif_wm_hints := XInternAtom(FDisplay, '_MOTIF_WM_HINTS', longbool(0)); - xia_wm_protocols := XInternAtom(FDisplay, 'WM_PROTOCOLS', longbool(0)); - xia_wm_delete_window := XInternAtom(FDisplay, 'WM_DELETE_WINDOW', longbool(0)); + xia_clipboard := XInternAtom(FDisplay, 'CLIPBOARD', TBool(False)); + xia_targets := XInternAtom(FDisplay, 'TARGETS', TBool(False)); + xia_motif_wm_hints := XInternAtom(FDisplay, '_MOTIF_WM_HINTS', TBool(False)); + xia_wm_protocols := XInternAtom(FDisplay, 'WM_PROTOCOLS', TBool(False)); + xia_wm_delete_window := XInternAtom(FDisplay, 'WM_DELETE_WINDOW', TBool(False)); + xia_wm_state := XInternAtom(FDisplay, 'WM_STATE', TBool(False)); + + { initializa the XDND atoms } + FDNDTypeList := TObjectList.Create; + XdndInit; netlayer := TNETWindowLayer.Create(FDisplay); @@ -764,7 +1357,7 @@ destructor TfpgX11Application.Destroy; begin netlayer.Free; XCloseDisplay(FDisplay); - + FDNDTypeList.Free; inherited Destroy; end; @@ -778,7 +1371,7 @@ var rootw: TfpgWinHandle; parentw: TfpgWinHandle; childs: ^TfpgWinHandle; - cnum: longword; + cnum: cuint; begin childs := nil; if XQueryTree(xapplication.display, wh, @rootw, @parentw, @childs, @cnum) <> 0 then @@ -852,7 +1445,6 @@ var xfd: integer; KeySym: TKeySym; Popup: TfpgWidget; - status: TStatus; needToWait: boolean; // debug purposes only @@ -890,7 +1482,7 @@ var procedure ReportLostWindow(const event: TXEvent); begin {$IFDEF DEBUG} - writeln('fpGFX/X11: ', GetXEventName(event._type), ' can''t find <', + writeln('fpGUI/X11: ', GetXEventName(event._type), ' can''t find <', IntToHex(event.xany.window, 9), '>'); {$ENDIF} end; @@ -1063,6 +1655,19 @@ begin ClosePopups; end; end; + end + else + begin + if Assigned(Drag) then // button released + begin + Drag.SendDNDDrop; + { TODO: Start timeout in case XdndFinished is not received, so we can free Drag } +// writeln('Freeing Drag Object'); + if not Drag.FDropAccepted then + begin + FreeAndNil(FDrag); + end; + end; end; w := FindWindowByHandle(ev.xbutton.window); // restore w @@ -1143,34 +1748,41 @@ begin until not XCheckTypedWindowEvent(display, ev.xmotion.window, X.MotionNotify, @ev); w := FindWindowByHandle(ev.xmotion.window); if not Assigned(w) then - ReportLostWindow(ev); - if xapplication.TopModalForm <> nil then - begin - ew := TfpgX11Window(WidgetParentForm(TfpgWidget(w))); - if (ew <> nil) and (xapplication.TopModalForm <> ew) and (waUnblockableMessages in ew.WindowAttributes = False) then - blockmsg := true; - end; - if not blockmsg then + ReportLostWindow(ev) + else begin - msgp.mouse.x := ev.xmotion.x; - msgp.mouse.y := ev.xmotion.y; - msgp.mouse.Buttons := (ev.xmotion.state and $FF00) shr 8; - msgp.mouse.shiftstate := ConvertShiftState(ev.xmotion.state); - fpgPostMessage(nil, FindWindowByHandle(ev.xmotion.window), FPGM_MOUSEMOVE, msgp); + if Assigned(Drag) then + begin + if ((ev.xmotion.state and $FF00) shr 8) = MOUSE_LEFT then + Drag.Dragging(ev); + end; + if xapplication.TopModalForm <> nil then + begin + ew := TfpgX11Window(WidgetParentForm(TfpgWidget(w))); + if (ew <> nil) and (xapplication.TopModalForm <> ew) and (waUnblockableMessages in ew.WindowAttributes = False) then + blockmsg := true; + end; + if not blockmsg then + begin + msgp.mouse.x := ev.xmotion.x; + msgp.mouse.y := ev.xmotion.y; + msgp.mouse.Buttons := (ev.xmotion.state and $FF00) shr 8; + msgp.mouse.shiftstate := ConvertShiftState(ev.xmotion.state); + fpgPostMessage(nil, w, FPGM_MOUSEMOVE, msgp); + end; end; end; - // message blockings for modal windows + { one use is for message blockings for modal windows, or XDND etc. } X.ClientMessage: begin - w := FindWindowByBackupHandle(ev.xclient.window); + w := FindWindowByHandle(ev.xclient.window); if not Assigned(w) then ReportLostWindow(ev); // WM_PROTOCOLS message if Assigned(w) and (ev.xclient.message_type = xia_wm_protocols) then begin - //WriteLn(XGetAtomName(FDisplay, TAtom(ev.xclient.data.l[0]))); if (ev.xclient.data.l[0] = netlayer.NetAtom[naWM_PING]) then begin // always respond to pings or the wm will kill us @@ -1182,14 +1794,86 @@ begin begin // This is ugly!!!!!!!!!!!!!!! ew := TfpgX11Window(WidgetParentForm(TfpgWidget(w))); - if (ew <> nil) and (xapplication.TopModalForm <> ew) and (waUnblockableMessages in ew.WindowAttributes = False) then + if (ew <> nil) and (TopModalForm <> ew) and (waUnblockableMessages in ew.WindowAttributes = False) then blockmsg := true; end; if not blockmsg then fpgPostMessage(nil, FindWindowByHandle(ev.xclient.window), FPGM_CLOSE); end; - end; // WM_PROTOCOLS + end + { XDND protocol - XdndEnter } + else if Assigned(w) and (ev.xclient.message_type = XdndEnter) then + begin + {$IFDEF DNDDEBUG} + writeln('ClientMessage.XdndEnter event received'); + {$ENDIF} + HandleDNDenter(w, ev.xclient.data.l[0], ev); + end + { XDND protocol - XdndPosition } + else if Assigned(w) and (ev.xclient.message_type = XdndPosition) then + begin + {$IFDEF DNDDEBUG} + writeln('ClientMessage.XdndPosition event received'); + {$ENDIF} + HandleDNDposition(w, // top level window + ev.xclient.data.l[0], // Source window + (ev.xclient.data.l[2] and $FFFF0000) shr 16, // x_root + ev.xclient.data.l[2] and $0000FFFF, // y_root + ev.xclient.data.l[4], // action + ev.xclient.data.l[3]); // timestamp + end + { XDND protocol - XdndStatus } + else if Assigned(w) and (ev.xclient.message_type = XdndStatus) then + begin + {$IFDEF DNDDEBUG} + writeln('ClientMessage.XdndStatus event received'); + {$ENDIF} + if Assigned(Drag) then + begin + Drag.HandleDNDStatus( + ev.xclient.data.l[0], + ev.xclient.data.l[1] and 1, + fpgRect( + (ev.xclient.data.l[2] shr 16) and $FFFF, + ev.xclient.data.l[2] and $FFFF, + (ev.xclient.data.l[3] shr 16) and $FFFF, + ev.xclient.data.l[3] and $FFFF), + ev.xclient.data.l[4]); + end; + end + { XDND protocol - XdndLeave } + else if Assigned(w) and (ev.xclient.message_type = XdndLeave) then + begin + {$IFDEF DNDDEBUG} + writeln('ClientMessage.XdndLeave event received'); + {$ENDIF} + HandleDNDleave(w, ev.xclient.data.l[0]); + end + { XDND protocol - XdndDrop } + else if Assigned(w) and (ev.xclient.message_type = XdndDrop) then + begin + {$IFDEF DNDDEBUG} + writeln('ClientMessage.XdndDrop event received'); + writeln(' ClassName = ', w.ClassName); + writeln(' Name = ', w.Name); + {$ENDIF} + HandleDNDdrop(w, ev.xclient.data.l[0], ev.xclient.data.l[2]); + end + { XDND protocol - XdndFinished } + else if Assigned(w) and (ev.xclient.message_type = XdndFinished) then + begin + {$IFDEF DNDDEBUG} + writeln('ClientMessage.XdndFinished event received'); + {$ENDIF} + if Assigned(Drag) then + begin + {$IFDEF DNDDEBUG} + writeln('Freeing Drag Object'); + {$ENDIF} + FreeAndNil(FDrag); + end; + end; end; X.ConfigureNotify: @@ -1230,12 +1914,35 @@ begin X.SelectionNotify: begin - ProcessSelection(ev); + { Handle XDND data } + if ev.xselection._property = XdndSelection then + begin + {$IFDEF DNDDEBUG} + writeln('XdndSelection message received'); + {$ENDIF} + HandleDNDSelection(ev); + end + else { Handle X Selections - clipboard data } + ProcessSelection(ev); end; X.SelectionRequest: begin - ProcessSelectionRequest(ev); + if ev.xselectionrequest.selection = XdndSelection then + begin + {$IFDEF DNDDEBUG} + writeln('found a XdndSelection request'); + {$ENDIF} + if Assigned(Drag) then + Drag.HandleSelectionRequest(ev); + end + else + begin + {$IFDEF DEBUG} + writeln('found a clipboard selection request'); + {$ENDIF} + ProcessSelectionRequest(ev); + end; end; X.SelectionClear: @@ -1265,6 +1972,18 @@ begin w := FindWindowByHandle(ev.xmap.window); if w <> nil then Include(w.FWinFlags, xwsfMapped); + + { X11 is too efficient, so new windows don't need a OnResize when mapped, + but because Windows GDI does so, we want the same events under X11. + Lets fake one. } + if w <> nil then + begin + msgp.rect.Left := w.Left; + msgp.rect.Top := w.Top; + msgp.rect.Width := w.Width; + msgp.rect.Height := w.Height; + fpgPostMessage(nil, w, FPGM_RESIZE, msgp); + end; end; X.UnmapNotify: @@ -1303,7 +2022,7 @@ begin end; else - WriteLn('fpGFX/X11: Unhandled X11 event received: ', GetXEventName(ev._type)); + WriteLn('fpGUI/X11: Unhandled X11 event received: ', GetXEventName(ev._type)); end; end; @@ -1425,6 +2144,12 @@ begin fpgApplication.netlayer.WindowSetSupportPING(FWinHandle); XFree(WMHints); + + { we need to set the XdndAware property } + if QueueEnabledDrops then + begin + DoDNDEnabled(True); + end; end; hints.flags := 0; @@ -1476,6 +2201,8 @@ begin lmwh := 0; if fpgApplication.PrevModalForm <> nil then lmwh := TfpgX11Window(fpgApplication.PrevModalForm).WinHandle + else if FocusRootWidget <> nil then + lmwh := TfpgX11Window(FocusRootWidget).WinHandle else if fpgApplication.MainForm <> nil then lmwh := TfpgX11Window(fpgApplication.MainForm).WinHandle; if lmwh <> 0 then @@ -1494,7 +2221,7 @@ begin if ((FWindowType = wtWindow) or (FWindowType = wtModalForm)) and (waBorderless in FWindowAttributes) and not (waX11SkipWMHints in FWindowAttributes) then begin prop := X.None; - prop := XInternAtom(xapplication.display, '_MOTIF_WM_INFO', longbool(0)); + prop := XInternAtom(xapplication.display, '_MOTIF_WM_INFO', TBool(False)); if prop = X.None then begin // writeln('Window Manager does not support MWM hints. Bypassing window manager control for borderless window.'); @@ -1633,6 +2360,8 @@ begin end; case FMouseCursor of + mcDefault: shape := XC_left_ptr; + mcArrow: shape := XC_arrow; mcSizeEW: shape := XC_sb_h_double_arrow; mcSizeNS: shape := XC_sb_v_double_arrow; mcIBeam: shape := XC_xterm; @@ -1644,6 +2373,8 @@ begin mcCross: shape := XC_crosshair; mcHourGlass: shape := XC_watch; mcHand: shape := XC_hand2; + mcDrag: shape := XC_target; + mcNoDrop: shape := XC_pirate; else shape := XC_left_ptr; //XC_arrow; end; @@ -1655,6 +2386,25 @@ begin FMouseCursorIsDirty := False; end; +procedure TfpgX11Window.DoDNDEnabled(const AValue: boolean); +begin + // notify XDND protocol that we can handle DND + if AValue then + begin + if HasHandle then + XChangeProperty(xapplication.Display, WinHandle, xapplication.XdndAware, XA_ATOM, 32, PropModeReplace, @FPG_XDND_VERSION, 1) + else + QueueEnabledDrops := True; // we need to do this once we have a winhandle + end + else + XDeleteProperty(xapplication.Display, WinHandle, xapplication.XdndAware); +end; + +procedure TfpgX11Window.DoAcceptDrops(const AValue: boolean); +begin + { TODO : Remove EnableDrops, then recurse from here to parent top level from, and set XDNDAware property for form. } +end; + procedure TfpgX11Window.DoSetWindowTitle(const ATitle: string); var tp: TXTextProperty; @@ -1680,6 +2430,7 @@ begin inherited Create(AOwner); FWinHandle := 0; FBackupWinHandle := 0; + QueueEnabledDrops := False; end; procedure TfpgX11Window.ActivateWindow; @@ -2358,7 +3109,7 @@ procedure TfpgX11Clipboard.DoSetText(const AValue: TfpgString); begin FClipboardText := AValue; XSetSelectionOwner(xapplication.Display, xapplication.xia_clipboard, - FClipboardWndHandle, 0); + FClipboardWndHandle, CurrentTime); end; procedure TfpgX11Clipboard.InitClipboard; @@ -2450,6 +3201,321 @@ begin end; +{ TfpgX11Drag } + +procedure TfpgX11Drag.SetTypeListProperty; +begin + XChangeProperty(xapplication.Display, FSource.WinHandle, + xapplication.XdndTypeList, XA_ATOM, 32, + PropModeReplace, @FMimeTypesArray[0], Length(FMimeTypesArray)); +end; + +procedure TfpgX11Drag.InitializeMimeTypesToAtoms; +var + sl: TStringList; + i: integer; + a: TAtom; + s: PChar; +begin + { free old array } + SetLength(FMimeTypesArray, 0); + { set size of new array. Extra element for the terminating x.None value } + SetLength(FMimeTypesArray, FMimedata.Count+1); + + sl := FMimeData.Formats as TStringList; + try + for i := 0 to FMimeData.Count-1 do + begin + s := PChar(sl[i]); + a := XInternAtom(xapplication.Display, s, TBool(False)); + FMimeTypesArray[i] := a; + end; + FMimeTypesArray[i+1] := x.None; // termination value + finally + sl.Free; + end; +end; + +procedure TfpgX11Drag.Dragging(ev: TXEvent); +var + dx, dy: cint; + child: TWindow; + lTarget: TWindow; +begin + lTarget := FindWindow(ev.xmotion.root, ev.xmotion.x_root, ev.xmotion.y_root); + if FLastTarget <> lTarget then + begin + if FLastTarget <> 0 then { meaning we had a target before } + SendDNDLeave(FLastTarget); + + FLastTarget := lTarget; + FTargetIsDNDAware := IsDNDAware(lTarget); + {$IFDEF DNDDEBUG} + writeln('IsDNDAware = ', BoolToStr(FTargetIsDNDAware, True)); + {$ENDIF} + FStatusPending := False; + FDropAccepted := False; + FAcceptedAction := X.None; + + if FTargetIsDNDAware then + SendDNDEnter(FLastTarget); + end; + + if FTargetIsDNDAware and not FStatusPending then + begin + SendDNDPosition(FLastTarget, ev.xmotion.x_root, ev.xmotion.y_root, + FProposedAction, ev.xmotion.time); + // this is to avoid sending XdndPosition messages over and over + // if the target is not responding + FStatusPending := True; + end; +end; + +function TfpgX11Drag.IsDNDAware(win: TWindow): boolean; +var + actualtype: TAtom; + actualformat: cint; + count, remaining, dummy: culong; + s: TfpgString; + data: PChar; + lversion: culong; +begin + if (win = None) then + begin + Result := False; + exit; + end; + XGetWindowProperty(xapplication.Display, win, xapplication.XdndAware, 0, $8000000, + TBool(False), XA_ATOM, @actualtype, @actualformat, @count, @remaining, @data); + + if count = 0 then + begin + if data <> nil then + XFree(data); + Result := False; + exit; + end; + + lversion := Integer(data[0]); + FUseVersion := min(Integer(FPG_XDND_VERSION), Integer(lversion)); + Result := True; + + {$IFDEF DNDDEBUG} + writeln(Format('IsDNDAware theirs:%d ours:%d using:%d', [lversion, FPG_XDND_VERSION, FUseVersion])); + {$ENDIF} +end; + +procedure TfpgX11Drag.SendDNDLeave(ATarget: TWindow); +var + xev: TXEvent; +begin + xev.xany._type := X.ClientMessage; + xev.xany.display := xapplication.Display; + xev.xclient.window := ATarget; + xev.xclient.message_type := xapplication.XdndLeave; + xev.xclient.format := 32; + + xev.xclient.data.l[0] := FSource.WinHandle; + xev.xclient.data.l[1] := 0; + + xev.xclient.data.l[2] := 0; + xev.xclient.data.l[3] := 0; + xev.xclient.data.l[4] := 0; + + XSendEvent(xapplication.Display, ATarget, False, NoEventMask, @xev); +end; + +procedure TfpgX11Drag.SendDNDEnter(ATarget: TWindow); +var + xev: TXEvent; + i, n: integer; + s: PChar; + sl: TStrings; +begin + xev.xany._type := X.ClientMessage; + xev.xany.display := xapplication.Display; + xev.xclient.window := ATarget; + xev.xclient.message_type := xapplication.XdndEnter; + xev.xclient.format := 32; + + xev.xclient.data.l[0] := FSource.WinHandle; + + n := FMimeData.Count; + + if n > 3 then + i := 1 + else + i := 0; + xev.xclient.data.l[1] := i or (FUseVersion shl 24); + + if n <= 3 then + begin + for i := 0 to 2 do + begin + if i < n then + xev.xclient.data.l[2+i] := FMimeTypesArray[i] + else + xev.xclient.data.l[2+i] := x.None; + end; + end + else + begin + { available types are in the XdndTypeList property instead } + xev.xclient.data.l[2] := x.None; + xev.xclient.data.l[3] := x.None; + xev.xclient.data.l[4] := x.None; + end; + + XSendEvent(xapplication.Display, ATarget, False, NoEventMask, @xev); +end; + +procedure TfpgX11Drag.SendDNDPosition(ATarget: TWindow; x_root: cint; + y_root: cint; AAction: TAtom; ATime: X.TTime); +var + xev: TXEvent; +begin + xev.xany._type := X.ClientMessage; + xev.xany.display := xapplication.Display; + xev.xclient.window := ATarget; + xev.xclient.message_type := xapplication.XdndPosition; + xev.xclient.format := 32; + + xev.xclient.data.l[0] := FSource.WinHandle; + xev.xclient.data.l[1] := 0; + + xev.xclient.data.l[2] := (x_root shl 16) or y_root; // root coordinates + xev.xclient.data.l[3] := ATime; // timestamp for retrieving data + xev.xclient.data.l[4] := AAction; // requested action + + XSendEvent(xapplication.Display, ATarget, False, NoEventMask, @xev); +end; + +procedure TfpgX11Drag.SendDNDDrop; +var + xev: TXEvent; +begin + if FDropAccepted then + begin + xev.xany._type := X.ClientMessage; + xev.xany.display := xapplication.Display; + xev.xclient.window := FLastTarget; + xev.xclient.message_type := xapplication.XdndDrop; + xev.xclient.format := 32; + + xev.xclient.data.l[0] := FSource.WinHandle; // from; + xev.xclient.data.l[1] := 0; // reserved + xev.xclient.data.l[2] := CurrentTime; // timestamp + xev.xclient.data.l[3] := 0; + xev.xclient.data.l[4] := 0; + + XSendEvent(xapplication.Display, FLastTarget, False, NoEventMask, @xev); + end + else + SendDNDLeave(FLastTarget); + FSource.MouseCursor := mcDefault; +end; + +procedure TfpgX11Drag.HandleDNDStatus(ATarget: TWindow; AAccept: integer; + ARect: TfpgRect; AAction: TAtom); +begin + if ATarget = FLastTarget then + begin + FStatusPending := False; + if AAccept = 1 then + begin + FDropAccepted := True; + FAcceptedAction := AAction; + FSource.MouseCursor := mcDrag; + end + else + begin + FDropAccepted := False; + FAcceptedAction := X.None; { AAction should equal None, but lets just make sure } + FSource.MouseCursor := mcNoDrop; + end; + end; + { TODO: If we waited to long, we have a timeout } +end; + +procedure TfpgX11Drag.HandleSelectionRequest(ev: TXEvent); +var + e: TXSelectionEvent; + s: string; + v: variant; +begin + e._type := SelectionNotify; + e.requestor := ev.xselectionrequest.requestor; + e.selection := ev.xselectionrequest.selection; + e.target := ev.xselectionrequest.target; + e.time := ev.xselectionrequest.time; + e._property := ev.xselectionrequest._property; + + s := XGetAtomName(xapplication.Display, e.target); + if FMimeData.HasFormat(s) then + begin + if s = 'text/plain' then + XChangeProperty(xapplication.Display, e.requestor, e._property, e.target, + 8, PropModeReplace, PByte(@FMimeData.Text[1]), Length(FMimeData.Text)) + else if s = 'text/html' then + begin + XChangeProperty(xapplication.Display, e.requestor, e._property, e.target, + 8, PropModeReplace, PByte(@FMimeData.HTML[1]), Length(FMimeData.HTML)) + end + else + begin + { transfering as raw bytes of data } + v := FMimeData.GetData(s); + s := v; + XChangeProperty(xapplication.Display, e.requestor, e._property, e.target, + 8, PropModeReplace, PByte(@s[1]), Length(s)); + end; + + end; + + XSendEvent(xapplication.Display, e.requestor, false, NoEventMask, @e ); +end; + +function TfpgX11Drag.GetSource: TfpgX11Window; +begin + Result := FSource; +end; + +destructor TfpgX11Drag.Destroy; +begin + {$IFDEF DNDDEBUG} + writeln('TfpgX11Drag.Destroy '); + {$ENDIF} + FSource.MouseCursor := mcDefault; + XDeleteProperty(xapplication.Display, FSource.WinHandle, xapplication.XdndAware); + XDeleteProperty(xapplication.Display, FSource.WinHandle, xapplication.XdndTypeList); + SetLength(FMimeTypesArray, 0); + inherited Destroy; +end; + +function TfpgX11Drag.Execute(const ADropActions: TfpgDropActions; const ADefaultAction: TfpgDropAction): TfpgDropAction; +var + win: TWindow; +begin + if FDragging then + Result := daIgnore + else + begin + FDragging := True; + xia_plain_text := XInternAtom(xapplication.Display, 'text/plain', TBool(False)); + FProposedAction := xapplication.GetAtomFromDropAction(ADefaultAction); + xapplication.Drag := self; + + XSetSelectionOwner(xapplication.Display, xapplication.XdndSelection, FSource.WinHandle, CurrentTime); + win := XGetSelectionOwner(xapplication.Display, xapplication.XdndSelection); + if win <> FSource.WinHandle then + raise Exception.Create('fpGUI/X11: Application failed to aquire selection owner status'); + + InitializeMimeTypesToAtoms; + if FMimeData.Count > 3 then + SetTypeListProperty; + end; +end; + initialization xapplication := nil; diff --git a/src/fpmake.pas b/src/fpmake.pp index 5afc82ea..a99975a0 100644 --- a/src/fpmake.pas +++ b/src/fpmake.pp @@ -42,13 +42,16 @@ program fpmake; uses sysutils, fpmkunit; +const + {$I VERSION_FILE.inc} + var T: TTarget; P: TPackage; begin with Installer do begin P := AddPackage('fpgui'); - P.Version := '0.6.3'; + P.Version := FPGUI_VERSION; P.Author := 'Graeme Geldenhuys'; P.Email := 'graemeg@gmail.com'; P.License := 'Modified LGPL'; @@ -62,7 +65,7 @@ begin if we set the package name to fpgui as above. This base install dir can be overridden by passing -B to fpmake. The line below will cause the units to be output in ../lib/<cpu-os>/fpgui } - Defaults.UnitInstallDir := Format('../lib/%s-%s/', [CurrentCPU, CurrentOS]); +// Defaults.UnitInstallDir := Format('../lib/%s-%s/', [CurrentCPU, CurrentOS]); { If you installed FPC to a non-standard location, you need to specify where fpmake can find the compiler and RTL units. You can pass that @@ -72,9 +75,10 @@ begin // else // Defaults.GlobalUnitDir := Format('c:\fpc\2.2.3\units\%s-%s', [CurrentCPU, CurrentOS]); - if Defaults.OS in AllUnixOSes - then Defaults.Options := Defaults.Options + '-dX11' - else Defaults.Options := Defaults.Options + '-dGDI'; + if Defaults.OS in AllUnixOSes then + Defaults.Options.Add('-dX11') + else + Defaults.Options.Add('-dGDI'); P.SourcePath.Add('corelib'); P.SourcePath.Add('corelib/x11', AllUnixOSes); @@ -88,64 +92,81 @@ begin P.UnitPath.Add('gui'); P.UnitPath.Add('gui/db'); + P.IncludePath.Add('.'); P.IncludePath.Add('corelib'); P.IncludePath.Add('corelib/x11', AllUnixOSes); P.IncludePath.Add('corelib/gdi', AllWindowsOSes); P.IncludePath.Add('gui'); { todo: add unit and include dependency for all } +{ P.Sources.AddSrcFiles('corelib/*.pas'); P.Sources.AddSrcFiles('gui/*.pas'); - if Defaults.OS in AllUnixOSes - then P.Sources.AddSrcFiles('corelib/x11/*.pas') - else P.Sources.AddSrcFiles('corelib/gdi/*.pas'); - - { x11 and gdi common } -// if Defaults.OS in AllUnixOSes -// then - P.Targets.AddUnit('corelib/x11/fpg_impl.pas', AllWindowsOSes); -// else - P.Targets.AddUnit('corelib/gdi/fpg_impl.pas', AllUnixOSes); -// T := P.Targets.AddUnit('fpg_impl.pas'); - - { corelib/x11 } - T := P.Targets.AddUnit('fpg_keyconv_x11.pas', AllUnixOSes); - T := P.Targets.AddUnit('fpg_netlayer_x11.pas', AllUnixOSes); - T := P.Targets.AddUnit('fpg_x11.pas', AllUnixOSes); -{ with T.Dependencies do begin - AddUnit('fpg_xft_x11'); - AddUnit('fpg_netlayer_x11'); - AddUnit('fpg_base'); - AddUnit('fpg_impl'); - end; } - T := P.Targets.AddUnit('fpg_xft_x11.pas', AllUnixOSes); - - { corelib/gdi } - T := P.Targets.AddUnit('fpg_gdi.pas', AllWindowsOSes); + if Defaults.OS in AllUnixOSes then + P.Sources.AddSrcFiles('corelib/x11/*.pas') + else + P.Sources.AddSrcFiles('corelib/gdi/*.pas'); +} { corelib } T := P.Targets.AddUnit('fpg_base.pas'); + T.Dependencies.AddInclude('keys.inc'); + T.Dependencies.AddInclude('predefinedcolors.inc'); T := P.Targets.AddUnit('fpg_imagelist.pas'); T := P.Targets.AddUnit('fpg_popupwindow.pas'); T := P.Targets.AddUnit('fpg_translations.pas'); T := P.Targets.AddUnit('fpg_cmdlineparams.pas'); T := P.Targets.AddUnit('fpg_imgfmt_bmp.pas'); + T := P.Targets.AddUnit('fpg_imgfmt_jpg.pas'); T := P.Targets.AddUnit('fpg_stdimages.pas'); + T.Dependencies.AddInclude('stdimages.inc'); T := P.Targets.AddUnit('fpg_utils.pas'); + T.Dependencies.AddInclude('fpg_utils_impl.inc', AllUnixOSes); + T.Dependencies.AddInclude('fpg_utils_impl.inc', AllWindowsOSes); + T := P.Targets.AddUnit('fpg_imgutils.pas'); T := P.Targets.AddUnit('fpg_command_intf.pas'); T := P.Targets.AddUnit('fpg_main.pas'); + T.Dependencies.AddInclude('VERSION_FILE.inc'); + T.Dependencies.AddInclude('fpg_msgqueue.inc'); T := P.Targets.AddUnit('fpg_stringhashlist.pas'); T := P.Targets.AddUnit('fpg_widget.pas'); T := P.Targets.AddUnit('fpg_constants.pas'); + T.Dependencies.AddInclude('lang_en.inc'); + T.Dependencies.AddInclude('lang_af.inc'); + T.Dependencies.AddInclude('lang_de.inc'); + T.Dependencies.AddInclude('lang_es.inc'); + T.Dependencies.AddInclude('lang_fr.inc'); + T.Dependencies.AddInclude('lang_it.inc'); + T.Dependencies.AddInclude('lang_pt.inc'); + T.Dependencies.AddInclude('lang_ru.inc'); T.ResourceStrings := True; - T := P.Targets.AddUnit('fpg_strings.pas'); +// T := P.Targets.AddUnit('fpg_strings.pas'); // this unit is not used in fpGUI T := P.Targets.AddUnit('fpg_wuline.pas'); T := P.Targets.AddUnit('fpg_extinterpolation.pas'); T := P.Targets.AddUnit('fpg_pofiles.pas'); T := P.Targets.AddUnit('fpg_stringutils.pas'); + T := P.Targets.AddUnit('fpg_extgraphics.pas'); + + + { corelib/x11 } + T := P.Targets.AddUnit('fpg_keyconv_x11.pas', AllUnixOSes); + T := P.Targets.AddUnit('fpg_netlayer_x11.pas', AllUnixOSes); + T := P.Targets.AddUnit('fpg_xft_x11.pas', AllUnixOSes); + T := P.Targets.AddUnit('fpg_impl.pas', AllUnixOSes); + T := P.Targets.AddUnit('fpg_x11.pas', AllUnixOSes); + T.Dependencies.AddUnit('fpg_xft_x11'); + T.Dependencies.AddUnit('fpg_netlayer_x11'); + T.Dependencies.AddUnit('fpg_base'); + T.Dependencies.AddUnit('fpg_impl'); + T := P.Targets.AddUnit('fpg_interface.pas', AllUnixOSes); + + + { corelib/gdi } + T := P.Targets.AddUnit('fpg_impl.pas', AllWindowsOSes); + T := P.Targets.AddUnit('fpg_gdi.pas', AllWindowsOSes); + T.Dependencies.AddInclude('fpg_keys_gdi.inc', AllWindowsOSes); + T := P.Targets.AddUnit('fpg_interface.pas', AllWindowsOSes); - { corelib include files } -// T := P.Sources.AddSrc('keys.inc'); { gui/db } T := P.Targets.AddUnit('fpgui_db.pas'); @@ -169,6 +190,14 @@ begin T := P.Targets.AddUnit('fpg_trackbar.pas'); T := P.Targets.AddUnit('fpg_button.pas'); T := P.Targets.AddUnit('fpg_dialogs.pas'); + T.Dependencies.AddInclude('charmapdialog.inc'); + T.Dependencies.AddInclude('colordialog.inc'); + T.Dependencies.AddInclude('inputquerydialog.inc'); + T.Dependencies.AddInclude('messagedialog.inc'); + T.Dependencies.AddInclude('newdirdialog.inc'); + T.Dependencies.AddInclude('promptuserdialog.inc'); + T.Dependencies.AddInclude('selectdirdialog.inc'); + T.Dependencies.AddInclude('logo.inc'); T := P.Targets.AddUnit('fpg_gauge.pas'); T := P.Targets.AddUnit('fpg_iniutils.pas'); T := P.Targets.AddUnit('fpg_memo.pas'); @@ -182,6 +211,10 @@ begin T := P.Targets.AddUnit('fpg_menu.pas'); T := P.Targets.AddUnit('fpg_progressbar.pas'); T := P.Targets.AddUnit('fpg_style.pas'); + T := P.Targets.AddUnit('fpg_spinedit.pas'); + T := P.Targets.AddUnit('fpg_colorwheel.pas'); + T := P.Targets.AddUnit('fpg_colormapping.pas'); + T := P.Targets.AddUnit('fpg_editbtn.pas'); Run; end; diff --git a/src/gui/colordialog.inc b/src/gui/colordialog.inc index 6914257e..93d8d731 100644 --- a/src/gui/colordialog.inc +++ b/src/gui/colordialog.inc @@ -25,10 +25,10 @@ type TfpgColorSelectDialog = class(TfpgBaseDialog) private {@VFD_HEAD_BEGIN: ColorSelectDialog} - PageControl1: TfpgPageControl; - TabSheet1: TfpgTabSheet; - TabSheet2: TfpgTabSheet; - ComboBox1: TfpgComboBox; + pcColorSelect: TfpgPageControl; + tsColorWheel: TfpgTabSheet; + tsColorNames: TfpgTabSheet; + cbColorPalette: TfpgComboBox; ColorListBox1: TfpgColorListBox; Label1: TfpgLabel; Label2: TfpgLabel; @@ -43,11 +43,13 @@ type pnlColorPreview: TfpgBevel; {@VFD_HEAD_END: ColorSelectDialog} FViaRGB: Boolean; // to prevent recursive changes - function GetSelectedColor: TfpgColor; - procedure SetSelectedColor(const AValue: TfpgColor); - procedure ColorChanged(Sender: TObject); - procedure RGBChanged(Sender: TObject); - procedure UpdateRGBComponents; + function GetSelectedColor: TfpgColor; + procedure SetSelectedColor(const AValue: TfpgColor); + procedure ColorChanged(Sender: TObject); + procedure RGBChanged(Sender: TObject); + procedure UpdateRGBComponents; + procedure PopulatePaletteColorCombo; + procedure cbColorPaletteChange(Sender: TObject); public constructor Create(AOwner: TComponent); override; procedure AfterCreate; override; @@ -71,7 +73,7 @@ begin try frm.ColorWheel.SetSelectedColor(APresetColor); if frm.ShowModal = mrOK then - Result := frm.ValueBar.SelectedColor; + Result := frm.SelectedColor; finally frm.Free; end; @@ -81,12 +83,15 @@ end; function TfpgColorSelectDialog.GetSelectedColor: TfpgColor; begin - // + if pcColorSelect.ActivePageIndex = 0 then + Result := ValueBar.SelectedColor + else + Result := ColorListBox1.Color; end; procedure TfpgColorSelectDialog.SetSelectedColor(const AValue: TfpgColor); begin - // + ColorWheel.SetSelectedColor(AValue); end; procedure TfpgColorSelectDialog.ColorChanged(Sender: TObject); @@ -123,6 +128,27 @@ begin edB.Value := rgb.Blue; end; +procedure TfpgColorSelectDialog.PopulatePaletteColorCombo; +begin + cbColorPalette.Items.Clear; + cbColorPalette.Items.Add('cpStandardColors'); + cbColorPalette.Items.Add('cpSystemColors'); + cbColorPalette.Items.Add('cpWebColors'); + cbColorPalette.FocusItem := 0; + cbColorPalette.OnChange := @cbColorPaletteChange; +end; + +procedure TfpgColorSelectDialog.cbColorPaletteChange(Sender: TObject); +begin + if cbColorPalette.Text = 'cpStandardColors' then + ColorListBox1.ColorPalette := cpStandardColors + else if cbColorPalette.Text = 'cpSystemColors' then + ColorListBox1.ColorPalette := cpSystemColors + else + ColorListBox1.ColorPalette := cpWebColors; + ColorListBox1.SetFocus; +end; + constructor TfpgColorSelectDialog.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -135,15 +161,15 @@ begin {%region 'Auto-generated GUI code' -fold} {@VFD_BODY_BEGIN: ColorSelectDialog} Name := 'ColorSelectDialog'; - SetPosition(316, 186, 328, 375); + SetPosition(340, 164, 328, 375); WindowTitle := 'Color Select Dialog'; Hint := ''; WindowPosition := wpOneThirdDown; - PageControl1 := TfpgPageControl.Create(self); - with PageControl1 do + pcColorSelect := TfpgPageControl.Create(self); + with pcColorSelect do begin - Name := 'PageControl1'; + Name := 'pcColorSelect'; SetPosition(4, 4, 320, 332); Anchors := [anLeft,anRight,anTop,anBottom]; ActivePageIndex := 0; @@ -151,26 +177,26 @@ begin TabOrder := 1; end; - TabSheet1 := TfpgTabSheet.Create(PageControl1); - with TabSheet1 do + tsColorWheel := TfpgTabSheet.Create(pcColorSelect); + with tsColorWheel do begin - Name := 'TabSheet1'; + Name := 'tsColorWheel'; SetPosition(3, 24, 314, 305); Text := 'Color Wheel'; end; - TabSheet2 := TfpgTabSheet.Create(PageControl1); - with TabSheet2 do + tsColorNames := TfpgTabSheet.Create(pcColorSelect); + with tsColorNames do begin - Name := 'TabSheet2'; + Name := 'tsColorNames'; SetPosition(3, 24, 314, 305); Text := 'Predefined'; end; - ComboBox1 := TfpgComboBox.Create(TabSheet2); - with ComboBox1 do + cbColorPalette := TfpgComboBox.Create(tsColorNames); + with cbColorPalette do begin - Name := 'ComboBox1'; + Name := 'cbColorPalette'; SetPosition(8, 24, 299, 22); Anchors := [anLeft,anRight,anTop]; FontDesc := '#List'; @@ -178,21 +204,19 @@ begin TabOrder := 1; end; - ColorListBox1 := TfpgColorListBox.Create(TabSheet2); + ColorListBox1 := TfpgColorListBox.Create(tsColorNames); with ColorListBox1 do begin Name := 'ColorListBox1'; SetPosition(8, 72, 299, 224); Anchors := [anLeft,anRight,anTop,anBottom]; - ColorPalette := cpStandardColors; + Color := TfpgColor($00FFFF); FontDesc := '#List'; Hint := ''; - HotTrack := False; - PopupFrame := False; TabOrder := 2; end; - Label1 := TfpgLabel.Create(TabSheet2); + Label1 := TfpgLabel.Create(tsColorNames); with Label1 do begin Name := 'Label1'; @@ -202,7 +226,7 @@ begin Text := 'Select a color palette'; end; - Label2 := TfpgLabel.Create(TabSheet2); + Label2 := TfpgLabel.Create(tsColorNames); with Label2 do begin Name := 'Label2'; @@ -212,22 +236,23 @@ begin Text := 'Available colors:'; end; - ColorWheel := TfpgColorWheel.Create(TabSheet1); + ColorWheel := TfpgColorWheel.Create(tsColorWheel); with ColorWheel do begin Name := 'ColorWheel'; SetPosition(8, 8, 204, 204); end; - ValueBar := TfpgValueBar.Create(TabSheet1); + ValueBar := TfpgValueBar.Create(tsColorWheel); with ValueBar do begin Name := 'ValueBar'; SetPosition(240, 8, 64, 204); + Value := 1; OnChange := @ColorChanged; end; - edR := TfpgSpinEdit.Create(TabSheet1); + edR := TfpgSpinEdit.Create(tsColorWheel); with edR do begin Name := 'edR'; @@ -237,7 +262,7 @@ begin OnChange := @RGBChanged; end; - edG := TfpgSpinEdit.Create(TabSheet1); + edG := TfpgSpinEdit.Create(tsColorWheel); with edG do begin Name := 'edG'; @@ -247,7 +272,7 @@ begin OnChange := @RGBChanged; end; - edB := TfpgSpinEdit.Create(TabSheet1); + edB := TfpgSpinEdit.Create(tsColorWheel); with edB do begin Name := 'edB'; @@ -257,7 +282,7 @@ begin OnChange := @RGBChanged; end; - Label3 := TfpgLabel.Create(TabSheet1); + Label3 := TfpgLabel.Create(tsColorWheel); with Label3 do begin Name := 'Label3'; @@ -268,7 +293,7 @@ begin Text := 'Red'; end; - Label4 := TfpgLabel.Create(TabSheet1); + Label4 := TfpgLabel.Create(tsColorWheel); with Label4 do begin Name := 'Label4'; @@ -279,7 +304,7 @@ begin Text := 'Green'; end; - Label5 := TfpgLabel.Create(TabSheet1); + Label5 := TfpgLabel.Create(tsColorWheel); with Label5 do begin Name := 'Label5'; @@ -290,7 +315,7 @@ begin Text := 'Blue'; end; - pnlColorPreview := TfpgBevel.Create(TabSheet1); + pnlColorPreview := TfpgBevel.Create(tsColorWheel); with pnlColorPreview do begin Name := 'pnlColorPreview'; @@ -309,6 +334,8 @@ begin btnCancel.Top := Height - btnCancel.Height - FSpacing; btnOK.Left := btnCancel.Left - FDefaultButtonWidth - 6; btnOK.Top := btnCancel.Top; + + PopulatePaletteColorCombo; end; diff --git a/src/gui/fpg_animation.pas b/src/gui/fpg_animation.pas index fedfa545..36972877 100644 --- a/src/gui/fpg_animation.pas +++ b/src/gui/fpg_animation.pas @@ -65,6 +65,7 @@ type public property Position; published + property Align; property Enabled; property Interval; property ImageFileName; diff --git a/src/gui/fpg_basegrid.pas b/src/gui/fpg_basegrid.pas index 9a29e004..ae6584b8 100644 --- a/src/gui/fpg_basegrid.pas +++ b/src/gui/fpg_basegrid.pas @@ -37,6 +37,8 @@ type TfpgGridDrawState = set of (gdSelected, gdFocused, gdFixed); + TfpgGridHeaderStyle = (ghsButton, ghsThin, ghsFlat); + TfpgFocusChangeNotify = procedure(Sender: TObject; ARow, ACol: Integer) of object; TfpgRowChangeNotify = procedure(Sender: TObject; ARow: Integer) of object; TfpgCanSelectCellEvent = procedure(Sender: TObject; const ARow, ACol: Integer; var ACanSelect: boolean) of object; @@ -52,6 +54,7 @@ type private FColResizing: boolean; FDragPos: integer; // used for column resizing + FHeaderStyle: TfpgGridHeaderStyle; FOnDrawCell: TfpgDrawCellEvent; FResizedCol: integer; // used for column resizing FDefaultColWidth: integer; @@ -83,9 +86,11 @@ type FAlternativeBGColor: TfpgColor; function GetFontDesc: string; function GetHeaderFontDesc: string; + function GetTotalColumnWidth: integer; procedure HScrollBarMove(Sender: TObject; position: integer); procedure SetFontDesc(const AValue: string); procedure SetHeaderFontDesc(const AValue: string); + procedure SetHeaderStyle(const AValue: TfpgGridHeaderStyle); procedure SetRowSelect(const AValue: boolean); procedure SetScrollBarStyle(const AValue: TfpgScrollStyle); procedure VScrollBarMove(Sender: TObject; position: integer); @@ -139,6 +144,7 @@ type property HeaderFontDesc: string read GetHeaderFontDesc write SetHeaderFontDesc; property FocusCol: Integer read FFocusCol write SetFocusCol default -1; property FocusRow: Integer read FFocusRow write SetFocusRow default -1; + property HeaderStyle: TfpgGridHeaderStyle read FHeaderStyle write SetHeaderStyle default ghsButton; property RowSelect: boolean read FRowSelect write SetRowSelect; property ColumnCount: Integer read GetColumnCount; property PopupMenu: TfpgPopupMenu read FPopupMenu write FPopupMenu; @@ -147,6 +153,7 @@ type property ShowGrid: boolean read FShowGrid write SetShowGrid default True; property ScrollBarStyle: TfpgScrollStyle read FScrollBarStyle write SetScrollBarStyle default ssAutoBoth; property HeaderHeight: integer read FHeaderHeight; + property TotalColumnWidth: integer read GetTotalColumnWidth; // property ColResizing: boolean read FColResizing write FColResizing; property ColumnWidth[ACol: Integer]: integer read GetColumnWidth write SetColumnWidth; property ColumnBackgroundColor[ACol: Integer]: TfpgColor read GetColumnBackgroundColor write SetColumnBackgroundColor; @@ -207,6 +214,15 @@ begin Result := FHeaderFont.FontDesc; end; +function TfpgBaseGrid.GetTotalColumnWidth: integer; +var + i: integer; +begin + Result := 0; + for i := 0 to ColumnCount-1 do + Result := Result + ColumnWidth[i]; +end; + procedure TfpgBaseGrid.SetFontDesc(const AValue: string); begin FFont.Free; @@ -225,6 +241,14 @@ begin RePaint; end; +procedure TfpgBaseGrid.SetHeaderStyle(const AValue: TfpgGridHeaderStyle); +begin + if FHeaderStyle = AValue then + exit; + FHeaderStyle := AValue; + Repaint; +end; + procedure TfpgBaseGrid.SetRowSelect(const AValue: boolean); begin if FRowSelect = AValue then @@ -370,10 +394,27 @@ var r: TfpgRect; x: integer; begin - // Here we can implement a head style check - Canvas.DrawButtonFace(ARect, [btfIsEmbedded]); r := ARect; - InflateRect(r, -2, -2); + // Here we can implement a head style check + case FHeaderStyle of + ghsButton: + begin + Canvas.DrawButtonFace(ARect, [btfIsEmbedded]); + InflateRect(r, -2, -2); + end; + ghsThin: + begin + Canvas.DrawBevel(ARect); + end; + ghsFlat: + begin + Canvas.Color:= clGridHeader; + Canvas.FillRectangle(r); + Canvas.Color:= clShadow2; + Canvas.DrawLine(r.Left, r.Bottom, r.Right, r.Bottom); { bottom line } + Canvas.DrawLine(r.Right, r.Bottom, r.Right, r.Top-1); { right line } + end; + end; Canvas.AddClipRect(r); // text may not overshoot header border (* // drawing grid lines @@ -579,16 +620,17 @@ begin begin Dec(VHeight, FHScrollBar.Height); FHScrollBar.Min := 0; - FHScrollBar.SliderSize := 0.2; if go_SmoothScroll in FOptions then begin FHScrollBar.Max := cw - vw; FHScrollBar.Position := FXOffset; + FHScrollBar.SliderSize := TotalColumnWidth / Width; end else begin FHScrollBar.Max := ColumnCount-1; FHScrollBar.Position := FFirstCol; + FHScrollBar.SliderSize := 1 / ColumnCount; end; FHScrollBar.RepaintSlider; end; @@ -931,10 +973,10 @@ begin lCol := FFirstCol; if delta > 0 then // scroll down - inc(FFirstRow, abs(delta)) + inc(FFirstRow, abs(delta)*3) else // scroll up if FFirstRow > 0 then - dec(FFirstRow, abs(delta)); + dec(FFirstRow, abs(delta)*3); // apply limits if FFirstRow > RowCount - VisibleLines then @@ -1231,6 +1273,7 @@ begin FScrollBarStyle := ssAutoBoth; FUpdateCount := 0; FOptions := []; + FHeaderStyle := ghsButton; FFont := fpgGetFont('#Grid'); FHeaderFont := fpgGetFont('#GridHeader'); diff --git a/src/gui/fpg_button.pas b/src/gui/fpg_button.pas index 19b31049..52a17486 100644 --- a/src/gui/fpg_button.pas +++ b/src/gui/fpg_button.pas @@ -13,6 +13,9 @@ Description: Defines a push button control. + + TODO: + * multi-line button text. It must take into account image position as well. } unit fpg_button; @@ -42,7 +45,7 @@ type FImageName: string; FClicked: Boolean; FShowImage: Boolean; - FClickOnPush: Boolean; + FClickOnPush: Boolean; { Used for group buttons where click happens on "down" state. Normal buttons, the click happens on "release" state } FGroupIndex: integer; FAllowAllUp: boolean; FModalResult: TfpgModalResult; @@ -62,6 +65,7 @@ type procedure SetAllowAllUp(const Value: boolean); procedure DoPush; procedure DoRelease(x, y: integer); + procedure SetAllowMultiLineText(const AValue: boolean); protected FImageMargin: integer; FImageSpacing: integer; @@ -72,6 +76,7 @@ type FFont: TfpgFont; FDefault: boolean; FState: integer; // 0 - normal // 1 - hover + FAllowMultiLineText: boolean; procedure SetShowImage(AValue: Boolean); procedure HandlePaint; override; procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override; @@ -85,8 +90,9 @@ type property AllowAllUp: boolean read FAllowAllUp write SetAllowAllUp default False; { Buttons behave like toggle buttons. This is an alias for GroupIndex > 0 } property AllowDown: Boolean read GetAllowDown write SetAllowDown; + property AllowMultiLineText: boolean read FAllowMultiLineText write SetAllowMultiLineText default False; property Default: boolean read FDefault write SetDefault default False; - property Down: Boolean read FDown write SetDown; + property Down: Boolean read FDown write SetDown default False; { The button will not show focus. It might also have a different down state (look). This is similar to Focusable = False, but the appearance of the down state might differ. } property Embedded: Boolean read FEmbedded write SetEmbedded default False; @@ -127,12 +133,15 @@ type together. } TfpgButton = class(TfpgBaseButton) published + property Align; property AllowAllUp; property AllowDown; + property AllowMultiLineText; property BackgroundColor default clButtonFace; property Default; property Down; property Embedded; + property Enabled; property Flat; property FontDesc; property GroupIndex; @@ -157,6 +166,10 @@ type property Top; property Width; property OnClick; + property OnDragEnter; + property OnDragLeave; + property OnDragDrop; + property OnDragStartDetected; property OnMouseDown; property OnMouseExit; property OnMouseEnter; @@ -302,6 +315,7 @@ begin FDefault := False; FAllowAllUp := False; FState := 0; + FAllowMultiLineText := False; end; destructor TfpgBaseButton.Destroy; @@ -509,6 +523,7 @@ var lBtnFlags: TFButtonFlags; clr: TfpgColor; img: TfpgImage; + lTextFlags: TFTextFlags; begin // inherited HandlePaint; Canvas.ClearClipRect; @@ -532,6 +547,12 @@ begin Include(lBtnFlags, btfHover) else if FFlat then Include(lBtnFlags, btfFlat); + end + else + begin + { while in the designer we want hover effect all the time } + if FFlat then + Include(lBtnFlags, btfHover); end; if not FFlat and FDefault then @@ -577,8 +598,33 @@ begin Canvas.DrawImage(ix + pofs, iy + pofs, img); img.Free; end; + end; - fpgStyle.DrawString(Canvas, tx+pofs, ty+pofs, Text, Enabled); + + { EXPERIMENTAL: multi-line button text + Only in this condition do we support multi-line text } + if AllowMultiLineText and (FImageLayout = ilImageLeft) then + begin + r.SetRect(0, 0, Width, Height); + InflateRect(r, -3, -3); { same as focus rectangle } + if FShowImage and Assigned(FImage) then + begin + ix := FImageMargin + FImage.Width; + if FImageSpacing > 0 then + ix += FImageSpacing; + OffsetRect(r, ix, 0); + r.Width -= ix; + end; + if FDown then + OffsetRect(r, pofs, pofs); + + lTextFlags := [txtHCenter, txtVCenter{, txtWrap}]; + if not Enabled then + lTextFlags += [txtDisabled]; + Canvas.DrawText(r, Text, lTextFlags); + end + else + fpgStyle.DrawString(Canvas, tx+pofs, ty+pofs, Text, Enabled); end; procedure TfpgBaseButton.DoPush; @@ -618,7 +664,7 @@ begin FDown := False; RePaint; fpgApplication.ProcessMessages; - if PtInRect(r, Point(x, y)) then + if PtInRect(r, Point(x, y)) and FOnClickPending then Click; end; end @@ -629,7 +675,7 @@ begin FDown := False; RePaint; fpgApplication.ProcessMessages; - if PtInRect(r, Point(x, y)) then + if PtInRect(r, Point(x, y)) and FOnClickPending then Click; end; end; @@ -638,10 +684,18 @@ begin FClicked := False; end; +procedure TfpgBaseButton.SetAllowMultiLineText(const AValue: boolean); +begin + if FAllowMultiLineText = AValue then exit; + FAllowMultiLineText := AValue; + Repaint; +end; + procedure TfpgBaseButton.HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); begin if (keycode = keyReturn) or (keycode = keySpace) or (keycode = keyPEnter) then begin + FOnClickPending := True; DoPush; Consumed := True; end @@ -653,8 +707,9 @@ procedure TfpgBaseButton.HandleKeyRelease(var keycode: word; var shiftstate: TSh begin if (keycode = keyReturn) or (keycode = keySpace) or (keycode = keyPEnter) then begin - DoRelease(1, 1); // fake co-ordinates to it executes the Click + DoRelease(1, 1); // fake co-ordinates so it executes the Click Consumed := True; + FOnClickPending := False; end else inherited; @@ -732,8 +787,11 @@ begin if Assigned(FCommand) then // ICommand takes preference to OnClick FCommand.Execute - else if Assigned(OnClick) then - OnClick(self); + else + begin + if Assigned(OnClick) then + OnClick(self); + end; end; function TfpgBaseButton.GetCommand: ICommand; diff --git a/src/gui/fpg_checkbox.pas b/src/gui/fpg_checkbox.pas index a075a4cd..e6d5c35b 100644 --- a/src/gui/fpg_checkbox.pas +++ b/src/gui/fpg_checkbox.pas @@ -65,9 +65,11 @@ type TfpgCheckBox = class(TfpgBaseCheckBox) published + property Align; property BackgroundColor; property BoxLayout; property Checked; + property Enabled; property FontDesc; property Height; property Hint; diff --git a/src/gui/fpg_colorwheel.pas b/src/gui/fpg_colorwheel.pas index 43ebb8a9..a6b3795b 100644 --- a/src/gui/fpg_colorwheel.pas +++ b/src/gui/fpg_colorwheel.pas @@ -62,7 +62,9 @@ type property Saturation: double Read FSaturation; procedure SetSelectedColor(const NewColor: TfpgColor); published + property Align; property BackgroundColor; + property Enabled; property ValueBar: TfpgValueBar Read FValueBar Write SetValueBar; property MarginWidth: longint Read FMarginWidth Write SetMarginWidth default 5; property CursorSize: longint Read FCursorSize Write SetCursorSize default 5; @@ -98,11 +100,13 @@ type constructor Create(AOwner: TComponent); override; procedure SetHS(Hue: longint; Sat: double); published + property Align; property BackgroundColor; + property Enabled; property Value: double Read FValue Write SetValue; property SelectedColor: TfpgColor Read GetSelectedColor; - property MarginWidth: longint Read FMarginWidth Write SetMarginWidth; - property CursorHeight: longint Read FCursorHeight Write SetCursorHeight; + property MarginWidth: longint Read FMarginWidth Write SetMarginWidth default 5; + property CursorHeight: longint Read FCursorHeight Write SetCursorHeight default 10; property OnChange: TNotifyEvent Read FOnChange Write FOnChange; end; @@ -197,12 +201,16 @@ begin // but draw an outline Canvas.SetLineStyle(1, lsDash); Canvas.DrawRectangle(GetClientRect); + Canvas.SetLineStyle(1, lsSolid); + Canvas.Color := clUIDesignerGreen; + Canvas.FillArc(FMarginWidth, FMarginWidth, DrawWidth, DrawHeight, 0, 360); Canvas.Color := clHilite1; - Canvas.DrawArc(Width div 2, Height div 2, DrawWidth div 2 + 1, - DrawHeight div 2 + 1, 45, 180); + Canvas.DrawArc(FMarginWidth, FMarginWidth, DrawWidth, DrawHeight, 45, 180); Canvas.Color := clShadow1; - Canvas.DrawArc(Width div 2, Height div 2, DrawWidth div 2 + 1, - DrawHeight div 2 + 1, 225, 180); + Canvas.DrawArc(FMarginWidth, FMarginWidth, DrawWidth, DrawHeight, 225, 180); + Canvas.TextColor := clShadow1; + Canvas.DrawText(5, 5, Name + ': ' + ClassName); + DrawCursor; Exit; //==> end; @@ -427,13 +435,19 @@ begin begin // when designing just draw // a rectangle to indicate + Canvas.Color := clBlack; Canvas.SetLineStyle(1, lsDash); Canvas.DrawRectangle(GetClientRect); if (Width < MarginWidth * 2) or (Height < MarginWidth * 2) then Exit; //==> r := GetClientRect; - InflateRect(r, FMarginWidth, FMarginWidth); + InflateRect(r, -FMarginWidth, -FMarginWidth); + Canvas.Color := clShadow1; + Canvas.SetLineStyle(1, lsSolid); Canvas.DrawRectangle(r); + Canvas.TextColor := clShadow1; + Canvas.DrawText(5, 5, Width, Height, Name + ': ' + ClassName, TextFlagsDflt + [txtWrap]); + DrawCursor; exit; end; @@ -494,7 +508,7 @@ begin inherited Create(AOwner); FMarginWidth := 5; FValue := 1.0; - Width := 100; + Width := 80; Height := 100; Name := 'ValueBar'; FCursorHeight := 10; diff --git a/src/gui/fpg_combobox.pas b/src/gui/fpg_combobox.pas index 632a4918..5afbf326 100644 --- a/src/gui/fpg_combobox.pas +++ b/src/gui/fpg_combobox.pas @@ -135,8 +135,11 @@ type TfpgComboBox = class(TfpgBaseStaticCombo) published + property AcceptDrops; + property Align; property BackgroundColor default clBoxColor; property DropDownCount; + property Enabled; property ExtraHint; property FocusItem; property FontDesc; @@ -153,6 +156,10 @@ type property Width; property OnChange; property OnCloseUp; + property OnDragDrop; + property OnDragEnter; + property OnDragLeave; + property OnDragStartDetected; property OnDropDown; property OnEnter; property OnExit; diff --git a/src/gui/fpg_dialogs.pas b/src/gui/fpg_dialogs.pas index 73c668c3..a190cf43 100644 --- a/src/gui/fpg_dialogs.pas +++ b/src/gui/fpg_dialogs.pas @@ -50,7 +50,10 @@ uses fpg_tree, fpg_ColorWheel, fpg_spinedit, - fpg_tab; + fpg_tab, + fpg_menu, + fpg_iniutils, + fpg_imagelist; type TfpgMsgDlgType = (mtAbout, mtWarning, mtError, mtInformation, mtConfirmation, @@ -79,22 +82,27 @@ type TfpgMessageBox = class(TfpgForm) private + {@VFD_HEAD_BEGIN: MessageBox} + FButton: TfpgButton; + {@VFD_HEAD_END: MessageBox} FLines: TStringList; FFont: TfpgFont; FTextY: integer; FLineHeight: integer; FMaxLineWidth: integer; - FButton: TfpgButton; FCentreText: Boolean; - protected - procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override; - procedure HandlePaint; override; - procedure HandleShow; override; + procedure FormPaint(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormKeyPressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean); + function GetFontDesc: string; + procedure SetFontDesc(const AValue: string); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; + procedure AfterCreate; override; procedure SetMessage(AMessage: string); property CentreText: Boolean read FCentreText write FCentreText default False; + property FontDesc: string read GetFontDesc write SetFontDesc; end; @@ -153,6 +161,8 @@ type btnUpDir: TfpgButton; btnDirNew: TfpgButton; btnShowHidden: TfpgButton; + btnGoHome: TfpgButton; + btnBookmark: TfpgButton; pnlFileInfo: TfpgPanel; edFilename: TfpgEdit; chlFilter: TfpgComboBox; @@ -162,6 +172,8 @@ type FFilterList: TStringList; FFilter: string; FInitialDir: string; + FBookmarkMenu: TfpgPopupMenu; + FIni: TfpgIniFile; procedure SetFilter(const Value: string); function GetFontDesc: string; function GetShowHidden: boolean; @@ -177,9 +189,14 @@ type procedure DirChange(Sender: TObject); procedure UpDirClick(Sender: TObject); procedure btnDirNewClicked(Sender: TObject); + procedure btnGoHomeClicked(Sender: TObject); + procedure btnBookmarkClicked(Sender: TObject); procedure edFilenameChanged(Sender: TObject); procedure UpdateButtonState; function HighlightFile(const AFilename: string): boolean; + function CreatePopupMenu: TfpgPopupMenu; + procedure BookmarkItemClicked(Sender: TObject); + procedure ShowConfigureBookmarks; protected procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override; procedure btnOKClick(Sender: TObject); override; @@ -195,7 +212,6 @@ type property InitialDir: string read FInitialDir write SetInitialDir; property ShowHidden: boolean read GetShowHidden write SetShowHidden; end; - { This lets us use a single include file for both the Interface and Implementation sections. } @@ -210,6 +226,7 @@ type {$I charmapdialog.inc} {$I colordialog.inc} {$I inputquerydialog.inc} +{$I managebookmarksdialog.inc} @@ -403,21 +420,11 @@ end; { TfpgMessageBox } -procedure TfpgMessageBox.HandleKeyPress(var keycode: word; - var shiftstate: TShiftState; var consumed: boolean); -begin - inherited HandleKeyPress(keycode, shiftstate, consumed); - if keycode = keyEscape then - Close; -end; - -procedure TfpgMessageBox.HandlePaint; +procedure TfpgMessageBox.FormPaint(Sender: TObject); var n, y: integer; tw: integer; begin - inherited HandlePaint; - Canvas.SetFont(FFont); y := FTextY; for n := 0 to FLines.Count-1 do @@ -431,30 +438,42 @@ begin end; end; -procedure TfpgMessageBox.HandleShow; +procedure TfpgMessageBox.FormShow(Sender: TObject); +begin + FButton.Text := cMsgDlgBtnText[mbOK] +end; + +procedure TfpgMessageBox.FormKeyPressed(Sender: TObject; var KeyCode: word; + var ShiftState: TShiftState; var Consumed: boolean); +begin + if KeyCode = keyEscape then + begin + Consumed := False; + Close; + end; +end; + +function TfpgMessageBox.GetFontDesc: string; +begin + Result := FFont.FontDesc; +end; + +procedure TfpgMessageBox.SetFontDesc(const AValue: string); begin - inherited HandleShow; - FButton.SetFocus; + FFont.Free; + FFont := fpgGetFont(AValue); + RePaint; end; constructor TfpgMessageBox.Create(AOwner: TComponent); begin inherited Create(AOwner); - WindowPosition := wpOneThirdDown; - Sizeable := False; - FLines := TStringList.Create; FFont := fpgGetFont('#Label1'); FTextY := 10; FLineHeight := FFont.Height + 4; - MinWidth := 200; FMaxLineWidth := 500; FCentreText := False; - - FButton := TfpgButton.Create(self); - FButton.Text := cMsgDlgBtnText[mbOK]; - FButton.Width := 75; - FButton.ModalResult := mrOK; end; destructor TfpgMessageBox.Destroy; @@ -464,6 +483,38 @@ begin inherited Destroy; end; +procedure TfpgMessageBox.AfterCreate; +begin + inherited AfterCreate; + {@VFD_BODY_BEGIN: MessageBox} + Name := 'MessageBox'; + SetPosition(330, 199, 419, 138); + WindowTitle := 'Message'; + Hint := ''; + WindowPosition := wpOneThirdDown; + MinWidth := 200; + Sizeable := False; + OnShow := @FormShow; + OnPaint := @FormPaint; + OnKeyPress := @FormKeyPressed; + + FButton := TfpgButton.Create(self); + with FButton do + begin + Name := 'FButton'; + SetPosition(8, 8, 75, 23); + Text := 'OK'; + FontDesc := '#Label1'; + Hint := ''; + ImageName := ''; + ModalResult := mrOK; + TabOrder := 1; + OnKeyPress := @FormKeyPressed; + end; + + {@VFD_BODY_END: MessageBox} +end; + procedure TfpgMessageBox.SetMessage(AMessage: string); var outw: integer; @@ -698,6 +749,8 @@ var end; begin + if Desc = '' then + exit; cp := 1; c := Desc[1]; @@ -863,6 +916,7 @@ begin Items.Add('48'); Items.Add('64'); Items.Add('72'); + FocusItem := 4; // 10 point font OnChange := @OnParamChange; end; @@ -1016,7 +1070,7 @@ begin chlDir := TfpgComboBox.Create(self); with chlDir do begin - SetPosition(8, 12, 526, 22); + SetPosition(8, 12, 484, 24); Anchors := [anLeft, anRight, anTop]; FontDesc := '#List'; OnChange := @DirChange; @@ -1027,6 +1081,7 @@ begin begin SetPosition(8, 44, 622, 200); Anchors := [anLeft, anRight, anTop, anBottom]; + Options := [go_AlternativeColor, go_SmoothScroll]; OnRowChange := @ListChanged; OnDoubleClick := @GridDblClicked; end; @@ -1034,44 +1089,75 @@ begin btnUpDir := TfpgButton.Create(self); with btnUpDir do begin - SetPosition(540, 11, 26, 24); + SetPosition(500, 11, 24, 24); Anchors := [anRight, anTop]; Text := ''; FontDesc := '#Label1'; ImageName := 'stdimg.folderup'; // Do NOT localize - ModalResult := mrNone; Focusable := False; + ImageSpacing := 0; + ImageMargin := -1; OnClick := @UpDirClick; end; btnDirNew := TfpgButton.Create(self); with btnDirNew do begin - SetPosition(572, 11, 26, 24); + SetPosition(526, 11, 24, 24); Anchors := [anRight, anTop]; Text := ''; FontDesc := '#Label1'; ImageName := 'stdimg.foldernew'; // Do NOT localize - ModalResult := mrNone; Focusable := False; + ImageSpacing := 0; + ImageMargin := -1; OnClick := @btnDirNewClicked; end; btnShowHidden := TfpgButton.Create(self); with btnShowHidden do begin - SetPosition(604, 11, 26, 24); + SetPosition(552, 11, 24, 24); Anchors := [anRight, anTop]; Text := ''; FontDesc := '#Label1'; ImageName := 'stdimg.hidden'; // Do NOT localize - ModalResult := mrNone; Focusable := False; GroupIndex := 1; AllowAllUp := True; + ImageSpacing := 0; + ImageMargin := -1; OnClick := @DirChange; end; + btnGoHome := TfpgButton.Create(self); + with btnGoHome do + begin + SetPosition(578, 11, 24, 24); + Anchors := [anRight, anTop]; + Text := ''; + FontDesc := '#Label1'; + ImageName := 'stdimg.folderhome'; // Do NOT localize + Focusable := False; + ImageSpacing := 0; + ImageMargin := -1; + OnClick := @btnGoHomeClicked; + end; + + btnBookmark := TfpgButton.Create(self); + with btnBookmark do + begin + SetPosition(604, 11, 24, 24); + Anchors := [anRight, anTop]; + Text := ''; + FontDesc := '#Label1'; + ImageName := 'stdimg.bookmark'; // Do NOT localize + Focusable := False; + ImageSpacing := 0; + ImageMargin := -1; + OnClick := @btnBookmarkClicked; + end; + { Create lower Panel details } pnlFileInfo := TfpgPanel.Create(self); @@ -1210,6 +1296,8 @@ end; destructor TfpgFileDialog.Destroy; begin + FIni.Free; + FBookmarkMenu.Free; FFilterList.Free; inherited Destroy; end; @@ -1252,6 +1340,19 @@ begin end; end; +procedure TfpgFileDialog.btnGoHomeClicked(Sender: TObject); +begin + SetCurrentDirectory(GetUserDir); +end; + +procedure TfpgFileDialog.btnBookmarkClicked(Sender: TObject); +begin + if Assigned(FBookmarkMenu) then + FBookmarkMenu.Free; + FBookmarkMenu := CreatePopupMenu; + FBookmarkMenu.ShowAt(self, btnBookmark.Left, btnBookmark.Bottom); +end; + procedure TfpgFileDialog.edFilenameChanged(Sender: TObject); begin UpdateButtonState; @@ -1299,6 +1400,9 @@ begin grid.Update; grid.SetFocus; + + if FOpenMode then // when saving file, we want to keep file name + edFilename.Clear; end; function TfpgFileDialog.HighlightFile(const AFilename: string): boolean; @@ -1317,6 +1421,75 @@ begin Result := False; end; +function TfpgFileDialog.CreatePopupMenu: TfpgPopupMenu; +var + i: integer; + s: TfpgString; + lst: TStringList; + mi: TfpgMenuItem; +begin + Result := TfpgPopupMenu.Create(nil); + with Result do + begin + lst := TStringList.Create; + try + if not Assigned(FIni) then + FIni := TfpgINIFile.CreateExt(fpgGetToolkitConfigDir + FPG_BOOKMARKS_FILE); + FIni.ReadSection(FPG_BOOKMARK_SECTION, lst); + // add previous bookmarks to menu + for i := 0 to lst.Count-1 do + begin + mi := AddMenuItem(lst[i], '', @BookmarkItemClicked); + end; + // Now add static items + if lst.Count > 0 then + AddMenuItem('-', '', nil); + finally + lst.Free; + end; + mi := AddMenuItem(rsAddCurrentDirectory, '', @BookmarkItemClicked); + mi.Tag := 1; + mi := AddMenuItem(rsConfigureBookmarks + '...', '', @BookmarkItemClicked); + mi.Tag := 2; + end; +end; + +procedure TfpgFileDialog.BookmarkItemClicked(Sender: TObject); +var + mi: TfpgMenuItem; + s: TfpgString; +begin + if Sender is TfpgMenuItem then + mi := TfpgMenuItem(Sender); + if mi = nil then + Exit; + if mi.Tag = 1 then // Add current directory + begin + FIni.WriteString(FPG_BOOKMARK_SECTION, grid.FileList.DirectoryName, grid.FileList.DirectoryName); + end + else if mi.Tag = 2 then // configure bookmarks + begin + ShowConfigureBookmarks; + end + else + begin // bookmark has been clicked + s := FIni.ReadString(FPG_BOOKMARK_SECTION, mi.Text, '.'); + SetCurrentDirectory(s); + end; +end; + +procedure TfpgFileDialog.ShowConfigureBookmarks; +var + frm: TConfigureBookmarksForm; +begin + frm := TConfigureBookmarksForm.Create(FIni); + try + frm.ShowModal; + finally + frm.Free; + end; +end; + procedure TfpgFileDialog.ProcessFilterString; var p: integer; @@ -1369,7 +1542,7 @@ begin if (i >= 0) and (i < FFilterList.Count) then Result := FFilterList[i] else - Result := '*'; + Result := AllFilesMask; end; function TfpgFileDialog.RunOpenFile: boolean; @@ -1378,12 +1551,12 @@ var fname: string; begin FOpenMode := True; - sdir := ExtractFileDir(FileName); + sdir := fpgExtractFileDir(FileName); if sdir = '' then sdir := '.'; SetCurrentDirectory(sdir); - fname := ExtractFileName(FileName); + fname := fpgExtractFileName(FileName); if not HighlightFile(fname) then edFilename.Text := fname; @@ -1436,6 +1609,7 @@ end; {$I charmapdialog.inc} {$I colordialog.inc} {$I inputquerydialog.inc} +{$I managebookmarksdialog.inc} end. diff --git a/src/gui/fpg_edit.pas b/src/gui/fpg_edit.pas index 5dd25fb0..dd7958ab 100644 --- a/src/gui/fpg_edit.pas +++ b/src/gui/fpg_edit.pas @@ -159,10 +159,13 @@ type public property PopupMenu; // UI Designer doesn't fully support it yet published + property AcceptDrops; + property Align; property AutoSelect; property AutoSize; property BackgroundColor default clBoxColor; property BorderStyle; + property Enabled; property ExtraHint; property FontDesc; property HeightMargin; @@ -179,6 +182,10 @@ type property Text; property TextColor; property OnChange; + property OnDragEnter; + property OnDragLeave; + property OnDragDrop; + property OnDragStartDetected; property OnEnter; property OnExit; property OnKeyPress; @@ -220,20 +227,11 @@ type Still to implement !!} property CustomDecimalSeparator: TfpgChar read FDecimalseparator write SetDecimalSeparator; property CustomThousandSeparator: TfpgChar read FThousandSeparator write SetThousandSeparator; - property NegativeColor: TfpgColor read FNegativeColor write SetNegativeColor; + property NegativeColor: TfpgColor read FNegativeColor write SetNegativeColor default clRed; property HideSelection; // property MaxLength; { probably MaxValue and MinValue } property TabOrder; - property TextColor; property ShowThousand: boolean read FShowThousand write FShowThousand default False; - property OnChange; - property OnEnter; - property OnExit; - property OnKeyPress; - property OnMouseEnter; - property OnMouseExit; - property OnPaint; - property OnShowHint; public constructor Create(AOwner: TComponent); override; published @@ -254,7 +252,9 @@ type property OldColor; property Text; published + property Align; property CustomThousandSeparator; + property Enabled; property Hint; property NegativeColor; property ParentShowHint; @@ -292,9 +292,11 @@ type property OldColor; property Text; published + property Align; property CustomDecimalSeparator; property CustomThousandSeparator; property Decimals: integer read FDecimals write SetDecimals default -1; + property Enabled; property FixedDecimals: boolean read FFixedDecimals write SetFixedDecimals default False; property Hint; property NegativeColor; @@ -331,9 +333,11 @@ type property OldColor; property Text; published + property Align; property CustomDecimalSeparator; property CustomThousandSeparator; property Decimals: integer read FDecimals write SetDecimals default 2; + property Enabled; property Hint; property NegativeColor; property ParentShowHint; @@ -341,6 +345,7 @@ type property ShowHint; property ShowThousand default True; property TabOrder; + property TextColor; property Value: Currency read GetValue write SetValue; property OnChange; property OnEnter; @@ -1178,7 +1183,7 @@ procedure TfpgBaseEdit.DefaultPopupPaste(Sender: TObject); begin if ReadOnly then Exit; - PasteFromClipboard + PasteFromClipboard; end; procedure TfpgBaseEdit.DefaultPopupClearAll(Sender: TObject); @@ -1643,6 +1648,7 @@ procedure TfpgBaseNumericEdit.SetNegativeColor(const AValue: TfpgColor); begin if FNegativeColor=AValue then exit; FNegativeColor:=AValue; + FormatEdit; end; procedure TfpgBaseNumericEdit.SetThousandSeparator(const AValue: TfpgChar); @@ -1799,8 +1805,8 @@ begin FAlignment := taRightJustify; FDecimalSeparator := DecimalSeparator; FThousandSeparator := ThousandSeparator; - NegativeColor := clRed; - OldColor := TextColor; + FNegativeColor := clRed; + FOldColor := TextColor; end; { TfpgEditInteger } diff --git a/src/gui/fpg_editbtn.pas b/src/gui/fpg_editbtn.pas index 70c6da00..0cba4f18 100644 --- a/src/gui/fpg_editbtn.pas +++ b/src/gui/fpg_editbtn.pas @@ -70,14 +70,16 @@ type public constructor Create(AOwner: TComponent); override; published - property ExtraHint; - property FileName: TfpgString read GetFileName write SetFileName; - property InitialDir: TfpgString read FInitialDir write FInitialDir; - property Filter: TfpgString read FFilter write SetFilter; - property ReadOnly; - property TabOrder; - property OnButtonClick; - property OnShowHint; + property Align; + property Enabled; + property ExtraHint; + property FileName: TfpgString read GetFileName write SetFileName; + property InitialDir: TfpgString read FInitialDir write FInitialDir; + property Filter: TfpgString read FFilter write SetFilter; + property ReadOnly; + property TabOrder; + property OnButtonClick; + property OnShowHint; end; @@ -92,13 +94,15 @@ type public constructor Create(AOwner: TComponent); override; published - property Directory: TfpgString read GetDirectory write SetDirectory; - property ExtraHint; - property RootDirectory: TfpgString read FRootDirectory write FRootDirectory; - property ReadOnly; - property TabOrder; - property OnButtonClick; - property OnShowHint; + property Align; + property Directory: TfpgString read GetDirectory write SetDirectory; + property Enabled; + property ExtraHint; + property RootDirectory: TfpgString read FRootDirectory write FRootDirectory; + property ReadOnly; + property TabOrder; + property OnButtonClick; + property OnShowHint; end; @@ -111,11 +115,14 @@ type public constructor Create(AOwner: TComponent); override; published - property FontDesc: TfpgString read GetFontDesc write SetFontDesc; - property ReadOnly; - property TabOrder; - property OnButtonClick; - property OnShowHint; + property Align; + property Enabled; + property ExtraHint; + property FontDesc: TfpgString read GetFontDesc write SetFontDesc; + property ReadOnly; + property TabOrder; + property OnButtonClick; + property OnShowHint; end; diff --git a/src/gui/fpg_editcombo.pas b/src/gui/fpg_editcombo.pas index 20b6ee8d..4dd011d0 100644 --- a/src/gui/fpg_editcombo.pas +++ b/src/gui/fpg_editcombo.pas @@ -58,6 +58,7 @@ uses fpg_main, fpg_widget, fpg_popupwindow, + fpg_menu, fpg_combobox; type @@ -72,10 +73,14 @@ type FSelectedItem: integer; FMaxLength: integer; FNewItem: boolean; + FDefaultPopupMenu: TfpgPopupMenu; procedure SetAllowNew(const AValue: TAllowNew); procedure InternalBtnClick(Sender: TObject); procedure InternalListBoxSelect(Sender: TObject); procedure InternalListBoxKeyPress(Sender: TObject; var keycode: word; var shiftstate: TShiftState; var consumed: Boolean); + procedure DefaultPopupInsertFromCharmap(Sender: TObject); + procedure DoPaste(const AText: TfpgString); + procedure SetDefaultPopupMenuItemsState; protected FDropDown: TfpgPopupWindow; FDrawOffset: integer; @@ -86,11 +91,14 @@ type function GetText: string; virtual; function HasText: boolean; virtual; procedure SetText(const AValue: string); virtual; + procedure ShowDefaultPopupMenu(const x, y: integer; const shiftstate: TShiftState); virtual; procedure HandleResize(AWidth, AHeight: TfpgCoord); override; procedure HandleKeyChar(var AText: TfpgChar; var shiftstate: TShiftState; var consumed: Boolean); override; procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: Boolean); override; procedure HandleLMouseDown(x, y: integer; shiftstate: TShiftState); override; procedure HandleLMouseUp(x, y: integer; shiftstate: TShiftState); override; + procedure HandleRMouseDown(x, y: integer; shiftstate: TShiftState); override; + procedure HandleRMouseUp(x, y: integer; shiftstate: TShiftState); override; procedure HandlePaint; override; property AutoCompletion: Boolean read FAutocompletion write FAutoCompletion default False; property AllowNew: TAllowNew read FAllowNew write SetAllowNew default anNo; @@ -109,6 +117,7 @@ type TfpgEditCombo = class(TfpgBaseEditCombo) published + property Align; property AllowNew; property AutoCompletion; property BackgroundColor; @@ -145,6 +154,14 @@ uses fpg_listbox, fpg_dialogs; +const + // internal popupmenu item names + //ipmCut = 'miDefaultCut'; + //ipmCopy = 'miDefaultCopy'; + //ipmPaste = 'miDefaultPaste'; + //ipmClearAll = 'miDefaultClearAll'; + ipmCharmap = 'miDefaultCharmap'; + var OriginalFocusRoot: TfpgWidget; @@ -372,6 +389,74 @@ begin Repaint; end; +procedure TfpgBaseEditCombo.DefaultPopupInsertFromCharmap(Sender: TObject); +var + s: TfpgString; +begin + if FAllowNew= anNo then + Exit; + s := fpgShowCharMap; + if s <> '' then + //SetText(s); + DoPaste(s); +end; + +procedure TfpgBaseEditCombo.DoPaste(const AText: TfpgString); +var + s: string; + prevval: TfpgString; + i: integer; +begin + prevval := FText; + s := AText; + if (FMaxLength <= 0) or (UTF8Length(FText) < FMaxLength) then + begin + UTF8Insert(s, FText, FCursorPos + UTF8Length(s)); + Inc(FCursorPos); + FSelStart := FCursorPos; + if Assigned(FDropDown) then + FDropDown.Close; + FSelectedItem := -1; + for i := 0 to FItems.Count-1 do + if SameText(UTF8Copy(FItems.Strings[i], 1, UTF8Length(FText)), FText) then + begin + FSelectedItem:= i; + DoDropDown; + Break; + end; + if FSelectedItem = -1 then + FNewItem:= True; + end; + Repaint; + if prevval <> Text then + DoOnChange; +end; + +procedure TfpgBaseEditCombo.SetDefaultPopupMenuItemsState; +var + i: integer; + itm: TfpgMenuItem; +begin + //for i := 0 to FDefaultPopupMenu.ComponentCount-1 do + //begin + // if FDefaultPopupMenu.Components[i] is TfpgMenuItem then + // begin + // itm := TfpgMenuItem(FDefaultPopupMenu.Components[i]); + // // enabled/disable menu items + // if itm.Name = ipmCut then + // itm.Enabled := (not ReadOnly) and (FSelOffset <> 0) + // else if itm.Name = ipmCopy then + // itm.Enabled := FSelOffset <> 0 + // else if itm.Name = ipmPaste then + // itm.Enabled := (not ReadOnly) and (fpgClipboard.Text <> '') + // else if itm.Name = ipmClearAll then + // itm.Enabled := (not ReadOnly) and (Text <> '') + // else if itm.Name = ipmCharmap then + // itm.Enabled := (not ReadOnly); + // end; + //end; +end; + procedure TfpgBaseEditCombo.SetText(const AValue: string); var i: integer; @@ -398,6 +483,32 @@ begin end; end; +procedure TfpgBaseEditCombo.ShowDefaultPopupMenu(const x, y: integer; + const shiftstate: TShiftState); +var + itm: TfpgMenuItem; +begin + if not Assigned(FDefaultPopupMenu) then + begin + FDefaultPopupMenu := TfpgPopupMenu.Create(nil); + //itm := FDefaultPopupMenu.AddMenuItem(rsCut, '', @DefaultPopupCut); + //itm.Name := ipmCut; + //itm := FDefaultPopupMenu.AddMenuItem(rsCopy, '', @DefaultPopupCopy); + //itm.Name := ipmCopy; + //itm := FDefaultPopupMenu.AddMenuItem(rsPaste, '', @DefaultPopupPaste); + //itm.Name := ipmPaste; + //itm := FDefaultPopupMenu.AddMenuItem(rsDelete, '', @DefaultPopupClearAll); + //itm.Name := ipmClearAll; + //itm := FDefaultPopupMenu.AddMenuItem('-', '', nil); + //itm.Name := 'N1'; + itm := FDefaultPopupMenu.AddMenuItem(rsInsertFromCharacterMap, '', @DefaultPopupInsertFromCharmap); + itm.Name := ipmCharmap; + end; + + SetDefaultPopupMenuItemsState; + FDefaultPopupMenu.ShowAt(self, x, y); +end; + procedure TfpgBaseEditCombo.HandleResize(AWidth, AHeight: TfpgCoord); begin inherited HandleResize(AWidth, AHeight); @@ -595,6 +706,25 @@ begin PaintInternalButton; end; +procedure TfpgBaseEditCombo.HandleRMouseDown(x, y: integer; + shiftstate: TShiftState); +begin + // keyMenu was pressed + if shiftstate = [ssExtra1] then + HandleRMouseUp(x, y, []) + else + inherited HandleRMouseDown(x, y, shiftstate); +end; + +procedure TfpgBaseEditCombo.HandleRMouseUp(x, y: integer; shiftstate: TShiftState); +begin + inherited HandleRMouseUp(x, y, shiftstate); + //if Assigned(PopupMenu) then + // PopupMenu.ShowAt(self, x, y) + //else + ShowDefaultPopupMenu(x, y, ShiftState); +end; + procedure TfpgBaseEditCombo.HandlePaint; var r: TfpgRect; @@ -770,7 +900,8 @@ end; destructor TfpgBaseEditCombo.Destroy; begin - FDropDown.Free; + if not Assigned(FDropDown) then + FDropDown.Free; inherited Destroy; end; diff --git a/src/gui/fpg_form.pas b/src/gui/fpg_form.pas index 57c156a6..2eb6e899 100644 --- a/src/gui/fpg_form.pas +++ b/src/gui/fpg_form.pas @@ -51,6 +51,8 @@ type FOnHide: TNotifyEvent; FOnShow: TNotifyEvent; FOnHelp: TfpgHelpEvent; + FDNDEnabled: boolean; + procedure SetDNDEnabled(const AValue: boolean); protected FModalResult: TfpgModalResult; FParentForm: TfpgBaseForm; @@ -71,6 +73,7 @@ type procedure DoOnClose(var CloseAction: TCloseAction); virtual; function DoOnHelp(AHelpType: THelpType; AHelpContext: THelpContext; const AHelpKeyword: String; const AHelpFile: String; var AHandled: Boolean): Boolean; virtual; // properties + property DNDEnabled: boolean read FDNDEnabled write SetDNDEnabled default False; property Sizeable: boolean read FSizeable write FSizeable; property ModalResult: TfpgModalResult read FModalResult write FModalResult; property FullScreen: boolean read FFullScreen write FFullScreen default False; @@ -106,6 +109,7 @@ type TfpgForm = class(TfpgBaseForm) published property BackgroundColor; + property DNDEnabled; property FullScreen; property Height; property Hint; @@ -133,6 +137,7 @@ type property OnEnter; property OnExit; property OnHide; + property OnKeyPress; property OnMouseDown; property OnMouseEnter; property OnMouseExit; @@ -153,7 +158,11 @@ implementation uses fpg_main, fpg_popupwindow, - fpg_menu; + fpg_menu + {$IFDEF DEBUG} + ,dbugintf + {$ENDIF} + ; type // to access protected methods @@ -180,6 +189,13 @@ end; { TfpgBaseForm } +procedure TfpgBaseForm.SetDNDEnabled(const AValue: boolean); +begin + if FDNDEnabled = AValue then exit; + FDNDEnabled := AValue; + DoDNDEnabled(AValue); +end; + procedure TfpgBaseForm.SetWindowTitle(const ATitle: string); begin FWindowTitle := ATitle; @@ -188,9 +204,14 @@ end; procedure TfpgBaseForm.MsgActivate(var msg: TfpgMessageRec); begin -// writeln('BaseForm - MsgActivate'); + {$IFDEF DEBUG} + SendDebug(Classname + ' ' + Name + '.BaseForm - MsgActivate'); + {$ENDIF} if (fpgApplication.TopModalForm = nil) or (fpgApplication.TopModalForm = self) then begin + {$IFDEF DEBUG} + SendDebug('Inside if block'); + {$ENDIF} FocusRootWidget := self; if FFormDesigner <> nil then @@ -275,6 +296,7 @@ begin FModalResult := mrNone; FFullScreen := False; FIsContainer := True; + FDNDEnabled := False; end; destructor TfpgBaseForm.Destroy; @@ -386,7 +408,9 @@ var i: integer; wg: TfpgWidget; begin -// writeln(Classname, '.Keypress'); + {$IFDEF DEBUG} + SendDebug(Classname + '.Keypress'); + {$ENDIF} // find the TfpgMenuBar if not consumed then begin diff --git a/src/gui/fpg_grid.pas b/src/gui/fpg_grid.pas index 112a1f33..320c2408 100644 --- a/src/gui/fpg_grid.pas +++ b/src/gui/fpg_grid.pas @@ -56,6 +56,7 @@ type property Font; property HeaderFont; published + property Align; property ColumnCount; property Columns; property FocusRow; @@ -125,6 +126,7 @@ type public property Font; published + property Align; property AlternateBGColor; property BackgroundColor; // property ColResizing; @@ -133,11 +135,13 @@ type property ColumnWidth; property DefaultColWidth; property DefaultRowHeight; + property Enabled; property FocusCol; property FocusRow; property FontDesc; property HeaderFontDesc; property HeaderHeight; + property HeaderStyle; property Hint; property Options; property ParentShowHint; diff --git a/src/gui/fpg_hyperlink.pas b/src/gui/fpg_hyperlink.pas index 2c850a97..5d84c718 100644 --- a/src/gui/fpg_hyperlink.pas +++ b/src/gui/fpg_hyperlink.pas @@ -50,6 +50,7 @@ type constructor Create(AOwner: TComponent); override; procedure GoHyperLink; published + property Align; property Alignment; property Autosize; property FontDesc; diff --git a/src/gui/fpg_iniutils.pas b/src/gui/fpg_iniutils.pas index 1c8fe45a..857ccf63 100644 --- a/src/gui/fpg_iniutils.pas +++ b/src/gui/fpg_iniutils.pas @@ -52,6 +52,7 @@ function gINI(const AFileName: string = ''): TfpgINIFile; implementation uses + fpg_base, fpg_main, fpg_constants, fpg_utils; @@ -71,12 +72,12 @@ end; constructor TfpgINIFile.CreateExt(const AFileName: string; AReadOnly: Boolean); var - lDir: string; - lFileName: string; + lDir: TfpgString; + lFileName: TfpgString; begin FReadOnly := AReadOnly; - lDir := ExtractFileDir(AFileName); - lFileName := ExtractFileName(AFileName); + lDir := fpgExtractFileDir(AFileName); + lFileName := fpgExtractFileName(AFileName); if lDir = '' then lDir := GetAppConfigDir(False); @@ -84,7 +85,7 @@ begin lDir := lDir + PathDelim; { We used a non-Global config dir, so should be able to create the dir } - if not ForceDirectories(lDir) then + if not fpgForceDirectories(lDir) then raise Exception.CreateFmt(rsErrFailedToCreateDir, [lDir]); diff --git a/src/gui/fpg_label.pas b/src/gui/fpg_label.pas index 409116b9..0f9c8b4b 100644 --- a/src/gui/fpg_label.pas +++ b/src/gui/fpg_label.pas @@ -68,9 +68,12 @@ type TfpgLabel = class(TfpgCustomLabel) published + property AcceptDrops; + property Align; property Alignment; property AutoSize; property BackgroundColor; + property Enabled; property FontDesc; property Height; property Hint; @@ -90,6 +93,10 @@ type property Width; property WrapText; property OnClick; + property OnDragEnter; + property OnDragLeave; + property OnDragDrop; + property OnDragStartDetected; property OnDoubleClick; property OnMouseDown; property OnMouseEnter; diff --git a/src/gui/fpg_listbox.pas b/src/gui/fpg_listbox.pas index 4b6d162e..a0cb8e93 100644 --- a/src/gui/fpg_listbox.pas +++ b/src/gui/fpg_listbox.pas @@ -92,8 +92,8 @@ type property AutoHeight: boolean read FAutoHeight write SetAutoHeight default False; property FocusItem: integer read FFocusItem write SetFocusItem; property FontDesc: string read GetFontDesc write SetFontDesc; - property HotTrack: boolean read FHotTrack write FHotTrack; - property PopupFrame: boolean read FPopupFrame write SetPopupFrame; + property HotTrack: boolean read FHotTrack write FHotTrack default False; + property PopupFrame: boolean read FPopupFrame write SetPopupFrame default False; property DragToReorder: boolean read FDragToReorder write FDragToReorder default False; public constructor Create(AOwner: TComponent); override; @@ -117,6 +117,8 @@ type TfpgTextListBox = class(TfpgBaseListBox) protected FItems: TStringList; + function GetText: string; virtual; + procedure SetText(const AValue: string); virtual; procedure DrawItem(num: integer; rect: TfpgRect; flags: integer); override; procedure Exchange(Index1, Index2: Integer); override; procedure HandleKeyChar(var AText: TfpgChar; var shiftstate: TShiftState; var consumed: boolean); override; @@ -125,16 +127,19 @@ type constructor Create(AOwner: TComponent); override; destructor Destroy; override; function ItemCount: integer; override; - function Text: string; + property Text: string read GetText write SetText stored False; end; // The standard strings listbox we will actually use in a GUI. TfpgListBox = class(TfpgTextListBox) published + property AcceptDrops; + property Align; property AutoHeight; property BackgroundColor default clListBox; property DragToReorder; + property Enabled; property FocusItem; property FontDesc; property Hint; @@ -144,8 +149,19 @@ type property PopupFrame; property ShowHint; property TabOrder; + property Text; property TextColor; + property OnChange; property OnDoubleClick; + property OnDragDrop; + property OnDragEnter; + property OnDragLeave; + property OnDragStartDetected; + property OnEnter; + property OnExit; + property OnKeyPress; + property OnScroll; + property OnSelect; property OnShowHint; end; @@ -181,7 +197,7 @@ type // procedure HandleKeyChar(var AText: TfpgChar; var shiftstate: TShiftState; var consumed: boolean); override; property Items: TList read FItems; property Color: TfpgColor read GetColor write SetColor; - property ColorPalette: TfpgColorPalette read FColorPalette write SetColorPalette; + property ColorPalette: TfpgColorPalette read FColorPalette write SetColorPalette default cpStandardColors; property ShowColorNames: Boolean read FShowColorNames write SetShowColorNames default True; public constructor Create(AOwner: TComponent); override; @@ -192,11 +208,14 @@ type TfpgColorListBox = class(TfpgBaseColorListBox) published + property AcceptDrops; + property Align; property AutoHeight; property BackgroundColor default clListBox; property Color; property ColorPalette; property DragToReorder; + property Enabled; property FocusItem; property FontDesc; property Hint; @@ -208,6 +227,10 @@ type property ShowHint; property TabOrder; property TextColor; + property OnDragEnter; + property OnDragLeave; + property OnDragDrop; + property OnDragStartDetected; end; @@ -855,6 +878,35 @@ end; { TfpgTextListBox } +function TfpgTextListBox.GetText: string; +begin + if (ItemCount > 0) and (FocusItem <> -1) then + result := FItems[FocusItem] + else + result := ''; +end; + +procedure TfpgTextListBox.SetText(const AValue: string); +var + i: integer; +begin + if AValue = '' then + SetFocusItem(-1) // nothing selected + else + begin + for i := 0 to FItems.Count-1 do + begin + if SameText(Items.Strings[i], AValue) then + begin + SetFocusItem(i); + Exit; //==> + end; + end; + // if we get here, we didn't find a match + SetFocusItem(-1); + end; +end; + procedure TfpgTextListBox.DrawItem(num: integer; rect: TfpgRect; flags: integer); begin //if num < 0 then @@ -905,14 +957,6 @@ begin result := FItems.Count; end; -function TfpgTextListBox.Text: string; -begin - if (ItemCount > 0) and (FocusItem <> -1) then - result := FItems[FocusItem] - else - result := ''; -end; - { TColorItem } constructor TColorItem.Create (const AColorName: string; const AColorValue: TfpgColor); diff --git a/src/gui/fpg_listview.pas b/src/gui/fpg_listview.pas index 12ed4364..cd9268f4 100644 --- a/src/gui/fpg_listview.pas +++ b/src/gui/fpg_listview.pas @@ -249,7 +249,9 @@ type function AddItem: TfpgLVItem; function NewItem: TfpgLVItem; published + property Align; property Columns: TfpgLVColumns read FColumns; + property Enabled; property HScrollBar: TfpgScrollBar read FHScrollBar; property ItemHeight: Integer read GetItemHeight; property ItemIndex: Integer read FItemIndex write SetItemIndex; diff --git a/src/gui/fpg_memo.pas b/src/gui/fpg_memo.pas index 37f21a42..789da3c3 100644 --- a/src/gui/fpg_memo.pas +++ b/src/gui/fpg_memo.pas @@ -60,12 +60,15 @@ type FWrapping: boolean; FLongestLineWidth: TfpgCoord; FPopupMenu: TfpgPopupMenu; + FDefaultPopupMenu: TfpgPopupMenu; + FReadOnly: Boolean; + FUpdateCount: integer; function GetFontDesc: string; procedure SetFontDesc(const AValue: string); procedure RecalcLongestLine; procedure DeleteSelection; procedure DoCopy; - procedure DoPaste; + procedure DoPaste(const AText: TfpgString); procedure AdjustCursor; function LineCount: integer; function GetLineText(linenum: integer): string; @@ -81,10 +84,21 @@ type function GetText: TfpgString; procedure SetCursorLine(aValue: integer); procedure UpdateScrollBarCoords; + procedure DefaultPopupCut(Sender: TObject); + procedure DefaultPopupCopy(Sender: TObject); + procedure DefaultPopupPaste(Sender: TObject); + procedure DefaultPopupClearAll(Sender: TObject); + procedure DefaultPopupInsertFromCharmap(Sender: TObject); + procedure SetDefaultPopupMenuItemsState; + procedure ShowDefaultPopupMenu(const x, y: integer; const shiftstate: TShiftState); virtual; + procedure SetReadOnly(const AValue: Boolean); + procedure ResetSelectionVariables; + procedure SetCursorPos(const AValue: integer); protected procedure HandleKeyChar(var AText: TfpgChar; var shiftstate: TShiftState; var consumed: boolean); override; procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override; procedure HandleLMouseDown(x, y: integer; shiftstate: TShiftState); override; + procedure HandleRMouseDown(x, y: integer; shiftstate: TShiftState); override; procedure HandleRMouseUp(x, y: integer; shiftstate: TShiftState); override; procedure HandleMouseMove(x, y: integer; btnstate: word; shiftstate: TShiftState); override; procedure HandleResize(dwidth, dheight: integer); override; @@ -94,11 +108,19 @@ type procedure HandleMouseEnter; override; procedure HandleMouseExit; override; procedure HandleHide; override; + procedure RePaint; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure UpdateScrollBars; - function SelectionText: string; + function SelectionText: TfpgString; + procedure CopyToClipboard; + procedure CutToClipboard; + procedure PasteFromClipboard; + procedure Clear; + procedure BeginUpdate; + procedure EndUpdate; + property CursorPos: integer read FCursorPos write SetCursorPos; property CursorLine: integer read FCursorLine write SetCursorLine; property Font: TfpgFont read FFont; property LineHeight: integer read FLineHeight; @@ -108,11 +130,14 @@ type property UseTabs: boolean read FUseTabs write FUseTabs default False; property PopupMenu: TfpgPopupMenu read FPopupMenu write FPopupMenu; published + property Align; property BackgroundColor default clBoxColor; + property Enabled; property FontDesc: string read GetFontDesc write SetFontDesc; property Hint; property Lines: TStringList read FLines; property ParentShowHint; + property ReadOnly: Boolean read FReadOnly write SetReadOnly default False; property ShowHint; property TabOrder; property TextColor; @@ -130,14 +155,25 @@ function CreateMemo(AOwner: TComponent; x, y, w, h: TfpgCoord): TfpgMemo; implementation uses - fpg_stringutils; + fpg_stringutils + ,fpg_constants + ,fpg_dialogs + ; + +const + // internal popupmenu item names + ipmCut = 'miDefaultCut'; + ipmCopy = 'miDefaultCopy'; + ipmPaste = 'miDefaultPaste'; + ipmClearAll = 'miDefaultClearAll'; + ipmCharmap = 'miDefaultCharmap'; + type // custom stringlist that will notify the memo of item changes TfpgMemoStrings = class(TStringList) protected Memo: TfpgMemo; - procedure RefreshMemo; public constructor Create(AMemo: TfpgMemo); reintroduce; destructor Destroy; override; @@ -149,15 +185,6 @@ type { TfpgMemoStrings } -procedure TfpgMemoStrings.RefreshMemo; -begin - if Assigned(Memo) and (Memo.HasHandle) then - begin - Memo.Invalidate; - Memo.UpdateScrollBars; - end; -end; - constructor TfpgMemoStrings.Create(AMemo: TfpgMemo); begin inherited Create; @@ -172,28 +199,30 @@ end; function TfpgMemoStrings.Add(const s: String): Integer; begin + Memo.BeginUpdate; Result := inherited Add(s); - RefreshMemo; + Memo.EndUpdate; end; procedure TfpgMemoStrings.Delete(Index: Integer); begin -// writeln('Delete''s Index = ', Index); + Memo.BeginUpdate; inherited Delete(Index); - RefreshMemo; + Memo.EndUpdate; end; procedure TfpgMemoStrings.Insert(Index: Integer; const S: string); begin -// writeln('Insert''s Index = ', Index); + Memo.BeginUpdate; inherited Insert(Index, S); - RefreshMemo; + Memo.EndUpdate; end; procedure TfpgMemoStrings.Clear; begin + Memo.BeginUpdate; inherited Clear; - RefreshMemo; + Memo.EndUpdate; end; @@ -217,13 +246,18 @@ var MaxLine: integer; yp: integer; begin - if (aValue < 0) or (aValue = FCursorLine) then + if (aValue < 0) or (aValue = FCursorLine) or (AValue > FLines.Count-1) then Exit; // wrong value + if aValue < FFirstLine then begin FFirstLine := aValue; // moves the selected line to the top of the displayed rectangle FCursorLine := aValue; FCursorPos := 0; + FSelStartPos := FCursorPos; + FSelStartLine := FCursorLine; + FSelEndLine := -1; + AdjustCursor; RePaint; Exit; end; @@ -243,15 +277,21 @@ begin FFirstLine := aValue; FCursorLine := aValue; FCursorPos := 0; + FSelStartPos := FCursorPos; + FSelStartLine := FCursorLine; + FSelEndLine := -1; + AdjustCursor; RePaint; - Exit; end else begin FCursorLine := aValue; FCursorPos := 0; + FSelStartPos := FCursorPos; + FSelStartLine := FCursorLine; + FSelEndLine := -1; + AdjustCursor; RePaint; - Exit; end; end; @@ -280,6 +320,144 @@ begin FHScrollBar.UpdateWindowPosition; end; +procedure TfpgMemo.DefaultPopupCut(Sender: TObject); +begin + if ReadOnly then + Exit; + CutToClipboard; +end; + +procedure TfpgMemo.DefaultPopupCopy(Sender: TObject); +begin + if ReadOnly then + Exit; + CopyToClipboard; +end; + +procedure TfpgMemo.DefaultPopupPaste(Sender: TObject); +begin + if ReadOnly then + Exit; + PasteFromClipboard; +end; + +procedure TfpgMemo.DefaultPopupClearAll(Sender: TObject); +begin + if ReadOnly then + Exit; + Clear; +end; + +procedure TfpgMemo.DefaultPopupInsertFromCharmap(Sender: TObject); +var + s: TfpgString; +begin + if ReadOnly then + Exit; + s := fpgShowCharMap; + if s <> '' then + DoPaste(s); +end; + +procedure TfpgMemo.SetDefaultPopupMenuItemsState; +var + i: integer; + itm: TfpgMenuItem; + b: boolean; + + function SomethingSelected: boolean; + begin + Result := SelectionText <> ''; + end; + +begin + b := SomethingSelected; + for i := 0 to FDefaultPopupMenu.ComponentCount-1 do + begin + if FDefaultPopupMenu.Components[i] is TfpgMenuItem then + begin + itm := TfpgMenuItem(FDefaultPopupMenu.Components[i]); + // enabled/disable menu items + if itm.Name = ipmCut then + itm.Enabled := (not ReadOnly) and b + else if itm.Name = ipmCopy then + itm.Enabled := b + else if itm.Name = ipmPaste then + itm.Enabled := (not ReadOnly) and (fpgClipboard.Text <> '') + else if itm.Name = ipmClearAll then + itm.Enabled := (not ReadOnly) and (Text <> '') + else if itm.Name = ipmCharmap then + itm.Enabled := (not ReadOnly); + end; + end; +end; + +procedure TfpgMemo.ShowDefaultPopupMenu(const x, y: integer; + const shiftstate: TShiftState); +var + itm: TfpgMenuItem; +begin + if not Assigned(FDefaultPopupMenu) then + begin + FDefaultPopupMenu := TfpgPopupMenu.Create(nil); + itm := FDefaultPopupMenu.AddMenuItem(rsCut, '', @DefaultPopupCut); + itm.Name := ipmCut; + itm := FDefaultPopupMenu.AddMenuItem(rsCopy, '', @DefaultPopupCopy); + itm.Name := ipmCopy; + itm := FDefaultPopupMenu.AddMenuItem(rsPaste, '', @DefaultPopupPaste); + itm.Name := ipmPaste; + itm := FDefaultPopupMenu.AddMenuItem(rsDelete, '', @DefaultPopupClearAll); + itm.Name := ipmClearAll; + itm := FDefaultPopupMenu.AddMenuItem('-', '', nil); + itm.Name := 'N1'; + itm := FDefaultPopupMenu.AddMenuItem(rsInsertFromCharacterMap, '', @DefaultPopupInsertFromCharmap); + itm.Name := ipmCharmap; + end; + + SetDefaultPopupMenuItemsState; + FDefaultPopupMenu.ShowAt(self, x, y); +end; + +procedure TfpgMemo.SetReadOnly(const AValue: Boolean); +begin + if FReadOnly = AValue then exit; + FReadOnly := AValue; + RePaint; +end; + +procedure TfpgMemo.ResetSelectionVariables; +begin + FSelecting := False; + FSelStartPos := FCursorPos; + FSelEndPos := FCursorPos; + FSelStartLine := FCursorLine; + FSelEndLine := FCursorLine; + FMouseDragging := False; +end; + +procedure TfpgMemo.SetCursorPos(const AValue: integer); +var + x: integer; +begin + if FCursorPos = AValue then + exit; + + if AValue = 0 then + FCursorPos := AValue + else + begin + x := UTF8Length(FLines[CursorLine]); + if AValue > x then { can't set Cursorpos greater than number of characters on that line } + FCursorPos := x + else + FCursorPos := AValue; + end; + FSelStartPos := FCursorPos; + FSelEndPos := FCursorPos; + AdjustCursor; + Repaint; +end; + constructor TfpgMemo.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -288,7 +466,6 @@ begin FHeight := FFont.Height * 3 + 4; FWidth := 120; FLineHeight := FFont.Height + 2; - FSelecting := False; FSideMargin := 3; FMaxLength := 0; FWrapping := False; @@ -299,19 +476,18 @@ begin FTabWidth := 4; FMinWidth := 20; FMinHeight := 30; + FPopupMenu := nil; + FDefaultPopupMenu := nil; + FReadOnly := False; + FUpdateCount := 0; FLines := TfpgMemoStrings.Create(self); FFirstLine := 0; FCursorLine := 0; - FCursorPos := 0; - FSelStartPos := FCursorPos; - FSelEndPos := 0; - FSelStartLine := -1; - FSelEndLine := -1; + ResetSelectionVariables; FDrawOffset := 0; - FMouseDragging := False; FVScrollBar := TfpgScrollBar.Create(self); FVScrollBar.Orientation := orVertical; @@ -327,6 +503,8 @@ end; destructor TfpgMemo.Destroy; begin + if Assigned(FDefaultPopupMenu) then + FDefaultPopupMenu.Free; TfpgMemoStrings(FLines).Free; FFont.Free; inherited Destroy; @@ -362,6 +540,8 @@ var len: integer; st: integer; begin + if ReadOnly then + Exit; if FSelEndLine < 0 then Exit; @@ -410,84 +590,42 @@ begin FCursorPos := selsp; FCursorLine := selsl; + FSelStartPos := FCursorPos; + FSelEndPos := FCursorPos; + FSelStartLine := selsl; FSelEndLine := -1; end; procedure TfpgMemo.DoCopy; -var - n: integer; - selsl: integer; - selsp: integer; - selel: integer; - selep: integer; - ls: string; - len: integer; - st: integer; - s: string; begin if FSelEndLine < 0 then Exit; - if (FSelStartLine shl 16) + FSelStartPos <= (FSelEndLine shl 16) + FSelEndPos then - begin - selsl := FSelStartLine; - selsp := FSelStartPos; - selel := FSelEndLine; - selep := FSelEndPos; - end - else - begin - selel := FSelStartLine; - selep := FSelStartPos; - selsl := FSelEndLine; - selsp := FSelEndPos; - end; - - s := ''; - - for n := selsl to selel do - begin - if n > selsl then - s := s + #13#10; - - ls := GetLineText(n); - - if selsl < n then - st := 0 - else - st := selsp; - - if selel > n then - len := UTF8Length(ls) - else - len := selep - st; - - s := s + UTF8Copy(ls, st + 1, len); - end; - - //SetClipboardText(s); + fpgClipboard.Text := SelectionText; end; -procedure TfpgMemo.DoPaste; -{ +procedure TfpgMemo.DoPaste(const AText: TfpgString); var - s: string; - si: string; - si8: string; - lineend: string; + s: TfpgString; + si: TfpgString; { beginning of line to cursor } + si8: TfpgString; + lineend: TfpgString; { from cursor to end of line } n: integer; l: integer; lcnt: integer; -} begin - Exit; - (* + if ReadOnly then + Exit; DeleteSelection; - s := GetClipboardText; + s := AText; si := UTF8Copy(CurrentLine,1,FCursorPos); lineend := UTF8Copy(CurrentLine,FCursorPos+1, UTF8Length(CurrentLine)); - l := FCursorLine; + if FCursorLine = -1 then { first time in, FLines has no data yet } + l := 0 + else + l := FCursorLine; + n := 1; lcnt := 0; si8 := ''; @@ -495,8 +633,10 @@ begin begin if (s[n] = #13) or (s[n] = #10) then begin - if lcnt = 0 then SetLineText(l, si + si8) - else FLines.Insert(l-1, si + si8); + if lcnt = 0 then + SetLineText(l, si + si8) + else + FLines.Insert(l, si + si8); si := ''; si8 := ''; @@ -524,13 +664,13 @@ begin end else begin - FLines.Insert(l-1, si); + FLines.Insert(l, si); FCursorLine := l; end; AdjustCursor; + ResetSelectionVariables; Repaint; -*) end; procedure TfpgMemo.AdjustCursor; @@ -747,6 +887,12 @@ begin inherited; end; +procedure TfpgMemo.RePaint; +begin + if FUpdateCount <= 0 then + inherited RePaint; +end; + procedure TfpgMemo.VScrollBarMove(Sender: TObject; position: integer); begin if FFirstLine <> position then @@ -783,7 +929,7 @@ begin InflateRect(r, -2, -2); Canvas.SetClipRect(r); - if Enabled then + if Enabled and not ReadOnly then Canvas.SetColor(FBackgroundColor) else Canvas.SetColor(clWindowBackground); @@ -895,31 +1041,35 @@ begin prevval := Text; s := AText; - // Printable characters only - // Note: This is now UTF-8 compliant! - if (Ord(AText[1]) > 31) and (Ord(AText[1]) < 127) or (Length(AText) > 1) then + if (not consumed) and (not ReadOnly) then begin - if (FMaxLength <= 0) or (UTF8Length(FLines.Text) < FMaxLength) then + // Printable characters only + // Note: This is now UTF-8 compliant! + if (Ord(AText[1]) > 31) and (Ord(AText[1]) < 127) or (Length(AText) > 1) then begin - if FCursorLine < 0 then - FCursorLine := 0; - DeleteSelection; - ls := GetLineText(FCursorLine); - UTF8Insert(s, ls, FCursorPos + 1); - SetLineText(FCursorLine, ls); - Inc(FCursorPos); - FSelStartPos := FCursorPos; - FSelStartLine := FCursorLine; - FSelEndLine := -1; - AdjustCursor; + if (FMaxLength <= 0) or (UTF8Length(FLines.Text) < FMaxLength) then + begin + if FCursorLine < 0 then + FCursorLine := 0; + DeleteSelection; + ls := GetLineText(FCursorLine); + UTF8Insert(s, ls, FCursorPos + 1); + SetLineText(FCursorLine, ls); + Inc(FCursorPos); + FSelStartPos := FCursorPos; + FSelStartLine := FCursorLine; + FSelEndLine := -1; + AdjustCursor; + end; + + consumed := True; end; - consumed := True; + if prevval <> Text then + if Assigned(FOnChange) then + FOnChange(self); end; - if prevval <> Text then - if Assigned(FOnChange) then - FOnChange(self); if consumed then RePaint; @@ -932,15 +1082,8 @@ var ls: string; ls2: string; hasChanged: boolean; - - procedure StopSelection; - begin - FSelStartLine := FCursorLine; - FSelStartPos := FCursorPos; - FSelEndLine := -1; - end; - begin + fpgApplication.HideHint; Consumed := True; hasChanged := False; case CheckClipBoardKey(keycode, shiftstate) of @@ -950,14 +1093,19 @@ begin end; ckPaste: begin - DoPaste; - hasChanged := True; + DoPaste(fpgClipboard.Text); + if not ReadOnly then + hasChanged := True; end; ckCut: begin DoCopy; DeleteSelection; - hasChanged := True; + if not ReadOnly then + begin + AdjustCursor; + hasChanged := True; + end; end; else Consumed := False; @@ -974,7 +1122,6 @@ begin if FCursorPos > 0 then begin Dec(FCursorPos); - if (ssCtrl in shiftstate) then // word search... (* @@ -984,14 +1131,12 @@ begin while (FCursorPos > 0) and pgfIsAlphaNum(copy(CurrentLine,FCursorPos,1)) do Dec(FCursorPos); *); - end;// left keyRight: if FCursorPos < UTF8Length(CurrentLine) then begin Inc(FCursorPos); - if (ssCtrl in shiftstate) then // word search... (* @@ -1001,7 +1146,6 @@ begin while (FCursorPos < length(CurrentLine)) and not pgfIsAlphaNum(copy(CurrentLine,FCursorPos+1,1)) do Inc(FCursorPos); *); - end;// right keyUp: @@ -1074,11 +1218,11 @@ begin FSelEndLine := FCursorLine; end else - StopSelection; + ResetSelectionVariables; end; end; - if not Consumed then + if (not Consumed) and (not ReadOnly) then begin consumed := True; @@ -1118,7 +1262,7 @@ begin keyDelete: begin ls := GetLineText(FCursorLine); - if FSelEndLine > -1 then + if SelectionText <> '' then DeleteSelection else if FCursorPos < UTF8Length(ls) then begin @@ -1165,8 +1309,8 @@ begin if Consumed then begin - StopSelection; AdjustCursor; + ResetSelectionVariables; end; end; @@ -1190,6 +1334,7 @@ var ls: string; begin inherited HandleLMouseDown(x, y, shiftstate); + ResetSelectionVariables; // searching the appropriate character position lnum := FFirstLine + (y - FSideMargin) div LineHeight; @@ -1219,9 +1364,11 @@ begin begin FSelEndLine := lnum; FSelEndpos := cp; + FSelecting := True; end else begin + FSelecting := False; FSelStartLine := lnum; FSelStartPos := cp; FSelEndLine := -1; @@ -1229,11 +1376,22 @@ begin Repaint; end; +procedure TfpgMemo.HandleRMouseDown(x, y: integer; shiftstate: TShiftState); +begin + // keyMenu was pressed + if shiftstate = [ssExtra1] then + HandleRMouseUp(x, y, []) + else + inherited HandleRMouseDown(x, y, shiftstate); +end; + procedure TfpgMemo.HandleRMouseUp(x, y: integer; shiftstate: TShiftState); begin inherited HandleRMouseUp(x, y, shiftstate); if Assigned(PopupMenu) then - PopupMenu.ShowAt(self, x, y); + PopupMenu.ShowAt(self, x, y) + else + ShowDefaultPopupMenu(x, y, ShiftState); end; procedure TfpgMemo.HandleMouseMove(x, y: integer; btnstate: word; shiftstate: TShiftState); @@ -1276,6 +1434,7 @@ begin FSelEndLine := lnum; FSelEndPos := cp; FCursorPos := cp; + FSelecting := True; Repaint; end; @@ -1396,23 +1555,105 @@ begin end; end; -function TfpgMemo.SelectionText: string; +function TfpgMemo.SelectionText: TfpgString; +var + n: integer; + selsl: integer; + selsp: integer; + selel: integer; + selep: integer; + ls: string; + len: integer; + st: integer; + s: TfpgString; begin - { - if FSelOffset <> 0 then + if (FSelStartLine shl 16) + FSelStartPos <= (FSelEndLine shl 16) + FSelEndPos then begin - if FSelOffset < 0 then - begin - Result := Copy(FText,1+FSelStart + FSelOffset,-FSelOffset); - end - else - begin - result := Copy(FText,1+FSelStart,FSelOffset); - end; + selsl := FSelStartLine; + selsp := FSelStartPos; + selel := FSelEndLine; + selep := FSelEndPos; end else -} - Result := ''; + begin + selel := FSelStartLine; + selep := FSelStartPos; + selsl := FSelEndLine; + selsp := FSelEndPos; + end; + + s := ''; + for n := selsl to selel do + begin + if n > selsl then + s := s + LineEnding; + + ls := GetLineText(n); + + if selsl < n then + st := 0 + else + st := selsp; + + if selel > n then + len := UTF8Length(ls) + else + len := selep - st; + + s := s + UTF8Copy(ls, st + 1, len); + end; + + Result := s; +end; + +procedure TfpgMemo.CopyToClipboard; +begin + DoCopy; +end; + +procedure TfpgMemo.CutToClipboard; +begin + DoCopy; + DeleteSelection; + AdjustCursor; + ResetSelectionVariables; + RePaint; +end; + +procedure TfpgMemo.PasteFromClipboard; +begin + DoPaste(fpgClipboard.Text); +end; + +procedure TfpgMemo.Clear; +begin + FLines.Clear; + { not sure if all of these are required } + FFirstLine := 0; + FCursorLine := 0; + FCursorPos := 0; + FSelStartPos := FCursorPos; + FSelEndPos := 0; + FSelStartLine := -1; + FSelEndLine := -1; + FDrawOffset := 0; + + Repaint; +end; + +procedure TfpgMemo.BeginUpdate; +begin + Inc(FUpdateCount); +end; + +procedure TfpgMemo.EndUpdate; +begin + Dec(FUpdateCount); + if FUpdateCount <= 0 then + begin + Invalidate; + UpdateScrollBars; + end; end; function TfpgMemo.GetText: TfpgString; diff --git a/src/gui/fpg_menu.pas b/src/gui/fpg_menu.pas index 06e64b6f..dbe3a90a 100644 --- a/src/gui/fpg_menu.pas +++ b/src/gui/fpg_menu.pas @@ -123,7 +123,7 @@ type procedure HandlePaint; override; procedure HandleShow; override; procedure HandleClose; override; - procedure DrawItem(mi: TfpgMenuItem; rect: TfpgRect; const AItemFocused: boolean); virtual; + procedure DrawItem(mi: TfpgMenuItem; rect: TfpgRect; AFlags: TfpgMenuItemFlags); virtual; procedure DrawRow(line: integer; const AItemFocused: boolean); virtual; function ItemHeight(mi: TfpgMenuItem): integer; virtual; procedure PrepareToShow; @@ -150,10 +150,13 @@ type FMenuOptions: TfpgMenuOptions; FPrevFocusItem: integer; FFocusItem: integer; + FClicked: Boolean; + FLastItemClicked: integer; procedure SetFocusItem(const AValue: integer); procedure DoSelect; procedure CloseSubmenus; function ItemWidth(mi: TfpgMenuItem): integer; + procedure InternalReset; protected FItems: TList; // stores visible items only property FocusItem: integer read FFocusItem write SetFocusItem; @@ -407,6 +410,8 @@ var begin inherited HandleMouseMove(x, y, btnstate, shiftstate); + newf := CalcMouseCol(x); + // process menu options if mnuo_nofollowingmouse in FMenuOptions then begin @@ -415,17 +420,19 @@ begin end else if mnuo_autoopen in FMenuOptions then begin - if not Focused then - ActivateMenu; +// if not Focused then + FLastItemClicked := newf; + FClicked := True; + ActivateMenu; end else begin - if not Focused then - Exit; + if not FClicked then + exit + else + FLastItemClicked := newf; end; - - newf := CalcMouseCol(x); if not VisibleItem(newf).Selectable then Exit; //==> @@ -452,17 +459,31 @@ begin if ComponentCount = 0 then Exit; // We have no menu items in MainMenu. + + newf := CalcMouseCol(x); + if (FLastItemClicked <> -1) and (FLastItemClicked <> newf) then + begin + // do nothing + //FClicked := not FClicked + end + else + begin + if VisibleItem(newf).Selectable then + FClicked := not FClicked; + end; - if not Focused then + if FClicked then + begin ActivateMenu; - //else - //begin - //CloseSubmenus; - //DeActivateMenu; - //Exit; //==> - //end; - - newf := CalcMouseCol(x); + FLastItemClicked := newf; + end + else + begin + CloseSubmenus; + DeActivateMenu; + FLastItemClicked := -1; + exit; //==> + end; if not VisibleItem(newf).Selectable then Exit; //==> @@ -531,7 +552,9 @@ begin FBeforeShow := nil; FFocusItem := -1; FPrevFocusItem := -1; + FLastItemClicked := -1; FFocusable := False; + FClicked := False; FBackgroundColor := Parent.BackgroundColor; FTextColor := Parent.TextColor; // calculate the best height based on font @@ -554,6 +577,12 @@ begin Result := fpgStyle.MenuFont.TextWidth(mi.Text) + (2*6); end; +procedure TfpgMenuBar.InternalReset; +begin + FClicked := False; + FLastItemClicked := -1; +end; + procedure TfpgMenuBar.DrawColumn(col: integer; focus: boolean); var n: integer; @@ -736,6 +765,7 @@ begin Result:= TfpgMenuItem(Components[AMenuPos]); end; + { TfpgPopupMenu } procedure TfpgPopupMenu.DoSelect; @@ -765,7 +795,11 @@ begin op.Close; op := op.OpenerPopup; end; + // notify menubar that we clicked a menu item + if Assigned(OpenerMenuBar) then + OpenerMenuBar.InternalReset; VisibleItem(FFocusItem).Click; + FFocusItem := -1; end; { if/else } // if OpenerMenuBar <> nil then @@ -1017,35 +1051,32 @@ begin Result := TfpgMenuItem(FItems.Items[ind]); end; -procedure TfpgPopupMenu.DrawItem(mi: TfpgMenuItem; rect: TfpgRect; const AItemFocused: boolean); +procedure TfpgPopupMenu.DrawItem(mi: TfpgMenuItem; rect: TfpgRect; AFlags: TfpgMenuItemFlags); var s: string; x: integer; img: TfpgImage; + lFlags: TfpgMenuItemFlags; begin + lFlags := AFlags; if mi.Separator then begin - Canvas.SetColor(clShadow1); - Canvas.DrawLine(rect.Left+1, rect.Top+2, rect.Right, rect.Top+2); - Canvas.SetColor(clHilite2); - Canvas.DrawLine(rect.Left+1, rect.Top+3, rect.Right, rect.Top+3); + fpgStyle.DrawMenuItemSeparator(Canvas, rect); end else begin // process Check mark if needed if mi.Checked then begin - img := fpgImages.GetImage('stdimg.check'); // Do NOT localize - if AItemFocused then - img.Invert; - Canvas.DrawImage(rect.Left, rect.Top, img); - if AItemFocused then - img.Invert; // restore image to original state + lFlags := lFlags + [mifChecked]; + fpgStyle.DrawMenuItemImage(Canvas, rect.Left, rect.Top, rect, lFlags); + lFlags := lFlags - [mifChecked]; end; // process menu item Text x := rect.Left + FSymbolWidth + FTextMargin; mi.DrawText(Canvas, x+cImgWidth, rect.top, cImgWidth); + Canvas.SetColor(Canvas.TextColor); // reset text default color // process menu item Hot Key text if mi.HotKeyDef <> '' then @@ -1057,10 +1088,9 @@ begin // process menu item submenu arrow image if mi.SubMenu <> nil then begin - Canvas.SetColor(Canvas.TextColor); - x := (rect.height div 2) - 3; - img := fpgImages.GetImage('sys.sb.right'); // Do NOT localize - Canvas.DrawImage(rect.right-x-2, rect.Top + ((rect.Height-img.Height) div 2), img); + lFlags := lFlags + [mifSubMenu]; + fpgStyle.DrawMenuItemImage(Canvas, rect.Left, rect.Top, rect, lFlags); + lFlags := lFlags - [mifSubMenu]; end; end; end; @@ -1070,25 +1100,33 @@ var n: integer; r: TfpgRect; mi: TfpgMenuItem; + lFlags: TfpgMenuItemFlags; begin - Canvas.BeginDraw; r.SetRect(FMargin, FMargin, FWidth-(2*FMargin), FHeight-(2*FMargin)); for n := 0 to VisibleCount-1 do begin mi := VisibleItem(n); - + lFlags := []; r.height := ItemHeight(mi); if line = n then begin + if AItemFocused then + lFlags := [mifSelected]; // refering to menu item in active popup menu + if mi.Separator then + lFlags := lFlags + [mifSeparator]; if AItemFocused and (not mi.Separator) then begin - if MenuFocused then + if MenuFocused then // refering to popup menu window begin + lFlags := lFlags + [mifHasFocus]; Canvas.SetColor(clSelection); if mi.Selectable then - Canvas.SetTextColor(clSelectionText) + begin + lFlags := lFlags + [mifEnabled]; + Canvas.SetTextColor(clSelectionText); + end else Canvas.SetTextColor(clMenuDisabled); end @@ -1102,6 +1140,7 @@ begin begin if mi.Enabled then begin + lFlags := lFlags + [mifEnabled]; Canvas.SetColor(BackgroundColor); Canvas.SetTextColor(clMenuText); end @@ -1111,9 +1150,9 @@ begin Canvas.SetTextColor(clMenuDisabled); end; end; - Canvas.FillRectangle(r); - DrawItem(mi, r, AItemFocused); - Canvas.EndDraw(r.Left, r.Top, r.Width, r.Height); + fpgStyle.DrawMenuRow(Canvas, r, lFlags); + DrawItem(mi, r, lFlags); + Exit; //==> end; inc(r.Top, ItemHeight(mi) ); diff --git a/src/gui/fpg_panel.pas b/src/gui/fpg_panel.pas index b58b516d..66ed5778 100644 --- a/src/gui/fpg_panel.pas +++ b/src/gui/fpg_panel.pas @@ -73,8 +73,11 @@ type protected procedure HandlePaint; override; published + property AcceptDrops; + property Align; property BackgroundColor; property BorderStyle; + property Enabled; property Height; property Hint; property Left; @@ -91,6 +94,10 @@ type property Width; property OnClick; property OnDoubleClick; + property OnDragDrop; + property OnDragEnter; + property OnDragLeave; + property OnDragStartDetected; property OnMouseDown; property OnMouseMove; property OnMouseUp; @@ -129,9 +136,12 @@ type destructor Destroy; override; property Font: TfpgFont read FFont; published + property AcceptDrops; + property Align; property Alignment: TAlignment read GetAlignment write SetAlignment default taCenter; property BackgroundColor; property BorderStyle; + property Enabled; property FontDesc: string read GetFontDesc write SetFontDesc; property Height; property Hint; @@ -154,6 +164,11 @@ type property WrapText: boolean read GetWrapText write SetWrapText default False; property OnClick; property OnDoubleClick; + property OnDragDrop; + property OnDragEnter; + property OnDragLeave; + property OnDragStartDetected; + property OnPaint; property OnShowHint; end; @@ -180,9 +195,12 @@ type function GetClientRect: TfpgRect; override; property Font: TfpgFont read FFont; published + property AcceptDrops; + property Align; property Alignment: TAlignment read GetAlignment write SetAlignment default taLeftJustify; property BackgroundColor; property BorderStyle; + property Enabled; property FontDesc: string read GetFontDesc write SetFontDesc; property Height; property Hint; @@ -201,6 +219,11 @@ type property Width; property OnClick; property OnDoubleClick; + property OnDragDrop; + property OnDragEnter; + property OnDragLeave; + property OnDragStartDetected; + property OnPaint; property OnShowHint; end; @@ -209,7 +232,7 @@ function CreateBevel(AOwner: TComponent; ALeft, ATop, AWidth, AHeight: TfpgCoord AStyle: TPanelStyle): TfpgBevel; function CreatePanel(AOwner: TComponent; ALeft, ATop, AWidth, AHeight: TfpgCoord; AText: string; - AStyle: TPanelStyle; AALignment: TAlignment= taCenter; ALayout: TLayout= tlCenter; + AStyle: TPanelStyle = bsRaised; AALignment: TAlignment= taCenter; ALayout: TLayout= tlCenter; AMargin: integer= 2; ALineSpace: integer= 2): TfpgPanel; function CreateGroupBox(AOwner: TComponent; ALeft, ATop, AWidth, AHeight: TfpgCoord; AText: string; @@ -333,21 +356,24 @@ begin else Canvas.SetLineStyle(2, lsSolid); + { top } if FPanelBorder = bsSingle then Canvas.DrawLine(0, 0, Width - 1, 0) else Canvas.DrawLine(0, 1, Width - 1, 1); + { left } if FPanelBorder = bsSingle then Canvas.DrawLine(0, 1, 0, Height - 1) else Canvas.DrawLine(1, 1, 1, Height - 1); if Style = bsRaised then - Canvas.SetColor(clShadow2) + Canvas.SetColor(clShadow1) else Canvas.SetColor(clHilite2); + { right, then bottom } Canvas.DrawLine(Width - 1, 0, Width - 1, Height - 1); Canvas.DrawLine(0, Height - 1, Width, Height - 1); end; @@ -597,7 +623,7 @@ begin if Style = bsRaised then Canvas.SetColor(clHilite2) else - Canvas.SetColor(clShadow2); + Canvas.SetColor(clShadow1); if FPanelBorder = bsSingle then begin @@ -611,7 +637,7 @@ begin end; if Style = bsRaised then - Canvas.SetColor(clShadow2) + Canvas.SetColor(clShadow1) else Canvas.SetColor(clHilite2); diff --git a/src/gui/fpg_popupcalendar.pas b/src/gui/fpg_popupcalendar.pas index af27568b..ea6eb617 100644 --- a/src/gui/fpg_popupcalendar.pas +++ b/src/gui/fpg_popupcalendar.pas @@ -221,12 +221,14 @@ type public constructor Create(AOwner: TComponent); override; published + property Align; property BackgroundColor; { Clicking on calendar Today button will close the popup calendar by default } property CloseOnSelect: boolean read FCloseOnSelect write SetCloseOnSelect default True; property DateFormat: string read FDateFormat write SetDateFormat; property DateValue: TDateTime read FDate write SetDateValue; property DayColor: TfpgColor read FDayColor write SetDayColor; + property Enabled; property FontDesc; property Hint; property HolidayColor: TfpgColor read FHolidayColor write SetHolidayColor; diff --git a/src/gui/fpg_progressbar.pas b/src/gui/fpg_progressbar.pas index ee6b2405..e106577c 100644 --- a/src/gui/fpg_progressbar.pas +++ b/src/gui/fpg_progressbar.pas @@ -60,7 +60,9 @@ type TfpgProgressBar = class(TfpgCustomProgressBar) published + property Align; property BackgroundColor default $c4c4c4; + property Enabled; property Hint; property ShowCaption; property Max; diff --git a/src/gui/fpg_radiobutton.pas b/src/gui/fpg_radiobutton.pas index 9410a000..e04a2b2c 100644 --- a/src/gui/fpg_radiobutton.pas +++ b/src/gui/fpg_radiobutton.pas @@ -61,9 +61,11 @@ type destructor Destroy; override; property Font: TfpgFont read FFont; published + property Align; property AutoSize: boolean read FAutoSize write SetAutoSize default False; property BackgroundColor; property Checked: boolean read FChecked write SetChecked default False; + property Enabled; property FontDesc: string read GetFontDesc write SetFontDesc; property Hint; property BoxLayout: TBoxLayout read GetBoxLayout write SetBoxLayout default tbLeftBox; diff --git a/src/gui/fpg_scrollbar.pas b/src/gui/fpg_scrollbar.pas index 55db9f59..dd0a4c7c 100644 --- a/src/gui/fpg_scrollbar.pas +++ b/src/gui/fpg_scrollbar.pas @@ -43,7 +43,6 @@ type TfpgScrollBarPart = (sbpNone, sbpUpBack, sbpPageUpBack, sbpSlider, sbpDownForward, sbpPageDownForward); - { TfpgScrollBar } TfpgScrollBar = class(TfpgWidget) private @@ -72,7 +71,7 @@ type FMousePosition: TPoint; FOnScroll: TScrollNotifyEvent; procedure ScrollTimer(Sender: TObject); - procedure DrawButton(x, y, w, h: TfpgCoord; const imgname: string; Pressed: Boolean = False); virtual; + procedure DrawButton(x, y, w, h: TfpgCoord; const imgname: string; Pressed: Boolean = False; const ButtonEnabled: Boolean= True); virtual; procedure DrawSlider(recalc: boolean); virtual; procedure HandleLMouseDown(x, y: integer; shiftstate: TShiftState); override; procedure HandleLMouseUp(x, y: integer; shiftstate: TShiftState); override; @@ -98,6 +97,8 @@ type property Min: integer read FMin write SetMin default 0; property Max: integer read FMax write SetMax default 100; property OnScroll: TScrollNotifyEvent read FOnScroll write FOnScroll; + published + property Align; end; @@ -139,13 +140,13 @@ begin Canvas.BeginDraw; // Do not remove - Scrollbars do painting outside HandlePaint as well! if Orientation = orVertical then begin - DrawButton(0, 0, Width, Width, 'sys.sb.up', FScrollbarDownPart = sbpUpBack); - DrawButton(0, Height-Width, Width, Width, 'sys.sb.down', FScrollbarDownPart = sbpDownForward); + DrawButton(0, 0, Width, Width, 'sys.sb.up', (FScrollbarDownPart = sbpUpBack) and (FPosition <> FMin), (FPosition <> FMin) and (Parent.Enabled)); + DrawButton(0, Height-Width, Width, Width, 'sys.sb.down', (FScrollbarDownPart = sbpDownForward) and (FPosition <> FMax), (FPosition <> FMax) and (Parent.Enabled)); end else begin - DrawButton(0, 0, Height, Height, 'sys.sb.left', FScrollbarDownPart = sbpUpBack); - DrawButton(Width-Height, 0, Height, Height, 'sys.sb.right', FScrollbarDownPart = sbpDownForward); + DrawButton(0, 0, Height, Height, 'sys.sb.left', (FScrollbarDownPart = sbpUpBack) and (FPosition <> FMin), (FPosition <> FMin) and (Parent.Enabled)); + DrawButton(Width-Height, 0, Height, Height, 'sys.sb.right', (FScrollbarDownPart = sbpDownForward) and (FPosition <> FMax), (FPosition <> FMax) and (Parent.Enabled)); end; DrawSlider(FRecalc); @@ -323,9 +324,9 @@ begin end; // only called from inside HandlePaint so no need for BeginDraw..EndDraw calls -procedure TfpgScrollBar.DrawButton(x, y, w, h: TfpgCoord; const imgname: string; Pressed: Boolean = False); +procedure TfpgScrollBar.DrawButton(x, y, w, h: TfpgCoord; const imgname: string; Pressed: Boolean = False; const ButtonEnabled: Boolean= True); var - img: TfpgImage; + img, imgdisabled: TfpgImage; dx: integer; dy: integer; begin @@ -344,7 +345,16 @@ begin Canvas.SetColor(clText1); img := fpgImages.GetImage(imgname); if img <> nil then - Canvas.DrawImage(x + w div 2 - (img.Width div 2) + dx, y + h div 2 - (img.Height div 2) + dy, img); + begin + if ButtonEnabled then + Canvas.DrawImage(x + w div 2 - (img.Width div 2) + dx, y + h div 2 - (img.Height div 2) + dy, img) + else + begin + imgdisabled := img.CreateDisabledImage; + Canvas.DrawImage(x + w div 2 - (img.Width div 2) + dx, y + h div 2 - (img.Height div 2) + dy, imgdisabled); + imgdisabled.Free; + end; + end; end; // only called from inside HandlePaint so no need for BeginDraw..EndDraw calls @@ -516,14 +526,13 @@ begin if FScrollbarDownPart = sbpSlider then begin FSliderDragStart := FSliderPos; - Invalidate; //DrawSlider(False); + Invalidate; end else if not (FScrollbarDownPart in [sbpNone, sbpSlider]) then begin FScrollTimer.Interval := 300; FScrollTimer.Enabled := True; - - Invalidate; //HandlePaint; + Invalidate; end; end; @@ -540,7 +549,7 @@ begin FScrollbarDownPart := sbpNone; if WasPressed then - Invalidate; //HandlePaint; + Invalidate; end; procedure TfpgScrollBar.HandleMouseMove(x, y: integer; btnstate: word; shiftstate: TShiftState); diff --git a/src/gui/fpg_spinedit.pas b/src/gui/fpg_spinedit.pas index 21548f97..99c4e697 100644 --- a/src/gui/fpg_spinedit.pas +++ b/src/gui/fpg_spinedit.pas @@ -327,10 +327,7 @@ end; procedure TfpgAbstractSpinEdit.HandlePaint; begin - Canvas.Clear(BackgroundColor); - if FButtonUp.HasHandle then - fpgPostMessage(self, FButtonUp, FPGM_PAINT); -// FButtonDown.Invalidate; + Canvas.Clear(BackgroundColor); end; procedure TfpgAbstractSpinEdit.HandleResize(AWidth, AHeight: TfpgCoord); @@ -385,15 +382,11 @@ var begin r := AButton.GetClientRect; - InflateRect(r, -1, -1); // button borders + InflateRect(r, -2, -2); // button borders if AButton.Down then OffsetRect(r, 1, 1); - // TfpgRect to TRect - Result.Left := r.Left; - Result.Top := r.Top; - Result.Right := r.Right; - Result.Bottom := r.Bottom; + Result := fpgRectToRect(r); end; procedure TfpgAbstractSpinEdit.ButtonUpPaint(Sender: TObject); @@ -707,6 +700,11 @@ begin begin FValue := FValue + FIncrement; FEdit.Value := FValue; + end + else if not IsMaxLimitReached then + begin + FValue := FMaxValue; + FEdit.Value := FValue; end; if KeyCode = KeyDown then @@ -714,6 +712,11 @@ begin begin FValue := FValue - FIncrement; FEdit.Value := FValue; + end + else if not IsMinLimitReached then + begin + FValue := FMinValue; + FEdit.Value := FValue; end; if KeyCode = KeyPageUp then @@ -1110,9 +1113,13 @@ begin begin FValue := 0; FEdit.Value := FValue; + DoOnChange; end else if (StrToInt(FEdit.Text) <= FMaxValue) and (StrToInt(FEdit.Text) >= FMinValue) then - FValue := FEdit.Value + begin + FValue := FEdit.Value; + DoOnChange; + end else FEdit.Value := FValue; @@ -1121,6 +1128,13 @@ begin begin Inc(FValue, FIncrement); FEdit.Value := FValue; + DoOnChange; + end + else if not IsMaxLimitReached then + begin + FValue := FMaxValue; + FEdit.Value := FValue; + DoOnChange; end; if KeyCode = KeyDown then @@ -1128,18 +1142,27 @@ begin begin Dec(FValue, FIncrement); FEdit.Value := FValue; + DoOnChange; + end + else if not IsMinLimitReached then + begin + FValue := FMinValue; + FEdit.Value := FValue; + DoOnChange; end; if KeyCode = KeyPageUp then begin FValue := FMaxValue; FEdit.Value := FValue; + DoOnChange; end; if KeyCode = KeyPageDown then begin FValue := FMinValue; FEdit.Value := FValue; + DoOnChange; end; EnableButtons; diff --git a/src/gui/fpg_splitter.pas b/src/gui/fpg_splitter.pas index 6094656b..8790b58e 100644 --- a/src/gui/fpg_splitter.pas +++ b/src/gui/fpg_splitter.pas @@ -28,14 +28,11 @@ uses fpg_main, fpg_widget; -const - clColorGrabBar = $839EFE; // Pale navy blue - cSplitterWidth = 8; type - NaturalNumber = 1..High(Integer); + TfpgSnapEvent = procedure(Sender: TObject; const AClosed: boolean) of object; TfpgSplitter = class(TfpgWidget) private @@ -49,18 +46,21 @@ type FOldSize: Integer; FSplit: Integer; FMouseOver: Boolean; + FOnSnap: TfpgSnapEvent; procedure CalcSplitSize(X, Y: Integer; out NewSize, Split: Integer); function FindControl: TfpgWidget; procedure SetColorGrabBar(const AValue: TfpgColor); procedure UpdateControlSize; procedure UpdateSize(const X, Y: Integer); protected + procedure DoOnSnap(const AClosed: Boolean); function DoCanResize(var NewSize: Integer): Boolean; virtual; procedure HandleLMouseDown(x, y: integer; shiftstate: TShiftState); override; procedure HandleLMouseUp(x, y: integer; shiftstate: TShiftState); override; procedure HandleMouseMove(x, y: integer; btnstate: word; shiftstate: TShiftState); override; procedure HandleMouseEnter; override; procedure HandleMouseExit; override; + procedure HandleDoubleClick(x, y: integer; button: word; shiftstate: TShiftState); override; procedure HandlePaint; override; procedure StopSizing; dynamic; Procedure DrawGrabBar(ARect: TfpgRect); virtual; @@ -68,7 +68,10 @@ type constructor Create(AOwner: TComponent); override; destructor Destroy; override; published - property ColorGrabBar: TfpgColor read FColorGrabBar write SetColorGrabBar default clColorGrabBar; + property Align; + property AutoSnap: boolean read FAutoSnap write FAutoSnap default True; + property ColorGrabBar: TfpgColor read FColorGrabBar write SetColorGrabBar default clSplitterGrabBar; + property OnSnap: TfpgSnapEvent read FOnSnap write FOnSnap; end; function CreateSplitter(AOwner: TComponent; ALeft, ATop, AWidth, AHeight: TfpgCoord; @@ -76,6 +79,10 @@ function CreateSplitter(AOwner: TComponent; ALeft, ATop, AWidth, AHeight: TfpgCo implementation +const + cSplitterWidth = 8; + + function CreateSplitter(AOwner: TComponent; ALeft, ATop, AWidth, AHeight: TfpgCoord; AnAlign: TAlign): TfpgSplitter; begin @@ -127,12 +134,11 @@ var r: TfpgRect; begin Result := nil; - p := Point(Left, Top); case Align of - alLeft: Dec(p.X); - alRight: Inc(p.X, Width); - alTop: Dec(p.Y); - alBottom: Inc(p.Y, Height); + alLeft: p := Point(Left-2, Top + (Height div 2)); + alRight: p := Point(Right+2, Top + (Height div 2)); + alTop: p := Point(Left + (Width div 2), Top-2); + alBottom: p := Point(Left + (Width div 2), Bottom+2); else Exit; end; @@ -174,16 +180,10 @@ begin begin case Align of alLeft, alRight: -// FControl.Width := FNewSize; // (1) - FControl.SetPosition(FControl.Left, FControl.Top, FNewSize, FControl.Height); // (2) + FControl.SetPosition(FControl.Left, FControl.Top, FNewSize, FControl.Height); alTop, alBottom: -// FControl.Height := FNewSize; // (1) - FControl.SetPosition(FControl.Left, FControl.Top, FControl.Width, FNewSize); // (2) + FControl.SetPosition(FControl.Left, FControl.Top, FControl.Width, FNewSize); end; -// FControl.UpdateWindowPosition; // (1) - // vvzh: - // Lines marked with (1) work wrong under Linux (e.g. folding/unfolding Memo1) - // Lines marked with (2) work OK under both platforms. Why? Parent.Realign; // if Assigned(FOnMoved) then FOnMoved(Self); FOldSize := FNewSize; @@ -195,12 +195,21 @@ begin CalcSplitSize(X, Y, FNewSize, FSplit); end; +procedure TfpgSplitter.DoOnSnap(const AClosed: Boolean); +begin + if Assigned(FOnSnap) then + FOnSnap(self, AClosed); +end; + function TfpgSplitter.DoCanResize(var NewSize: Integer): Boolean; begin // Result := CanResize(NewSize); // omit onCanResize call Result := True; if Result and (NewSize <= FMinSize) and FAutoSnap then + begin NewSize := 0; + DoOnSnap(NewSize = 0); + end; end; procedure TfpgSplitter.HandleLMouseDown(x, y: integer; shiftstate: TShiftState); @@ -238,7 +247,9 @@ begin Inc(FMaxSize, FControl.Height); end; UpdateSize(X, Y); + CaptureMouse; + {AllocateLineDC; with ValidParentForm(Self) do if ActiveControl <> nil then @@ -304,13 +315,40 @@ begin Repaint; end; +procedure TfpgSplitter.HandleDoubleClick(x, y: integer; button: word; + shiftstate: TShiftState); +begin + inherited HandleDoubleClick(x, y, button, shiftstate); + if FAutoSnap then + begin + if FNewSize = 0 then + begin + FNewSize := FMinSize+1; + DoCanResize(FNewSize); + end + else + begin + FNewSize := 0; + DoCanResize(FNewSize); + end; + end; +end; + procedure TfpgSplitter.HandlePaint; var lRect: TfpgRect; begin Canvas.SetColor(clWindowBackground); Canvas.FillRectangle(GetClientRect); - + + { just to make it's borders more visible in the designer } + if csDesigning in ComponentState then + begin + Canvas.SetColor(clInactiveWgFrame); + Canvas.SetLineStyle(1, lsDash); + Canvas.DrawRectangle(0, 0, Width, Height); + end; + case Align of alRight, alLeft: @@ -459,7 +497,7 @@ begin // FResizeStyle := rsPattern; FOldSize := -1; FMouseOver := False; - FColorGrabBar := clColorGrabBar; + FColorGrabBar := clSplitterGrabBar; end; destructor TfpgSplitter.Destroy; diff --git a/src/gui/fpg_tab.pas b/src/gui/fpg_tab.pas index 9999fa83..66f73d2d 100644 --- a/src/gui/fpg_tab.pas +++ b/src/gui/fpg_tab.pas @@ -71,6 +71,8 @@ type property PageControl: TfpgPageControl read FPageControl write SetPageControl; property TabVisible: boolean read FTabVisible write FTabVisible; published + property BackgroundColor; + property Enabled; property Text: string read GetText write SetText; property OnPaint; end; @@ -99,6 +101,7 @@ type FTabPosition: TfpgTabPosition; FPopupMenu: TfpgPopupMenu; FTabOptions: TfpgTabOptions; + FLastRClickPos: TfpgPoint; function GetActivePageIndex: integer; function GetPage(AIndex: integer): TfpgTabSheet; function GetPageCount: Integer; @@ -135,6 +138,7 @@ type public constructor Create(AOwner: TComponent); override; destructor Destroy; override; + function TabSheetAtPos(const x, y: integer): TfpgTabSheet; function AppendTabSheet(ATitle: string): TfpgTabSheet; procedure RemoveTabSheet(ATabSheet: TfpgTabSheet); property PageCount: Integer read GetPageCount; @@ -144,7 +148,9 @@ type property OnClosingTabSheet: TTabSheetClosing read FOnClosingTabSheet write FOnClosingTabSheet; published property ActivePageIndex: integer read GetActivePageIndex write SetActivePageIndex; + property Align; property BackgroundColor; + property Enabled; property FixedTabWidth: integer read FFixedTabWidth write SetFixedTabWidth default 0; property FixedTabHeight: integer read FFixedTabHeight write SetFixedTabHeight default 21; property Hint; @@ -636,9 +642,11 @@ procedure TfpgPageControl.pmCloseTab(Sender: TObject); var ts: TfpgTabSheet; begin - ts := ActivePage; + ts := TabSheetAtPos(FLastRClickPos.x, FLastRClickPos.y); + if not Assigned(ts) then + ts := ActivePage; if ts = nil then - Exit; + exit; RemovePage(ts); DoTabSheetClosing(ts); ts.Free; @@ -978,104 +986,48 @@ end; procedure TfpgPageControl.HandleLMouseUp(x, y: integer; shiftstate: TShiftState); var - h: TfpgTabSheet; - lp: integer; // left position - bw: integer; // button width - bh: integer; // button height - p1, p2: integer; // tab boundaries for mouse click to take affect + ts: TfpgTabSheet; begin // debugln('>> TfpgPageControl.HandleLMouseUp'); - h := TfpgTabSheet(FPages.First); - if h = nil then - Exit; //==> - - lp := FMargin; - if MaxButtonWidthSum > (Width-(FMargin*2)) then - h := FFirstTabButton; - - case TabPosition of - tpTop: - begin - p1 := FMargin; - p2 := ButtonHeight; - end; - - tpBottom: - begin - p1 := Height - FMargin - ButtonHeight; - p2 := Height - FMargin; - end; - - tpRight: - begin - p1 := Width - MaxButtonWidth; - p2 := Width; - end; - - tpLeft: - begin - p1 := FMargin; - p2 := FMargin + MaxButtonWidth; - end; - end; - - if TabPosition in [tpTop, tpBottom] then - begin - if (y > p1) and (y < p2) then - begin - while h <> nil do - begin - bw := ButtonWidth(h.Text); // initialize button width - if (x > lp) and (x < lp + bw) then - begin - if h <> ActivePage then - ActivePage := h; - exit; - end; { if } - lp := lp + bw; - if h <> TfpgTabSheet(FPages.Last) then - h := TfpgTabSheet(FPages[FPages.IndexOf(h)+1]) - else - h := nil; - end; { while } - end; { if } - end; - - if TabPosition in [tpLeft, tpRight] then - begin - if (x > p1) and (x < p2) then - begin - while h <> nil do - begin - bh := ButtonHeight; // initialize button height - if (y > lp) and (y < lp + bh) then - begin - if h <> ActivePage then - ActivePage := h; - exit; - end; { if } - lp := lp + bh; - if h <> TfpgTabSheet(FPages.Last) then - h := TfpgTabSheet(FPages[FPages.IndexOf(h)+1]) - else - h := nil; - end; { while } - end; { if } - end; + ts := TfpgTabSheet(FPages.First); + if ts = nil then + exit; //==> { This means there are no tabs } + + ts := TabSheetAtPos(x, y); + + if Assigned(ts) then + ActivePage := ts; inherited HandleLMouseUp(x, y, shiftstate); end; procedure TfpgPageControl.HandleRMouseUp(x, y: integer; shiftstate: TShiftState); +var + ts: TfpgTabSheet; + s: TfpgString; begin inherited HandleRMouseUp(x, y, shiftstate); -// ShowDefaultPopupMenu(x, y, ShiftState); + + { store the position for later usage } + FLastRClickPos := fpgPoint(x,y); + if to_PMenuClose in FTabOptions then begin + ts := TabSheetAtPos(x, y); + {$NOTE TODO: This text needs to become a resource string } + if Assigned(ts) then + s := Format('Close "%s" Tab', [ts.Text]) + else + s := 'Close Tab'; + if not Assigned(FPopupMenu) then begin FPopupMenu := TfpgPopupMenu.Create(self); - FPopupMenu.AddMenuItem('Close Tab', '', @pmCloseTab); + FPopupMenu.AddMenuItem(s, '', @pmCloseTab); + end + else + begin + FPopupMenu.MenuItem(0).Text := s; { This is dangerous but works for now } end; FPopupMenu.ShowAt(self, x, y); end; @@ -1160,6 +1112,92 @@ begin inherited Destroy; end; +function TfpgPageControl.TabSheetAtPos(const x, y: integer): TfpgTabSheet; +var + h: TfpgTabSheet; + lp: integer; // left position + bw: integer; // button width + bh: integer; // button height + p1, p2: integer; // tab boundaries for mouse click to take affect +begin + Result := nil; + h := TfpgTabSheet(FPages.First); + + lp := FMargin; + if MaxButtonWidthSum > (Width-(FMargin*2)) then + h := FFirstTabButton; + + case TabPosition of + tpTop: + begin + p1 := FMargin; + p2 := ButtonHeight; + end; + + tpBottom: + begin + p1 := Height - FMargin - ButtonHeight; + p2 := Height - FMargin; + end; + + tpRight: + begin + p1 := Width - MaxButtonWidth; + p2 := Width; + end; + + tpLeft: + begin + p1 := FMargin; + p2 := FMargin + MaxButtonWidth; + end; + end; + + if TabPosition in [tpTop, tpBottom] then + begin + if (y > p1) and (y < p2) then + begin + while h <> nil do + begin + bw := ButtonWidth(h.Text); // initialize button width + if (x > lp) and (x < lp + bw) then + begin + if h <> ActivePage then + Result := h; + exit; + end; { if } + lp := lp + bw; + if h <> TfpgTabSheet(FPages.Last) then + h := TfpgTabSheet(FPages[FPages.IndexOf(h)+1]) + else + h := nil; + end; { while } + end; { if } + end; + + if TabPosition in [tpLeft, tpRight] then + begin + if (x > p1) and (x < p2) then + begin + while h <> nil do + begin + bh := ButtonHeight; // initialize button height + if (y > lp) and (y < lp + bh) then + begin + if h <> ActivePage then + Result := h; + exit; + end; { if } + lp := lp + bh; + if h <> TfpgTabSheet(FPages.Last) then + h := TfpgTabSheet(FPages[FPages.IndexOf(h)+1]) + else + h := nil; + end; { while } + end; { if } + end; +end; + function TfpgPageControl.AppendTabSheet(ATitle: string): TfpgTabSheet; begin Result := TfpgTabSheet.Create(self); diff --git a/src/gui/fpg_trackbar.pas b/src/gui/fpg_trackbar.pas index 524a4c4c..9134a96d 100644 --- a/src/gui/fpg_trackbar.pas +++ b/src/gui/fpg_trackbar.pas @@ -68,6 +68,7 @@ type public constructor Create(AOwner: TComponent); override; published + property Align; property BackgroundColor; property Hint; property Min: integer read FMin write SetMin default 0; @@ -115,7 +116,9 @@ type constructor Create(AOwner: TComponent); override; destructor Destroy; override; published + property Align; property BackgroundColor; + property Enabled; property Position: integer read FPosition write SetTBPosition default 0; property ScrollStep: integer read FScrollStep write FScrollStep default 1; property Min: integer read FMin write SetMin default 0; diff --git a/src/gui/fpg_tree.pas b/src/gui/fpg_tree.pas index b61b0c29..570e1011 100644 --- a/src/gui/fpg_tree.pas +++ b/src/gui/fpg_tree.pas @@ -48,6 +48,8 @@ uses type + TfpgNodeAttachMode = (naAdd, naAddFirst, naAddChild, naAddChildFirst, naInsert); + PfpgTreeColumnWidth = ^TfpgTreeColumnWidth; TfpgTreeColumnWidth = record next: PfpgTreeColumnWidth; @@ -55,6 +57,7 @@ type end; // forward declaration + TfpgTreeView = class; TfpgTreeNode = class; TfpgTreeNodeFindMethod = procedure(ANode: TfpgTreeNode; var AFound: boolean) of object; @@ -77,6 +80,7 @@ type FText: TfpgString; FTextColor: TfpgColor; FHasChildren: Boolean; + FTree: TfpgTreeView; procedure SetCollapsed(const AValue: boolean); procedure SetInactSelColor(const AValue: TfpgColor); procedure SetInactSelTextColor(const AValue: TfpgColor); @@ -87,6 +91,7 @@ type procedure SetTextColor(const AValue: TfpgColor); procedure DoRePaint; procedure SetHasChildren(const AValue: Boolean); + procedure DoTreeCheck(ANode: TfpgTreeNode); public constructor Create; destructor Destroy; override; @@ -99,11 +104,12 @@ type function FindSubNode(AData: TObject; ARecursive: Boolean): TfpgTreeNode; overload; function GetMaxDepth: integer; function GetMaxVisibleDepth: integer; - procedure Append(var aValue: TfpgTreeNode); + procedure Append(var ANode: TfpgTreeNode); procedure Clear; // remove all nodes recursively procedure Collapse; procedure Expand; procedure Remove(var aNode: TfpgTreeNode); + procedure MoveTo(Destination: TfpgTreeNode; Mode: TfpgNodeAttachMode); procedure UnregisterSubNode(aNode: TfpgTreeNode); // parent color settings function ParentInactSelColor: TfpgColor; @@ -203,12 +209,6 @@ type procedure DrawHeader(ACol: integer; ARect: TfpgRect; AFlags: integer); virtual; procedure DoChange; virtual; procedure DoExpand(ANode: TfpgTreeNode); virtual; - // only visual (visible) nodes - function NextVisualNode(ANode: TfpgTreeNode): TfpgTreeNode; - function PrevVisualNode(ANode: TfpgTreeNode): TfpgTreeNode; - // any next node, even if node is collapsed - function NextNode(ANode: TfpgTreeNode): TfpgTreeNode; - function PrevNode(ANode: TfpgTreeNode): TfpgTreeNode; // the nodes between the given node and the direct next node function SpaceToVisibleNext(aNode: TfpgTreeNode): integer; function StepToRoot(aNode: TfpgTreeNode): integer; @@ -220,6 +220,14 @@ type function GetColumnWidth(AIndex: word): word; procedure GotoNextNodeUp; procedure GotoNextNodeDown; + procedure FullCollapse; + procedure FullExpand; + // any next node, even if node is collapsed + function NextNode(ANode: TfpgTreeNode): TfpgTreeNode; + function PrevNode(ANode: TfpgTreeNode): TfpgTreeNode; + // only visual (visible) nodes + function NextVisualNode(ANode: TfpgTreeNode): TfpgTreeNode; + function PrevVisualNode(ANode: TfpgTreeNode): TfpgTreeNode; property Font: TfpgFont read FFont; // Invisible node that starts the tree property RootNode: TfpgTreeNode read GetRootNode; @@ -227,7 +235,9 @@ type property ImageList: TfpgImageList read FImageList write FImageList; property PopupMenu: TfpgPopupMenu read FPopupMenu write FPopupMenu; published + property Align; property DefaultColumnWidth: word read FDefaultColumnWidth write SetDefaultColumnWidth default 15; + property Enabled; property FontDesc: string read GetFontDesc write SetFontDesc; property IndentNodeWithNoImage: boolean read FIndentNodeWithNoImage write SetIndentNodeWithNoImage default True; property NoImageIndent: integer read FNoImageIndent write FNoImageIndent default 16; @@ -346,6 +356,12 @@ begin end; end; +procedure TfpgTreeNode.DoTreeCheck(ANode: TfpgTreeNode); +begin + if ANode.FTree <> FTree then + raise Exception.Create('Nodes must be of the same tree'); +end; + constructor TfpgTreeNode.Create; begin FData := nil; @@ -404,20 +420,21 @@ begin end; end; -procedure TfpgTreeNode.Append(var aValue: TfpgTreeNode); +procedure TfpgTreeNode.Append(var ANode: TfpgTreeNode); begin - aValue.Parent := self; - aValue.Next := nil; + DoTreeCheck(ANode); + ANode.Parent := self; + ANode.Next := nil; if FFirstSubNode = nil then - FFirstSubNode := aValue; + FFirstSubNode := ANode; - aValue.prev := FLastSubNode; + ANode.Prev := FLastSubNode; if FLastSubNode <> nil then - FLastSubNode.Next := aValue; + FLastSubNode.Next := ANode; - FLastSubNode := aValue; + FLastSubNode := ANode; end; function TfpgTreeNode.FindSubNode(AText: string; ARecursive: Boolean): TfpgTreeNode; @@ -536,6 +553,7 @@ begin writeln('TfpgTreeNode.AppendText'); {$ENDIF} h := TfpgTreeNode.Create; + h.FTree := FTree; h.Text := AText; Append(h); result := h; @@ -659,6 +677,53 @@ begin aNode.parent := nil; end; +procedure TfpgTreeNode.MoveTo(Destination: TfpgTreeNode; Mode: TfpgNodeAttachMode); +begin + if Destination = nil then + Exit; + DoTreeCheck(Destination); + + Parent.Remove(self); + case Mode of + naAdd: + begin + Destination.Parent.Append(self); + end; + naAddFirst: + begin + Next := Destination.Parent.FirstSubNode; + Next.Prev := self; + Destination.Parent.FFirstSubNode := self; + Parent := Destination.Parent; + end; + naAddChild: + begin + Destination.Append(self); + end; + naAddChildFirst: + begin + Next := Destination.FirstSubNode; + if Assigned(Destination.FirstSubNode) then + Destination.FirstSubNode.Prev := self; + Destination.FFirstSubNode := self; + Parent := Destination; + if Destination.LastSubNode = nil then + Destination.FLastSubNode := self; + end; + naInsert: + begin + Prev := Destination.Prev; + Next := Destination; + Parent := Destination.Parent; + Destination.Prev := self; + if Prev = nil then + Parent.FFirstSubNode := self + else + Prev.Next := self; + end; + end; { case } +end; + procedure TfpgTreeNode.Clear; var n: TfpgTreeNode; @@ -758,7 +823,10 @@ end; function TfpgTreeview.GetRootNode: TfpgTreeNode; begin if FRootNode = nil then + begin FRootNode := TfpgTreeNode.Create; + FRootNode.FTree := self; + end; FRootNode.TextColor := clText1; FRootnode.SelTextColor := clSelectionText; FRootnode.SelColor := clSelection; @@ -796,10 +864,14 @@ begin n := AValue.Parent; while n <> nil do begin - n.Expand; - DoExpand(n); + if n.Collapsed then + begin + n.Expand; + DoExpand(n); + end; n := n.parent; end; + UpdateScrollbars; end; dy := GetAbsoluteNodeTop(FSelection); @@ -809,7 +881,7 @@ begin begin if FVScrollBar.Max = 0 then // the first time and no expansion happened before. FVScrollBar.Max := dy + Height; - FVScrollbar.Position := dy + nh - vh; + FVScrollbar.Position := dy + nh - (vh div 2); FYOffset := FVScrollbar.Position; UpdateScrollBars; if FHScrollbar.Visible then // HScrollbar appeared so we need to adjust position again @@ -1082,10 +1154,45 @@ begin end; procedure TfpgTreeView.GotoNextNodeDown; +var + lNode: TfpgTreeNode; begin - if Selection = RootNode.LastSubNode then + if (Selection = RootNode.LastSubNode) and (RootNode.LastSubNode.CountRecursive = 0) then Exit; - Selection := NextNode(Selection); + + lNode := NextNode(Selection); + if lNode <> nil then + Selection := lNode; +end; + +procedure TfpgTreeView.FullCollapse; +var + n: TfpgTreeNode; +begin + n := NextNode(RootNode); + repeat + if n <> nil then + begin + n.Collapse; + end; + n := NextNode(n); + until n = nil; + Repaint; +end; + +procedure TfpgTreeView.FullExpand; +var + n: TfpgTreeNode; +begin + n := NextNode(RootNode); + repeat + if n <> nil then + begin + n.Expand; + end; + n := NextNode(n); + until n = nil; + Repaint; end; procedure TfpgTreeview.PreCalcColumnLeft; @@ -1126,8 +1233,11 @@ begin FVScrollbar.Visible := VisibleHeight < (GetNodeHeightSum * GetNodeHeight); FVScrollbar.Min := 0; FVScrollbar.Max := (GetNodeHeightSum * GetNodeHeight) - VisibleHeight + FHScrollbar.Height; + FVScrollbar.PageSize := (VisibleHeight div 4) * 3; // three quarters of the height + FVScrollbar.ScrollStep := GetNodeHeight; // up/down buttons move the height of the font FHScrollbar.Min := 0; FHScrollbar.Max := MaxNodeWidth - VisibleWidth + FVScrollbar.Width; + FHScrollbar.PageSize := (VisibleWidth div 4) * 3; // three quarters of the height FHScrollbar.Visible := MaxNodeWidth > Width - 2; if not FVScrollbar.Visible then begin @@ -1224,7 +1334,7 @@ begin x := x + FXOffset; cancel := False; last := RootNode; - while not (((i - 1) * GetNodeHeight - 2 <= y) and ((i) * GetNodeHeight + 2 >= y)) do + while not ((((i - 1) * GetNodeHeight) <= y) and ((i * GetNodeHeight) >= y)) do begin node := NextVisualNode(last); if node = nil then @@ -1430,25 +1540,26 @@ begin Canvas.SetColor(h.ParentInactSelColor); Canvas.SetTextColor(h.ParentInActSelTextColor); end; - Canvas.FillRectangle(w - FXOffset, YPos - FYOffset + col - GetNodeHeight + FFont.Ascent div 2 - 2, GetNodeWidth(h), GetNodeHeight); + // draw selection rectangle + Canvas.FillRectangle(w - FXOffset, ACenterPos - (GetNodeHeight div 2), GetNodeWidth(h), GetNodeHeight); if (ImageList <> nil) and ShowImages then begin AImageItem := ImageList.Item[h.ImageIndex]; if AImageItem <> nil then begin - Canvas.DrawImagePart(w - FXOffset + 1, ACenterPos - 4, AImageItem.Image, 0, 0, 16, 16); - Canvas.DrawString(w - FXOffset + 1 + AImageItem.Image.Width + 2, ACenterPos - FFont.Ascent div 2, h.text); + Canvas.DrawImagePart(w - FXOffset + 1, ACenterPos - 8, AImageItem.Image, 0, 0, 16, 16); + Canvas.DrawString(w - FXOffset + 1 + AImageItem.Image.Width + 2, ACenterPos - (GetNodeHeight div 2), h.text); end else begin if FIndentNodeWithNoImage then - Canvas.DrawString(w - FXOffset + 1 + FNoImageIndent + 2 {spacer}, ACenterPos - FFont.Ascent div 2, h.text) + Canvas.DrawString(w - FXOffset + 1 + FNoImageIndent + 2 {spacer}, ACenterPos - (GetNodeHeight div 2), h.text) else - Canvas.DrawString(w - FXOffset + 1, ACenterPos - FFont.Ascent div 2, h.text); + Canvas.DrawString(w - FXOffset + 1, ACenterPos - (GetNodeHeight div 2), h.text); end; end else - Canvas.DrawString(w - FXOffset + 1, ACenterPos - FFont.Ascent div 2, h.text); + Canvas.DrawString(w - FXOffset + 1, ACenterPos - (GetNodeHeight div 2), h.text); Canvas.SetTextColor(h.ParentTextColor); end else @@ -1458,19 +1569,19 @@ begin AImageItem := ImageList.Item[h.ImageIndex]; if AImageItem <> nil then begin - Canvas.DrawImagePart(w - FXOffset + 1, ACenterPos - 4, AImageItem.Image, 0, 0, 16, 16); - Canvas.DrawString(w - FXOffset + 1 + AImageItem.Image.Width + 2, ACenterPos - FFont.Ascent div 2, h.text); + Canvas.DrawImagePart(w - FXOffset + 1, ACenterPos - 8, AImageItem.Image, 0, 0, 16, 16); + Canvas.DrawString(w - FXOffset + 1 + AImageItem.Image.Width + 2, ACenterPos - (GetNodeHeight div 2), h.text); end else begin if FIndentNodeWithNoImage then - Canvas.DrawString(w - FXOffset + 1 + FNoImageIndent + 2 {spacer}, ACenterPos - FFont.Ascent div 2, h.text) + Canvas.DrawString(w - FXOffset + 1 + FNoImageIndent + 2 {spacer}, ACenterPos - (GetNodeHeight div 2), h.text) else - Canvas.DrawString(w - FXOffset + 1, ACenterPos - FFont.Ascent div 2, h.text); + Canvas.DrawString(w - FXOffset + 1, ACenterPos - (GetNodeHeight div 2), h.text); end end else - Canvas.DrawString(w - FXOffset + 1, ACenterPos - FFont.Ascent div 2, h.text); + Canvas.DrawString(w - FXOffset + 1, ACenterPos - (GetNodeHeight div 2), h.text); end; { if/else } Canvas.SetLineStyle(1, FTreeLineStyle); @@ -1680,7 +1791,16 @@ begin Selection := RootNode.FirstSubNode; end; end; - + + keyPageUp: + begin + FVScrollbar.PageUp; + end; + + keyPageDown: + begin + FVScrollbar.PageDown; + end; else Consumed := False; end; @@ -1699,23 +1819,25 @@ procedure TfpgTreeview.HandleMouseScroll(x, y: integer; shiftstate: TShiftState; delta: smallint); var i: integer; + dy: integer; begin inherited HandleMouseScroll(x, y, shiftstate, delta); - if delta > 0 then + dy := (VisibleHeight div 3); // mouse scrolling is 1/3 of the height + if delta > 0 then // scrolling down begin - inc(FYOffset, FScrollWheelDelta); + inc(FYOffset, dy); //FScrollWheelDelta); i := (GetNodeHeightSum * GetNodeHeight) - VisibleHeight + FHScrollbar.Height; if FYOffset > i then FYOffset := i; - i := FVScrollbar.Position + FScrollWheelDelta; + i := FVScrollbar.Position + dy; FVScrollbar.Position := i; end else - begin - dec(FYOffset, FScrollWheelDelta); + begin // scrolling up + dec(FYOffset, dy); //FScrollWheelDelta); if FYOffset < 0 then FYOffset := 0; - i := FVScrollbar.Position - FScrollWheelDelta; + i := FVScrollbar.Position - dy; FVScrollbar.Position := i; end; UpdateScrollbars; @@ -1807,7 +1929,7 @@ function TfpgTreeView.NextNode(ANode: TfpgTreeNode): TfpgTreeNode; begin while ANode.Next = nil do begin - ANode := ANode.Parent; + ANode := ANode.Parent; // back out one level depth if ANode = nil then exit; //==> end; diff --git a/src/gui/inputquerydialog.inc b/src/gui/inputquerydialog.inc index 5b063233..094a58e2 100644 --- a/src/gui/inputquerydialog.inc +++ b/src/gui/inputquerydialog.inc @@ -30,6 +30,7 @@ type btnCancel: TfpgButton; {@VFD_HEAD_END: fpgQueryDialog} procedure SetupCaptions; + procedure edtTextKeyPressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean); public procedure AfterCreate; override; end; @@ -47,8 +48,10 @@ begin try dlg.WindowTitle := ACaption; dlg.lblText.Text := APrompt; + dlg.edtText.Text := Value; Result := dlg.ShowModal = mrOK; - Value := dlg.edtText.Text; + if Result then + Value := dlg.edtText.Text; finally dlg.Free; end; @@ -62,6 +65,12 @@ begin btnCancel.Text := rsCancel; end; +procedure TfpgQueryDialog.edtTextKeyPressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean); +begin + if KeyCode = keyEnter then + btnOK.Click; +end; + procedure TfpgQueryDialog.AfterCreate; begin {%region 'Auto-generated GUI code' -fold} @@ -94,6 +103,7 @@ begin TabOrder := 2; Text := ''; FontDesc := '#Edit1'; + OnKeyPress := @edtTextKeyPressed; end; btnOK := TfpgButton.Create(self); diff --git a/src/gui/managebookmarksdialog.inc b/src/gui/managebookmarksdialog.inc new file mode 100644 index 00000000..ceef4cba --- /dev/null +++ b/src/gui/managebookmarksdialog.inc @@ -0,0 +1,227 @@ +{ + fpGUI - Free Pascal GUI Toolkit + + Copyright (C) 2006 - 2010 See the file AUTHORS.txt, included in this + distribution, for details of the copyright. + + See the file COPYING.modifiedLGPL, included in this distribution, + for details about redistributing fpGUI. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + Description: + This unit contains the dialog to manage bookmarks from the + File Open/Save dialog. +} + +{%mainunit fpg_dialogs.pas} + +{$IFDEF read_interface} + + TConfigureBookmarksForm = class(TfpgForm) + private + {@VFD_HEAD_BEGIN: ConfigureBookmarksForm} + grdBookmarks: TfpgStringGrid; + btnChangeTitle: TfpgButton; + btnDelete: TfpgButton; + btnClose: TfpgButton; + btnMoveUp: TfpgButton; + btnMoveDown: TfpgButton; + {@VFD_HEAD_END: ConfigureBookmarksForm} + FIni: TfpgIniFile; + procedure SetupCaptions; + procedure PopulateGrid; + procedure UpdateINIFile; + procedure btnChangeTitleClicked(Sender: TObject); + procedure btnDeleteClicked(Sender: TObject); + public + constructor Create(var AIniFile: TfpgIniFile); reintroduce; + destructor Destroy; override; + procedure AfterCreate; override; + end; + + +{$ENDIF read_interface} + +{$IFDEF read_implementation} + +procedure TConfigureBookmarksForm.SetupCaptions; +begin + WindowTitle := rsConfigureBookmarks; + btnClose.Text := rsClose; + btnMoveUp.Text := rsMoveUp; + btnMoveDown.Text := rsMoveDown; + btnChangeTitle.Text := rsChangeTitle; + btnDelete.Text := rsDelete; + grdBookmarks.ColumnTitle[0] := rsName; + grdBookmarks.ColumnTitle[1] := rsDirectory; +end; + +procedure TConfigureBookmarksForm.PopulateGrid; +var + i: integer; + lst: TStringList; +begin + lst := TStringList.Create; + FIni.ReadSection(FPG_BOOKMARK_SECTION, lst); + grdBookmarks.RowCount := lst.Count; + grdBookmarks.BeginUpdate; + for i := 0 to lst.Count-1 do + begin + grdBookmarks.Cells[0, i] := lst[i]; + grdBookmarks.Cells[1, i] := FIni.ReadString(FPG_BOOKMARK_SECTION, lst[i], ''); + end; + grdBookmarks.EndUpdate; + lst.Free; +end; + +procedure TConfigureBookmarksForm.UpdateINIFile; +var + i: integer; +begin + FIni.EraseSection(FPG_BOOKMARK_SECTION); + for i := 0 to grdBookmarks.RowCount-1 do + begin + FIni.WriteString(FPG_BOOKMARK_SECTION, grdBookmarks.Cells[0, i], grdBookmarks.Cells[1, i]); + end; +end; + +procedure TConfigureBookmarksForm.btnChangeTitleClicked(Sender: TObject); +var + s: TfpgString; +begin + if (grdBookmarks.RowCount = 0) or (grdBookmarks.FocusRow = -1) then + Exit; + s := grdBookmarks.Cells[0, grdBookmarks.FocusRow]; + if fpgInputQuery('Bookmark', 'Enter new bookmark name', s) then + begin + s := StringReplace(s, '=', '-', [rfReplaceAll]); // don't allow '=' sign in name (ini file requirement) + grdBookmarks.Cells[0, grdBookmarks.FocusRow] := s; + end; +end; + +procedure TConfigureBookmarksForm.btnDeleteClicked(Sender: TObject); +begin + if (grdBookmarks.RowCount = 0) or (grdBookmarks.FocusRow = -1) then + Exit; + grdBookmarks.DeleteRow(grdBookmarks.FocusRow); +end; + +constructor TConfigureBookmarksForm.Create(var AIniFile: TfpgIniFile); +begin + inherited Create(nil); + FIni := AIniFile; +end; + +destructor TConfigureBookmarksForm.Destroy; +begin + UpdateINIFile; + inherited Destroy; +end; + +procedure TConfigureBookmarksForm.AfterCreate; +begin + {%region 'Auto-generated GUI code' -fold} + {@VFD_BODY_BEGIN: ConfigureBookmarksForm} + Name := 'ConfigureBookmarksForm'; + SetPosition(331, 184, 596, 237); + WindowTitle := 'Configure Bookmarks'; + Hint := ''; + ShowHint := True; + WindowPosition := wpOneThirdDown; + + grdBookmarks := TfpgStringGrid.Create(self); + with grdBookmarks do + begin + Name := 'grdBookmarks'; + SetPosition(8, 8, 473, 218); + Anchors := [anLeft,anRight,anTop,anBottom]; + AddColumn('Title', 150, taLeftJustify); + AddColumn('Directory', 300, taLeftJustify); + FontDesc := '#Grid'; + HeaderFontDesc := '#GridHeader'; + Hint := ''; + RowCount := 0; + RowSelect := True; + TabOrder := 1; + Options := [go_SmoothScroll, go_AlternativeColor] + end; + + btnChangeTitle := TfpgButton.Create(self); + with btnChangeTitle do + begin + Name := 'btnChangeTitle'; + SetPosition(489, 8, 100, 24); + Anchors := [anRight,anTop]; + Text := 'btnChangeTitle'; + FontDesc := '#Label1'; + Hint := ''; + ImageName := ''; + TabOrder := 2; + OnClick := @btnChangeTitleClicked; + end; + + btnDelete := TfpgButton.Create(self); + with btnDelete do + begin + Name := 'btnDelete'; + SetPosition(489, 36, 100, 24); + Anchors := [anRight,anTop]; + Text := 'btnDelete'; + FontDesc := '#Label1'; + Hint := ''; + ImageName := ''; + TabOrder := 3; + OnClick := @btnDeleteClicked; + end; + + btnMoveUp := TfpgButton.Create(self); + with btnMoveUp do + begin + Name := 'btnMoveUp'; + SetPosition(489, 80, 100, 24); + Anchors := [anRight,anTop]; + Text := 'btnMoveUp'; + FontDesc := '#Label1'; + Hint := ''; + ImageName := 'sys.sb.up'; + TabOrder := 4; + end; + + btnMoveDown := TfpgButton.Create(self); + with btnMoveDown do + begin + Name := 'btnMoveDown'; + SetPosition(489, 108, 100, 24); + Anchors := [anRight,anTop]; + Text := 'btnMoveDown'; + FontDesc := '#Label1'; + Hint := ''; + ImageName := 'sys.sb.down'; + TabOrder := 5; + end; + + btnClose := TfpgButton.Create(self); + with btnClose do + begin + Name := 'btnClose'; + SetPosition(489, 204, 100, 24); + Anchors := [anRight,anBottom]; + Text := 'btnClose'; + FontDesc := '#Label1'; + Hint := ''; + ImageName := 'stdimg.close'; + ModalResult := mrOK; + TabOrder := 6; + end; + + {@VFD_BODY_END: ConfigureBookmarksForm} + {%endregion} + + SetupCaptions; + PopulateGrid; +end; +{$ENDIF read_implementation} + diff --git a/src/gui/selectdirdialog.inc b/src/gui/selectdirdialog.inc index d09f11c8..6a96d046 100644 --- a/src/gui/selectdirdialog.inc +++ b/src/gui/selectdirdialog.inc @@ -7,6 +7,7 @@ tv: TfpgTreeView; FRootDir: TfpgString; FShowHidden: Boolean; + FImagelist: TfpgImageList; function GetAbsolutePath(Node: TfpgTreeNode): TfpgString; procedure InitializeTreeview; procedure SetRootDir(const AValue: TfpgString); @@ -19,6 +20,7 @@ {$ENDIF} public constructor Create(AOwner: TComponent); override; + destructor Destroy; override; procedure AfterCreate; override; { return the selected directory or set initial selected dir } property SelectedDir: TfpgString read GetSelectedDir write SetSelectedDir; @@ -158,6 +160,7 @@ begin for i := 0 to SortList.Count - 1 do begin NewNode := Node.AppendText(SortList[i]); + NewNode.ImageIndex := 0; // NewNode := TV.Items.AddChild(Node, SortList[i]); // if subdirectories then indicate so. { Todo: Fix this by adding HasChildren to Treeview } @@ -245,9 +248,20 @@ end; {$ENDIF} constructor TfpgSelectDirDialog.Create(AOwner: TComponent); +var + img: TfpgImage; begin inherited Create(AOwner); FShowHidden := False; + FImagelist := TfpgImageList.Create; + img := fpgImages.GetImage('stdimg.folder').ImageFromSource; + FImageList.AddImage(img); +end; + +destructor TfpgSelectDirDialog.Destroy; +begin + FImagelist.Free; + inherited Destroy; end; procedure TfpgSelectDirDialog.AfterCreate; @@ -263,7 +277,10 @@ begin begin Name := 'tv'; SetPosition(FSpacing, FSpacing, 288, 322); - OnExpand :=@NodeExpanded; + Anchors := [anTop, anLeft, anRight, anBottom]; + ImageList := FImageList; + ShowImages := True; + OnExpand := @NodeExpanded; end; // reposition buttons |