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