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 switch (m_activeTool) 89 { 90 case TOOL_FREESEL: 91 case TOOL_RECTSEL: 92 case TOOL_RUBBER: 93 case TOOL_COLOR: 94 case TOOL_ZOOM: 95 break; 96 97 case TOOL_TEXT: 98 if (nActiveTool != TOOL_TEXT) 99 { 100 // Finish the text 101 OnButtonDown(TRUE, -1, -1, TRUE); 102 OnButtonUp(TRUE, -1, -1); 103 } 104 break; 105 106 default: 107 m_oldActiveTool = m_activeTool; 108 break; 109 } 110 111 m_activeTool = nActiveTool; 112 m_pToolObject = GetOrCreateTool(m_activeTool); 113 NotifyToolChanged(); 114 } 115 116 int ToolsModel::GetAirBrushWidth() const 117 { 118 return m_airBrushWidth; 119 } 120 121 void ToolsModel::SetAirBrushWidth(int nAirBrushWidth) 122 { 123 m_airBrushWidth = nAirBrushWidth; 124 NotifyToolSettingsChanged(); 125 } 126 127 int ToolsModel::GetRubberRadius() const 128 { 129 return m_rubberRadius; 130 } 131 132 void ToolsModel::SetRubberRadius(int nRubberRadius) 133 { 134 m_rubberRadius = nRubberRadius; 135 NotifyToolSettingsChanged(); 136 } 137 138 BOOL ToolsModel::IsBackgroundTransparent() const 139 { 140 return m_transpBg; 141 } 142 143 void ToolsModel::SetBackgroundTransparent(BOOL bTransparent) 144 { 145 m_transpBg = bTransparent; 146 NotifyToolSettingsChanged(); 147 } 148 149 int ToolsModel::GetZoom() const 150 { 151 return m_zoom; 152 } 153 154 void ToolsModel::SetZoom(int nZoom) 155 { 156 m_zoom = nZoom; 157 NotifyZoomChanged(); 158 } 159 160 void ToolsModel::NotifyToolChanged() 161 { 162 toolBoxContainer.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 163 toolSettingsWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 164 165 if (fontsDialog.IsWindow()) 166 fontsDialog.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 167 168 textEditWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 169 } 170 171 void ToolsModel::NotifyToolSettingsChanged() 172 { 173 toolSettingsWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); 174 selectionWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); 175 if (textEditWindow.IsWindow()) 176 textEditWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); 177 } 178 179 void ToolsModel::NotifyZoomChanged() 180 { 181 toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 182 if (textEditWindow.IsWindow()) 183 textEditWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 184 if (selectionWindow.IsWindow()) 185 selectionWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 186 } 187 188 void ToolsModel::OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) 189 { 190 m_pToolObject->beginEvent(); 191 updateStartAndLast(x, y); 192 m_pToolObject->OnButtonDown(bLeftButton, x, y, bDoubleClick); 193 m_pToolObject->endEvent(); 194 } 195 196 void ToolsModel::OnMouseMove(BOOL bLeftButton, LONG x, LONG y) 197 { 198 m_pToolObject->beginEvent(); 199 m_pToolObject->OnMouseMove(bLeftButton, x, y); 200 updateLast(x, y); 201 m_pToolObject->endEvent(); 202 } 203 204 void ToolsModel::OnButtonUp(BOOL bLeftButton, LONG x, LONG y) 205 { 206 m_pToolObject->beginEvent(); 207 m_pToolObject->OnButtonUp(bLeftButton, x, y); 208 updateLast(x, y); 209 m_pToolObject->endEvent(); 210 } 211 212 void ToolsModel::OnCancelDraw() 213 { 214 m_pToolObject->beginEvent(); 215 m_pToolObject->OnCancelDraw(); 216 m_pToolObject->endEvent(); 217 } 218 219 void ToolsModel::resetTool() 220 { 221 m_pToolObject->reset(); 222 } 223 224 void ToolsModel::selectAll() 225 { 226 SetActiveTool(TOOL_RECTSEL); 227 OnButtonDown(TRUE, 0, 0, FALSE); 228 OnMouseMove(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); 229 OnButtonUp(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); 230 } 231