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