1 /** DGui project file.
2 
3 Copyright: Trogu Antonio Davide 2011-2013
4 
5 License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 
7 Authors: Trogu Antonio Davide
8 */
9 module dguihub.label;
10 
11 import std..string;
12 import dguihub.core.controls.control;
13 
14 enum LabelDrawMode : ubyte {
15    normal = 0,
16    ownerDraw = 1,
17 }
18 
19 class Label : Control {
20    private LabelDrawMode _drawMode = LabelDrawMode.normal;
21    private TextAlignment _textAlign = TextAlignment.middle | TextAlignment.left;
22 
23    alias @property Control.text text;
24    private bool _multiLine = false;
25 
26    @property public override void text(string s) {
27       super.text = s;
28 
29       this._multiLine = false;
30 
31       foreach (char ch; s) {
32          if (ch == '\n' || ch == '\r') {
33             this._multiLine = true;
34             break;
35          }
36       }
37 
38       if (this.created) {
39          this.invalidate();
40       }
41    }
42 
43    @property public final LabelDrawMode drawMode() {
44       return this._drawMode;
45    }
46 
47    @property public final void drawMode(LabelDrawMode ldm) {
48       this._drawMode = ldm;
49    }
50 
51    @property public final TextAlignment alignment() {
52       return this._textAlign;
53    }
54 
55    @property public final void alignment(TextAlignment ta) {
56       this._textAlign = ta;
57 
58       if (this.created) {
59          this.invalidate();
60       }
61    }
62 
63    protected override void createControlParams(ref CreateControlParams ccp) {
64       ccp.className = WC_DLABEL;
65       ccp.classStyle = ClassStyles.hRedraw | ClassStyles.vRedraw;
66 
67       super.createControlParams(ccp);
68    }
69 
70    protected override void onPaint(PaintEventArgs e) {
71       super.onPaint(e);
72 
73       if (this._drawMode is LabelDrawMode.normal) {
74          Canvas c = e.canvas;
75          Rect r = Rect(nullPoint, this.clientSize);
76 
77          scope TextFormat tf = new TextFormat(this._multiLine
78                ? TextFormatFlags.wordBreak : TextFormatFlags.singleLine);
79          tf.alignment = this._textAlign;
80 
81          scope SolidBrush sb = new SolidBrush(this.backColor);
82          c.fillRectangle(sb, r);
83          c.drawText(this.text, r, this.foreColor, this.font, tf);
84       }
85    }
86 }