mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 07:59:43 +01:00 
			
		
		
		
	Finishes the basic implementation of dpi and screen rotation adjustment for Android. Not 100% perfect, but in general already functional.
git-svn-id: trunk@34279 -
This commit is contained in:
		
							parent
							
								
									1b32e584ad
								
							
						
					
					
						commit
						cc0e04b161
					
				@ -8,6 +8,7 @@ import android.util.*;
 | 
			
		||||
import android.graphics.*;
 | 
			
		||||
import android.view.*;
 | 
			
		||||
import android.view.inputmethod.InputMethodManager;
 | 
			
		||||
import android.content.res.Configuration;
 | 
			
		||||
 | 
			
		||||
public class LCLActivity extends Activity 
 | 
			
		||||
{
 | 
			
		||||
@ -33,6 +34,13 @@ public class LCLActivity extends Activity
 | 
			
		||||
      int lWidth = getWidth();
 | 
			
		||||
      int lHeight = getHeight();
 | 
			
		||||
 | 
			
		||||
      // Check if we rotated in the draw event, OnConfigurationChanged can't return the new form width =(
 | 
			
		||||
      // see http://stackoverflow.com/questions/2524683/how-to-get-new-width-height-of-root-layout-in-onconfigurationchanged
 | 
			
		||||
      if (lWidth != lclformwidth) LCLOnConfigurationChanged(lclxdpi, lWidth); // we send xdpi because thats what the LCL uses for Screen.PixelsPerInch
 | 
			
		||||
 | 
			
		||||
      lclformwidth = lWidth;
 | 
			
		||||
      lclformheight = lHeight;
 | 
			
		||||
 | 
			
		||||
      //Log.v("lclproject", "LCLSurface.onDraw width=" + Integer.toString(lWidth)
 | 
			
		||||
      //  + " height=" + Integer.toString(lHeight));
 | 
			
		||||
 
 | 
			
		||||
@ -94,10 +102,35 @@ public class LCLActivity extends Activity
 | 
			
		||||
    lclsurface = new LCLSurface(this);
 | 
			
		||||
    setContentView(lclsurface);
 | 
			
		||||
    lclsurface.postInvalidate();
 | 
			
		||||
 | 
			
		||||
    // Tell the LCL that an OnCreate has happened and what is our instance
 | 
			
		||||
    lclformwidth = lclsurface.getWidth();
 | 
			
		||||
    lclformheight = lclsurface.getHeight();
 | 
			
		||||
    lclscreenwidth = lclformwidth;
 | 
			
		||||
    lclscreenheight = lclformheight;
 | 
			
		||||
    DisplayMetrics metrics = new DisplayMetrics();
 | 
			
		||||
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
 | 
			
		||||
    lclxdpi = (int) metrics.xdpi;
 | 
			
		||||
    lclydpi = (int) metrics.ydpi;
 | 
			
		||||
    LCLOnCreate(this);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  @Override public void onConfigurationChanged (Configuration newConfig)
 | 
			
		||||
  {
 | 
			
		||||
    super.onConfigurationChanged(newConfig);
 | 
			
		||||
 | 
			
		||||
    lclformwidth = lclsurface.getWidth();
 | 
			
		||||
    lclformheight = lclsurface.getHeight();
 | 
			
		||||
    lclscreenwidth = lclformwidth;
 | 
			
		||||
    lclscreenheight = lclformheight;
 | 
			
		||||
    DisplayMetrics metrics = new DisplayMetrics();
 | 
			
		||||
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
 | 
			
		||||
    lclxdpi = (int) metrics.xdpi;
 | 
			
		||||
    lclydpi = (int) metrics.ydpi;
 | 
			
		||||
    // Don't call LCLOnConfigurationChanged, wait for a onDraw instead
 | 
			
		||||
    lclsurface.postInvalidate();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // -------------------------------------------
 | 
			
		||||
  // JNI table of Pascal functions
 | 
			
		||||
  // -------------------------------------------
 | 
			
		||||
@ -107,6 +140,7 @@ public class LCLActivity extends Activity
 | 
			
		||||
  public native int LCLOnMessageBoxFinished(int Result);
 | 
			
		||||
  public native int LCLOnKey(int kind, int keyCode, KeyEvent event, char AChar);
 | 
			
		||||
  public native int LCLOnTimer(Runnable timerid);
 | 
			
		||||
  public native int LCLOnConfigurationChanged(int ANewDPI, int ANewWidth);
 | 
			
		||||
 | 
			
		||||
  // -------------------------------------------
 | 
			
		||||
  // Functions exported to the Pascal side
 | 
			
		||||
@ -275,6 +309,13 @@ public class LCLActivity extends Activity
 | 
			
		||||
  //
 | 
			
		||||
  public int lcltimerinterval;
 | 
			
		||||
  public Runnable lcltimerid;
 | 
			
		||||
  //
 | 
			
		||||
  public int lclxdpi;
 | 
			
		||||
  public int lclydpi;
 | 
			
		||||
  public int lclformwidth;
 | 
			
		||||
  public int lclformheight;
 | 
			
		||||
  public int lclscreenwidth;
 | 
			
		||||
  public int lclscreenheight;
 | 
			
		||||
 | 
			
		||||
  static
 | 
			
		||||
  {
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@ exports
 | 
			
		||||
  Java_com_pascal_lclproject_LCLActivity_LCLOnMessageBoxFinished name 'Java_com_pascal_lcltest_LCLActivity_LCLOnMessageBoxFinished',
 | 
			
		||||
  Java_com_pascal_lclproject_LCLActivity_LCLOnKey name 'Java_com_pascal_lcltest_LCLActivity_LCLOnKey',
 | 
			
		||||
  Java_com_pascal_lclproject_LCLActivity_LCLOnTimer name 'Java_com_pascal_lcltest_LCLActivity_LCLOnTimer',
 | 
			
		||||
  Java_com_pascal_lclproject_LCLActivity_LCLOnConfigurationChanged name 'Java_com_pascal_lclproject_LCLActivity_LCLOnConfigurationChanged',
 | 
			
		||||
  JNI_OnLoad name 'JNI_OnLoad',
 | 
			
		||||
  JNI_OnUnload name 'JNI_OnUnload';
 | 
			
		||||
{$endif}
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ interface
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
 | 
			
		||||
  LCLProc, Arrow, StdCtrls, ComCtrls, LCLType, LCLIntf;
 | 
			
		||||
  LCLProc, Arrow, StdCtrls, ComCtrls, LCLType, LCLIntf, InterfaceBase;
 | 
			
		||||
 | 
			
		||||
type
 | 
			
		||||
  TSubControl = class;
 | 
			
		||||
@ -143,6 +143,7 @@ procedure TForm1.Button1Click(Sender: TObject);
 | 
			
		||||
begin
 | 
			
		||||
  DebugLn('Button1Click');
 | 
			
		||||
  ProgressBar1.Position := ProgressBar1.Position + 10;
 | 
			
		||||
//  Self.AutoAdjustLayout(lapAutoAdjustWithoutHorizontalScrolling, 96, 150, 220, 600);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
 | 
			
		||||
 | 
			
		||||
@ -134,7 +134,9 @@
 | 
			
		||||
      <Unit2>
 | 
			
		||||
        <Filename Value="secondform.pas"/>
 | 
			
		||||
        <IsPartOfProject Value="True"/>
 | 
			
		||||
        <ComponentName Value="Form2"/>
 | 
			
		||||
        <HasResources Value="True"/>
 | 
			
		||||
        <ResourceBaseClass Value="Form"/>
 | 
			
		||||
        <UnitName Value="secondform"/>
 | 
			
		||||
      </Unit2>
 | 
			
		||||
    </Units>
 | 
			
		||||
 | 
			
		||||
@ -880,14 +880,7 @@ type
 | 
			
		||||
    chtOnKeyDown
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
  TLayoutAdjustmentPolicy = (
 | 
			
		||||
    lapDefault,     // widgetset dependent
 | 
			
		||||
    lapFixedLayout, // A fixed absolute layout in all platforms
 | 
			
		||||
    lapAutoAdjustWithoutHorizontalScrolling, // Smartphone platforms use this one,
 | 
			
		||||
                                             // the x axis is stretched to fill the screen and
 | 
			
		||||
                                             // the y is scaled to fit the DPI
 | 
			
		||||
    lapAutoAdjustForDPI // For desktops using High DPI, scale x and y to fit the DPI
 | 
			
		||||
  );
 | 
			
		||||
  TLayoutAdjustmentPolicy = InterfaceBase.TLayoutAdjustmentPolicy;
 | 
			
		||||
 | 
			
		||||
{* Note on TControl.Caption
 | 
			
		||||
 * The VCL implementation relies on the virtual Get/SetTextBuf to
 | 
			
		||||
@ -1358,8 +1351,8 @@ type
 | 
			
		||||
    procedure WriteLayoutDebugReport(const Prefix: string); virtual;
 | 
			
		||||
    procedure AutoAdjustLayout(AMode: TLayoutAdjustmentPolicy;
 | 
			
		||||
      const AFromDPI, AToDPI, AOldFormWidth, ANewFormWidth: Integer); virtual;
 | 
			
		||||
    function ShouldAutoAdjustLayout: Boolean; virtual;
 | 
			
		||||
    function ShouldAutoAdjustLeftAndTop: Boolean; virtual;
 | 
			
		||||
    function ShouldAutoAdjustWidthAndHeight: Boolean; virtual;
 | 
			
		||||
  public
 | 
			
		||||
    constructor Create(TheOwner: TComponent);override;
 | 
			
		||||
    destructor Destroy; override;
 | 
			
		||||
 | 
			
		||||
@ -453,6 +453,7 @@ type
 | 
			
		||||
    FRestoredHeight: integer;
 | 
			
		||||
    FShowInTaskbar: TShowInTaskbar;
 | 
			
		||||
    FWindowState: TWindowState;
 | 
			
		||||
    FDesignTimeDPI: Integer;
 | 
			
		||||
    function GetClientHandle: HWND;
 | 
			
		||||
    function GetEffectiveShowInTaskBar: TShowInTaskBar;
 | 
			
		||||
    function GetMonitor: TMonitor;
 | 
			
		||||
@ -655,6 +656,7 @@ type
 | 
			
		||||
    property DefaultMonitor: TDefaultMonitor read FDefaultMonitor
 | 
			
		||||
      write FDefaultMonitor default dmActiveForm;
 | 
			
		||||
    property Designer: TIDesigner read FDesigner write FDesigner;
 | 
			
		||||
    property DesignTimeDPI: Integer read FDesignTimeDPI write FDesignTimeDPI;
 | 
			
		||||
    property FormState: TFormState read FFormState;
 | 
			
		||||
    property FormStyle: TFormStyle read FFormStyle write SetFormStyle
 | 
			
		||||
                                   default fsNormal;
 | 
			
		||||
 | 
			
		||||
@ -3447,23 +3447,31 @@ procedure TControl.AutoAdjustLayout(AMode: TLayoutAdjustmentPolicy;
 | 
			
		||||
var
 | 
			
		||||
  lXProportion, lYProportion: Double;
 | 
			
		||||
  NewLeft, NewTop, NewHeight, NewWidth: Integer;
 | 
			
		||||
  lMode: TLayoutAdjustmentPolicy;
 | 
			
		||||
begin
 | 
			
		||||
  // X-axis adjustment
 | 
			
		||||
  if AMode = lapAutoAdjustWithoutHorizontalScrolling then
 | 
			
		||||
  // First resolve ladDefault
 | 
			
		||||
  lMode := AMode;
 | 
			
		||||
  if lMode = lapDefault then Widgetset.ResolveDefaultLayoutAdjustmentPolicy(lMode);
 | 
			
		||||
 | 
			
		||||
  // X-axis adjustment proportion
 | 
			
		||||
  if lMode = lapAutoAdjustWithoutHorizontalScrolling then
 | 
			
		||||
  begin
 | 
			
		||||
    lXProportion := ANewFormWidth / AOldFormWidth;
 | 
			
		||||
    if AOldFormWidth > 0 then lXProportion := ANewFormWidth / AOldFormWidth
 | 
			
		||||
    else lXProportion := 1.0;
 | 
			
		||||
  end
 | 
			
		||||
  else if AMode = lapAutoAdjustForDPI then
 | 
			
		||||
  else if lMode = lapAutoAdjustForDPI then
 | 
			
		||||
  begin
 | 
			
		||||
    lXProportion := AToDPI / AFromDPI;
 | 
			
		||||
    if AFromDPI > 0 then lXProportion := AToDPI / AFromDPI
 | 
			
		||||
    else lXProportion := 1.0;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  // y-axis adjustment
 | 
			
		||||
  lYProportion := AToDPI / AFromDPI;
 | 
			
		||||
  // y-axis adjustment proportion
 | 
			
		||||
  if AFromDPI > 0 then lYProportion := AToDPI / AFromDPI
 | 
			
		||||
  else lYProportion := 1.0;
 | 
			
		||||
 | 
			
		||||
  // Apply the changes
 | 
			
		||||
  if (AMode = lapAutoAdjustWithoutHorizontalScrolling) or
 | 
			
		||||
   (AMode = lapAutoAdjustForDPI) then
 | 
			
		||||
  if (lMode = lapAutoAdjustWithoutHorizontalScrolling) or
 | 
			
		||||
   (lMode = lapAutoAdjustForDPI) then
 | 
			
		||||
  begin
 | 
			
		||||
    if ShouldAutoAdjustLeftAndTop then
 | 
			
		||||
    begin
 | 
			
		||||
@ -3475,22 +3483,30 @@ begin
 | 
			
		||||
      NewLeft := Left;
 | 
			
		||||
      NewTop := Top;
 | 
			
		||||
    end;
 | 
			
		||||
    NewWidth := Round(Width * lXProportion);
 | 
			
		||||
    NewHeight := Round(Height * lYProportion);
 | 
			
		||||
    if ShouldAutoAdjustWidthAndHeight then
 | 
			
		||||
    begin
 | 
			
		||||
      NewWidth := Round(Width * lXProportion);
 | 
			
		||||
      NewHeight := Round(Height * lYProportion);
 | 
			
		||||
    end
 | 
			
		||||
    else
 | 
			
		||||
    begin
 | 
			
		||||
      NewWidth := Width;
 | 
			
		||||
      NewHeight := Height;
 | 
			
		||||
    end;
 | 
			
		||||
    SetBounds(NewLeft, NewTop, NewWidth, NewHeight);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
// The layout should only be auto-adjusted for controls with the most simple
 | 
			
		||||
// default absolute positioning
 | 
			
		||||
function TControl.ShouldAutoAdjustLayout: Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  Result := (Align = alNone) and (Anchors = [akTop, akLeft])
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TControl.ShouldAutoAdjustLeftAndTop: Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  Result := Parent <> nil;
 | 
			
		||||
  Result := (Align = alNone) and (Anchors = [akTop, akLeft]) and (Parent <> nil);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TControl.ShouldAutoAdjustWidthAndHeight: Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  Result := AutoSize = False;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TControl.UpdateAnchorRules;
 | 
			
		||||
 | 
			
		||||
@ -1905,6 +1905,7 @@ begin
 | 
			
		||||
  FShowInTaskbar := stDefault;
 | 
			
		||||
  FAlphaBlend := False;
 | 
			
		||||
  FAlphaBlendValue := 255;
 | 
			
		||||
  FDesignTimeDPI := 96;
 | 
			
		||||
  // set border style before handle is allocated
 | 
			
		||||
  if not (fsBorderStyleChanged in FFormState) then
 | 
			
		||||
    FFormBorderStyle:= bsSizeable;
 | 
			
		||||
 | 
			
		||||
@ -1215,6 +1215,11 @@ begin
 | 
			
		||||
  Result := (Shift = []) and (Key = VK_F1);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TWidgetSet.ResolveDefaultLayoutAdjustmentPolicy(var AMode: TLayoutAdjustmentPolicy);
 | 
			
		||||
begin
 | 
			
		||||
  AMode := lapFixedLayout;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TWidgetSet.InitializeCriticalSection(var CritSection: TCriticalSection);
 | 
			
		||||
begin
 | 
			
		||||
  DebugLn('TWidgetSet.InitializeCriticalSection Not implemented yet');
 | 
			
		||||
 | 
			
		||||
@ -3780,9 +3780,7 @@ procedure TWinControl.AutoAdjustLayout(AMode: TLayoutAdjustmentPolicy;
 | 
			
		||||
var
 | 
			
		||||
  i: Integer;
 | 
			
		||||
begin
 | 
			
		||||
  // Only auto-adjust self if required, but always auto-adjust child objects
 | 
			
		||||
  if ShouldAutoAdjustLayout then
 | 
			
		||||
    inherited AutoAdjustLayout(AMode, AFromDPI, AToDPI, AOldFormWidth, ANewFormWidth);
 | 
			
		||||
  inherited AutoAdjustLayout(AMode, AFromDPI, AToDPI, AOldFormWidth, ANewFormWidth);
 | 
			
		||||
 | 
			
		||||
  for i:=0 to ControlCount-1 do
 | 
			
		||||
    Controls[i].AutoAdjustLayout(AMode, AFromDPI, AToDPI, AOldFormWidth, ANewFormWidth);
 | 
			
		||||
 | 
			
		||||
@ -37,6 +37,16 @@ uses
 | 
			
		||||
  GraphType, GraphMath, Themes;
 | 
			
		||||
 | 
			
		||||
type
 | 
			
		||||
  // Needs to be here to avoid circular unit references
 | 
			
		||||
  TLayoutAdjustmentPolicy = (
 | 
			
		||||
    lapDefault,     // widgetset dependent
 | 
			
		||||
    lapFixedLayout, // A fixed absolute layout in all platforms
 | 
			
		||||
    lapAutoAdjustWithoutHorizontalScrolling, // Smartphone platforms use this one,
 | 
			
		||||
                                             // the x axis is stretched to fill the screen and
 | 
			
		||||
                                             // the y is scaled to fit the DPI
 | 
			
		||||
    lapAutoAdjustForDPI // For desktops using High DPI, scale x and y to fit the DPI
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  PEventHandler = type Pointer;
 | 
			
		||||
  PProcessEventHandler = type Pointer;
 | 
			
		||||
  PPipeEventHandler = type Pointer;
 | 
			
		||||
@ -171,6 +181,8 @@ type
 | 
			
		||||
    function  InitStockFont(AFont: TObject; AStockFont: TStockFont): Boolean; virtual;
 | 
			
		||||
    function  IsHelpKey(Key: Word; Shift: TShiftState): Boolean; virtual;
 | 
			
		||||
 | 
			
		||||
    procedure ResolveDefaultLayoutAdjustmentPolicy(var AMode: TLayoutAdjustmentPolicy); virtual;
 | 
			
		||||
 | 
			
		||||
    // create and destroy
 | 
			
		||||
    function CreateTimer(Interval: integer; TimerProc: TWSTimerProc): THandle; virtual; abstract;
 | 
			
		||||
    function DestroyTimer(TimerHandle: THandle): boolean; virtual; abstract;
 | 
			
		||||
 | 
			
		||||
@ -209,6 +209,8 @@ type
 | 
			
		||||
    procedure DCSetAntialiasing(CanvasHandle: HDC; AEnabled: Boolean); override;
 | 
			
		||||
    procedure SetDesigning(AComponent: TComponent); override;
 | 
			
		||||
 | 
			
		||||
    procedure ResolveDefaultLayoutAdjustmentPolicy(var AMode: TLayoutAdjustmentPolicy); virtual;
 | 
			
		||||
 | 
			
		||||
    // create and destroy
 | 
			
		||||
    function CreateTimer(Interval: integer; TimerFunc: TWSTimerProc): THandle; override;
 | 
			
		||||
    function DestroyTimer(TimerHandle: THandle): boolean; override;
 | 
			
		||||
@ -240,6 +242,8 @@ function Java_com_pascal_lclproject_LCLActivity_LCLOnKey(
 | 
			
		||||
    AEvent: jobject; AChar: jchar): jint; cdecl;
 | 
			
		||||
function Java_com_pascal_lclproject_LCLActivity_LCLOnTimer(
 | 
			
		||||
    env:PJNIEnv; this:jobject; ATimer: jobject): jint; cdecl;
 | 
			
		||||
function Java_com_pascal_lclproject_LCLActivity_LCLOnConfigurationChanged(
 | 
			
		||||
    env:PJNIEnv; this:jobject; ANewDPI, ANewWidth: jint): jint; cdecl;
 | 
			
		||||
function JNI_OnLoad(vm:PJavaVM;reserved:pointer):jint; cdecl;
 | 
			
		||||
procedure JNI_OnUnload(vm:PJavaVM;reserved:pointer); cdecl;
 | 
			
		||||
 | 
			
		||||
@ -273,6 +277,13 @@ var
 | 
			
		||||
  // Timer
 | 
			
		||||
  javaField_lcltimerinterval: JfieldID=nil;
 | 
			
		||||
  javaField_lcltimerid: JfieldID=nil;
 | 
			
		||||
  // Screen Metrics
 | 
			
		||||
  javaField_lclxdpi: JfieldID=nil;
 | 
			
		||||
  javaField_lclydpi: JfieldID=nil;
 | 
			
		||||
  javaField_lclformwidth: JfieldID=nil;
 | 
			
		||||
  javaField_lclformheight: JfieldID=nil;
 | 
			
		||||
  javaField_lclscreenwidth: JfieldID=nil;
 | 
			
		||||
  javaField_lclscreenheight: JfieldID=nil;
 | 
			
		||||
 | 
			
		||||
  // Methods of our Activity
 | 
			
		||||
  javaMethod_LCLDoGetTextBounds: jmethodid = nil;
 | 
			
		||||
 | 
			
		||||
@ -254,7 +254,7 @@ end;
 | 
			
		||||
  MWE: exept for the desktop, there is always a bitmep selected in the DC.
 | 
			
		||||
       So get this internal bitmap and pass it to RawImage_FromBitmap
 | 
			
		||||
 ------------------------------------------------------------------------------}
 | 
			
		||||
function TQtWidgetSet.RawImage_FromDevice(out ARawImage: TRawImage; ADC: HDC; const ARect: TRect): Boolean;
 | 
			
		||||
function TCDWidgetSet.RawImage_FromDevice(out ARawImage: TRawImage; ADC: HDC; const ARect: TRect): Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  {$ifdef VerboseCDWinAPI}
 | 
			
		||||
    DebugLn('Trace:> [WinAPI GetRawImageFromDevice] SrcDC: ', dbghex(ADC),
 | 
			
		||||
 | 
			
		||||
@ -116,6 +116,7 @@ begin
 | 
			
		||||
  __android_log_write(ANDROID_LOG_INFO, 'lclapp', 'LCLOnCreate called by LCLActivity.onCreate');
 | 
			
		||||
  Result := 0;
 | 
			
		||||
  javaActivityObject := alclactivity;
 | 
			
		||||
  Screen.UpdateScreen(); // Any values read before LCLOnCreate are wrong
 | 
			
		||||
  Application.Run;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -219,7 +220,25 @@ begin
 | 
			
		||||
  Result := eventResult;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
const NativeMethods: array[0..5] of JNINativeMethod=
 | 
			
		||||
function Java_com_pascal_lclproject_LCLActivity_LCLOnConfigurationChanged(
 | 
			
		||||
  env:PJNIEnv; this:jobject; ANewDPI, ANewWidth: jint): jint; cdecl;
 | 
			
		||||
var
 | 
			
		||||
  lForm: TCDNonNativeForm;
 | 
			
		||||
  lOldDPI, lNewDPI, lOldFormWidth, lNewFormWidth: Integer;
 | 
			
		||||
begin
 | 
			
		||||
  lForm := GetCurrentForm();
 | 
			
		||||
  if lForm.LayoutAutoAdjusted then lOldDPI := Screen.PixelsPerInch
 | 
			
		||||
  else lOldDPI := lForm.LCLForm.DesignTimeDPI;
 | 
			
		||||
  lNewDPI := ANewDPI;
 | 
			
		||||
  lOldFormWidth := lForm.LCLForm.Width;
 | 
			
		||||
  lNewFormWidth := ANewWidth;
 | 
			
		||||
  DebugLn(Format('[LCLOnConfigurationChanged] lOldDPI=%d lNewDPI=%d lOldFormWidth=%d lNewFormWidth=%d',
 | 
			
		||||
    [lOldDPI, lNewDPI, lOldFormWidth, lNewFormWidth]));
 | 
			
		||||
  lForm.LCLForm.AutoAdjustLayout(lapAutoAdjustWithoutHorizontalScrolling,
 | 
			
		||||
    lOldDPI, lNewDPI, lOldFormWidth, lNewFormWidth);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
const NativeMethods: array[0..6] of JNINativeMethod=
 | 
			
		||||
  ((name:'LCLDrawToBitmap';
 | 
			
		||||
    signature:'(IILandroid/graphics/Bitmap;)I';
 | 
			
		||||
    fnPtr:@Java_com_pascal_lclproject_LCLActivity_LCLDrawToBitmap;),
 | 
			
		||||
@ -237,7 +256,10 @@ const NativeMethods: array[0..5] of JNINativeMethod=
 | 
			
		||||
    fnPtr:@Java_com_pascal_lclproject_LCLActivity_LCLOnKey;),
 | 
			
		||||
   (name:'LCLOnTimer';
 | 
			
		||||
    signature:'(Ljava/lang/Runnable;)I';
 | 
			
		||||
    fnPtr:@Java_com_pascal_lclproject_LCLActivity_LCLOnTimer;)
 | 
			
		||||
    fnPtr:@Java_com_pascal_lclproject_LCLActivity_LCLOnTimer;),
 | 
			
		||||
   (name:'LCLOnConfigurationChanged';
 | 
			
		||||
    signature:'(II)I';
 | 
			
		||||
    fnPtr:@Java_com_pascal_lclproject_LCLActivity_LCLOnConfigurationChanged;)
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
function JNI_OnLoad(vm:PJavaVM;reserved:pointer):jint; cdecl;
 | 
			
		||||
@ -298,6 +320,13 @@ begin
 | 
			
		||||
  // Timer
 | 
			
		||||
  javaField_lcltimerinterval := javaEnvRef^^.GetFieldID(javaEnvRef, javaActivityClass, 'lcltimerinterval', 'I');
 | 
			
		||||
  javaField_lcltimerid := javaEnvRef^^.GetFieldID(javaEnvRef, javaActivityClass, 'lcltimerid', 'Ljava/lang/Runnable;');
 | 
			
		||||
  // Screen Metrics
 | 
			
		||||
  javaField_lclxdpi := javaEnvRef^^.GetFieldID(javaEnvRef, javaActivityClass, 'lclxdpi', 'I');
 | 
			
		||||
  javaField_lclydpi := javaEnvRef^^.GetFieldID(javaEnvRef, javaActivityClass, 'lclydpi', 'I');
 | 
			
		||||
  javaField_lclformwidth := javaEnvRef^^.GetFieldID(javaEnvRef, javaActivityClass, 'lclformwidth', 'I');
 | 
			
		||||
  javaField_lclformheight := javaEnvRef^^.GetFieldID(javaEnvRef, javaActivityClass, 'lclformheight', 'I');
 | 
			
		||||
  javaField_lclscreenwidth := javaEnvRef^^.GetFieldID(javaEnvRef, javaActivityClass, 'lclscreenwidth', 'I');
 | 
			
		||||
  javaField_lclscreenheight := javaEnvRef^^.GetFieldID(javaEnvRef, javaActivityClass, 'lclscreenheight', 'I');
 | 
			
		||||
  //
 | 
			
		||||
  if not assigned(JavaField_lcltext) then
 | 
			
		||||
  begin
 | 
			
		||||
@ -731,6 +760,11 @@ procedure TCDWidgetSet.AppSetMainFormOnTaskBar(const DoSet: Boolean);
 | 
			
		||||
begin
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TCDWidgetSet.ResolveDefaultLayoutAdjustmentPolicy(var AMode: TLayoutAdjustmentPolicy);
 | 
			
		||||
begin
 | 
			
		||||
  AMode := lapAutoAdjustWithoutHorizontalScrolling;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  function: CreateTimer
 | 
			
		||||
  Params: Interval:
 | 
			
		||||
 | 
			
		||||
@ -353,6 +353,10 @@ begin
 | 
			
		||||
  if Assigned(ScreenContext) then ScreenContext.Free;
 | 
			
		||||
end;*)
 | 
			
		||||
 | 
			
		||||
procedure TCDWidgetSet.ResolveDefaultLayoutAdjustmentPolicy(var AMode: TLayoutAdjustmentPolicy);
 | 
			
		||||
begin
 | 
			
		||||
  AMode := lapFixedLayout;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ TCDAppDelegate }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -554,6 +554,11 @@ begin
 | 
			
		||||
    RecreateWnd(Application.MainForm);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TCDWidgetSet.ResolveDefaultLayoutAdjustmentPolicy(var AMode: TLayoutAdjustmentPolicy);
 | 
			
		||||
begin
 | 
			
		||||
  AMode := lapFixedLayout;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  function: CreateTimer
 | 
			
		||||
  Params: Interval:
 | 
			
		||||
 | 
			
		||||
@ -439,6 +439,11 @@ procedure TCDWidgetSet.AppSetMainFormOnTaskBar(const DoSet: Boolean);
 | 
			
		||||
begin
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TCDWidgetSet.ResolveDefaultLayoutAdjustmentPolicy(var AMode: TLayoutAdjustmentPolicy);
 | 
			
		||||
begin
 | 
			
		||||
  AMode := lapFixedLayout;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  function: CreateTimer
 | 
			
		||||
  Params: Interval:
 | 
			
		||||
 | 
			
		||||
@ -51,6 +51,7 @@ type
 | 
			
		||||
    //
 | 
			
		||||
    LastMouseDownControl: TWinControl; // Stores the control which should receive the next MouseUp
 | 
			
		||||
    FocusedControl: TWinControl; // The control focused in the form
 | 
			
		||||
    LayoutAutoAdjusted: Boolean; // Indicates if the form layout was already auto-adjusted once
 | 
			
		||||
    // Counter to keep track of when we requested Invalidate
 | 
			
		||||
    // Some systems like X11 and Win32 will keep sending unnecessary paint messages
 | 
			
		||||
    // so for them we just throw the previously painted image
 | 
			
		||||
 | 
			
		||||
@ -2829,64 +2829,62 @@ begin
 | 
			
		||||
    OriginDiff.X := Round(QTransform_Dx(Matrix)) - P.X;
 | 
			
		||||
    OriginDiff.Y := Round(QTransform_Dy(Matrix)) - P.Y;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
end;*)
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  Function: GetDeviceCaps
 | 
			
		||||
  Params: DC: HDC; Index: Integer
 | 
			
		||||
  Returns: Integer
 | 
			
		||||
 | 
			
		||||
 ------------------------------------------------------------------------------}
 | 
			
		||||
function TQtWidgetSet.GetDeviceCaps(DC: HDC; Index: Integer): Integer;
 | 
			
		||||
function TCDWidgetSet.GetDeviceCaps(DC: HDC; Index: Integer): Integer;
 | 
			
		||||
var
 | 
			
		||||
  QtDC: TQtDeviceContext;
 | 
			
		||||
  PaintDevice: QPaintDeviceH;
 | 
			
		||||
  PaintEngine: QPaintEngineH;
 | 
			
		||||
  LazDC: TLazCanvas;
 | 
			
		||||
begin
 | 
			
		||||
  {$ifdef VerboseQtWinAPI}
 | 
			
		||||
    WriteLn('[WinAPI GetDeviceCaps] DC ' + dbghex(DC));
 | 
			
		||||
  {$ifdef VerboseCDWinAPI}
 | 
			
		||||
    DebugLn(':>[WinAPI GetDeviceCaps] DC ' + dbghex(DC));
 | 
			
		||||
  {$endif}
 | 
			
		||||
 | 
			
		||||
  Result := 0;
 | 
			
		||||
  if DC = 0 then
 | 
			
		||||
    DC := HDC(QtScreenContext);
 | 
			
		||||
 | 
			
		||||
  if not IsValidDC(DC) then exit;
 | 
			
		||||
 | 
			
		||||
  QtDC := TQtDeviceContext(DC);
 | 
			
		||||
 | 
			
		||||
  PaintEngine := QtDC.PaintEngine;
 | 
			
		||||
  if PaintEngine = nil then
 | 
			
		||||
    exit;
 | 
			
		||||
  PaintDevice := QPaintEngine_paintDevice(PaintEngine);
 | 
			
		||||
  if DC = 0 then DC := HDC(ScreenDC);
 | 
			
		||||
  LazDC := TLazCanvas(DC);
 | 
			
		||||
 | 
			
		||||
  case Index of
 | 
			
		||||
    HORZSIZE:
 | 
			
		||||
      Result := QPaintDevice_widthMM(PaintDevice);
 | 
			
		||||
    VERTSIZE:
 | 
			
		||||
      Result := QPaintDevice_heightMM(PaintDevice);
 | 
			
		||||
    HORZRES:
 | 
			
		||||
      Result := QPaintDevice_width(PaintDevice);
 | 
			
		||||
    BITSPIXEL:
 | 
			
		||||
      Result := QPaintDevice_depth(PaintDevice);
 | 
			
		||||
//    HORZSIZE:
 | 
			
		||||
//      Result := QPaintDevice_widthMM(PaintDevice);
 | 
			
		||||
//    VERTSIZE:
 | 
			
		||||
//      Result := QPaintDevice_heightMM(PaintDevice);
 | 
			
		||||
//    HORZRES:
 | 
			
		||||
//      Result := QPaintDevice_width(PaintDevice);
 | 
			
		||||
//    BITSPIXEL:
 | 
			
		||||
//      Result := QPaintDevice_depth(PaintDevice);
 | 
			
		||||
    PLANES:
 | 
			
		||||
      Result := 1;
 | 
			
		||||
    SIZEPALETTE:
 | 
			
		||||
      Result := QPaintDevice_numColors(PaintDevice);
 | 
			
		||||
//    SIZEPALETTE:
 | 
			
		||||
//      Result := QPaintDevice_numColors(PaintDevice);
 | 
			
		||||
    LOGPIXELSX:
 | 
			
		||||
      Result := QPaintDevice_logicalDpiX(PaintDevice);
 | 
			
		||||
    begin
 | 
			
		||||
      if javaEnvRef = nil then Exit;
 | 
			
		||||
      Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclxdpi);
 | 
			
		||||
    end;
 | 
			
		||||
    LOGPIXELSY:
 | 
			
		||||
      Result := QPaintDevice_logicalDpiY(PaintDevice);
 | 
			
		||||
    VERTRES:
 | 
			
		||||
      Result := QPaintDevice_height(PaintDevice);
 | 
			
		||||
    begin
 | 
			
		||||
      if javaEnvRef = nil then Exit;
 | 
			
		||||
      Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclydpi);
 | 
			
		||||
    end;
 | 
			
		||||
//    VERTRES:
 | 
			
		||||
//      Result := QPaintDevice_height(PaintDevice);
 | 
			
		||||
    NUMRESERVED:
 | 
			
		||||
      Result := 0;
 | 
			
		||||
    else
 | 
			
		||||
      Result := 0;
 | 
			
		||||
  end;
 | 
			
		||||
  {$ifdef VerboseCDWinAPI}
 | 
			
		||||
    DebugLn(':<[WinAPI GetDeviceCaps] Result=' + dbghex(Result));
 | 
			
		||||
  {$endif}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TQtWidgetSet.GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT; Bits: Pointer; var BitInfo: BitmapInfo; Usage: UINT): Integer;
 | 
			
		||||
(*function TQtWidgetSet.GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT; Bits: Pointer; var BitInfo: BitmapInfo; Usage: UINT): Integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result := 0;
 | 
			
		||||
  {$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION}
 | 
			
		||||
@ -3756,7 +3754,7 @@ begin
 | 
			
		||||
  end
 | 
			
		||||
  else
 | 
			
		||||
    Result := FSysColorBrushes[nIndex];
 | 
			
		||||
end;
 | 
			
		||||
end;*)
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  Function: GetSystemMetrics
 | 
			
		||||
@ -3765,12 +3763,12 @@ end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 ------------------------------------------------------------------------------}
 | 
			
		||||
function TQtWidgetSet.GetSystemMetrics(nIndex: Integer): Integer;
 | 
			
		||||
function TCDWidgetSet.GetSystemMetrics(nIndex: Integer): Integer;
 | 
			
		||||
var
 | 
			
		||||
  R: TRect;
 | 
			
		||||
begin
 | 
			
		||||
  {$ifdef VerboseQtWinAPI}
 | 
			
		||||
    WriteLn(Format('Trace:> [TQtWidgetSet.GetSystemMetrics] %d', [nIndex]));
 | 
			
		||||
  {$ifdef VerboseCDWinAPI}
 | 
			
		||||
    DebugLn(Format(':>[TCDWidgetSet.GetSystemMetrics] nIndex=%d javaEnvRef=%x', [nIndex, PtrInt(javaEnvRef)]));
 | 
			
		||||
  {$endif}
 | 
			
		||||
  Result := 0;
 | 
			
		||||
  case nIndex of
 | 
			
		||||
@ -3787,17 +3785,17 @@ begin
 | 
			
		||||
        {$endif}
 | 
			
		||||
      end;
 | 
			
		||||
    SM_CMONITORS:
 | 
			
		||||
      Result := QDesktopWidget_numScreens(QApplication_desktop());
 | 
			
		||||
      Result := 1;
 | 
			
		||||
    SM_CMOUSEBUTTONS:
 | 
			
		||||
      begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CMOUSEBUTTONS    ');
 | 
			
		||||
      end;
 | 
			
		||||
    SM_CXBORDER, SM_CYBORDER:
 | 
			
		||||
{    SM_CXBORDER, SM_CYBORDER:
 | 
			
		||||
      begin
 | 
			
		||||
        // size of frame around controls
 | 
			
		||||
        Result := QStyle_pixelMetric(QApplication_style(),
 | 
			
		||||
                    QStylePM_DefaultFrameWidth, nil, nil);
 | 
			
		||||
      end;
 | 
			
		||||
      end;}
 | 
			
		||||
    SM_CXCURSOR:
 | 
			
		||||
      begin
 | 
			
		||||
        Result := 32; // recomended in docs
 | 
			
		||||
@ -3887,14 +3885,14 @@ begin
 | 
			
		||||
      begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMENUCHECK      ');
 | 
			
		||||
      end;
 | 
			
		||||
    SM_CXMENUSIZE:
 | 
			
		||||
{    SM_CXMENUSIZE:
 | 
			
		||||
      begin
 | 
			
		||||
        Result := QStyle_pixelMetric(QApplication_style(), QStylePM_IndicatorWidth, nil, nil);
 | 
			
		||||
      end;
 | 
			
		||||
    SM_CYMENUSIZE:
 | 
			
		||||
      begin
 | 
			
		||||
        Result := QStyle_pixelMetric(QApplication_style(), QStylePM_IndicatorHeight, nil, nil);
 | 
			
		||||
      end;
 | 
			
		||||
      end;}
 | 
			
		||||
    SM_CXMIN:
 | 
			
		||||
      begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXMIN            ');
 | 
			
		||||
@ -3928,15 +3926,19 @@ begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMINTRACK       ');
 | 
			
		||||
      end;
 | 
			
		||||
    SM_CXSCREEN:
 | 
			
		||||
      begin
 | 
			
		||||
        QDesktopWidget_screenGeometry(QApplication_desktop(), @R, QDesktopWidget_primaryScreen(QApplication_desktop()));
 | 
			
		||||
        Result := R.Right - R.Left;
 | 
			
		||||
      end;
 | 
			
		||||
    begin
 | 
			
		||||
      Result := 100; // avoid errors if this is called too early
 | 
			
		||||
      if javaEnvRef = nil then Exit;
 | 
			
		||||
      Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclscreenwidth);
 | 
			
		||||
      if Result = 0 then Result := 100;
 | 
			
		||||
    end;
 | 
			
		||||
    SM_CYSCREEN:
 | 
			
		||||
      begin
 | 
			
		||||
        QDesktopWidget_screenGeometry(QApplication_desktop(), @R, QDesktopWidget_primaryScreen(QApplication_desktop()));
 | 
			
		||||
        Result := R.Bottom - R.Top;
 | 
			
		||||
      end;
 | 
			
		||||
    begin
 | 
			
		||||
      Result := 100; // avoid errors if this is called too early
 | 
			
		||||
      if javaEnvRef = nil then Exit;
 | 
			
		||||
      Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclscreenheight);
 | 
			
		||||
      if Result = 0 then Result := 100;
 | 
			
		||||
    end;
 | 
			
		||||
    SM_CXSIZE:
 | 
			
		||||
      begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXSIZE           ');
 | 
			
		||||
@ -3945,11 +3947,11 @@ begin
 | 
			
		||||
      begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYSIZE           ');
 | 
			
		||||
      end;
 | 
			
		||||
    SM_CXSIZEFRAME,
 | 
			
		||||
{    SM_CXSIZEFRAME,
 | 
			
		||||
    SM_CYSIZEFRAME:
 | 
			
		||||
      begin
 | 
			
		||||
        Result := QStyle_pixelMetric(QApplication_style(), QStylePM_MDIFrameWidth, nil, nil);
 | 
			
		||||
      end;
 | 
			
		||||
      end;}
 | 
			
		||||
    SM_CXSMICON,
 | 
			
		||||
    SM_CYSMICON:
 | 
			
		||||
      begin
 | 
			
		||||
@ -3964,24 +3966,26 @@ begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYSMSIZE         ');
 | 
			
		||||
      end;
 | 
			
		||||
    SM_CXVIRTUALSCREEN:
 | 
			
		||||
      begin
 | 
			
		||||
        Result := QWidget_width(QApplication_desktop);
 | 
			
		||||
      end;
 | 
			
		||||
    begin
 | 
			
		||||
      if javaEnvRef = nil then Exit;
 | 
			
		||||
      Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclscreenwidth);
 | 
			
		||||
    end;
 | 
			
		||||
    SM_CYVIRTUALSCREEN:
 | 
			
		||||
      begin
 | 
			
		||||
        Result := QWidget_height(QApplication_desktop);
 | 
			
		||||
      end;
 | 
			
		||||
    begin
 | 
			
		||||
      if javaEnvRef = nil then Exit;
 | 
			
		||||
      Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclscreenheight);
 | 
			
		||||
    end;
 | 
			
		||||
    SM_CXVSCROLL,
 | 
			
		||||
    SM_CYVSCROLL,
 | 
			
		||||
    SM_CXHSCROLL,
 | 
			
		||||
    SM_CYHSCROLL:
 | 
			
		||||
      begin
 | 
			
		||||
        Result := QStyle_pixelMetric(QApplication_Style, QStylePM_ScrollBarExtent, nil, nil);
 | 
			
		||||
      end;
 | 
			
		||||
{    SM_CYHSCROLL:
 | 
			
		||||
    begin
 | 
			
		||||
      Result := QStyle_pixelMetric(QApplication_Style, QStylePM_ScrollBarExtent, nil, nil);
 | 
			
		||||
    end;
 | 
			
		||||
    SM_CYCAPTION:
 | 
			
		||||
      begin
 | 
			
		||||
        Result := QStyle_pixelMetric(QApplication_Style, QStylePM_TitleBarHeight, nil, nil);
 | 
			
		||||
      end;
 | 
			
		||||
    begin
 | 
			
		||||
      Result := QStyle_pixelMetric(QApplication_Style, QStylePM_TitleBarHeight, nil, nil);
 | 
			
		||||
    end;}
 | 
			
		||||
    SM_CYKANJIWINDOW:
 | 
			
		||||
      begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYKANJIWINDOW    ');
 | 
			
		||||
@ -4047,33 +4051,10 @@ begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_SWAPBUTTON       ');
 | 
			
		||||
      end;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  Function: GetTextColor
 | 
			
		||||
  Params:  DC     - A device context
 | 
			
		||||
  Returns: TColorRef
 | 
			
		||||
 | 
			
		||||
  Gets the Font Color currently assigned to the Device Context
 | 
			
		||||
 ------------------------------------------------------------------------------}
 | 
			
		||||
function TQtWidgetSet.GetTextColor(DC: HDC) : TColorRef;
 | 
			
		||||
var
 | 
			
		||||
  Color: TQColor;
 | 
			
		||||
  QtDC: TQtDeviceContext;
 | 
			
		||||
begin
 | 
			
		||||
  {$ifdef VerboseQtWinAPI}
 | 
			
		||||
    WriteLn('[WinAPI GetTextColor]');
 | 
			
		||||
  {$ifdef VerboseCDWinAPI}
 | 
			
		||||
    DebugLn(':<[TCDWidgetSet.GetSystemMetrics] Result=' + dbghex(Result));
 | 
			
		||||
  {$endif}
 | 
			
		||||
 | 
			
		||||
  Result := 0;
 | 
			
		||||
 | 
			
		||||
  if IsValidDC(DC) then
 | 
			
		||||
  begin
 | 
			
		||||
    QtDC := TQtDeviceContext(DC);
 | 
			
		||||
    ColorRefToTQColor(TColorRef(QtDC.vTextColor), Color);
 | 
			
		||||
    TQColorToColorRef(Color, Result);
 | 
			
		||||
  end;
 | 
			
		||||
end;*)
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{$ifdef CD_UseNativeText}
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@ -386,44 +386,52 @@ begin
 | 
			
		||||
end;
 | 
			
		||||
{$endif}
 | 
			
		||||
 | 
			
		||||
(*function TCocoaWidgetSet.FillRect(DC: HDC; const Rect: TRect; Brush: HBRUSH): Boolean;
 | 
			
		||||
var
 | 
			
		||||
  ctx : TCocoaContext;
 | 
			
		||||
  br  : TCocoaGDIObject;
 | 
			
		||||
begin
 | 
			
		||||
  ctx:=CheckDC(DC);
 | 
			
		||||
  br:=CheckGDIOBJ(Brush);
 | 
			
		||||
  Result:=Assigned(ctx) and (not Assigned(br) or (br is TCocoaBrush));
 | 
			
		||||
  if not Result then Exit;
 | 
			
		||||
 | 
			
		||||
  with Rect do
 | 
			
		||||
    ctx.Rectangle(Left, Top, Right, Bottom, True, TCocoaBrush(br));
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  function ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean;
 | 
			
		||||
 | 
			
		||||
  nCmdShow:
 | 
			
		||||
    SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED
 | 
			
		||||
------------------------------------------------------------------------------}
 | 
			
		||||
function TCocoaWidgetSet.ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean;
 | 
			
		||||
  Function: GetDeviceCaps
 | 
			
		||||
  Params: DC: HDC; Index: Integer
 | 
			
		||||
  Returns: Integer
 | 
			
		||||
 ------------------------------------------------------------------------------}
 | 
			
		||||
function TCDWidgetSet.GetDeviceCaps(DC: HDC; Index: Integer): Integer;
 | 
			
		||||
var
 | 
			
		||||
  LazDC: TLazCanvas;
 | 
			
		||||
begin
 | 
			
		||||
  {$ifdef VerboseCocoaWinAPI}
 | 
			
		||||
    DebugLn('TCocoaWidgetSet.ShowWindow');
 | 
			
		||||
  {$ifdef VerboseCDWinAPI}
 | 
			
		||||
    DebugLn('[WinAPI GetDeviceCaps] DC ' + dbghex(DC));
 | 
			
		||||
  {$endif}
 | 
			
		||||
 | 
			
		||||
  case nCmdShow of
 | 
			
		||||
    SW_SHOW, SW_SHOWNORMAL:
 | 
			
		||||
      NSWindow(hwnd).orderFront(nil);
 | 
			
		||||
    SW_HIDE:
 | 
			
		||||
      NSWindow(hwnd).orderOut(nil);
 | 
			
		||||
    SW_MINIMIZE:
 | 
			
		||||
      NSWindow(hwnd).miniaturize(nil);
 | 
			
		||||
  end;
 | 
			
		||||
  Result:=true;
 | 
			
		||||
  Result := 0;
 | 
			
		||||
 | 
			
		||||
{  if DC = 0 then DC := HDC(ScreenDC);
 | 
			
		||||
 | 
			
		||||
  LazDC := TLazCanvas(DC);
 | 
			
		||||
 | 
			
		||||
  case Index of
 | 
			
		||||
//    HORZSIZE:
 | 
			
		||||
//      Result := QPaintDevice_widthMM(PaintDevice);
 | 
			
		||||
//    VERTSIZE:
 | 
			
		||||
//      Result := QPaintDevice_heightMM(PaintDevice);
 | 
			
		||||
//    HORZRES:
 | 
			
		||||
//      Result := QPaintDevice_width(PaintDevice);
 | 
			
		||||
//    BITSPIXEL:
 | 
			
		||||
//      Result := QPaintDevice_depth(PaintDevice);
 | 
			
		||||
    PLANES:
 | 
			
		||||
      Result := 1;
 | 
			
		||||
//    SIZEPALETTE:
 | 
			
		||||
//      Result := QPaintDevice_numColors(PaintDevice);
 | 
			
		||||
    LOGPIXELSX:
 | 
			
		||||
      Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclxdpi;
 | 
			
		||||
    LOGPIXELSY:
 | 
			
		||||
      Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclydpi;
 | 
			
		||||
//    VERTRES:
 | 
			
		||||
//      Result := QPaintDevice_height(PaintDevice);
 | 
			
		||||
    NUMRESERVED:
 | 
			
		||||
      Result := 0;
 | 
			
		||||
    else
 | 
			
		||||
      Result := 0;
 | 
			
		||||
  end;}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
(*{------------------------------------------------------------------------------
 | 
			
		||||
  Method:  GetWindowRect
 | 
			
		||||
  Params:  Handle - Handle of window
 | 
			
		||||
           Rect   - Record for window coordinates
 | 
			
		||||
@ -670,50 +678,6 @@ begin
 | 
			
		||||
  Result:=True;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------- SYNC OBJECTS ---------------------------------}
 | 
			
		||||
 | 
			
		||||
procedure TCocoaWidgetSet.InitializeCriticalSection(var CritSection: TCriticalSection);
 | 
			
		||||
begin
 | 
			
		||||
  CritSection:=TCriticalSection(NSRecursiveLock.alloc);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TCocoaWidgetSet.DeleteCriticalSection(var CritSection: TCriticalSection);
 | 
			
		||||
begin
 | 
			
		||||
  if CritSection=0 then Exit;
 | 
			
		||||
  NSRecursiveLock(CritSection).release;
 | 
			
		||||
  CritSection:=0;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TCocoaWidgetSet.EnterCriticalSection(var CritSection: TCriticalSection);
 | 
			
		||||
begin
 | 
			
		||||
  if CritSection=0 then Exit;
 | 
			
		||||
  NSRecursiveLock(CritSection).lock;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TCocoaWidgetSet.LeaveCriticalSection(var CritSection: TCriticalSection);
 | 
			
		||||
begin
 | 
			
		||||
  if CritSection=0 then Exit;
 | 
			
		||||
  NSRecursiveLock(CritSection).unlock;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------- DEVICE CONTEXT -------------------------------}
 | 
			
		||||
 | 
			
		||||
function TCDWidgetSet.BackendGetDC(hWnd: HWND): HDC;
 | 
			
		||||
{var
 | 
			
		||||
  lFormHandle: TCDNonNativeForm;}
 | 
			
		||||
begin
 | 
			
		||||
//  lFormHandle := TCDNonNativeForm(hWnd);
 | 
			
		||||
 | 
			
		||||
  Result := 0;
 | 
			
		||||
 | 
			
		||||
  // Screen DC
 | 
			
		||||
  if hWnd = 0 then Exit;
 | 
			
		||||
 | 
			
		||||
{  // Form DC
 | 
			
		||||
  if lFormHandle.Canvas = nil then lFormHandle.Canvas := TLazCanvas.create(nil);
 | 
			
		||||
  Result := HDC(lFormHandle.Canvas);}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TCDWidgetSet.MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: Cardinal): integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result := 0;
 | 
			
		||||
@ -766,6 +730,29 @@ begin
 | 
			
		||||
  {$ENDIF}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  function ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean;
 | 
			
		||||
 | 
			
		||||
  nCmdShow:
 | 
			
		||||
    SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED
 | 
			
		||||
------------------------------------------------------------------------------}
 | 
			
		||||
function TCocoaWidgetSet.ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  {$ifdef VerboseCocoaWinAPI}
 | 
			
		||||
    DebugLn('TCocoaWidgetSet.ShowWindow');
 | 
			
		||||
  {$endif}
 | 
			
		||||
 | 
			
		||||
  case nCmdShow of
 | 
			
		||||
    SW_SHOW, SW_SHOWNORMAL:
 | 
			
		||||
      NSWindow(hwnd).orderFront(nil);
 | 
			
		||||
    SW_HIDE:
 | 
			
		||||
      NSWindow(hwnd).orderOut(nil);
 | 
			
		||||
    SW_MINIMIZE:
 | 
			
		||||
      NSWindow(hwnd).miniaturize(nil);
 | 
			
		||||
  end;
 | 
			
		||||
  Result:=true;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TCocoaWidgetSet.RectVisible(DC: HDC; const ARect: TRect): Boolean;
 | 
			
		||||
var
 | 
			
		||||
  ClipBox: CGRect;
 | 
			
		||||
 | 
			
		||||
@ -1680,7 +1680,7 @@ begin
 | 
			
		||||
  DebugLn('Trace:< [WinAPI GetDC] Result: ', dbghex(Result));
 | 
			
		||||
  {$endif}
 | 
			
		||||
end;
 | 
			
		||||
begin
 | 
			
		||||
*)
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  Method: GetDeviceCaps
 | 
			
		||||
@ -1689,12 +1689,13 @@ begin
 | 
			
		||||
 | 
			
		||||
  Returns device specific information
 | 
			
		||||
 ------------------------------------------------------------------------------}
 | 
			
		||||
function TWin32WidgetSet.GetDeviceCaps(DC: HDC; Index: Integer): Integer;
 | 
			
		||||
function TCDWidgetSet.GetDeviceCaps(DC: HDC; Index: Integer): Integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result := Windows.GetDeviceCaps(DC, Index);
 | 
			
		||||
  Result := 0;
 | 
			
		||||
  if DC = 0 then Result := Windows.GetDeviceCaps(0, Index);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TWin32WidgetSet.GetDCOriginRelativeToWindow(PaintDC: HDC;
 | 
			
		||||
(*function TWin32WidgetSet.GetDCOriginRelativeToWindow(PaintDC: HDC;
 | 
			
		||||
  WindowHandle: HWND; var OriginDiff: TPoint): boolean;
 | 
			
		||||
var
 | 
			
		||||
  DCOrg, winOrg: Windows.POINT;
 | 
			
		||||
 | 
			
		||||
@ -2768,7 +2768,7 @@ begin
 | 
			
		||||
    OriginDiff.X := Round(QTransform_Dx(Matrix)) - P.X;
 | 
			
		||||
    OriginDiff.Y := Round(QTransform_Dy(Matrix)) - P.Y;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
end;*)
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  Function: GetDeviceCaps
 | 
			
		||||
@ -2776,18 +2776,16 @@ end;
 | 
			
		||||
  Returns: Integer
 | 
			
		||||
 | 
			
		||||
 ------------------------------------------------------------------------------}
 | 
			
		||||
function TQtWidgetSet.GetDeviceCaps(DC: HDC; Index: Integer): Integer;
 | 
			
		||||
function TCDWidgetSet.GetDeviceCaps(DC: HDC; Index: Integer): Integer;
 | 
			
		||||
var
 | 
			
		||||
  QtDC: TQtDeviceContext;
 | 
			
		||||
  PaintDevice: QPaintDeviceH;
 | 
			
		||||
  PaintEngine: QPaintEngineH;
 | 
			
		||||
  LazDC: TLazCanvas;
 | 
			
		||||
begin
 | 
			
		||||
  {$ifdef VerboseQtWinAPI}
 | 
			
		||||
    WriteLn('[WinAPI GetDeviceCaps] DC ' + dbghex(DC));
 | 
			
		||||
  {$endif}
 | 
			
		||||
 | 
			
		||||
  Result := 0;
 | 
			
		||||
  if DC = 0 then
 | 
			
		||||
(*  if DC = 0 then
 | 
			
		||||
    DC := HDC(QtScreenContext);
 | 
			
		||||
 | 
			
		||||
  if not IsValidDC(DC) then exit;
 | 
			
		||||
@ -2822,10 +2820,10 @@ begin
 | 
			
		||||
      Result := 0;
 | 
			
		||||
    else
 | 
			
		||||
      Result := 0;
 | 
			
		||||
  end;
 | 
			
		||||
  end;*)
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TQtWidgetSet.GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT; Bits: Pointer; var BitInfo: BitmapInfo; Usage: UINT): Integer;
 | 
			
		||||
(*function TQtWidgetSet.GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT; Bits: Pointer; var BitInfo: BitmapInfo; Usage: UINT): Integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result := 0;
 | 
			
		||||
  {$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION}
 | 
			
		||||
@ -3695,7 +3693,7 @@ begin
 | 
			
		||||
  end
 | 
			
		||||
  else
 | 
			
		||||
    Result := FSysColorBrushes[nIndex];
 | 
			
		||||
end;
 | 
			
		||||
end;*)
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
  Function: GetSystemMetrics
 | 
			
		||||
@ -3704,7 +3702,7 @@ end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 ------------------------------------------------------------------------------}
 | 
			
		||||
function TQtWidgetSet.GetSystemMetrics(nIndex: Integer): Integer;
 | 
			
		||||
function TCDWidgetSet.GetSystemMetrics(nIndex: Integer): Integer;
 | 
			
		||||
var
 | 
			
		||||
  R: TRect;
 | 
			
		||||
begin
 | 
			
		||||
@ -3712,7 +3710,7 @@ begin
 | 
			
		||||
    WriteLn(Format('Trace:> [TQtWidgetSet.GetSystemMetrics] %d', [nIndex]));
 | 
			
		||||
  {$endif}
 | 
			
		||||
  Result := 0;
 | 
			
		||||
  case nIndex of
 | 
			
		||||
(*  case nIndex of
 | 
			
		||||
    SM_ARRANGE:
 | 
			
		||||
      begin
 | 
			
		||||
        {$ifdef VerboseQtWinAPI}
 | 
			
		||||
@ -3985,10 +3983,10 @@ begin
 | 
			
		||||
      begin
 | 
			
		||||
        //DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_SWAPBUTTON       ');
 | 
			
		||||
      end;
 | 
			
		||||
  end;
 | 
			
		||||
  end;*)
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{------------------------------------------------------------------------------
 | 
			
		||||
(*{------------------------------------------------------------------------------
 | 
			
		||||
  Function: GetTextColor
 | 
			
		||||
  Params:  DC     - A device context
 | 
			
		||||
  Returns: TColorRef
 | 
			
		||||
 | 
			
		||||
@ -113,9 +113,9 @@ function GetCmdLineParamDescForInterface: string; override;
 | 
			
		||||
function GetCurrentObject(DC: HDC; uObjectType: UINT): HGDIOBJ; override;
 | 
			
		||||
function GetCursorPos(var lpPoint: TPoint ): Boolean; override;*)
 | 
			
		||||
function GetDC(hWnd: HWND): HDC; override;
 | 
			
		||||
(*function GetDCOriginRelativeToWindow(PaintDC: HDC; WindowHandle: HWND; var OriginDiff: TPoint): boolean; override;
 | 
			
		||||
//function GetDCOriginRelativeToWindow(PaintDC: HDC; WindowHandle: HWND; var OriginDiff: TPoint): boolean; override;
 | 
			
		||||
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; override;
 | 
			
		||||
function GetDeviceSize(DC: HDC; var P: TPoint): Boolean; Override;
 | 
			
		||||
(*function GetDeviceSize(DC: HDC; var P: TPoint): Boolean; Override;
 | 
			
		||||
function GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT; Bits: Pointer; var BitInfo: BitmapInfo; Usage: UINT): Integer; Override;
 | 
			
		||||
function GetDoubleClickTime: UINT; override;*)
 | 
			
		||||
function GetFocus: HWND; override;
 | 
			
		||||
@ -133,8 +133,8 @@ function GetScrollbarVisible(Handle: HWND; SBStyle: Integer): boolean; override;
 | 
			
		||||
function GetScrollInfo(Handle: HWND; BarFlag: Integer; Var ScrollInfo: TScrollInfo): Boolean; override;
 | 
			
		||||
function GetStockObject(Value: Integer): THandle; override;*)
 | 
			
		||||
function GetSysColor(nIndex: Integer): DWORD; override;
 | 
			
		||||
(*function GetSysColorBrush(nIndex: Integer): HBrush; override;
 | 
			
		||||
function GetSystemMetrics(nIndex: Integer): Integer; override;*)
 | 
			
		||||
//function GetSysColorBrush(nIndex: Integer): HBrush; override;
 | 
			
		||||
function GetSystemMetrics(nIndex: Integer): Integer; override;
 | 
			
		||||
function GetTextColor(DC: HDC) : TColorRef; Override;
 | 
			
		||||
function GetTextExtentExPoint(DC: HDC; Str: PChar; Count, MaxWidth: Integer; MaxCount, PartialWidths: PInteger; var Size: TSize): Boolean; override;
 | 
			
		||||
function GetTextExtentPoint(DC: HDC; Str: PChar; Count: Integer; var Size: TSize): Boolean; override;
 | 
			
		||||
 | 
			
		||||
@ -66,21 +66,42 @@ begin
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
class procedure TCDWSCustomForm.ShowHide(const AWinControl: TWinControl);
 | 
			
		||||
var
 | 
			
		||||
  lForm: TCDNonNativeForm;
 | 
			
		||||
begin
 | 
			
		||||
  {$ifdef VerboseCDForms}
 | 
			
		||||
  DebugLn(Format(':>[TCDWSCustomForm.ShowHide] AWinControl=%x Handle=%x',
 | 
			
		||||
    [PtrInt(AWinControl), PtrInt(AWinControl.Handle)]));
 | 
			
		||||
  {$endif}
 | 
			
		||||
  lForm := TCDNonNativeForm(AWinControl.Handle);
 | 
			
		||||
  if AWinControl.Visible then
 | 
			
		||||
  begin
 | 
			
		||||
    {$ifdef VerboseCDForms}
 | 
			
		||||
    DebugLn(':<[TCDWSCustomForm.ShowHide] Showed');
 | 
			
		||||
    {$endif}
 | 
			
		||||
    ShowForm(TCDNonNativeForm(AWinControl.Handle));
 | 
			
		||||
    ShowForm(lForm);
 | 
			
		||||
 | 
			
		||||
    // if this is the first time we are showing the form adjust its layout
 | 
			
		||||
    if not lForm.LayoutAutoAdjusted then
 | 
			
		||||
    begin
 | 
			
		||||
      DebugLn(Format('[TCDWSCustomForm.ShowHide] First form layout adjustment '
 | 
			
		||||
       + 'lOldDPI=%d lNewDPI=%d lOldFormWidth=%d lNewFormWidth=%d',
 | 
			
		||||
       [lForm.LCLForm.DesignTimeDPI, Screen.PixelsPerInch, lForm.LCLForm.Width, Screen.Width]));
 | 
			
		||||
      lForm.LayoutAutoAdjusted := True;
 | 
			
		||||
      lForm.LCLForm.AutoAdjustLayout(lapAutoAdjustWithoutHorizontalScrolling,
 | 
			
		||||
        lForm.LCLForm.DesignTimeDPI,
 | 
			
		||||
        Screen.PixelsPerInch, lForm.LCLForm.Width, Screen.Width);
 | 
			
		||||
      // if necessary adjust the form coordinates
 | 
			
		||||
      if not (lForm.LCLForm.BorderStyle in [bsDialog, bsNone]) then
 | 
			
		||||
      begin
 | 
			
		||||
        lForm.LCLForm.Left := 0;
 | 
			
		||||
        lForm.LCLForm.Top := 0;
 | 
			
		||||
      end;
 | 
			
		||||
    end;
 | 
			
		||||
  end
 | 
			
		||||
  else
 | 
			
		||||
  begin
 | 
			
		||||
    HideForm(TCDNonNativeForm(AWinControl.Handle));
 | 
			
		||||
    HideForm(lForm);
 | 
			
		||||
    {$ifdef VerboseCDForms}
 | 
			
		||||
    DebugLn(':<[TCDWSCustomForm.ShowHide] Hided');
 | 
			
		||||
    {$endif}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user