diff --git a/components/jujiboutils/changes.txt b/components/jujiboutils/changes.txt
index fcc3b94ea..5ad5db262 100644
--- a/components/jujiboutils/changes.txt
+++ b/components/jujiboutils/changes.txt
@@ -1,10 +1,12 @@
JUJIBOUTILS
-----------
-
+Note: Lazarus Trunk required
Version pre-1.0
--------------------------------------------------
+2011-09-23 Added: TJDBLabeledEdit
+2011-09-22 Added: ftTime support (testing)
2011-09-21 Added: TJDBGridControl and example (testgridctr)
2011-09-20 Added: TJIntegerEdit, TJLabeledIntegerEdit
TJCurrencyEdit, TJLabeledCurrencyEdit
diff --git a/components/jujiboutils/jujibo-utils/jujibocontrols.lpk b/components/jujiboutils/jujibo-utils/jujibocontrols.lpk
index 58fcbf238..6c47aba23 100644
--- a/components/jujiboutils/jujibo-utils/jujibocontrols.lpk
+++ b/components/jujiboutils/jujibo-utils/jujibocontrols.lpk
@@ -18,7 +18,7 @@
-
+
@@ -92,6 +92,11 @@
+
+
+
+
+
diff --git a/components/jujiboutils/jujibo-utils/jujibocontrols.pas b/components/jujiboutils/jujibo-utils/jujibocontrols.pas
index 8ebaf3d75..fb9a2f3ff 100644
--- a/components/jujiboutils/jujibo-utils/jujibocontrols.pas
+++ b/components/jujiboutils/jujibo-utils/jujibocontrols.pas
@@ -10,7 +10,8 @@ uses
jdbintegeredit, jdblabeledintegeredit, jdbcurrencyedit,
jdblabeledcurrencyedit, jdbdateedit, jdblabeleddateedit, jcontrolutils,
JIntegerEdit, JLabeledIntegerEdit, JCurrencyEdit, JLabeledCurrencyEdit,
- JDateEdit, JLabeledDateEdit, JDBGridControl, jdbgridutils, LazarusPackageIntf;
+ JDateEdit, JLabeledDateEdit, JDBGridControl, jdbgridutils, JDBLabeledEdit,
+ LazarusPackageIntf;
implementation
@@ -29,6 +30,7 @@ begin
RegisterUnit('JDateEdit', @JDateEdit.Register);
RegisterUnit('JLabeledDateEdit', @JLabeledDateEdit.Register);
RegisterUnit('JDBGridControl', @JDBGridControl.Register);
+ RegisterUnit('JDBLabeledEdit', @JDBLabeledEdit.Register);
end;
initialization
diff --git a/components/jujiboutils/jujibo-utils/src/jdblabelededit.pas b/components/jujiboutils/jujibo-utils/src/jdblabelededit.pas
new file mode 100644
index 000000000..73cc613aa
--- /dev/null
+++ b/components/jujiboutils/jujibo-utils/src/jdblabelededit.pas
@@ -0,0 +1,288 @@
+{ JDBLabeledEdit
+
+ Copyright (C) 2011 Julio Jiménez Borreguero
+ Contact: jujibo at gmail dot com
+
+ This library is free software; you can redistribute it and/or modify it
+ under the same terms as the Lazarus Component Library (LCL)
+
+ See the file license-jujiboutils.txt and COPYING.LGPL, included in this distribution,
+ for details about the license.
+
+ 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 JDBLabeledEdit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, LResources, Controls, ExtCtrls, DB, DBCtrls,
+ LMessages, LCLType, SysUtils;
+
+type
+
+ { TJDBLabeledEdit }
+
+ TJDBLabeledEdit = class(TCustomLabeledEdit)
+ private
+ { Private declarations }
+ FDataLink: TFieldDataLink;
+
+ procedure DataChange(Sender: TObject);
+ procedure UpdateData(Sender: TObject);
+ procedure FocusRequest(Sender: TObject);
+
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetField: TField;
+
+ function IsReadOnly: boolean;
+
+ procedure SetDataField(const Value: string);
+ procedure SetDataSource(Value: TDataSource);
+ procedure CMGetDataLink(var Message: TLMessage); message CM_GETDATALINK;
+
+ protected
+ { Protected declarations }
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure ActiveChange(Sender: TObject); virtual;
+ procedure KeyDown(var Key: word; Shift: TShiftState); override;
+ procedure KeyPress(var Key: char); override;
+ procedure DoEnter; override;
+ function GetReadOnly: boolean; override;
+ procedure SetReadOnly(Value: boolean); override;
+ public
+ { Public declarations }
+ constructor Create(TheOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure EditingDone; override;
+ property Field: TField read GetField;
+ published
+ { Published declarations }
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property ReadOnly: boolean read GetReadOnly write SetReadOnly default False;
+
+ property Action;
+ property Align;
+ property Alignment;
+ property Anchors;
+ property AutoSelect;
+ property AutoSize;
+ property BidiMode;
+ property BorderSpacing;
+ property BorderStyle;
+ property CharCase;
+ property Color;
+ property Constraints;
+ property DragCursor;
+ property DragMode;
+ property EditLabel;
+ property Enabled;
+ property Font;
+ property LabelPosition;
+ property LabelSpacing;
+ property MaxLength;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ property OnChange;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEditingDone;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnStartDrag;
+ property OnUTF8KeyPress;
+ end;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+ {$I jdblabelededit_icon.lrs}
+ RegisterComponents('Data Controls', [TJDBLabeledEdit]);
+end;
+
+{ TJDBLabeledEdit }
+
+procedure TJDBLabeledEdit.DataChange(Sender: TObject);
+begin
+ if FDataLink.Field <> nil then
+ Caption := FDataLink.Field.AsString
+ else
+ Text := '';
+end;
+
+procedure TJDBLabeledEdit.UpdateData(Sender: TObject);
+begin
+ if FDataLink.Field <> nil then
+ FDataLink.Field.Text := Text
+ else
+ Text := '';
+end;
+
+procedure TJDBLabeledEdit.FocusRequest(Sender: TObject);
+begin
+ SetFocus;
+end;
+
+function TJDBLabeledEdit.GetDataField: string;
+begin
+ Result := FDataLink.FieldName;
+end;
+
+function TJDBLabeledEdit.GetDataSource: TDataSource;
+begin
+ Result := FDataLink.DataSource;
+end;
+
+function TJDBLabeledEdit.GetField: TField;
+begin
+ Result := FDataLink.Field;
+end;
+
+function TJDBLabeledEdit.IsReadOnly: boolean;
+begin
+ if FDatalink.Active then
+ Result := not FDatalink.CanModify
+ else
+ Result := False;
+end;
+
+procedure TJDBLabeledEdit.SetDataField(const Value: string);
+begin
+ FDataLink.FieldName := Value;
+end;
+
+procedure TJDBLabeledEdit.SetDataSource(Value: TDataSource);
+begin
+ if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
+ ChangeDataSource(Self, FDataLink, Value);
+end;
+
+procedure TJDBLabeledEdit.CMGetDataLink(var Message: TLMessage);
+begin
+ Message.Result := PtrUInt(FDataLink);
+end;
+
+procedure TJDBLabeledEdit.Loaded;
+begin
+ inherited Loaded;
+ if (csDesigning in ComponentState) then
+ DataChange(Self);
+end;
+
+procedure TJDBLabeledEdit.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ // clean up
+ if (Operation = opRemove) then
+ begin
+ if (FDataLink <> nil) and (AComponent = DataSource) then
+ DataSource := nil;
+ end;
+end;
+
+procedure TJDBLabeledEdit.ActiveChange(Sender: TObject);
+begin
+ if FDatalink.Active then
+ datachange(Sender)
+ else
+ Text := '';
+end;
+
+procedure TJDBLabeledEdit.KeyDown(var Key: word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if Key = VK_ESCAPE then
+ begin
+ FDataLink.Reset;
+ SelectAll;
+ Key := VK_UNKNOWN;
+ end
+ else
+ if Key in [VK_DELETE, VK_BACK] then
+ begin
+ if not IsReadOnly then
+ FDatalink.Edit
+ else
+ Key := VK_UNKNOWN;
+ end;
+end;
+
+procedure TJDBLabeledEdit.KeyPress(var Key: char);
+begin
+ inherited KeyPress(Key);
+ if not IsReadOnly then
+ FDatalink.Edit;
+ inherited KeyPress(Key);
+end;
+
+procedure TJDBLabeledEdit.DoEnter;
+begin
+ if FDataLink.Field <> nil then
+ Caption := FDataLink.Field.AsString;
+ inherited DoEnter;
+end;
+
+function TJDBLabeledEdit.GetReadOnly: boolean;
+begin
+ Result := FDataLink.ReadOnly;
+end;
+
+procedure TJDBLabeledEdit.SetReadOnly(Value: boolean);
+begin
+ inherited;
+ FDataLink.ReadOnly := Value;
+end;
+
+constructor TJDBLabeledEdit.Create(TheOwner: TComponent);
+begin
+ inherited Create(TheOwner);
+ ControlStyle := ControlStyle + [csReplicatable];
+ FDataLink := TFieldDataLink.Create;
+ FDataLink.Control := Self;
+ FDataLink.OnDataChange := @DataChange;
+ FDataLink.OnUpdateData := @UpdateData;
+ FDataLInk.OnActiveChange := @ActiveChange;
+end;
+
+destructor TJDBLabeledEdit.Destroy;
+begin
+ FDataLink.Free;
+ FDataLink := nil;
+ inherited Destroy;
+end;
+
+procedure TJDBLabeledEdit.EditingDone;
+begin
+ inherited EditingDone;
+ UpdateData(self);
+end;
+
+end.
+
diff --git a/components/jujiboutils/jujibo-utils/src/jdblabelededit_icon.lrs b/components/jujiboutils/jujibo-utils/src/jdblabelededit_icon.lrs
new file mode 100644
index 000000000..0ce835614
--- /dev/null
+++ b/components/jujiboutils/jujibo-utils/src/jdblabelededit_icon.lrs
@@ -0,0 +1,33 @@
+LazarusResources.Add('tjdblabelededit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147
+ +#0#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#219#9#23#8
+ +#10':F'#3'+'#155#0#0#2'wIDATH'#199#213#149']HSa'#24#199#127'GDo'#202'9C'#5'C'
+ +#163#129#232#197'2'#226#140'`'#176#4#21#20'"'#232'f72'#162#249#17'D!'#226#141
+ +'0'#132#212#139#16#186#136'd7'#129'H'#203#8'ov#'#216#141#176#4#29#8'q'#14#194
+ +'X'#17#136#226#7#147#152'a'#155#31#224'${'#187#168#247#180#237#204#204'Y'#23
+ +#253'o'#206#243'>'#231#229#249#248#191#255#231'}'#225#31'CI_L'#206'm'#138#177
+ +#233#149#156#27#239#221#178#209#222'X'#165#228#149' ='#240#232#195#171#216'k'
+ +#206#17']'#223'#'#158'H'#17'O'#30#18'O'#164#152#10#199#242'JT'#0'06'#189'BCm'
+ +#25#183']'#23#137'''RF'#240#254#206'6#ICm'#25#182#234#18#142#235'PBUUaJ`'#171
+ +'.!'#178#180#205'T8fT'#220#223#217#6#192#196#176#155#253#131'#\'#214#15','#6
+ +':H'#134'z'#9#6#131'";'#152#170#170'B'#174#211#253#10'@'#183'?"*K'#139#169
+ +#176#20#25'T'#0'$C'#189'XZF'#13#251#198#253'W'#236#29'|e1'#208#129#174#235'J'
+ +'0'#24#20'###'#0#248'|>'#220'n'#183#162#170#170#208'u'#221#160#176#16'`ec'
+ +#135#202#210'r'#0#6'<'#245'47\ '#186#190#135'7'#244#131#243'x"'#197'D'#8#230
+ +#159#223#201#160'C'#6#148#246#177'g`'#171'.'#225#221#251#207#25#213#231#130
+ +#165'e'#148'k'#222#23#200#10'%U'#217#182'IE'#191#163'H'#6'~p'#253#19#146#14#0
+ +']'#215'3'#232#144#182#236'H'#250#21#128#230#254#176'p^)'#167#194'R'#132#253
+ +#210'y'#131#162't'#153#198#147#135#236#31#28#17'Y'#218#230#237#19#151'r'#170
+ +'9'#232#246'G'#196'Zl'#151#163'o'#130#1'O='#171#218#155#191'2'#197']]w'#149
+ +#156#20'y'#234#150#137'F'#230#207#20'|h'#232#17#22'k'#141'R'#8#176#22#219#165
+ +#178#180#216'P'#209#170#182#12#192#211'gcy'''#216'Il'#252'RQ'#231#205#203#127
+ +#164'"'#9'g'#207#172#201#231'p82'#190#25's '#239#150#201#185'M'#241#248#245
+ +'G'#254'R'#244#245'v'#139#179' '#249'e]'#152#222'd'#227
+ +#146#251#249#243#172#176'Xk'#20#254'{|'#7#172#15'p'#145#208'Pic'#0#0#0#0'IEN'
+ +'D'#174'B`'#130
+]);