lazarus/lcl/interfaces/gtk/gtkwsspin.pp
marc 5e6f809b63 * made gtk2 keyboard initialisation independent of X
- removed unix -> X implication
* start of some gtk1/2 split

git-svn-id: trunk@10535 -
2007-01-29 23:07:59 +00:00

157 lines
5.8 KiB
ObjectPascal

{ $Id$}
{
*****************************************************************************
* GtkWSSpin.pp *
* ------------ *
* *
* *
*****************************************************************************
*****************************************************************************
* *
* This file is part of the Lazarus Component Library (LCL) *
* *
* See the file COPYING.modifiedLGPL, included in this distribution, *
* for details about the copyright. *
* *
* 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. *
* *
*****************************************************************************
}
unit GtkWSSpin;
{$mode objfpc}{$H+}
interface
uses
{$IFDEF gtk2}
glib2, gdk2pixbuf, gdk2, gtk2, Pango,
{$ELSE}
glib, gdk, gtk,
{$ENDIF}
LCLProc, Spin, GtkProc, gtkExtra, GtkWSStdCtrls, WSSpin, WSLCLClasses, LCLType;
type
{ TGtkWSCustomFloatSpinEdit }
TGtkWSCustomFloatSpinEdit = class(TWSCustomFloatSpinEdit)
private
protected
public
class function GetSelStart(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): integer; override;
class function GetSelLength(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): integer; override;
class function GetValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): single; override;
class procedure SetSelStart(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewStart: integer); override;
class procedure SetSelLength(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewLength: integer); override;
class procedure UpdateControl(const ACustomFloatSpinEdit: TCustomFloatSpinEdit); override;
end;
function GetGtkSpinEntry(Spin: PGtkSpinButton): PGtkEntry;
function GetSpinGtkEntry(Spin: TCustomFloatSpinEdit): PGtkEntry;
function GetGtkFloatSpinEditable(Spin: PGtkSpinButton): PGtkOldEditable;
function GetSpinGtkEditable(Spin: TCustomFloatSpinEdit): PGtkOldEditable;
implementation
function GetGtkSpinEntry(Spin: PGtkSpinButton): PGtkEntry;
begin
Result:=PGtkEntry(@(Spin^.entry));
end;
function GetSpinGtkEntry(Spin: TCustomFloatSpinEdit): PGtkEntry;
begin
Result:=GetGtkSpinEntry(PGtkSpinButton(Spin.Handle));
end;
function GetGtkFloatSpinEditable(Spin: PGtkSpinButton): PGtkOldEditable;
begin
Result:=PGtkOldEditable(@(Spin^.entry));
end;
function GetSpinGtkEditable(Spin: TCustomFloatSpinEdit): PGtkOldEditable;
begin
Result:=GetGtkFloatSpinEditable(PGtkSpinButton(Spin.Handle));
end;
{ TGtkWSCustomFloatSpinEdit }
//const
// GtkValueEmpty: array[boolean] of integer = (0,1);
class function TGtkWSCustomFloatSpinEdit.GetSelStart(
const ACustomFloatSpinEdit: TCustomFloatSpinEdit
): integer;
begin
Result :=
WidgetGetSelStart(PGtkWidget(GetSpinGtkEntry(ACustomFloatSpinEdit)));
end;
class function TGtkWSCustomFloatSpinEdit.GetSelLength(
const ACustomFloatSpinEdit: TCustomFloatSpinEdit): integer;
begin
with GetSpinGtkEditable(ACustomFloatSpinEdit)^ do
Result := Abs(integer(selection_end_pos)-integer(selection_start_pos));
end;
class function TGtkWSCustomFloatSpinEdit.GetValue(
const ACustomFloatSpinEdit: TCustomFloatSpinEdit): single;
begin
Result:=gtk_spin_button_get_value_as_float(
PGtkSpinButton(ACustomFloatSpinEdit.Handle));
end;
class procedure TGtkWSCustomFloatSpinEdit.SetSelStart(
const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewStart: integer);
begin
gtk_editable_set_position(GetSpinGtkEditable(ACustomFloatSpinEdit), NewStart);
end;
class procedure TGtkWSCustomFloatSpinEdit.SetSelLength(
const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewLength: integer);
begin
WidgetSetSelLength(PGtkWidget(GetSpinGtkEntry(ACustomFloatSpinEdit)),
NewLength);
end;
class procedure TGtkWSCustomFloatSpinEdit.UpdateControl(
const ACustomFloatSpinEdit: TCustomFloatSpinEdit);
var
AnAdjustment: PGtkAdjustment;
wHandle: HWND;
SpinWidget: PGtkSpinButton;
begin
//DebugLn(['TGtkWSCustomFloatSpinEdit.UpdateControl ',dbgsName(ACustomFloatSpinEdit)]);
wHandle := ACustomFloatSpinEdit.Handle;
SpinWidget:=GTK_SPIN_BUTTON(Pointer(wHandle));
AnAdjustment:=gtk_spin_button_get_adjustment(SpinWidget);
if (AnAdjustment^.lower<>ACustomFloatSpinEdit.MinValue)
or (AnAdjustment^.upper<>ACustomFloatSpinEdit.MaxValue) then
begin
AnAdjustment^.lower:=ACustomFloatSpinEdit.MinValue;
AnAdjustment^.upper:=ACustomFloatSpinEdit.MaxValue;
gtk_adjustment_changed(AnAdjustment);
end;
gtk_spin_button_set_digits(SpinWidget, ACustomFloatSpinEdit.DecimalPlaces);
gtk_spin_button_set_value(SpinWidget,ACustomFloatSpinEdit.Value);
AnAdjustment^.step_increment := ACustomFloatSpinEdit.Increment;
end;
initialization
////////////////////////////////////////////////////
// I M P O R T A N T
////////////////////////////////////////////////////
// To improve speed, register only classes
// which actually implement something
////////////////////////////////////////////////////
RegisterWSComponent(TCustomFloatSpinEdit, TGtkWSCustomFloatSpinEdit);
// RegisterWSComponent(TFloatSpinEdit, TGtkWSFloatSpinEdit);
////////////////////////////////////////////////////
end.