689 lines
21 KiB
ObjectPascal
689 lines
21 KiB
ObjectPascal
{-----------------------------------------------------------------------------
|
|
The contents of this file are subject to the Mozilla Public License
|
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL/MPL-1.1.html
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is: JvDialogs.PAS, released Oct 10, 1999.
|
|
|
|
The Initial Developer of the Original Code is Petr Vones (petr dott v att mujmail dott cz)
|
|
Portions created by Petr Vones are Copyright (C) 1999 Petr Vones.
|
|
Portions created by Microsoft are Copyright (C) 1998, 1999 Microsoft Corp.
|
|
All Rights Reserved.
|
|
|
|
Contributor(s): Debbie Gregory <Debbie.Gregory att cmsis dott com>
|
|
Marcel van Brakel <brakelm att bart dott nl>.
|
|
|
|
Current Version: 0.50
|
|
|
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
|
located at http://jvcl.sourceforge.net
|
|
|
|
Known Issues:
|
|
-----------------------------------------------------------------------------}
|
|
// $Id: JvDialogs.pas 10612 2006-05-19 19:04:09Z jfudickar $
|
|
|
|
unit JvDialogs;
|
|
|
|
{$I jvcl.inc}
|
|
{$I vclonly.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF UNITVERSIONING}
|
|
JclUnitVersioning,
|
|
{$ENDIF UNITVERSIONING}
|
|
Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
|
|
JVCLVer;
|
|
|
|
type
|
|
TJvOpenDialogAC = (acEdit, acListView);
|
|
TJvOpenDialogAS = (asSmallIcon, asReport);
|
|
TDialogErrorEvent = procedure(Sender: TObject; ErrorCode:Cardinal) of object;
|
|
TJvOpenDialog = class(TOpenDialog)
|
|
private
|
|
FAboutJVCL: TJVCLAboutInfo;
|
|
FActiveControl: TJvOpenDialogAC;
|
|
FActiveStyle: TJvOpenDialogAS;
|
|
FActiveSettingDone: Boolean;
|
|
FAutoSize: Boolean;
|
|
FDefBtnCaption: string;
|
|
FFilterLabelCaption: string;
|
|
FInitialSize: TSize;
|
|
FMakeResizeable: Boolean;
|
|
FOriginalRect: TRect;
|
|
FParentWndInstance, FOldParentWndInstance: Pointer;
|
|
FParentWnd: THandle;
|
|
{$IFDEF COMPILER5}
|
|
FShowPlacesBar: Boolean;
|
|
{$ENDIF COMPILER5}
|
|
FOnShareViolation: TCloseQueryEvent;
|
|
FHeight: Integer;
|
|
FWidth: Integer;
|
|
FUseUserSize: Boolean;
|
|
FOnError: TDialogErrorEvent;
|
|
procedure CenterAndSize;
|
|
function DoActiveSetting: Boolean;
|
|
procedure WMNCDestroy(var Msg: TWMNCDestroy); message WM_NCDESTROY;
|
|
procedure SetDefBtnCaption(const Value: string);
|
|
procedure SetFilterLabelCaption(const Value: string);
|
|
protected
|
|
procedure DoFolderChange; override;
|
|
function DoShareViolation: Boolean; dynamic;
|
|
procedure DoShow; override;
|
|
function GetLocalizedSizeCommand: string;
|
|
procedure ParentResize; dynamic;
|
|
procedure ParentWndProc(var Msg: TMessage); virtual;
|
|
function TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool; override;
|
|
procedure UpdateCaptions;
|
|
procedure UpdateControlPos; dynamic;
|
|
procedure WndProc(var Msg: TMessage); override;
|
|
protected
|
|
procedure DoError(ErrorCode:Cardinal);virtual;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
property ParentWnd: THandle read FParentWnd;
|
|
procedure SelectFolder(const FolderName: string);
|
|
property Template;
|
|
published
|
|
property AboutJVCL: TJVCLAboutInfo read FAboutJVCL write FAboutJVCL stored False;
|
|
property ActiveControl: TJvOpenDialogAC read FActiveControl write FActiveControl default acEdit;
|
|
property ActiveStyle: TJvOpenDialogAS read FActiveStyle write FActiveStyle default asSmallIcon;
|
|
property AutoSize: Boolean read FAutoSize write FAutoSize default False;
|
|
property DefBtnCaption: string read FDefBtnCaption write SetDefBtnCaption;
|
|
property FilterLabelCaption: string read FFilterLabelCaption write SetFilterLabelCaption;
|
|
property Height: Integer read FHeight write FHeight;
|
|
{$IFDEF COMPILER5}
|
|
property ShowPlacesBar: Boolean read FShowPlacesBar write FShowPlacesBar default True;
|
|
{$ENDIF COMPILER5}
|
|
property UseUserSize: Boolean read FUseUserSize write FUseUserSize default False;
|
|
property Width: Integer read FWidth write FWidth;
|
|
property OnError: TDialogErrorEvent read FOnError write FOnError;
|
|
property OnShareViolation: TCloseQueryEvent read FOnShareViolation write FOnShareViolation;
|
|
end;
|
|
|
|
TJvSaveDialog = class(TJvOpenDialog)
|
|
function TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool; override;
|
|
end;
|
|
|
|
TJvCDQueryEvent = procedure(Sender: TObject; SelectedColor: TColor; var Accept: Boolean) of object;
|
|
|
|
TJvColorDialog = class(TColorDialog)
|
|
private
|
|
FAboutJVCL: TJVCLAboutInfo;
|
|
FColorOkMessage: DWORD;
|
|
FSetRBGMessage: DWORD;
|
|
FOnQueryColor: TJvCDQueryEvent;
|
|
procedure WMNCDestroy(var Msg: TWMNCDestroy); message WM_NCDESTROY;
|
|
protected
|
|
procedure DoClose; override;
|
|
procedure DoShow; override;
|
|
function DoQueryColor(Color: TColor): Boolean; dynamic;
|
|
function TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure SelectColor(Color: TColor);
|
|
published
|
|
property AboutJVCL: TJVCLAboutInfo read FAboutJVCL write FAboutJVCL stored False;
|
|
property OnQueryColor: TJvCDQueryEvent read FOnQueryColor write FOnQueryColor;
|
|
end;
|
|
|
|
var
|
|
JvDialogsUseFixW2k: Boolean = True;
|
|
|
|
{$IFDEF UNITVERSIONING}
|
|
const
|
|
UnitVersioning: TUnitVersionInfo = (
|
|
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvDialogs.pas $';
|
|
Revision: '$Revision: 10612 $';
|
|
Date: '$Date: 2006-05-19 21:04:09 +0200 (ven., 19 mai 2006) $';
|
|
LogPath: 'JVCL\run'
|
|
);
|
|
{$ENDIF UNITVERSIONING}
|
|
|
|
implementation
|
|
|
|
uses
|
|
CommDlg, CommCtrl, Dlgs,
|
|
SysUtils, Math,
|
|
JclSysInfo,
|
|
JvJVCLUtils;
|
|
|
|
const
|
|
btnOk = 1;
|
|
btnCancel = 2;
|
|
|
|
type
|
|
POpenFileName2000 = ^TOpenFileName2000;
|
|
TOpenFileName2000 = packed record
|
|
OpenFileName: TOpenFileName;
|
|
pvReserved: Pointer;
|
|
dwReserved: DWORD;
|
|
FlagsEx: DWORD;
|
|
end;
|
|
|
|
const
|
|
OFN_EX_NOPLACESBAR = 1;
|
|
|
|
var
|
|
W2kFixMsAcmLibrary: THandle = 0;
|
|
|
|
function IsWin2kOrAbove: Boolean;
|
|
begin
|
|
Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5);
|
|
end;
|
|
|
|
procedure UninstallW2kFix;
|
|
begin
|
|
if W2kFixMsAcmLibrary > 0 then
|
|
begin
|
|
FreeLibrary(W2kFixMsAcmLibrary);
|
|
W2kFixMsAcmLibrary := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure InstallW2kFix;
|
|
begin
|
|
if JvDialogsUseFixW2k and IsWin2K and (W2kFixMsAcmLibrary = 0) then
|
|
W2kFixMsAcmLibrary := LoadLibrary('msacm32.dll');
|
|
end;
|
|
|
|
//=== { TJvOpenDialog } ======================================================
|
|
|
|
constructor TJvOpenDialog.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FActiveControl := acEdit;
|
|
FActiveStyle := asSmallIcon;
|
|
FMakeResizeable := GetWindowsVersion in [wvWin95, wvWin95OSR2, wvWinNT4];
|
|
FParentWndInstance := JvMakeObjectInstance(ParentWndProc);
|
|
{$IFDEF COMPILER5}
|
|
FShowPlacesBar := True;
|
|
{$ENDIF COMPILER5}
|
|
FParentWndInstance := JvMakeObjectInstance(ParentWndProc);
|
|
end;
|
|
|
|
destructor TJvOpenDialog.Destroy;
|
|
begin
|
|
JvFreeObjectInstance(FParentWndInstance);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TJvOpenDialog.CenterAndSize;
|
|
var
|
|
Monitor: TMonitor;
|
|
begin
|
|
if UseUserSize then
|
|
begin
|
|
if Application.MainForm <> nil then
|
|
Monitor := Application.MainForm.Monitor
|
|
else
|
|
Monitor := Screen.Monitors[0];
|
|
SetWindowPos(FParentWnd, 0,
|
|
Monitor.Left + ((Monitor.Width - Width) div 2),
|
|
Monitor.Top + ((Monitor.Height - Height) div 3),
|
|
Width, Height,
|
|
SWP_NOACTIVATE or SWP_NOZORDER);
|
|
end;
|
|
end;
|
|
|
|
function TJvOpenDialog.DoActiveSetting: Boolean;
|
|
var
|
|
DefViewWnd, ListViewWnd: HWND;
|
|
begin
|
|
Result := False;
|
|
if not FActiveSettingDone then
|
|
begin
|
|
DefViewWnd := FindWindowEx(FParentWnd, 0, PChar('SHELLDLL_DefView'), nil);
|
|
ListViewWnd := FindWindowEx(DefViewWnd, 0, PChar('SysListView32'), nil);
|
|
if (DefViewWnd <> 0) and (ListViewWnd <> 0) then
|
|
begin
|
|
if FActiveStyle = asReport then
|
|
SendMessage(DefViewWnd, WM_COMMAND, $702C, 0);
|
|
if FActiveControl = acListView then
|
|
begin
|
|
SetFocus(ListViewWnd);
|
|
PostMessage(ListViewWnd, WM_KEYDOWN, VK_SPACE, 0);
|
|
end;
|
|
FActiveSettingDone := True;
|
|
CenterAndSize;
|
|
Result := True;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvOpenDialog.DoFolderChange;
|
|
begin
|
|
DoActiveSetting;
|
|
inherited DoFolderChange;
|
|
end;
|
|
|
|
function TJvOpenDialog.DoShareViolation: Boolean;
|
|
begin
|
|
Result := True;
|
|
if Assigned(FOnShareViolation) then
|
|
FOnShareViolation(Self, Result);
|
|
end;
|
|
|
|
procedure TJvOpenDialog.DoShow;
|
|
var
|
|
SysMenu: HMENU;
|
|
R: TRect;
|
|
begin
|
|
FParentWnd := GetParent(Handle);
|
|
GetClientRect(FParentWnd, FOriginalRect);
|
|
GetWindowRect(FParentWnd, R);
|
|
FInitialSize.cx := R.Right - R.Left;
|
|
FInitialSize.cy := R.Bottom - R.Top;
|
|
Width := Max(Width, FInitialSize.cx);
|
|
Height := Max(Height, FInitialSize.cy);
|
|
if FMakeResizeable and (ofEnableSizing in Options) then
|
|
begin
|
|
SetWindowLong(ParentWnd, GWL_STYLE, GetWindowLong(ParentWnd, GWL_STYLE) or WS_THICKFRAME);
|
|
SetWindowPos(ParentWnd, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or
|
|
SWP_FRAMECHANGED or SWP_DRAWFRAME or SWP_NOCOPYBITS);
|
|
SysMenu := GetSystemMenu(ParentWnd, False);
|
|
InsertMenu(SysMenu, SC_CLOSE, MF_BYCOMMAND, SC_SIZE, PChar(GetLocalizedSizeCommand));
|
|
FOldParentWndInstance := Pointer(SetWindowLong(FParentWnd, GWL_WNDPROC, Longint(FParentWndInstance)));
|
|
UpdateControlPos;
|
|
end;
|
|
UpdateCaptions;
|
|
inherited DoShow;
|
|
end;
|
|
|
|
function TJvOpenDialog.GetLocalizedSizeCommand: string;
|
|
var
|
|
SysMenu: HMENU;
|
|
begin
|
|
if not (csDesigning in ComponentState) and Assigned(Application.MainForm) then
|
|
begin
|
|
SysMenu := GetSystemMenu(Application.MainForm.Handle, False);
|
|
SetString(Result, nil, 50);
|
|
GetMenuString(SysMenu, SC_SIZE, PChar(Result), 50, MF_BYCOMMAND);
|
|
Result := PChar(Result);
|
|
end
|
|
else
|
|
Result := '';
|
|
if Result = '' then
|
|
Result := 'Size'; // do not localize
|
|
end;
|
|
|
|
procedure TJvOpenDialog.ParentResize;
|
|
begin
|
|
InvalidateRect(ParentWnd, nil, False);
|
|
UpdateControlPos;
|
|
end;
|
|
|
|
procedure TJvOpenDialog.ParentWndProc(var Msg: TMessage);
|
|
const
|
|
SizeGripRectSize = 15;
|
|
|
|
function SizeGripRect: TRect;
|
|
begin
|
|
GetClientRect(ParentWnd, Result);
|
|
SetRect(Result, Result.Right - SizeGripRectSize, Result.Bottom - SizeGripRectSize,
|
|
Result.Right, Result.Bottom);
|
|
end;
|
|
|
|
procedure PaintSizeGrip;
|
|
var
|
|
PS: TPaintStruct;
|
|
DC: HDC;
|
|
R: TRect;
|
|
Pen, SavePen: HPen;
|
|
I: Integer;
|
|
begin
|
|
DC := BeginPaint(ParentWnd, PS);
|
|
R := SizeGripRect;
|
|
Pen := CreatePen(PS_SOLID, 1, ColorToRGB(clBtnShadow));
|
|
SavePen := SelectObject(DC, Pen);
|
|
for I := 0 to (SizeGripRectSize - 2) div 4 do
|
|
begin
|
|
MoveToEx(DC, R.Right, R.Bottom - (I * 4), nil);
|
|
LineTo(DC, R.Right - (I * 4), R.Bottom);
|
|
MoveToEx(DC, R.Right, R.Bottom - (I * 4) - 1, nil);
|
|
LineTo(DC, R.Right - (I * 4) - 1, R.Bottom);
|
|
end;
|
|
SelectObject(DC, SavePen);
|
|
DeleteObject(Pen);
|
|
Pen := CreatePen(PS_SOLID, 1, ColorToRGB(clWindow));
|
|
SavePen := SelectObject(DC, Pen);
|
|
for I := 0 to (SizeGripRectSize - 2) div 4 do
|
|
begin
|
|
MoveToEx(DC, R.Right, R.Bottom - (I * 4) - 2, nil);
|
|
LineTo(DC, R.Right - (I * 4) - 2, R.Bottom);
|
|
end;
|
|
SelectObject(DC, SavePen);
|
|
DeleteObject(Pen);
|
|
EndPaint(ParentWnd, PS);
|
|
end;
|
|
|
|
begin
|
|
with Msg do
|
|
begin
|
|
case Msg of
|
|
{ WM_SIZE:
|
|
ParentResize;}
|
|
WM_GETMINMAXINFO:
|
|
with PMinMaxInfo(LParam)^ do
|
|
begin
|
|
ptMinTrackSize.X := FInitialSize.cx;
|
|
ptMinTrackSize.Y := FInitialSize.cy;
|
|
end;
|
|
WM_PAINT:
|
|
PaintSizeGrip;
|
|
end;
|
|
Result := CallWindowProc(FOldParentWndInstance, FParentWnd, Msg, WParam, LParam);
|
|
if Msg = WM_SIZE then
|
|
ParentResize;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvOpenDialog.SetDefBtnCaption(const Value: string);
|
|
begin
|
|
if FDefBtnCaption <> Value then
|
|
begin
|
|
FDefBtnCaption := Value;
|
|
if FParentWnd <> 0 then
|
|
UpdateCaptions;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvOpenDialog.SetFilterLabelCaption(const Value: string);
|
|
begin
|
|
if FFilterLabelCaption <> Value then
|
|
begin
|
|
FFilterLabelCaption := Value;
|
|
if FParentWnd <> 0 then
|
|
UpdateCaptions;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvOpenDialog.SelectFolder(const FolderName: string);
|
|
var
|
|
LastFocus: HWND;
|
|
begin
|
|
if ParentWnd = 0 then
|
|
Exit;
|
|
LastFocus := GetFocus;
|
|
SendMessage(ParentWnd, CDM_SETCONTROLTEXT, edt1, LPARAM(PChar(FolderName)));
|
|
SendMessage(GetDlgItem(ParentWnd, btnOk), BM_CLICK, 0, 0);
|
|
SendMessage(ParentWnd, CDM_SETCONTROLTEXT, edt1, 0);
|
|
SetFocus(LastFocus);
|
|
end;
|
|
|
|
function TJvOpenDialog.TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
|
|
{$IFDEF COMPILER5}
|
|
const
|
|
PlacesBar: array [Boolean] of DWORD = (OFN_EX_NOPLACESBAR, 0);
|
|
var
|
|
DialogData2000: TOpenFileName2000;
|
|
{$ENDIF COMPILER5}
|
|
begin
|
|
TOpenFileName(DialogData).hInstance := FindClassHInstance(Self.ClassType);
|
|
FActiveSettingDone := False;
|
|
if IsWin2kOrAbove then
|
|
begin
|
|
if ActiveStyle = asReport then
|
|
InstallW2kFix;
|
|
{$IFDEF COMPILER5}
|
|
FillChar(DialogData2000, SizeOf(DialogData2000), #0);
|
|
DialogData2000.OpenFileName := TOpenFileName(DialogData);
|
|
DialogData2000.OpenFileName.lStructSize := SizeOf(DialogData2000);
|
|
DialogData2000.FlagsEx := PlacesBar[FShowPlacesBar];
|
|
Result := inherited TaskModalDialog(DialogFunc, DialogData2000);
|
|
TOpenFileName(DialogData).nFilterIndex := DialogData2000.OpenFileName.nFilterIndex;
|
|
{$ELSE}
|
|
Result := inherited TaskModalDialog(DialogFunc, DialogData);
|
|
{$ENDIF COMPILER5}
|
|
end
|
|
else
|
|
Result := inherited TaskModalDialog(DialogFunc, DialogData);
|
|
if not Result then
|
|
DoError(CommDlgExtendedError);
|
|
end;
|
|
|
|
procedure TJvOpenDialog.UpdateCaptions;
|
|
begin
|
|
if Length(FDefBtnCaption) > 0 then
|
|
SendMessage(ParentWnd, CDM_SETCONTROLTEXT, btnOk, Longint(PChar(DefBtnCaption)));
|
|
if Length(FFilterLabelCaption) > 0 then
|
|
SendMessage(ParentWnd, CDM_SETCONTROLTEXT, stc2, Longint(PChar(FilterLabelCaption)));
|
|
end;
|
|
|
|
procedure TJvOpenDialog.UpdateControlPos;
|
|
var
|
|
WRect: TRect;
|
|
CtrlWnd: HWND;
|
|
OfsSize: TPoint;
|
|
CLeft, CTop, CWidth, CHeight: Integer;
|
|
DeferHandle: HDWP;
|
|
|
|
function GetDlgWndInfo(Wnd: HWND): Boolean;
|
|
var
|
|
Rect: TRect;
|
|
begin
|
|
Result := Wnd <> 0;
|
|
if not Result then
|
|
Exit;
|
|
CtrlWnd := Wnd;
|
|
GetWindowRect(CtrlWnd, Rect);
|
|
MapWindowPoints(0, ParentWnd, Rect, 2);
|
|
CLeft := Rect.Left;
|
|
CTop := Rect.Top;
|
|
CWidth := Rect.Right - Rect.Left;
|
|
CHeight := Rect.Bottom - Rect.Top;
|
|
end;
|
|
|
|
function GetDlgItemInfo(ItemNum: Integer): Boolean;
|
|
begin
|
|
Result := GetDlgWndInfo(GetDlgItem(ParentWnd, ItemNum));
|
|
end;
|
|
|
|
begin
|
|
GetClientRect(ParentWnd, WRect);
|
|
OfsSize.X := (WRect.Right - WRect.Left) - (FOriginalRect.Right - FOriginalRect.Left);
|
|
OfsSize.Y := (WRect.Bottom - WRect.Top) - (FOriginalRect.Bottom - FOriginalRect.Top);
|
|
FOriginalRect := WRect;
|
|
|
|
DeferHandle := BeginDeferWindowPos(12);
|
|
|
|
GetDlgItemInfo(btnOk); // Default Button
|
|
Inc(CLeft, OfsSize.X);
|
|
Inc(CTop, OfsSize.Y);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, 0, 0,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE);
|
|
|
|
GetDlgItemInfo(btnCancel); // Cancel Button
|
|
Inc(CLeft, OfsSize.X);
|
|
Inc(CTop, OfsSize.Y);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, 0, 0,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE);
|
|
|
|
GetDlgItemInfo(pshHelp); // Help Button
|
|
Inc(CLeft, OfsSize.X);
|
|
Inc(CTop, OfsSize.Y);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, 0, 0,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE);
|
|
|
|
GetDlgItemInfo(edt1); // Filename
|
|
Inc(CTop, OfsSize.Y);
|
|
Inc(CWidth, OfsSize.X);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, CWidth, CHeight,
|
|
SWP_NOACTIVATE or SWP_NOZORDER);
|
|
|
|
GetDlgItemInfo(cmb1); // File Type
|
|
Inc(CTop, OfsSize.Y);
|
|
Inc(CWidth, OfsSize.X);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, CWidth, CHeight,
|
|
SWP_NOACTIVATE or SWP_NOZORDER);
|
|
|
|
GetDlgItemInfo(chx1); // Read-only Checkbox
|
|
Inc(CTop, OfsSize.Y);
|
|
Inc(CWidth, OfsSize.X);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, CWidth, CHeight,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE);
|
|
|
|
GetDlgItemInfo(stc2); // File Type Label
|
|
Inc(CTop, OfsSize.Y);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, 0, 0,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE);
|
|
|
|
GetDlgItemInfo(stc3); // Filename Label
|
|
Inc(CTop, OfsSize.Y);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, 0, 0,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE);
|
|
|
|
GetDlgItemInfo(cmb2); // Folder combobox
|
|
Inc(CWidth, OfsSize.X);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, 0, 0, CWidth, CHeight,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOMOVE);
|
|
|
|
if GetDlgItemInfo(lst2) then // ListView run
|
|
begin
|
|
Inc(CHeight, OfsSize.Y);
|
|
Inc(CWidth, OfsSize.X);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, 0, 0, CWidth, CHeight,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOMOVE);
|
|
end;
|
|
if GetDlgItemInfo(lst1) then // ListView init
|
|
begin
|
|
Inc(CHeight, OfsSize.Y);
|
|
Inc(CWidth, OfsSize.X);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, 0, 0, CWidth, CHeight,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOMOVE);
|
|
end;
|
|
|
|
if GetDlgWndInfo(FindWindowEx(FParentWnd, 0, TOOLBARCLASSNAME, nil)) then
|
|
begin
|
|
Inc(CLeft, OfsSize.X);
|
|
DeferHandle := DeferWindowPos(DeferHandle, CtrlWnd, 0, CLeft, CTop, 0, 0,
|
|
SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE);
|
|
end;
|
|
|
|
EndDeferWindowPos(DeferHandle);
|
|
end;
|
|
|
|
procedure TJvOpenDialog.WMNCDestroy(var Msg: TWMNCDestroy);
|
|
begin
|
|
FParentWnd := 0;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TJvOpenDialog.WndProc(var Msg: TMessage);
|
|
const
|
|
ShareViolResult: array [Boolean] of DWORD = (OFN_SHARENOWARN, OFN_SHAREFALLTHROUGH);
|
|
begin
|
|
with Msg do
|
|
case Msg of
|
|
WM_ENTERIDLE:
|
|
DoActiveSetting;
|
|
WM_NOTIFY:
|
|
case POFNotify(LParam)^.hdr.code of
|
|
CDN_SHAREVIOLATION:
|
|
if Assigned(FOnShareViolation) then
|
|
begin
|
|
Result := ShareViolResult[DoShareViolation];
|
|
SetWindowLong(Handle, DWL_MSGRESULT, Result);
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TJvOpenDialog.DoError(ErrorCode: Cardinal);
|
|
begin
|
|
if Assigned(FOnError) then
|
|
FOnError(Self, ErrorCode);
|
|
end;
|
|
|
|
//=== { TJvSaveDialog } ======================================================
|
|
|
|
function TJvSaveDialog.TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
|
|
begin
|
|
DialogFunc := @GetSaveFileName;
|
|
Result := inherited TaskModalDialog(DialogFunc, DialogData);
|
|
end;
|
|
|
|
//=== { TJvColorDialog } =====================================================
|
|
|
|
var
|
|
GlobalColorDialog: TJvColorDialog = nil;
|
|
OldColorDialogHookProc: Pointer = nil;
|
|
|
|
function ColorDialogHook(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
|
|
begin
|
|
if Assigned(GlobalColorDialog) and (Msg = GlobalColorDialog.FColorOkMessage) then
|
|
Result := Integer(not GlobalColorDialog.DoQueryColor(TColor(PChooseColor(LParam)^.rgbResult)))
|
|
else
|
|
Result := CallWindowProc(OldColorDialogHookProc, Wnd, Msg, WParam, LParam);
|
|
end;
|
|
|
|
constructor TJvColorDialog.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FColorOkMessage := RegisterWindowMessage(COLOROKSTRING);
|
|
FSetRBGMessage := RegisterWindowMessage(SETRGBSTRING);
|
|
end;
|
|
|
|
procedure TJvColorDialog.DoClose;
|
|
begin
|
|
GlobalColorDialog := nil;
|
|
inherited DoClose;
|
|
end;
|
|
|
|
function TJvColorDialog.DoQueryColor(Color: TColor): Boolean;
|
|
begin
|
|
Result := True;
|
|
if Assigned(FOnQueryColor) then
|
|
FOnQueryColor(Self, Color, Result);
|
|
end;
|
|
|
|
procedure TJvColorDialog.DoShow;
|
|
begin
|
|
GlobalColorDialog := Self;
|
|
inherited DoShow;
|
|
end;
|
|
|
|
procedure TJvColorDialog.SelectColor(Color: TColor);
|
|
begin
|
|
if Handle <> 0 then
|
|
SendMessage(Handle, FSetRBGMessage, 0, ColorToRGB(Color));
|
|
end;
|
|
|
|
function TJvColorDialog.TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
|
|
begin
|
|
with TChooseColor(DialogData) do
|
|
begin
|
|
OldColorDialogHookProc := @lpfnHook;
|
|
lpfnHook := ColorDialogHook;
|
|
end;
|
|
Result := inherited TaskModalDialog(DialogFunc, DialogData);
|
|
end;
|
|
|
|
procedure TJvColorDialog.WMNCDestroy(var Msg: TWMNCDestroy);
|
|
begin
|
|
inherited;
|
|
OldColorDialogHookProc := nil;
|
|
end;
|
|
|
|
initialization
|
|
{$IFDEF UNITVERSIONING}
|
|
RegisterUnitVersion(HInstance, UnitVersioning);
|
|
{$ENDIF UNITVERSIONING}
|
|
|
|
finalization
|
|
UninstallW2kFix;
|
|
{$IFDEF UNITVERSIONING}
|
|
UnregisterUnitVersion(HInstance);
|
|
{$ENDIF UNITVERSIONING}
|
|
|
|
end.
|