From: <ah...@us...> - 2008-11-02 20:19:27
|
Revision: 12021 http://jvcl.svn.sourceforge.net/jvcl/?rev=12021&view=rev Author: ahuser Date: 2008-11-02 20:19:21 +0000 (Sun, 02 Nov 2008) Log Message: ----------- Mantis #4394: SelectedCount is not consistent with CodeGear's VCL functionalities Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2008-11-02 19:30:16 UTC (rev 12020) +++ trunk/jvcl/run/JvComCtrls.pas 2008-11-02 20:19:21 UTC (rev 12021) @@ -585,8 +585,7 @@ procedure KeyPress(var Key: Char); override; procedure ResetPostOperationFlags; property ScrollDirection: Integer read FScrollDirection write SetScrollDirection; - procedure Notification(AComponent: TComponent; Operation: TOperation); - override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure DblClick; override; public constructor Create(AOwner: TComponent); override; @@ -597,6 +596,8 @@ procedure InvalidateSelectedItems; procedure SelectItem(Node: TTreeNode; Unselect: Boolean = False); property SelectedItems[Index: Integer]: TTreeNode read GetSelectedItem; + { SelectedCount now returns 1 (Selected<>nil) or 0 (Selected=nil) if MultiSelect=False. + The former implementation always returned -1 if MultiSelect=False } property SelectedCount: Integer read GetSelectedCount; function GetBold(Node: TTreeNode): Boolean; procedure SetBold(Node: TTreeNode; Value: Boolean); @@ -2622,10 +2623,10 @@ function TJvTreeView.GetSelectedCount: Integer; begin - if MultiSelect then + if MultiSelect or (Selected <> nil) then Result := FSelectedList.Count else - Result := -1; + Result := 0; end; function TJvTreeView.GetSelectedItem(Index: Integer): TTreeNode; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2008-11-25 17:16:40
|
Revision: 12057 http://jvcl.svn.sourceforge.net/jvcl/?rev=12057&view=rev Author: ahuser Date: 2008-11-25 17:16:26 +0000 (Tue, 25 Nov 2008) Log Message: ----------- Code style Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2008-11-24 23:05:46 UTC (rev 12056) +++ trunk/jvcl/run/JvComCtrls.pas 2008-11-25 17:16:26 UTC (rev 12057) @@ -1921,7 +1921,8 @@ if RealIndex < PageCount then TabPainter.DrawTab(Self, Canvas, Images, Pages[RealIndex].ImageIndex, Pages[RealIndex].Caption, Rect, Active, Pages[RealIndex].Enabled); end - else inherited DrawTab(TabIndex, Rect, Active); + else + inherited DrawTab(TabIndex, Rect, Active); end; procedure TJvPageControl.Loaded; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2008-12-05 18:42:26
|
Revision: 12068 http://jvcl.svn.sourceforge.net/jvcl/?rev=12068&view=rev Author: ahuser Date: 2008-12-05 18:42:10 +0000 (Fri, 05 Dec 2008) Log Message: ----------- Fixed: After reparenting a TJvTreeView control the CheckBoxes aren't visible anymore. Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2008-12-02 19:27:44 UTC (rev 12067) +++ trunk/jvcl/run/JvComCtrls.pas 2008-12-05 18:42:10 UTC (rev 12068) @@ -2528,7 +2528,7 @@ // parameter seems to trigger a bug in ComCtrl where it will show a // scroll bar that has nothing to do here. Setting the GWL_STYLE window // long shows the checkboxes and does not trigger this bug. -{ if FCheckBoxes then + {if FCheckBoxes then Params.Style := Params.Style or TVS_CHECKBOXES;} end; @@ -2536,6 +2536,12 @@ begin FReinitializeTreeNode := True; inherited CreateWnd; + // Mantis 3351: Recreating the window for adding the TVS_CHECKBOXES + // parameter seems to trigger a bug in ComCtrl where it will show a + // scroll bar that has nothing to do here. Setting the GWL_STYLE window + // long shows the checkboxes and does not trigger this bug. + if FCheckBoxes then + SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) or TVS_CHECKBOXES); end; procedure TJvTreeView.DestroyWnd; @@ -2820,18 +2826,21 @@ if FCheckBoxes <> Value then begin FCheckBoxes := Value; - // Mantis 3351: Recreating the window for adding the TVS_CHECKBOXES - // parameter seems to trigger a bug in ComCtrl where it will show a - // scroll bar that has nothing to do here. Setting the GWL_STYLE window - // long shows the checkboxes and does not trigger this bug. - //RecreateWnd; - - HandleNeeded; - CurStyle := GetWindowLong(Handle, GWL_STYLE); - if FCheckBoxes then - SetWindowLong(Handle, GWL_STYLE, CurStyle or TVS_CHECKBOXES) - else - SetWindowLong(Handle, GWL_STYLE, CurStyle and not TVS_CHECKBOXES) + if HandleAllocated then + begin + // Mantis 3351: Recreating the window for adding the TVS_CHECKBOXES + // parameter seems to trigger a bug in ComCtrl where it will show a + // scroll bar that has nothing to do here. Setting the GWL_STYLE window + // long shows the checkboxes and does not trigger this bug. + //RecreateWnd; + HandleNeeded; + CurStyle := GetWindowLong(Handle, GWL_STYLE); + if FCheckBoxes then + SetWindowLong(Handle, GWL_STYLE, CurStyle or TVS_CHECKBOXES) + else + SetWindowLong(Handle, GWL_STYLE, CurStyle and not TVS_CHECKBOXES); + Invalidate; + end; end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2008-12-30 11:12:40
|
Revision: 12113 http://jvcl.svn.sourceforge.net/jvcl/?rev=12113&view=rev Author: obones Date: 2008-12-30 11:12:28 +0000 (Tue, 30 Dec 2008) Log Message: ----------- Mnatis 4393: Now selects in code Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2008-12-30 10:06:51 UTC (rev 12112) +++ trunk/jvcl/run/JvComCtrls.pas 2008-12-30 11:12:28 UTC (rev 12113) @@ -1,4 +1,4 @@ -{----------------------------------------------------------------------------- +{----------------------------------------------------------------------------- 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 @@ -2992,21 +2992,24 @@ TJvTreeNode(Selected).PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; TVN_SELCHANGEDA, TVN_SELCHANGEDW: - if Assigned(FPageControl) then - if Selected <> nil then - begin - //Search for the correct page - J := -1; - for I := 0 to FPageControl.PageCount - 1 do - if DoComparePage(FPageControl.Pages[I], Selected) then - J := I; - if J <> -1 then + begin + DoSelectionChange; // mantis 4393 + if Assigned(FPageControl) then + if Selected <> nil then begin - FPageControl.ActivePage := FPageControl.Pages[J]; - if Assigned(FOnPage) then - FOnPage(Self, Selected, FPageControl.Pages[J]); + //Search for the correct page + J := -1; + for I := 0 to FPageControl.PageCount - 1 do + if DoComparePage(FPageControl.Pages[I], Selected) then + J := I; + if J <> -1 then + begin + FPageControl.ActivePage := FPageControl.Pages[J]; + if Assigned(FOnPage) then + FOnPage(Self, Selected, FPageControl.Pages[J]); + end; end; - end; + end; end; end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2008-12-30 22:36:33
|
Revision: 12114 http://jvcl.svn.sourceforge.net/jvcl/?rev=12114&view=rev Author: jfudickar Date: 2008-12-30 22:36:29 +0000 (Tue, 30 Dec 2008) Log Message: ----------- File converted to ANSI to be compatible with D5 Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2008-12-30 11:12:28 UTC (rev 12113) +++ trunk/jvcl/run/JvComCtrls.pas 2008-12-30 22:36:29 UTC (rev 12114) @@ -1,4 +1,4 @@ -{----------------------------------------------------------------------------- +{----------------------------------------------------------------------------- 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 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2009-04-29 12:31:01
|
Revision: 12291 http://jvcl.svn.sourceforge.net/jvcl/?rev=12291&view=rev Author: obones Date: 2009-04-29 12:30:49 +0000 (Wed, 29 Apr 2009) Log Message: ----------- Mantis 4699: HideSelection must be taken into account Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-04-29 12:25:33 UTC (rev 12290) +++ trunk/jvcl/run/JvComCtrls.pas 2009-04-29 12:30:49 UTC (rev 12291) @@ -1,4 +1,4 @@ -{----------------------------------------------------------------------------- +{----------------------------------------------------------------------------- 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 @@ -2961,10 +2961,14 @@ // Need to indicate ClearBeforeSelect if the item is about to change // or we would get rendering glitches because of an inconsistent // selection list. (Mantis 3250) - case Msg.NMHdr.code of - TVN_SELCHANGEDA, TVN_SELCHANGEDW: - if not Multiselect then - FClearBeforeSelect := True; + // Mantis 4699: Further limit this to when HideSelection is set to True. + if HideSelection then + begin + case Msg.NMHdr.code of + TVN_SELCHANGEDA, TVN_SELCHANGEDW: + if not Multiselect then + FClearBeforeSelect := True; + end; end; inherited; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2009-07-03 14:05:48
|
Revision: 12371 http://jvcl.svn.sourceforge.net/jvcl/?rev=12371&view=rev Author: obones Date: 2009-07-03 14:05:47 +0000 (Fri, 03 Jul 2009) Log Message: ----------- Mantis 4725: Now draws the tab correctly when set to left or right. Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-07-03 10:24:10 UTC (rev 12370) +++ trunk/jvcl/run/JvComCtrls.pas 2009-07-03 14:05:47 UTC (rev 12371) @@ -660,6 +660,7 @@ uses SysUtils, + Math, JclStrings, JvThemes, JvConsts, JvJCLUtils; @@ -1540,12 +1541,22 @@ Change; end; +type + TCustomTabControlAccess = class(TCustomTabControl) + end; + procedure TJvTabDefaultPainter.DrawTab(AControl: TCustomTabControl; Canvas: TCanvas; Images: TCustomImageList; ImageIndex: Integer; const Caption: string; const Rect: TRect; Active, Enabled: Boolean); var TextRect, ImageRect: TRect; SaveState: Integer; + Bmp: TBitmap; + DrawRect: TRect; + Points: array [0..2] of TPoint; + TextRectWidth: Integer; + TextRectHeight: Integer; + procedure DrawDivider(X, Y, X1, Y1: Integer); begin Canvas.Pen.Color := clBtnShadow; @@ -1615,9 +1626,76 @@ end; if Caption <> '' then begin -// InflateRect(TextRect, -2, -2); - SetBkMode(Canvas.Handle, TRANSPARENT); - DrawText(Canvas, Caption, Length(Caption), TextRect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + if TCustomTabControlAccess(AControl).TabPosition in [tpTop, tpBottom] then + begin + SetBkMode(Canvas.Handle, TRANSPARENT); + DrawText(Canvas, Caption, Length(Caption), TextRect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + end + else + begin + Bmp := TBitmap.Create; + try + TextRectWidth := TextRect.Right - TextRect.Left + 1; + TextRectHeight := TextRect.Bottom - TextRect.Top + 1; + + Bmp.Transparent := True; + Bmp.Canvas.Font := Canvas.Font; + Bmp.Height := Max(TextRectWidth, TextRectHeight); + Bmp.Width := Bmp.Height; + + DrawRect := Classes.Rect(0, 0, Bmp.Width, Bmp.Height); + + DrawText(Bmp.Canvas, Caption, Length(Caption), DrawRect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + + case TCustomTabControlAccess(AControl).TabPosition of + tpLeft: + begin + // Rotate left by 90\xB0 + Points[0].X := 0; + Points[0].Y := Bmp.Height - 1; + Points[1].X := 0; + Points[1].Y := 0; + Points[2].X := Bmp.Width - 1; + Points[2].Y := Bmp.Height - 1; + end; + tpRight: + begin + // Rotate right by 90\xB0 + Points[0].X := Bmp.Width - 1; + Points[0].Y := 0; + Points[1].X := Bmp.Width - 1; + Points[1].Y := Bmp.Height - 1; + Points[2].X := 0; + Points[2].Y := 0; + end; + end; + + if TextRectWidth < TextRectHeight then + begin + Dec(Points[0].X, (Bmp.Width - TextRectWidth + 1) div 2); + Dec(Points[1].X, (Bmp.Width - TextRectWidth + 1) div 2); + Dec(Points[2].X, (Bmp.Width - TextRectWidth + 1) div 2); + end + else if TextRectWidth > TextRectHeight then + begin + Dec(Points[0].Y, (Bmp.Height - TextRectHeight + 1) div 2); + Dec(Points[1].Y, (Bmp.Height - TextRectHeight + 1) div 2); + Dec(Points[2].Y, (Bmp.Height - TextRectHeight + 1) div 2); + end; + + // Rotate and translate to the right place + PlgBlt(Bmp.Canvas.Handle, Points, Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, 0, 0, 0); + + // Erase left overs + Bmp.Canvas.FillRect(Classes.Rect(TextRectWidth, 0, Bmp.Width + 1, Bmp.Height)); + Bmp.Canvas.FillRect(Classes.Rect(0, TextRectHeight, Bmp.Width, Bmp.Height + 1)); + + // Copy to the final canvas + Canvas.Draw(TextRect.Left, TextRect.Top, Bmp); + finally + Bmp.Free; + end; + end; end; if Active and ShowFocus then begin This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2009-07-03 14:11:06
|
Revision: 12372 http://jvcl.svn.sourceforge.net/jvcl/?rev=12372&view=rev Author: obones Date: 2009-07-03 14:11:06 +0000 (Fri, 03 Jul 2009) Log Message: ----------- Setting the tab painter must set OwnerDraw to True or nothing will happen... Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-07-03 14:05:47 UTC (rev 12371) +++ trunk/jvcl/run/JvComCtrls.pas 2009-07-03 14:11:06 UTC (rev 12372) @@ -1929,6 +1929,11 @@ begin FTabPainter.FreeNotification(Self); FTabPainter.RegisterChange(Self); + OwnerDraw := True; + end + else + begin + OwnerDraw := False; end; Invalidate; end; @@ -2202,6 +2207,11 @@ begin FTabPainter.FreeNotification(Self); FTabPainter.RegisterChange(Self); + OwnerDraw := True; + end + else + begin + OwnerDraw := False; end; Invalidate; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2009-07-08 09:39:11
|
Revision: 12378 http://jvcl.svn.sourceforge.net/jvcl/?rev=12378&view=rev Author: obones Date: 2009-07-08 09:39:09 +0000 (Wed, 08 Jul 2009) Log Message: ----------- Mantis 4808: Reverting Mantis 4699, it's doing a bit more harm than first thought. Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-07-08 09:13:41 UTC (rev 12377) +++ trunk/jvcl/run/JvComCtrls.pas 2009-07-08 09:39:09 UTC (rev 12378) @@ -3055,8 +3055,9 @@ // Need to indicate ClearBeforeSelect if the item is about to change // or we would get rendering glitches because of an inconsistent // selection list. (Mantis 3250) - // Mantis 4699: Further limit this to when HideSelection is set to True. - if HideSelection then + // Mantis 4699: Further limit this to when HideSelection is set to True. + // Mantis 4808: Well, it seems that fix for 4699 is doing more harm than good +// if HideSelection then begin case Msg.NMHdr.code of TVN_SELCHANGEDA, TVN_SELCHANGEDW: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2009-10-25 11:16:51
|
Revision: 12569 http://jvcl.svn.sourceforge.net/jvcl/?rev=12569&view=rev Author: ahuser Date: 2009-10-25 11:16:42 +0000 (Sun, 25 Oct 2009) Log Message: ----------- Mantis #4905: TJvTreeView.OnNodeCheckChange not triggered Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-10-25 09:48:40 UTC (rev 12568) +++ trunk/jvcl/run/JvComCtrls.pas 2009-10-25 11:16:42 UTC (rev 12569) @@ -53,8 +53,10 @@ const JvDefPageControlBorder = 4; JvDefaultInactiveColorFrom = TColor($D7D7D7); - JvDefaultInactiveColorTo= TColor($ADADAD); + JvDefaultInactiveColorTo = TColor($ADADAD); + WM_CHECKSTATECHANGED = WM_USER + 1; + type TJvIPAddress = class; @@ -516,6 +518,7 @@ FMenuDblClick: Boolean; FReinitializeTreeNode: Boolean; FOnNodeCheckedChange: TJvTreeViewNodeCheckedChange; + FCheckEventsDisabled: Boolean; procedure InternalCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); @@ -526,6 +529,7 @@ procedure WMTimer(var Msg: TWMTimer); message WM_TIMER; procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; procedure WMVScroll(var Msg: TWMVScroll); message WM_VSCROLL; + procedure WMCheckStateChanged(var Msg: TMessage); message WM_CHECKSTATECHANGED; function GetItemHeight: Integer; procedure SetItemHeight(Value: Integer); function GetInsertMarkColor: TColor; @@ -541,6 +545,7 @@ procedure SetPageControl(const Value: TPageControl); function GetItemIndex: Integer; procedure SetItemIndex(const Value: Integer); + procedure PostCheckStateChanged(Node: TTreeNode); protected procedure DoNodeCheckedChange(Node: TJvTreeNode); procedure TreeNodeCheckedChange(Sender: TObject); virtual; @@ -613,6 +618,7 @@ property Checkboxes: Boolean read FCheckBoxes write SetCheckBoxes default False; property PageControl: TPageControl read FPageControl write SetPageControl; property AutoDragScroll: Boolean read FAutoDragScroll write FAutoDragScroll default False; + property CheckEventsDisabled: Boolean read FCheckEventsDisabled write FCheckEventsDisabled default False; property OnVerticalScroll: TNotifyEvent read FOnVScroll write FOnVScroll; property OnHorizontalScroll: TNotifyEvent read FOnHScroll write FOnHScroll; property OnPageChanged: TPageChangedEvent read FOnPage write FOnPage; @@ -2746,6 +2752,9 @@ FClearBeforeSelect := True; FSelectThisNode := True; end; + if Checkboxes and (GetComCtlVersion < ComCtlVersionIE6) and (Key = VK_SPACE) then // emulate missing notify message + PostCheckStateChanged(Selected); + inherited KeyDown(Key, Shift); if ((Key = VK_SPACE) or (Key = VK_RETURN)) and MenuDblClick and IsMenuItemClick(Selected) then TMenuItem(Selected.Data).OnClick(TMenuItem(Selected.Data)); @@ -2798,7 +2807,8 @@ procedure TJvTreeView.TreeNodeCheckedChange(Sender: TObject); begin - DoNodeCheckedChange(Sender as TJvTreeNode); + if not FCheckEventsDisabled then + DoNodeCheckedChange(Sender as TJvTreeNode); end; procedure TJvTreeView.SetCheckBoxes(const Value: Boolean); @@ -2918,6 +2928,20 @@ end; procedure TJvTreeView.CNNotify(var Msg: TWMNotify); +{$IF not declared(NM_TVSTATEIMAGECHANGING)} +const + NM_TVSTATEIMAGECHANGING = NM_FIRST - 24; +type + { For IE >= 0x0600 } + tagNMTVSTATEIMAGECHANGING = packed record + hdr: NMHDR; + hti: HTREEITEM; + iOldStateImageIndex: Integer; + iNewStateImageIndex: Integer; + end; + PNMTVStateImageChanging = ^TNMTVStateImageChanging; + TNMTVStateImageChanging = tagNMTVSTATEIMAGECHANGING; +{$IFEND} var Node: TTreeNode; Point: TPoint; @@ -2941,49 +2965,62 @@ if Windows.GetCursorPos(Point) then // prevent AV after "computer locked" dialog begin Point := ScreenToClient(Point); - with Msg, Point do - case NMHdr.code of - NM_CLICK, NM_RCLICK: + case Msg.NMHdr.code of + NM_TVSTATEIMAGECHANGING: // ComCtrls 6+ + begin + if CheckBoxes and (GetComCtlVersion >= ComCtlVersionIE6) then begin - Node := GetNodeAt(X, Y); - if Assigned(Node) then - Selected := Node - else + Node := Items.GetNode(PNMTVStateImageChanging(Msg.NMHdr).hti); + PostCheckStateChanged(Node); + end; + end; + NM_CLICK, NM_RCLICK: + begin + Node := GetNodeAt(Point.X, Point.Y); + if Assigned(Node) then + Selected := Node; + + if (Selected <> nil) and (Msg.NMHdr.code = NM_RCLICK) then + if Assigned(TJvTreeNode(Selected).PopupMenu) then // Popup menu may not be assigned + TJvTreeNode(Selected).PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); + + if Checkboxes and (GetComCtlVersion < ComCtlVersionIE6) and (Node <> nil) and // emulate missing notify message + (htOnStateIcon in GetHitTestInfoAt(Point.X, Point.Y)) then + PostCheckStateChanged(Node); + end; + TVN_SELCHANGEDA, TVN_SELCHANGEDW: + begin + DoSelectionChange; // mantis 4393 + if Assigned(FPageControl) then + if Selected <> nil then begin - if FCheckBoxes then + //Search for the correct page + J := -1; + for I := 0 to FPageControl.PageCount - 1 do + if DoComparePage(FPageControl.Pages[I], Selected) then + J := I; + if J <> -1 then begin - Node := GetNodeAt(X + 16, Y); - if Assigned(Node) then - Selected := Node + FPageControl.ActivePage := FPageControl.Pages[J]; + if Assigned(FOnPage) then + FOnPage(Self, Selected, FPageControl.Pages[J]); end; end; - if (Selected <> nil) and (NMHdr.code = NM_RCLICK) then - if Assigned(TJvTreeNode(Selected).PopupMenu) then // Popup menu may not be assigned - TJvTreeNode(Selected).PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); - end; - TVN_SELCHANGEDA, TVN_SELCHANGEDW: - begin - DoSelectionChange; // mantis 4393 - if Assigned(FPageControl) then - if Selected <> nil then - begin - //Search for the correct page - J := -1; - for I := 0 to FPageControl.PageCount - 1 do - if DoComparePage(FPageControl.Pages[I], Selected) then - J := I; - if J <> -1 then - begin - FPageControl.ActivePage := FPageControl.Pages[J]; - if Assigned(FOnPage) then - FOnPage(Self, Selected, FPageControl.Pages[J]); - end; - end; - end; - end; + end; + end; end; end; +procedure TJvTreeView.WMCheckStateChanged(var Msg: TMessage); +var + Node: TTreeNode; +begin + Node := Items.GetNode(HTREEITEM(Msg.LParam)); + if Node <> nil then + if Ord(TJvTreeNode(Node).Checked) <> Msg.WParam then // do not trigger if nothing was changed + TJvTreeNode(Node).DoCheckedChange; +end; + function TJvTreeView.DoComparePage(Page: TTabSheet; Node: TTreeNode): Boolean; begin if Assigned(FOnComparePage) then @@ -3250,6 +3287,12 @@ end; end; +procedure TJvTreeView.PostCheckStateChanged(Node: TTreeNode); +begin + if Node <> nil then + PostMessage(Handle, WM_CHECKSTATECHANGED, Ord(TJvTreeNode(Node).Checked), LPARAM(Node.ItemId)); +end; + procedure TJvTreeView.DblClick; begin inherited DblClick; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2009-10-25 13:58:17
|
Revision: 12570 http://jvcl.svn.sourceforge.net/jvcl/?rev=12570&view=rev Author: ahuser Date: 2009-10-25 13:58:09 +0000 (Sun, 25 Oct 2009) Log Message: ----------- - Mantis #4994: TJvTreeView: OnSelectionChange triggered several times in a row - TJvTreeView.MultiSelect completely rewritten Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-10-25 11:16:42 UTC (rev 12569) +++ trunk/jvcl/run/JvComCtrls.pas 2009-10-25 13:58:09 UTC (rev 12570) @@ -57,6 +57,8 @@ WM_CHECKSTATECHANGED = WM_USER + 1; + JvDefaultTreeViewMultiSelectStyle = [msControlSelect, msShiftSelect, msVisibleOnly]; + type TJvIPAddress = class; @@ -500,13 +502,11 @@ TJvTreeView = class(TJvExTreeView) private FAutoDragScroll: Boolean; - FClearBeforeSelect: Boolean; FScrollDirection: Integer; - FSelectedList: TObjectList; - FSelectThisNode: Boolean; FOnCustomDrawItem: TTVCustomDrawItemEvent; FOnEditCancelled: TNotifyEvent; FOnSelectionChange: TNotifyEvent; + FTreeSelectionChange: Boolean; FCheckBoxes: Boolean; FOnHScroll: TNotifyEvent; FOnVScroll: TNotifyEvent; @@ -525,7 +525,6 @@ function GetSelectedCount: Integer; function GetSelectedItem(Index: Integer): TTreeNode; procedure SetScrollDirection(const Value: Integer); - procedure WMLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN; procedure WMTimer(var Msg: TWMTimer); message WM_TIMER; procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; procedure WMVScroll(var Msg: TWMVScroll); message WM_VSCROLL; @@ -561,7 +560,6 @@ procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY; procedure WMPaint(var Msg: TMessage); message WM_PAINT; procedure Change(Node: TTreeNode); override; - procedure Delete(Node: TTreeNode); override; procedure DoEditCancelled; dynamic; procedure DoEnter; override; procedure DoExit; override; @@ -573,22 +571,17 @@ procedure InvalidateNode(Node: TTreeNode); procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyPress(var Key: Char); override; - procedure ResetPostOperationFlags; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; property ScrollDirection: Integer read FScrollDirection write SetScrollDirection; procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure DblClick; override; public constructor Create(AOwner: TComponent); override; - destructor Destroy; override; - procedure ClearSelection; reintroduce; function IsNodeSelected(Node: TTreeNode): Boolean; + procedure Select(Node: TTreeNode; ShiftState: TShiftState = []); override; procedure InvalidateNodeIcon(Node: TTreeNode); procedure InvalidateSelectedItems; procedure SelectItem(Node: TTreeNode; Unselect: Boolean = False); - property SelectedItems[Index: Integer]: TTreeNode read GetSelectedItem; - { SelectedCount now returns 1 (Selected<>nil) or 0 (Selected=nil) if MultiSelect=False. - The former implementation always returned -1 if MultiSelect=False } - property SelectedCount: Integer read GetSelectedCount; function GetBold(Node: TTreeNode): Boolean; procedure SetBold(Node: TTreeNode; Value: Boolean); function GetChecked(Node: TTreeNode): Boolean; @@ -603,6 +596,10 @@ { move down the display order } function MoveDown(AAbsoluteIndex: Integer; Focus: Boolean = True): Integer; + { Backward compatibility } + property SelectedItems[Index: Integer]: TTreeNode read GetSelectedItem; // deprecated 'use Selections[]' + property SelectedCount: Integer read GetSelectedCount; // deprecated 'use SelectionCount' + property InsertMarkColor: TColor read GetInsertMarkColor write SetInsertMarkColor; property Checked[Node: TTreeNode]: Boolean read GetChecked write SetChecked; property MaxScrollTime: Integer read GetMaxScrollTime write SetMaxScrollTime; @@ -619,6 +616,7 @@ property PageControl: TPageControl read FPageControl write SetPageControl; property AutoDragScroll: Boolean read FAutoDragScroll write FAutoDragScroll default False; property CheckEventsDisabled: Boolean read FCheckEventsDisabled write FCheckEventsDisabled default False; + property MultiSelectStyle default JvDefaultTreeViewMultiSelectStyle; property OnVerticalScroll: TNotifyEvent read FOnVScroll write FOnVScroll; property OnHorizontalScroll: TNotifyEvent read FOnHScroll write FOnHScroll; property OnPageChanged: TPageChangedEvent read FOnPage write FOnPage; @@ -647,11 +645,9 @@ implementation uses - SysUtils, - Math, + SysUtils, Math, JclStrings, - JvThemes, - JvConsts, JvJCLUtils; + JvConsts, JvThemes, JvJCLUtils; const TVIS_CHECKED = $2000; @@ -2454,54 +2450,21 @@ begin inherited Create(AOwner); FCheckBoxes := False; - // ControlStyle := ControlStyle + [csAcceptsControls]; - FSelectedList := TObjectList.Create(False); + MultiSelectStyle := JvDefaultTreeViewMultiSelectStyle; + // Since IsCustomDrawn method is not virtual we have to assign ancestor's // OnCustomDrawItem event to enable custom drawing if not (csDesigning in ComponentState) then inherited OnCustomDrawItem := InternalCustomDrawItem; end; -destructor TJvTreeView.Destroy; -begin - FreeAndNil(FSelectedList); - inherited Destroy; -end; - procedure TJvTreeView.Change(Node: TTreeNode); begin - if FClearBeforeSelect then - begin - FClearBeforeSelect := False; - ClearSelection; - end; - if FSelectThisNode then - begin - FSelectThisNode := False; - SelectItem(Node); - end; inherited Change(Node); if not MenuDblClick and IsMenuItemClick(Node) then TMenuItem(Node.Data).OnClick(TMenuItem(Node.Data)); end; -procedure TJvTreeView.ClearSelection; -var - NeedInvalidate: array of TTreeNode; - I: Integer; -begin - FClearBeforeSelect := False; - if not Assigned(FSelectedList) or (FSelectedList.Count = 0) then - Exit; - DoSelectionChange; - SetLength(NeedInvalidate, FSelectedList.Count); - for I := 0 to FSelectedList.Count - 1 do - NeedInvalidate[I] := SelectedItems[I]; - FSelectedList.Clear; - for I := 0 to Length(NeedInvalidate) - 1 do - InvalidateNode(NeedInvalidate[I]); -end; - function TJvTreeView.CreateNode: TTreeNode; begin Result := TJvTreeNode.CreateEnh(Items); @@ -2542,13 +2505,6 @@ inherited DestroyWnd; end; -procedure TJvTreeView.Delete(Node: TTreeNode); -begin - if MultiSelect then - FSelectedList.Remove(Node); - inherited Delete(Node); -end; - procedure TJvTreeView.DoEditCancelled; begin if Assigned(FOnEditCancelled) then @@ -2618,15 +2574,12 @@ function TJvTreeView.GetSelectedCount: Integer; begin - if MultiSelect or (Selected <> nil) then - Result := FSelectedList.Count - else - Result := 0; + Result := SelectionCount; end; function TJvTreeView.GetSelectedItem(Index: Integer): TTreeNode; begin - Result := TTreeNode(FSelectedList[Index]); + Result := Selections[Index]; end; function TJvTreeView.GetItemIndex: Integer; @@ -2648,46 +2601,6 @@ Canvas.Font := TJvTreeNode(Node).Font; Canvas.Brush := TJvTreeNode(Node).Brush; end; - - if MultiSelect then - begin - with Canvas.Font do - begin // fix HotTrack bug in custom drawing - OnChange(nil); - if cdsHot in State then - begin - Style := Style + [fsUnderLine]; - if cdsSelected in State then - Color := clHighlightText - else - Color := clHighlight; - end; - end; - end; - - // Mantis 3250: This needs to be done wether we are multiselecting or not - // but it forces the rest of the code to ensure that the list of selected - // nodes is consistent with the desired display (see CNNotify). - if IsNodeSelected(Node) then - begin - if Focused then - begin - Canvas.Font.Color := clHighlightText; - Canvas.Brush.Color := clHighlight; - end - else - if not HideSelection then - begin - Canvas.Font.Color := Font.Color; - Canvas.Brush.Color := clInactiveBorder; - end; - end - else - begin - Canvas.Font.Color := Font.Color; - Canvas.Brush.Color := Color; - end; - if Assigned(FOnCustomDrawItem) then FOnCustomDrawItem(Self, Node, State, DefaultDraw); end; @@ -2727,35 +2640,16 @@ function TJvTreeView.IsNodeSelected(Node: TTreeNode): Boolean; begin - Result := FSelectedList.IndexOf(Node) <> -1; + Result := (Node <> nil) and Node.Selected; end; procedure TJvTreeView.KeyDown(var Key: Word; Shift: TShiftState); begin - if MultiSelect then - begin - ResetPostOperationFlags; - if not (ssAlt in Shift) and not IsEditing then - begin - if Key = VK_SPACE then - SelectItem(Selected, IsNodeSelected(Selected)) - else - begin - FSelectThisNode := True; - if Shift * [ssShift, ssCtrl] = [] then - FClearBeforeSelect := True; - end; - end; - end - else - begin - FClearBeforeSelect := True; - FSelectThisNode := True; - end; if Checkboxes and (GetComCtlVersion < ComCtlVersionIE6) and (Key = VK_SPACE) then // emulate missing notify message PostCheckStateChanged(Selected); inherited KeyDown(Key, Shift); + if ((Key = VK_SPACE) or (Key = VK_RETURN)) and MenuDblClick and IsMenuItemClick(Selected) then TMenuItem(Selected.Data).OnClick(TMenuItem(Selected.Data)); end; @@ -2768,12 +2662,6 @@ inherited KeyPress(Key); end; -procedure TJvTreeView.ResetPostOperationFlags; -begin - FClearBeforeSelect := False; - FSelectThisNode := not MultiSelect; -end; - procedure TJvTreeView.SetItemIndex(const Value: Integer); begin if Value = -1 then @@ -2785,13 +2673,9 @@ procedure TJvTreeView.SelectItem(Node: TTreeNode; Unselect: Boolean); begin if Unselect then - FSelectedList.Remove(Node) + Deselect(Node) else - if not IsNodeSelected(Node) then - FSelectedList.Add(Node); - if HandleAllocated then - InvalidateNode(Node); - DoSelectionChange; + Select(Node); end; procedure TJvTreeView.SetBold(Node: TTreeNode; Value: Boolean); @@ -2866,52 +2750,6 @@ FOnHScroll(Self); end; -procedure TJvTreeView.WMLButtonDown(var Msg: TWMLButtonDown); -var - Node: TTreeNode; - FirstNodeIndex, I: Integer; -begin - ResetPostOperationFlags; - with Msg do - if (htOnItem in GetHitTestInfoAt(XPos, YPos)) then - begin - if MultiSelect then - begin - Node := GetNodeAt(XPos, YPos); - if Assigned(Node) and (ssCtrl in KeysToShiftState(Keys)) then - begin - SelectItem(Node, IsNodeSelected(Node)); - end - else - if Assigned(Node) and (ssShift in KeysToShiftState(Keys)) then - begin - FirstNodeIndex := 0; - - if SelectionCount > 0 then - FirstNodeIndex := Selections[0].Index; - - ClearSelection; - if FirstNodeIndex < Node.Index then - begin - for I := FirstNodeIndex to Node.Index do - SelectItem(Items[I]); - end - else - begin - for I := FirstNodeIndex downto Node.Index do - SelectItem(Items[I]); - end; - end - else - begin - ClearSelection; - SelectItem(Node); - end; - end; - end; - inherited; -end; - procedure TJvTreeView.WMPaint(var Msg: TMessage); var I: Integer; @@ -2947,20 +2785,11 @@ Point: TPoint; I, J: Integer; begin - // Need to indicate ClearBeforeSelect if the item is about to change - // or we would get rendering glitches because of an inconsistent - // selection list. (Mantis 3250) - // Mantis 4699: Further limit this to when HideSelection is set to True. - // Mantis 4808: Well, it seems that fix for 4699 is doing more harm than good -// if HideSelection then - begin - case Msg.NMHdr.code of - TVN_SELCHANGEDA, TVN_SELCHANGEDW: - if not Multiselect then - FClearBeforeSelect := True; - end; + FTreeSelectionChange := False; + case Msg.NMHdr.code of + TVN_SELCHANGEDA, TVN_SELCHANGEDW: + FTreeSelectionChange := True; end; - inherited; if Windows.GetCursorPos(Point) then // prevent AV after "computer locked" dialog begin @@ -2977,12 +2806,12 @@ NM_CLICK, NM_RCLICK: begin Node := GetNodeAt(Point.X, Point.Y); - if Assigned(Node) then + if Assigned(Node) and not MultiSelect then Selected := Node; - if (Selected <> nil) and (Msg.NMHdr.code = NM_RCLICK) then - if Assigned(TJvTreeNode(Selected).PopupMenu) then // Popup menu may not be assigned - TJvTreeNode(Selected).PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); + if (Node <> nil) and (Msg.NMHdr.code = NM_RCLICK) then + if Assigned(TJvTreeNode(Node).PopupMenu) then // Popup menu may not be assigned + TJvTreeNode(Node).PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); if Checkboxes and (GetComCtlVersion < ComCtlVersionIE6) and (Node <> nil) and // emulate missing notify message (htOnStateIcon in GetHitTestInfoAt(Point.X, Point.Y)) then @@ -2990,7 +2819,8 @@ end; TVN_SELCHANGEDA, TVN_SELCHANGEDW: begin - DoSelectionChange; // mantis 4393 + DoSelectionChange; + if Assigned(FPageControl) then if Selected <> nil then begin @@ -3116,6 +2946,16 @@ Result := clDefault; end; +procedure TJvTreeView.Select(Node: TTreeNode; ShiftState: TShiftState); +var + WasSelected: Boolean; +begin + WasSelected := (Node <> nil) and Node.Selected; + inherited Select(Node, ShiftState); + if WasSelected <> ((Node <> nil) and Node.Selected) then + DoSelectionChange; // trigger the missing OnSelectionChange event +end; + function TJvTreeView.MoveUp(AAbsoluteIndex: Integer; Focus: Boolean): Integer; var lNode, lNode2: TTreeNode; @@ -3141,6 +2981,31 @@ end; end; +procedure TJvTreeView.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var + Node: TTreeNode; + SelCount: Cardinal; +begin + if (Button = mbLeft) and MultiSelect then + begin + Node := GetNodeAt(X, Y); + if (Node <> nil) and (htOnItem in GetHitTestInfoAt(X, Y)) then + begin + SelCount := SelectionCount; + // The VCL doesn't do this but it's standard Windows behavior to select only the clicked + // item if you click on it without pressing Ctrl/Shift. + if (SelCount > 1) and (Node <> nil) and Node.Selected and ([ssShift, ssCtrl] * Shift = []) then + ClearSelection(True); + + inherited MouseDown(Button, Shift, X, Y); + if SelCount <> SelectionCount then + DoSelectionChange; // trigger the missing OnSelectionChange event + Exit; + end; + end; + inherited MouseDown(Button, Shift, X, Y); +end; + function TJvTreeView.MoveDown(AAbsoluteIndex: Integer; Focus: Boolean): Integer; var lNode, lNode2: TTreeNode; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2009-10-25 14:14:55
|
Revision: 12571 http://jvcl.svn.sourceforge.net/jvcl/?rev=12571&view=rev Author: ahuser Date: 2009-10-25 14:14:47 +0000 (Sun, 25 Oct 2009) Log Message: ----------- Removed unused code Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-10-25 13:58:09 UTC (rev 12570) +++ trunk/jvcl/run/JvComCtrls.pas 2009-10-25 14:14:47 UTC (rev 12571) @@ -506,7 +506,6 @@ FOnCustomDrawItem: TTVCustomDrawItemEvent; FOnEditCancelled: TNotifyEvent; FOnSelectionChange: TNotifyEvent; - FTreeSelectionChange: Boolean; FCheckBoxes: Boolean; FOnHScroll: TNotifyEvent; FOnVScroll: TNotifyEvent; @@ -2785,11 +2784,6 @@ Point: TPoint; I, J: Integer; begin - FTreeSelectionChange := False; - case Msg.NMHdr.code of - TVN_SELCHANGEDA, TVN_SELCHANGEDW: - FTreeSelectionChange := True; - end; inherited; if Windows.GetCursorPos(Point) then // prevent AV after "computer locked" dialog begin This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2009-10-29 21:58:15
|
Revision: 12586 http://jvcl.svn.sourceforge.net/jvcl/?rev=12586&view=rev Author: obones Date: 2009-10-29 21:58:01 +0000 (Thu, 29 Oct 2009) Log Message: ----------- Must call default window proc Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-10-29 20:27:56 UTC (rev 12585) +++ trunk/jvcl/run/JvComCtrls.pas 2009-10-29 21:58:01 UTC (rev 12586) @@ -58,6 +58,10 @@ WM_CHECKSTATECHANGED = WM_USER + 1; JvDefaultTreeViewMultiSelectStyle = [msControlSelect, msShiftSelect, msVisibleOnly]; + + {$IFNDEF COMPILER7_UP} + ComCtlVersionIE6 = $00060000; + {$ENDIF ~COMPILER7_UP} type TJvIPAddress = class; @@ -804,7 +808,8 @@ end; // mouse messages are sent through TJvIPAddress.WMParentNotify end; - Dispatch(Msg); + with Msg do + Result := DefWindowProc(Handle, Msg, WParam, LParam); end; //=== { TJvIPAddressDataConnector } ========================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2009-12-28 15:45:22
|
Revision: 12630 http://jvcl.svn.sourceforge.net/jvcl/?rev=12630&view=rev Author: obones Date: 2009-12-28 15:45:12 +0000 (Mon, 28 Dec 2009) Log Message: ----------- Mantis 5043: Dispatch works much better than calling DefWindowProc Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2009-12-28 12:09:57 UTC (rev 12629) +++ trunk/jvcl/run/JvComCtrls.pas 2009-12-28 15:45:12 UTC (rev 12630) @@ -808,8 +808,8 @@ end; // mouse messages are sent through TJvIPAddress.WMParentNotify end; - with Msg do - Result := DefWindowProc(Handle, Msg, WParam, LParam); + + Dispatch(Msg); end; //=== { TJvIPAddressDataConnector } ========================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-04-02 11:41:05
|
Revision: 12744 http://jvcl.svn.sourceforge.net/jvcl/?rev=12744&view=rev Author: ahuser Date: 2010-04-02 11:40:59 +0000 (Fri, 02 Apr 2010) Log Message: ----------- Mantis #5119: TJvTreeView does not fire OnNodeCheckedChange on Windows XP Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2010-04-02 11:10:53 UTC (rev 12743) +++ trunk/jvcl/run/JvComCtrls.pas 2010-04-02 11:40:59 UTC (rev 12744) @@ -58,10 +58,6 @@ WM_CHECKSTATECHANGED = WM_USER + 1; JvDefaultTreeViewMultiSelectStyle = [msControlSelect, msShiftSelect, msVisibleOnly]; - - {$IFNDEF COMPILER7_UP} - ComCtlVersionIE6 = $00060000; - {$ENDIF ~COMPILER7_UP} type TJvIPAddress = class; @@ -655,6 +651,15 @@ const TVIS_CHECKED = $2000; +function NeedCheckStateEmulation(): Boolean; // ComCtrls 6+ under Vista+ +{$IFNDEF COMPILER7_UP} +const + ComCtlVersionIE6 = $00060000; +{$ENDIF ~COMPILER7_UP} +begin + Result := (GetComCtlVersion < ComCtlVersionIE6) or not CheckWin32Version(6, 0); +end; + //=== { TJvIPAddressRange } ================================================== constructor TJvIPAddressRange.Create(Control: TWinControl); @@ -2649,7 +2654,7 @@ procedure TJvTreeView.KeyDown(var Key: Word; Shift: TShiftState); begin - if Checkboxes and (GetComCtlVersion < ComCtlVersionIE6) and (Key = VK_SPACE) then // emulate missing notify message + if Checkboxes and NeedCheckStateEmulation() and (Key = VK_SPACE) then // emulate missing notify message PostCheckStateChanged(Selected); inherited KeyDown(Key, Shift); @@ -2794,9 +2799,9 @@ begin Point := ScreenToClient(Point); case Msg.NMHdr.code of - NM_TVSTATEIMAGECHANGING: // ComCtrls 6+ + NM_TVSTATEIMAGECHANGING: // ComCtrls 6+ and WinVer >= 6.0 begin - if CheckBoxes and (GetComCtlVersion >= ComCtlVersionIE6) then + if CheckBoxes and not NeedCheckStateEmulation() then begin Node := Items.GetNode(PNMTVStateImageChanging(Msg.NMHdr).hti); PostCheckStateChanged(Node); @@ -2812,7 +2817,7 @@ if Assigned(TJvTreeNode(Node).PopupMenu) then // Popup menu may not be assigned TJvTreeNode(Node).PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); - if Checkboxes and (GetComCtlVersion < ComCtlVersionIE6) and (Node <> nil) and // emulate missing notify message + if Checkboxes and NeedCheckStateEmulation() and (Node <> nil) and // emulate missing notify message (htOnStateIcon in GetHitTestInfoAt(Point.X, Point.Y)) then PostCheckStateChanged(Node); end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2010-10-08 13:04:17
|
Revision: 12853 http://jvcl.svn.sourceforge.net/jvcl/?rev=12853&view=rev Author: obones Date: 2010-10-08 13:04:11 +0000 (Fri, 08 Oct 2010) Log Message: ----------- Mantis 5146 : Using the getter allows to get the correct state even if there was user interaction. Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2010-10-08 12:59:49 UTC (rev 12852) +++ trunk/jvcl/run/JvComCtrls.pas 2010-10-08 13:04:11 UTC (rev 12853) @@ -2395,7 +2395,7 @@ var Item: TTVItem; begin - if Value <> FChecked then + if Value <> GetChecked then begin FChecked := Value; FillChar(Item, SizeOf(Item), 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-11-27 15:17:18
|
Revision: 12910 http://jvcl.svn.sourceforge.net/jvcl/?rev=12910&view=rev Author: ahuser Date: 2010-11-27 15:17:11 +0000 (Sat, 27 Nov 2010) Log Message: ----------- Mantis #5421: TJvCheckTreeView looses the node's Checked state if reparented. Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2010-11-27 14:28:39 UTC (rev 12909) +++ trunk/jvcl/run/JvComCtrls.pas 2010-11-27 15:17:11 UTC (rev 12910) @@ -518,6 +518,7 @@ FReinitializeTreeNode: Boolean; FOnNodeCheckedChange: TJvTreeViewNodeCheckedChange; FCheckEventsDisabled: Boolean; + FRecreateCheckedState: array of Boolean; procedure InternalCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); @@ -2493,6 +2494,8 @@ end; procedure TJvTreeView.CreateWnd; +var + I: Integer; begin FReinitializeTreeNode := True; inherited CreateWnd; @@ -2501,7 +2504,16 @@ // scroll bar that has nothing to do here. Setting the GWL_STYLE window // long shows the checkboxes and does not trigger this bug. if FCheckBoxes then + begin SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) or TVS_CHECKBOXES); + // After a recreate we must set our saved checked state + if FRecreateCheckedState <> nil then + begin + for I := 0 to Min(Length(FRecreateCheckedState), Items.Count) - 1 do + TJvTreeNode(Items[I]).FChecked := FRecreateCheckedState[I]; + FRecreateCheckedState := nil; + end; + end; end; procedure TJvTreeView.DestroyWnd; @@ -2509,8 +2521,15 @@ I: Integer; begin // update the FChecked field with the current data - for I := 0 to Items.Count - 1 do - TJvTreeNode(Items[I]).FChecked := TJvTreeNode(Items[I]).Checked; + if not (csDestroying in ComponentState) then + begin + SetLength(FRecreateCheckedState, Items.Count); + for I := 0 to Items.Count - 1 do + begin + TJvTreeNode(Items[I]).FChecked := TJvTreeNode(Items[I]).Checked; + FRecreateCheckedState[I] := TJvTreeNode(Items[I]).FChecked; + end; + end; inherited DestroyWnd; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-11-28 13:48:23
|
Revision: 12932 http://jvcl.svn.sourceforge.net/jvcl/?rev=12932&view=rev Author: ahuser Date: 2010-11-28 13:48:17 +0000 (Sun, 28 Nov 2010) Log Message: ----------- Mantis #4427: Drawing bug in TJvIPAddress I haven't seen a difference with and without the SetBkMode(TRANSPARENT) call in themed and un-themed mode. So I think it is safe to remove the call. Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2010-11-28 13:36:50 UTC (rev 12931) +++ trunk/jvcl/run/JvComCtrls.pas 2010-11-28 13:48:17 UTC (rev 12932) @@ -1282,7 +1282,6 @@ SetBkColor(DC, ColorToRGB(Brush.Color)); SetTextColor(Msg.ChildDC, ColorToRGB(Font.Color)); SetBkColor(Msg.ChildDC, ColorToRGB(Brush.Color)); - SetBkMode(Msg.ChildDC, TRANSPARENT); finally ReleaseDC(Handle, DC); end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-11-30 20:30:17
|
Revision: 12945 http://jvcl.svn.sourceforge.net/jvcl/?rev=12945&view=rev Author: ahuser Date: 2010-11-30 20:30:11 +0000 (Tue, 30 Nov 2010) Log Message: ----------- Mantis #4715: StateImage icons disappear from JvCheckTreeView when i use dock Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2010-11-30 19:53:56 UTC (rev 12944) +++ trunk/jvcl/run/JvComCtrls.pas 2010-11-30 20:30:11 UTC (rev 12945) @@ -2512,6 +2512,10 @@ TJvTreeNode(Items[I]).FChecked := FRecreateCheckedState[I]; FRecreateCheckedState := nil; end; + // Mantis #4715. We must set the StateImages image list after changing TVS_CHECKBOXES + // because changing TVS_CHECKBOXES disables the TVSIL_STATE imagelist. + if (StateImages <> nil) and StateImages.HandleAllocated then + TreeView_SetImageList(Handle, StateImages.Handle, TVSIL_STATE); end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2011-02-16 17:38:56
|
Revision: 12985 http://jvcl.svn.sourceforge.net/jvcl/?rev=12985&view=rev Author: ahuser Date: 2011-02-16 17:38:50 +0000 (Wed, 16 Feb 2011) Log Message: ----------- Mantis #5450: JvTreeView HideSelection property does not work (in classic theme) Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2011-02-16 16:50:41 UTC (rev 12984) +++ trunk/jvcl/run/JvComCtrls.pas 2011-02-16 17:38:50 UTC (rev 12985) @@ -2629,8 +2629,13 @@ begin if (State = []) or (State = [cdsDefault]) or (State = [cdsSelected]) then begin - Canvas.Font := TJvTreeNode(Node).Font; - Canvas.Brush := TJvTreeNode(Node).Brush; + // Mantis #5450: If HideSelection is false the node is painted as it wouldn't be + // selected because State = []. + if not (not HideSelection and Node.Selected and not Focused) then + begin + Canvas.Font := TJvTreeNode(Node).Font; + Canvas.Brush := TJvTreeNode(Node).Brush; + end; end; if Assigned(FOnCustomDrawItem) then FOnCustomDrawItem(Self, Node, State, DefaultDraw); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2011-05-17 13:15:35
|
Revision: 13028 http://jvcl.svn.sourceforge.net/jvcl/?rev=13028&view=rev Author: ahuser Date: 2011-05-17 13:15:29 +0000 (Tue, 17 May 2011) Log Message: ----------- OnAddition/OnDeletion was called when the handle was recreated Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2011-05-16 20:49:35 UTC (rev 13027) +++ trunk/jvcl/run/JvComCtrls.pas 2011-05-17 13:15:29 UTC (rev 13028) @@ -572,6 +572,10 @@ procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyPress(var Key: Char); override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + {$IFNDEF COMPILER15_UP} // Delphi XE fixed the OnAddition/OnDeletion bug + procedure Added(Node: TTreeNode); override; + procedure Delete(Node: TTreeNode); override; + {$ENDIF ~COMPILER15_UP} property ScrollDirection: Integer read FScrollDirection write SetScrollDirection; procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure DblClick; override; @@ -2977,6 +2981,50 @@ Result := clDefault; end; +{$IFNDEF COMPILER15_UP} // Delphi XE fixed the OnAddition/OnDeletion bug +procedure TJvTreeView.Added(Node: TTreeNode); +var + OrgOnAddition: TTVExpandedEvent; +begin + OrgOnAddition := OnAddition; + if CreateWndRestores and + {$IFDEF COMPILER170_UP} + (csRecreating in ControlState) + {$ELSE} + not (csDestroying in ComponentState) + {$ENDIF} + then + OnAddition := nil; + try + inherited Added(Node); + finally + if Assigned(OrgOnAddition) then + OnAddition := OrgOnAddition; + end; +end; + +procedure TJvTreeView.Delete(Node: TTreeNode); +var + OrgOnDeletion: TTVExpandedEvent; +begin + OrgOnDeletion := OnDeletion; + if CreateWndRestores and + {$IFDEF COMPILER10_UP} + (csRecreating in ControlState) + {$ELSE} + not (csDestroying in ComponentState) + {$ENDIF} + then + OnDeletion := nil; + try + inherited Delete(Node); + finally + if Assigned(OrgOnDeletion) then + OnDeletion := OrgOnDeletion; + end; +end; +{$ENDIF ~COMPILER15_UP} + procedure TJvTreeView.Select(Node: TTreeNode; ShiftState: TShiftState); var WasSelected: Boolean; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2012-02-23 16:26:30
|
Revision: 13213 http://jvcl.svn.sourceforge.net/jvcl/?rev=13213&view=rev Author: obones Date: 2012-02-23 16:26:19 +0000 (Thu, 23 Feb 2012) Log Message: ----------- Mantis 5629 : TVIS_CHECKED can be applied shifted in descendants so we take that into account Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2012-02-23 12:47:24 UTC (rev 13212) +++ trunk/jvcl/run/JvComCtrls.pas 2012-02-23 16:26:19 UTC (rev 13213) @@ -2380,7 +2380,8 @@ mask := TVIF_STATE; hItem := ItemId; if TreeView_GetItem(Handle, Item) then - Result := ((Item.State and TVIS_CHECKED) = TVIS_CHECKED) + Result := (((Item.State and TVIS_STATEIMAGEMASK) or TVIS_CHECKED) = TVIS_CHECKED) or + (((Item.State and TVIS_STATEIMAGEMASK) or TVIS_CHECKED shl 1) = TVIS_CHECKED shl 1) else Result := False; end; @@ -2421,10 +2422,11 @@ hItem := ItemId; mask := TVIF_STATE; StateMask := TVIS_STATEIMAGEMASK; + TreeView_GetItem(Handle, Item); if Value then - Item.State := TVIS_CHECKED + Item.State := Item.State + TVIS_CHECKED else - Item.State := TVIS_CHECKED shr 1; + Item.State := Item.State - TVIS_CHECKED; TreeView_SetItem(Handle, Item); end; DoCheckedChange; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2012-02-24 14:03:53
|
Revision: 13220 http://jvcl.svn.sourceforge.net/jvcl/?rev=13220&view=rev Author: obones Date: 2012-02-24 14:03:43 +0000 (Fri, 24 Feb 2012) Log Message: ----------- Mantis 5716 : AddressValues was not working properly, this is now deprecated and better handling is done through Address and AddressValue Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2012-02-24 10:56:45 UTC (rev 13219) +++ trunk/jvcl/run/JvComCtrls.pas 2012-02-24 14:03:43 UTC (rev 13220) @@ -1,4 +1,4 @@ -{----------------------------------------------------------------------------- +{----------------------------------------------------------------------------- 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 @@ -59,6 +59,8 @@ JvDefaultTreeViewMultiSelectStyle = [msControlSelect, msShiftSelect, msVisibleOnly]; + JvIP4_127_0_0_1 = 2130706433; + type TJvIPAddress = class; @@ -86,19 +88,31 @@ procedure DefaultHandler(var Msg); override; end; + TJvIP4AddressComponentIndex = 1..4; // Numeration is backward, according to intel bytes order and MSDN FIRST_IPADDRESS + TJvIPAddressRange = class(TPersistent) private FControl: TWinControl; FRange: array [0..3] of TJvIPAddressMinMax; - function GetMaxRange(Index: Integer): Byte; - function GetMinRange(Index: Integer): Byte; + function GetMaxRange(Index: Integer): Byte; {$IFDEF SUPPORTS_INLINE}inline;{$ENDIF} + function GetMinRange(Index: Integer): Byte; {$IFDEF SUPPORTS_INLINE}inline;{$ENDIF} procedure SetMaxRange(const Index: Integer; const Value: Byte); procedure SetMinRange(const Index: Integer; const Value: Byte); + {$IFOPT R+} + procedure CheckIndex(const I: TJvIP4AddressComponentIndex); + {$ENDIF} + function GetCheckedMaxRange(I: TJvIP4AddressComponentIndex): Byte; {$IFOPT R-}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{$ENDIF} + function GetCheckedMinRange(I: TJvIP4AddressComponentIndex): Byte; {$IFOPT R-}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{$ENDIF} + procedure SetCheckedMaxRange(I: TJvIP4AddressComponentIndex; const Value: Byte); {$IFOPT R-}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{$ENDIF} + procedure SetCheckedMinRange(I: TJvIP4AddressComponentIndex; const Value: Byte); {$IFOPT R-}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{$ENDIF} protected procedure AssignTo(Dest: TPersistent); override; procedure Change(Index: Integer); + public constructor Create(Control: TWinControl); + property Min[I: TJvIP4AddressComponentIndex]: Byte read GetCheckedMinRange write SetCheckedMinRange; + property Max[I: TJvIP4AddressComponentIndex]: Byte read GetCheckedMaxRange write SetCheckedMaxRange; published property Field1Min: Byte index 0 read GetMinRange write SetMinRange default 0; property Field1Max: Byte index 0 read GetMaxRange write SetMaxRange default 255; @@ -114,29 +128,32 @@ FieldRange: TJvIPAddressMinMax; var Value: Integer) of object; TJvIPAddressChanging = procedure(Sender: TObject; Index: Integer; Value: Byte; var AllowChange: Boolean) of object; - TJvIPAddressValues = class(TPersistent) + TJvIPAddressValues = class(TObject) private - FValues: array [0..3] of Byte; FOnChange: TNotifyEvent; FOnChanging: TJvIPAddressChanging; - function GetValue: Cardinal; - procedure SetValue(const AValue: Cardinal); + FOwner: TJvIPAddress; + + function GetAddress: Cardinal; + procedure SetAddress(const AValue: Cardinal); procedure SetValues(Index: Integer; Value: Byte); function GetValues(Index: Integer): Byte; protected - procedure Change; virtual; - function Changing(Index: Integer; Value: Byte): Boolean; virtual; + procedure Change; + function Changing(Index: Integer; Value: Byte): Boolean; public + constructor Create(AOwner: TJvIpAddress); + property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnChanging: TJvIPAddressChanging read FOnChanging write FOnChanging; - published - property Address: Cardinal read GetValue write SetValue; + + property Address: Cardinal read GetAddress write SetAddress; property Value1: Byte index 0 read GetValues write SetValues; property Value2: Byte index 1 read GetValues write SetValues; property Value3: Byte index 2 read GetValues write SetValues; property Value4: Byte index 3 read GetValues write SetValues; end; - + TJvIPAddressDataConnector = class(TJvFieldDataConnector) private FEditControl: TJvIPAddress; @@ -148,6 +165,13 @@ constructor Create(AEditControl: TJvIPAddress); end; + // declare externally to avoid Code Completion going crazy + TJvIP4AddressDual = packed record + case byte of + 0: (Address: LongWord); + 1: (Comps: array[TJvIP4AddressComponentIndex] of Byte); + end; + {$IFDEF RTL230_UP} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] {$ENDIF RTL230_UP} @@ -155,10 +179,11 @@ private FEditControls: array [0..3] of TJvIPEditControlHelper; FEditControlCount: Integer; - FAddress: LongWord; - FChanging: Boolean; + + FAddress: TJvIP4AddressDual; FRange: TJvIPAddressRange; FAddressValues: TJvIPAddressValues; + FChanging: Boolean; FSaveBlank: Boolean; FTabThroughFields: Boolean; FLocalFont: HFONT; @@ -166,7 +191,7 @@ FOnChange: TNotifyEvent; FFocusFromField: Boolean; FDataConnector: TJvIPAddressDataConnector; - + procedure SetDataConnector(const Value: TJvIPAddressDataConnector); procedure ClearEditControls; procedure DestroyLocalFont; @@ -184,6 +209,9 @@ procedure WMKeyDown(var Msg: TWMKeyDown); message WM_KEYDOWN; procedure WMKeyUp(var Msg: TWMKeyUp); message WM_KEYUP; procedure SelectTabControl(Previous: Boolean); + procedure SetBlank(const Value: Boolean); + procedure DFMSkipLegacyAddressValues(Reader: TReader); + procedure DoNotSetRange(const Value: TJvIPAddressRange); protected procedure GetDlgCode(var Code: TDlgCodes); override; procedure EnabledChanged; override; @@ -194,28 +222,36 @@ function GetControlExtents: TRect; override; procedure CreateParams(var Params: TCreateParams); override; procedure CreateWnd; override; - procedure DestroyWnd; override; + procedure DefineProperties(Filer: TFiler); override; procedure DoChange; dynamic; procedure Paint; override; procedure DoAddressChange(Sender: TObject); virtual; - procedure DoAddressChanging(Sender: TObject; Index: Integer; - Value: Byte; var AllowChange: Boolean); virtual; + procedure DoAddressChanging(Sender: TObject; Index: Integer; Value: Byte; var AllowChange: Boolean); virtual; procedure DoFieldChange(FieldIndex: Integer; var FieldValue: Integer); dynamic; + procedure PushAddressToWindows; {$IFDEF SUPPORTS_INLINE}inline;{$ENDIF} procedure UpdateValuesFromString(S: string); + function GetAddressValue(Component: TJvIP4AddressComponentIndex): Byte; {$IFDEF SUPPORTS_INLINE}inline;{$ENDIF} + procedure SetAddressValue(Component: TJvIP4AddressComponentIndex; const Value: Byte); procedure KeyPress(var Key: Char); override; procedure DoExit; override; function CreateDataConnector: TJvIPAddressDataConnector; virtual; + function IsNotBlank: Boolean; {$IFDEF SUPPORTS_INLINE}inline;{$ENDIF} // for DFM storage public constructor Create(AOwner: TComponent); override; destructor Destroy; override; + procedure ClearAddress; function IsBlank: Boolean; + property AddressValue[Component: TJvIP4AddressComponentIndex]: Byte read GetAddressValue write SetAddressValue; + + // this property is only here for bacwkard compatibility, please use .AddressValue[Index] and .Address instead + property AddressValues: TJvIPAddressValues read FAddressValues write SetAddressValues stored False; published - property Address: LongWord read FAddress write SetAddress default 0; - property AddressValues: TJvIPAddressValues read FAddressValues write SetAddressValues; + property Address: LongWord read FAddress.Address write SetAddress stored IsNotBlank default JvIP4_127_0_0_1; + property AddressIsBlank: boolean read IsBlank write SetBlank default false; property Anchors; property AutoSize; property Color; @@ -236,12 +272,12 @@ property ParentFont; property ParentShowHint; property PopupMenu; - property Range: TJvIPAddressRange read FRange write FRange; + property Range: TJvIPAddressRange read FRange write DoNotSetRange {To make DFM store vaules}; property ShowHint; property TabOrder; property TabStop default True; property TabThroughFields: Boolean read FTabThroughFields write FTabThroughFields default True; - property Text; + property Text stored false; // duplicate of Address property Visible; property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnContextPopup; @@ -251,7 +287,7 @@ property OnEndDrag; property OnEnter; property OnExit; - property OnFieldChange: TJvIpAddrFieldChangeEvent read FOnFieldChange write FOnFieldChange; + property OnFieldChange: TJvIpAddrFieldChangeEvent read FOnFieldChange write FOnFieldChange; // user change, not programming change property OnKeyDown; property OnKeyPress; property OnKeyUp; @@ -666,7 +702,7 @@ implementation uses - SysUtils, Math, + SysUtils, Math, StrUtils, JclStrings, JvConsts, JvThemes, JvJCLUtils; @@ -729,6 +765,30 @@ ChangeRange(Index); end; +{$IFOPT R+} +procedure TJvIPAddressRange.CheckIndex(const I: TJvIP4AddressComponentIndex); +begin + if (I > High(TJvIP4AddressComponentIndex)) or (I < Low(TJvIP4AddressComponentIndex)) then + raise ERangeError.Create(Self.ClassName + ' range error: ' + IntToStr(I)); +end; +{$ENDIF} + +function TJvIPAddressRange.GetCheckedMaxRange(I: TJvIP4AddressComponentIndex): Byte; +begin + {$IFOPT R+} + CheckIndex(I); + {$ENDIF} + Result := GetMaxRange(I - 1); +end; + +function TJvIPAddressRange.GetCheckedMinRange(I: TJvIP4AddressComponentIndex): Byte; +begin + {$IFOPT R+} + CheckIndex(I); + {$ENDIF} + Result := GetMinRange(I - 1); +end; + function TJvIPAddressRange.GetMaxRange(Index: Integer): Byte; begin Result := FRange[Index].Max; @@ -739,15 +799,45 @@ Result := FRange[Index].Min; end; +procedure TJvIPAddressRange.SetCheckedMaxRange(I: TJvIP4AddressComponentIndex; + const Value: Byte); +begin + {$IFOPT R+} + CheckIndex(I); + {$ENDIF} + SetMaxRange(I - 1, Value); +end; + +procedure TJvIPAddressRange.SetCheckedMinRange(I: TJvIP4AddressComponentIndex; + const Value: Byte); +begin + {$IFOPT R+} + CheckIndex(I); + {$ENDIF} + SetMinRange(I - 1, Value); +end; + procedure TJvIPAddressRange.SetMaxRange(const Index: Integer; const Value: Byte); +var + Range: TJvIPAddressMinMax; begin - FRange[Index].Max := Value; + Range := FRange[Index]; + Range.Max := Value; + if Range.Min > Value then + Range.Min := Value; + Change(Index); end; procedure TJvIPAddressRange.SetMinRange(const Index: Integer; const Value: Byte); +var + Range: TJvIPAddressMinMax; begin - FRange[Index].Min := Value; + Range := FRange[Index]; + Range.Min := Value; + if Range.Max < Value then + Range.Max := Value; + Change(Index); end; @@ -876,7 +966,7 @@ FDataConnector := TJvIPAddressDataConnector.Create(Self); FRange := TJvIPAddressRange.Create(Self); - FAddressValues := TJvIPAddressValues.Create; + FAddressValues := TJvIPAddressValues.Create(Self); FAddressValues.OnChange := DoAddressChange; FAddressValues.OnChanging := DoAddressChanging; FTabThroughFields := True; @@ -889,8 +979,39 @@ for I := 0 to High(FEditControls) do FEditControls[I] := TJvIPEditControlHelper.Create(Self); + + FAddress.Address := JvIP4_127_0_0_1; end; +type + TReaderCracker = class (TReader) + public property PropName; + end; + +procedure TJvIPAddress.DFMSkipLegacyAddressValues(Reader: TReader); +begin + Reader.SkipValue; +end; + +procedure TJvIPAddress.DefineProperties(Filer: TFiler); +begin + inherited; + if Filer is TReader then + begin + { We do not care about writing, but should not break upon legacy triply redundant DFMs + If in some future Delphi, TReader cracking became impossible, properties will have to be skipped one by one + Legacy DFM extract sample (all those just duplicate direct .Address property): + AddressValues.Address = 16980708 + AddressValues.Value1 = 1 + AddressValues.Value2 = 3 + AddressValues.Value3 = 26 + AddressValues.Value4 = 228 + } + if StartsStr('AddressValues.', TReaderCracker(Filer).PropName) then + Filer.DefineProperty(TReaderCracker(Filer).PropName, DFMSkipLegacyAddressValues, nil,false); + end; +end; + destructor TJvIPAddress.Destroy; var I: Integer; @@ -930,10 +1051,8 @@ if FSaveBlank then ClearAddress else - begin - Perform(IPM_SETADDRESS, 0, FAddress); - FAddressValues.Address := FAddress; - end; + PushAddressToWindows; + if (FEditControlCount = 0) and (csDesigning in ComponentState) then begin // WM_PARENTNOTIFY messages are captured by the IDE starting when @@ -966,12 +1085,6 @@ end; end; -procedure TJvIPAddress.DestroyWnd; -begin - FSaveBlank := IsBlank; - inherited DestroyWnd; -end; - // Type used to get access to FindNextControl outside Forms.pas // This allows to fix Mantis 2812 type @@ -1103,13 +1216,6 @@ end;} end; -procedure TJvIPAddress.ClearAddress; -begin - if HandleAllocated then - Perform(IPM_CLEARADDRESS, 0, 0); - FAddressValues.Address := 0; -end; - procedure TJvIPAddress.ClearEditControls; var I: Integer; @@ -1143,22 +1249,28 @@ EnableWindow(FEditControls[I].Handle, Enabled and not (csDesigning in ComponentState)); end; +procedure TJvIPAddress.PushAddressToWindows; +begin // expected to be single point for this for possible platform updates/ports + if HandleAllocated then + Perform(IPM_SETADDRESS, 0, FAddress.Address); +end; + procedure TJvIPAddress.CNCommand(var Msg: TWMCommand); begin with Msg do case NotifyCode of EN_CHANGE: + if not FChanging then begin - Perform(IPM_GETADDRESS, 0, LPARAM(@FAddress)); - if not FChanging then - DoChange; + Perform(IPM_GETADDRESS, 0, LPARAM(@FAddress.Address)); + DoChange; end; EN_KILLFOCUS: begin FChanging := True; try - if not IsBlank then - Perform(IPM_SETADDRESS, 0, LPARAM(FAddress)); + if IsNotBlank then + PushAddressToWindows; finally FChanging := False; end; @@ -1224,13 +1336,42 @@ FOnFieldChange(Self, FieldIndex, FRange.FRange[FieldIndex], FieldValue); end; +procedure TJvIPAddress.DoNotSetRange(const Value: TJvIPAddressRange); +begin // do nothing, or maybe exception +end; + +function TJvIPAddress.IsNotBlank: Boolean; // for DFM storage +begin + Result := not IsBlank; +end; + function TJvIPAddress.IsBlank: Boolean; begin - Result := False; if HandleAllocated then - Result := SendMessage(Handle, IPM_ISBLANK, 0, 0) <> 0; + Result := SendMessage(Handle, IPM_ISBLANK, 0, 0) <> 0 + else + Result := FSaveBlank; end; +procedure TJvIPAddress.ClearAddress; +begin + if HandleAllocated then + Perform(IPM_CLEARADDRESS, 0, 0); + FSaveBlank := True; +end; + +procedure TJvIPAddress.SetBlank(const Value: boolean); +begin + if Value <> IsBlank then + begin + FSaveBlank := Value; + if Value then + ClearAddress + else + PushAddressToWindows; + end; +end; + function TJvIPAddress.CreateDataConnector: TJvIPAddressDataConnector; begin Result := TJvIPAddressDataConnector.Create(Self); @@ -1260,12 +1401,13 @@ procedure TJvIPAddress.SetAddress(const Value: LongWord); begin - if FAddress <> Value then + if AddressIsBlank or (FAddress.Address <> Value) then begin - FAddress := Value; - if HandleAllocated then - Perform(IPM_SETADDRESS, 0, FAddress); - FAddressValues.Address := Value; + FAddress.Address := Value; + FSaveBlank := False; + PushAddressToWindows; + // on Windows re-querying result is not needed, + // GDI will automatically send EN_Change notification after applying range end; end; @@ -1276,13 +1418,11 @@ procedure TJvIPAddress.UpdateValuesFromString(S: string); begin - with AddressValues do - begin - Value1 := StrToIntDef(StrToken(S, '.'), 0); - Value2 := StrToIntDef(StrToken(S, '.'), 0); - Value3 := StrToIntDef(StrToken(S, '.'), 0); - Value4 := StrToIntDef(S, 0); - end; + S := Trim(s); + AddressValue[1] := StrToIntDef(StrToken(S, '.'), 0); + AddressValue[2] := StrToIntDef(StrToken(S, '.'), 0); + AddressValue[3] := StrToIntDef(StrToken(S, '.'), 0); + AddressValue[4] := StrToIntDef(S, 0); end; { Added 03/05/2004 by Kai Gossens } @@ -1312,6 +1452,33 @@ inherited; end; +function TJvIPAddress.GetAddressValue(Component: TJvIP4AddressComponentIndex): Byte; +begin + Result := FAddress.Comps[5-Component]; +end; + +procedure TJvIPAddress.SetAddressValue(Component: TJvIP4AddressComponentIndex; + const Value: Byte); +var + AllowChange: Boolean; + Index: Integer; +begin + if AddressValue[Component] <> Value then + begin + Component := 5 - Component; // reversing to intel byte order + Index := Component - 1; + AllowChange := (Component >= Low(Component)) and (Component <= High(Component)) and + (Value >= FRange.FRange[Index].Min) and (Value <= FRange.FRange[Index].Max); + + if AllowChange then + begin + FAddress.Comps[Component] := Value; + PushAddressToWindows; + end; + end; +end; + + function TJvIPAddress.GetControlExtents: TRect; var ClientRect: TRect; @@ -1345,8 +1512,7 @@ UpdateValuesFromString(Msg.Text); // really long values for the text crashes the program (try: 127.0.0.8787787878787878), so we limit it here before it is set - with AddressValues do - Msg.Text := PChar(Format('%d.%d.%d.%d', [Value1, Value2, Value3, Value4])); + Msg.Text := PChar(Format('%d.%d.%d.%d', [AddressValue[1], AddressValue[2], AddressValue[3], AddressValue[4]])); inherited; end; @@ -1360,8 +1526,7 @@ // API, we simply use it to update the values of the AddressValues property // If we did not do this, then those values would not get updated as reported // in Mantis 2986. - if Assigned(AddressValues) then // prevent designtime AV in BDS 2006 - UpdateValuesFromString(Msg.Text); + UpdateValuesFromString(Msg.Text); end; procedure TJvIPAddress.WMParentNotify(var Msg: TWMParentNotify); @@ -3277,8 +3442,16 @@ end; end; -//=== { TJvIPAddressValues } ================================================= +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + +{ TJvIPAddressValues } + procedure TJvIPAddressValues.Change; begin if Assigned(FOnChange) then @@ -3292,63 +3465,35 @@ FOnChanging(Self, Index, Value, Result); end; -function TJvIPAddressValues.GetValue: Cardinal; +constructor TJvIPAddressValues.Create(AOwner: TJvIpAddress); begin - Result := MAKEIPADDRESS(FValues[0], FValues[1], FValues[2], FValues[3]); + inherited Create; + + FOwner := AOwner; end; +function TJvIPAddressValues.GetAddress: Cardinal; +begin + Result := FOwner.Address; +end; + function TJvIPAddressValues.GetValues(Index: Integer): Byte; begin - Result := FValues[Index]; + Result := FOwner.AddressValue[Index + 1]; end; -procedure TJvIPAddressValues.SetValue(const AValue: Cardinal); -var - FChange: Boolean; +procedure TJvIPAddressValues.SetAddress(const AValue: Cardinal); begin - FChange := False; - if GetValue <> AValue then - begin - if Changing(0, FIRST_IPADDRESS(AValue)) then - begin - FValues[0] := FIRST_IPADDRESS(AValue); - FChange := True; - end; - if Changing(1, SECOND_IPADDRESS(AValue)) then - begin - FValues[1] := SECOND_IPADDRESS(AValue); - FChange := True; - end; - if Changing(2, THIRD_IPADDRESS(AValue)) then - begin - FValues[2] := THIRD_IPADDRESS(AValue); - FChange := True; - end; - if Changing(3, FOURTH_IPADDRESS(AValue)) then - begin - FValues[3] := FOURTH_IPADDRESS(AValue); - FChange := True; - end; - if FChange then - Change; - end; + FOwner.Address := AValue; end; procedure TJvIPAddressValues.SetValues(Index: Integer; Value: Byte); begin - if (Index >= Low(FValues)) and (Index <= High(FValues)) and (FValues[Index] <> Value) then + if Changing(Index, Value) then begin - FValues[Index] := Value; + FOwner.AddressValue[Index + 1] := Value; Change; end; end; -{$IFDEF UNITVERSIONING} -initialization - RegisterUnitVersion(HInstance, UnitVersioning); - -finalization - UnregisterUnitVersion(HInstance); -{$ENDIF UNITVERSIONING} - end. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2012-06-12 15:43:08
|
Revision: 13333 http://jvcl.svn.sourceforge.net/jvcl/?rev=13333&view=rev Author: obones Date: 2012-06-12 15:42:57 +0000 (Tue, 12 Jun 2012) Log Message: ----------- Mantis 5657: Now shows the disabled state with colors Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2012-06-12 15:22:24 UTC (rev 13332) +++ trunk/jvcl/run/JvComCtrls.pas 2012-06-12 15:42:57 UTC (rev 13333) @@ -1,4 +1,4 @@ -{----------------------------------------------------------------------------- +{----------------------------------------------------------------------------- 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 @@ -198,6 +198,7 @@ procedure SetAddress(const Value: LongWord); procedure SetAddressValues(const Value: TJvIPAddressValues); procedure CNCommand(var Msg: TWMCommand); message CN_COMMAND; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY; procedure WMDestroy(var Msg: TWMNCDestroy); message WM_DESTROY; procedure WMParentNotify(var Msg: TWMParentNotify); message WM_PARENTNOTIFY; @@ -1227,6 +1228,22 @@ FEditControlCount := 0; end; +procedure TJvIPAddress.CMEnabledChanged(var Message: TMessage); +begin + inherited; + + if not Enabled then + begin + Color := clBtnFace; + Font.Color := clBtnShadow; + end + else + begin + Color := clWindow; + Font.Color := clWindowText; + end; +end; + procedure TJvIPAddress.ColorChanged; begin inherited ColorChanged; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2012-06-14 10:12:38
|
Revision: 13353 http://jvcl.svn.sourceforge.net/jvcl/?rev=13353&view=rev Author: obones Date: 2012-06-14 10:12:28 +0000 (Thu, 14 Jun 2012) Log Message: ----------- Mantis 5716: must reinitialize FSaveBlank Modified Paths: -------------- trunk/jvcl/run/JvComCtrls.pas Modified: trunk/jvcl/run/JvComCtrls.pas =================================================================== --- trunk/jvcl/run/JvComCtrls.pas 2012-06-14 09:21:26 UTC (rev 13352) +++ trunk/jvcl/run/JvComCtrls.pas 2012-06-14 10:12:28 UTC (rev 13353) @@ -1492,6 +1492,7 @@ begin FAddress.Comps[Component] := Value; PushAddressToWindows; + FSaveBlank := False; end; end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |