From: <ob...@us...> - 2010-11-09 14:38:38
|
Revision: 12893 http://jvcl.svn.sourceforge.net/jvcl/?rev=12893&view=rev Author: obones Date: 2010-11-09 14:38:32 +0000 (Tue, 09 Nov 2010) Log Message: ----------- Mantis 5304: Take care of over size rollouts Modified Paths: -------------- trunk/jvcl/run/JvRollOut.pas Modified: trunk/jvcl/run/JvRollOut.pas =================================================================== --- trunk/jvcl/run/JvRollOut.pas 2010-11-09 14:11:59 UTC (rev 12892) +++ trunk/jvcl/run/JvRollOut.pas 2010-11-09 14:38:32 UTC (rev 12893) @@ -55,11 +55,13 @@ JclUnitVersioning, {$ENDIF UNITVERSIONING} SysUtils, Classes, - Windows, Messages, Controls, Graphics, ImgList, ExtCtrls, ACtnList, + Windows, Forms, Messages, Controls, Graphics, ImgList, ExtCtrls, ACtnList, JvExtComponent, JvThemes; const CM_EXPANDED = WM_USER + 155; + DefaultButtonColor = clBtnFace; + DefaultHotTextColor = clWindowText; type TJvPlacement = (plTop, plLeft); @@ -88,8 +90,8 @@ published property ButtonBottom: TColor read FButtonBottom write SetButtonBottom default clBtnShadow; property ButtonTop: TColor read FButtonTop write SetButtonTop default clBtnHighlight; - property ButtonColor: TColor read FButtonColor write SetButtonColor default clBtnFace; - property HotTrackText: TColor read FHotTrackText write SetHotTrackText default clWindowText; + property ButtonColor: TColor read FButtonColor write SetButtonColor default DefaultButtonColor; + property HotTrackText: TColor read FHotTrackText write SetHotTrackText default DefaultHotTextColor; property Color: TColor read FColor write SetColor default clBtnFace; property FrameBottom: TColor read FFrameBottom write SetFrameBottom default clBtnHighlight; property FrameTop: TColor read FFrameTop write SetFrameTop default clBtnShadow; @@ -143,9 +145,21 @@ FImageOptions: TJvRollOutImageOptions; FToggleAnywhere: Boolean; FShowFocus: Boolean; - FTabStops: TStringList; + FChildControlVisibility: TStringList; + + FButtonFont: TFont; + FCollapsedList: array of Boolean; + FSmartExpand: Boolean; + FSmartShow: Boolean; + FTopForm: TForm; + FOldParent: TControl; + FOldPos: TPoint; + FOldWidthHeight: TPoint; + FOldAlign: TAlign; + procedure SetGroupIndex(Value: Integer); procedure SetPlacement(Value: TJvPlacement); + procedure WriteAWidth(Writer: TWriter); procedure WriteAHeight(Writer: TWriter); procedure WriteCWidth(Writer: TWriter); @@ -154,35 +168,33 @@ procedure ReadAHeight(Reader: TReader); procedure ReadCWidth(Reader: TReader); procedure ReadCHeight(Reader: TReader); + procedure SetCollapsed(Value: Boolean); procedure SetButtonHeight(Value: Integer); procedure SetChildOffset(Value: Integer); procedure RedrawControl(DrawAll: Boolean); procedure DrawButtonFrame; procedure UpdateGroup; + procedure SetExpandedSize(const Value: Integer); procedure CMExpanded(var Msg: TMessage); message CM_EXPANDED; procedure ChangeHeight(NewHeight: Integer); procedure ChangeWidth(NewWidth: Integer); procedure SetShowFocus(const Value: Boolean); + procedure SetButtonFont(const Value: TFont); + + procedure SetSmartExpand(const Value: Boolean); + procedure OnTopDeactivate(Sender : TObject); + procedure RestoreFromTopForm; + procedure PutOnForm; + function IsButtonFontStored: Boolean; protected - // Sets or gets the TabStop value of child controls depending on the value of Collapsed. - // When Collapsed is True, calls GetChildTabStops. - // When Collapsed is False, calls SetChildTabStops. - procedure CheckChildTabStops; - // Checks the TabStop value of all child controls and adds the control to - // an internal list if TabStop is True. TabStop is then set to False. - // This is done to disable tabbing into the child control when the rollout - // is collapsed. Normally, you don't need to call this method. - procedure GetChildTabStops; - // Resets the TabStop value of child controls to True if they where added to - // an internal list with a previous call to GetTabStops. - // Does nothing if GetChildTabStops hasn't been called. - // Normally, you don't need to call this method. - procedure SetChildTabStops; - // Clears the internal list with children TabStop values *without* restoring - // the childrens TabStop values first. - // Normally, you don't need to call this method. - procedure ClearChildTabStops; + // When the rollout-panel is collaped all contained controls are hidden + // to avoid tabbing into the child when the child is not visible or the + // rollout-caption-button being hidden by a contained control that is + // aligned tot he bottom + // The original visiblility of each control is restored then the rollout + // is expanded again + procedure CheckChildVisibility; procedure FocusKilled(NextWnd: THandle); override; procedure FocusSet(PrevWnd: THandle); override; @@ -204,6 +216,7 @@ procedure Click; override; procedure DoImageOptionsChange(Sender: TObject); procedure DoColorsChange(Sender: TObject); + property ButtonFont: TFont read FButtonFont write SetButtonFont stored IsButtonFontStored; property ButtonHeight: Integer read FButtonHeight write SetButtonHeight default 20; property ChildOffset: Integer read FChildOffset write SetChildOffset default 0; property Collapsed: Boolean read FCollapsed write SetCollapsed default False; @@ -213,6 +226,8 @@ property Placement: TJvPlacement read FPlacement write SetPlacement default plTop; property ShowFocus: Boolean read FShowFocus write SetShowFocus default True; property ToggleAnywhere: Boolean read FToggleAnywhere write FToggleAnywhere default True; + property SmartExpand: Boolean read FSmartExpand write SetSmartExpand default True; + property SmartShow: Boolean read FSmartShow write FSmartShow default True; property OnCollapse: TNotifyEvent read FOnCollapse write FOnCollapse; property OnExpand: TNotifyEvent read FOnExpand write FOnExpand; @@ -223,6 +238,8 @@ procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; procedure Collapse; virtual; procedure Expand; virtual; + + property ExpandedSize: Integer write SetExpandedSize stored False; end; TJvRollOutAction = class(TAction) @@ -250,6 +267,7 @@ property Align; property BevelWidth; property BorderWidth; + property ButtonFont; property ButtonHeight; property Caption; property ChildOffset; @@ -271,12 +289,13 @@ property PopupMenu; property ShowFocus; property ShowHint; + property SmartExpand; + property SmartShow; property TabOrder; property TabStop; property ToggleAnywhere; property Visible; property OnClick; - property OnDblClick; property OnDragDrop; property OnDragOver; property OnEndDrag; @@ -303,7 +322,7 @@ implementation uses - Forms, JvJVCLUtils; // for IsAccel() + JvJVCLUtils; // for IsAccel() // (p3) not used @@ -432,8 +451,8 @@ inherited Create; FButtonBottom := clBtnShadow; FButtonTop := clBtnHighlight; - FButtonColor := clBtnFace; - FHotTrackText := clWindowText; + FButtonColor := DefaultButtonColor; + FHotTrackText := DefaultHotTextColor; FColor := clBtnFace; FFrameBottom := clBtnHighlight; FFrameTop := clBtnShadow; @@ -534,12 +553,35 @@ FCWidth := 22; FCHeight := 22; FShowFocus := True; + + FButtonFont := TFont.Create; + FButtonFont.Name := 'Verdana'; + FButtonFont.Size := 7; + FButtonFont.Style := [fsBold]; + FButtonFont.Color := clWhite; + + // SmartExpand / SmartShow + FSmartExpand := True; + FSmartShow := True; + + FTopForm := TForm.Create(self); + with FTopForm do + begin + BorderStyle := bsNone; + FormStyle := fsStayOnTop; + OnDeactivate := OnTopDeactivate; + Position := poDesigned; + end; + FOldParent := nil; + + ControlStyle := ControlStyle - [csDoubleClicks]; // Doubleclicks are converted into single clicks end; destructor TJvCustomRollOut.Destroy; begin + FButtonFont.Free; FreeAndNil(FImageOptions); - FreeAndNil(FTabStops); + FreeAndNil(FChildControlVisibility); FreeAndNil(FColors); inherited Destroy; end; @@ -657,8 +699,13 @@ if FCollapsed <> Value then begin FCollapsed := Value; - if Value then + if FCollapsed then begin + // If Rollout panel was floating (= mapped onto a special form) + // -> restore old state + if FSmartShow and (FOldParent <> nil) then + RestoreFromTopForm; + if Placement = plTop then ChangeHeight(FCHeight) else @@ -674,7 +721,7 @@ DoExpand; UpdateGroup; end; - CheckChildTabStops; + CheckChildVisibility; end; end; @@ -713,13 +760,93 @@ end; procedure TJvCustomRollOut.DoExpand; +var + I: Integer; + OldSmartExpand: Boolean; begin + // Smart-Expand: If there's not enough space to expand the rollup-panel + // then collapse the other rollout-panels + if FSmartExpand then + begin + // Todo: SmartExpand was only made for panels that are bottom-aligned + + // Remember Collapsed status of all other TJvCustomRollOut components: + SetLength(FCollapsedList, 0); + if Assigned(Parent) and (Top + Height > Parent.Height) then + begin + for I := 0 to Parent.ControlCount-1 do + begin + if (Parent.Controls[I] is TJvCustomRollOut) and (Parent.Controls[I] <> Self) then + begin + SetLength(FCollapsedList, Length(FCollapsedList) + 1); + FCollapsedList[Length(FCollapsedList) - 1] := (Parent.Controls[I] as TJvCustomRollOut).Collapsed; + + // Disable SmartExpand because it may cause troubles!! + // especially when there is less space and another panel would be + // shown obove the window (smartshow) + OldSmartExpand := (Parent.Controls[I] as TJvCustomRollOut).SmartExpand; + (Parent.Controls[I] as TJvCustomRollOut).SmartExpand := False; + (Parent.Controls[I] as TJvCustomRollOut).Collapsed := True; + + (Parent.Controls[I] as TJvCustomRollOut).SmartExpand := OldSmartExpand; + end; + end; + end; + end; + + if FSmartShow then + PutOnForm; + if Assigned(FOnExpand) then FOnExpand(Self); end; procedure TJvCustomRollOut.DoCollapse; +var + ColIndex: Integer; + I : integer; + DoRestore: Boolean; begin + // Smart-Expand: If other rollouts where collapsed automatically when this rollout + // expanded, then their old collapsed-state is now restored + if FSmartExpand then + begin + DoRestore := Length(FCollapsedList)<>0; + + // Check if one of the auto-collapsed rollouts wad expanded manually + // In this case we do not restore the old collapsed-states + for I := 0 to Parent.ControlCount-1 do + begin + if (Parent.Controls[I] is TJvCustomRollOut) and + (Parent.Controls[I] <> Self) then + begin + if (Parent.Controls[I] as TJvCustomRollOut).Collapsed = False then + begin + DoRestore := False; + Break; + end; + end; + end; + + if DoRestore then + begin + // Restore other rollouts + ColIndex := 0; + for I := 0 to Parent.ControlCount - 1 do + begin + if (Parent.Controls[I] is TJvCustomRollOut) and (Parent.Controls[I] <> Self) then + begin + (Parent.Controls[I] as TJvCustomRollOut).Collapsed := FCollapsedList[ColIndex]; + Inc(ColIndex); + + if ColIndex > Length(FCollapsedList) then + Break; + end; + end; + end; + SetLength(FCollapsedList, 0); + end; + if Assigned(FOnCollapse) then FOnCollapse(Self); end; @@ -828,6 +955,70 @@ end; end; +procedure TJvCustomRollOut.SetSmartExpand(const Value: boolean); +begin + FSmartExpand := Value; + SetLength(FCollapsedList, 0); +end; + +// To make Setting of expanded size possible, even if panel is collapsed +procedure TJvCustomRollOut.SetExpandedSize(const Value: integer); +begin + if ((FPlacement = plTop) and (FAHeight = Value)) or + ((FPlacement = plLeft) and (FAWidth = Value)) then + Exit; + + if FPlacement = plTop then + FAHeight := Value + else + FAWidth := Value; + + if not FCollapsed then + begin + // The top form is assigned so set the width and height of this form + if Parent = FTopForm then + begin + FTopForm.DisableAlign; + if FPlacement = plTop then + begin + FTopForm.Height := FAHeight; + FOldWidthHeight.Y := FAHeight; + end + else + begin + FTopForm.Width := FAWidth; + FOldWidthHeight.X := FAWidth; + end; + FTopForm.EnableAlign; + end; + + if FPlacement = plTop then + ChangeHeight(FAHeight) + else + ChangeWidth(FAWidth); + + if (Parent = FTopForm) and (FOldPos.Y + Height < FOldParent.Height) then + RestoreFromTopForm + else + PutOnForm; + end; +end; + +procedure TJvCustomRollOut.SetButtonFont(const Value: TFont); +begin + FButtonFont.Assign(Value); + Invalidate; +end; + +// Only store button font if not default value +function TJvCustomRollOut.IsButtonFontStored: Boolean; +begin + Result := (FButtonFont.Name <> 'Verdana') or + (FButtonFont.Size <> 7) or + (FButtonFont.Style <> [fsBold]) or + (FButtonFont.Color <> clWhite); +end; + procedure TJvCustomRollOut.MouseEnter(Control: TControl); begin inherited MouseEnter(Control); @@ -900,6 +1091,7 @@ else FIndex := ImageOptions.IndexExpanded; + Canvas.Font.Assign(FButtonFont); R := FButtonRect; if FPlacement = plTop then begin @@ -925,7 +1117,6 @@ R.Top := ImageOptions.Offset * 2 + BevelWidth; R.Left := R.Left + (Canvas.TextHeight(Caption) + (FButtonRect.Right - FButtonRect.Left)) div 2 + BevelWidth div 2; end; - Canvas.Font := Font; if FInsideButton then Canvas.Font.Color := Colors.HotTrackText; @@ -1006,7 +1197,7 @@ if (Sender <> Self) then begin SetCollapsed(True); - CheckChildTabStops; + CheckChildVisibility; Invalidate; end; end; @@ -1077,14 +1268,14 @@ procedure TJvCustomRollOut.FocusKilled(NextWnd: THandle); begin - CheckChildTabStops; + CheckChildVisibility; inherited FocusKilled(NextWnd); Invalidate; end; procedure TJvCustomRollOut.FocusSet(PrevWnd: THandle); begin - CheckChildTabStops; + CheckChildVisibility; inherited FocusSet(PrevWnd); Invalidate; end; @@ -1099,51 +1290,123 @@ end; end; -procedure TJvCustomRollOut.CheckChildTabStops; +procedure TJvCustomRollOut.CheckChildVisibility; + procedure GetChildVisibility; + var + I: Integer; + begin + if FChildControlVisibility = nil then + begin + FChildControlVisibility := TStringList.Create; + FChildControlVisibility.Sorted := True; + end; + + for I := 0 to ControlCount - 1 do + if (Controls[I] is TWinControl) and (TWinControl(Controls[I]).Visible) then + begin + FChildControlVisibility.AddObject(Controls[I].Name, Controls[I]); + TWinControl(Controls[I]).Visible := False; + end; + end; + + procedure SetChildVisibility; + var + I: Integer; + begin + if FChildControlVisibility <> nil then + begin + for I := 0 to FChildControlVisibility.Count - 1 do + if FindChildControl(FChildControlVisibility[I]) <> nil then + TWinControl(FChildControlVisibility.Objects[I]).Visible := True; + FreeAndNil(FChildControlVisibility); + end; + end; begin if csDesigning in ComponentState then Exit; + if Collapsed then - GetChildTabStops + GetChildVisibility else - SetChildTabStops; + SetChildVisibility; end; -procedure TJvCustomRollOut.GetChildTabStops; +// Event handler called by the "TopWindow" when the window-rolloutpanel loses focus +// to automatically collapse panel again +procedure TJvCustomRollOut.OnTopDeactivate(Sender: TObject); +begin + if not FCollapsed then + RestoreFromTopForm; +// Collapse; // Use this line instead of the previous one if you want the rollout + // to collapse after the "topForm" lost focus +end; + +procedure TJvCustomRollOut.RestoreFromTopForm; var - I: Integer; + OldCollapsed: Boolean; begin - if FTabStops = nil then + if not FSmartShow then + Exit; + + // Rollout panel was mapped onto a special form (TopForm) + // -> restore old state + if Parent = FTopForm then begin - FTabStops := TStringList.Create; - FTabStops.Sorted := True; + FTopForm.OnDeactivate := nil; // Deactivate the Event to prevent + // calling this method a second time + FTopForm.Hide; + + OldCollapsed := FCollapsed; + FCollapsed := False; // Set control to expanded, so that SetBounds stores expanded dimesions + + // Set the control back to it's old position!! + Parent := FOldParent as TWinControl; + Align := FOldAlign; + SetBounds(FOldPos.X, FOldPos.Y, FOldWidthHeight.X, FOldWidthHeight.Y); + FOldParent := nil; + + FCollapsed := OldCollapsed; + FTopForm.OnDeactivate := OnTopDeactivate; // restore Event handling end; - for I := 0 to ControlCount - 1 do - if (Controls[I] is TWinControl) and (TWinControl(Controls[I]).TabStop) then - begin - FTabStops.AddObject(Controls[I].Name, Controls[I]); - TWinControl(Controls[I]).TabStop := False; - end; end; -procedure TJvCustomRollOut.SetChildTabStops; +// If expanded panel doesn't fit on parent form -> create a separate form +// so panel can be shown in it's full size: +procedure TJvCustomRollOut.PutOnForm; var - I: Integer; + ScrPos : TPoint; begin - if FTabStops <> nil then + // Remember old pos + if FSmartShow and not Assigned(FOldParent) then begin - for I := 0 to FTabStops.Count - 1 do - if FindChildControl(FTabStops[I]) <> nil then - TWinControl(FTabStops.Objects[I]).TabStop := True; - FreeAndNil(FTabStops); + // Don't Smart-Expand if parent form not visible + // (e.g. Collapsed-property is set from outside) + if (Owner is TForm) and not (Owner as TForm).Visible then + Exit; + + FOldPos := Point( Left, Top ); + FOldAlign := Align; + + if Top + Height > Parent.Height then + begin + // Save old size and position to be able to restore it + FOldParent:=Parent; + FOldWidthHeight:=Point(Width, Height); + + // set size of the special form + FTopForm.Width := Width; + FTopForm.Height := Height; + ScrPos := Parent.ClientToScreen(Point(Left, Top)); + FTopForm.Left := ScrPos.X; + FTopForm.Top := ScrPos.Y; + + Parent := FTopForm; + Align := alClient; + FTopForm.Show; + end; end; end; -procedure TJvCustomRollOut.ClearChildTabStops; -begin - FreeAndNil(FTabStops); -end; - //=== { TJvRollOutAction } =================================================== destructor TJvRollOutAction.Destroy; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2011-02-14 08:51:47
|
Revision: 12977 http://jvcl.svn.sourceforge.net/jvcl/?rev=12977&view=rev Author: ahuser Date: 2011-02-14 08:51:41 +0000 (Mon, 14 Feb 2011) Log Message: ----------- Fixed: Changing the ButtonFont didn't redraw the control Modified Paths: -------------- trunk/jvcl/run/JvRollOut.pas Modified: trunk/jvcl/run/JvRollOut.pas =================================================================== --- trunk/jvcl/run/JvRollOut.pas 2011-02-11 21:41:55 UTC (rev 12976) +++ trunk/jvcl/run/JvRollOut.pas 2011-02-14 08:51:41 UTC (rev 12977) @@ -216,6 +216,7 @@ procedure Click; override; procedure DoImageOptionsChange(Sender: TObject); procedure DoColorsChange(Sender: TObject); + procedure DoButtonFontChange(Sender: TObject); property ButtonFont: TFont read FButtonFont write SetButtonFont stored IsButtonFontStored; property ButtonHeight: Integer read FButtonHeight write SetButtonHeight default 20; property ChildOffset: Integer read FChildOffset write SetChildOffset default 0; @@ -559,6 +560,7 @@ FButtonFont.Size := 7; FButtonFont.Style := [fsBold]; FButtonFont.Color := clWhite; + FButtonFont.OnChange := DoButtonFontChange; // SmartExpand / SmartShow FSmartExpand := True; @@ -579,7 +581,7 @@ destructor TJvCustomRollOut.Destroy; begin - FButtonFont.Free; + FreeAndNil(FButtonFont); FreeAndNil(FImageOptions); FreeAndNil(FChildControlVisibility); FreeAndNil(FColors); @@ -647,13 +649,9 @@ procedure TJvCustomRollOut.RedrawControl(DrawAll: Boolean); begin if DrawAll then - begin - Invalidate; - end + Invalidate else - begin DrawButtonFrame; - end; end; procedure TJvCustomRollOut.SetGroupIndex(Value: Integer); @@ -1006,8 +1004,8 @@ procedure TJvCustomRollOut.SetButtonFont(const Value: TFont); begin - FButtonFont.Assign(Value); - Invalidate; + if Value <> FButtonFont then + FButtonFont.Assign(Value); end; // Only store button font if not default value @@ -1238,6 +1236,11 @@ RedrawControl(True); end; +procedure TJvCustomRollOut.DoButtonFontChange(Sender: TObject); +begin + Invalidate; +end; + procedure TJvCustomRollOut.Notification(AComponent: TComponent; Operation: TOperation); begin This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2011-05-13 08:41:40
|
Revision: 13026 http://jvcl.svn.sourceforge.net/jvcl/?rev=13026&view=rev Author: ahuser Date: 2011-05-13 08:41:33 +0000 (Fri, 13 May 2011) Log Message: ----------- clWhite text on clBtnFace background isn't that easy to read. Modified Paths: -------------- trunk/jvcl/run/JvRollOut.pas Modified: trunk/jvcl/run/JvRollOut.pas =================================================================== --- trunk/jvcl/run/JvRollOut.pas 2011-05-09 19:41:34 UTC (rev 13025) +++ trunk/jvcl/run/JvRollOut.pas 2011-05-13 08:41:33 UTC (rev 13026) @@ -559,7 +559,7 @@ FButtonFont.Name := 'Verdana'; FButtonFont.Size := 7; FButtonFont.Style := [fsBold]; - FButtonFont.Color := clWhite; + FButtonFont.Color := clWindowText; FButtonFont.OnChange := DoButtonFontChange; // SmartExpand / SmartShow @@ -1014,7 +1014,7 @@ Result := (FButtonFont.Name <> 'Verdana') or (FButtonFont.Size <> 7) or (FButtonFont.Style <> [fsBold]) or - (FButtonFont.Color <> clWhite); + (FButtonFont.Color <> clWindowText); end; procedure TJvCustomRollOut.MouseEnter(Control: TControl); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |