1 // import_project_dlg.cpp : implementation file
2 //
3 
4 #include "studiox_includes.h"
5 #include "copy_paste_engine.h"
6 
7 // import_project_dlg dialog
8 
9 IMPLEMENT_DYNAMIC(import_project_dlg, express_dialog)
10 
11 BEGIN_MESSAGE_MAP(import_project_dlg, express_dialog)
12     ON_MESSAGE(STUDIO_TEST, OnTestMessage)
13 END_MESSAGE_MAP()
14 
15 enum import_project_dlg_test_commands{
16     TEST_IMPORT = 1,
17     TEST_CANCEL,
18     TEST_CHECK_SCREEN
19 };
20 
21 ///////////////////////////////////////////////////////////////////////////////
import_project_dlg(studiox_project * merge_project,CString project_path,CWnd * pParent)22 import_project_dlg::import_project_dlg(studiox_project *merge_project, CString project_path, CWnd* pParent /*=NULL*/)
23 : express_dialog(import_project_dlg::IDD, pParent)
24 {
25     IconId = IDB_PIXELMAPS;
26     SetTitleText("Import Project");
27 
28     mpMergeProject = merge_project;
29     mProjectPath = project_path;
30 }
31 
32 ///////////////////////////////////////////////////////////////////////////////
~import_project_dlg()33 import_project_dlg::~import_project_dlg()
34 {
35 }
36 
37 ///////////////////////////////////////////////////////////////////////////////
DoDataExchange(CDataExchange * pDX)38 void import_project_dlg::DoDataExchange(CDataExchange* pDX)
39 {
40     express_dialog::DoDataExchange(pDX);
41     DDX_Control(pDX, IDC_PROJECT_TREE, mProjectTree);
42 
43     if (pDX->m_bSaveAndValidate)
44     {
45 
46     }
47 }
48 
49 ///////////////////////////////////////////////////////////////////////////////
OnInitDialog()50 BOOL import_project_dlg::OnInitDialog()
51 {
52     express_dialog::OnInitDialog();
53 
54     SetDlgItemText(IDC_MERGE_PROJECT_NAME, mpMergeProject->mHeader.project_name);
55 
56     AddCancelButton();
57     AddSaveButton(_T("Import"));
58     SetSavedMsg(L"Imported");
59 
60     BuildProjectTree();
61 
62     return TRUE;
63 }
64 
65 ///////////////////////////////////////////////////////////////////////////////
66 // import project must specify the target folder
OnOK()67 void import_project_dlg::OnOK()
68 {
69     HTREEITEM hRoot = mProjectTree.GetRootItem();
70     HTREEITEM hParent;
71     HTREEITEM hDisplay;
72     HTREEITEM hItem;
73     studiox_project *project = GetOpenProject();
74 
75     if (!project)
76     {
77         return;
78     }
79 
80     hParent = mProjectTree.FindItem(hRoot, _T("Displays"));
81     int state = mProjectTree.GetItemCheckState(hParent);
82 
83     if (state == CUSTOM_TV_STATE_UNCHECKED)
84     {
85         return express_dialog::OnOK();
86     }
87 
88     copy_paste_engine cpe;
89     extern CString gOpenProjectDir;
90     CString oldpathname = gOpenProjectDir;
91     folder_info *selected = GetProjectView()->GetSelectedFolder();
92     if (selected)
93     {
94         for (int display = 0; display < mpMergeProject->mHeader.num_displays; display++)
95         {
96             hDisplay = mProjectTree.FindItem(hParent, mpMergeProject->mDisplays[display].name);
97             state = mProjectTree.GetItemCheckState(hDisplay);
98 
99             if (state == CUSTOM_TV_STATE_UNCHECKED)
100             {
101                 continue;
102             }
103 
104             folder_info *folder = mpMergeProject->mDisplays[display].GetFirstChildFolder();
105             CArray<widget_info *> info_list;
106 
107             while (folder)
108             {
109                 widget_info *info = folder->GetFirstChildWidget();
110                 while (info)
111                 {
112                     hItem = mProjectTree.FindItem(hDisplay, info->app_name);
113                     state = mProjectTree.GetItemCheckState(hItem);
114 
115                     if (state == CUSTOM_TV_STATE_CHECKED)
116                     {
117                         info_list.Add(info);
118                     }
119                     info = info->GetNextWidgetInfo();
120                 }
121                 folder = folder->GetNextFolder();
122             }
123 
124             /* Should not do copy-paste while no income screen. */
125             if (info_list.GetCount())
126             {
127                 SetProjectDirectory(mProjectPath);
128                 cpe.SetProject(mpMergeProject);
129                 cpe.CopyToClipboard(info_list, m_hWnd);
130 
131                 SetProjectDirectory(oldpathname);
132                 cpe.SetProject(project);
133                 // Should select the target folder here.
134                 GetProjectView()->FolderSelected(selected);
135                 GetProjectView()->OnPasteWidget();
136             }
137         }
138     }
139     express_dialog::OnOK();
140 }
141 
142 
143 ///////////////////////////////////////////////////////////////////////////////
BuildProjectTree()144 void import_project_dlg::BuildProjectTree()
145 {
146     mProjectTree.InitImageList();
147 
148     HTREEITEM hParent;
149     HTREEITEM hDisplay;
150     HTREEITEM hItem;
151     HTREEITEM screen;
152 
153     hParent = mProjectTree.InsertItem(_T("Displays"));
154     mProjectTree.SetItemState(hParent, CUSTOM_TV_STATE_CHECKED);
155 
156     for (int display = 0; display < mpMergeProject->mHeader.num_displays; display++)
157     {
158         hDisplay = mProjectTree.InsertItem(mpMergeProject->mDisplays[display].name, hParent);
159         mProjectTree.SetItemState(hDisplay, CUSTOM_TV_STATE_CHECKED);
160 
161         folder_info *folder = mpMergeProject->mDisplays[display].GetFirstChildFolder();
162 
163         while (folder)
164         {
165             hItem = mProjectTree.InsertItem(folder->folder_name, hDisplay, TVI_SORT);
166             mProjectTree.SetItemState(hItem, CUSTOM_TV_STATE_CHECKED);
167 
168             widget_info *info = folder->GetFirstChildWidget();
169 
170             while (info)
171             {
172                 screen = mProjectTree.InsertItem(info->app_name, hItem);
173                 mProjectTree.SetItemState(screen, CUSTOM_TV_STATE_CHECKED);
174                 info = info->GetNextWidgetInfo();
175             }
176             mProjectTree.Expand(hItem, TVE_EXPAND);
177             folder = folder->GetNextFolder();
178         }
179 
180 
181         mProjectTree.Expand(hDisplay, TVE_EXPAND);
182     }
183     mProjectTree.Expand(hParent, TVE_EXPAND);
184 
185     mProjectTree.SelectSetFirstVisible(mProjectTree.GetRootItem());
186 }
187 
188 ///////////////////////////////////////////////////////////////////////////////
OnTestMessage(WPARAM wParam,LPARAM lParam)189 LRESULT import_project_dlg::OnTestMessage(WPARAM wParam, LPARAM lParam)
190 {
191     HTREEITEM item;
192     CStringArray param;
193     CString parent_name;
194     CString resource_name;
195     int check;
196 
197     switch (wParam)
198     {
199     case TEST_IMPORT:
200         OnOK();
201         break;
202 
203     case TEST_CANCEL:
204         OnCancel();
205         break;
206 
207     case TEST_CHECK_SCREEN:
208         SplitString(GetTestingParam(0), ',', &param);
209         parent_name = param.GetAt(0);
210         resource_name = param.GetAt(1);
211         check = _tstoi(param.GetAt(2));
212         item = mProjectTree.FindItem(mProjectTree.GetRootItem(), parent_name);
213         if (item)
214         {
215             item = mProjectTree.FindItem(item, resource_name);
216 
217             if (check)
218             {
219                 mProjectTree.SetItemState(item, CUSTOM_TV_STATE_CHECKED);
220             }
221             else
222             {
223                 mProjectTree.SetItemState(item, CUSTOM_TV_STATE_UNCHECKED);
224             }
225 
226             mProjectTree.UpdateChildrenState(item);
227         }
228         break;
229     }
230 
231     return 0;
232 }