1 /*
2  * PROJECT:     PAINT for ReactOS
3  * LICENSE:     LGPL
4  * FILE:        base/applications/mspaint/toolsmodel.cpp
5  * PURPOSE:     Keep track of tool parameters, notify listeners
6  * PROGRAMMERS: Benedikt Freisen
7  */
8 
9 /* INCLUDES *********************************************************/
10 
11 #include "precomp.h"
12 
13 /* FUNCTIONS ********************************************************/
14 
15 ToolsModel::ToolsModel()
16 {
17     m_lineWidth = 1;
18     m_shapeStyle = 0;
19     m_brushStyle = 0;
20     m_oldActiveTool = m_activeTool = TOOL_PEN;
21     m_airBrushWidth = 5;
22     m_rubberRadius = 4;
23     m_transpBg = FALSE;
24     m_zoom = 1000;
25     ZeroMemory(&m_tools, sizeof(m_tools));
26     m_pToolObject = GetOrCreateTool(m_activeTool);
27 }
28 
29 ToolsModel::~ToolsModel()
30 {
31     for (size_t i = 0; i < TOOL_MAX + 1; ++i)
32         delete m_tools[i];
33 }
34 
35 ToolBase *ToolsModel::GetOrCreateTool(TOOLTYPE nTool)
36 {
37     if (!m_tools[nTool])
38         m_tools[nTool] = ToolBase::createToolObject(nTool);
39 
40     return m_tools[nTool];
41 }
42 
43 int ToolsModel::GetLineWidth() const
44 {
45     return m_lineWidth;
46 }
47 
48 void ToolsModel::SetLineWidth(int nLineWidth)
49 {
50     m_lineWidth = nLineWidth;
51     NotifyToolSettingsChanged();
52 }
53 
54 int ToolsModel::GetShapeStyle() const
55 {
56     return m_shapeStyle;
57 }
58 
59 void ToolsModel::SetShapeStyle(int nShapeStyle)
60 {
61     m_shapeStyle = nShapeStyle;
62     NotifyToolSettingsChanged();
63 }
64 
65 int ToolsModel::GetBrushStyle() const
66 {
67     return m_brushStyle;
68 }
69 
70 void ToolsModel::SetBrushStyle(int nBrushStyle)
71 {
72     m_brushStyle = nBrushStyle;
73     NotifyToolSettingsChanged();
74 }
75 
76 TOOLTYPE ToolsModel::GetActiveTool() const
77 {
78     return m_activeTool;
79 }
80 
81 TOOLTYPE ToolsModel::GetOldActiveTool() const
82 {
83     return m_oldActiveTool;
84 }
85 
86 void ToolsModel::SetActiveTool(TOOLTYPE nActiveTool)
87 {
88     OnFinishDraw();
89 
90     if (m_activeTool == nActiveTool)
91         return;
92 
93     switch (m_activeTool)
94     {
95         case TOOL_FREESEL:
96         case TOOL_RECTSEL:
97         case TOOL_RUBBER:
98         case TOOL_COLOR:
99         case TOOL_ZOOM:
100         case TOOL_TEXT:
101             break;
102 
103         default:
104             m_oldActiveTool = m_activeTool;
105             break;
106     }
107 
108     m_activeTool = nActiveTool;
109     m_pToolObject = GetOrCreateTool(m_activeTool);
110     NotifyToolChanged();
111 }
112 
113 int ToolsModel::GetAirBrushWidth() const
114 {
115     return m_airBrushWidth;
116 }
117 
118 void ToolsModel::SetAirBrushWidth(int nAirBrushWidth)
119 {
120     m_airBrushWidth = nAirBrushWidth;
121     NotifyToolSettingsChanged();
122 }
123 
124 int ToolsModel::GetRubberRadius() const
125 {
126     return m_rubberRadius;
127 }
128 
129 void ToolsModel::SetRubberRadius(int nRubberRadius)
130 {
131     m_rubberRadius = nRubberRadius;
132     NotifyToolSettingsChanged();
133 }
134 
135 BOOL ToolsModel::IsBackgroundTransparent() const
136 {
137     return m_transpBg;
138 }
139 
140 void ToolsModel::SetBackgroundTransparent(BOOL bTransparent)
141 {
142     m_transpBg = bTransparent;
143     NotifyToolSettingsChanged();
144     if (selectionWindow.IsWindow())
145         selectionWindow.ForceRefreshSelectionContents();
146 }
147 
148 int ToolsModel::GetZoom() const
149 {
150     return m_zoom;
151 }
152 
153 void ToolsModel::SetZoom(int nZoom)
154 {
155     m_zoom = nZoom;
156     NotifyZoomChanged();
157 }
158 
159 void ToolsModel::NotifyToolChanged()
160 {
161     if (toolBoxContainer.IsWindow())
162         toolBoxContainer.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool);
163     if (toolSettingsWindow.IsWindow())
164         toolSettingsWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool);
165     if (fontsDialog.IsWindow())
166         fontsDialog.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool);
167     if (textEditWindow.IsWindow())
168         textEditWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool);
169 }
170 
171 void ToolsModel::NotifyToolSettingsChanged()
172 {
173     if (toolSettingsWindow.IsWindow())
174         toolSettingsWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED);
175     if (selectionWindow.IsWindow())
176         selectionWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED);
177     if (textEditWindow.IsWindow())
178         textEditWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED);
179 }
180 
181 void ToolsModel::NotifyZoomChanged()
182 {
183     if (toolSettingsWindow.IsWindow())
184         toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED);
185     if (textEditWindow.IsWindow())
186         textEditWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED);
187     if (selectionWindow.IsWindow())
188         selectionWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED);
189 }
190 
191 void ToolsModel::OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick)
192 {
193     m_pToolObject->beginEvent();
194     updateStartAndLast(x, y);
195     m_pToolObject->OnButtonDown(bLeftButton, x, y, bDoubleClick);
196     m_pToolObject->endEvent();
197 }
198 
199 void ToolsModel::OnMouseMove(BOOL bLeftButton, LONG x, LONG y)
200 {
201     m_pToolObject->beginEvent();
202     m_pToolObject->OnMouseMove(bLeftButton, x, y);
203     updateLast(x, y);
204     m_pToolObject->endEvent();
205 }
206 
207 void ToolsModel::OnButtonUp(BOOL bLeftButton, LONG x, LONG y)
208 {
209     m_pToolObject->beginEvent();
210     m_pToolObject->OnButtonUp(bLeftButton, x, y);
211     updateLast(x, y);
212     m_pToolObject->endEvent();
213 }
214 
215 void ToolsModel::OnCancelDraw()
216 {
217     ATLTRACE("ToolsModel::OnCancelDraw()\n");
218     m_pToolObject->beginEvent();
219     m_pToolObject->OnCancelDraw();
220     m_pToolObject->endEvent();
221 }
222 
223 void ToolsModel::OnFinishDraw()
224 {
225     ATLTRACE("ToolsModel::OnFinishDraw()\n");
226     m_pToolObject->beginEvent();
227     m_pToolObject->OnFinishDraw();
228     m_pToolObject->endEvent();
229 }
230 
231 void ToolsModel::resetTool()
232 {
233     m_pToolObject->reset();
234 }
235 
236 void ToolsModel::selectAll()
237 {
238     SetActiveTool(TOOL_RECTSEL);
239     OnButtonDown(TRUE, 0, 0, FALSE);
240     OnMouseMove(TRUE, imageModel.GetWidth(), imageModel.GetHeight());
241     OnButtonUp(TRUE, imageModel.GetWidth(), imageModel.GetHeight());
242 }
243