Menu

[r2000]: / trunk / Src / UUIWidgetImages.pas  Maximize  Restore  History

Download this file

188 lines (165 with data), 5.5 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
{
* UUIWidgetImages.pas
*
* Implements an abstract base class that provides a framework for classes that
* manage image lists containing images that are displayed in GUI widgets.
*
* $Rev$
* $Date$
*
* ***** BEGIN LICENSE BLOCK *****
*
* Version: MPL 1.1
*
* 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 http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is UUIWidgetImages.pas
*
* The Initial Developer of the Original Code is Peter Johnson
* (http://www.delphidabbler.com/).
*
* Portions created by the Initial Developer are Copyright (C) 2010 Peter
* Johnson. All Rights Reserved.
*
* Contributor(s)
* NONE
*
* ***** END LICENSE BLOCK *****
}
unit UUIWidgetImages;
interface
uses
// Delphi
Types, Classes, Controls, SyncObjs;
type
{
TUIWidgetImages:
Abstract base class that provides a framework for classes that manage image
lists containing images that are displayed in GUI widgets.
}
TUIWidgetImages = class abstract(TObject)
strict private
var
fImages: TImageList; // Value of Images property
fOwnsImages: Boolean; // Whether object owns (and frees) fImages
fLock: TSimpleEvent; // Signalling event to control access to Update
fOnChange: TNotifyEvent; // OnChange event handler
const
cLockTimeout = 10000; {10 secs} // Event signalling timeout
procedure ThemeChangeListener(Sender: TObject);
{Handles theme services change event. Updates images according to whether
themes are in use or not.
@param Sender [in] Not used.
}
procedure Update;
{Updates image list. Images used depend on whether themes are active.
}
strict protected
procedure RecreateImages; virtual; abstract;
{Descendants recreate the image list in this method. Images should take
account of whether themes are active.
}
function GetImageSize: TSize; virtual; abstract;
{Gets the size of a single UI widget image.
@return Required image size.
}
property Images: TImageList read fImages;
{References image list that contains the various UI widget images}
public
constructor Create(const AImages: TImageList; const AOwnsImages: Boolean);
{Object constructor. Sets up object.
@param AImages [in] Reference to image list that will contain the the UI
widget images.
@param AOwnsImages [in] True if this object owns, and frees, AImages and
False if caller maintains lifetime of AImages.
}
destructor Destroy; override;
{Object destructor. Tears down object and frees Images image list if
required.
}
property OnChange: TNotifyEvent
read fOnChange write fOnChange;
{Event triggered when image list changes, i.e. when themes change}
end;
implementation
uses
// Project
UThemesEx;
{ TUIWidgetImages }
constructor TUIWidgetImages.Create(const AImages: TImageList;
const AOwnsImages: Boolean);
{Object constructor. Sets up object.
@param AImages [in] Reference to image list that will contain the the UI
widget images.
@param AOwnsImages [in] True if this object owns, and frees, AImages and
False if caller maintains lifetime of AImages.
}
begin
Assert(Assigned(AImages), ClassName + '.Create: AImages is nil');
inherited Create;
fImages := AImages;
fOwnsImages := AOwnsImages;
fLock := TSimpleEvent.Create; // lock for protected sections: needed by Update
fLock.SetEvent;
Update;
ThemeServicesEx.AddChangeEventHandler(ThemeChangeListener);
end;
destructor TUIWidgetImages.Destroy;
{Object destructor. Tears down object and frees Images image list if required.
}
begin
ThemeServicesEx.RemoveChangeEventHandler(ThemeChangeListener);
if fOwnsImages then
fImages.Free;
fLock.Free;
inherited;
end;
procedure TUIWidgetImages.ThemeChangeListener(Sender: TObject);
{Handles theme services change event. Updates images according to whether
themes are in use or not.
@param Sender [in] Not used.
}
begin
Update;
end;
procedure TUIWidgetImages.Update;
{Updates image list. Images used depend on whether themes are active.
}
// ---------------------------------------------------------------------------
procedure UpdateImageListSize;
{Updates width and height of images stored in image list.
}
var
Size: TSize; // image size
begin
Size := GetImageSize;
Images.Width := Size.cx;
Images.Height := Size.cy;
end;
// ---------------------------------------------------------------------------
begin
// Wair for any lock to be opened
fLock.WaitFor(cLockTimeout);
// Close lock: this is used to prevent image list from being modified
// asynchronously
fLock.ResetEvent;
try
// Initialise image list
Images.Clear;
UpdateImageListSize;
RecreateImages;
finally
// Open lock: this permits modification of image list
fLock.SetEvent;
end;
// Trigger event notifying that check boxes have changed
if Assigned(fOnChange) then
fOnChange(Self);
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.