1 #include "MpdDialog.h"
2 #include "ModelWindow.h"
3 #include "Resource.h"
4 #include <TCFoundation/TCAlertManager.h>
5 #include <LDLoader/LDLMainModel.h>
6 #include <CUI/CUIWindowResizer.h>
7
8 #if defined(_MSC_VER) && _MSC_VER >= 1400 && defined(_DEBUG)
9 #define new DEBUG_CLIENTBLOCK
10 #endif // _DEBUG
11
MpdDialog(HINSTANCE hInstance)12 MpdDialog::MpdDialog(HINSTANCE hInstance):
13 CUIDialog(hInstance, NULL),
14 m_modelWindow(NULL),
15 m_model(NULL),
16 m_resizer(NULL),
17 m_okPressed(false)
18 {
19 TCAlertManager::registerHandler(ModelWindow::alertClass(), this,
20 (TCAlertCallback)&MpdDialog::modelAlertCallback);
21 }
22
~MpdDialog(void)23 MpdDialog::~MpdDialog(void)
24 {
25 }
26
dealloc(void)27 void MpdDialog::dealloc(void)
28 {
29 TCAlertManager::unregisterHandler(this);
30 TCObject::release(m_modelWindow);
31 TCObject::release(m_model);
32 TCObject::release(m_resizer);
33 if (hWindow)
34 {
35 DestroyWindow(hWindow);
36 }
37 CUIDialog::dealloc();
38 }
39
setModel(LDLMainModel * model)40 void MpdDialog::setModel(LDLMainModel *model)
41 {
42 if (model != m_model)
43 {
44 TCObject::release(m_model);
45 m_model = model;
46 TCObject::retain(m_model);
47 }
48 }
49
modelAlertCallback(TCAlert * alert)50 void MpdDialog::modelAlertCallback(TCAlert *alert)
51 {
52 if (alert->getSender() == m_modelWindow)
53 {
54 if (ucstrcmp(alert->getMessageUC(), _UC("ModelLoaded")) == 0)
55 {
56 setModel(getModelViewer()->getMainModel());
57 updateData();
58 }
59 else if (ucstrcmp(alert->getMessageUC(), _UC("ModelLoadCanceled")) == 0)
60 {
61 setModel(NULL);
62 updateData();
63 }
64 }
65 }
66
setModelWindow(ModelWindow * modelWindow)67 void MpdDialog::setModelWindow(ModelWindow *modelWindow)
68 {
69 if (modelWindow != m_modelWindow)
70 {
71 if (m_modelWindow)
72 {
73 m_modelWindow->release();
74 }
75 m_modelWindow = modelWindow;
76 TCObject::retain(m_modelWindow);
77 }
78 setModel(getModelViewer()->getMainModel());
79 }
80
showMpdModel(int index)81 void MpdDialog::showMpdModel(int index)
82 {
83 LDrawModelViewer *modelViewer = getModelViewer();
84
85 if (modelViewer)
86 {
87 modelViewer->setMpdChildIndex(index);
88 listBoxSelectItem(IDC_MPD_LIST, index);
89 }
90 }
91
show(ModelWindow * modelWindow)92 void MpdDialog::show(ModelWindow *modelWindow)
93 {
94 setModelWindow(modelWindow);
95 if (hWindow == NULL)
96 {
97 HWND hParentWnd = GetParent(modelWindow->getHWindow());
98
99 createDialog(IDD_MPD, hParentWnd);
100 }
101 ShowWindow(hWindow, SW_SHOW);
102 }
103
getModelViewer(void)104 LDrawModelViewer *MpdDialog::getModelViewer(void)
105 {
106 if (m_modelWindow)
107 {
108 return m_modelWindow->getModelViewer();
109 }
110 else
111 {
112 return NULL;
113 }
114 }
115
updateData(void)116 void MpdDialog::updateData(void)
117 {
118 LDrawModelViewer *modelViewer = getModelViewer();
119 listBoxResetContent(IDC_MPD_LIST);
120 if (m_model != NULL && modelViewer != NULL)
121 {
122 LDLModelVector &mpdModels = m_model->getMpdModels();
123
124 if (mpdModels.size() > 0)
125 {
126 for (size_t i = 0; i < mpdModels.size(); i++)
127 {
128 LDLModel *mpdModel = mpdModels[i];
129 ucstring ucName;
130 utf8toucstring(ucName, mpdModel->getName());
131
132 listBoxAddString(IDC_MPD_LIST, ucName);
133 }
134 listBoxSelectItem(IDC_MPD_LIST, modelViewer->getMpdChildIndex());
135 }
136 }
137 }
138
doInitDialog(HWND hKbControl)139 BOOL MpdDialog::doInitDialog(HWND hKbControl)
140 {
141 RECT rect;
142
143 GetClientRect(hWindow, &rect);
144 setMinSize(rect.right, rect.bottom, true);
145 setIcon(IDI_APP_ICON);
146 m_resizer = new CUIWindowResizer;
147 m_resizer->setHWindow(hWindow);
148 m_resizer->addSubWindow(IDC_MPD_LIST, CUISizeHorizontal | CUISizeVertical);
149 m_resizer->addSubWindow(IDOK, CUIFloatLeft | CUIFloatTop);
150 m_resizer->addSubWindow(IDCANCEL, CUIFloatLeft | CUIFloatTop);
151 m_resizer->addResizeGrip();
152 updateData();
153 setAutosaveName("MpdDialog");
154 return CUIDialog::doInitDialog(hKbControl);
155 }
156
doClose(void)157 LRESULT MpdDialog::doClose(void)
158 {
159 showWindow(SW_HIDE);
160 if (!m_okPressed)
161 {
162 showMpdModel(0);
163 }
164 m_okPressed = false;
165 return 0;
166 }
167
doSize(WPARAM sizeType,int newWidth,int newHeight)168 LRESULT MpdDialog::doSize(WPARAM sizeType, int newWidth, int newHeight)
169 {
170 if (sizeType != SIZE_MINIMIZED)
171 {
172 m_resizer->resize(newWidth, newHeight);
173 }
174 return CUIDialog::doSize(sizeType, newWidth, newHeight);
175 }
176
doCommand(int notifyCode,int commandId,HWND control)177 LRESULT MpdDialog::doCommand(
178 int notifyCode,
179 int commandId,
180 HWND control)
181 {
182 if (commandId == IDC_MPD_LIST && notifyCode == LBN_SELCHANGE)
183 {
184 showMpdModel(listBoxGetSelectedItem(IDC_MPD_LIST));
185 }
186 return CUIDialog::doCommand(notifyCode, commandId, control);
187 }
188
doCancel(void)189 void MpdDialog::doCancel(void)
190 {
191 doClose();
192 }
193
doOK(void)194 void MpdDialog::doOK(void)
195 {
196 m_okPressed = true;
197 doClose();
198 }
199