SHOW:
|
|
- or go back to the newest paste.
1 | Imports System | |
2 | Imports System.Windows.Forms | |
3 | Imports System.Drawing | |
4 | Imports System.Drawing.Drawing2D | |
5 | Imports System.Drawing.Text | |
6 | Imports System.ComponentModel | |
7 | Imports System.Collections.Generic | |
8 | Imports System.Text | |
9 | ||
10 | 'IMPORTANT: | |
11 | 'Please leave these comments in place as they help protect intellectual rights and allow | |
12 | 'developers to determine the version of the theme they are using. The preffered method | |
13 | 'of distributing this theme is through the Nimoru Software home page at nimoru.com. | |
14 | ||
15 | 'Name: Net Seal Theme | |
16 | 'Created: 6/21/2013 | |
17 | 'Version: 1.0.0.1 beta | |
18 | 'Site: http://nimoru.com/ | |
19 | ||
20 | 'This work is licensed under a Creative Commons Attribution 3.0 Unported License. | |
21 | 'To view a copy of this license, please visit http://creativecommons.org/licenses/by/3.0/ | |
22 | ||
23 | 'Copyright © 2013 Nimoru Software | |
24 | ||
25 | Module ThemeModule | |
26 | ||
27 | Friend G As Graphics | |
28 | ||
29 | Sub New() | |
30 | TextBitmap = New Bitmap(1, 1) | |
31 | TextGraphics = Graphics.FromImage(TextBitmap) | |
32 | End Sub | |
33 | ||
34 | Private TextBitmap As Bitmap | |
35 | Private TextGraphics As Graphics | |
36 | ||
37 | Friend Function MeasureString(text As String, font As Font) As SizeF | |
38 | Return TextGraphics.MeasureString(text, font) | |
39 | End Function | |
40 | ||
41 | Friend Function MeasureString(text As String, font As Font, width As Integer) As SizeF | |
42 | Return TextGraphics.MeasureString(text, font, width, StringFormat.GenericTypographic) | |
43 | End Function | |
44 | ||
45 | Private CreateRoundPath As GraphicsPath | |
46 | Private CreateRoundRectangle As Rectangle | |
47 | ||
48 | Friend Function CreateRound(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal slope As Integer) As GraphicsPath | |
49 | CreateRoundRectangle = New Rectangle(x, y, width, height) | |
50 | Return CreateRound(CreateRoundRectangle, slope) | |
51 | End Function | |
52 | ||
53 | Friend Function CreateRound(ByVal r As Rectangle, ByVal slope As Integer) As GraphicsPath | |
54 | CreateRoundPath = New GraphicsPath(FillMode.Winding) | |
55 | CreateRoundPath.AddArc(r.X, r.Y, slope, slope, 180.0F, 90.0F) | |
56 | CreateRoundPath.AddArc(r.Right - slope, r.Y, slope, slope, 270.0F, 90.0F) | |
57 | CreateRoundPath.AddArc(r.Right - slope, r.Bottom - slope, slope, slope, 0.0F, 90.0F) | |
58 | CreateRoundPath.AddArc(r.X, r.Bottom - slope, slope, slope, 90.0F, 90.0F) | |
59 | CreateRoundPath.CloseFigure() | |
60 | Return CreateRoundPath | |
61 | End Function | |
62 | ||
63 | End Module | |
64 | ||
65 | Class NSTheme | |
66 | Inherits ThemeContainer154 | |
67 | ||
68 | Private _AccentOffset As Integer = 42 | |
69 | Public Property AccentOffset() As Integer | |
70 | Get | |
71 | Return _AccentOffset | |
72 | End Get | |
73 | Set(ByVal value As Integer) | |
74 | _AccentOffset = value | |
75 | Invalidate() | |
76 | End Set | |
77 | End Property | |
78 | ||
79 | Sub New() | |
80 | Header = 30 | |
81 | BackColor = Color.FromArgb(50, 50, 50) | |
82 | ||
83 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
84 | P2 = New Pen(Color.FromArgb(60, 60, 60)) | |
85 | ||
86 | B1 = New SolidBrush(Color.FromArgb(50, 50, 50)) | |
87 | End Sub | |
88 | ||
89 | Protected Overrides Sub ColorHook() | |
90 | ||
91 | End Sub | |
92 | ||
93 | Private R1 As Rectangle | |
94 | ||
95 | Private P1, P2 As Pen | |
96 | Private B1 As SolidBrush | |
97 | ||
98 | Private Pad As Integer | |
99 | ||
100 | Protected Overrides Sub PaintHook() | |
101 | G.Clear(BackColor) | |
102 | DrawBorders(P2, 1) | |
103 | ||
104 | G.DrawLine(P1, 0, 26, Width, 26) | |
105 | G.DrawLine(P2, 0, 25, Width, 25) | |
106 | ||
107 | Pad = Math.Max(Measure().Width + 20, 80) | |
108 | R1 = New Rectangle(Pad, 17, Width - (Pad * 2) + _AccentOffset, 8) | |
109 | ||
110 | G.DrawRectangle(P2, R1) | |
111 | G.DrawRectangle(P1, R1.X + 1, R1.Y + 1, R1.Width - 2, R1.Height) | |
112 | ||
113 | G.DrawLine(P1, 0, 29, Width, 29) | |
114 | G.DrawLine(P2, 0, 30, Width, 30) | |
115 | ||
116 | DrawText(Brushes.Black, HorizontalAlignment.Left, 8, 1) | |
117 | DrawText(Brushes.White, HorizontalAlignment.Left, 7, 0) | |
118 | ||
119 | G.FillRectangle(B1, 0, 27, Width, 2) | |
120 | DrawBorders(Pens.Black) | |
121 | End Sub | |
122 | ||
123 | End Class | |
124 | ||
125 | Class NSButton | |
126 | Inherits Control | |
127 | ||
128 | Sub New() | |
129 | SetStyle(DirectCast(139286, ControlStyles), True) | |
130 | SetStyle(ControlStyles.Selectable, False) | |
131 | ||
132 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
133 | P2 = New Pen(Color.FromArgb(65, 65, 65)) | |
134 | End Sub | |
135 | ||
136 | Private IsMouseDown As Boolean | |
137 | ||
138 | Private GP1, GP2 As GraphicsPath | |
139 | ||
140 | Private SZ1 As SizeF | |
141 | Private PT1 As PointF | |
142 | ||
143 | Private P1, P2 As Pen | |
144 | ||
145 | Private PB1 As PathGradientBrush | |
146 | Private GB1 As LinearGradientBrush | |
147 | ||
148 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
149 | G = e.Graphics | |
150 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
151 | ||
152 | G.Clear(BackColor) | |
153 | G.SmoothingMode = SmoothingMode.AntiAlias | |
154 | ||
155 | GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7) | |
156 | GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7) | |
157 | ||
158 | If IsMouseDown Then | |
159 | PB1 = New PathGradientBrush(GP1) | |
160 | PB1.CenterColor = Color.FromArgb(60, 60, 60) | |
161 | PB1.SurroundColors = {Color.FromArgb(55, 55, 55)} | |
162 | PB1.FocusScales = New PointF(0.8F, 0.5F) | |
163 | ||
164 | G.FillPath(PB1, GP1) | |
165 | Else | |
166 | GB1 = New LinearGradientBrush(ClientRectangle, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F) | |
167 | G.FillPath(GB1, GP1) | |
168 | End If | |
169 | ||
170 | G.DrawPath(P1, GP1) | |
171 | G.DrawPath(P2, GP2) | |
172 | ||
173 | SZ1 = G.MeasureString(Text, Font) | |
174 | PT1 = New PointF(5, Height \ 2 - SZ1.Height / 2) | |
175 | ||
176 | If IsMouseDown Then | |
177 | PT1.X += 1.0F | |
178 | PT1.Y += 1.0F | |
179 | End If | |
180 | ||
181 | G.DrawString(Text, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1) | |
182 | G.DrawString(Text, Font, Brushes.White, PT1) | |
183 | End Sub | |
184 | ||
185 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
186 | IsMouseDown = True | |
187 | Invalidate() | |
188 | End Sub | |
189 | ||
190 | Protected Overrides Sub OnMouseUp(e As MouseEventArgs) | |
191 | IsMouseDown = False | |
192 | Invalidate() | |
193 | End Sub | |
194 | ||
195 | End Class | |
196 | ||
197 | Class NSProgressBar | |
198 | Inherits Control | |
199 | ||
200 | Private _Minimum As Integer | |
201 | Property Minimum() As Integer | |
202 | Get | |
203 | Return _Minimum | |
204 | End Get | |
205 | Set(ByVal value As Integer) | |
206 | If value < 0 Then | |
207 | Throw New Exception("Property value is not valid.") | |
208 | End If | |
209 | ||
210 | _Minimum = value | |
211 | If value > _Value Then _Value = value | |
212 | If value > _Maximum Then _Maximum = value | |
213 | Invalidate() | |
214 | End Set | |
215 | End Property | |
216 | ||
217 | Private _Maximum As Integer = 100 | |
218 | Property Maximum() As Integer | |
219 | Get | |
220 | Return _Maximum | |
221 | End Get | |
222 | Set(ByVal value As Integer) | |
223 | If value < 0 Then | |
224 | Throw New Exception("Property value is not valid.") | |
225 | End If | |
226 | ||
227 | _Maximum = value | |
228 | If value < _Value Then _Value = value | |
229 | If value < _Minimum Then _Minimum = value | |
230 | Invalidate() | |
231 | End Set | |
232 | End Property | |
233 | ||
234 | Private _Value As Integer | |
235 | Property Value() As Integer | |
236 | Get | |
237 | Return _Value | |
238 | End Get | |
239 | Set(ByVal value As Integer) | |
240 | If value > _Maximum OrElse value < _Minimum Then | |
241 | Throw New Exception("Property value is not valid.") | |
242 | End If | |
243 | ||
244 | _Value = value | |
245 | Invalidate() | |
246 | End Set | |
247 | End Property | |
248 | ||
249 | Private Sub Increment(ByVal amount As Integer) | |
250 | Value += amount | |
251 | End Sub | |
252 | ||
253 | Sub New() | |
254 | SetStyle(DirectCast(139286, ControlStyles), True) | |
255 | SetStyle(ControlStyles.Selectable, False) | |
256 | ||
257 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
258 | P2 = New Pen(Color.FromArgb(55, 55, 55)) | |
259 | B1 = New SolidBrush(Color.FromArgb(200, 160, 0)) | |
260 | End Sub | |
261 | ||
262 | Private GP1, GP2, GP3 As GraphicsPath | |
263 | ||
264 | Private R1, R2 As Rectangle | |
265 | ||
266 | Private P1, P2 As Pen | |
267 | Private B1 As SolidBrush | |
268 | Private GB1, GB2 As LinearGradientBrush | |
269 | ||
270 | Private I1 As Integer | |
271 | ||
272 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
273 | G = e.Graphics | |
274 | ||
275 | G.Clear(BackColor) | |
276 | G.SmoothingMode = SmoothingMode.AntiAlias | |
277 | ||
278 | GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7) | |
279 | GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7) | |
280 | ||
281 | R1 = New Rectangle(0, 2, Width - 1, Height - 1) | |
282 | GB1 = New LinearGradientBrush(R1, Color.FromArgb(45, 45, 45), Color.FromArgb(50, 50, 50), 90.0F) | |
283 | ||
284 | G.SetClip(GP1) | |
285 | G.FillRectangle(GB1, R1) | |
286 | ||
287 | I1 = CInt((_Value - _Minimum) / (_Maximum - _Minimum) * (Width - 3)) | |
288 | ||
289 | If I1 > 1 Then | |
290 | GP3 = CreateRound(1, 1, I1, Height - 3, 7) | |
291 | ||
292 | R2 = New Rectangle(1, 1, I1, Height - 3) | |
293 | GB2 = New LinearGradientBrush(R2, Color.FromArgb(205, 150, 0), Color.FromArgb(150, 110, 0), 90.0F) | |
294 | ||
295 | G.FillPath(GB2, GP3) | |
296 | G.DrawPath(P1, GP3) | |
297 | ||
298 | G.SetClip(GP3) | |
299 | G.SmoothingMode = SmoothingMode.None | |
300 | ||
301 | G.FillRectangle(B1, R2.X, R2.Y + 1, R2.Width, R2.Height \ 2) | |
302 | ||
303 | G.SmoothingMode = SmoothingMode.AntiAlias | |
304 | G.ResetClip() | |
305 | End If | |
306 | ||
307 | G.DrawPath(P2, GP1) | |
308 | G.DrawPath(P1, GP2) | |
309 | End Sub | |
310 | ||
311 | End Class | |
312 | ||
313 | Class NSLabel | |
314 | Inherits Control | |
315 | ||
316 | Sub New() | |
317 | SetStyle(DirectCast(139286, ControlStyles), True) | |
318 | SetStyle(ControlStyles.Selectable, False) | |
319 | ||
320 | Font = New Font("Segoe UI", 11.25F, FontStyle.Bold) | |
321 | ||
322 | B1 = New SolidBrush(Color.FromArgb(205, 150, 0)) | |
323 | End Sub | |
324 | ||
325 | Private _Value1 As String = "NET" | |
326 | Public Property Value1() As String | |
327 | Get | |
328 | Return _Value1 | |
329 | End Get | |
330 | Set(ByVal value As String) | |
331 | _Value1 = value | |
332 | Invalidate() | |
333 | End Set | |
334 | End Property | |
335 | ||
336 | Private _Value2 As String = "SEAL" | |
337 | Public Property Value2() As String | |
338 | Get | |
339 | Return _Value2 | |
340 | End Get | |
341 | Set(ByVal value As String) | |
342 | _Value2 = value | |
343 | Invalidate() | |
344 | End Set | |
345 | End Property | |
346 | ||
347 | Private B1 As SolidBrush | |
348 | ||
349 | Private PT1, PT2 As PointF | |
350 | Private SZ1, SZ2 As SizeF | |
351 | ||
352 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
353 | G = e.Graphics | |
354 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
355 | ||
356 | G.Clear(BackColor) | |
357 | ||
358 | SZ1 = G.MeasureString(Value1, Font, Width, StringFormat.GenericTypographic) | |
359 | SZ2 = G.MeasureString(Value2, Font, Width, StringFormat.GenericTypographic) | |
360 | ||
361 | PT1 = New PointF(0, Height \ 2 - SZ1.Height / 2) | |
362 | PT2 = New PointF(SZ1.Width + 1, Height \ 2 - SZ1.Height / 2) | |
363 | ||
364 | G.DrawString(Value1, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1) | |
365 | G.DrawString(Value1, Font, Brushes.White, PT1) | |
366 | ||
367 | G.DrawString(Value2, Font, Brushes.Black, PT2.X + 1, PT2.Y + 1) | |
368 | G.DrawString(Value2, Font, B1, PT2) | |
369 | End Sub | |
370 | ||
371 | End Class | |
372 | ||
373 | <DefaultEvent("TextChanged")> _ | |
374 | Class NSTextBox | |
375 | Inherits Control | |
376 | ||
377 | Private _TextAlign As HorizontalAlignment = HorizontalAlignment.Left | |
378 | Property TextAlign() As HorizontalAlignment | |
379 | Get | |
380 | Return _TextAlign | |
381 | End Get | |
382 | Set(ByVal value As HorizontalAlignment) | |
383 | _TextAlign = value | |
384 | If Base IsNot Nothing Then | |
385 | Base.TextAlign = value | |
386 | End If | |
387 | End Set | |
388 | End Property | |
389 | ||
390 | Private _MaxLength As Integer = 32767 | |
391 | Property MaxLength() As Integer | |
392 | Get | |
393 | Return _MaxLength | |
394 | End Get | |
395 | Set(ByVal value As Integer) | |
396 | _MaxLength = value | |
397 | If Base IsNot Nothing Then | |
398 | Base.MaxLength = value | |
399 | End If | |
400 | End Set | |
401 | End Property | |
402 | ||
403 | Private _ReadOnly As Boolean | |
404 | Property [ReadOnly]() As Boolean | |
405 | Get | |
406 | Return _ReadOnly | |
407 | End Get | |
408 | Set(ByVal value As Boolean) | |
409 | _ReadOnly = value | |
410 | If Base IsNot Nothing Then | |
411 | Base.ReadOnly = value | |
412 | End If | |
413 | End Set | |
414 | End Property | |
415 | ||
416 | Private _UseSystemPasswordChar As Boolean | |
417 | Property UseSystemPasswordChar() As Boolean | |
418 | Get | |
419 | Return _UseSystemPasswordChar | |
420 | End Get | |
421 | Set(ByVal value As Boolean) | |
422 | _UseSystemPasswordChar = value | |
423 | If Base IsNot Nothing Then | |
424 | Base.UseSystemPasswordChar = value | |
425 | End If | |
426 | End Set | |
427 | End Property | |
428 | ||
429 | Private _Multiline As Boolean | |
430 | Property Multiline() As Boolean | |
431 | Get | |
432 | Return _Multiline | |
433 | End Get | |
434 | Set(ByVal value As Boolean) | |
435 | _Multiline = value | |
436 | If Base IsNot Nothing Then | |
437 | Base.Multiline = value | |
438 | ||
439 | If value Then | |
440 | Base.Height = Height - 11 | |
441 | Else | |
442 | Height = Base.Height + 11 | |
443 | End If | |
444 | End If | |
445 | End Set | |
446 | End Property | |
447 | ||
448 | Overrides Property Text As String | |
449 | Get | |
450 | Return MyBase.Text | |
451 | End Get | |
452 | Set(ByVal value As String) | |
453 | MyBase.Text = value | |
454 | If Base IsNot Nothing Then | |
455 | Base.Text = value | |
456 | End If | |
457 | End Set | |
458 | End Property | |
459 | ||
460 | Overrides Property Font As Font | |
461 | Get | |
462 | Return MyBase.Font | |
463 | End Get | |
464 | Set(ByVal value As Font) | |
465 | MyBase.Font = value | |
466 | If Base IsNot Nothing Then | |
467 | Base.Font = value | |
468 | Base.Location = New Point(5, 5) | |
469 | Base.Width = Width - 8 | |
470 | ||
471 | If Not _Multiline Then | |
472 | Height = Base.Height + 11 | |
473 | End If | |
474 | End If | |
475 | End Set | |
476 | End Property | |
477 | ||
478 | Protected Overrides Sub OnHandleCreated(e As EventArgs) | |
479 | If Not Controls.Contains(Base) Then | |
480 | Controls.Add(Base) | |
481 | End If | |
482 | ||
483 | MyBase.OnHandleCreated(e) | |
484 | End Sub | |
485 | ||
486 | Private Base As TextBox | |
487 | Sub New() | |
488 | SetStyle(DirectCast(139286, ControlStyles), True) | |
489 | SetStyle(ControlStyles.Selectable, True) | |
490 | ||
491 | Cursor = Cursors.IBeam | |
492 | ||
493 | Base = New TextBox | |
494 | Base.Font = Font | |
495 | Base.Text = Text | |
496 | Base.MaxLength = _MaxLength | |
497 | Base.Multiline = _Multiline | |
498 | Base.ReadOnly = _ReadOnly | |
499 | Base.UseSystemPasswordChar = _UseSystemPasswordChar | |
500 | ||
501 | Base.ForeColor = Color.White | |
502 | Base.BackColor = Color.FromArgb(50, 50, 50) | |
503 | ||
504 | Base.BorderStyle = BorderStyle.None | |
505 | ||
506 | Base.Location = New Point(5, 5) | |
507 | Base.Width = Width - 14 | |
508 | ||
509 | If _Multiline Then | |
510 | Base.Height = Height - 11 | |
511 | Else | |
512 | Height = Base.Height + 11 | |
513 | End If | |
514 | ||
515 | AddHandler Base.TextChanged, AddressOf OnBaseTextChanged | |
516 | AddHandler Base.KeyDown, AddressOf OnBaseKeyDown | |
517 | ||
518 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
519 | P2 = New Pen(Color.FromArgb(55, 55, 55)) | |
520 | End Sub | |
521 | ||
522 | Private GP1, GP2 As GraphicsPath | |
523 | ||
524 | Private P1, P2 As Pen | |
525 | Private PB1 As PathGradientBrush | |
526 | ||
527 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
528 | G = e.Graphics | |
529 | ||
530 | G.Clear(BackColor) | |
531 | G.SmoothingMode = SmoothingMode.AntiAlias | |
532 | ||
533 | GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7) | |
534 | GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7) | |
535 | ||
536 | PB1 = New PathGradientBrush(GP1) | |
537 | PB1.CenterColor = Color.FromArgb(50, 50, 50) | |
538 | PB1.SurroundColors = {Color.FromArgb(45, 45, 45)} | |
539 | PB1.FocusScales = New PointF(0.9F, 0.5F) | |
540 | ||
541 | G.FillPath(PB1, GP1) | |
542 | ||
543 | G.DrawPath(P2, GP1) | |
544 | G.DrawPath(P1, GP2) | |
545 | End Sub | |
546 | ||
547 | Private Sub OnBaseTextChanged(ByVal s As Object, ByVal e As EventArgs) | |
548 | Text = Base.Text | |
549 | End Sub | |
550 | ||
551 | Private Sub OnBaseKeyDown(ByVal s As Object, ByVal e As KeyEventArgs) | |
552 | If e.Control AndAlso e.KeyCode = Keys.A Then | |
553 | Base.SelectAll() | |
554 | e.SuppressKeyPress = True | |
555 | End If | |
556 | End Sub | |
557 | ||
558 | Protected Overrides Sub OnResize(ByVal e As EventArgs) | |
559 | Base.Location = New Point(5, 5) | |
560 | ||
561 | Base.Width = Width - 10 | |
562 | Base.Height = Height - 11 | |
563 | ||
564 | MyBase.OnResize(e) | |
565 | End Sub | |
566 | ||
567 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
568 | Base.Focus() | |
569 | MyBase.OnMouseDown(e) | |
570 | End Sub | |
571 | ||
572 | Protected Overrides Sub OnEnter(e As EventArgs) | |
573 | Base.Focus() | |
574 | Invalidate() | |
575 | MyBase.OnEnter(e) | |
576 | End Sub | |
577 | ||
578 | Protected Overrides Sub OnLeave(e As EventArgs) | |
579 | Invalidate() | |
580 | MyBase.OnLeave(e) | |
581 | End Sub | |
582 | ||
583 | End Class | |
584 | ||
585 | <DefaultEvent("CheckedChanged")> _ | |
586 | Class NSCheckBox | |
587 | Inherits Control | |
588 | ||
589 | Event CheckedChanged(sender As Object) | |
590 | ||
591 | Sub New() | |
592 | SetStyle(DirectCast(139286, ControlStyles), True) | |
593 | SetStyle(ControlStyles.Selectable, False) | |
594 | ||
595 | P11 = New Pen(Color.FromArgb(55, 55, 55)) | |
596 | P22 = New Pen(Color.FromArgb(35, 35, 35)) | |
597 | P3 = New Pen(Color.Black, 2.0F) | |
598 | P4 = New Pen(Color.White, 2.0F) | |
599 | End Sub | |
600 | ||
601 | Private _Checked As Boolean | |
602 | Public Property Checked() As Boolean | |
603 | Get | |
604 | Return _Checked | |
605 | End Get | |
606 | Set(ByVal value As Boolean) | |
607 | _Checked = value | |
608 | RaiseEvent CheckedChanged(Me) | |
609 | ||
610 | Invalidate() | |
611 | End Set | |
612 | End Property | |
613 | ||
614 | Private GP1, GP2 As GraphicsPath | |
615 | ||
616 | Private SZ1 As SizeF | |
617 | Private PT1 As PointF | |
618 | ||
619 | Private P11, P22, P3, P4 As Pen | |
620 | ||
621 | Private PB1 As PathGradientBrush | |
622 | ||
623 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
624 | G = e.Graphics | |
625 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
626 | ||
627 | G.Clear(BackColor) | |
628 | G.SmoothingMode = SmoothingMode.AntiAlias | |
629 | ||
630 | GP1 = CreateRound(0, 2, Height - 5, Height - 5, 5) | |
631 | GP2 = CreateRound(1, 3, Height - 7, Height - 7, 5) | |
632 | ||
633 | PB1 = New PathGradientBrush(GP1) | |
634 | PB1.CenterColor = Color.FromArgb(50, 50, 50) | |
635 | PB1.SurroundColors = {Color.FromArgb(45, 45, 45)} | |
636 | PB1.FocusScales = New PointF(0.3F, 0.3F) | |
637 | ||
638 | G.FillPath(PB1, GP1) | |
639 | G.DrawPath(P11, GP1) | |
640 | G.DrawPath(P22, GP2) | |
641 | ||
642 | If _Checked Then | |
643 | G.DrawLine(P3, 5, Height - 9, 8, Height - 7) | |
644 | G.DrawLine(P3, 7, Height - 7, Height - 8, 7) | |
645 | ||
646 | G.DrawLine(P4, 4, Height - 10, 7, Height - 8) | |
647 | G.DrawLine(P4, 6, Height - 8, Height - 9, 6) | |
648 | End If | |
649 | ||
650 | SZ1 = G.MeasureString(Text, Font) | |
651 | PT1 = New PointF(Height - 3, Height \ 2 - SZ1.Height / 2) | |
652 | ||
653 | G.DrawString(Text, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1) | |
654 | G.DrawString(Text, Font, Brushes.White, PT1) | |
655 | End Sub | |
656 | ||
657 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
658 | Checked = Not Checked | |
659 | End Sub | |
660 | ||
661 | End Class | |
662 | ||
663 | <DefaultEvent("CheckedChanged")> _ | |
664 | Class NSRadioButton | |
665 | Inherits Control | |
666 | ||
667 | Event CheckedChanged(sender As Object) | |
668 | ||
669 | Sub New() | |
670 | SetStyle(DirectCast(139286, ControlStyles), True) | |
671 | SetStyle(ControlStyles.Selectable, False) | |
672 | ||
673 | P1 = New Pen(Color.FromArgb(55, 55, 55)) | |
674 | P2 = New Pen(Color.FromArgb(35, 35, 35)) | |
675 | End Sub | |
676 | ||
677 | Private _Checked As Boolean | |
678 | Public Property Checked() As Boolean | |
679 | Get | |
680 | Return _Checked | |
681 | End Get | |
682 | Set(ByVal value As Boolean) | |
683 | _Checked = value | |
684 | ||
685 | If _Checked Then | |
686 | InvalidateParent() | |
687 | End If | |
688 | ||
689 | RaiseEvent CheckedChanged(Me) | |
690 | Invalidate() | |
691 | End Set | |
692 | End Property | |
693 | ||
694 | Private Sub InvalidateParent() | |
695 | If Parent Is Nothing Then Return | |
696 | ||
697 | For Each C As Control In Parent.Controls | |
698 | If Not (C Is Me) AndAlso (TypeOf C Is NSRadioButton) Then | |
699 | DirectCast(C, NSRadioButton).Checked = False | |
700 | End If | |
701 | Next | |
702 | End Sub | |
703 | ||
704 | Private GP1 As GraphicsPath | |
705 | ||
706 | Private SZ1 As SizeF | |
707 | Private PT1 As PointF | |
708 | ||
709 | Private P1, P2 As Pen | |
710 | ||
711 | Private PB1 As PathGradientBrush | |
712 | ||
713 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
714 | G = e.Graphics | |
715 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
716 | ||
717 | G.Clear(BackColor) | |
718 | G.SmoothingMode = SmoothingMode.AntiAlias | |
719 | ||
720 | GP1 = New GraphicsPath | |
721 | GP1.AddEllipse(0, 2, Height - 5, Height - 5) | |
722 | ||
723 | PB1 = New PathGradientBrush(GP1) | |
724 | PB1.CenterColor = Color.FromArgb(50, 50, 50) | |
725 | PB1.SurroundColors = {Color.FromArgb(45, 45, 45)} | |
726 | PB1.FocusScales = New PointF(0.3F, 0.3F) | |
727 | ||
728 | G.FillPath(PB1, GP1) | |
729 | ||
730 | G.DrawEllipse(P1, 0, 2, Height - 5, Height - 5) | |
731 | G.DrawEllipse(P2, 1, 3, Height - 7, Height - 7) | |
732 | ||
733 | If _Checked Then | |
734 | G.FillEllipse(Brushes.Black, 6, 8, Height - 15, Height - 15) | |
735 | G.FillEllipse(Brushes.White, 5, 7, Height - 15, Height - 15) | |
736 | End If | |
737 | ||
738 | SZ1 = G.MeasureString(Text, Font) | |
739 | PT1 = New PointF(Height - 3, Height \ 2 - SZ1.Height / 2) | |
740 | ||
741 | G.DrawString(Text, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1) | |
742 | G.DrawString(Text, Font, Brushes.White, PT1) | |
743 | End Sub | |
744 | ||
745 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
746 | Checked = True | |
747 | MyBase.OnMouseDown(e) | |
748 | End Sub | |
749 | ||
750 | End Class | |
751 | ||
752 | Class NSComboBox | |
753 | Inherits ComboBox | |
754 | ||
755 | Sub New() | |
756 | SetStyle(DirectCast(139286, ControlStyles), True) | |
757 | SetStyle(ControlStyles.Selectable, False) | |
758 | ||
759 | DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed | |
760 | DropDownStyle = ComboBoxStyle.DropDownList | |
761 | ||
762 | BackColor = Color.FromArgb(50, 50, 50) | |
763 | ForeColor = Color.White | |
764 | ||
765 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
766 | P2 = New Pen(Color.White, 2.0F) | |
767 | P3 = New Pen(Brushes.Black, 2.0F) | |
768 | P4 = New Pen(Color.FromArgb(65, 65, 65)) | |
769 | ||
770 | B1 = New SolidBrush(Color.FromArgb(65, 65, 65)) | |
771 | B2 = New SolidBrush(Color.FromArgb(55, 55, 55)) | |
772 | End Sub | |
773 | ||
774 | Private GP1, GP2 As GraphicsPath | |
775 | ||
776 | Private SZ1 As SizeF | |
777 | Private PT1 As PointF | |
778 | ||
779 | Private P1, P2, P3, P4 As Pen | |
780 | Private B1, B2 As SolidBrush | |
781 | ||
782 | Private GB1 As LinearGradientBrush | |
783 | ||
784 | Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) | |
785 | G = e.Graphics | |
786 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
787 | ||
788 | G.Clear(BackColor) | |
789 | G.SmoothingMode = SmoothingMode.AntiAlias | |
790 | ||
791 | GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7) | |
792 | GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7) | |
793 | ||
794 | GB1 = New LinearGradientBrush(ClientRectangle, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F) | |
795 | G.SetClip(GP1) | |
796 | G.FillRectangle(GB1, ClientRectangle) | |
797 | G.ResetClip() | |
798 | ||
799 | G.DrawPath(P1, GP1) | |
800 | G.DrawPath(P4, GP2) | |
801 | ||
802 | SZ1 = G.MeasureString(Text, Font) | |
803 | PT1 = New PointF(5, Height \ 2 - SZ1.Height / 2) | |
804 | ||
805 | G.DrawString(Text, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1) | |
806 | G.DrawString(Text, Font, Brushes.White, PT1) | |
807 | ||
808 | G.DrawLine(P3, Width - 15, 10, Width - 11, 13) | |
809 | G.DrawLine(P3, Width - 7, 10, Width - 11, 13) | |
810 | G.DrawLine(Pens.Black, Width - 11, 13, Width - 11, 14) | |
811 | ||
812 | G.DrawLine(P2, Width - 16, 9, Width - 12, 12) | |
813 | G.DrawLine(P2, Width - 8, 9, Width - 12, 12) | |
814 | G.DrawLine(Pens.White, Width - 12, 12, Width - 12, 13) | |
815 | ||
816 | G.DrawLine(P1, Width - 22, 0, Width - 22, Height) | |
817 | G.DrawLine(P4, Width - 23, 1, Width - 23, Height - 2) | |
818 | G.DrawLine(P4, Width - 21, 1, Width - 21, Height - 2) | |
819 | End Sub | |
820 | ||
821 | Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs) | |
822 | e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
823 | ||
824 | If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then | |
825 | e.Graphics.FillRectangle(B1, e.Bounds) | |
826 | Else | |
827 | e.Graphics.FillRectangle(B2, e.Bounds) | |
828 | End If | |
829 | ||
830 | If Not e.Index = -1 Then | |
831 | e.Graphics.DrawString(GetItemText(Items(e.Index)), e.Font, Brushes.White, e.Bounds) | |
832 | End If | |
833 | End Sub | |
834 | ||
835 | End Class | |
836 | ||
837 | Class NSTabControl | |
838 | Inherits TabControl | |
839 | ||
840 | Sub New() | |
841 | SetStyle(DirectCast(139286, ControlStyles), True) | |
842 | SetStyle(ControlStyles.Selectable, False) | |
843 | ||
844 | SizeMode = TabSizeMode.Fixed | |
845 | Alignment = TabAlignment.Left | |
846 | ItemSize = New Size(28, 115) | |
847 | ||
848 | DrawMode = TabDrawMode.OwnerDrawFixed | |
849 | ||
850 | P1 = New Pen(Color.FromArgb(55, 55, 55)) | |
851 | P2 = New Pen(Color.FromArgb(35, 35, 35)) | |
852 | P3 = New Pen(Color.FromArgb(45, 45, 45), 2) | |
853 | ||
854 | B1 = New SolidBrush(Color.FromArgb(50, 50, 50)) | |
855 | B2 = New SolidBrush(Color.FromArgb(35, 35, 35)) | |
856 | B3 = New SolidBrush(Color.FromArgb(205, 150, 0)) | |
857 | B4 = New SolidBrush(Color.FromArgb(65, 65, 65)) | |
858 | ||
859 | SF1 = New StringFormat() | |
860 | SF1.LineAlignment = StringAlignment.Center | |
861 | End Sub | |
862 | ||
863 | Protected Overrides Sub OnControlAdded(e As ControlEventArgs) | |
864 | If TypeOf e.Control Is TabPage Then | |
865 | e.Control.BackColor = Color.FromArgb(50, 50, 50) | |
866 | End If | |
867 | ||
868 | MyBase.OnControlAdded(e) | |
869 | End Sub | |
870 | ||
871 | Private GP1, GP2, GP3, GP4 As GraphicsPath | |
872 | ||
873 | Private R1, R2 As Rectangle | |
874 | ||
875 | Private P1, P2, P3 As Pen | |
876 | Private B1, B2, B3, B4 As SolidBrush | |
877 | ||
878 | Private PB1 As PathGradientBrush | |
879 | ||
880 | Private TP1 As TabPage | |
881 | Private SF1 As StringFormat | |
882 | ||
883 | Private Offset As Integer | |
884 | Private ItemHeight As Integer | |
885 | ||
886 | Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) | |
887 | G = e.Graphics | |
888 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
889 | ||
890 | G.Clear(Color.FromArgb(50, 50, 50)) | |
891 | G.SmoothingMode = SmoothingMode.AntiAlias | |
892 | ||
893 | ItemHeight = ItemSize.Height + 2 | |
894 | ||
895 | GP1 = CreateRound(0, 0, ItemHeight + 3, Height - 1, 7) | |
896 | GP2 = CreateRound(1, 1, ItemHeight + 3, Height - 3, 7) | |
897 | ||
898 | PB1 = New PathGradientBrush(GP1) | |
899 | PB1.CenterColor = Color.FromArgb(50, 50, 50) | |
900 | PB1.SurroundColors = {Color.FromArgb(45, 45, 45)} | |
901 | PB1.FocusScales = New PointF(0.8F, 0.95F) | |
902 | ||
903 | G.FillPath(PB1, GP1) | |
904 | ||
905 | G.DrawPath(P1, GP1) | |
906 | G.DrawPath(P2, GP2) | |
907 | ||
908 | For I As Integer = 0 To TabCount - 1 | |
909 | R1 = GetTabRect(I) | |
910 | R1.Y += 2 | |
911 | R1.Height -= 3 | |
912 | R1.Width += 1 | |
913 | R1.X -= 1 | |
914 | ||
915 | TP1 = TabPages(I) | |
916 | Offset = 0 | |
917 | ||
918 | If SelectedIndex = I Then | |
919 | G.FillRectangle(B1, R1) | |
920 | ||
921 | For J As Integer = 0 To 1 | |
922 | G.FillRectangle(B2, R1.X + 5 + (J * 5), R1.Y + 6, 2, R1.Height - 9) | |
923 | ||
924 | G.SmoothingMode = SmoothingMode.None | |
925 | G.FillRectangle(B3, R1.X + 5 + (J * 5), R1.Y + 5, 2, R1.Height - 9) | |
926 | G.SmoothingMode = SmoothingMode.AntiAlias | |
927 | ||
928 | Offset += 5 | |
929 | Next | |
930 | ||
931 | G.DrawRectangle(P3, R1.X + 1, R1.Y - 1, R1.Width, R1.Height + 2) | |
932 | G.DrawRectangle(P1, R1.X + 1, R1.Y + 1, R1.Width - 2, R1.Height - 2) | |
933 | G.DrawRectangle(P2, R1) | |
934 | Else | |
935 | For J As Integer = 0 To 1 | |
936 | G.FillRectangle(B2, R1.X + 5 + (J * 5), R1.Y + 6, 2, R1.Height - 9) | |
937 | ||
938 | G.SmoothingMode = SmoothingMode.None | |
939 | G.FillRectangle(B4, R1.X + 5 + (J * 5), R1.Y + 5, 2, R1.Height - 9) | |
940 | G.SmoothingMode = SmoothingMode.AntiAlias | |
941 | ||
942 | Offset += 5 | |
943 | Next | |
944 | End If | |
945 | ||
946 | R1.X += 5 + Offset | |
947 | ||
948 | R2 = R1 | |
949 | R2.Y += 1 | |
950 | R2.X += 1 | |
951 | ||
952 | G.DrawString(TP1.Text, Font, Brushes.Black, R2, SF1) | |
953 | G.DrawString(TP1.Text, Font, Brushes.White, R1, SF1) | |
954 | Next | |
955 | ||
956 | GP3 = CreateRound(ItemHeight, 0, Width - ItemHeight - 1, Height - 1, 7) | |
957 | GP4 = CreateRound(ItemHeight + 1, 1, Width - ItemHeight - 3, Height - 3, 7) | |
958 | ||
959 | G.DrawPath(P2, GP3) | |
960 | G.DrawPath(P1, GP4) | |
961 | End Sub | |
962 | ||
963 | End Class | |
964 | ||
965 | <DefaultEvent("CheckedChanged")> _ | |
966 | Class NSOnOffBox | |
967 | Inherits Control | |
968 | ||
969 | Event CheckedChanged(sender As Object) | |
970 | ||
971 | Sub New() | |
972 | SetStyle(DirectCast(139286, ControlStyles), True) | |
973 | SetStyle(ControlStyles.Selectable, False) | |
974 | ||
975 | P1 = New Pen(Color.FromArgb(55, 55, 55)) | |
976 | P2 = New Pen(Color.FromArgb(35, 35, 35)) | |
977 | P3 = New Pen(Color.FromArgb(65, 65, 65)) | |
978 | ||
979 | B1 = New SolidBrush(Color.FromArgb(35, 35, 35)) | |
980 | B2 = New SolidBrush(Color.FromArgb(85, 85, 85)) | |
981 | B3 = New SolidBrush(Color.FromArgb(65, 65, 65)) | |
982 | B4 = New SolidBrush(Color.FromArgb(205, 150, 0)) | |
983 | B5 = New SolidBrush(Color.FromArgb(40, 40, 40)) | |
984 | ||
985 | SF1 = New StringFormat() | |
986 | SF1.LineAlignment = StringAlignment.Center | |
987 | SF1.Alignment = StringAlignment.Near | |
988 | ||
989 | SF2 = New StringFormat() | |
990 | SF2.LineAlignment = StringAlignment.Center | |
991 | SF2.Alignment = StringAlignment.Far | |
992 | ||
993 | Size = New Size(56, 24) | |
994 | MinimumSize = Size | |
995 | MaximumSize = Size | |
996 | End Sub | |
997 | ||
998 | Private _Checked As Boolean | |
999 | Public Property Checked() As Boolean | |
1000 | Get | |
1001 | Return _Checked | |
1002 | End Get | |
1003 | Set(ByVal value As Boolean) | |
1004 | _Checked = value | |
1005 | RaiseEvent CheckedChanged(Me) | |
1006 | ||
1007 | Invalidate() | |
1008 | End Set | |
1009 | End Property | |
1010 | ||
1011 | Private GP1, GP2, GP3, GP4 As GraphicsPath | |
1012 | ||
1013 | Private P1, P2, P3 As Pen | |
1014 | Private B1, B2, B3, B4, B5 As SolidBrush | |
1015 | ||
1016 | Private PB1 As PathGradientBrush | |
1017 | Private GB1 As LinearGradientBrush | |
1018 | ||
1019 | Private R1, R2, R3 As Rectangle | |
1020 | Private SF1, SF2 As StringFormat | |
1021 | ||
1022 | Private Offset As Integer | |
1023 | ||
1024 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
1025 | G = e.Graphics | |
1026 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
1027 | ||
1028 | G.Clear(BackColor) | |
1029 | G.SmoothingMode = SmoothingMode.AntiAlias | |
1030 | ||
1031 | GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7) | |
1032 | GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7) | |
1033 | ||
1034 | PB1 = New PathGradientBrush(GP1) | |
1035 | PB1.CenterColor = Color.FromArgb(50, 50, 50) | |
1036 | PB1.SurroundColors = {Color.FromArgb(45, 45, 45)} | |
1037 | PB1.FocusScales = New PointF(0.3F, 0.3F) | |
1038 | ||
1039 | G.FillPath(PB1, GP1) | |
1040 | G.DrawPath(P1, GP1) | |
1041 | G.DrawPath(P2, GP2) | |
1042 | ||
1043 | R1 = New Rectangle(5, 0, Width - 10, Height + 2) | |
1044 | R2 = New Rectangle(6, 1, Width - 10, Height + 2) | |
1045 | ||
1046 | R3 = New Rectangle(1, 1, (Width \ 2) - 1, Height - 3) | |
1047 | ||
1048 | If _Checked Then | |
1049 | G.DrawString("On", Font, Brushes.Black, R2, SF1) | |
1050 | G.DrawString("On", Font, Brushes.White, R1, SF1) | |
1051 | ||
1052 | R3.X += (Width \ 2) - 1 | |
1053 | Else | |
1054 | G.DrawString("Off", Font, B1, R2, SF2) | |
1055 | G.DrawString("Off", Font, B2, R1, SF2) | |
1056 | End If | |
1057 | ||
1058 | GP3 = CreateRound(R3, 7) | |
1059 | GP4 = CreateRound(R3.X + 1, R3.Y + 1, R3.Width - 2, R3.Height - 2, 7) | |
1060 | ||
1061 | GB1 = New LinearGradientBrush(ClientRectangle, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F) | |
1062 | ||
1063 | G.FillPath(GB1, GP3) | |
1064 | G.DrawPath(P2, GP3) | |
1065 | G.DrawPath(P3, GP4) | |
1066 | ||
1067 | Offset = R3.X + (R3.Width \ 2) - 3 | |
1068 | ||
1069 | For I As Integer = 0 To 1 | |
1070 | If _Checked Then | |
1071 | G.FillRectangle(B1, Offset + (I * 5), 7, 2, Height - 14) | |
1072 | Else | |
1073 | G.FillRectangle(B3, Offset + (I * 5), 7, 2, Height - 14) | |
1074 | End If | |
1075 | ||
1076 | G.SmoothingMode = SmoothingMode.None | |
1077 | ||
1078 | If _Checked Then | |
1079 | G.FillRectangle(B4, Offset + (I * 5), 7, 2, Height - 14) | |
1080 | Else | |
1081 | G.FillRectangle(B5, Offset + (I * 5), 7, 2, Height - 14) | |
1082 | End If | |
1083 | ||
1084 | G.SmoothingMode = SmoothingMode.AntiAlias | |
1085 | Next | |
1086 | End Sub | |
1087 | ||
1088 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
1089 | Checked = Not Checked | |
1090 | MyBase.OnMouseDown(e) | |
1091 | End Sub | |
1092 | ||
1093 | End Class | |
1094 | ||
1095 | Class NSControlButton | |
1096 | Inherits Control | |
1097 | ||
1098 | Enum Button As Byte | |
1099 | None = 0 | |
1100 | Minimize = 1 | |
1101 | MaximizeRestore = 2 | |
1102 | Close = 3 | |
1103 | End Enum | |
1104 | ||
1105 | Private _ControlButton As Button = Button.Close | |
1106 | Public Property ControlButton() As Button | |
1107 | Get | |
1108 | Return _ControlButton | |
1109 | End Get | |
1110 | Set(ByVal value As Button) | |
1111 | _ControlButton = value | |
1112 | Invalidate() | |
1113 | End Set | |
1114 | End Property | |
1115 | ||
1116 | Sub New() | |
1117 | SetStyle(DirectCast(139286, ControlStyles), True) | |
1118 | SetStyle(ControlStyles.Selectable, False) | |
1119 | ||
1120 | Anchor = AnchorStyles.Top Or AnchorStyles.Right | |
1121 | ||
1122 | Width = 18 | |
1123 | Height = 20 | |
1124 | ||
1125 | MinimumSize = Size | |
1126 | MaximumSize = Size | |
1127 | ||
1128 | Margin = New Padding(0) | |
1129 | End Sub | |
1130 | ||
1131 | Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) | |
1132 | G = e.Graphics | |
1133 | G.Clear(BackColor) | |
1134 | ||
1135 | Select Case _ControlButton | |
1136 | Case Button.Minimize | |
1137 | DrawMinimize(3, 10) | |
1138 | Case Button.MaximizeRestore | |
1139 | If FindForm().WindowState = FormWindowState.Normal Then | |
1140 | DrawMaximize(3, 5) | |
1141 | Else | |
1142 | DrawRestore(3, 4) | |
1143 | End If | |
1144 | Case Button.Close | |
1145 | DrawClose(4, 5) | |
1146 | End Select | |
1147 | End Sub | |
1148 | ||
1149 | Private Sub DrawMinimize(ByVal x As Integer, ByVal y As Integer) | |
1150 | G.FillRectangle(Brushes.White, x, y, 12, 5) | |
1151 | G.DrawRectangle(Pens.Black, x, y, 11, 4) | |
1152 | End Sub | |
1153 | ||
1154 | Private Sub DrawMaximize(ByVal x As Integer, ByVal y As Integer) | |
1155 | G.DrawRectangle(New Pen(Color.White, 2), x + 2, y + 2, 8, 6) | |
1156 | G.DrawRectangle(Pens.Black, x, y, 11, 9) | |
1157 | G.DrawRectangle(Pens.Black, x + 3, y + 3, 5, 3) | |
1158 | End Sub | |
1159 | ||
1160 | Private Sub DrawRestore(ByVal x As Integer, ByVal y As Integer) | |
1161 | G.FillRectangle(Brushes.White, x + 3, y + 1, 8, 4) | |
1162 | G.FillRectangle(Brushes.White, x + 7, y + 5, 4, 4) | |
1163 | G.DrawRectangle(Pens.Black, x + 2, y + 0, 9, 9) | |
1164 | ||
1165 | G.FillRectangle(Brushes.White, x + 1, y + 3, 2, 6) | |
1166 | G.FillRectangle(Brushes.White, x + 1, y + 9, 8, 2) | |
1167 | G.DrawRectangle(Pens.Black, x, y + 2, 9, 9) | |
1168 | G.DrawRectangle(Pens.Black, x + 3, y + 5, 3, 3) | |
1169 | End Sub | |
1170 | ||
1171 | Private ClosePath As GraphicsPath | |
1172 | Private Sub DrawClose(ByVal x As Integer, ByVal y As Integer) | |
1173 | If ClosePath Is Nothing Then | |
1174 | ClosePath = New GraphicsPath | |
1175 | ClosePath.AddLine(x + 1, y, x + 3, y) | |
1176 | ClosePath.AddLine(x + 5, y + 2, x + 7, y) | |
1177 | ClosePath.AddLine(x + 9, y, x + 10, y + 1) | |
1178 | ClosePath.AddLine(x + 7, y + 4, x + 7, y + 5) | |
1179 | ClosePath.AddLine(x + 10, y + 8, x + 9, y + 9) | |
1180 | ClosePath.AddLine(x + 7, y + 9, x + 5, y + 7) | |
1181 | ClosePath.AddLine(x + 3, y + 9, x + 1, y + 9) | |
1182 | ClosePath.AddLine(x + 0, y + 8, x + 3, y + 5) | |
1183 | ClosePath.AddLine(x + 3, y + 4, x + 0, y + 1) | |
1184 | End If | |
1185 | ||
1186 | G.FillPath(Brushes.White, ClosePath) | |
1187 | G.DrawPath(Pens.Black, ClosePath) | |
1188 | End Sub | |
1189 | ||
1190 | Protected Overrides Sub OnMouseClick(ByVal e As MouseEventArgs) | |
1191 | If e.Button = Windows.Forms.MouseButtons.Left Then | |
1192 | ||
1193 | Dim F As Form = FindForm() | |
1194 | ||
1195 | Select Case _ControlButton | |
1196 | Case Button.Minimize | |
1197 | F.WindowState = FormWindowState.Minimized | |
1198 | Case Button.MaximizeRestore | |
1199 | If F.WindowState = FormWindowState.Normal Then | |
1200 | F.WindowState = FormWindowState.Maximized | |
1201 | Else | |
1202 | F.WindowState = FormWindowState.Normal | |
1203 | End If | |
1204 | Case Button.Close | |
1205 | F.Close() | |
1206 | End Select | |
1207 | ||
1208 | End If | |
1209 | ||
1210 | Invalidate() | |
1211 | MyBase.OnMouseClick(e) | |
1212 | End Sub | |
1213 | ||
1214 | End Class | |
1215 | ||
1216 | Class NSGroupBox | |
1217 | Inherits ContainerControl | |
1218 | ||
1219 | Private _DrawSeperator As Boolean | |
1220 | Public Property DrawSeperator() As Boolean | |
1221 | Get | |
1222 | Return _DrawSeperator | |
1223 | End Get | |
1224 | Set(ByVal value As Boolean) | |
1225 | _DrawSeperator = value | |
1226 | Invalidate() | |
1227 | End Set | |
1228 | End Property | |
1229 | ||
1230 | Private _Title As String = "GroupBox" | |
1231 | Public Property Title() As String | |
1232 | Get | |
1233 | Return _Title | |
1234 | End Get | |
1235 | Set(ByVal value As String) | |
1236 | _Title = value | |
1237 | Invalidate() | |
1238 | End Set | |
1239 | End Property | |
1240 | ||
1241 | Private _SubTitle As String = "Details" | |
1242 | Public Property SubTitle() As String | |
1243 | Get | |
1244 | Return _SubTitle | |
1245 | End Get | |
1246 | Set(ByVal value As String) | |
1247 | _SubTitle = value | |
1248 | Invalidate() | |
1249 | End Set | |
1250 | End Property | |
1251 | ||
1252 | Private _TitleFont As Font | |
1253 | Private _SubTitleFont As Font | |
1254 | ||
1255 | Sub New() | |
1256 | SetStyle(DirectCast(139286, ControlStyles), True) | |
1257 | SetStyle(ControlStyles.Selectable, False) | |
1258 | ||
1259 | _TitleFont = New Font("Verdana", 10.0F) | |
1260 | _SubTitleFont = New Font("Verdana", 6.5F) | |
1261 | ||
1262 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
1263 | P2 = New Pen(Color.FromArgb(55, 55, 55)) | |
1264 | ||
1265 | B1 = New SolidBrush(Color.FromArgb(205, 150, 0)) | |
1266 | End Sub | |
1267 | ||
1268 | Private GP1, GP2 As GraphicsPath | |
1269 | ||
1270 | Private PT1 As PointF | |
1271 | Private SZ1, SZ2 As SizeF | |
1272 | ||
1273 | Private P1, P2 As Pen | |
1274 | Private B1 As SolidBrush | |
1275 | ||
1276 | Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) | |
1277 | G = e.Graphics | |
1278 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
1279 | ||
1280 | G.Clear(BackColor) | |
1281 | G.SmoothingMode = SmoothingMode.AntiAlias | |
1282 | ||
1283 | GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7) | |
1284 | GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7) | |
1285 | ||
1286 | G.DrawPath(P1, GP1) | |
1287 | G.DrawPath(P2, GP2) | |
1288 | ||
1289 | SZ1 = G.MeasureString(_Title, _TitleFont, Width, StringFormat.GenericTypographic) | |
1290 | SZ2 = G.MeasureString(_SubTitle, _SubTitleFont, Width, StringFormat.GenericTypographic) | |
1291 | ||
1292 | G.DrawString(_Title, _TitleFont, Brushes.Black, 6, 6) | |
1293 | G.DrawString(_Title, _TitleFont, B1, 5, 5) | |
1294 | ||
1295 | PT1 = New PointF(6.0F, SZ1.Height + 4.0F) | |
1296 | ||
1297 | G.DrawString(_SubTitle, _SubTitleFont, Brushes.Black, PT1.X + 1, PT1.Y + 1) | |
1298 | G.DrawString(_SubTitle, _SubTitleFont, Brushes.White, PT1.X, PT1.Y) | |
1299 | ||
1300 | If _DrawSeperator Then | |
1301 | Dim Y As Integer = CInt(PT1.Y + SZ2.Height) + 8 | |
1302 | ||
1303 | G.DrawLine(P1, 4, Y, Width - 5, Y) | |
1304 | G.DrawLine(P2, 4, Y + 1, Width - 5, Y + 1) | |
1305 | End If | |
1306 | End Sub | |
1307 | ||
1308 | End Class | |
1309 | ||
1310 | Class NSSeperator | |
1311 | Inherits Control | |
1312 | ||
1313 | Sub New() | |
1314 | SetStyle(DirectCast(139286, ControlStyles), True) | |
1315 | SetStyle(ControlStyles.Selectable, False) | |
1316 | ||
1317 | Height = 10 | |
1318 | ||
1319 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
1320 | P2 = New Pen(Color.FromArgb(55, 55, 55)) | |
1321 | End Sub | |
1322 | ||
1323 | Private P1, P2 As Pen | |
1324 | ||
1325 | Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) | |
1326 | G = e.Graphics | |
1327 | G.Clear(BackColor) | |
1328 | ||
1329 | G.DrawLine(P1, 0, 5, Width, 5) | |
1330 | G.DrawLine(P2, 0, 6, Width, 6) | |
1331 | End Sub | |
1332 | ||
1333 | End Class | |
1334 | ||
1335 | <DefaultEvent("Scroll")> _ | |
1336 | Class NSTrackBar | |
1337 | Inherits Control | |
1338 | ||
1339 | Event Scroll(ByVal sender As Object) | |
1340 | ||
1341 | Private _Minimum As Integer | |
1342 | Property Minimum() As Integer | |
1343 | Get | |
1344 | Return _Minimum | |
1345 | End Get | |
1346 | Set(ByVal value As Integer) | |
1347 | If value < 0 Then | |
1348 | Throw New Exception("Property value is not valid.") | |
1349 | End If | |
1350 | ||
1351 | _Minimum = value | |
1352 | If value > _Value Then _Value = value | |
1353 | If value > _Maximum Then _Maximum = value | |
1354 | Invalidate() | |
1355 | End Set | |
1356 | End Property | |
1357 | ||
1358 | Private _Maximum As Integer = 10 | |
1359 | Property Maximum() As Integer | |
1360 | Get | |
1361 | Return _Maximum | |
1362 | End Get | |
1363 | Set(ByVal value As Integer) | |
1364 | If value < 0 Then | |
1365 | Throw New Exception("Property value is not valid.") | |
1366 | End If | |
1367 | ||
1368 | _Maximum = value | |
1369 | If value < _Value Then _Value = value | |
1370 | If value < _Minimum Then _Minimum = value | |
1371 | Invalidate() | |
1372 | End Set | |
1373 | End Property | |
1374 | ||
1375 | Private _Value As Integer | |
1376 | Property Value() As Integer | |
1377 | Get | |
1378 | Return _Value | |
1379 | End Get | |
1380 | Set(ByVal value As Integer) | |
1381 | If value = _Value Then Return | |
1382 | ||
1383 | If value > _Maximum OrElse value < _Minimum Then | |
1384 | Throw New Exception("Property value is not valid.") | |
1385 | End If | |
1386 | ||
1387 | _Value = value | |
1388 | Invalidate() | |
1389 | ||
1390 | RaiseEvent Scroll(Me) | |
1391 | End Set | |
1392 | End Property | |
1393 | ||
1394 | Sub New() | |
1395 | SetStyle(DirectCast(139286, ControlStyles), True) | |
1396 | SetStyle(ControlStyles.Selectable, False) | |
1397 | ||
1398 | Height = 17 | |
1399 | ||
1400 | P1 = New Pen(Color.FromArgb(150, 110, 0), 2) | |
1401 | P2 = New Pen(Color.FromArgb(55, 55, 55)) | |
1402 | P3 = New Pen(Color.FromArgb(35, 35, 35)) | |
1403 | P4 = New Pen(Color.FromArgb(65, 65, 65)) | |
1404 | End Sub | |
1405 | ||
1406 | Private GP1, GP2, GP3, GP4 As GraphicsPath | |
1407 | ||
1408 | Private R1, R2, R3 As Rectangle | |
1409 | Private I1 As Integer | |
1410 | ||
1411 | Private P1, P2, P3, P4 As Pen | |
1412 | ||
1413 | Private GB1, GB2, GB3 As LinearGradientBrush | |
1414 | ||
1415 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
1416 | G = e.Graphics | |
1417 | ||
1418 | G.Clear(BackColor) | |
1419 | G.SmoothingMode = SmoothingMode.AntiAlias | |
1420 | ||
1421 | GP1 = CreateRound(0, 5, Width - 1, 10, 5) | |
1422 | GP2 = CreateRound(1, 6, Width - 3, 8, 5) | |
1423 | ||
1424 | R1 = New Rectangle(0, 7, Width - 1, 5) | |
1425 | GB1 = New LinearGradientBrush(R1, Color.FromArgb(45, 45, 45), Color.FromArgb(50, 50, 50), 90.0F) | |
1426 | ||
1427 | I1 = CInt((_Value - _Minimum) / (_Maximum - _Minimum) * (Width - 11)) | |
1428 | R2 = New Rectangle(I1, 0, 10, 20) | |
1429 | ||
1430 | G.SetClip(GP2) | |
1431 | G.FillRectangle(GB1, R1) | |
1432 | ||
1433 | R3 = New Rectangle(1, 7, R2.X + R2.Width - 2, 8) | |
1434 | GB2 = New LinearGradientBrush(R3, Color.FromArgb(205, 150, 0), Color.FromArgb(150, 110, 0), 90.0F) | |
1435 | ||
1436 | G.SmoothingMode = SmoothingMode.None | |
1437 | G.FillRectangle(GB2, R3) | |
1438 | G.SmoothingMode = SmoothingMode.AntiAlias | |
1439 | ||
1440 | For I As Integer = 0 To R3.Width - 15 Step 5 | |
1441 | G.DrawLine(P1, I, 0, I + 15, Height) | |
1442 | Next | |
1443 | ||
1444 | G.ResetClip() | |
1445 | ||
1446 | G.DrawPath(P2, GP1) | |
1447 | G.DrawPath(P3, GP2) | |
1448 | ||
1449 | GP3 = CreateRound(R2, 5) | |
1450 | GP4 = CreateRound(R2.X + 1, R2.Y + 1, R2.Width - 2, R2.Height - 2, 5) | |
1451 | GB3 = New LinearGradientBrush(ClientRectangle, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F) | |
1452 | ||
1453 | G.FillPath(GB3, GP3) | |
1454 | G.DrawPath(P3, GP3) | |
1455 | G.DrawPath(P4, GP4) | |
1456 | End Sub | |
1457 | ||
1458 | Private TrackDown As Boolean | |
1459 | Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs) | |
1460 | If e.Button = Windows.Forms.MouseButtons.Left Then | |
1461 | I1 = CInt((_Value - _Minimum) / (_Maximum - _Minimum) * (Width - 11)) | |
1462 | R2 = New Rectangle(I1, 0, 10, 20) | |
1463 | ||
1464 | TrackDown = R2.Contains(e.Location) | |
1465 | End If | |
1466 | ||
1467 | MyBase.OnMouseDown(e) | |
1468 | End Sub | |
1469 | ||
1470 | Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) | |
1471 | If TrackDown AndAlso e.X > -1 AndAlso e.X < (Width + 1) Then | |
1472 | Value = _Minimum + CInt((_Maximum - _Minimum) * (e.X / Width)) | |
1473 | End If | |
1474 | ||
1475 | MyBase.OnMouseMove(e) | |
1476 | End Sub | |
1477 | ||
1478 | Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs) | |
1479 | TrackDown = False | |
1480 | MyBase.OnMouseUp(e) | |
1481 | End Sub | |
1482 | ||
1483 | End Class | |
1484 | ||
1485 | <DefaultEvent("ValueChanged")> _ | |
1486 | Class NSRandomPool | |
1487 | Inherits Control | |
1488 | ||
1489 | Event ValueChanged(ByVal sender As Object) | |
1490 | ||
1491 | Private _Value As New StringBuilder | |
1492 | ReadOnly Property Value() As String | |
1493 | Get | |
1494 | Return _Value.ToString() | |
1495 | End Get | |
1496 | End Property | |
1497 | ||
1498 | Private _FullValue As String | |
1499 | ReadOnly Property FullValue() As String | |
1500 | Get | |
1501 | Return BitConverter.ToString(Table).Replace("-", "") | |
1502 | End Get | |
1503 | End Property | |
1504 | ||
1505 | Private RNG As New Random() | |
1506 | ||
1507 | Private ItemSize As Integer = 9 | |
1508 | Private DrawSize As Integer = 8 | |
1509 | ||
1510 | Private WA As Rectangle | |
1511 | ||
1512 | Private RowSize As Integer | |
1513 | Private ColumnSize As Integer | |
1514 | ||
1515 | Sub New() | |
1516 | SetStyle(DirectCast(139286, ControlStyles), True) | |
1517 | SetStyle(ControlStyles.Selectable, False) | |
1518 | ||
1519 | P1 = New Pen(Color.FromArgb(55, 55, 55)) | |
1520 | P2 = New Pen(Color.FromArgb(35, 35, 35)) | |
1521 | ||
1522 | B1 = New SolidBrush(Color.FromArgb(30, 30, 30)) | |
1523 | End Sub | |
1524 | ||
1525 | Protected Overrides Sub OnHandleCreated(e As EventArgs) | |
1526 | UpdateTable() | |
1527 | MyBase.OnHandleCreated(e) | |
1528 | End Sub | |
1529 | ||
1530 | Private Table As Byte() | |
1531 | Private Sub UpdateTable() | |
1532 | WA = New Rectangle(5, 5, Width - 10, Height - 10) | |
1533 | ||
1534 | RowSize = WA.Width \ ItemSize | |
1535 | ColumnSize = WA.Height \ ItemSize | |
1536 | ||
1537 | WA.Width = RowSize * ItemSize | |
1538 | WA.Height = ColumnSize * ItemSize | |
1539 | ||
1540 | WA.X = (Width \ 2) - (WA.Width \ 2) | |
1541 | WA.Y = (Height \ 2) - (WA.Height \ 2) | |
1542 | ||
1543 | Table = New Byte((RowSize * ColumnSize) - 1) {} | |
1544 | ||
1545 | For I As Integer = 0 To Table.Length - 1 | |
1546 | Table(I) = CByte(RNG.Next(100)) | |
1547 | Next | |
1548 | ||
1549 | Invalidate() | |
1550 | End Sub | |
1551 | ||
1552 | Protected Overrides Sub OnSizeChanged(e As EventArgs) | |
1553 | UpdateTable() | |
1554 | End Sub | |
1555 | ||
1556 | Private Index1 As Integer = -1 | |
1557 | Private Index2 As Integer | |
1558 | ||
1559 | Private InvertColors As Boolean | |
1560 | ||
1561 | Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) | |
1562 | HandleDraw(e) | |
1563 | End Sub | |
1564 | ||
1565 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
1566 | HandleDraw(e) | |
1567 | MyBase.OnMouseDown(e) | |
1568 | End Sub | |
1569 | ||
1570 | Private Sub HandleDraw(e As MouseEventArgs) | |
1571 | If e.Button = Windows.Forms.MouseButtons.Left OrElse e.Button = Windows.Forms.MouseButtons.Right Then | |
1572 | If Not WA.Contains(e.Location) Then Return | |
1573 | ||
1574 | InvertColors = (e.Button = Windows.Forms.MouseButtons.Right) | |
1575 | ||
1576 | Index1 = GetIndex(e.X, e.Y) | |
1577 | If Index1 = Index2 Then Return | |
1578 | ||
1579 | Dim L As Boolean = Not (Index1 Mod RowSize = 0) | |
1580 | Dim R As Boolean = Not (Index1 Mod RowSize = (RowSize - 1)) | |
1581 | ||
1582 | Randomize(Index1 - RowSize) | |
1583 | If L Then Randomize(Index1 - 1) | |
1584 | Randomize(Index1) | |
1585 | If R Then Randomize(Index1 + 1) | |
1586 | Randomize(Index1 + RowSize) | |
1587 | ||
1588 | _Value.Append(Table(Index1).ToString("X")) | |
1589 | If _Value.Length > 32 Then _Value.Remove(0, 2) | |
1590 | ||
1591 | RaiseEvent ValueChanged(Me) | |
1592 | ||
1593 | Index2 = Index1 | |
1594 | Invalidate() | |
1595 | End If | |
1596 | End Sub | |
1597 | ||
1598 | Private GP1, GP2 As GraphicsPath | |
1599 | ||
1600 | Private P1, P2 As Pen | |
1601 | Private B1, B2 As SolidBrush | |
1602 | ||
1603 | Private PB1 As PathGradientBrush | |
1604 | ||
1605 | Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) | |
1606 | G = e.Graphics | |
1607 | ||
1608 | G.Clear(BackColor) | |
1609 | G.SmoothingMode = SmoothingMode.AntiAlias | |
1610 | ||
1611 | GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7) | |
1612 | GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7) | |
1613 | ||
1614 | PB1 = New PathGradientBrush(GP1) | |
1615 | PB1.CenterColor = Color.FromArgb(50, 50, 50) | |
1616 | PB1.SurroundColors = {Color.FromArgb(45, 45, 45)} | |
1617 | PB1.FocusScales = New PointF(0.9F, 0.5F) | |
1618 | ||
1619 | G.FillPath(PB1, GP1) | |
1620 | ||
1621 | G.DrawPath(P1, GP1) | |
1622 | G.DrawPath(P2, GP2) | |
1623 | ||
1624 | G.SmoothingMode = SmoothingMode.None | |
1625 | ||
1626 | For I As Integer = 0 To Table.Length - 1 | |
1627 | Dim C As Integer = Math.Max(Table(I), 75) | |
1628 | ||
1629 | Dim X As Integer = ((I Mod RowSize) * ItemSize) + WA.X | |
1630 | Dim Y As Integer = ((I \ RowSize) * ItemSize) + WA.Y | |
1631 | ||
1632 | B2 = New SolidBrush(Color.FromArgb(C, C, C)) | |
1633 | ||
1634 | G.FillRectangle(B1, X + 1, Y + 1, DrawSize, DrawSize) | |
1635 | G.FillRectangle(B2, X, Y, DrawSize, DrawSize) | |
1636 | ||
1637 | B2.Dispose() | |
1638 | Next | |
1639 | ||
1640 | End Sub | |
1641 | ||
1642 | Private Function GetIndex(ByVal x As Integer, ByVal y As Integer) As Integer | |
1643 | Return (((y - WA.Y) \ ItemSize) * RowSize) + ((x - WA.X) \ ItemSize) | |
1644 | End Function | |
1645 | ||
1646 | Private Sub Randomize(ByVal index As Integer) | |
1647 | If index > -1 AndAlso index < Table.Length Then | |
1648 | If InvertColors Then | |
1649 | Table(index) = CByte(RNG.Next(100)) | |
1650 | Else | |
1651 | Table(index) = CByte(RNG.Next(100, 256)) | |
1652 | End If | |
1653 | End If | |
1654 | End Sub | |
1655 | ||
1656 | End Class | |
1657 | ||
1658 | Class NSKeyboard | |
1659 | Inherits Control | |
1660 | ||
1661 | Private TextBitmap As Bitmap | |
1662 | Private TextGraphics As Graphics | |
1663 | ||
1664 | Const LowerKeys As String = "1234567890-=qwertyuiop[]asdfghjkl\;'zxcvbnm,./`" | |
1665 | Const UpperKeys As String = "!@#$%^&*()_+QWERTYUIOP{}ASDFGHJKL|:""ZXCVBNM<>?~" | |
1666 | ||
1667 | Sub New() | |
1668 | SetStyle(DirectCast(139286, ControlStyles), True) | |
1669 | SetStyle(ControlStyles.Selectable, False) | |
1670 | ||
1671 | Font = New Font("Verdana", 8.25F) | |
1672 | ||
1673 | TextBitmap = New Bitmap(1, 1) | |
1674 | TextGraphics = Graphics.FromImage(TextBitmap) | |
1675 | ||
1676 | MinimumSize = New Size(386, 162) | |
1677 | MaximumSize = New Size(386, 162) | |
1678 | ||
1679 | Lower = LowerKeys.ToCharArray() | |
1680 | Upper = UpperKeys.ToCharArray() | |
1681 | ||
1682 | PrepareCache() | |
1683 | ||
1684 | P1 = New Pen(Color.FromArgb(45, 45, 45)) | |
1685 | P2 = New Pen(Color.FromArgb(65, 65, 65)) | |
1686 | P3 = New Pen(Color.FromArgb(35, 35, 35)) | |
1687 | ||
1688 | B1 = New SolidBrush(Color.FromArgb(100, 100, 100)) | |
1689 | End Sub | |
1690 | ||
1691 | Private _Target As Control | |
1692 | Public Property Target() As Control | |
1693 | Get | |
1694 | Return _Target | |
1695 | End Get | |
1696 | Set(ByVal value As Control) | |
1697 | _Target = value | |
1698 | End Set | |
1699 | End Property | |
1700 | ||
1701 | Private Shift As Boolean | |
1702 | ||
1703 | Private Pressed As Integer = -1 | |
1704 | Private Buttons As Rectangle() | |
1705 | ||
1706 | Private Lower As Char() | |
1707 | Private Upper As Char() | |
1708 | Private Other As String() = {"Shift", "Space", "Back"} | |
1709 | ||
1710 | Private UpperCache As PointF() | |
1711 | Private LowerCache As PointF() | |
1712 | ||
1713 | Private Sub PrepareCache() | |
1714 | Buttons = New Rectangle(50) {} | |
1715 | UpperCache = New PointF(Upper.Length - 1) {} | |
1716 | LowerCache = New PointF(Lower.Length - 1) {} | |
1717 | ||
1718 | Dim I As Integer | |
1719 | ||
1720 | Dim S As SizeF | |
1721 | Dim R As Rectangle | |
1722 | ||
1723 | For Y As Integer = 0 To 3 | |
1724 | For X As Integer = 0 To 11 | |
1725 | I = (Y * 12) + X | |
1726 | R = New Rectangle(X * 32, Y * 32, 32, 32) | |
1727 | ||
1728 | Buttons(I) = R | |
1729 | ||
1730 | If Not I = 47 AndAlso Not Char.IsLetter(Upper(I)) Then | |
1731 | S = TextGraphics.MeasureString(Upper(I), Font) | |
1732 | UpperCache(I) = New PointF(R.X + (R.Width \ 2 - S.Width / 2), R.Y + R.Height - S.Height - 2) | |
1733 | ||
1734 | S = TextGraphics.MeasureString(Lower(I), Font) | |
1735 | LowerCache(I) = New PointF(R.X + (R.Width \ 2 - S.Width / 2), R.Y + R.Height - S.Height - 2) | |
1736 | End If | |
1737 | Next | |
1738 | Next | |
1739 | ||
1740 | Buttons(48) = New Rectangle(0, 4 * 32, 2 * 32, 32) | |
1741 | Buttons(49) = New Rectangle(Buttons(48).Right, 4 * 32, 8 * 32, 32) | |
1742 | Buttons(50) = New Rectangle(Buttons(49).Right, 4 * 32, 2 * 32, 32) | |
1743 | End Sub | |
1744 | ||
1745 | Private GP1 As GraphicsPath | |
1746 | ||
1747 | Private SZ1 As SizeF | |
1748 | Private PT1 As PointF | |
1749 | ||
1750 | Private P1, P2, P3 As Pen | |
1751 | Private B1 As SolidBrush | |
1752 | ||
1753 | Private PB1 As PathGradientBrush | |
1754 | Private GB1 As LinearGradientBrush | |
1755 | ||
1756 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
1757 | G = e.Graphics | |
1758 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
1759 | ||
1760 | G.Clear(BackColor) | |
1761 | ||
1762 | Dim R As Rectangle | |
1763 | ||
1764 | Dim Offset As Integer | |
1765 | G.DrawRectangle(P1, 0, 0, (12 * 32) + 1, (5 * 32) + 1) | |
1766 | ||
1767 | For I As Integer = 0 To Buttons.Length - 1 | |
1768 | R = Buttons(I) | |
1769 | ||
1770 | Offset = 0 | |
1771 | If I = Pressed Then | |
1772 | Offset = 1 | |
1773 | ||
1774 | GP1 = New GraphicsPath() | |
1775 | GP1.AddRectangle(R) | |
1776 | ||
1777 | PB1 = New PathGradientBrush(GP1) | |
1778 | PB1.CenterColor = Color.FromArgb(60, 60, 60) | |
1779 | PB1.SurroundColors = {Color.FromArgb(55, 55, 55)} | |
1780 | PB1.FocusScales = New PointF(0.8F, 0.5F) | |
1781 | ||
1782 | G.FillPath(PB1, GP1) | |
1783 | Else | |
1784 | GB1 = New LinearGradientBrush(R, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F) | |
1785 | G.FillRectangle(GB1, R) | |
1786 | End If | |
1787 | ||
1788 | Select Case I | |
1789 | Case 48, 49, 50 | |
1790 | SZ1 = G.MeasureString(Other(I - 48), Font) | |
1791 | G.DrawString(Other(I - 48), Font, Brushes.Black, R.X + (R.Width \ 2 - SZ1.Width / 2) + Offset + 1, R.Y + (R.Height \ 2 - SZ1.Height / 2) + Offset + 1) | |
1792 | G.DrawString(Other(I - 48), Font, Brushes.White, R.X + (R.Width \ 2 - SZ1.Width / 2) + Offset, R.Y + (R.Height \ 2 - SZ1.Height / 2) + Offset) | |
1793 | Case 47 | |
1794 | DrawArrow(Color.Black, R.X + Offset + 1, R.Y + Offset + 1) | |
1795 | DrawArrow(Color.White, R.X + Offset, R.Y + Offset) | |
1796 | Case Else | |
1797 | If Shift Then | |
1798 | G.DrawString(Upper(I), Font, Brushes.Black, R.X + 3 + Offset + 1, R.Y + 2 + Offset + 1) | |
1799 | G.DrawString(Upper(I), Font, Brushes.White, R.X + 3 + Offset, R.Y + 2 + Offset) | |
1800 | ||
1801 | If Not Char.IsLetter(Lower(I)) Then | |
1802 | PT1 = LowerCache(I) | |
1803 | G.DrawString(Lower(I), Font, B1, PT1.X + Offset, PT1.Y + Offset) | |
1804 | End If | |
1805 | Else | |
1806 | G.DrawString(Lower(I), Font, Brushes.Black, R.X + 3 + Offset + 1, R.Y + 2 + Offset + 1) | |
1807 | G.DrawString(Lower(I), Font, Brushes.White, R.X + 3 + Offset, R.Y + 2 + Offset) | |
1808 | ||
1809 | If Not Char.IsLetter(Upper(I)) Then | |
1810 | PT1 = UpperCache(I) | |
1811 | G.DrawString(Upper(I), Font, B1, PT1.X + Offset, PT1.Y + Offset) | |
1812 | End If | |
1813 | End If | |
1814 | End Select | |
1815 | ||
1816 | G.DrawRectangle(P2, R.X + 1 + Offset, R.Y + 1 + Offset, R.Width - 2, R.Height - 2) | |
1817 | G.DrawRectangle(P3, R.X + Offset, R.Y + Offset, R.Width, R.Height) | |
1818 | ||
1819 | If I = Pressed Then | |
1820 | G.DrawLine(P1, R.X, R.Y, R.Right, R.Y) | |
1821 | G.DrawLine(P1, R.X, R.Y, R.X, R.Bottom) | |
1822 | End If | |
1823 | Next | |
1824 | End Sub | |
1825 | ||
1826 | Private Sub DrawArrow(color As Color, rx As Integer, ry As Integer) | |
1827 | Dim R As New Rectangle(rx + 8, ry + 8, 16, 16) | |
1828 | G.SmoothingMode = SmoothingMode.AntiAlias | |
1829 | ||
1830 | Dim P As New Pen(color, 1) | |
1831 | Dim C As New AdjustableArrowCap(3, 2) | |
1832 | P.CustomEndCap = C | |
1833 | ||
1834 | G.DrawArc(P, R, 0.0F, 290.0F) | |
1835 | ||
1836 | P.Dispose() | |
1837 | C.Dispose() | |
1838 | G.SmoothingMode = SmoothingMode.None | |
1839 | End Sub | |
1840 | ||
1841 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
1842 | Dim Index As Integer = ((e.Y \ 32) * 12) + (e.X \ 32) | |
1843 | ||
1844 | If Index > 47 Then | |
1845 | For I As Integer = 48 To Buttons.Length - 1 | |
1846 | If Buttons(I).Contains(e.X, e.Y) Then | |
1847 | Pressed = I | |
1848 | Exit For | |
1849 | End If | |
1850 | Next | |
1851 | Else | |
1852 | Pressed = Index | |
1853 | End If | |
1854 | ||
1855 | HandleKey() | |
1856 | Invalidate() | |
1857 | End Sub | |
1858 | ||
1859 | Protected Overrides Sub OnMouseUp(e As MouseEventArgs) | |
1860 | Pressed = -1 | |
1861 | Invalidate() | |
1862 | End Sub | |
1863 | ||
1864 | Private Sub HandleKey() | |
1865 | If _Target Is Nothing Then Return | |
1866 | If Pressed = -1 Then Return | |
1867 | ||
1868 | Select Case Pressed | |
1869 | Case 47 | |
1870 | _Target.Text = String.Empty | |
1871 | Case 48 | |
1872 | Shift = Not Shift | |
1873 | Case 49 | |
1874 | _Target.Text &= " " | |
1875 | Case 50 | |
1876 | If Not _Target.Text.Length = 0 Then | |
1877 | _Target.Text = _Target.Text.Remove(_Target.Text.Length - 1) | |
1878 | End If | |
1879 | Case Else | |
1880 | If Shift Then | |
1881 | _Target.Text &= Upper(Pressed) | |
1882 | Else | |
1883 | _Target.Text &= Lower(Pressed) | |
1884 | End If | |
1885 | End Select | |
1886 | End Sub | |
1887 | ||
1888 | End Class | |
1889 | ||
1890 | <DefaultEvent("SelectedIndexChanged")> _ | |
1891 | Class NSPaginator | |
1892 | Inherits Control | |
1893 | ||
1894 | Public Event SelectedIndexChanged(sender As Object, e As EventArgs) | |
1895 | ||
1896 | Private TextBitmap As Bitmap | |
1897 | Private TextGraphics As Graphics | |
1898 | ||
1899 | Sub New() | |
1900 | SetStyle(DirectCast(139286, ControlStyles), True) | |
1901 | SetStyle(ControlStyles.Selectable, False) | |
1902 | ||
1903 | Size = New Size(202, 26) | |
1904 | ||
1905 | TextBitmap = New Bitmap(1, 1) | |
1906 | TextGraphics = Graphics.FromImage(TextBitmap) | |
1907 | ||
1908 | InvalidateItems() | |
1909 | ||
1910 | B1 = New SolidBrush(Color.FromArgb(50, 50, 50)) | |
1911 | B2 = New SolidBrush(Color.FromArgb(55, 55, 55)) | |
1912 | ||
1913 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
1914 | P2 = New Pen(Color.FromArgb(55, 55, 55)) | |
1915 | P3 = New Pen(Color.FromArgb(65, 65, 65)) | |
1916 | End Sub | |
1917 | ||
1918 | Private _SelectedIndex As Integer | |
1919 | Public Property SelectedIndex() As Integer | |
1920 | Get | |
1921 | Return _SelectedIndex | |
1922 | End Get | |
1923 | Set(ByVal value As Integer) | |
1924 | _SelectedIndex = Math.Max(Math.Min(value, MaximumIndex), 0) | |
1925 | Invalidate() | |
1926 | End Set | |
1927 | End Property | |
1928 | ||
1929 | Private _NumberOfPages As Integer | |
1930 | Public Property NumberOfPages() As Integer | |
1931 | Get | |
1932 | Return _NumberOfPages | |
1933 | End Get | |
1934 | Set(ByVal value As Integer) | |
1935 | _NumberOfPages = value | |
1936 | _SelectedIndex = Math.Max(Math.Min(_SelectedIndex, MaximumIndex), 0) | |
1937 | Invalidate() | |
1938 | End Set | |
1939 | End Property | |
1940 | ||
1941 | Public ReadOnly Property MaximumIndex As Integer | |
1942 | Get | |
1943 | Return NumberOfPages - 1 | |
1944 | End Get | |
1945 | End Property | |
1946 | ||
1947 | Private ItemWidth As Integer | |
1948 | ||
1949 | Public Overrides Property Font As Font | |
1950 | Get | |
1951 | Return MyBase.Font | |
1952 | End Get | |
1953 | Set(value As Font) | |
1954 | MyBase.Font = value | |
1955 | ||
1956 | InvalidateItems() | |
1957 | Invalidate() | |
1958 | End Set | |
1959 | End Property | |
1960 | ||
1961 | Private Sub InvalidateItems() | |
1962 | Dim S As Size = TextGraphics.MeasureString("000 ..", Font).ToSize() | |
1963 | ItemWidth = S.Width + 10 | |
1964 | End Sub | |
1965 | ||
1966 | Private GP1, GP2 As GraphicsPath | |
1967 | ||
1968 | Private R1 As Rectangle | |
1969 | ||
1970 | Private SZ1 As Size | |
1971 | Private PT1 As Point | |
1972 | ||
1973 | Private P1, P2, P3 As Pen | |
1974 | Private B1, B2 As SolidBrush | |
1975 | ||
1976 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
1977 | G = e.Graphics | |
1978 | G.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit | |
1979 | ||
1980 | G.Clear(BackColor) | |
1981 | G.SmoothingMode = SmoothingMode.AntiAlias | |
1982 | ||
1983 | Dim LeftEllipse, RightEllipse As Boolean | |
1984 | ||
1985 | If _SelectedIndex < 4 Then | |
1986 | For I As Integer = 0 To Math.Min(MaximumIndex, 4) | |
1987 | RightEllipse = (I = 4) AndAlso (MaximumIndex > 4) | |
1988 | DrawBox(I * ItemWidth, I, False, RightEllipse) | |
1989 | Next | |
1990 | ElseIf _SelectedIndex > 3 AndAlso _SelectedIndex < (MaximumIndex - 3) Then | |
1991 | For I As Integer = 0 To 4 | |
1992 | LeftEllipse = (I = 0) | |
1993 | RightEllipse = (I = 4) | |
1994 | DrawBox(I * ItemWidth, _SelectedIndex + I - 2, LeftEllipse, RightEllipse) | |
1995 | Next | |
1996 | Else | |
1997 | For I As Integer = 0 To 4 | |
1998 | LeftEllipse = (I = 0) AndAlso (MaximumIndex > 4) | |
1999 | DrawBox(I * ItemWidth, MaximumIndex - (4 - I), LeftEllipse, False) | |
2000 | Next | |
2001 | End If | |
2002 | End Sub | |
2003 | ||
2004 | Private Sub DrawBox(x As Integer, index As Integer, leftEllipse As Boolean, rightEllipse As Boolean) | |
2005 | R1 = New Rectangle(x, 0, ItemWidth - 4, Height - 1) | |
2006 | ||
2007 | GP1 = CreateRound(R1, 7) | |
2008 | GP2 = CreateRound(R1.X + 1, R1.Y + 1, R1.Width - 2, R1.Height - 2, 7) | |
2009 | ||
2010 | Dim T As String = CStr(index + 1) | |
2011 | ||
2012 | If leftEllipse Then T = ".. " & T | |
2013 | If rightEllipse Then T = T & " .." | |
2014 | ||
2015 | SZ1 = G.MeasureString(T, Font).ToSize() | |
2016 | PT1 = New Point(R1.X + (R1.Width \ 2 - SZ1.Width \ 2), R1.Y + (R1.Height \ 2 - SZ1.Height \ 2)) | |
2017 | ||
2018 | If index = _SelectedIndex Then | |
2019 | G.FillPath(B1, GP1) | |
2020 | ||
2021 | Dim F As New Font(Font, FontStyle.Underline) | |
2022 | G.DrawString(T, F, Brushes.Black, PT1.X + 1, PT1.Y + 1) | |
2023 | G.DrawString(T, F, Brushes.White, PT1) | |
2024 | F.Dispose() | |
2025 | ||
2026 | G.DrawPath(P1, GP2) | |
2027 | G.DrawPath(P2, GP1) | |
2028 | Else | |
2029 | G.FillPath(B2, GP1) | |
2030 | ||
2031 | G.DrawString(T, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1) | |
2032 | G.DrawString(T, Font, Brushes.White, PT1) | |
2033 | ||
2034 | G.DrawPath(P3, GP2) | |
2035 | G.DrawPath(P1, GP1) | |
2036 | End If | |
2037 | End Sub | |
2038 | ||
2039 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
2040 | If e.Button = Windows.Forms.MouseButtons.Left Then | |
2041 | Dim NewIndex As Integer | |
2042 | Dim OldIndex As Integer = _SelectedIndex | |
2043 | ||
2044 | If _SelectedIndex < 4 Then | |
2045 | NewIndex = (e.X \ ItemWidth) | |
2046 | ElseIf _SelectedIndex > 3 AndAlso _SelectedIndex < (MaximumIndex - 3) Then | |
2047 | NewIndex = (e.X \ ItemWidth) | |
2048 | ||
2049 | Select Case NewIndex | |
2050 | Case 2 | |
2051 | NewIndex = OldIndex | |
2052 | Case Is < 2 | |
2053 | NewIndex = OldIndex - (2 - NewIndex) | |
2054 | Case Is > 2 | |
2055 | NewIndex = OldIndex + (NewIndex - 2) | |
2056 | End Select | |
2057 | Else | |
2058 | NewIndex = MaximumIndex - (4 - (e.X \ ItemWidth)) | |
2059 | End If | |
2060 | ||
2061 | If (NewIndex < _NumberOfPages) AndAlso (Not NewIndex = OldIndex) Then | |
2062 | SelectedIndex = NewIndex | |
2063 | RaiseEvent SelectedIndexChanged(Me, Nothing) | |
2064 | End If | |
2065 | End If | |
2066 | ||
2067 | MyBase.OnMouseDown(e) | |
2068 | End Sub | |
2069 | ||
2070 | End Class | |
2071 | ||
2072 | <DefaultEvent("Scroll")> _ | |
2073 | Class NSVScrollBar | |
2074 | Inherits Control | |
2075 | ||
2076 | Event Scroll(ByVal sender As Object) | |
2077 | ||
2078 | Private _Minimum As Integer | |
2079 | Property Minimum() As Integer | |
2080 | Get | |
2081 | Return _Minimum | |
2082 | End Get | |
2083 | Set(ByVal value As Integer) | |
2084 | If value < 0 Then | |
2085 | Throw New Exception("Property value is not valid.") | |
2086 | End If | |
2087 | ||
2088 | _Minimum = value | |
2089 | If value > _Value Then _Value = value | |
2090 | If value > _Maximum Then _Maximum = value | |
2091 | ||
2092 | InvalidateLayout() | |
2093 | End Set | |
2094 | End Property | |
2095 | ||
2096 | Private _Maximum As Integer = 100 | |
2097 | Property Maximum() As Integer | |
2098 | Get | |
2099 | Return _Maximum | |
2100 | End Get | |
2101 | Set(ByVal value As Integer) | |
2102 | If value < 1 Then value = 1 | |
2103 | ||
2104 | _Maximum = value | |
2105 | If value < _Value Then _Value = value | |
2106 | If value < _Minimum Then _Minimum = value | |
2107 | ||
2108 | InvalidateLayout() | |
2109 | End Set | |
2110 | End Property | |
2111 | ||
2112 | Private _Value As Integer | |
2113 | Property Value() As Integer | |
2114 | Get | |
2115 | If Not ShowThumb Then Return _Minimum | |
2116 | Return _Value | |
2117 | End Get | |
2118 | Set(ByVal value As Integer) | |
2119 | If value = _Value Then Return | |
2120 | ||
2121 | If value > _Maximum OrElse value < _Minimum Then | |
2122 | Throw New Exception("Property value is not valid.") | |
2123 | End If | |
2124 | ||
2125 | _Value = value | |
2126 | InvalidatePosition() | |
2127 | ||
2128 | RaiseEvent Scroll(Me) | |
2129 | End Set | |
2130 | End Property | |
2131 | ||
2132 | Property _Percent As Double | |
2133 | Public ReadOnly Property Percent As Double | |
2134 | Get | |
2135 | If Not ShowThumb Then Return 0 | |
2136 | Return GetProgress() | |
2137 | End Get | |
2138 | End Property | |
2139 | ||
2140 | Private _SmallChange As Integer = 1 | |
2141 | Public Property SmallChange() As Integer | |
2142 | Get | |
2143 | Return _SmallChange | |
2144 | End Get | |
2145 | Set(ByVal value As Integer) | |
2146 | If value < 1 Then | |
2147 | Throw New Exception("Property value is not valid.") | |
2148 | End If | |
2149 | ||
2150 | _SmallChange = value | |
2151 | End Set | |
2152 | End Property | |
2153 | ||
2154 | Private _LargeChange As Integer = 10 | |
2155 | Public Property LargeChange() As Integer | |
2156 | Get | |
2157 | Return _LargeChange | |
2158 | End Get | |
2159 | Set(ByVal value As Integer) | |
2160 | If value < 1 Then | |
2161 | Throw New Exception("Property value is not valid.") | |
2162 | End If | |
2163 | ||
2164 | _LargeChange = value | |
2165 | End Set | |
2166 | End Property | |
2167 | ||
2168 | Private ButtonSize As Integer = 16 | |
2169 | Private ThumbSize As Integer = 24 ' 14 minimum | |
2170 | ||
2171 | Private TSA As Rectangle | |
2172 | Private BSA As Rectangle | |
2173 | Private Shaft As Rectangle | |
2174 | Private Thumb As Rectangle | |
2175 | ||
2176 | Private ShowThumb As Boolean | |
2177 | Private ThumbDown As Boolean | |
2178 | ||
2179 | Sub New() | |
2180 | SetStyle(DirectCast(139286, ControlStyles), True) | |
2181 | SetStyle(ControlStyles.Selectable, False) | |
2182 | ||
2183 | Width = 18 | |
2184 | ||
2185 | B1 = New SolidBrush(Color.FromArgb(55, 55, 55)) | |
2186 | B2 = New SolidBrush(Color.FromArgb(35, 35, 35)) | |
2187 | ||
2188 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
2189 | P2 = New Pen(Color.FromArgb(65, 65, 65)) | |
2190 | P3 = New Pen(Color.FromArgb(55, 55, 55)) | |
2191 | P4 = New Pen(Color.FromArgb(40, 40, 40)) | |
2192 | End Sub | |
2193 | ||
2194 | Private GP1, GP2, GP3, GP4 As GraphicsPath | |
2195 | ||
2196 | Private P1, P2, P3, P4 As Pen | |
2197 | Private B1, B2 As SolidBrush | |
2198 | ||
2199 | Dim I1 As Integer | |
2200 | ||
2201 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
2202 | G = e.Graphics | |
2203 | G.Clear(BackColor) | |
2204 | ||
2205 | GP1 = DrawArrow(4, 6, False) | |
2206 | GP2 = DrawArrow(5, 7, False) | |
2207 | ||
2208 | G.FillPath(B1, GP2) | |
2209 | G.FillPath(B2, GP1) | |
2210 | ||
2211 | GP3 = DrawArrow(4, Height - 11, True) | |
2212 | GP4 = DrawArrow(5, Height - 10, True) | |
2213 | ||
2214 | G.FillPath(B1, GP4) | |
2215 | G.FillPath(B2, GP3) | |
2216 | ||
2217 | If ShowThumb Then | |
2218 | G.FillRectangle(B1, Thumb) | |
2219 | G.DrawRectangle(P1, Thumb) | |
2220 | G.DrawRectangle(P2, Thumb.X + 1, Thumb.Y + 1, Thumb.Width - 2, Thumb.Height - 2) | |
2221 | ||
2222 | Dim Y As Integer | |
2223 | Dim LY As Integer = Thumb.Y + (Thumb.Height \ 2) - 3 | |
2224 | ||
2225 | For I As Integer = 0 To 2 | |
2226 | Y = LY + (I * 3) | |
2227 | ||
2228 | G.DrawLine(P1, Thumb.X + 5, Y, Thumb.Right - 5, Y) | |
2229 | G.DrawLine(P2, Thumb.X + 5, Y + 1, Thumb.Right - 5, Y + 1) | |
2230 | Next | |
2231 | End If | |
2232 | ||
2233 | G.DrawRectangle(P3, 0, 0, Width - 1, Height - 1) | |
2234 | G.DrawRectangle(P4, 1, 1, Width - 3, Height - 3) | |
2235 | End Sub | |
2236 | ||
2237 | Private Function DrawArrow(x As Integer, y As Integer, flip As Boolean) As GraphicsPath | |
2238 | Dim GP As New GraphicsPath() | |
2239 | ||
2240 | Dim W As Integer = 9 | |
2241 | Dim H As Integer = 5 | |
2242 | ||
2243 | If flip Then | |
2244 | GP.AddLine(x + 1, y, x + W + 1, y) | |
2245 | GP.AddLine(x + W, y, x + H, y + H - 1) | |
2246 | Else | |
2247 | GP.AddLine(x, y + H, x + W, y + H) | |
2248 | GP.AddLine(x + W, y + H, x + H, y) | |
2249 | End If | |
2250 | ||
2251 | GP.CloseFigure() | |
2252 | Return GP | |
2253 | End Function | |
2254 | ||
2255 | Protected Overrides Sub OnSizeChanged(e As EventArgs) | |
2256 | InvalidateLayout() | |
2257 | End Sub | |
2258 | ||
2259 | Private Sub InvalidateLayout() | |
2260 | TSA = New Rectangle(0, 0, Width, ButtonSize) | |
2261 | BSA = New Rectangle(0, Height - ButtonSize, Width, ButtonSize) | |
2262 | Shaft = New Rectangle(0, TSA.Bottom + 1, Width, Height - (ButtonSize * 2) - 1) | |
2263 | ||
2264 | ShowThumb = ((_Maximum - _Minimum) > Shaft.Height) | |
2265 | ||
2266 | If ShowThumb Then | |
2267 | 'ThumbSize = Math.Max(0, 14) 'TODO: Implement this. | |
2268 | Thumb = New Rectangle(1, 0, Width - 3, ThumbSize) | |
2269 | End If | |
2270 | ||
2271 | RaiseEvent Scroll(Me) | |
2272 | InvalidatePosition() | |
2273 | End Sub | |
2274 | ||
2275 | Private Sub InvalidatePosition() | |
2276 | Thumb.Y = CInt(GetProgress() * (Shaft.Height - ThumbSize)) + TSA.Height | |
2277 | Invalidate() | |
2278 | End Sub | |
2279 | ||
2280 | Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs) | |
2281 | If e.Button = Windows.Forms.MouseButtons.Left AndAlso ShowThumb Then | |
2282 | If TSA.Contains(e.Location) Then | |
2283 | I1 = _Value - _SmallChange | |
2284 | ElseIf BSA.Contains(e.Location) Then | |
2285 | I1 = _Value + _SmallChange | |
2286 | Else | |
2287 | If Thumb.Contains(e.Location) Then | |
2288 | ThumbDown = True | |
2289 | MyBase.OnMouseDown(e) | |
2290 | Return | |
2291 | Else | |
2292 | If e.Y < Thumb.Y Then | |
2293 | I1 = _Value - _LargeChange | |
2294 | Else | |
2295 | I1 = _Value + _LargeChange | |
2296 | End If | |
2297 | End If | |
2298 | End If | |
2299 | ||
2300 | Value = Math.Min(Math.Max(I1, _Minimum), _Maximum) | |
2301 | InvalidatePosition() | |
2302 | End If | |
2303 | ||
2304 | MyBase.OnMouseDown(e) | |
2305 | End Sub | |
2306 | ||
2307 | Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) | |
2308 | If ThumbDown AndAlso ShowThumb Then | |
2309 | Dim ThumbPosition As Integer = e.Y - TSA.Height - (ThumbSize \ 2) | |
2310 | Dim ThumbBounds As Integer = Shaft.Height - ThumbSize | |
2311 | ||
2312 | I1 = CInt((ThumbPosition / ThumbBounds) * (_Maximum - _Minimum)) + _Minimum | |
2313 | ||
2314 | Value = Math.Min(Math.Max(I1, _Minimum), _Maximum) | |
2315 | InvalidatePosition() | |
2316 | End If | |
2317 | ||
2318 | MyBase.OnMouseMove(e) | |
2319 | End Sub | |
2320 | ||
2321 | Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs) | |
2322 | ThumbDown = False | |
2323 | MyBase.OnMouseUp(e) | |
2324 | End Sub | |
2325 | ||
2326 | Private Function GetProgress() As Double | |
2327 | Return (_Value - _Minimum) / (_Maximum - _Minimum) | |
2328 | End Function | |
2329 | ||
2330 | End Class | |
2331 | ||
2332 | <DefaultEvent("Scroll")> _ | |
2333 | Class NSHScrollBar | |
2334 | Inherits Control | |
2335 | ||
2336 | Event Scroll(ByVal sender As Object) | |
2337 | ||
2338 | Private _Minimum As Integer | |
2339 | Property Minimum() As Integer | |
2340 | Get | |
2341 | Return _Minimum | |
2342 | End Get | |
2343 | Set(ByVal value As Integer) | |
2344 | If value < 0 Then | |
2345 | Throw New Exception("Property value is not valid.") | |
2346 | End If | |
2347 | ||
2348 | _Minimum = value | |
2349 | If value > _Value Then _Value = value | |
2350 | If value > _Maximum Then _Maximum = value | |
2351 | ||
2352 | InvalidateLayout() | |
2353 | End Set | |
2354 | End Property | |
2355 | ||
2356 | Private _Maximum As Integer = 100 | |
2357 | Property Maximum() As Integer | |
2358 | Get | |
2359 | Return _Maximum | |
2360 | End Get | |
2361 | Set(ByVal value As Integer) | |
2362 | If value < 0 Then | |
2363 | Throw New Exception("Property value is not valid.") | |
2364 | End If | |
2365 | ||
2366 | _Maximum = value | |
2367 | If value < _Value Then _Value = value | |
2368 | If value < _Minimum Then _Minimum = value | |
2369 | ||
2370 | InvalidateLayout() | |
2371 | End Set | |
2372 | End Property | |
2373 | ||
2374 | Private _Value As Integer | |
2375 | Property Value() As Integer | |
2376 | Get | |
2377 | If Not ShowThumb Then Return _Minimum | |
2378 | Return _Value | |
2379 | End Get | |
2380 | Set(ByVal value As Integer) | |
2381 | If value = _Value Then Return | |
2382 | ||
2383 | If value > _Maximum OrElse value < _Minimum Then | |
2384 | Throw New Exception("Property value is not valid.") | |
2385 | End If | |
2386 | ||
2387 | _Value = value | |
2388 | InvalidatePosition() | |
2389 | ||
2390 | RaiseEvent Scroll(Me) | |
2391 | End Set | |
2392 | End Property | |
2393 | ||
2394 | Private _SmallChange As Integer = 1 | |
2395 | Public Property SmallChange() As Integer | |
2396 | Get | |
2397 | Return _SmallChange | |
2398 | End Get | |
2399 | Set(ByVal value As Integer) | |
2400 | If value < 1 Then | |
2401 | Throw New Exception("Property value is not valid.") | |
2402 | End If | |
2403 | ||
2404 | _SmallChange = value | |
2405 | End Set | |
2406 | End Property | |
2407 | ||
2408 | Private _LargeChange As Integer = 10 | |
2409 | Public Property LargeChange() As Integer | |
2410 | Get | |
2411 | Return _LargeChange | |
2412 | End Get | |
2413 | Set(ByVal value As Integer) | |
2414 | If value < 1 Then | |
2415 | Throw New Exception("Property value is not valid.") | |
2416 | End If | |
2417 | ||
2418 | _LargeChange = value | |
2419 | End Set | |
2420 | End Property | |
2421 | ||
2422 | Private ButtonSize As Integer = 16 | |
2423 | Private ThumbSize As Integer = 24 ' 14 minimum | |
2424 | ||
2425 | Private LSA As Rectangle | |
2426 | Private RSA As Rectangle | |
2427 | Private Shaft As Rectangle | |
2428 | Private Thumb As Rectangle | |
2429 | ||
2430 | Private ShowThumb As Boolean | |
2431 | Private ThumbDown As Boolean | |
2432 | ||
2433 | Sub New() | |
2434 | SetStyle(DirectCast(139286, ControlStyles), True) | |
2435 | SetStyle(ControlStyles.Selectable, False) | |
2436 | ||
2437 | Height = 18 | |
2438 | ||
2439 | B1 = New SolidBrush(Color.FromArgb(55, 55, 55)) | |
2440 | B2 = New SolidBrush(Color.FromArgb(35, 35, 35)) | |
2441 | ||
2442 | P1 = New Pen(Color.FromArgb(35, 35, 35)) | |
2443 | P2 = New Pen(Color.FromArgb(65, 65, 65)) | |
2444 | P3 = New Pen(Color.FromArgb(55, 55, 55)) | |
2445 | P4 = New Pen(Color.FromArgb(40, 40, 40)) | |
2446 | End Sub | |
2447 | ||
2448 | Private GP1, GP2, GP3, GP4 As GraphicsPath | |
2449 | ||
2450 | Private P1, P2, P3, P4 As Pen | |
2451 | Private B1, B2 As SolidBrush | |
2452 | ||
2453 | Dim I1 As Integer | |
2454 | ||
2455 | Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) | |
2456 | G = e.Graphics | |
2457 | G.Clear(BackColor) | |
2458 | ||
2459 | GP1 = DrawArrow(6, 4, False) | |
2460 | GP2 = DrawArrow(7, 5, False) | |
2461 | ||
2462 | G.FillPath(B1, GP2) | |
2463 | G.FillPath(B2, GP1) | |
2464 | ||
2465 | GP3 = DrawArrow(Width - 11, 4, True) | |
2466 | GP4 = DrawArrow(Width - 10, 5, True) | |
2467 | ||
2468 | G.FillPath(B1, GP4) | |
2469 | G.FillPath(B2, GP3) | |
2470 | ||
2471 | If ShowThumb Then | |
2472 | G.FillRectangle(B1, Thumb) | |
2473 | G.DrawRectangle(P1, Thumb) | |
2474 | G.DrawRectangle(P2, Thumb.X + 1, Thumb.Y + 1, Thumb.Width - 2, Thumb.Height - 2) | |
2475 | ||
2476 | Dim X As Integer | |
2477 | Dim LX As Integer = Thumb.X + (Thumb.Width \ 2) - 3 | |
2478 | ||
2479 | For I As Integer = 0 To 2 | |
2480 | X = LX + (I * 3) | |
2481 | ||
2482 | G.DrawLine(P1, X, Thumb.Y + 5, X, Thumb.Bottom - 5) | |
2483 | G.DrawLine(P2, X + 1, Thumb.Y + 5, X + 1, Thumb.Bottom - 5) | |
2484 | Next | |
2485 | End If | |
2486 | ||
2487 | G.DrawRectangle(P3, 0, 0, Width - 1, Height - 1) | |
2488 | G.DrawRectangle(P4, 1, 1, Width - 3, Height - 3) | |
2489 | End Sub | |
2490 | ||
2491 | Private Function DrawArrow(x As Integer, y As Integer, flip As Boolean) As GraphicsPath | |
2492 | Dim GP As New GraphicsPath() | |
2493 | ||
2494 | Dim W As Integer = 5 | |
2495 | Dim H As Integer = 9 | |
2496 | ||
2497 | If flip Then | |
2498 | GP.AddLine(x, y + 1, x, y + H + 1) | |
2499 | GP.AddLine(x, y + H, x + W - 1, y + W) | |
2500 | Else | |
2501 | GP.AddLine(x + W, y, x + W, y + H) | |
2502 | GP.AddLine(x + W, y + H, x + 1, y + W) | |
2503 | End If | |
2504 | ||
2505 | GP.CloseFigure() | |
2506 | Return GP | |
2507 | End Function | |
2508 | ||
2509 | Protected Overrides Sub OnSizeChanged(e As EventArgs) | |
2510 | InvalidateLayout() | |
2511 | End Sub | |
2512 | ||
2513 | Private Sub InvalidateLayout() | |
2514 | LSA = New Rectangle(0, 0, ButtonSize, Height) | |
2515 | RSA = New Rectangle(Width - ButtonSize, 0, ButtonSize, Height) | |
2516 | Shaft = New Rectangle(LSA.Right + 1, 0, Width - (ButtonSize * 2) - 1, Height) | |
2517 | ||
2518 | ShowThumb = ((_Maximum - _Minimum) > Shaft.Width) | |
2519 | ||
2520 | If ShowThumb Then | |
2521 | 'ThumbSize = Math.Max(0, 14) 'TODO: Implement this. | |
2522 | Thumb = New Rectangle(0, 1, ThumbSize, Height - 3) | |
2523 | End If | |
2524 | ||
2525 | RaiseEvent Scroll(Me) | |
2526 | InvalidatePosition() | |
2527 | End Sub | |
2528 | ||
2529 | Private Sub InvalidatePosition() | |
2530 | Thumb.X = CInt(GetProgress() * (Shaft.Width - ThumbSize)) + LSA.Width | |
2531 | Invalidate() | |
2532 | End Sub | |
2533 | ||
2534 | Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs) | |
2535 | If e.Button = Windows.Forms.MouseButtons.Left AndAlso ShowThumb Then | |
2536 | If LSA.Contains(e.Location) Then | |
2537 | I1 = _Value - _SmallChange | |
2538 | ElseIf RSA.Contains(e.Location) Then | |
2539 | I1 = _Value + _SmallChange | |
2540 | Else | |
2541 | If Thumb.Contains(e.Location) Then | |
2542 | ThumbDown = True | |
2543 | MyBase.OnMouseDown(e) | |
2544 | Return | |
2545 | Else | |
2546 | If e.X < Thumb.X Then | |
2547 | I1 = _Value - _LargeChange | |
2548 | Else | |
2549 | I1 = _Value + _LargeChange | |
2550 | End If | |
2551 | End If | |
2552 | End If | |
2553 | ||
2554 | Value = Math.Min(Math.Max(I1, _Minimum), _Maximum) | |
2555 | InvalidatePosition() | |
2556 | End If | |
2557 | ||
2558 | MyBase.OnMouseDown(e) | |
2559 | End Sub | |
2560 | ||
2561 | Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) | |
2562 | If ThumbDown AndAlso ShowThumb Then | |
2563 | Dim ThumbPosition As Integer = e.X - LSA.Width - (ThumbSize \ 2) | |
2564 | Dim ThumbBounds As Integer = Shaft.Width - ThumbSize | |
2565 | ||
2566 | I1 = CInt((ThumbPosition / ThumbBounds) * (_Maximum - _Minimum)) + _Minimum | |
2567 | ||
2568 | Value = Math.Min(Math.Max(I1, _Minimum), _Maximum) | |
2569 | InvalidatePosition() | |
2570 | End If | |
2571 | ||
2572 | MyBase.OnMouseMove(e) | |
2573 | End Sub | |
2574 | ||
2575 | Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs) | |
2576 | ThumbDown = False | |
2577 | MyBase.OnMouseUp(e) | |
2578 | End Sub | |
2579 | ||
2580 | Private Function GetProgress() As Double | |
2581 | Return (_Value - _Minimum) / (_Maximum - _Minimum) | |
2582 | End Function | |
2583 | ||
2584 | End Class | |
2585 | ||
2586 | Class NSContextMenu | |
2587 | Inherits ContextMenuStrip | |
2588 | ||
2589 | Sub New() | |
2590 | Renderer = New ToolStripProfessionalRenderer(New NSColorTable()) | |
2591 | ForeColor = Color.White | |
2592 | End Sub | |
2593 | ||
2594 | Protected Overrides Sub OnPaint(e As PaintEventArgs) | |
2595 | e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
2596 | MyBase.OnPaint(e) | |
2597 | End Sub | |
2598 | ||
2599 | End Class | |
2600 | ||
2601 | Class NSColorTable | |
2602 | Inherits ProfessionalColorTable | |
2603 | ||
2604 | Private BackColor As Color = Color.FromArgb(55, 55, 55) | |
2605 | ||
2606 | Public Overrides ReadOnly Property ButtonSelectedBorder() As Color | |
2607 | Get | |
2608 | Return BackColor | |
2609 | End Get | |
2610 | End Property | |
2611 | ||
2612 | Public Overrides ReadOnly Property CheckBackground() As Color | |
2613 | Get | |
2614 | Return BackColor | |
2615 | End Get | |
2616 | End Property | |
2617 | ||
2618 | Public Overrides ReadOnly Property CheckPressedBackground() As Color | |
2619 | Get | |
2620 | Return BackColor | |
2621 | End Get | |
2622 | End Property | |
2623 | ||
2624 | Public Overrides ReadOnly Property CheckSelectedBackground() As Color | |
2625 | Get | |
2626 | Return BackColor | |
2627 | End Get | |
2628 | End Property | |
2629 | ||
2630 | Public Overrides ReadOnly Property ImageMarginGradientBegin() As Color | |
2631 | Get | |
2632 | Return BackColor | |
2633 | End Get | |
2634 | End Property | |
2635 | ||
2636 | Public Overrides ReadOnly Property ImageMarginGradientEnd() As Color | |
2637 | Get | |
2638 | Return BackColor | |
2639 | End Get | |
2640 | End Property | |
2641 | ||
2642 | Public Overrides ReadOnly Property ImageMarginGradientMiddle() As Color | |
2643 | Get | |
2644 | Return BackColor | |
2645 | End Get | |
2646 | End Property | |
2647 | ||
2648 | Public Overrides ReadOnly Property MenuBorder() As Color | |
2649 | Get | |
2650 | Return Color.FromArgb(25, 25, 25) | |
2651 | End Get | |
2652 | End Property | |
2653 | ||
2654 | Public Overrides ReadOnly Property MenuItemBorder() As Color | |
2655 | Get | |
2656 | Return BackColor | |
2657 | End Get | |
2658 | End Property | |
2659 | ||
2660 | Public Overrides ReadOnly Property MenuItemSelected() As Color | |
2661 | Get | |
2662 | Return Color.FromArgb(65, 65, 65) | |
2663 | End Get | |
2664 | End Property | |
2665 | ||
2666 | Public Overrides ReadOnly Property SeparatorDark() As Color | |
2667 | Get | |
2668 | Return Color.FromArgb(35, 35, 35) | |
2669 | End Get | |
2670 | End Property | |
2671 | ||
2672 | Public Overrides ReadOnly Property ToolStripDropDownBackground() As Color | |
2673 | Get | |
2674 | Return BackColor | |
2675 | End Get | |
2676 | End Property | |
2677 | ||
2678 | End Class | |
2679 | ||
2680 | 'If you have made it this far it's not too late to turn back, you must not continue on! If you are trying to fullfill some | |
2681 | 'sick act of masochism by studying the source of the ListView then, may god have mercy on your soul. | |
2682 | Class NSListView | |
2683 | Inherits Control | |
2684 | ||
2685 | Class NSListViewItem | |
2686 | Property Text As String | |
2687 | <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ | |
2688 | Property SubItems As New List(Of NSListViewSubItem) | |
2689 | ||
2690 | Protected UniqueId As Guid | |
2691 | ||
2692 | Sub New() | |
2693 | UniqueId = Guid.NewGuid() | |
2694 | End Sub | |
2695 | ||
2696 | Public Overrides Function ToString() As String | |
2697 | Return Text | |
2698 | End Function | |
2699 | ||
2700 | Public Overrides Function Equals(obj As Object) As Boolean | |
2701 | If TypeOf obj Is NSListViewItem Then | |
2702 | Return (DirectCast(obj, NSListViewItem).UniqueId = UniqueId) | |
2703 | End If | |
2704 | ||
2705 | Return False | |
2706 | End Function | |
2707 | ||
2708 | End Class | |
2709 | ||
2710 | Class NSListViewSubItem | |
2711 | Property Text As String | |
2712 | ||
2713 | Public Overrides Function ToString() As String | |
2714 | Return Text | |
2715 | End Function | |
2716 | End Class | |
2717 | ||
2718 | Class NSListViewColumnHeader | |
2719 | Property Text As String | |
2720 | Property Width As Integer = 60 | |
2721 | ||
2722 | Public Overrides Function ToString() As String | |
2723 | Return Text | |
2724 | End Function | |
2725 | End Class | |
2726 | ||
2727 | Private _Items As New List(Of NSListViewItem) | |
2728 | <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ | |
2729 | Public Property Items() As NSListViewItem() | |
2730 | Get | |
2731 | Return _Items.ToArray() | |
2732 | End Get | |
2733 | Set(ByVal value As NSListViewItem()) | |
2734 | _Items = New List(Of NSListViewItem)(value) | |
2735 | InvalidateScroll() | |
2736 | End Set | |
2737 | End Property | |
2738 | ||
2739 | Private _SelectedItems As New List(Of NSListViewItem) | |
2740 | Public ReadOnly Property SelectedItems() As NSListViewItem() | |
2741 | Get | |
2742 | Return _SelectedItems.ToArray() | |
2743 | End Get | |
2744 | End Property | |
2745 | ||
2746 | Private _Columns As New List(Of NSListViewColumnHeader) | |
2747 | <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ | |
2748 | Public Property Columns() As NSListViewColumnHeader() | |
2749 | Get | |
2750 | Return _Columns.ToArray() | |
2751 | End Get | |
2752 | Set(ByVal value As NSListViewColumnHeader()) | |
2753 | _Columns = New List(Of NSListViewColumnHeader)(value) | |
2754 | InvalidateColumns() | |
2755 | End Set | |
2756 | End Property | |
2757 | ||
2758 | Private _MultiSelect As Boolean = True | |
2759 | Public Property MultiSelect() As Boolean | |
2760 | Get | |
2761 | Return _MultiSelect | |
2762 | End Get | |
2763 | Set(ByVal value As Boolean) | |
2764 | _MultiSelect = value | |
2765 | ||
2766 | If _SelectedItems.Count > 1 Then | |
2767 | _SelectedItems.RemoveRange(1, _SelectedItems.Count - 1) | |
2768 | End If | |
2769 | ||
2770 | Invalidate() | |
2771 | End Set | |
2772 | End Property | |
2773 | ||
2774 | Private ItemHeight As Integer = 24 | |
2775 | Public Overrides Property Font As Font | |
2776 | Get | |
2777 | Return MyBase.Font | |
2778 | End Get | |
2779 | Set(value As Font) | |
2780 | ItemHeight = CInt(Graphics.FromHwnd(Handle).MeasureString("@", Font).Height) + 6 | |
2781 | ||
2782 | If VS IsNot Nothing Then | |
2783 | VS.SmallChange = ItemHeight | |
2784 | VS.LargeChange = ItemHeight | |
2785 | End If | |
2786 | ||
2787 | MyBase.Font = value | |
2788 | InvalidateLayout() | |
2789 | End Set | |
2790 | End Property | |
2791 | ||
2792 | #Region " Item Helper Methods " | |
2793 | ||
2794 | 'Ok, you've seen everything of importance at this point; I am begging you to spare yourself. You must not read any further! | |
2795 | ||
2796 | Public Sub AddItem(text As String, ParamArray subItems As String()) | |
2797 | Dim Items As New List(Of NSListViewSubItem) | |
2798 | For Each I As String In subItems | |
2799 | Dim SubItem As New NSListViewSubItem() | |
2800 | SubItem.Text = I | |
2801 | Items.Add(SubItem) | |
2802 | Next | |
2803 | ||
2804 | Dim Item As New NSListViewItem() | |
2805 | Item.Text = text | |
2806 | Item.SubItems = Items | |
2807 | ||
2808 | _Items.Add(Item) | |
2809 | InvalidateScroll() | |
2810 | End Sub | |
2811 | ||
2812 | Public Sub RemoveItemAt(index As Integer) | |
2813 | _Items.RemoveAt(index) | |
2814 | InvalidateScroll() | |
2815 | End Sub | |
2816 | ||
2817 | Public Sub RemoveItem(item As NSListViewItem) | |
2818 | _Items.Remove(item) | |
2819 | InvalidateScroll() | |
2820 | End Sub | |
2821 | ||
2822 | Public Sub RemoveItems(items As NSListViewItem()) | |
2823 | For Each I As NSListViewItem In items | |
2824 | _Items.Remove(I) | |
2825 | Next | |
2826 | ||
2827 | InvalidateScroll() | |
2828 | End Sub | |
2829 | ||
2830 | #End Region | |
2831 | ||
2832 | Private VS As NSVScrollBar | |
2833 | ||
2834 | Sub New() | |
2835 | SetStyle(DirectCast(139286, ControlStyles), True) | |
2836 | SetStyle(ControlStyles.Selectable, True) | |
2837 | ||
2838 | P1 = New Pen(Color.FromArgb(55, 55, 55)) | |
2839 | P2 = New Pen(Color.FromArgb(35, 35, 35)) | |
2840 | P3 = New Pen(Color.FromArgb(65, 65, 65)) | |
2841 | ||
2842 | B1 = New SolidBrush(Color.FromArgb(62, 62, 62)) | |
2843 | B2 = New SolidBrush(Color.FromArgb(65, 65, 65)) | |
2844 | B3 = New SolidBrush(Color.FromArgb(47, 47, 47)) | |
2845 | B4 = New SolidBrush(Color.FromArgb(50, 50, 50)) | |
2846 | ||
2847 | VS = New NSVScrollBar | |
2848 | VS.SmallChange = ItemHeight | |
2849 | VS.LargeChange = ItemHeight | |
2850 | ||
2851 | AddHandler VS.Scroll, AddressOf HandleScroll | |
2852 | AddHandler VS.MouseDown, AddressOf VS_MouseDown | |
2853 | Controls.Add(VS) | |
2854 | ||
2855 | InvalidateLayout() | |
2856 | End Sub | |
2857 | ||
2858 | Protected Overrides Sub OnSizeChanged(e As EventArgs) | |
2859 | InvalidateLayout() | |
2860 | MyBase.OnSizeChanged(e) | |
2861 | End Sub | |
2862 | ||
2863 | Private Sub HandleScroll(sender As Object) | |
2864 | Invalidate() | |
2865 | End Sub | |
2866 | ||
2867 | Private Sub InvalidateScroll() | |
2868 | VS.Maximum = (_Items.Count * ItemHeight) | |
2869 | Invalidate() | |
2870 | End Sub | |
2871 | ||
2872 | Private Sub InvalidateLayout() | |
2873 | VS.Location = New Point(Width - VS.Width - 1, 1) | |
2874 | VS.Size = New Size(18, Height - 2) | |
2875 | ||
2876 | Invalidate() | |
2877 | End Sub | |
2878 | ||
2879 | Private ColumnOffsets As Integer() | |
2880 | Private Sub InvalidateColumns() | |
2881 | Dim Width As Integer = 3 | |
2882 | ColumnOffsets = New Integer(_Columns.Count - 1) {} | |
2883 | ||
2884 | For I As Integer = 0 To _Columns.Count - 1 | |
2885 | ColumnOffsets(I) = Width | |
2886 | Width += Columns(I).Width | |
2887 | Next | |
2888 | ||
2889 | Invalidate() | |
2890 | End Sub | |
2891 | ||
2892 | Private Sub VS_MouseDown(sender As Object, e As MouseEventArgs) | |
2893 | Focus() | |
2894 | End Sub | |
2895 | ||
2896 | Protected Overrides Sub OnMouseDown(e As MouseEventArgs) | |
2897 | Focus() | |
2898 | ||
2899 | If e.Button = Windows.Forms.MouseButtons.Left Then | |
2900 | Dim Offset As Integer = CInt(VS.Percent * (VS.Maximum - (Height - (ItemHeight * 2)))) | |
2901 | Dim Index As Integer = ((e.Y + Offset - ItemHeight) \ ItemHeight) | |
2902 | ||
2903 | If Index > _Items.Count - 1 Then Index = -1 | |
2904 | ||
2905 | If Not Index = -1 Then | |
2906 | 'TODO: Handle Shift key | |
2907 | ||
2908 | If ModifierKeys = Keys.Control AndAlso _MultiSelect Then | |
2909 | If _SelectedItems.Contains(_Items(Index)) Then | |
2910 | _SelectedItems.Remove(_Items(Index)) | |
2911 | Else | |
2912 | _SelectedItems.Add(_Items(Index)) | |
2913 | End If | |
2914 | Else | |
2915 | _SelectedItems.Clear() | |
2916 | _SelectedItems.Add(_Items(Index)) | |
2917 | End If | |
2918 | End If | |
2919 | ||
2920 | Invalidate() | |
2921 | End If | |
2922 | ||
2923 | MyBase.OnMouseDown(e) | |
2924 | End Sub | |
2925 | ||
2926 | Private P1, P2, P3 As Pen | |
2927 | Private B1, B2, B3, B4 As SolidBrush | |
2928 | Private GB1 As LinearGradientBrush | |
2929 | ||
2930 | 'I am so sorry you have to witness this. I tried warning you. ;.; | |
2931 | ||
2932 | Protected Overrides Sub OnPaint(e As PaintEventArgs) | |
2933 | G = e.Graphics | |
2934 | G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit | |
2935 | ||
2936 | G.Clear(BackColor) | |
2937 | ||
2938 | Dim X, Y As Integer | |
2939 | Dim H As Single | |
2940 | ||
2941 | G.DrawRectangle(P1, 1, 1, Width - 3, Height - 3) | |
2942 | ||
2943 | Dim R1 As Rectangle | |
2944 | Dim CI As NSListViewItem | |
2945 | ||
2946 | Dim Offset As Integer = CInt(VS.Percent * (VS.Maximum - (Height - (ItemHeight * 2)))) | |
2947 | ||
2948 | Dim StartIndex As Integer | |
2949 | If Offset = 0 Then StartIndex = 0 Else StartIndex = (Offset \ ItemHeight) | |
2950 | ||
2951 | Dim EndIndex As Integer = Math.Min(StartIndex + (Height \ ItemHeight), _Items.Count - 1) | |
2952 | ||
2953 | For I As Integer = StartIndex To EndIndex | |
2954 | CI = Items(I) | |
2955 | ||
2956 | R1 = New Rectangle(0, ItemHeight + (I * ItemHeight) + 1 - Offset, Width, ItemHeight - 1) | |
2957 | ||
2958 | H = G.MeasureString(CI.Text, Font).Height | |
2959 | Y = R1.Y + CInt((ItemHeight / 2) - (H / 2)) | |
2960 | ||
2961 | If _SelectedItems.Contains(CI) Then | |
2962 | If I Mod 2 = 0 Then | |
2963 | G.FillRectangle(B1, R1) | |
2964 | Else | |
2965 | G.FillRectangle(B2, R1) | |
2966 | End If | |
2967 | Else | |
2968 | If I Mod 2 = 0 Then | |
2969 | G.FillRectangle(B3, R1) | |
2970 | Else | |
2971 | G.FillRectangle(B4, R1) | |
2972 | End If | |
2973 | End If | |
2974 | ||
2975 | G.DrawLine(P2, 0, R1.Bottom, Width, R1.Bottom) | |
2976 | ||
2977 | If Columns.Length > 0 Then | |
2978 | R1.Width = Columns(0).Width | |
2979 | G.SetClip(R1) | |
2980 | End If | |
2981 | ||
2982 | 'TODO: Ellipse text that overhangs seperators. | |
2983 | G.DrawString(CI.Text, Font, Brushes.Black, 10, Y + 1) | |
2984 | G.DrawString(CI.Text, Font, Brushes.White, 9, Y) | |
2985 | ||
2986 | If CI.SubItems IsNot Nothing Then | |
2987 | For I2 As Integer = 0 To Math.Min(CI.SubItems.Count, _Columns.Count) - 1 | |
2988 | X = ColumnOffsets(I2 + 1) + 4 | |
2989 | ||
2990 | R1.X = X | |
2991 | R1.Width = Columns(I2).Width | |
2992 | G.SetClip(R1) | |
2993 | ||
2994 | G.DrawString(CI.SubItems(I2).Text, Font, Brushes.Black, X + 1, Y + 1) | |
2995 | G.DrawString(CI.SubItems(I2).Text, Font, Brushes.White, X, Y) | |
2996 | Next | |
2997 | End If | |
2998 | ||
2999 | G.ResetClip() | |
3000 | Next | |
3001 | ||
3002 | R1 = New Rectangle(0, 0, Width, ItemHeight) | |
3003 | ||
3004 | GB1 = New LinearGradientBrush(R1, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F) | |
3005 | G.FillRectangle(GB1, R1) | |
3006 | G.DrawRectangle(P3, 1, 1, Width - 22, ItemHeight - 2) | |
3007 | ||
3008 | Dim LH As Integer = Math.Min(VS.Maximum + ItemHeight - Offset, Height) | |
3009 | ||
3010 | Dim CC As NSListViewColumnHeader | |
3011 | For I As Integer = 0 To _Columns.Count - 1 | |
3012 | CC = Columns(I) | |
3013 | ||
3014 | H = G.MeasureString(CC.Text, Font).Height | |
3015 | Y = CInt((ItemHeight / 2) - (H / 2)) | |
3016 | X = ColumnOffsets(I) | |
3017 | ||
3018 | G.DrawString(CC.Text, Font, Brushes.Black, X + 1, Y + 1) | |
3019 | G.DrawString(CC.Text, Font, Brushes.White, X, Y) | |
3020 | ||
3021 | G.DrawLine(P2, X - 3, 0, X - 3, LH) | |
3022 | G.DrawLine(P3, X - 2, 0, X - 2, ItemHeight) | |
3023 | Next | |
3024 | ||
3025 | G.DrawRectangle(P2, 0, 0, Width - 1, Height - 1) | |
3026 | ||
3027 | G.DrawLine(P2, 0, ItemHeight, Width, ItemHeight) | |
3028 | G.DrawLine(P2, VS.Location.X - 1, 0, VS.Location.X - 1, Height) | |
3029 | End Sub | |
3030 | ||
3031 | Protected Overrides Sub OnMouseWheel(e As MouseEventArgs) | |
3032 | Dim Move As Integer = -((e.Delta * SystemInformation.MouseWheelScrollLines \ 120) * (ItemHeight \ 2)) | |
3033 | ||
3034 | Dim Value As Integer = Math.Max(Math.Min(VS.Value + Move, VS.Maximum), VS.Minimum) | |
3035 | VS.Value = Value | |
3036 | ||
3037 | MyBase.OnMouseWheel(e) | |
3038 | End Sub | |
3039 | ||
3040 | End Class |