1 // Written by Christopher E. Miller
2 // See the included license.txt for copyright and license details.
3 
4 
5 
6 module dfl.picturebox;
7 
8 private import dfl.control, dfl.base, dfl.drawing, dfl.event;
9 private import dfl.internal.winapi;
10 
11 
12 
13 enum PictureBoxSizeMode: ubyte {
14 
15    NORMAL, // Image at upper left of control.
16    /// ditto
17    AUTO_SIZE, // Control sizes to fit image size.
18    /// ditto
19    CENTER_IMAGE, // Image at center of control.
20    /// ditto
21    STRETCH_IMAGE, // Image stretched to fit control.
22 }
23 
24 
25 
26 class PictureBox: Control { // docmain
27    this() {
28       //resizeRedraw = true; // Redrawn manually in onResize() when necessary.
29    }
30 
31 
32 
33    final @property void image(Image img) { // setter
34       if(this.img is img) {
35          return;
36       }
37 
38       if(_mode == PictureBoxSizeMode.AUTO_SIZE) {
39          if(img) {
40             clientSize = img.size;
41          } else {
42             clientSize = Size(0, 0);
43          }
44       }
45 
46       this.img = img;
47 
48       if(created) {
49          invalidate();
50       }
51 
52       onImageChanged(EventArgs.empty);
53    }
54 
55    /// ditto
56    final @property Image image() { // getter
57       return img;
58    }
59 
60 
61 
62    final @property void sizeMode(PictureBoxSizeMode sm) { // setter
63       if(_mode == sm) {
64          return;
65       }
66 
67       final switch(sm) {
68          case PictureBoxSizeMode.AUTO_SIZE:
69             if(img) {
70                clientSize = img.size;
71             } else {
72                clientSize = Size(0, 0);
73             }
74             break;
75 
76          case PictureBoxSizeMode.NORMAL:
77             break;
78 
79          case PictureBoxSizeMode.CENTER_IMAGE:
80             break;
81 
82          case PictureBoxSizeMode.STRETCH_IMAGE:
83             break;
84       }
85 
86       _mode = sm;
87 
88       if(created) {
89          invalidate();
90       }
91 
92       onSizeModeChanged(EventArgs.empty);
93    }
94 
95    /// ditto
96    final @property PictureBoxSizeMode sizeMode() { // getter
97       return _mode;
98    }
99 
100 
101 
102    @property void borderStyle(BorderStyle bs) { // setter
103       final switch(bs) {
104          case BorderStyle.FIXED_3D:
105             _style(_style() & ~WS_BORDER);
106             _exStyle(_exStyle() | WS_EX_CLIENTEDGE);
107             break;
108 
109          case BorderStyle.FIXED_SINGLE:
110             _exStyle(_exStyle() & ~WS_EX_CLIENTEDGE);
111             _style(_style() | WS_BORDER);
112             break;
113 
114          case BorderStyle.NONE:
115             _style(_style() & ~WS_BORDER);
116             _exStyle(_exStyle() & ~WS_EX_CLIENTEDGE);
117             break;
118       }
119 
120       if(created) {
121          redrawEntire();
122       }
123    }
124 
125    /// ditto
126    @property BorderStyle borderStyle() { // getter
127       if(_exStyle() & WS_EX_CLIENTEDGE) {
128          return BorderStyle.FIXED_3D;
129       } else if(_style() & WS_BORDER) {
130          return BorderStyle.FIXED_SINGLE;
131       }
132       return BorderStyle.NONE;
133    }
134 
135 
136    //EventHandler sizeModeChanged;
137    Event!(PictureBox, EventArgs) sizeModeChanged; ///
138    //EventHandler imageChanged;
139    Event!(PictureBox, EventArgs) imageChanged; ///
140 
141 
142  protected:
143 
144 
145    void onSizeModeChanged(EventArgs ea) {
146       sizeModeChanged(this, ea);
147    }
148 
149 
150 
151    void onImageChanged(EventArgs ea) {
152       imageChanged(this, ea);
153    }
154 
155 
156    override void onPaint(PaintEventArgs ea) {
157       if(img) {
158          final switch(_mode) {
159             case PictureBoxSizeMode.NORMAL:
160             case PictureBoxSizeMode.AUTO_SIZE: // Drawn the same as normal.
161                img.draw(ea.graphics, Point(0, 0));
162                break;
163 
164             case PictureBoxSizeMode.CENTER_IMAGE: {
165                   Size isz;
166                   isz = img.size;
167                   img.draw(ea.graphics, Point((clientSize.width  - isz.width) / 2,
168                                               (clientSize.height - isz.height) / 2));
169                }
170                break;
171 
172             case PictureBoxSizeMode.STRETCH_IMAGE:
173                img.drawStretched(ea.graphics, Rect(0, 0, clientSize.width, clientSize.height));
174                break;
175          }
176       }
177 
178       super.onPaint(ea);
179    }
180 
181 
182    override void onResize(EventArgs ea) {
183       if(PictureBoxSizeMode.CENTER_IMAGE == _mode || PictureBoxSizeMode.STRETCH_IMAGE == _mode) {
184          invalidate();
185       }
186 
187       super.onResize(ea);
188    }
189 
190 
191  private:
192    PictureBoxSizeMode _mode = PictureBoxSizeMode.NORMAL;
193    Image img = null;
194 }
195