1
2 ///////////////////////////////////////////////////////////
3 // //
4 // SAGA //
5 // //
6 // System for Automated Geoscientific Analyses //
7 // //
8 // User Interface //
9 // //
10 // Program: SAGA //
11 // //
12 //-------------------------------------------------------//
13 // //
14 // WKSP_Data_Menu_File.cpp //
15 // //
16 // Copyright (C) 2005 by Olaf Conrad //
17 // //
18 //-------------------------------------------------------//
19 // //
20 // This file is part of 'SAGA - System for Automated //
21 // Geoscientific Analyses'. SAGA is free software; you //
22 // can redistribute it and/or modify it under the terms //
23 // of the GNU General Public License as published by the //
24 // Free Software Foundation, either version 2 of the //
25 // License, or (at your option) any later version. //
26 // //
27 // SAGA is distributed in the hope that it will be //
28 // useful, but WITHOUT ANY WARRANTY; without even the //
29 // implied warranty of MERCHANTABILITY or FITNESS FOR A //
30 // PARTICULAR PURPOSE. See the GNU General Public //
31 // License for more details. //
32 // //
33 // You should have received a copy of the GNU General //
34 // Public License along with this program; if not, see //
35 // <http://www.gnu.org/licenses/>. //
36 // //
37 //-------------------------------------------------------//
38 // //
39 // contact: Olaf Conrad //
40 // Institute of Geography //
41 // University of Hamburg //
42 // Germany //
43 // //
44 // e-mail: oconrad@saga-gis.org //
45 // //
46 ///////////////////////////////////////////////////////////
47
48 //---------------------------------------------------------
49 #include <saga_api/saga_api.h>
50
51 #include "helper.h"
52
53 #include "res_commands.h"
54
55 #include "wksp_data_manager.h"
56 #include "wksp_data_menu_file.h"
57
58 #include "wksp_table_manager.h"
59 #include "wksp_shapes_manager.h"
60 #include "wksp_tin_manager.h"
61 #include "wksp_grid_manager.h"
62
63
64 ///////////////////////////////////////////////////////////
65 // //
66 // //
67 // //
68 ///////////////////////////////////////////////////////////
69
70 //---------------------------------------------------------
CWKSP_Data_Menu_File(void)71 CWKSP_Data_Menu_File::CWKSP_Data_Menu_File(void)
72 {
73 m_DataType = SG_DATAOBJECT_TYPE_Undefined;
74 m_pMenu = NULL;
75 }
76
77 //---------------------------------------------------------
~CWKSP_Data_Menu_File(void)78 CWKSP_Data_Menu_File::~CWKSP_Data_Menu_File(void)
79 {
80 Destroy();
81 }
82
83 //---------------------------------------------------------
Destroy(void)84 void CWKSP_Data_Menu_File::Destroy(void)
85 {
86 if( !m_Group.IsEmpty() )
87 {
88 CONFIG_Delete("RECENT_FILES/" + m_Group);
89
90 for(size_t i=0; i<m_Files.Count(); i++)
91 {
92 CONFIG_Write("RECENT_FILES/" + m_Group, wxString::Format("FILE_%02zu", i + 1), m_Files[i]);
93 }
94
95 for(size_t i=m_Files.Count(); i<=m_CmdID[1]; i++)
96 {
97 CONFIG_Delete("RECENT_FILES/" + m_Group, wxString::Format("FILE_%02zu", i + 1));
98 }
99 }
100
101 m_DataType = SG_DATAOBJECT_TYPE_Undefined;
102 m_pMenu = NULL;
103 }
104
105
106 ///////////////////////////////////////////////////////////
107 // //
108 ///////////////////////////////////////////////////////////
109
110 //---------------------------------------------------------
Create(TSG_Data_Object_Type DataType)111 wxMenu * CWKSP_Data_Menu_File::Create(TSG_Data_Object_Type DataType)
112 {
113 Destroy();
114
115 m_DataType = DataType;
116
117 m_pMenu = new wxMenu;
118
119 //-----------------------------------------------------
120 switch( m_DataType )
121 {
122 case SG_DATAOBJECT_TYPE_Undefined:
123 m_Group = "Project";
124 m_CmdID[0] = ID_CMD_DATA_PROJECT_RECENT_FIRST;
125 m_CmdID[1] = ID_CMD_DATA_PROJECT_RECENT_LAST - m_CmdID[0] + 1;
126
127 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_DATA_PROJECT_OPEN );
128 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_DATA_PROJECT_BROWSE );
129 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_DATA_PROJECT_NEW );
130 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_DATA_PROJECT_SAVE );
131 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_DATA_PROJECT_SAVE_AS);
132 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_DATA_PROJECT_COPY );
133 break;
134
135 case SG_DATAOBJECT_TYPE_Table:
136 m_Group = "Table";
137 m_CmdID[0] = ID_CMD_TABLE_RECENT_FIRST;
138 m_CmdID[1] = ID_CMD_TABLE_RECENT_LAST - m_CmdID[0] + 1;
139
140 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_TABLE_OPEN);
141 break;
142
143 case SG_DATAOBJECT_TYPE_Shapes:
144 m_Group = "Shapes";
145 m_CmdID[0] = ID_CMD_SHAPES_RECENT_FIRST;
146 m_CmdID[1] = ID_CMD_SHAPES_RECENT_LAST - m_CmdID[0] + 1;
147
148 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_SHAPES_OPEN);
149 break;
150
151 case SG_DATAOBJECT_TYPE_TIN:
152 m_Group = "TIN";
153 m_CmdID[0] = ID_CMD_TIN_RECENT_FIRST;
154 m_CmdID[1] = ID_CMD_TIN_RECENT_LAST - m_CmdID[0] + 1;
155
156 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_TIN_OPEN);
157 break;
158
159 case SG_DATAOBJECT_TYPE_PointCloud:
160 m_Group = "Point Cloud";
161 m_CmdID[0] = ID_CMD_POINTCLOUD_RECENT_FIRST;
162 m_CmdID[1] = ID_CMD_POINTCLOUD_RECENT_LAST - m_CmdID[0] + 1;
163
164 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_POINTCLOUD_OPEN);
165 break;
166
167 case SG_DATAOBJECT_TYPE_Grid:
168 m_Group = "Grid";
169 m_CmdID[0] = ID_CMD_GRID_RECENT_FIRST;
170 m_CmdID[1] = ID_CMD_GRID_RECENT_LAST - m_CmdID[0] + 1;
171
172 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_GRID_OPEN);
173 break;
174
175 case SG_DATAOBJECT_TYPE_Grids:
176 m_Group = "Grids";
177 m_CmdID[0] = ID_CMD_GRIDS_RECENT_FIRST;
178 m_CmdID[1] = ID_CMD_GRIDS_RECENT_LAST - m_CmdID[0] + 1;
179
180 CMD_Menu_Add_Item(m_pMenu, false, ID_CMD_GRIDS_OPEN);
181 break;
182
183 default:
184 m_CmdID[0] = 0;
185 m_CmdID[1] = 0;
186 break;
187 }
188
189 //-----------------------------------------------------
190 m_Offset = m_pMenu->GetMenuItemCount();
191
192 if( m_CmdID[0] )
193 {
194 int i = 0; wxString File;
195
196 while( CONFIG_Read("RECENT_FILES/" + m_Group, wxString::Format("FILE_%02d", ++i), File) )
197 {
198 bool bAdd = wxFileExists(File);
199
200 for(int j=0; bAdd && j<m_Files.Count(); j++)
201 {
202 bAdd = File.Cmp(m_Files[j]) != 0;
203 }
204
205 if( bAdd )
206 {
207 m_Files.Add(File);
208 }
209 }
210 }
211
212 //-----------------------------------------------------
213 Update();
214
215 return( m_pMenu );
216 }
217
218
219 ///////////////////////////////////////////////////////////
220 // //
221 ///////////////////////////////////////////////////////////
222
223 //---------------------------------------------------------
Update(void)224 void CWKSP_Data_Menu_File::Update(void)
225 {
226 if( !m_pMenu )
227 {
228 return;
229 }
230
231 //-----------------------------------------------------
232 for(int i=m_Files.GetCount(); i>0; i--)
233 {
234 if( !wxFileExists(m_Files[i - 1]) )
235 {
236 m_Files.RemoveAt(i - 1);
237 }
238 }
239
240 //-----------------------------------------------------
241 if( m_Files.GetCount() == 0 )
242 {
243 for(size_t i=m_pMenu->GetMenuItemCount(); i>m_Offset; i--)
244 {
245 m_pMenu->Destroy(m_pMenu->GetMenuItems()[i - 1]);
246 }
247 }
248
249 //-----------------------------------------------------
250 else
251 {
252 if( m_pMenu->GetMenuItemCount() == m_Offset )
253 {
254 m_pMenu->AppendSeparator();
255 }
256
257 for(size_t i=m_pMenu->GetMenuItemCount(); i>m_Offset + 1 + m_Files.GetCount(); i--)
258 {
259 m_pMenu->Destroy(m_pMenu->GetMenuItems()[i - 1]);
260 }
261
262 for(size_t i=0; i<m_Files.GetCount(); i++)
263 {
264 if( m_pMenu->GetMenuItemCount() <= m_Offset + 1 + i )
265 {
266 m_pMenu->Append (m_CmdID[0] + i, m_Files[i]);
267 }
268 else //if( m_pMenu->GetLabel(m_CmdID[0] + i).Cmp(m_Files[i]) )
269 {
270 m_pMenu->SetLabel(m_CmdID[0] + i, m_Files[i]);
271 }
272 }
273 }
274 }
275
276
277 ///////////////////////////////////////////////////////////
278 // //
279 ///////////////////////////////////////////////////////////
280
281 //---------------------------------------------------------
Add(const wxString & File)282 void CWKSP_Data_Menu_File::Add(const wxString &File)
283 {
284 Del(File);
285
286 if( wxFileExists(File) )
287 {
288 m_Files.Insert(File, 0);
289
290 while( m_Files.Count() > m_CmdID[1] )
291 {
292 m_Files.RemoveAt(m_CmdID[1]);
293 }
294 }
295 }
296
297 //---------------------------------------------------------
Del(const wxString & File)298 void CWKSP_Data_Menu_File::Del(const wxString &File)
299 {
300 for(size_t i=m_Files.GetCount(); i>0; i--)
301 {
302 if( !m_Files[i - 1].Cmp(File) )
303 {
304 m_Files.RemoveAt(i - 1);
305 }
306 }
307 }
308
309 //---------------------------------------------------------
Get(wxArrayString & Files,bool bAppend)310 bool CWKSP_Data_Menu_File::Get(wxArrayString &Files, bool bAppend)
311 {
312 if( !bAppend )
313 {
314 Files.Clear();
315 }
316
317 for(int i=0; i<m_Files.GetCount(); i++)
318 {
319 if( wxFileExists(m_Files[i]) )
320 {
321 Files.Add(m_Files[i]);
322 }
323 }
324
325 return( Files.Count() > 0 );
326 }
327
328
329 ///////////////////////////////////////////////////////////
330 // //
331 ///////////////////////////////////////////////////////////
332
333 //---------------------------------------------------------
Open(int CmdID)334 bool CWKSP_Data_Menu_File::Open(int CmdID)
335 {
336 bool bSuccess = false; int i = CmdID - m_CmdID[0];
337
338 if( i >= 0 && i < m_Files.GetCount() )
339 {
340 switch( m_DataType )
341 {
342 case SG_DATAOBJECT_TYPE_Undefined:
343 bSuccess = g_pData->Open(wxString(m_Files[i]));
344 break;
345
346 case SG_DATAOBJECT_TYPE_Table :
347 case SG_DATAOBJECT_TYPE_Shapes :
348 case SG_DATAOBJECT_TYPE_TIN :
349 case SG_DATAOBJECT_TYPE_PointCloud:
350 case SG_DATAOBJECT_TYPE_Grid :
351 case SG_DATAOBJECT_TYPE_Grids :
352 bSuccess = g_pData->Open(wxString(m_Files[i]), m_DataType) != NULL;
353 break;
354
355 default:
356 break;
357 }
358 }
359
360 return( bSuccess );
361 }
362
363
364 ///////////////////////////////////////////////////////////
365 // //
366 // //
367 // //
368 ///////////////////////////////////////////////////////////
369
370 //---------------------------------------------------------
371