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.statusbar;
10
11 import std.utf : toUTFz;
12 import dguihub.core.controls.subclassedcontrol;
13
14 final class StatusPart {
15 private StatusBar _owner;
16 private string _text;
17 private int _width;
18
19 package this(StatusBar sb, string txt, int w) {
20 this._owner = sb;
21 this._text = txt;
22 this._width = w;
23 }
24
25 @property public string text() {
26 return this._text;
27 }
28
29 @property public void text(string s) {
30 this._text = s;
31
32 if (this._owner && this._owner.created) {
33 this._owner.sendMessage(SB_SETTEXTW, MAKEWPARAM(this.index, 0),
34 cast(LPARAM)toUTFz!(wchar*)(s));
35 }
36 }
37
38 @property public int width() {
39 return this._width;
40 }
41
42 @property public int index() {
43 foreach (int i, StatusPart sp; this._owner.parts) {
44 if (sp is this) {
45 return i;
46 }
47 }
48
49 return -1;
50 }
51
52 @property public StatusBar statusBar() {
53 return this._owner;
54 }
55 }
56
57 class StatusBar : SubclassedControl {
58 private Collection!(StatusPart) _parts;
59 private bool _partsVisible = false;
60
61 public StatusPart addPart(string s, int w) {
62 if (!this._parts) {
63 this._parts = new Collection!(StatusPart)();
64 }
65
66 StatusPart sp = new StatusPart(this, s, w);
67 this._parts.add(sp);
68
69 if (this.created) {
70 StatusBar.insertPart(sp);
71 }
72
73 return sp;
74 }
75
76 public StatusPart addPart(int w) {
77 return this.addPart(null, w);
78 }
79
80 /*
81 public void removePanel(int idx)
82 {
83
84 }
85 */
86
87 @property public bool partsVisible() {
88 return this._partsVisible;
89 }
90
91 @property public void partsVisible(bool b) {
92 this._partsVisible = b;
93
94 if (this.created) {
95 this.setStyle(SBARS_SIZEGRIP, b);
96 }
97 }
98
99 @property public StatusPart[] parts() {
100 if (this._parts) {
101 return this._parts.get();
102 }
103
104 return null;
105 }
106
107 private static void insertPart(StatusPart stp) {
108 StatusBar owner = stp.statusBar;
109 StatusPart[] sparts = owner.parts;
110 uint[] parts = new uint[sparts.length];
111
112 foreach (int i, StatusPart sp; sparts) {
113 if (!i) {
114 parts[i] = sp.width;
115 } else {
116 parts[i] = parts[i - 1] + sp.width;
117 }
118 }
119
120 owner.sendMessage(SB_SETPARTS, sparts.length, cast(LPARAM)parts.ptr);
121
122 foreach (int i, StatusPart sp; sparts) {
123 owner.sendMessage(SB_SETTEXTW, MAKEWPARAM(i, 0), cast(LPARAM)toUTFz!(wchar*)(sp.text));
124 }
125 }
126
127 protected override void createControlParams(ref CreateControlParams ccp) {
128 this._dock = DockStyle.bottom; //Force dock
129
130 ccp.superclassName = WC_STATUSBAR;
131 ccp.className = WC_DSTATUSBAR;
132
133 if (this._partsVisible) {
134 this.setStyle(SBARS_SIZEGRIP, true);
135 }
136
137 super.createControlParams(ccp);
138 }
139
140 protected override void onHandleCreated(EventArgs e) {
141 if (this._parts) {
142 foreach (StatusPart sp; this._parts) {
143 StatusBar.insertPart(sp);
144 }
145 }
146
147 super.onHandleCreated(e);
148 }
149 }