annotate FBGUI/FBGUI.cs @ 88:c9da306e06c9

FBGUI: Improved FBGContainerControl thread safety
author Ivo Smits <Ivo@UCIS.nl>
date Tue, 11 Mar 2014 17:45:48 +0100
parents 4ca44dd25a6a
children 3347e1758e55
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Collections.Generic;
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
3 using System.Diagnostics;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.Drawing;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Drawing.Drawing2D;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6 using System.Drawing.Imaging;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 using System.IO;
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
8 using System.Reflection;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 using System.Threading;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 using System.Windows.Forms;
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
11 using UCIS.Util;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 using UCIS.VNCServer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 using ThreadingTimer = System.Threading.Timer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 namespace UCIS.FBGUI {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
16 public abstract class FBGEvent {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
17 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
18 public enum FBGPointingEventType {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
19 Move,
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
20 ButtonDown,
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
21 ButtonUp
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
22 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
23 public class FBGPointingEvent : FBGEvent {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
24 private Point position;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
25 public Point Position { get { return position; } set { position = value; } }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
26 public int X { get { return position.X; } set { position.X = value; } }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
27 public int Y { get { return position.Y; } set { position.Y = value; } }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
28 public MouseButtons Buttons { get; private set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
29 public FBGPointingEventType Type { get; private set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
30 public FBGCursor Cursor { get; set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
31 public FBGPointingEvent(Point position, MouseButtons buttons, FBGPointingEventType type) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
32 this.Position = position;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
33 this.Buttons = buttons;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
34 this.Type = type;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
35 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
36 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
37 public class FBGKeyboardEvent : FBGEvent {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
38 public Keys KeyData { get; private set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
39 public Keys KeyCode { get { return KeyData & Keys.KeyCode; } }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
40 public Keys Modifiers { get { return KeyData & Keys.Modifiers; } }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
41 public Boolean Shift { get { return (KeyData & Keys.Shift) != 0; } }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
42 public Boolean Control { get { return (KeyData & Keys.Control) != 0; } }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
43 public Boolean Alt { get { return (KeyData & Keys.Alt) != 0; } }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
44 public Boolean IsDown { get; private set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
45 public Char KeyChar { get; private set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
46 public FBGKeyboardEvent(Keys keyData, Char keyChar, Boolean isDown) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
47 this.KeyData = keyData;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
48 this.KeyChar = keyChar;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
49 this.IsDown = isDown;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
50 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
51 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
52 public class FBGPaintEvent : FBGEvent {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
53 public Graphics Canvas { get; private set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
54 public FBGPaintEvent(Graphics canvas) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
55 this.Canvas = canvas;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
56 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
57 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
58 public class FBGKeyboardCaptureEvent : FBGEvent {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
59 public Boolean Capture { get; set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
60 public FBGKeyboardCaptureEvent(Boolean capture) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
61 this.Capture = capture;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
62 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
63 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
64 public abstract class FBGMessage {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
65 public IFBGControl Source { get; private set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
66 protected FBGMessage(IFBGControl source) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
67 this.Source = source;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
68 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
69 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
70 public class FBGInvalidateMessage : FBGMessage {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
71 public Rectangle Area { get; set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
72 public FBGInvalidateMessage(IFBGControl source, Rectangle area) : base(source) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
73 this.Area = area;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
74 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
75 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
76 public class FBGPointingCaptureMessage : FBGMessage {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
77 public Boolean Capture { get; set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
78 public FBGPointingCaptureMessage(IFBGControl source, Boolean capture) : base(source) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
79 this.Capture = capture;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
80 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
81 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
82 public class FBGKeyboardCaptureMessage : FBGMessage {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
83 public Boolean Capture { get; set; }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
84 public FBGKeyboardCaptureMessage(IFBGControl source, Boolean capture) : base(source) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
85 this.Capture = capture;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
86 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
87 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
88
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 public interface IFBGControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 Rectangle Bounds { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 Boolean Visible { get; set; }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
92 void HandleEvent(FBGEvent e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 void Orphaned();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 public interface IFBGContainerControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 void AddControl(IFBGControl control);
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
97 Boolean RemoveControl(IFBGControl control);
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
98 void HandleMessage(IFBGControl sender, FBGMessage e);
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
99 Size ClientSize { get; }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
101
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 public class FBGControl : IFBGControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 private Rectangle bounds = new Rectangle(0, 0, 100, 100);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 private Color backColor = Color.Transparent;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 private Boolean visible = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 public virtual IFBGContainerControl Parent { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 public event MouseEventHandler OnMouseDown;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 public event MouseEventHandler OnMouseMove;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 public event MouseEventHandler OnMouseUp;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 public event PaintEventHandler OnPaint;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 public event EventHandler OnResize;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 public event EventHandler OnMove;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 public FBGControl(IFBGContainerControl parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 this.Parent = parent;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 if (Parent != null) Parent.AddControl(this);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 public virtual Rectangle Bounds {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 get { return bounds; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 if (bounds == value) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 Rectangle old = bounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 bounds = value;
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
123 Invalidate(Rectangle.Union(new Rectangle(Point.Empty, value.Size), new Rectangle(old.X - value.X, old.Y - value.Y, old.Width, old.Height)));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 if (value.Location != old.Location) RaiseEvent(OnMove);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 if (value.Size != old.Size) RaiseEvent(OnResize);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 public virtual Boolean Visible {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 get { return visible; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 visible = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
135 public virtual FBGCursor Cursor { get; set; }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 public Size Size { get { return Bounds.Size; } set { Rectangle r = Bounds; r.Size = value; Bounds = r; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 public Point Location { get { return Bounds.Location; } set { Rectangle r = Bounds; r.Location = value; Bounds = r; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 public int Left { get { return Bounds.Left; } set { Rectangle r = Bounds; r.X = value; Bounds = r; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 public int Top { get { return Bounds.Top; } set { Rectangle r = Bounds; r.Y = value; Bounds = r; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 public int Width { get { return Bounds.Width; } set { Rectangle r = Bounds; r.Width = value; Bounds = r; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 public int Height { get { return Bounds.Height; } set { Rectangle r = Bounds; r.Height = value; Bounds = r; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 public virtual Color BackColor { get { return backColor; } set { if (backColor == value) return; backColor = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 public virtual void Invalidate() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 Invalidate(new Rectangle(Point.Empty, Bounds.Size));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 public virtual void Invalidate(Rectangle rect) {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
147 Parent.HandleMessage(this, new FBGInvalidateMessage(this, rect));
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
148 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
149 void IFBGControl.HandleEvent(FBGEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
150 HandleEvent(e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
151 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
152 protected virtual void HandleEvent(FBGEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
153 if (e is FBGPaintEvent) HandlePaintEvent((FBGPaintEvent)e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
154 else if (e is FBGPointingEvent) HandlePointingEvent((FBGPointingEvent)e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
155 else if (e is FBGKeyboardEvent) HandleKeyboardEvent((FBGKeyboardEvent)e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
156 else if (e is FBGKeyboardCaptureEvent) HandleKeyboardCaptureEvent((FBGKeyboardCaptureEvent)e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
157 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
158 protected virtual void HandlePaintEvent(FBGPaintEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
159 Paint(e.Canvas);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
161 protected virtual void HandlePointingEvent(FBGPointingEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
162 if (Cursor != null) e.Cursor = Cursor;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
163 switch (e.Type) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
164 case FBGPointingEventType.Move: MouseMove(e.Position, e.Buttons); break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
165 case FBGPointingEventType.ButtonDown: MouseDown(e.Position, e.Buttons); break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
166 case FBGPointingEventType.ButtonUp: MouseUp(e.Position, e.Buttons); break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
167 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
168 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
169 protected virtual void HandleKeyboardEvent(FBGKeyboardEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
170 if (e.IsDown) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
171 if (e.KeyData != Keys.None) KeyDown(e.KeyData);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
172 if (e.KeyChar != Char.MinValue) KeyPress(e.KeyChar);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
173 } else {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
174 if (e.KeyData != Keys.None) KeyUp(e.KeyData);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
175 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
176 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
177 protected virtual void HandleKeyboardCaptureEvent(FBGKeyboardCaptureEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
178 if (!e.Capture) LostKeyboardCapture();
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
179 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 void IFBGControl.Orphaned() { Orphaned(); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 protected virtual void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 if (!visible) return;
27
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
183 if (backColor.A == 0xff) g.Clear(backColor);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
184 else if (backColor.A != 0) using (Brush brush = new SolidBrush(backColor)) g.FillRectangle(brush, g.ClipBounds);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 RaiseEvent(OnPaint, new PaintEventArgs(g, Rectangle.Round(g.ClipBounds)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 protected virtual void MouseMove(Point position, MouseButtons buttons) { RaiseEvent(OnMouseMove, new MouseEventArgs(buttons, 0, position.X, position.Y, 0)); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 protected virtual void MouseDown(Point position, MouseButtons buttons) { RaiseEvent(OnMouseDown, new MouseEventArgs(buttons, 1, position.X, position.Y, 0)); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 protected virtual void MouseUp(Point position, MouseButtons buttons) { RaiseEvent(OnMouseUp, new MouseEventArgs(buttons, 1, position.X, position.Y, 0)); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 protected virtual Boolean CaptureMouse(Boolean capture) {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
191 FBGPointingCaptureMessage m = new FBGPointingCaptureMessage(this, capture);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
192 Parent.HandleMessage(this, m);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
193 return capture == m.Capture;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 protected virtual void KeyDown(Keys key) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 protected virtual void KeyPress(Char keyChar) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 protected virtual void KeyUp(Keys key) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 protected virtual Boolean CaptureKeyboard(Boolean capture) {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
199 FBGKeyboardCaptureMessage m = new FBGKeyboardCaptureMessage(this, capture);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
200 Parent.HandleMessage(this, m);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
201 return capture == m.Capture;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 protected virtual void LostKeyboardCapture() { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 protected virtual void Orphaned() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 //IDisposable disp = this as IDisposable;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 //if (!ReferenceEquals(disp, null)) disp.Dispose();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 protected void RaiseEvent(KeyEventHandler eh, KeyEventArgs ea) { if (eh != null) eh(this, ea); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 protected void RaiseEvent(KeyPressEventHandler eh, KeyPressEventArgs ea) { if (eh != null) eh(this, ea); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 protected void RaiseEvent(MouseEventHandler eh, MouseEventArgs ea) { if (eh != null) eh(this, ea); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 protected void RaiseEvent(PaintEventHandler eh, PaintEventArgs ea) { if (eh != null) eh(this, ea); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 protected void RaiseEvent<T>(EventHandler<T> eh, T ea) where T : EventArgs { if (eh != null) eh(this, ea); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 protected void RaiseEvent(EventHandler eh, EventArgs ea) { if (eh != null) eh(this, ea); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 protected void RaiseEvent(EventHandler eh) { if (eh != null) eh(this, new EventArgs()); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 }
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
216 public class FBGContainerControl : FBGControl, IFBGContainerControl, IList<IFBGControl> {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
217 protected IFBGControl[] controls = new IFBGControl[0];
26
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
218 protected IFBGControl mouseCaptureControl = null;
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
219 protected IFBGControl keyboardCaptureControl = null;
81
3352f89cf6f5 FBGUI ContainerControl fixes (client area, keyboard capture)
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
220 public virtual Rectangle ClientRectangle { get { return new Rectangle(Point.Empty, Bounds.Size); } }
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
221 public virtual Size ClientSize { get { return ClientRectangle.Size; } set { Bounds = new Rectangle(Bounds.Location, Bounds.Size - ClientRectangle.Size + value); } }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 public FBGContainerControl(IFBGContainerControl parent) : base(parent) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 void IFBGContainerControl.AddControl(IFBGControl control) { AddControl(control); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 protected virtual void AddControl(IFBGControl control) {
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
225 ArrayUtil.Add(ref controls, control);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 if (control.Visible) Invalidate(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 }
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
228 public virtual Boolean RemoveControl(IFBGControl control) {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
229 if (!ArrayUtil.Remove(ref controls, control)) return false;
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
230 if (control.Visible) Invalidate(control);
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
231 HandleMessage(control, new FBGPointingCaptureMessage(control, false));
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
232 HandleMessage(control, new FBGKeyboardCaptureMessage(control, false));
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
233 control.Orphaned();
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
234 return true;
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
235 }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
236 public virtual void RemoveAllControls() {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
237 IFBGControl[] c = Interlocked.Exchange(ref controls, new IFBGControl[0]);
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
238 foreach (IFBGControl control in c) {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
239 HandleMessage(control, new FBGPointingCaptureMessage(control, false));
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
240 HandleMessage(control, new FBGKeyboardCaptureMessage(control, false));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
241 control.Orphaned();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
242 }
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
243 Invalidate();
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
244 }
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
245 public IList<IFBGControl> Controls { get { return this; } }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
246 public virtual Point PointToChild(IFBGControl child, Point point) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
247 return point - (Size)child.Bounds.Location - (Size)ClientRectangle.Location;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
248 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
249 public virtual Point PointFromChild(IFBGControl child, Point point) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
250 return point + (Size)child.Bounds.Location + (Size)ClientRectangle.Location;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
251 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
252 public virtual void BringControlToFront(IFBGControl control) {
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
253 if (controls.Length == 0) return;
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
254 int oldindex = Array.IndexOf(controls, control);
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
255 if (oldindex == -1 || oldindex == controls.Length - 1) return;
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
256 for (int i = oldindex; i < controls.Length - 1; i++) controls[i] = controls[i + 1];
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
257 controls[controls.Length - 1] = control;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
258 if (control.Visible) Invalidate(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
259 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
260 public virtual void Invalidate(IFBGControl control) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
261 Invalidate(new Rectangle(PointFromChild(control, Point.Empty), control.Bounds.Size));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
262 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
263 public virtual void Invalidate(IFBGControl control, Rectangle rect) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
264 Invalidate(new Rectangle(PointFromChild(control, rect.Location), rect.Size));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
265 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
266 protected override void HandlePaintEvent(FBGPaintEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
267 base.HandlePaintEvent(e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
268 GraphicsState state2 = null;
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
269 Graphics g = e.Canvas;
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
270 Rectangle childarea = ClientRectangle;
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
271 if (childarea.X != 0 || childarea.Y != 0 || childarea.Width != Bounds.Width || childarea.Height != Bounds.Height) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
272 state2 = g.Save();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
273 g.TranslateTransform(childarea.X, childarea.Y, MatrixOrder.Append);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
274 g.IntersectClip(new Rectangle(Point.Empty, childarea.Size));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
275 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
276 foreach (IFBGControl control in controls) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
277 if (!control.Visible) continue;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
278 if (control.Bounds.Width <= 0 || control.Bounds.Height <= 0) continue;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
279 if (!g.ClipBounds.IntersectsWith((RectangleF)control.Bounds)) continue;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
280 GraphicsState state = g.Save();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
281 g.TranslateTransform(control.Bounds.X, control.Bounds.Y, MatrixOrder.Append);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
282 g.IntersectClip(new Rectangle(Point.Empty, control.Bounds.Size));
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
283 control.HandleEvent(e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
284 g.Restore(state);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
285 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
286 if (state2 != null) g.Restore(state2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
287 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
288 public IFBGControl FindControlAtPosition(Point p) {
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
289 Rectangle childarea = ClientRectangle;
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
290 if (!childarea.Contains(p)) return null;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
291 p.Offset(-childarea.X, -childarea.Y);
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
292 return Array.FindLast(controls, delegate(IFBGControl control) { return control.Visible && control.Bounds.Contains(p); });
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
293 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
294 protected override void HandlePointingEvent(FBGPointingEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
295 IFBGControl control = mouseCaptureControl != null ? mouseCaptureControl : FindControlAtPosition(e.Position);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
296 if (control == null) {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
297 base.HandlePointingEvent(e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
298 } else {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
299 if (Cursor != null) e.Cursor = Cursor;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
300 e.Position = PointToChild(control, e.Position);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
301 control.HandleEvent(e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
302 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
303 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
304 void IFBGContainerControl.HandleMessage(IFBGControl sender, FBGMessage e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
305 HandleMessage(sender, e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
306 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
307 protected virtual void HandleMessage(IFBGControl sender, FBGMessage e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
308 if (e is FBGPointingCaptureMessage) HandlePointingCaptureMessage(sender, (FBGPointingCaptureMessage)e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
309 else if (e is FBGKeyboardCaptureMessage) HandleKeyboardCaptureMessage(sender, (FBGKeyboardCaptureMessage)e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
310 else if (e is FBGInvalidateMessage) HandleInvalidateMessage(sender, (FBGInvalidateMessage)e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
311 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
312 protected virtual void HandleInvalidateMessage(IFBGControl sender, FBGInvalidateMessage e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
313 e.Area = new Rectangle(PointFromChild(sender, e.Area.Location), e.Area.Size);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
314 Parent.HandleMessage(this, e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
315 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
316 protected virtual void HandlePointingCaptureMessage(IFBGControl sender, FBGPointingCaptureMessage e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
317 if (e.Capture && !(ReferenceEquals(mouseCaptureControl, null) || ReferenceEquals(mouseCaptureControl, sender))) e.Capture = false;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
318 else if (!e.Capture && !ReferenceEquals(mouseCaptureControl, sender)) e.Capture = false;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
319 else {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
320 Parent.HandleMessage(this, e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
321 mouseCaptureControl = e.Capture ? sender : null;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
322 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
323 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
324 protected override void HandleKeyboardEvent(FBGKeyboardEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
325 if (ReferenceEquals(keyboardCaptureControl, null)) base.HandleKeyboardEvent(e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
326 else keyboardCaptureControl.HandleEvent(e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
327 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
328 protected virtual void HandleKeyboardCaptureMessage(IFBGControl sender, FBGKeyboardCaptureMessage e) {
81
3352f89cf6f5 FBGUI ContainerControl fixes (client area, keyboard capture)
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
329 if (!e.Capture && !(ReferenceEquals(keyboardCaptureControl, null) || ReferenceEquals(keyboardCaptureControl, sender))) e.Capture = false;
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
330 else {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
331 Parent.HandleMessage(this, e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
332 IFBGControl prev = keyboardCaptureControl;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
333 keyboardCaptureControl = e.Capture ? sender : null;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
334 if (prev != null && prev != sender) prev.HandleEvent(new FBGKeyboardCaptureEvent(false));
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
335 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
336 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
337 protected override void HandleKeyboardCaptureEvent(FBGKeyboardCaptureEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
338 if (keyboardCaptureControl != null) keyboardCaptureControl.HandleEvent(new FBGKeyboardCaptureEvent(false));
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
339 base.HandleKeyboardCaptureEvent(e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
340 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
341 protected override void Orphaned() {
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
342 IFBGControl[] c = Interlocked.Exchange(ref controls, new IFBGControl[0]);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
343 foreach (IFBGControl control in c) control.Orphaned();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
344 mouseCaptureControl = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
345 keyboardCaptureControl = null;
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
346 base.Orphaned();
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
347 }
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
348
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
349 #region IList<IFBGControl> Members
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
350 int IList<IFBGControl>.IndexOf(IFBGControl item) { return Array.IndexOf(controls, item); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
351 void IList<IFBGControl>.Insert(int index, IFBGControl item) { throw new NotSupportedException(); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
352 void IList<IFBGControl>.RemoveAt(int index) { RemoveControl(controls[index]); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
353 IFBGControl IList<IFBGControl>.this[int index] {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
354 get { return controls[index]; }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
355 set { throw new NotSupportedException(); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
356 }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
357 void ICollection<IFBGControl>.Add(IFBGControl item) { throw new NotSupportedException(); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
358 void ICollection<IFBGControl>.Clear() { RemoveAllControls(); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
359 bool ICollection<IFBGControl>.Contains(IFBGControl item) { return Array.IndexOf(controls, item) != -1; }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
360 void ICollection<IFBGControl>.CopyTo(IFBGControl[] array, int arrayIndex) { controls.CopyTo(array, arrayIndex); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
361 int ICollection<IFBGControl>.Count { get { return controls.Length; } }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
362 bool ICollection<IFBGControl>.IsReadOnly { get { return false; } }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
363 bool ICollection<IFBGControl>.Remove(IFBGControl item) { return RemoveControl(item); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
364 IEnumerator<IFBGControl> IEnumerable<IFBGControl>.GetEnumerator() { return ((IEnumerable<IFBGControl>)controls).GetEnumerator(); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
365 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return controls.GetEnumerator(); }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
366 #endregion
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
367 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
368 public class FBGDockContainer : FBGContainerControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
369 private Dictionary<IFBGControl, DockStyle> dockStyles = new Dictionary<IFBGControl, DockStyle>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
370 private Dictionary<IFBGControl, AnchorStyles> anchorStyles = new Dictionary<IFBGControl, AnchorStyles>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
371 private Rectangle oldBounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
372 public FBGDockContainer(IFBGContainerControl parent)
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
373 : base(parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
374 oldBounds = ClientRectangle.IsEmpty ? Bounds : new Rectangle(Bounds.Location + (Size)ClientRectangle.Location, ClientRectangle.Size);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
375 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
376 protected override void AddControl(IFBGControl control) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
377 base.AddControl(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
378 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
379 public override void BringControlToFront(IFBGControl control) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
380 base.BringControlToFront(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
381 if (dockStyles.ContainsKey(control)) DoLayout();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
382 }
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
383 public override Boolean RemoveControl(IFBGControl control) {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
384 if (!base.RemoveControl(control)) return false;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
385 if (dockStyles.Remove(control)) DoLayout();
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
386 return true;
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
387 }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
388 public override void RemoveAllControls() {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
389 base.RemoveAllControls();
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
390 dockStyles.Clear();
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
391 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
392 public override Rectangle Bounds {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
393 get { return base.Bounds; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
394 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
395 base.Bounds = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
396 DoLayout();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
397 Rectangle newBounds = ClientRectangle.IsEmpty ? Bounds : new Rectangle(Bounds.Location + (Size)ClientRectangle.Location, ClientRectangle.Size);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
398 foreach (KeyValuePair<IFBGControl, AnchorStyles> c in anchorStyles) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
399 Rectangle b = c.Key.Bounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
400 if ((c.Value & AnchorStyles.Right) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
401 if ((c.Value & AnchorStyles.Left) == 0) b.X += newBounds.Width - oldBounds.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
402 else b.Width += newBounds.Width - oldBounds.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
403 } else if ((c.Value & AnchorStyles.Left) == 0) b.X += newBounds.X - oldBounds.X;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
404 if ((c.Value & AnchorStyles.Bottom) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
405 if ((c.Value & AnchorStyles.Top) == 0) b.Y += newBounds.Height - oldBounds.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
406 else b.Height += newBounds.Height - oldBounds.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
407 } else if ((c.Value & AnchorStyles.Top) == 0) b.Y += newBounds.Y - oldBounds.Y;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
408 c.Key.Bounds = b;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
409 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
410 oldBounds = newBounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
411 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
412 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
413 public DockStyle GetDockStyle(IFBGControl control) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
414 DockStyle ds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
415 if (!dockStyles.TryGetValue(control, out ds)) ds = DockStyle.None;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
416 return ds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
417 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
418 public void SetDockStyle(IFBGControl control, DockStyle style) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
419 if (style == DockStyle.None) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
420 if (dockStyles.Remove(control)) DoLayout();
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
421 } else if (Array.IndexOf(controls, control) != -1) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
422 anchorStyles.Remove(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
423 dockStyles[control] = style;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
424 DoLayout();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
425 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
426 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
427 public AnchorStyles GetAnchorStyle(IFBGControl control) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
428 AnchorStyles ds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
429 if (!anchorStyles.TryGetValue(control, out ds)) ds = AnchorStyles.Left | AnchorStyles.Top;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
430 return ds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
431 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
432 public void SetAnchorStyle(IFBGControl control, AnchorStyles style) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
433 if (style == (AnchorStyles.Left | AnchorStyles.Top)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
434 anchorStyles.Remove(control);
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
435 } else if (Array.IndexOf(controls, control) != -1) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
436 dockStyles.Remove(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
437 anchorStyles[control] = style;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
438 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
439 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
440 public void SetAnchor(IFBGControl control, AnchorStyles style, int value) {
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
441 if (Array.IndexOf(controls, control) != -1) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
442 AnchorStyles oldstyle;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
443 if (!anchorStyles.TryGetValue(control, out oldstyle)) oldstyle = AnchorStyles.Left | AnchorStyles.Top;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
444 Rectangle b = control.Bounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
445 switch (style) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
446 case AnchorStyles.None: throw new ArgumentException("style", "Anchor style can not be None");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
447 case AnchorStyles.Left: b.X = value; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
448 case AnchorStyles.Top: b.Y = value; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
449 case AnchorStyles.Right:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
450 if ((oldstyle & AnchorStyles.Left) == 0) b.X = ClientRectangle.Width - b.Width - value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
451 else b.Width = ClientRectangle.Width - b.X - value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
452 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
453 case AnchorStyles.Bottom:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
454 if ((oldstyle & AnchorStyles.Top) == 0) b.Y = ClientRectangle.Height - b.Height - value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
455 else b.Height = ClientRectangle.Height - b.Y - value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
456 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
457 default: throw new ArgumentOutOfRangeException("style", "The value vor the style argument is invalid");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
458 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
459 control.Bounds = b;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
460 dockStyles.Remove(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
461 anchorStyles[control] = oldstyle | style;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
462 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
463 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
464 private void DoLayout() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
465 Rectangle a = new Rectangle(Point.Empty, ClientRectangle.IsEmpty ? Bounds.Size : ClientRectangle.Size);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
466 foreach (KeyValuePair<IFBGControl, DockStyle> c in dockStyles) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
467 Rectangle b = c.Key.Bounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
468 if (c.Value == DockStyle.Left) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
469 b.Location = a.Location;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
470 b.Height = a.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
471 a.X += b.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
472 a.Width -= b.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
473 } else if (c.Value == DockStyle.Top) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
474 b.Location = a.Location;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
475 b.Width = a.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
476 a.Y += b.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
477 a.Height -= b.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
478 } else if (c.Value == DockStyle.Right) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
479 b.X = a.X + a.Width - b.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
480 b.Y = a.Y;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
481 b.Height = a.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
482 a.Width -= b.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
483 } else if (c.Value == DockStyle.Bottom) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
484 b.X = a.X;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
485 b.Y = a.Y + a.Height - b.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
486 b.Width = a.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
487 a.Height -= b.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
488 } else if (c.Value == DockStyle.Fill) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
489 b = a;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
490 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
491 c.Key.Bounds = b;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
492 if (a.Width < 0) a.Width = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
493 if (a.Height < 0) a.Height = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
494 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
495 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
496 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
497 public class FBGGroupBox : FBGDockContainer {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
498 private String text = String.Empty;
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
499 public override Rectangle ClientRectangle { get { return new Rectangle(1, 15, Bounds.Width - 2, Bounds.Height - 17); } }
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
500 public FBGGroupBox(IFBGContainerControl parent) : base(parent) { }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
501 public String Text { get { return text; } set { if (text == value) return; text = value; Invalidate(new Rectangle(0, 0, Bounds.Width, 15)); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
502 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
503 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
504 SizeF ss = g.MeasureString(Text, SystemFonts.DefaultFont, new Size(Bounds.Width - 10 - 9, 15));
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
505 g.DrawLines(Pens.Gray, new PointF[] { new PointF(8 + ss.Width + 4, 6), new Point(Bounds.Width - 1, 6), new Point(Bounds.Width - 1, Bounds.Height - 1), new Point(0, Bounds.Height - 1), new Point(0, 6), new Point(8, 6) });
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
506 g.DrawString(Text, SystemFonts.DefaultFont, Brushes.DarkBlue, new Rectangle(9, 0, Bounds.Width - 10 - 9, 15));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
507 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
508 }
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
509 [System.ComponentModel.DesignerCategory("")]
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
510 public class WinFormsFBGHost : Control, IFBGContainerControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
511 private IFBGControl childControl = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
512 private IFBGControl mouseCaptureControl = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
513 private IFBGControl keyboardCaptureControl = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
514 public IFBGControl ChildControl { get { return childControl; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
515
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
516 public WinFormsFBGHost() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
517 DoubleBuffered = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
518 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
519
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
520 public virtual Point PointToChild(IFBGControl child, Point point) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
521 return point - (Size)child.Bounds.Location;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
522 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
523 public virtual Point PointFromChild(IFBGControl child, Point point) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
524 return point + (Size)child.Bounds.Location;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
525 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
526
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
527 void IFBGContainerControl.AddControl(IFBGControl control) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
528 if (!ReferenceEquals(childControl, null)) throw new InvalidOperationException("This container can have only one child control");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
529 childControl = control;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
530 control.Bounds = new Rectangle(Point.Empty, ClientSize);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
531 Invalidate(control.Bounds);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
532 }
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
533 Boolean IFBGContainerControl.RemoveControl(IFBGControl control) {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
534 if (!ReferenceEquals(childControl, control)) return false;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
535 childControl = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
536 Invalidate(control.Bounds);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
537 if (mouseCaptureControl == control) mouseCaptureControl = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
538 if (keyboardCaptureControl == control) control = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
539 control.Orphaned();
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
540 return true;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
541 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
542 void IFBGContainerControl.HandleMessage(IFBGControl sender, FBGMessage e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
543 if (e is FBGInvalidateMessage) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
544 FBGInvalidateMessage p = (FBGInvalidateMessage)e;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
545 Invalidate(new Rectangle(PointFromChild(sender, p.Area.Location), p.Area.Size));
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
546 } else if (e is FBGPointingCaptureMessage) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
547 FBGPointingCaptureMessage p = (FBGPointingCaptureMessage)e;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
548 if (p.Capture && !(ReferenceEquals(mouseCaptureControl, null) || ReferenceEquals(mouseCaptureControl, sender))) p.Capture = false;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
549 else if (!p.Capture && !ReferenceEquals(mouseCaptureControl, sender)) p.Capture = false;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
550 else mouseCaptureControl = p.Capture ? sender : null;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
551 } else if (e is FBGKeyboardCaptureMessage) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
552 FBGKeyboardCaptureMessage p = (FBGKeyboardCaptureMessage)e;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
553 if (!p.Capture && !ReferenceEquals(keyboardCaptureControl, sender)) p.Capture = false;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
554 else keyboardCaptureControl = p.Capture ? sender : null;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
555 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
556 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
557
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
558 protected override void OnPaint(PaintEventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
559 base.OnPaint(e);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
560 Graphics g = e.Graphics;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
561 GraphicsState state = g.Save();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
562 g.SetClip(e.ClipRectangle);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
563 if (ReferenceEquals(childControl, null)) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
564 if (childControl.Bounds.Width <= 0 || childControl.Bounds.Height <= 0) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
565 if (!g.ClipBounds.IntersectsWith((RectangleF)childControl.Bounds)) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
566 g.TranslateTransform(childControl.Bounds.X, childControl.Bounds.Y, MatrixOrder.Append);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
567 g.IntersectClip(new Rectangle(Point.Empty, childControl.Bounds.Size));
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
568 childControl.HandleEvent(new FBGPaintEvent(g));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
569 g.Restore(state);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
570 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
571 protected override void OnResize(EventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
572 if (!ReferenceEquals(childControl, null)) childControl.Bounds = new Rectangle(Point.Empty, ClientSize);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
573 base.OnResize(e);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
574 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
575 void DispatchMouseEvent(MouseEventArgs e, FBGPointingEventType type) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
576 IFBGControl control = mouseCaptureControl != null ? mouseCaptureControl : childControl;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
577 if (control != null) control.HandleEvent(new FBGPointingEvent(e.Location, e.Button, type));
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
578 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
579 protected override void OnMouseDown(MouseEventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
580 base.OnMouseDown(e);
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
581 DispatchMouseEvent(e, FBGPointingEventType.ButtonDown);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
582 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
583 protected override void OnMouseUp(MouseEventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
584 base.OnMouseUp(e);
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
585 DispatchMouseEvent(e, FBGPointingEventType.ButtonUp);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
586 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
587 protected override void OnMouseMove(MouseEventArgs e) {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
588 DispatchMouseEvent(e, FBGPointingEventType.Move);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
589 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
590 protected override bool IsInputChar(char charCode) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
591 return true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
592 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
593 protected override bool IsInputKey(Keys keyData) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
594 return true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
595 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
596 protected override void OnKeyDown(KeyEventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
597 //base.OnKeyDown(e);
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
598 if (!ReferenceEquals(keyboardCaptureControl, null)) keyboardCaptureControl.HandleEvent(new FBGKeyboardEvent(e.KeyData, Char.MinValue, true));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
599 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
600 protected override void OnKeyPress(KeyPressEventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
601 //base.OnKeyPress(e);
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
602 if (!ReferenceEquals(keyboardCaptureControl, null)) keyboardCaptureControl.HandleEvent(new FBGKeyboardEvent(Keys.None, e.KeyChar, true));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
603 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
604 protected override void OnKeyUp(KeyEventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
605 //base.OnKeyUp(e);
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
606 if (!ReferenceEquals(keyboardCaptureControl, null)) keyboardCaptureControl.HandleEvent(new FBGKeyboardEvent(e.KeyData, Char.MinValue, false));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
607 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
608 protected override void OnHandleDestroyed(EventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
609 if (!ReferenceEquals(childControl, null)) childControl.Orphaned();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
610 base.OnHandleDestroyed(e);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
611 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
612 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
613 public class FBGCursor {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
614 public Image Image { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
615 public Point Hotspot { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
616 public Size Size { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
617 public FBGCursor(Image image, Point hotspot) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
618 this.Image = image;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
619 this.Hotspot = hotspot;
74
8f31b164ce7e FBGUI: Added invisible cursor support
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
620 this.Size = image == null ? Size.Empty : image.Size;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
621 }
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
622 public Rectangle Area { get { return new Rectangle(-Hotspot.X, -Hotspot.Y, Size.Width, Size.Height); } }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
623 public FBGCursor RotateFlip(RotateFlipType type) {
74
8f31b164ce7e FBGUI: Added invisible cursor support
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
624 if (Image == null) return this;
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
625 Image img = new Bitmap(Image);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
626 img.RotateFlip(type);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
627 Point hs = Hotspot;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
628 switch (type) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
629 case RotateFlipType.RotateNoneFlipNone: break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
630 case RotateFlipType.Rotate90FlipNone: hs = new Point(img.Width - hs.Y, hs.X); break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
631 case RotateFlipType.Rotate180FlipNone: hs = new Point(img.Width - hs.X, img.Height - hs.Y); break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
632 case RotateFlipType.Rotate270FlipNone: hs = new Point(hs.Y, img.Height - hs.X); break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
633 case RotateFlipType.RotateNoneFlipX: hs.X = img.Width - hs.X; break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
634 case RotateFlipType.Rotate90FlipX: hs = new Point(hs.Y, hs.X); break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
635 case RotateFlipType.RotateNoneFlipY: hs.Y = img.Height - hs.Y; break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
636 case RotateFlipType.Rotate90FlipY: hs = new Point(img.Width - hs.Y, img.Height - hs.X); break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
637 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
638 return new FBGCursor(img, hs);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
639 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
640 public static FBGCursor FromBase64Image(String data, Point hotspot) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
641 return new FBGCursor(Image.FromStream(new MemoryStream(Convert.FromBase64String(data))), hotspot);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
642 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
643 private static FBGCursor LoadFromResource(String name, int hotX, int hotY) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
644 using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("UCIS.FBGUI." + name + ".png")) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
645 return new FBGCursor(Image.FromStream(s), new Point(hotX, hotY));
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
646 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
647 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
648
74
8f31b164ce7e FBGUI: Added invisible cursor support
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
649 public static readonly FBGCursor None = new FBGCursor(null, Point.Empty);
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
650 public static readonly FBGCursor Arrow = LoadFromResource("cursor_arrow", 0, 0);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
651 public static readonly FBGCursor Move = LoadFromResource("cursor_move", 8, 8);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
652 public static readonly FBGCursor SizeLeft = LoadFromResource("cursor_left", 1, 10);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
653 public static readonly FBGCursor SizeRight = SizeLeft.RotateFlip(RotateFlipType.RotateNoneFlipX);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
654 public static readonly FBGCursor SizeTop = SizeLeft.RotateFlip(RotateFlipType.Rotate90FlipNone);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
655 public static readonly FBGCursor SizeBottom = SizeLeft.RotateFlip(RotateFlipType.Rotate90FlipY);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
656 public static readonly FBGCursor SizeTopLeft = LoadFromResource("cursor_topleft", 1, 1);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
657 public static readonly FBGCursor SizeTopRight = SizeTopLeft.RotateFlip(RotateFlipType.RotateNoneFlipX);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
658 public static readonly FBGCursor SizeBottomLeft = SizeTopLeft.RotateFlip(RotateFlipType.RotateNoneFlipY);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
659 public static readonly FBGCursor SizeBottomRight = SizeTopLeft.RotateFlip(RotateFlipType.RotateNoneFlipXY);
40
e3329f686b95 FBGUI: Added hand cursor
Ivo Smits <Ivo@UCIS.nl>
parents: 39
diff changeset
660 public static readonly FBGCursor Hand = LoadFromResource("cursor_hand", 5, 0);
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
661 public static FBGCursor ArrowCursor { get { return Arrow; } }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
662 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
663 public class FBGRenderer : FBGContainerControl, IDisposable {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
664 private FBGCursor cursor = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
665 private Point cursorposition = Point.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
666 public IFramebuffer Framebuffer { get; private set; }
26
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
667 private Bitmap Frontbuffer = null;
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
668 protected Object RenderLock = new object();
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
669 private Object StatusLock = new object();
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
670 public event EventHandler<InvalidateEventArgs> Painted;
26
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
671 protected Size size = Size.Empty;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
672 private ThreadingTimer PaintTimer = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
673 private Boolean PaintScheduled = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
674 private int PaintDelay = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
675 public Boolean SuspendDrawing {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
676 get { return suspenddrawing; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
677 set {
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
678 lock (StatusLock) suspenddrawing = value;
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
679 if (value) return;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
680 lock (RenderLock) {
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
681 Refresh(DirtyRectangle);
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
682 DirtyRectangle = Rectangle.Empty;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
683 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
684 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
685 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
686 public int RedrawDelay {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
687 get { return PaintDelay; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
688 set {
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
689 lock (StatusLock) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
690 if (value < 0) throw new ArgumentOutOfRangeException("value");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
691 PaintDelay = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
692 if (PaintDelay == 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
693 if (PaintTimer != null) PaintTimer.Dispose();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
694 PaintTimer = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
695 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
696 PaintTimer = new ThreadingTimer(PaintTimerCallback);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
697 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
698 }
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
699 if (PaintScheduled) PaintTimerCallback(null);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
700 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
701 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
702 private Boolean suspenddrawing = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
703 private Rectangle DirtyRectangle;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
704
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
705 public Point CursorPosition {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
706 get { return cursorposition; }
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
707 set { UpdateCursor(value, cursor); }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
708 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
709 protected void UpdateCursor(Point position, FBGCursor cursor) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
710 if (cursorposition == position && cursor == this.cursor) return;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
711 Rectangle r1 = Rectangle.Empty;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
712 if (this.cursor != null) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
713 r1 = this.cursor.Area;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
714 r1.Offset(cursorposition);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
715 }
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
716 if (cursor != null) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
717 Rectangle r2 = cursor.Area;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
718 r2.Offset(position);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
719 r1 = r1.IsEmpty ? r2 : Rectangle.Union(r1, r2);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
720 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
721 this.cursor = cursor;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
722 cursorposition = position;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
723 Invalidate(r1);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
724 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
725 public override Rectangle Bounds {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
726 get { return new Rectangle(Point.Empty, size); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
727 set { throw new NotSupportedException("Can not change the top control bounds"); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
728 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
729 public FBGRenderer(IFramebuffer fb) : this(fb.Width, fb.Height) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
730 Framebuffer = fb;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
731 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
732 public FBGRenderer(Size fbsize) : this(fbsize.Width, fbsize.Height) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
733 public FBGRenderer(int width, int height) : this(new Bitmap(width, height, PixelFormat.Format32bppRgb)) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
734 public FBGRenderer(Bitmap bmp) : base(null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
735 Frontbuffer = bmp;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
736 BackColor = SystemColors.Control;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
737 size = Frontbuffer.Size;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
738 }
26
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
739 protected FBGRenderer() : base(null) {
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
740 BackColor = SystemColors.Control;
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
741 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
742 protected override void HandleInvalidateMessage(IFBGControl sender, FBGInvalidateMessage e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
743 e.Area = new Rectangle(PointFromChild(sender, e.Area.Location), e.Area.Size);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
744 Invalidate(e.Area);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
745 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
746 public override void Invalidate(Rectangle rect) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
747 if (rect.Width == 0 || rect.Height == 0) return;
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
748 Boolean drawDirect = false;
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
749 lock (StatusLock) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
750 if (SuspendDrawing || PaintTimer != null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
751 DirtyRectangle = DirtyRectangle.IsEmpty ? rect : Rectangle.Union(DirtyRectangle, rect);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
752 if (!SuspendDrawing && !PaintScheduled) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
753 PaintScheduled = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
754 PaintTimer.Change(PaintDelay, Timeout.Infinite);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
755 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
756 } else {
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
757 drawDirect = true;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
758 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
759 }
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
760 if (drawDirect) Refresh(rect);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
761 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
762 private void PaintTimerCallback(Object state) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
763 try {
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
764 Rectangle rect;
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
765 lock (StatusLock) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
766 PaintScheduled = false;
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
767 rect = DirtyRectangle;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
768 DirtyRectangle = Rectangle.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
769 }
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
770 Refresh(rect);
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
771 } catch (Exception ex) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
772 Debug.WriteLine(ex);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
773 Console.Error.WriteLine(ex);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
774 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
775 }
26
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
776 protected virtual void Refresh(Rectangle rect) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
777 lock (RenderLock) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
778 rect.Intersect(Bounds);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
779 if (rect.Width == 0 || rect.Height == 0) return;
26
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
780 if (Frontbuffer != null) {
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
781 using (Graphics g = Graphics.FromImage(Frontbuffer)) {
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
782 g.SetClip(rect);
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
783 Paint(g);
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
784 }
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
785 if (Framebuffer != null) Framebuffer.DrawImage(Frontbuffer, rect, rect.Location);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
786 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
787 RaiseEvent(Painted, new InvalidateEventArgs(rect));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
788 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
789 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
790 public virtual new void Paint(Graphics g) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
791 HandleEvent(new FBGPaintEvent(g));
74
8f31b164ce7e FBGUI: Added invisible cursor support
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
792 if (cursor != null && cursor.Image != null) {
42
aedd0e4adef7 FBGUI: Small cleanup
Ivo Smits <Ivo@UCIS.nl>
parents: 40
diff changeset
793 Rectangle r = cursor.Area;
aedd0e4adef7 FBGUI: Small cleanup
Ivo Smits <Ivo@UCIS.nl>
parents: 40
diff changeset
794 r.Offset(cursorposition);
aedd0e4adef7 FBGUI: Small cleanup
Ivo Smits <Ivo@UCIS.nl>
parents: 40
diff changeset
795 g.DrawImage(cursor.Image, r);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
796 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
797 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
798 protected override void HandlePointingCaptureMessage(IFBGControl sender, FBGPointingCaptureMessage e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
799 if (e.Capture && !(ReferenceEquals(mouseCaptureControl, null) || ReferenceEquals(mouseCaptureControl, sender))) e.Capture = false;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
800 else if (!e.Capture && !ReferenceEquals(mouseCaptureControl, sender)) e.Capture = false;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
801 else mouseCaptureControl = e.Capture ? sender : null;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
802 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
803 protected override void HandleKeyboardCaptureMessage(IFBGControl sender, FBGKeyboardCaptureMessage e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
804 if (!e.Capture && !ReferenceEquals(keyboardCaptureControl, sender)) e.Capture = false;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
805 else {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
806 IFBGControl prev = keyboardCaptureControl;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
807 keyboardCaptureControl = e.Capture ? sender : null;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
808 if (prev != null && prev != sender) prev.HandleEvent(new FBGKeyboardCaptureEvent(false));
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
809 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
810 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
811
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
812 protected override Boolean CaptureMouse(Boolean capture) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
813 return true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
814 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
815 protected override Boolean CaptureKeyboard(bool capture) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
816 return true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
817 }
26
7f0b7a53a000 FBGUI: Allow derived classes to access some internals
Ivo Smits <Ivo@UCIS.nl>
parents: 23
diff changeset
818 public virtual void Dispose() {
82
0d389692be32 FBGUI: Separated locking in renderer so Invalidate does not block while Painting in timer callback
Ivo Smits <Ivo@UCIS.nl>
parents: 79
diff changeset
819 lock (StatusLock) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
820 if (PaintTimer != null) PaintTimer.Dispose();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
821 PaintTimer = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
822 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
823 Orphaned();
69
82290dc1403c Fix crash in FBGUI renderer shutdown
Ivo Smits <Ivo@UCIS.nl>
parents: 42
diff changeset
824 lock (RenderLock) {
82290dc1403c Fix crash in FBGUI renderer shutdown
Ivo Smits <Ivo@UCIS.nl>
parents: 42
diff changeset
825 if (Frontbuffer != null) Frontbuffer.Dispose();
82290dc1403c Fix crash in FBGUI renderer shutdown
Ivo Smits <Ivo@UCIS.nl>
parents: 42
diff changeset
826 Frontbuffer = null;
82290dc1403c Fix crash in FBGUI renderer shutdown
Ivo Smits <Ivo@UCIS.nl>
parents: 42
diff changeset
827 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
828 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
829 public Bitmap LockBitmapBuffer() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
830 Monitor.Enter(RenderLock);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
831 return Frontbuffer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
832 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
833 public void UnlockBitmapBuffer() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
834 Monitor.Exit(RenderLock);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
835 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
836 void DispatchPointingEvent(Point position, MouseButtons buttons, FBGPointingEventType type) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
837 FBGPointingEvent e = new FBGPointingEvent(position, buttons, type);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
838 HandleEvent(e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
839 UpdateCursor(cursorposition, e.Cursor);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
840 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
841 public new void MouseMove(Point position, MouseButtons buttons) { DispatchPointingEvent(position, buttons, FBGPointingEventType.Move); }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
842 public new void MouseDown(Point position, MouseButtons buttons) { DispatchPointingEvent(position, buttons, FBGPointingEventType.ButtonDown); }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
843 public new void MouseUp(Point position, MouseButtons buttons) { DispatchPointingEvent(position, buttons, FBGPointingEventType.ButtonUp); }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
844 public new void KeyDown(Keys key) { KeyDown(key, Char.MinValue); }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
845 public new void KeyPress(Char key) { KeyDown(Keys.None, key); }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
846 public new void KeyUp(Keys key) { KeyUp(key, Char.MinValue); }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
847 public void KeyDown(Keys key, Char keyChar) { HandleEvent(new FBGKeyboardEvent(key, keyChar, true)); }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
848 public void KeyUp(Keys key, Char keyChar) { HandleEvent(new FBGKeyboardEvent(key, keyChar, false)); }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
849 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
850 public class FBGForm : FBGDockContainer {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
851 private Point prevPosition = Point.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
852 private NonClientOps moveresize = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
853 private String text = String.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
854 public event EventHandler TextChanged;
31
af27992b5972 FBGUI: Added Form Closed event
Ivo Smits <Ivo@UCIS.nl>
parents: 30
diff changeset
855 public event EventHandler Closed;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
856 public Boolean Sizable { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
857 public Boolean Movable { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
858 public Boolean Closable { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
859 [Flags]
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
860 private enum NonClientOps : int {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
861 None = 0,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
862 Move = 1,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
863 ResizeLeft = 2,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
864 ResizeRight = 4,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
865 ResizeTop = 8,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
866 ResizeBottom = 16,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
867 ButtonClose = 32,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
868 MoveResize = ResizeLeft | ResizeRight | ResizeBottom | ResizeTop | Move,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
869 }
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
870 public override Rectangle ClientRectangle { get { return new Rectangle(4, 22, Bounds.Width - 8, Bounds.Height - 26); } }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
871 public FBGForm(IFBGContainerControl parent) : base(parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
872 BackColor = SystemColors.Control;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
873 Sizable = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
874 Movable = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
875 Closable = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
876 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
877 public String Text { get { return text; } set { if (text == value) return; text = value; Invalidate(new Rectangle(0, 0, Bounds.Width, 20)); RaiseEvent(TextChanged); } }
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
878 private NonClientOps GetNonClientOperation(Point p) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
879 if ((new Rectangle(Bounds.Width - 5 - 14, 4, 14, 14)).Contains(p)) return NonClientOps.ButtonClose;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
880 NonClientOps mr = 0;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
881 if (Sizable) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
882 if (Movable) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
883 if (p.X < 4) mr |= NonClientOps.ResizeLeft;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
884 if (p.Y < 4) mr |= NonClientOps.ResizeTop;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
885 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
886 if (p.X >= Bounds.Width - 4) mr |= NonClientOps.ResizeRight;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
887 if (p.Y >= Bounds.Height - 4) mr |= NonClientOps.ResizeBottom;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
888 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
889 if (mr == 0 && Movable && p.Y < 20) mr = NonClientOps.Move;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
890 return mr;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
891 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
892 private void SetCursorForNonClientOperation(NonClientOps op, FBGPointingEvent e) {
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
893 switch (op & NonClientOps.MoveResize) {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
894 case NonClientOps.Move: e.Cursor = FBGCursor.Move; break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
895 case NonClientOps.ResizeLeft: e.Cursor = FBGCursor.SizeLeft; break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
896 case NonClientOps.ResizeRight: e.Cursor = FBGCursor.SizeRight; break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
897 case NonClientOps.ResizeBottom: e.Cursor = FBGCursor.SizeBottom; break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
898 case NonClientOps.ResizeTop: e.Cursor = FBGCursor.SizeTop; break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
899 case NonClientOps.ResizeTop | NonClientOps.ResizeLeft: e.Cursor = FBGCursor.SizeTopLeft; break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
900 case NonClientOps.ResizeTop | NonClientOps.ResizeRight: e.Cursor = FBGCursor.SizeTopRight; break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
901 case NonClientOps.ResizeBottom | NonClientOps.ResizeLeft: e.Cursor = FBGCursor.SizeBottomLeft; break;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
902 case NonClientOps.ResizeBottom | NonClientOps.ResizeRight: e.Cursor = FBGCursor.SizeBottomRight; break;
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
903 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
904 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
905 protected override void HandlePointingEvent(FBGPointingEvent e) {
39
41b2d01ae458 FBGUI: Fixed cursor handling in forms
Ivo Smits <Ivo@UCIS.nl>
parents: 34
diff changeset
906 if (Cursor != null) e.Cursor = Cursor;
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
907 if (HandlePointingEventA(e)) base.HandlePointingEvent(e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
908 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
909 Boolean HandlePointingEventA(FBGPointingEvent e) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
910 switch (e.Type) {
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
911 case FBGPointingEventType.Move: return MouseMove(e.Position, e.Buttons, e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
912 case FBGPointingEventType.ButtonDown: return MouseDown(e.Position, e.Buttons, e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
913 case FBGPointingEventType.ButtonUp: return MouseUp(e.Position, e.Buttons, e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
914 default: return true;
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
915 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
916 }
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
917 Boolean MouseDown(Point p, MouseButtons buttons, FBGPointingEvent e) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
918 NonClientOps mr = 0;
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
919 if ((buttons & MouseButtons.Left) != 0) mr = GetNonClientOperation(p);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
920 if (mr != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
921 moveresize = mr;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
922 prevPosition = p;
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
923 SetCursorForNonClientOperation(moveresize, e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
924 CaptureMouse(true);
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
925 return false;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
926 } else {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
927 return true;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
928 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
929 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
930 Boolean MouseMove(Point position, MouseButtons buttons, FBGPointingEvent e) {
39
41b2d01ae458 FBGUI: Fixed cursor handling in forms
Ivo Smits <Ivo@UCIS.nl>
parents: 34
diff changeset
931 NonClientOps mr = moveresize;
41b2d01ae458 FBGUI: Fixed cursor handling in forms
Ivo Smits <Ivo@UCIS.nl>
parents: 34
diff changeset
932 if (mr == 0) mr = GetNonClientOperation(position);
41b2d01ae458 FBGUI: Fixed cursor handling in forms
Ivo Smits <Ivo@UCIS.nl>
parents: 34
diff changeset
933 if (mr == 0) return true;
41b2d01ae458 FBGUI: Fixed cursor handling in forms
Ivo Smits <Ivo@UCIS.nl>
parents: 34
diff changeset
934 SetCursorForNonClientOperation(mr, e);
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
935 if ((moveresize & NonClientOps.MoveResize) != 0) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
936 Rectangle b = Bounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
937 int dx = position.X - prevPosition.X;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
938 int dy = position.Y - prevPosition.Y;
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
939 if (moveresize == NonClientOps.Move) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
940 b.Offset(dx, dy);
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
941 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
942 if ((moveresize & NonClientOps.ResizeLeft) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
943 b.X += dx;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
944 b.Width -= dx;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
945 } else if ((moveresize & NonClientOps.ResizeRight) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
946 b.Width += dx;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
947 prevPosition.X = position.X;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
948 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
949 if ((moveresize & NonClientOps.ResizeTop) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
950 b.Y += dy;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
951 b.Height -= dy;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
952 } else if ((moveresize & NonClientOps.ResizeBottom) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
953 b.Height += dy;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
954 prevPosition.Y = position.Y;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
955 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
956 if (b.Width < 55) b.Width = 55;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
957 if (b.Height < 25) b.Height = 25;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
958 Bounds = b;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
959 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
960 return false;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
961 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
962 Boolean MouseUp(Point position, MouseButtons buttons, FBGPointingEvent e) {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
963 if (moveresize == 0) {
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
964 SetCursorForNonClientOperation(GetNonClientOperation(position), e);
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
965 return true;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
966 } else if ((buttons & MouseButtons.Left) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
967 MouseMove(position, buttons);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
968 CaptureMouse(false);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
969 if (moveresize == NonClientOps.ButtonClose && (new Rectangle(Bounds.Width - 5 - 14, 4, 14, 14)).Contains(position) && Closable) Close();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
970 moveresize = 0;
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
971 SetCursorForNonClientOperation(GetNonClientOperation(position), e);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
972 }
32
ff1bc8445743 FBGUI: Changed event handling and propagation to be more extensible
Ivo Smits <Ivo@UCIS.nl>
parents: 31
diff changeset
973 return false;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
974 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
975 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
976 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
977 g.DrawRectangle(Pens.Gray, 0, 0, Bounds.Width - 1, Bounds.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
978 g.DrawRectangle(Pens.LightGray, 1, 1, Bounds.Width - 3, Bounds.Height - 3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
979 g.DrawRectangle(Pens.DarkGray, 2, 20, Bounds.Width - 5, Bounds.Height - 23);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
980 g.DrawRectangle(Pens.Gray, 3, 21, Bounds.Width - 7, Bounds.Height - 25);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
981 using (Brush b = new LinearGradientBrush(new Rectangle(0, 1, 1, 18), Color.Gray, Color.LightGray, LinearGradientMode.Vertical))
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
982 g.FillRectangle(b, 2, 2, Bounds.Width - 4, 18);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
983
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
984 g.DrawString(Text, SystemFonts.CaptionFont, Brushes.Black, 4, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
985
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
986 g.DrawRectangle(Pens.Gray, Bounds.Width - 5 - 14, 4, 14, 14);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
987 g.DrawRectangle(Pens.Gray, Bounds.Width - 5 - 14 - 16, 4, 14, 14);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
988 g.DrawRectangle(Pens.Gray, Bounds.Width - 5 - 14 - 32, 4, 14, 14);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
989 using (Brush b = new LinearGradientBrush(new Rectangle(0, 5, 1, 13), Color.LightGray, Color.DarkGray, LinearGradientMode.Vertical)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
990 g.FillRectangle(b, Bounds.Width - 5 - 14 + 1, 5, 13, 13);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
991 g.FillRectangle(b, Bounds.Width - 5 - 14 + 1 - 16, 5, 13, 13);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
992 g.FillRectangle(b, Bounds.Width - 5 - 14 + 1 - 32, 5, 13, 13);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
993 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
994 if (Closable) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
995 g.DrawLine(Pens.Black, Bounds.Width - 5 - 14 + 3, 4 + 3, Bounds.Width - 5 - 14 + 14 - 3, 4 + 14 - 3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
996 g.DrawLine(Pens.Black, Bounds.Width - 5 - 14 + 3, 4 + 14 - 3, Bounds.Width - 5 - 14 + 14 - 3, 4 + 3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
997 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
998 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
999 public void Close() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1000 Parent.RemoveControl(this);
31
af27992b5972 FBGUI: Added Form Closed event
Ivo Smits <Ivo@UCIS.nl>
parents: 30
diff changeset
1001 RaiseEvent(Closed);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1002 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1003 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1004 public class FBGDesktop : FBGContainerControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1005 FBGContainerControl windowcontainer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1006 FBGContainerControl menucontainer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1007 Boolean startup = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1008 class FBGWindowState {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1009 public IFBGControl Control;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1010 public FBGButton MenuButton;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1011 public Boolean Visible;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1012 public Rectangle OldBounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1013 public FBGWindowState(IFBGControl cntrl, FBGButton btn) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1014 Control = cntrl;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1015 MenuButton = btn;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1016 Visible = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1017 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1018 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1019 Dictionary<IFBGControl, FBGWindowState> windowstates = new Dictionary<IFBGControl, FBGWindowState>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1020 public FBGDesktop(IFBGContainerControl parent) : base(parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1021 menucontainer = new FBGContainerControl(this);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1022 menucontainer.Bounds = new Rectangle(0, Bounds.Height - 25, Bounds.Width, 25);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1023 windowcontainer = new FBGContainerControl(this);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1024 windowcontainer.Bounds = new Rectangle(0, 0, Bounds.Width, Bounds.Height - 25);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1025 startup = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1026 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1027 public override Rectangle Bounds {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1028 get { return base.Bounds; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1029 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1030 if (Bounds == value) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1031 base.Bounds = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1032 if (startup) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1033 menucontainer.Bounds = new Rectangle(0, value.Height - 25, value.Width, 25);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1034 windowcontainer.Bounds = new Rectangle(0, 0, value.Width, value.Height - 25);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1035 ScaleMenuButtons();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1036 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1037 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1038 protected override void AddControl(IFBGControl control) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1039 if (startup) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1040 base.AddControl(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1041 return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1042 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1043 ((IFBGContainerControl)windowcontainer).AddControl(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1044 FBGButton btn = new FBGButton(menucontainer);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1045 FBGForm formcontrol = control as FBGForm;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1046 if (formcontrol == null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1047 btn.Text = "Untitled";
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1048 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1049 formcontrol.TextChanged += delegate(Object sender, EventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1050 btn.Text = formcontrol.Text;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1051 };
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1052 btn.Text = formcontrol.Text;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1053 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1054 FBGWindowState ws = new FBGWindowState(control, btn);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1055 windowstates.Add(control, ws);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1056 ScaleMenuButtons();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1057 btn.Click += delegate(Object sender, EventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1058 if (ws.Visible) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1059 if (ws.MenuButton.BackColor == Color.DarkGray) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1060 ws.OldBounds = ws.Control.Bounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1061 ws.Visible = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1062 ws.Control.Bounds = Rectangle.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1063 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1064 windowcontainer.BringControlToFront(ws.Control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1065 foreach (FBGWindowState wsa in windowstates.Values) if (!ReferenceEquals(ws, wsa)) wsa.MenuButton.BackColor = SystemColors.ButtonFace;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1066 ws.MenuButton.BackColor = Color.DarkGray;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1067 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1068 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1069 ws.Control.Bounds = ws.OldBounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1070 ws.Visible = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1071 windowcontainer.BringControlToFront(ws.Control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1072 foreach (FBGWindowState wsa in windowstates.Values) if (!ReferenceEquals(ws, wsa)) wsa.MenuButton.BackColor = SystemColors.ButtonFace;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1073 ws.MenuButton.BackColor = Color.DarkGray;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1074 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1075 };
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1076 }
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1077 public override Boolean RemoveControl(IFBGControl control) {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1078 if (!windowcontainer.RemoveControl(control)) return false;
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1079 FBGWindowState ws = windowstates[control];
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1080 menucontainer.RemoveControl(ws.MenuButton);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1081 windowstates.Remove(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1082 ScaleMenuButtons();
88
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1083 return true;
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1084 }
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1085 public override void RemoveAllControls() {
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1086 windowcontainer.RemoveAllControls();
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1087 menucontainer.RemoveAllControls();
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1088 windowstates.Clear();
c9da306e06c9 FBGUI: Improved FBGContainerControl thread safety
Ivo Smits <Ivo@UCIS.nl>
parents: 83
diff changeset
1089 ScaleMenuButtons();
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1090 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1091 private void ScaleMenuButtons() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1092 int bcount = windowstates.Count;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1093 int bwidth = 200;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1094 int twidth = bwidth * bcount;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1095 if (twidth > Bounds.Width) bwidth = menucontainer.Bounds.Width / bcount;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1096 int i = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1097 foreach (FBGWindowState ws in windowstates.Values) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1098 ws.MenuButton.Bounds = new Rectangle(i * bwidth, 0, bwidth, 25);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1099 i++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1100 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1101 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1102 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1103 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1104 g.DrawLine(Pens.Black, 0, Bounds.Height - 25, Bounds.Width, Bounds.Height - 25);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1105 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1106 protected override void MouseDown(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1107 IFBGControl control = FindControlAtPosition(position);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1108 if (ReferenceEquals(control, windowcontainer)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1109 control = windowcontainer.FindControlAtPosition(PointToChild(windowcontainer, position));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1110 if (!ReferenceEquals(control, null)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1111 windowcontainer.BringControlToFront(control);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1112 foreach (FBGWindowState ws in windowstates.Values)
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1113 ws.MenuButton.BackColor = ReferenceEquals(ws.Control, control) ? Color.DarkGray : SystemColors.ButtonFace;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1114 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1115 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1116 base.MouseDown(position, buttons);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1117 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1118 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1119
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1120 public class FBGLabel : FBGControl, IDisposable {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1121 public FBGLabel(IFBGContainerControl parent) : base(parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1122 Size = new Size(200, 16);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1123 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1124 private String text = String.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1125 private Font font = SystemFonts.DefaultFont;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1126 private Brush brush = SystemBrushes.ControlText;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1127 private StringFormat stringformat = new StringFormat();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1128 public String Text { get { return text; } set { text = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1129 public Font Font { get { return font; } set { font = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1130 public Brush Brush { get { return brush; } set { brush = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1131 public Color Color { set { Brush = new SolidBrush(value); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1132 public StringAlignment Alignment { get { return stringformat.Alignment; } set { stringformat.Alignment = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1133 public StringFormatFlags FormatFlags { get { return stringformat.FormatFlags; } set { stringformat.FormatFlags = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1134 public StringAlignment LineAlignment { get { return stringformat.LineAlignment; } set { stringformat.LineAlignment = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1135 public StringTrimming Trimming { get { return stringformat.Trimming; } set { stringformat.Trimming = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1136 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1137 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1138 g.DrawString(text, font, brush, new Rectangle(Point.Empty, Bounds.Size), stringformat);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1139 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1140 public void Dispose() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1141 stringformat.Dispose();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1142 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1143 protected override void Orphaned() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1144 base.Orphaned();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1145 Dispose();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1146 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1147 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1148 public class FBGTextBox : FBGControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1149 public FBGTextBox(IFBGContainerControl parent) : base(parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1150 BackColor = Color.White;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1151 Size = new Size(200, 20);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1152 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1153 private String text = String.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1154 private Char passwordChar = (Char)0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1155 private Font font = new Font(FontFamily.GenericMonospace, 10);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1156 private Brush brush = SystemBrushes.ControlText;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1157 private Boolean hasKeyboardFocus = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1158 public String Text { get { return text; } set { text = value; if (CaretPosition > text.Length) CaretPosition = text.Length; Invalidate(); RaiseEvent(TextChanged); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1159 public Font Font { get { return font; } set { font = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1160 public Brush Brush { get { return brush; } set { brush = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1161 public Color Color { set { Brush = new SolidBrush(value); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1162 public Int32 CaretPosition { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1163 public Char PasswordChar { get { return passwordChar; } set { passwordChar = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1164 public event EventHandler TextChanged;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1165 public event KeyPressEventHandler OnKeyPress;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1166 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1167 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1168 g.DrawRectangle(Pens.Gray, 0, 0, Bounds.Width - 1, Bounds.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1169 using (StringFormat sf_nonprinting = new StringFormat(StringFormat.GenericTypographic)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1170 sf_nonprinting.Trimming = StringTrimming.None;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1171 sf_nonprinting.FormatFlags = StringFormatFlags.DisplayFormatControl | StringFormatFlags.MeasureTrailingSpaces;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1172 sf_nonprinting.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.None;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1173
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1174 float x = 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1175 float y = 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1176 float w = Width - 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1177 if (hasKeyboardFocus && CaretPosition == 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1178 g.DrawLine(Pens.Black, x + 2, 2, x + 2, Height - 4);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1179 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1180 String c = passwordChar == 0 ? null : new String(passwordChar, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1181 for (int i = 0; i < text.Length; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1182 if (passwordChar == 0) c = text.Substring(i, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1183 SizeF s = g.MeasureString(c, font, (int)Math.Ceiling(w), sf_nonprinting);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1184 g.DrawString(c, font, brush, x, y);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1185 x += (float)Math.Ceiling(s.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1186 w -= (float)Math.Ceiling(s.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1187
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1188 if (hasKeyboardFocus && i == CaretPosition - 1) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1189 g.DrawLine(Pens.Black, x + 2, 2, x + 2, Height - 4);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1190 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1191 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1192 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1193 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1194 protected override void MouseDown(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1195 hasKeyboardFocus = CaptureKeyboard(true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1196 CaretPosition = text.Length;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1197 float x = 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1198 String c = passwordChar == 0 ? null : new String(passwordChar, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1199 for (int i = 0; i < text.Length; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1200 if (passwordChar == 0) c = text.Substring(i, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1201 Size s;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1202 try {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1203 s = TextRenderer.MeasureText(c, font, Size.Empty, TextFormatFlags.NoPadding | TextFormatFlags.NoPrefix);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1204 } catch (Exception) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1205 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1206 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1207 x += s.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1208 if (position.X < x) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1209 CaretPosition = i;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1210 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1211 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1212 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1213 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1214 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1215 protected override void KeyDown(Keys key) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1216 if ((key & Keys.KeyCode) == Keys.Left) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1217 CaretPosition--;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1218 if (CaretPosition < 0) CaretPosition = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1219 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1220 } else if ((key & Keys.KeyCode) == Keys.Right) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1221 CaretPosition++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1222 if (CaretPosition > text.Length) CaretPosition = text.Length;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1223 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1224 } else if ((key & Keys.KeyCode) == Keys.Home) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1225 CaretPosition = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1226 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1227 } else if ((key & Keys.KeyCode) == Keys.End) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1228 CaretPosition = text.Length;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1229 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1230 } else if ((key & Keys.Control) != 0 && (key & Keys.KeyCode) == Keys.V) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1231 String cbtext = Clipboard.GetText(TextDataFormat.UnicodeText);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1232 CaretPosition += cbtext.Length;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1233 Text = Text.Insert(CaretPosition - cbtext.Length, cbtext);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1234 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1235 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1236 protected override void KeyPress(char keyChar) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1237 KeyPressEventArgs e = new KeyPressEventArgs(keyChar);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1238 RaiseEvent(OnKeyPress, e);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1239 if (e.Handled) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1240 hasKeyboardFocus = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1241 if (keyChar == 8) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1242 if (CaretPosition > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1243 CaretPosition--;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1244 Text = Text.Remove(CaretPosition, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1245 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1246 } else if (keyChar == 127) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1247 if (CaretPosition < Text.Length) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1248 Text = Text.Remove(CaretPosition, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1249 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1250 } else if (keyChar < 32) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1251 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1252 CaretPosition++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1253 Text = Text.Insert(CaretPosition - 1, new String(keyChar, 1));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1254 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1255 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1256 public void Focus() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1257 hasKeyboardFocus = CaptureKeyboard(true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1258 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1259 protected override void LostKeyboardCapture() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1260 base.LostKeyboardCapture();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1261 hasKeyboardFocus = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1262 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1263 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1264 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1265 public class FBGButton : FBGControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1266 public FBGButton(IFBGContainerControl parent) : base(parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1267 BackColor = SystemColors.ButtonFace;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1268 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1269 private String text = String.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1270 private Font font = SystemFonts.DefaultFont;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1271 private Color color = SystemColors.ControlText;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1272 private Boolean pressed = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1273 private Boolean enabled = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1274 public String Text { get { return text; } set { text = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1275 public Font Font { get { return font; } set { font = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1276 public Color Color { get { return color; } set { color = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1277 public Boolean Enabled { get { return enabled; } set { enabled = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1278 public event EventHandler Click;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1279 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1280 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1281 if (Bounds.Width == 0 || Bounds.Height == 0) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1282 if (BackColor == SystemColors.ButtonFace) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1283 ControlPaint.DrawButton(g, new Rectangle(0, 0, Bounds.Width, Bounds.Height), enabled ? (pressed ? ButtonState.Pushed : ButtonState.Normal) : ButtonState.Inactive);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1284 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1285 //Hackish and not completely right...
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1286 //Todo: borrowed from mono... possible licencing issues!?
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1287 g.DrawLine(new Pen(ControlPaint.LightLight(BackColor)), 0, 0, Bounds.Width, 0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1288 g.DrawLine(new Pen(ControlPaint.LightLight(BackColor)), 0, 0, 0, Bounds.Height);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1289 g.DrawLine(new Pen(ControlPaint.Dark(BackColor)), 1, Bounds.Height - 2, Bounds.Width - 1, Bounds.Height - 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1290 g.DrawLine(new Pen(ControlPaint.Dark(BackColor)), Bounds.Width - 2, 1, Bounds.Width - 2, Bounds.Height - 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1291 g.DrawLine(new Pen(ControlPaint.DarkDark(BackColor)), 0, Bounds.Height - 1, Bounds.Width, Bounds.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1292 g.DrawLine(new Pen(ControlPaint.DarkDark(BackColor)), Bounds.Width - 1, 1, Bounds.Width - 1, Bounds.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1293 Graphics dc = g;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1294 Rectangle rectangle = new Rectangle(0, 0, Bounds.Width - 1, Bounds.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1295 Color ColorControl = BackColor;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1296 Color ColorControlLight = ControlPaint.Light(ColorControl);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1297 ButtonState state = pressed ? ButtonState.Pushed : ButtonState.Normal;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1298 using (Pen NormalPen = new Pen(BackColor), LightPen = new Pen(ControlPaint.Light(BackColor)), DarkPen = new Pen(ControlPaint.Dark(BackColor))) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1299 // sadly enough, the rectangle gets always filled with a hatchbrush
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1300 using (HatchBrush hb = new HatchBrush(HatchStyle.Percent50, Color.FromArgb(Math.Min(255, ColorControl.R + 3), ColorControl.G, ColorControl.B), ColorControl)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1301 dc.FillRectangle(hb, rectangle.X + 1, rectangle.Y + 1, rectangle.Width - 2, rectangle.Height - 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1302 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1303 if ((state & ButtonState.All) == ButtonState.All || ((state & ButtonState.Checked) == ButtonState.Checked && (state & ButtonState.Flat) == ButtonState.Flat)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1304 using (HatchBrush hb = new HatchBrush(HatchStyle.Percent50, ColorControlLight, ColorControl)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1305 dc.FillRectangle(hb, rectangle.X + 2, rectangle.Y + 2, rectangle.Width - 4, rectangle.Height - 4);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1306 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1307 dc.DrawRectangle(SystemPens.ControlDark, rectangle.X, rectangle.Y, rectangle.Width - 1, rectangle.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1308 } else if ((state & ButtonState.Flat) == ButtonState.Flat) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1309 dc.DrawRectangle(SystemPens.ControlDark, rectangle.X, rectangle.Y, rectangle.Width - 1, rectangle.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1310 } else if ((state & ButtonState.Checked) == ButtonState.Checked) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1311 using (HatchBrush hb = new HatchBrush(HatchStyle.Percent50, ColorControlLight, ColorControl)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1312 dc.FillRectangle(hb, rectangle.X + 2, rectangle.Y + 2, rectangle.Width - 4, rectangle.Height - 4);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1313 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1314 Pen pen = DarkPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1315 dc.DrawLine(pen, rectangle.X, rectangle.Y, rectangle.X, rectangle.Bottom - 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1316 dc.DrawLine(pen, rectangle.X + 1, rectangle.Y, rectangle.Right - 2, rectangle.Y);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1317
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1318 pen = NormalPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1319 dc.DrawLine(pen, rectangle.X + 1, rectangle.Y + 1, rectangle.X + 1, rectangle.Bottom - 3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1320 dc.DrawLine(pen, rectangle.X + 2, rectangle.Y + 1, rectangle.Right - 3, rectangle.Y + 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1321
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1322 pen = LightPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1323 dc.DrawLine(pen, rectangle.X, rectangle.Bottom - 1, rectangle.Right - 2, rectangle.Bottom - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1324 dc.DrawLine(pen, rectangle.Right - 1, rectangle.Y, rectangle.Right - 1, rectangle.Bottom - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1325 } else if (((state & ButtonState.Pushed) == ButtonState.Pushed) && ((state & ButtonState.Normal) == ButtonState.Normal)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1326 Pen pen = DarkPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1327 dc.DrawLine(pen, rectangle.X, rectangle.Y, rectangle.X, rectangle.Bottom - 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1328 dc.DrawLine(pen, rectangle.X + 1, rectangle.Y, rectangle.Right - 2, rectangle.Y);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1329
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1330 pen = NormalPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1331 dc.DrawLine(pen, rectangle.X + 1, rectangle.Y + 1, rectangle.X + 1, rectangle.Bottom - 3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1332 dc.DrawLine(pen, rectangle.X + 2, rectangle.Y + 1, rectangle.Right - 3, rectangle.Y + 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1333
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1334 pen = LightPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1335 dc.DrawLine(pen, rectangle.X, rectangle.Bottom - 1, rectangle.Right - 2, rectangle.Bottom - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1336 dc.DrawLine(pen, rectangle.Right - 1, rectangle.Y, rectangle.Right - 1, rectangle.Bottom - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1337 } else if (((state & ButtonState.Inactive) == ButtonState.Inactive) || ((state & ButtonState.Normal) == ButtonState.Normal)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1338 Pen pen = LightPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1339 dc.DrawLine(pen, rectangle.X, rectangle.Y, rectangle.Right - 2, rectangle.Y);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1340 dc.DrawLine(pen, rectangle.X, rectangle.Y, rectangle.X, rectangle.Bottom - 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1341
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1342 pen = NormalPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1343 dc.DrawLine(pen, rectangle.X + 1, rectangle.Bottom - 2, rectangle.Right - 2, rectangle.Bottom - 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1344 dc.DrawLine(pen, rectangle.Right - 2, rectangle.Y + 1, rectangle.Right - 2, rectangle.Bottom - 3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1345
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1346 pen = DarkPen;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1347 dc.DrawLine(pen, rectangle.X, rectangle.Bottom - 1, rectangle.Right - 1, rectangle.Bottom - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1348 dc.DrawLine(pen, rectangle.Right - 1, rectangle.Y, rectangle.Right - 1, rectangle.Bottom - 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1349 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1350 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1351 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1352 Rectangle frect = new Rectangle(Point.Empty, Bounds.Size);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1353 SizeF textsize = g.MeasureString(Text, Font);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1354 using (Brush b = new SolidBrush(enabled ? Color : Color.DarkGray)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1355 g.DrawString(Text, Font, b, new PointF(Bounds.Width / 2.0f - textsize.Width / 2.0f, Bounds.Height / 2.0f - textsize.Height / 2.0f));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1356 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1357 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1358 protected override void MouseDown(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1359 pressed = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1360 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1361 CaptureMouse(true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1362 base.MouseDown(position, buttons);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1363 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1364 protected override void MouseUp(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1365 pressed = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1366 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1367 CaptureMouse(false);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1368 if (position.X >= 0 && position.X <= Bounds.Width && position.Y >= 0 && position.Y <= Bounds.Height && enabled) RaiseEvent(Click);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1369 base.MouseUp(position, buttons);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1370 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1371 protected override void KeyDown(Keys key) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1372 if (key == Keys.Return || key == Keys.Space) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1373 pressed = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1374 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1375 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1376 base.KeyDown(key);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1377 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1378 protected override void KeyUp(Keys key) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1379 if (key == Keys.Return || key == Keys.Space) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1380 if (pressed) RaiseEvent(Click);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1381 pressed = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1382 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1383 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1384 base.KeyUp(key);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1385 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1386 public void Focus() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1387 CaptureKeyboard(true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1388 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1389 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1390 public class FBGCheckBox : FBGControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1391 public FBGCheckBox(IFBGContainerControl parent) : base(parent) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1392 private String text = String.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1393 private Font font = SystemFonts.DefaultFont;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1394 private Color color = SystemColors.ControlText;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1395 private Boolean _checked = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1396 public String Text { get { return text; } set { text = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1397 public Font Font { get { return font; } set { font = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1398 public Color Color { get { return color; } set { color = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1399 public Boolean Checked { get { return _checked; } set { _checked = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1400 public event EventHandler CheckedChanged;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1401 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1402 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1403 ControlPaint.DrawCheckBox(g, 0, 0, 13, 13, _checked ? ButtonState.Checked : ButtonState.Normal);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1404 g.DrawString(Text, Font, new SolidBrush(Color), 15, 0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1405 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1406 protected override void MouseDown(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1407 Checked = !Checked;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1408 RaiseEvent(CheckedChanged);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1409 base.MouseDown(position, buttons);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1410 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1411 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1412 public class FBGImageBox : FBGControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1413 Image image = null;
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1414 Image scaledImage = null;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1415 Size imageSize;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1416 Boolean ownsImage = false;
34
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1417 Boolean shouldScaleImage = false;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1418 PictureBoxSizeMode sizeMode = PictureBoxSizeMode.Normal;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1419 Rectangle imageRect;
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1420 public Image Image { get { return image; } set { SetImage(value, false); } }
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1421 public Boolean PreScaleImage { get; set; }
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1422 public void SetOwnedImage(Image img) { SetImage(img, true); }
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1423 private void SetImage(Image img, Boolean owned) {
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1424 image = img;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1425 imageSize = img == null ? Size.Empty : img.Size;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1426 ownsImage = owned;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1427 UpdateImageRect(Size.Empty);
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1428 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1429 public FBGImageBox(IFBGContainerControl parent) : base(parent) { }
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1430 public PictureBoxSizeMode SizeMode { get { return sizeMode; } set { sizeMode = value; UpdateImageRect(Size.Empty); } }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1431 public override Rectangle Bounds {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1432 get {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1433 return base.Bounds;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1434 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1435 set {
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1436 if (Bounds.Size != value.Size) UpdateImageRect(value.Size);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1437 base.Bounds = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1438 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1439 }
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1440 private void UpdateImageRect(Size csize) {
34
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1441 shouldScaleImage = false;
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1442 if (scaledImage != null) scaledImage.Dispose();
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1443 scaledImage = null;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1444 if (image == null) return;
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1445 Boolean boundsset = !csize.IsEmpty;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1446 if (!boundsset && sizeMode == PictureBoxSizeMode.AutoSize) {
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1447 Size = imageSize;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1448 return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1449 }
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1450 if (!boundsset) csize = Bounds.Size;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1451 switch (sizeMode) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1452 case PictureBoxSizeMode.AutoSize:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1453 case PictureBoxSizeMode.Normal:
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1454 imageRect = new Rectangle(Point.Empty, imageSize);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1455 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1456 case PictureBoxSizeMode.CenterImage:
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1457 imageRect = new Rectangle(csize.Width / 2 - imageSize.Width / 2, csize.Height / 2 - imageSize.Height / 2, imageSize.Width, imageSize.Height);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1458 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1459 case PictureBoxSizeMode.StretchImage:
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1460 imageRect = new Rectangle(Point.Empty, csize);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1461 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1462 case PictureBoxSizeMode.Zoom:
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1463 float xrat = (float)csize.Width / (float)imageSize.Width;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1464 float yrat = (float)csize.Height / (float)imageSize.Height;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1465 float rat = Math.Min(xrat, yrat);
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1466 SizeF dispsize = new SizeF(imageSize.Width * rat, imageSize.Height * rat);
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1467 imageRect = Rectangle.Round(new RectangleF(csize.Width / 2f - dispsize.Width / 2f, csize.Height / 2f - dispsize.Height / 2f, dispsize.Width, dispsize.Height));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1468 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1469 }
34
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1470 shouldScaleImage = imageRect.Size != imageSize;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1471 if (!boundsset) Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1472 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1473 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1474 if (!Visible) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1475 base.Paint(g);
34
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1476 if (shouldScaleImage && PreScaleImage && image != null) {
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1477 scaledImage = new Bitmap(image, imageRect.Size);
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1478 shouldScaleImage = false;
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1479 }
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1480 if (scaledImage != null) g.DrawImage(scaledImage, imageRect);
70bde4fa6a2f FBGUI: Fixed image scaling in FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 33
diff changeset
1481 else if (image != null) g.DrawImage(image, imageRect);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1482 }
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1483 public Point PointToImage(Point point) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1484 switch (sizeMode) {
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1485 case PictureBoxSizeMode.AutoSize:
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1486 case PictureBoxSizeMode.Normal:
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1487 break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1488 case PictureBoxSizeMode.CenterImage:
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1489 point.X -= imageRect.X;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1490 point.Y -= imageRect.Y;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1491 break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1492 case PictureBoxSizeMode.StretchImage:
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1493 case PictureBoxSizeMode.Zoom:
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1494 default:
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1495 point.X = (point.X - imageRect.X) * imageSize.Width / imageRect.Width;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1496 point.Y = (point.Y - imageRect.Y) * imageSize.Height / imageRect.Height;
30
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1497 break;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1498 }
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1499 return point;
24e918d2ac18 FBGUI: Added per-control Cursor handling, added more cursors for Form operations, fixed ImageBox image sizing
Ivo Smits <Ivo@UCIS.nl>
parents: 27
diff changeset
1500 }
33
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1501 protected override void Orphaned() {
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1502 base.Orphaned();
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1503 if (scaledImage != null && scaledImage != image) scaledImage.Dispose();
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1504 scaledImage = null;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1505 if (ownsImage) {
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1506 image.Dispose();
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1507 image = null;
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1508 }
e9b704f193df FBGUI: Improved FBGImageBox
Ivo Smits <Ivo@UCIS.nl>
parents: 32
diff changeset
1509 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1510 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1511 public class FBGListBox : FBGControl {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1512 private List<Object> items = new List<object>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1513 private Object selected = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1514 private Object highlighted = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1515 private Boolean hasScrollBar = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1516 private Boolean hitScrollBar = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1517 private int offset = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1518 private ButtonState buttonUpState = ButtonState.Normal;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1519 private ButtonState buttonDownState = ButtonState.Normal;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1520 private Converter<Object, String> itemFormatter = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1521 public Converter<Object, String> ItemFormatter { get { return itemFormatter; } set { itemFormatter = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1522 public FBGListBox(IFBGContainerControl parent)
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1523 : base(parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1524 BackColor = Color.White;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1525 }
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1526 public int AddItem(Object item) {
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1527 int id = ((System.Collections.IList)items).Add(item);
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1528 Invalidate();
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1529 return id;
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1530 }
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1531 public void RemoveItem(Object item) {
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1532 items.Remove(item);
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1533 if (offset >= items.Count) offset = Math.Max(0, items.Count - 1);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1534 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1535 }
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1536 public void RemoveItemAt(int index) {
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1537 if (index < 0) index += items.Count;
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1538 items.RemoveAt(index);
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1539 if (offset >= index && offset > 0) offset--;
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1540 Invalidate();
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1541 }
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1542 public void Clear() {
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1543 items.Clear();
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1544 offset = 0;
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1545 Invalidate();
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1546 }
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1547 public System.Collections.IList Items { get { return items.AsReadOnly(); } }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1548 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1549 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1550 g.DrawRectangle(Pens.DarkBlue, 0, 0, Bounds.Width - 1, Bounds.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1551 int lh = (int)Math.Ceiling(SystemFonts.DefaultFont.GetHeight());
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1552 int y = 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1553 using (Pen dottedpen = new Pen(Brushes.Black)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1554 dottedpen.DashStyle = DashStyle.Dot;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1555 using (StringFormat sf = new StringFormat(StringFormatFlags.NoWrap)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1556 for (int i = offset; i < items.Count; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1557 Object item = items[i];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1558 String text = itemFormatter == null ? (item == null ? String.Empty : item.ToString()) : itemFormatter(item);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1559 if (item == selected) g.FillRectangle(Brushes.DarkGray, 2, y, Bounds.Width - 4, lh);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1560 if (item == highlighted) g.DrawRectangle(dottedpen, 2, y, Bounds.Width - 5, lh - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1561 g.DrawString(text, SystemFonts.DefaultFont, SystemBrushes.WindowText, new Rectangle(3, y, Bounds.Width - 6, lh), sf);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1562 y += lh;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1563 if (y + lh + 2 >= Bounds.Height) break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1564 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1565 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1566 }
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1567 hasScrollBar = (y < 2 + lh * items.Count) || (offset != 0);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1568 if (hasScrollBar) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1569 int xoff = Bounds.Width - 17;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1570 using (Brush b = new LinearGradientBrush(new Rectangle(xoff, 0, 17, 1), Color.LightGray, Color.White, LinearGradientMode.Horizontal))
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1571 g.FillRectangle(b, xoff, 17, 16, Bounds.Height - 17 - 17);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1572 ControlPaint.DrawScrollButton(g, xoff, 1, 16, 16, ScrollButton.Up, buttonUpState);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1573 ControlPaint.DrawScrollButton(g, xoff, Bounds.Height - 17, 16, 16, ScrollButton.Down, buttonDownState);
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1574 if (items.Count > 1) g.DrawRectangle(Pens.Black, new Rectangle(xoff, 17 + offset * (Bounds.Height - 17 - 17 - 20) / (items.Count - 1), 15, 20));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1575 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1576 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1577 protected override void MouseDown(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1578 if ((buttons & MouseButtons.Left) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1579 CaptureMouse(true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1580 if (hasScrollBar && position.X > Bounds.Width - 17) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1581 hitScrollBar = true;
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1582 int off = offset;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1583 if (position.Y < 17) {
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1584 off--;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1585 buttonUpState = ButtonState.Pushed;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1586 } else if (position.Y > Bounds.Height - 17) {
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1587 off++;
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1588 buttonDownState = ButtonState.Pushed;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1589 } else {
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1590 off = (int)Math.Round((position.Y - 17) * (items.Count - 1) / (double)(Bounds.Height - 17 - 17 - 10));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1591 }
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1592 offset = Math.Max(0, Math.Min(items.Count - 1, off));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1593 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1594 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1595 MouseHandler(position, buttons);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1596 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1597 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1598 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1599 protected override void MouseMove(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1600 if (hitScrollBar) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1601 if (position.Y < 17) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1602 } else if (position.Y > Bounds.Height - 17) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1603 } else {
78
1a10ca0f662e FBGUI updates
Ivo Smits <Ivo@UCIS.nl>
parents: 69
diff changeset
1604 offset = Math.Max(0, Math.Min(items.Count - 1, (int)Math.Round((position.Y - 17) * (items.Count - 1) / (double)(Bounds.Height - 17 - 17 - 10))));
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1605 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1606 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1607 return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1608 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1609 MouseHandler(position, buttons);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1610 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1611 protected override void MouseUp(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1612 if ((buttons & MouseButtons.Left) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1613 CaptureMouse(false);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1614 buttonUpState = buttonDownState = ButtonState.Normal;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1615 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1616 if (hitScrollBar) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1617 hitScrollBar = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1618 return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1619 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1620 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1621 if (hitScrollBar) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1622 MouseHandler(position, buttons);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1623 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1624 private void MouseHandler(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1625 if ((buttons & MouseButtons.Left) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1626 int lh = (int)Math.Ceiling(SystemFonts.DefaultFont.GetHeight());
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1627 int i = (position.Y - 2) / lh + offset;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1628 if (i < 0) i = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1629 if (i >= items.Count) i = items.Count - 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1630 Boolean changed = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1631 Object current = items[i];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1632 if (!ReferenceEquals(highlighted, current)) changed = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1633 highlighted = current;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1634 if ((new Rectangle(Point.Empty, Bounds.Size)).Contains(position)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1635 if (!ReferenceEquals(selected, current)) changed = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1636 selected = current;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1637 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1638 if (changed) Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1639 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1640 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1641 }
27
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1642 public abstract class FBGUpDownControlBase : FBGControl {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1643 private ButtonState buttonUpState = ButtonState.Normal;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1644 private ButtonState buttonDownState = ButtonState.Normal;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1645 public FBGUpDownControlBase(IFBGContainerControl parent) : base(parent) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1646 BackColor = Color.White;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1647 Height = 25;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1648 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1649 protected override void Paint(Graphics g) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1650 base.Paint(g);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1651 g.DrawRectangle(Pens.DarkBlue, 0, 0, Bounds.Width - 1, Bounds.Height - 1);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1652 int lh = (int)Math.Ceiling(SystemFonts.DefaultFont.GetHeight());
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1653 String text = SelectedText;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1654 if (text == null) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1655 g.FillRectangle(Brushes.DarkGray, 2, 2, Bounds.Width - 4 - 16, Bounds.Height - 4);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1656 } else {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1657 using (StringFormat sf = new StringFormat(StringFormatFlags.NoWrap)) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1658 sf.LineAlignment = StringAlignment.Center;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1659 g.FillRectangle(Brushes.LightGray, 2, 2, Bounds.Width - 4 - 16, Bounds.Height - 4);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1660 g.DrawString(text, SystemFonts.DefaultFont, SystemBrushes.WindowText, new Rectangle(3, 2, Bounds.Width - 6 - 16, Bounds.Height - 4), sf);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1661 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1662 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1663 int xoff = Bounds.Width - 17;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1664 int he = (Bounds.Height - 2) / 2;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1665 ControlPaint.DrawScrollButton(g, xoff, 1, 16, he, ScrollButton.Up, buttonUpState);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1666 ControlPaint.DrawScrollButton(g, xoff, Bounds.Height - he - 1, 16, he, ScrollButton.Down, buttonDownState);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1667 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1668 protected abstract String SelectedText { get; }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1669 protected override void MouseDown(Point position, MouseButtons buttons) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1670 CaptureKeyboard(true);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1671 if ((buttons & MouseButtons.Left) != 0) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1672 CaptureMouse(true);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1673 if (position.X > Bounds.Width - 17) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1674 if (position.Y < Bounds.Height / 2) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1675 buttonUpState = ButtonState.Pushed;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1676 ButtonPressUp();
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1677 } else {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1678 buttonDownState = ButtonState.Pushed;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1679 ButtonPressDown();
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1680 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1681 Invalidate(new Rectangle(Bounds.Width - 16, 0, 16, Bounds.Height));
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1682 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1683 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1684 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1685 protected override void MouseUp(Point position, MouseButtons buttons) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1686 if ((buttons & MouseButtons.Left) != 0) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1687 CaptureMouse(false);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1688 buttonUpState = buttonDownState = ButtonState.Normal;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1689 Invalidate(new Rectangle(Bounds.Width - 16, 0, 16, Bounds.Height));
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1690 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1691 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1692 protected override void KeyDown(Keys key) {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1693 base.KeyDown(key);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1694 if (key == Keys.Down) ButtonPressDown();
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1695 else if (key == Keys.Up) ButtonPressUp();
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1696 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1697 protected abstract void ButtonPressUp();
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1698 protected abstract void ButtonPressDown();
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1699 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1700 public class FBGDomainUpDown : FBGUpDownControlBase {
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1701 private List<Object> items = new List<object>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1702 private int selectedIndex = -1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1703 private Converter<Object, String> itemFormatter = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1704 public Boolean AllowSelectEmpty { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1705 public Converter<Object, String> ItemFormatter { get { return itemFormatter; } set { itemFormatter = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1706 public event EventHandler SelectedIndexChanged;
27
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1707 public FBGDomainUpDown(IFBGContainerControl parent) : base(parent) { }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1708 public void AddItem(Object item) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1709 items.Add(item);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1710 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1711 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1712 public void RemoveItem(Object item) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1713 items.Remove(item);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1714 FixSelectedIndex(0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1715 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1716 public void RemoveItem(int index) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1717 items.RemoveAt(index);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1718 FixSelectedIndex(0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1719 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1720 public int SelectedIndex {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1721 get { return selectedIndex; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1722 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1723 if (value < -2 || value >= items.Count) throw new ArgumentOutOfRangeException("value", "Value must be between -1 and the number of items minus one");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1724 if (selectedIndex == value) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1725 selectedIndex = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1726 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1727 RaiseEvent(SelectedIndexChanged);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1728 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1729 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1730 public Object SelectedItem {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1731 get { return selectedIndex == -1 ? null : items[selectedIndex]; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1732 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1733 if (value == null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1734 SelectedIndex = -1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1735 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1736 for (int i = 0; i < items.Count; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1737 if (items[i] == value) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1738 SelectedIndex = i;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1739 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1740 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1741 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1742 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1743 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1744 }
27
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1745 protected override string SelectedText {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1746 get {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1747 if (selectedIndex == -1) return null;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1748 Object item = items[selectedIndex];
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1749 if (itemFormatter != null) return itemFormatter(item);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1750 if (item == null) return null;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1751 return item.ToString();
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1752 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1753 }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1754 private void FixSelectedIndex(int change) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1755 int value = selectedIndex;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1756 if (value == 0 && change == -1 && !AllowSelectEmpty) change = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1757 value += change;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1758 if (value < -1) value = -1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1759 if (value >= items.Count) value = items.Count - 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1760 SelectedIndex = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1761 }
27
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1762 protected override void ButtonPressDown() {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1763 FixSelectedIndex(1);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1764 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1765 protected override void ButtonPressUp() {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1766 FixSelectedIndex(-1);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1767 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1768 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1769 public class FBGNumericUpDown : FBGUpDownControlBase {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1770 private int minimum = 0;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1771 private int maximum = 0;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1772 private int value = 0;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1773 public event EventHandler SelectedValueChanged;
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1774 public FBGNumericUpDown(IFBGContainerControl parent) : base(parent) { }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1775 public int Value {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1776 get { return value; }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1777 set { if (this.value == value) return; this.value = value; Invalidate(); RaiseEvent(SelectedValueChanged); }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1778 }
27
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1779 public int Minimum {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1780 get { return minimum; }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1781 set { minimum = value; if (this.value < minimum) this.Value = minimum; }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1782 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1783 public int Maximum {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1784 get { return maximum; }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1785 set { maximum = value; if (this.value > maximum) this.Value = maximum; }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1786 }
27
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1787 public int Step { get; set; }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1788 protected override string SelectedText {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1789 get { return value.ToString(); }
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1790 }
27
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1791 protected override void ButtonPressDown() {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1792 Value = Math.Max(minimum, value - Step);
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1793 }
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1794 protected override void ButtonPressUp() {
5bfc6c68591e FBGUI: Added numeric up/down control, fix for transparent control background
Ivo Smits <Ivo@UCIS.nl>
parents: 26
diff changeset
1795 Value = Math.Min(maximum, value + Step);
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1796 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1797 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1798 public interface IFBGTreeParent {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1799 FBGTreeView TreeView { get; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1800 int Depth { get; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1801 void AddChild(FBGTreeNode node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1802 void RemoveChild(FBGTreeNode node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1803 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1804 public class FBGTreeNode : IFBGTreeParent {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1805 private List<FBGTreeNode> children = new List<FBGTreeNode>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1806 private Boolean expanded = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1807 private Boolean hasCheckBox = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1808 private Boolean isChecked = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1809 private Object item;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1810
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1811 public FBGTreeView TreeView { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1812 public int Depth { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1813 public Object Tag { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1814 public IFBGTreeParent Parent { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1815
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1816 public IList<FBGTreeNode> Children { get { return children.AsReadOnly(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1817
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1818 public Object Item {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1819 get { return item; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1820 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1821 item = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1822 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1823 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1824 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1825 public Boolean Expanded {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1826 get { return expanded; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1827 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1828 if (expanded == value) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1829 expanded = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1830 UpdateTree();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1831 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1832 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1833 public Boolean HasCheckBox {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1834 get { return hasCheckBox; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1835 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1836 if (hasCheckBox == value) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1837 hasCheckBox = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1838 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1839 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1840 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1841 public Boolean Checked {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1842 get { return isChecked; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1843 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1844 if (isChecked == value) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1845 isChecked = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1846 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1847 if (TreeView != null) TreeView.RaiseNodeCheckedChanged(this);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1848 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1849 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1850
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1851 public FBGTreeNode(IFBGTreeParent parent, Object item) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1852 this.TreeView = parent.TreeView;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1853 this.Depth = parent.Depth + 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1854 this.Parent = parent;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1855 this.item = item;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1856 parent.AddChild(this);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1857 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1858
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1859 public void Remove() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1860 Parent.RemoveChild(this);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1861 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1862 void IFBGTreeParent.AddChild(FBGTreeNode node) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1863 children.Add(node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1864 if (Expanded) UpdateTree();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1865 else Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1866 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1867 void IFBGTreeParent.RemoveChild(FBGTreeNode node) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1868 children.Remove(node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1869 TreeView.ReleaseNodeFromTree(node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1870 if (Expanded) UpdateTree();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1871 else Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1872 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1873 public void Invalidate() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1874 if (TreeView != null) TreeView.Invalidate(this);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1875 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1876 private void UpdateTree() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1877 if (TreeView != null) TreeView.UpdateView();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1878 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1879 public FBGTreeNode AddNode(Object item) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1880 return new FBGTreeNode(this, item);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1881 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1882 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1883 public class FBGTreeView : FBGControl, IFBGTreeParent {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1884 private List<FBGTreeNode> items = new List<FBGTreeNode>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1885 private List<FBGTreeNode> itemsView = new List<FBGTreeNode>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1886 private FBGTreeNode selected = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1887 private FBGTreeNode highlighted = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1888 private Boolean hasScrollBar = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1889 private Boolean hitScrollBar = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1890 private int offset = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1891 private ButtonState buttonUpState = ButtonState.Normal;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1892 private ButtonState buttonDownState = ButtonState.Normal;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1893 private Converter<Object, String> itemFormatter = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1894
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1895 public Converter<Object, String> ItemFormatter { get { return itemFormatter; } set { itemFormatter = value; Invalidate(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1896 public FBGTreeNode SelectedNode { get { return selected; } set { if (selected != value) { selected = value; Invalidate(); RaiseEvent(SelectedNodeChanged); } } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1897 public IList<FBGTreeNode> Nodes { get { return items.AsReadOnly(); } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1898
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1899 public event EventHandler SelectedNodeChanged;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1900 public event EventHandler NodeCheckedChanged;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1901
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1902 public FBGTreeView(IFBGContainerControl parent) : base(parent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1903 BackColor = Color.White;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1904 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1905 FBGTreeView IFBGTreeParent.TreeView { get { return this; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1906 int IFBGTreeParent.Depth { get { return -1; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1907 void IFBGTreeParent.AddChild(FBGTreeNode node) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1908 items.Add(node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1909 UpdateView();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1910 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1911 void IFBGTreeParent.RemoveChild(FBGTreeNode node) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1912 items.Remove(node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1913 ReleaseNodeFromTree(node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1914 UpdateView();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1915 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1916 public FBGTreeNode AddNode(Object item) { return new FBGTreeNode(this, item); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1917 internal void ReleaseNodeFromTree(FBGTreeNode node) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1918 if (highlighted == node) highlighted = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1919 if (selected == node) SelectedNode = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1920 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1921 internal void RaiseNodeCheckedChanged(FBGTreeNode node) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1922 RaiseEvent(NodeCheckedChanged);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1923 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1924 internal void UpdateView() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1925 List<FBGTreeNode> newView = new List<FBGTreeNode>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1926 Stack<Queue<FBGTreeNode>> stack = new Stack<Queue<FBGTreeNode>>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1927 stack.Push(new Queue<FBGTreeNode>(items));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1928 while (stack.Count > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1929 Queue<FBGTreeNode> list = stack.Peek();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1930 if (list.Count == 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1931 stack.Pop();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1932 continue;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1933 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1934 FBGTreeNode item = list.Dequeue();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1935 newView.Add(item);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1936 if (item.Expanded) stack.Push(new Queue<FBGTreeNode>(item.Children));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1937 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1938 itemsView = newView;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1939 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1940 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1941 internal void Invalidate(FBGTreeNode node) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1942 int i = itemsView.IndexOf(node);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1943 if (i == -1) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1944 int lh = (int)Math.Ceiling(SystemFonts.DefaultFont.GetHeight() / 2.0) * 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1945 Invalidate(new Rectangle(1, i * lh, Bounds.Width - 1, lh));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1946 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1947 protected override void Paint(Graphics g) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1948 base.Paint(g);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1949
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1950 int lh = (int)Math.Ceiling(SystemFonts.DefaultFont.GetHeight() / 2.0) * 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1951 int th = lh * itemsView.Count;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1952 hasScrollBar = offset > 0 || th + 2 > Bounds.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1953 int y = 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1954 using (Pen dottedpen = new Pen(Brushes.Black)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1955 dottedpen.DashStyle = DashStyle.Dot;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1956 using (StringFormat sf = new StringFormat(StringFormatFlags.NoWrap)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1957 int lw = Bounds.Width - 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1958 if (hasScrollBar) lw -= 17;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1959 for (int i = offset; i < itemsView.Count; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1960 FBGTreeNode item = itemsView[i];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1961 if (y + 2 < Bounds.Height) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1962 Object obj = item.Item;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1963 String text = itemFormatter == null ? (obj == null ? String.Empty : obj.ToString()) : itemFormatter(obj);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1964 if (item == selected) g.FillRectangle(Brushes.DarkGray, 2, y, lw - 2, lh);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1965 if (item == highlighted) g.DrawRectangle(dottedpen, 2, y, lw - 3, lh - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1966 int x = 3 + 19 * item.Depth + 14;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1967 if (item.HasCheckBox) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1968 x += 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1969 ControlPaint.DrawCheckBox(g, x, y, lh, lh, item.Checked ? ButtonState.Checked : ButtonState.Normal);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1970 x += lh + 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1971 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1972 g.DrawString(text, SystemFonts.DefaultFont, SystemBrushes.WindowText, new Rectangle(x, y, lw - x, lh), sf);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1973 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1974 int upto = y + 2 + 4 - 8;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1975 for (int j = i - 1; j >= 0; j--) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1976 if (itemsView[j].Depth < item.Depth) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1977 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1978 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1979 if (itemsView[j].Depth == item.Depth) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1980 if (itemsView[j].Children.Count > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1981 upto = 2 + lh * (j - offset) + 10;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1982 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1983 upto = 2 + lh * (j - offset) + 6;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1984 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1985 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1986 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1987 if (j <= offset) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1988 upto = 2 + 2 + 4 - 8;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1989 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1990 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1991 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1992 if (item.Children.Count > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1993 g.DrawRectangle(Pens.Black, 3 + 19 * item.Depth, y + 2, 8, 8);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1994 g.DrawLine(Pens.Black, 3 + 19 * item.Depth + 2, y + 2 + 4, 3 + 19 * item.Depth + 6, y + 2 + 4);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1995 if (!item.Expanded) g.DrawLine(Pens.Black, 3 + 19 * item.Depth + 4, y + 4, 3 + 19 * item.Depth + 4, y + 2 + 6);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1996
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1997 g.DrawLine(dottedpen, 3 + 19 * item.Depth + 8, y + 2 + 4, 3 + 19 * item.Depth + 14, y + 2 + 4);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1998 g.DrawLine(dottedpen, 3 + 19 * item.Depth + 4, y + 2 + 4 - 6, 3 + 19 * item.Depth + 4, upto);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1999 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2000 g.DrawLine(dottedpen, 3 + 19 * item.Depth + 4, y + 2 + 4, 3 + 19 * item.Depth + 14, y + 2 + 4);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2001 g.DrawLine(dottedpen, 3 + 19 * item.Depth + 4, y + 2 + 4 - 2, 3 + 19 * item.Depth + 4, upto);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2002 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2003 y += lh;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2004 //if (y + lh + 2 >= Bounds.Height && item.Depth == 0) break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2005 if (y + 2 >= Bounds.Height && item.Depth == 0) break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2006 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2007 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2008 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2009 //if (y < th) hasScrollBar = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2010 //hasScrollBar = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2011 if (hasScrollBar) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2012 int xoff = Bounds.Width - 17;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2013 using (Brush b = new LinearGradientBrush(new Rectangle(xoff, 0, 17, 1), Color.LightGray, Color.White, LinearGradientMode.Horizontal))
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2014 g.FillRectangle(b, xoff, 17, 16, Bounds.Height - 17 - 17);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2015 ControlPaint.DrawScrollButton(g, xoff, 1, 16, 16, ScrollButton.Up, buttonUpState);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2016 ControlPaint.DrawScrollButton(g, xoff, Bounds.Height - 17, 16, 16, ScrollButton.Down, buttonDownState);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2017 g.DrawRectangle(Pens.Black, new Rectangle(xoff, 17 + offset * (Bounds.Height - 17 - 17 - 20) / (itemsView.Count - 1), 15, 20));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2018 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2019
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2020 g.DrawRectangle(Pens.DarkBlue, 0, 0, Bounds.Width - 1, Bounds.Height - 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2021 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2022 protected override void MouseDown(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2023 CaptureKeyboard(true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2024 if ((buttons & MouseButtons.Left) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2025 CaptureMouse(true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2026 if (hasScrollBar && position.X > Bounds.Width - 17) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2027 hitScrollBar = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2028 if (position.Y < 17) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2029 offset--;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2030 buttonUpState = ButtonState.Pushed;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2031 } else if (position.Y > Bounds.Height - 17) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2032 offset++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2033 buttonDownState = ButtonState.Pushed;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2034 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2035 offset = (int)Math.Round((position.Y - 17) * (itemsView.Count - 1) / (double)(Bounds.Height - 17 - 17 - 10));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2036 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2037 if (offset < 0) offset = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2038 if (offset >= itemsView.Count) offset = itemsView.Count - 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2039 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2040 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2041 MouseHandler(position, buttons, true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2042 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2043 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2044 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2045 protected override void MouseMove(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2046 if (hitScrollBar) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2047 if (position.Y < 17) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2048 } else if (position.Y > Bounds.Height - 17) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2049 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2050 offset = (int)Math.Round((position.Y - 17) * (itemsView.Count - 1) / (double)(Bounds.Height - 17 - 17 - 10));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2051 if (offset < 0) offset = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2052 if (offset >= itemsView.Count) offset = itemsView.Count - 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2053 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2054 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2055 return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2056 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2057 MouseHandler(position, buttons, false);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2058 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2059 protected override void MouseUp(Point position, MouseButtons buttons) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2060 if ((buttons & MouseButtons.Left) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2061 CaptureMouse(false);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2062 buttonUpState = buttonDownState = ButtonState.Normal;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2063 Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2064 if (hitScrollBar) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2065 hitScrollBar = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2066 return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2067 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2068 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2069 if (hitScrollBar) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2070 MouseHandler(position, buttons, false);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2071 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2072 private void MouseHandler(Point position, MouseButtons buttons, Boolean down) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2073 if ((buttons & MouseButtons.Left) != 0 && itemsView.Count > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2074 int lh = (int)Math.Ceiling(SystemFonts.DefaultFont.GetHeight() / 2.0) * 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2075 int i = (position.Y - 2) / lh + offset;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2076 if (i < 0) i = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2077 if (i >= itemsView.Count) i = itemsView.Count - 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2078 Boolean changed = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2079 FBGTreeNode current = itemsView[i];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2080 if (!ReferenceEquals(highlighted, current)) changed = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2081 highlighted = current;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2082 if (current.Children.Count > 0 && (new Rectangle(3 + 19 * current.Depth, 2 + lh * (i - offset) + 2, 8, 8)).Contains(position)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2083 if (down) current.Expanded = !current.Expanded;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2084 } else if (current.HasCheckBox && (new Rectangle(3 + 19 * current.Depth + 14 + 2, 2 + lh * (i - offset), lh, lh)).Contains(position)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2085 if (down) current.Checked = !current.Checked;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2086 } else if ((new Rectangle(Point.Empty, Bounds.Size)).Contains(position)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2087 SelectedNode = current;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2088 changed = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2089 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2090 if (changed) Invalidate();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2091 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2092 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2093 protected override void KeyDown(Keys key) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2094 base.KeyDown(key);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2095 if (key == Keys.Up) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2096 int i = itemsView.IndexOf(selected);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2097 i--;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2098 if (i >= 0) SelectAndScrollIntoView(itemsView[i]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2099 } else if (key == Keys.Down) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2100 int i = itemsView.IndexOf(selected);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2101 i++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2102 if (i < itemsView.Count) SelectAndScrollIntoView(itemsView[i]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2103 } else if (key == Keys.Left && selected != null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2104 if (selected.Expanded && selected.Children.Count > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2105 selected.Expanded = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2106 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2107 FBGTreeNode tn = selected.Parent as FBGTreeNode;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2108 if (tn != null) SelectAndScrollIntoView(tn);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2109 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2110 } else if (key == Keys.Right && selected != null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2111 if (!selected.Expanded && selected.Children.Count > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2112 selected.Expanded = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2113 } else if (selected.Children.Count > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2114 SelectAndScrollIntoView(selected.Children[0]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2115 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2116 } else if (key == Keys.Space && selected != null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2117 if (selected.HasCheckBox) selected.Checked = !selected.Checked;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2118 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2119 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2120 private void SelectAndScrollIntoView(FBGTreeNode tn) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2121 int i = itemsView.IndexOf(tn);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2122 if (i == -1) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2123 for (FBGTreeNode tp = tn.Parent as FBGTreeNode; tp != null; tp = tp.Parent as FBGTreeNode) if (!tp.Expanded) tp.Expanded = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2124 i = itemsView.IndexOf(tn);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2125 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2126 if (i != -1) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2127 int lh = (int)Math.Ceiling(SystemFonts.DefaultFont.GetHeight() / 2.0) * 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2128 if (i < offset) offset = i;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2129 offset = Math.Max(offset, i - Bounds.Height / lh + 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2130 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2131 highlighted = tn;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2132 SelectedNode = tn;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2133 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2134 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2135 }