1 
2 ///////////////////////////////////////////////////////////
3 //                                                       //
4 //                         SAGA                          //
5 //                                                       //
6 //      System for Automated Geoscientific Analyses      //
7 //                                                       //
8 //                    User Interface                     //
9 //                                                       //
10 //                    Program: SAGA                      //
11 //                                                       //
12 //-------------------------------------------------------//
13 //                                                       //
14 //                Parameters_Control.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 Goettingen               //
42 //                Goldschmidtstr. 5                      //
43 //                37077 Goettingen                       //
44 //                Germany                                //
45 //                                                       //
46 //    e-mail:     oconrad@saga-gis.org                   //
47 //                                                       //
48 ///////////////////////////////////////////////////////////
49 
50 //---------------------------------------------------------
51 #include <wx/propgrid/manager.h>
52 #include <wx/datectrl.h>
53 
54 #include <saga_api/saga_api.h>
55 
56 #include "res_dialogs.h"
57 #include "res_controls.h"
58 
59 #include "helper.h"
60 
61 #include "wksp_tool_manager.h"
62 #include "wksp_data_manager.h"
63 
64 #include "parameters_control.h"
65 #include "parameters_properties.h"
66 
67 
68 ///////////////////////////////////////////////////////////
69 //														 //
70 //														 //
71 //														 //
72 ///////////////////////////////////////////////////////////
73 
74 //---------------------------------------------------------
75 class CParameters_Grid : public wxPropertyGrid
76 {
77 	DECLARE_CLASS(CParameters_Grid)
78 
79 public:
CParameters_Grid(void)80 	CParameters_Grid(void)
81 	{}
82 
CParameters_Grid(wxWindow * pParent,wxWindowID id=wxID_ANY,const wxPoint & pos=wxDefaultPosition,const wxSize & size=wxDefaultSize,long style=wxPG_DEFAULT_STYLE,const wxString & name=wxPropertyGridNameStr)83 	CParameters_Grid(wxWindow *pParent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = wxPG_DEFAULT_STYLE, const wxString &name = wxPropertyGridNameStr)
84 	:	wxPropertyGrid(pParent, id, pos, size, style, name)
85 	{}
86 
GetStatusBar(void)87 	virtual wxStatusBar *		GetStatusBar		(void)	{	return( NULL );	}
88 
On_Key(wxKeyEvent & event)89 	void						On_Key				(wxKeyEvent &event)
90 	{
91 		event.Skip();
92 
93 		wxPostEvent(GetParent()->GetParent(), event);
94 	}
95 
96 	//-----------------------------------------------------
97 	DECLARE_EVENT_TABLE()
98 };
99 
100 //---------------------------------------------------------
101 IMPLEMENT_CLASS(CParameters_Grid, wxPropertyGrid)
102 
103 //---------------------------------------------------------
104 BEGIN_EVENT_TABLE(CParameters_Grid, wxPropertyGrid)
105 	EVT_KEY_DOWN		(CParameters_Grid::On_Key)
106 END_EVENT_TABLE()
107 
108 
109 ///////////////////////////////////////////////////////////
110 //														 //
111 ///////////////////////////////////////////////////////////
112 
113 //---------------------------------------------------------
114 class CParameters_Grid_Manager : public wxPropertyGridManager
115 {
116 public:
CParameters_Grid_Manager(void)117 	CParameters_Grid_Manager(void)	{}
118 
CreatePropertyGrid(void) const119 	virtual wxPropertyGrid *	CreatePropertyGrid	(void) const
120 	{
121 		return( new CParameters_Grid() );
122 	}
123 
Initialize(wxWindow * pParent)124 	wxPropertyGrid *			Initialize			(wxWindow *pParent)
125 	{
126 		Create(pParent, ID_WND_PARM, wxDefaultPosition, wxDefaultSize,
127 			 wxPG_BOLD_MODIFIED
128 			|wxPG_SPLITTER_AUTO_CENTER
129 		//	|wxPG_AUTO_SORT
130 		//	|wxPG_HIDE_MARGIN
131 		//	|wxPG_STATIC_SPLITTER
132 		//	|wxPG_HIDE_CATEGORIES
133 		//	|wxPG_LIMITED_EDITING
134 			|wxPG_DESCRIPTION
135 			|wxBORDER_NONE
136 			|wxTAB_TRAVERSAL
137 		);
138 
139 		return( GetGrid() );
140 	}
141 
142 };
143 
144 
145 ///////////////////////////////////////////////////////////
146 //														 //
147 //														 //
148 //														 //
149 ///////////////////////////////////////////////////////////
150 
151 //---------------------------------------------------------
IMPLEMENT_CLASS(CParameters_Control,wxPanel)152 IMPLEMENT_CLASS(CParameters_Control, wxPanel)
153 
154 //---------------------------------------------------------
155 BEGIN_EVENT_TABLE(CParameters_Control, wxPanel)
156 	EVT_SIZE			(CParameters_Control::On_Size)
157 	EVT_KEY_DOWN		(CParameters_Control::On_Key)
158 
159 	EVT_PG_SELECTED		(ID_WND_PARM, CParameters_Control::On_PG_Selected)
160 	EVT_PG_CHANGED		(ID_WND_PARM, CParameters_Control::On_PG_Changed)
161 END_EVENT_TABLE()
162 
163 
164 ///////////////////////////////////////////////////////////
165 //														 //
166 ///////////////////////////////////////////////////////////
167 
168 //---------------------------------------------------------
169 CParameters_Control::CParameters_Control(wxWindow *pParent, bool bDialog)
170 	: wxPanel(pParent, -1, wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxCLIP_CHILDREN)
171 {
172 	m_pParameters	= new CSG_Parameters;
173 	m_pOriginal		= NULL;
174 
175 	m_bFocus		= 0;
176 
177 	m_pPGM	= new CParameters_Grid_Manager;
178 
179 	m_pPG	= m_pPGM->Initialize(this);
180 
181 //	m_pPGM->SetDescBoxHeight(bDialog ? 100 : 50);
182 
183 	m_pPG->AddActionTrigger(wxPG_ACTION_PRESS_BUTTON, WXK_SPACE);
184 
185 //	m_pPG->SetExtraStyle(wxPG_EX_HELP_AS_TOOLTIPS);
186 //	m_pPG->SetCellDisabledTextColour(wxColour(200, 200, 200));
187 
188 	Set_Parameters(NULL);
189 }
190 
191 //---------------------------------------------------------
~CParameters_Control(void)192 CParameters_Control::~CParameters_Control(void)
193 {
194 	delete(m_pParameters);
195 }
196 
197 
198 ///////////////////////////////////////////////////////////
199 //														 //
200 ///////////////////////////////////////////////////////////
201 
202 //---------------------------------------------------------
On_Size(wxSizeEvent & event)203 void CParameters_Control::On_Size(wxSizeEvent &event)
204 {
205 	if( m_pPG && event.GetSize().GetWidth() > 0 && event.GetSize().GetHeight() > 0 )
206 	{
207 		m_pPG->GetParent()->SetSize(event.GetSize());
208 
209 		m_pPG->CenterSplitter(true);
210 	}
211 
212 	event.Skip();
213 }
214 
215 //---------------------------------------------------------
On_Key(wxKeyEvent & event)216 void CParameters_Control::On_Key(wxKeyEvent &event)
217 {
218 	if( event.GetKeyCode() == WXK_RETURN )
219 	{
220 		wxPostEvent(GetParent(), event);
221 	}
222 
223 	event.Skip();
224 }
225 
226 //---------------------------------------------------------
On_PG_Selected(wxPropertyGridEvent & event)227 void CParameters_Control::On_PG_Selected(wxPropertyGridEvent &event)
228 {
229 	if( m_bFocus == 0 && m_pParameters && m_pOriginal )
230 	{
231 		SetFocus();
232 	}
233 
234 	event.Skip();
235 }
236 
237 //---------------------------------------------------------
On_PG_Changed(wxPropertyGridEvent & event)238 void CParameters_Control::On_PG_Changed(wxPropertyGridEvent &event)
239 {
240 	_Set_Parameter(event.GetProperty());
241 
242 	event.Skip();
243 }
244 
245 
246 ///////////////////////////////////////////////////////////
247 //														 //
248 ///////////////////////////////////////////////////////////
249 
250 //---------------------------------------------------------
Save_Changes(bool bSilent)251 bool CParameters_Control::Save_Changes(bool bSilent)
252 {
253 	if( m_pOriginal && m_bModified && (bSilent || DLG_Message_Confirm(_TL("Save changes?"), wxString::Format(wxT("%s: %s"), _TL("Parameters"), m_pParameters->Get_Name().w_str()))) )
254 	{
255 		m_pOriginal->Assign_Values(m_pParameters);
256 
257 		m_bModified	= false;
258 
259 		m_pPG->ClearModifiedStatus();
260 		m_pPG->Refresh();
261 
262 		return( true );
263 	}
264 
265 	return( false );
266 }
267 
268 //---------------------------------------------------------
Restore(void)269 bool CParameters_Control::Restore(void)
270 {
271 	if( m_pOriginal && m_bModified )
272 	{
273 		Set_Parameters(m_pOriginal);
274 
275 		return( true );
276 	}
277 
278 	return( false );
279 }
280 
281 //---------------------------------------------------------
Restore_Defaults(void)282 bool CParameters_Control::Restore_Defaults(void)
283 {
284 	if( m_pParameters->Restore_Defaults() )
285 	{
286 		_Init_Pararameters();
287 
288 		_Update_Parameters();
289 
290 		m_bModified	= true;
291 
292 		return( true );
293 	}
294 
295 	return( false );
296 }
297 
298 //---------------------------------------------------------
Load(void)299 bool CParameters_Control::Load(void)
300 {
301 	wxString	File_Path;
302 
303 	if( DLG_Open(File_Path, ID_DLG_PARAMETERS_OPEN) )
304 	{
305 		CSG_File	File(&File_Path);
306 
307 		m_pParameters->Set_Callback(false);
308 
309 		if(	m_pParameters->Serialize_Compatibility(File)
310 		||	m_pParameters->Serialize(&File_Path, false) )
311 		{
312 			m_pParameters->Set_Callback(true);
313 
314 			_Init_Pararameters();
315 
316 			_Update_Parameters();
317 
318 			m_bModified	= true;
319 
320 			return( true );
321 		}
322 
323 		m_pParameters->Set_Callback(true);
324 
325 		DLG_Message_Show(_TL("Parameters file could not be imported."), _TL("Load Parameters"));
326 	}
327 
328 	return( false );
329 }
330 
331 //---------------------------------------------------------
Save(void)332 bool CParameters_Control::Save(void)
333 {
334 	wxString	File_Path;
335 
336 	if( DLG_Save(File_Path, ID_DLG_PARAMETERS_SAVE) )
337 	{
338 		if( m_pParameters->Serialize(&File_Path, true) )
339 		{
340 			return( true );
341 		}
342 
343 		DLG_Message_Show(_TL("Parameters file could not be exported."), _TL("Save Parameters"));
344 	}
345 
346 	return( false );
347 }
348 
349 
350 ///////////////////////////////////////////////////////////
351 //														 //
352 ///////////////////////////////////////////////////////////
353 
354 //---------------------------------------------------------
Set_Parameters(CSG_Parameters * pParameters)355 bool CParameters_Control::Set_Parameters(CSG_Parameters *pParameters)
356 {
357 	if( pParameters != m_pParameters )
358 	{
359 		m_bFocus++;
360 
361 		GetParent()->Freeze();
362 
363 		m_bModified	= false;
364 		m_pPG->ClearModifiedStatus();
365 
366 		m_pPG->ClearSelection();
367 		m_pPGM->SetDescription("", "");
368 
369 		if( pParameters == NULL || pParameters->Get_Count() == 0 )
370 		{
371 			m_pParameters->Set_Callback(false);
372 			m_pParameters->Assign(m_pOriginal = pParameters);
373 
374 			m_pPG->Clear();
375 
376 			m_pPG->Append(new wxPropertyCategory(_TL("No parameters available."), wxPG_LABEL));
377 		}
378 		else if( m_pOriginal != pParameters )
379 		{
380 			pParameters->DataObjects_Check(true);
381 
382 			m_pParameters->Set_Callback(false);
383 			m_pParameters->Assign(m_pOriginal = pParameters);
384 
385 			m_pPG->Clear();
386 
387 			_Add_Properties(m_pParameters);
388 
389 			m_pParameters->Set_Callback(true);
390 
391 			_Init_Pararameters();
392 		}
393 		else // if( m_pOriginal == pParameters )
394 		{
395 			m_pParameters->Assign_Values(m_pOriginal);
396 
397 			_Init_Pararameters();
398 		}
399 
400 		GetParent()->Thaw();
401 
402 		m_bFocus--;
403 	}
404 
405 	//-----------------------------------------------------
406 	_Update_Parameters();
407 
408 	return( true );
409 }
410 
411 
412 ///////////////////////////////////////////////////////////
413 //														 //
414 ///////////////////////////////////////////////////////////
415 
416 //---------------------------------------------------------
417 #define CHECK_LIST_OUTPUT(p)	if( p->is_Output() ) { pRoot = NULL; break; }
418 
419 //---------------------------------------------------------
420 #define CHECK_DATA_NODE(pNode, Name, ID)	if( !pNode )\
421 	{\
422 		pNode	= new wxPropertyCategory(Name, ID);\
423 		\
424 		if( !pData )\
425 		{\
426 			m_pPG->Append(pData = new wxPropertyCategory(_TL("Data Objects"), "_DATAOBJECT_DATAOBJECTS"));\
427 		}\
428 		\
429 		m_pPG->Insert(pData, -1, pNode);\
430 	}\
431 	\
432 	pRoot	= pNode;
433 
434 //---------------------------------------------------------
_Add_Properties(CSG_Parameters * pParameters)435 void CParameters_Control::_Add_Properties(CSG_Parameters *pParameters)
436 {
437 	wxPGProperty *pData        = NULL;
438 	wxPGProperty *pGrids       = NULL;
439 	wxPGProperty *pShapes      = NULL;
440 	wxPGProperty *pTables      = NULL;
441 	wxPGProperty *pTINs        = NULL;
442 	wxPGProperty *pPointClouds = NULL;
443 	wxPGProperty *pOptions     = NULL;
444 
445 	m_Precision	= g_pTools->Get_Parameter("FLOAT_PRECISION")->asInt();
446 
447 	for(int i=0; i<pParameters->Get_Count(); i++)
448 	{
449 		CSG_Parameter	*pParameter	= pParameters->Get_Parameter(i);
450 
451 		if(	pParameter->do_UseInGUI() && pParameter->Get_Parent() == NULL )
452 		{
453 			wxPGProperty	*pRoot	= NULL;
454 
455 			switch( pParameter->Get_Type() )
456 			{
457 			case PARAMETER_TYPE_DataObject_Output:
458 				break;
459 
460 			case PARAMETER_TYPE_Grid_System:
461 				if( pParameter->Get_Children_Count() == 0 )
462 				{
463 					CHECK_DATA_NODE(pGrids, _TL("Grids"), "_DATAOBJECT_GRIDS");
464 				}
465 				else for(int j=0; j<pParameter->Get_Children_Count() && !pRoot; j++)
466 				{
467 					if(	(pParameter->Get_Child(j)->Get_Type() != PARAMETER_TYPE_Grid_List
468 					  && pParameter->Get_Child(j)->Get_Type() != PARAMETER_TYPE_Grids_List)
469 					||   pParameter->Get_Child(j)->is_Input() )
470 					{
471 						CHECK_DATA_NODE(pGrids, _TL("Grids"), "_DATAOBJECT_GRIDS");
472 					}
473 				}
474 				break;
475 
476 			case PARAMETER_TYPE_Grid_List      : CHECK_LIST_OUTPUT(pParameter);
477 			case PARAMETER_TYPE_Grid           :
478 				CHECK_DATA_NODE(pGrids      , _TL("Grids"       ), "_DATAOBJECT_GRIDS"      );
479 				break;
480 
481 			case PARAMETER_TYPE_Grids_List     : CHECK_LIST_OUTPUT(pParameter);
482 			case PARAMETER_TYPE_Grids          :
483 				CHECK_DATA_NODE(pGrids      , _TL("Grids"       ), "_DATAOBJECT_GRIDS"      );
484 				break;
485 
486 			case PARAMETER_TYPE_Table_List     : CHECK_LIST_OUTPUT(pParameter);
487 			case PARAMETER_TYPE_Table          :
488 				CHECK_DATA_NODE(pTables     , _TL("Tables"      ), "_DATAOBJECT_TABLES"     );
489 				break;
490 
491 			case PARAMETER_TYPE_Shapes_List    : CHECK_LIST_OUTPUT(pParameter);
492 			case PARAMETER_TYPE_Shapes         :
493 				CHECK_DATA_NODE(pShapes     , _TL("Shapes"      ), "_DATAOBJECT_SHAPES"     );
494 				break;
495 
496 			case PARAMETER_TYPE_TIN_List       : CHECK_LIST_OUTPUT(pParameter);
497 			case PARAMETER_TYPE_TIN            :
498 				CHECK_DATA_NODE(pTINs       , _TL("TIN"         ), "_DATAOBJECT_TINS"       );
499 				break;
500 
501 			case PARAMETER_TYPE_PointCloud_List: CHECK_LIST_OUTPUT(pParameter);
502 			case PARAMETER_TYPE_PointCloud     :
503 				CHECK_DATA_NODE(pPointClouds, _TL("Point Clouds"), "_DATAOBJECT_POINTCLOUDS");
504 				break;
505 
506 			default:
507 				if( !pOptions )
508 				{
509 					m_pPG->Append(pOptions = new wxPropertyCategory(_TL("Options"), "_DATAOBJECT_OPTIONS"));
510 				}
511 				pRoot	= pOptions;
512 				break;
513 			}
514 
515 			if( pRoot )
516 			{
517 				_Add_Property(pRoot, pParameter);
518 			}
519 		}
520 	}
521 }
522 
523 //---------------------------------------------------------
_Add_Property(wxPGProperty * pParent,CSG_Parameter * pParameter)524 void CParameters_Control::_Add_Property(wxPGProperty *pParent, CSG_Parameter *pParameter)
525 {
526 	if( pParameter->do_UseInGUI() )
527 	{
528 		wxPGProperty	*pProperty	= _Get_Property(pParent, pParameter);
529 
530 		if( pParameter->Get_Children_Count() > 0 )
531 		{
532 			for(int i=0; i<pParameter->Get_Children_Count(); i++)
533 			{
534 				_Add_Property(pProperty, pParameter->Get_Child(i));
535 			}
536 
537 			m_pPG->Expand(pProperty);
538 		}
539 	}
540 }
541 
542 //---------------------------------------------------------
_Get_Property(wxPGProperty * pParent,CSG_Parameter * pParameter)543 wxPGProperty * CParameters_Control::_Get_Property(wxPGProperty *pParent, CSG_Parameter *pParameter)
544 {
545 	#define ADD_PROPERTY(p, limit)	if( pParent ) { m_pPG->Insert(pParent, -1, pProperty = p); } else { m_pPG->Append(pProperty = p); }\
546 		if( pParameter->is_Information() ) { m_pPG->LimitPropertyEditing(pProperty); m_pPG->EnableProperty(pProperty, false); } else\
547 		if( limit ) { m_pPG->LimitPropertyEditing(pProperty); } { CSG_String	s, sDesc;\
548 		sDesc	= pParameter->Get_Description(PARAMETER_DESCRIPTION_TYPE);\
549 		s		= pParameter->Get_Description(PARAMETER_DESCRIPTION_TEXT      ); if( !s.is_Empty() ) { sDesc.Append("\n___\n"); sDesc.Append(s); }\
550 		s		= pParameter->Get_Description(PARAMETER_DESCRIPTION_PROPERTIES); if( !s.is_Empty() ) { sDesc.Append("\n___\n"); sDesc.Append(s); }\
551 		m_pPG->SetPropertyHelpString(pProperty, sDesc.c_str()); }
552 
553 	wxString	Name(pParameter->Get_Name()), ID(pParameter->Get_Identifier());
554 
555 	wxPGProperty	*pProperty	= NULL;
556 
557 	switch( pParameter->Get_Type() )
558 	{
559 	default:
560 		if( pParameter->Get_Children_Count() > 0 )
561 		{
562 			if( !pParameter->Get_Parent() || pParameter->Get_Parent()->Get_Type() == PARAMETER_TYPE_Node )
563 			{
564 				ADD_PROPERTY(new wxPropertyCategory(Name, ID    ), true);
565 			//	m_pPG->SetPropertyCell(pProperty, 0, "", wxNullBitmap, SYS_Get_Color(wxSYS_COLOUR_BTNTEXT), SYS_Get_Color(wxSYS_COLOUR_BTNFACE));
566 			}
567 			else
568 			{
569 				ADD_PROPERTY(new wxStringProperty  (Name, ID, ""), false);
570 			}
571 		}
572 		break;
573 
574 	case PARAMETER_TYPE_Bool            :
575 		ADD_PROPERTY(new wxBoolProperty       (Name, ID, pParameter->asBool()  ), false);
576 		pProperty->SetAttribute(wxPG_BOOL_USE_CHECKBOX, true);
577 		break;
578 
579 	case PARAMETER_TYPE_Int             :
580 		ADD_PROPERTY(new wxIntProperty        (Name, ID, pParameter->asInt()   ), false);
581 		break;
582 
583 	case PARAMETER_TYPE_Double          :
584 		ADD_PROPERTY(new wxFloatProperty      (Name, ID, pParameter->asDouble()), false);
585 		pProperty->SetAttribute(wxPG_FLOAT_PRECISION, m_Precision);
586 		break;
587 
588 	case PARAMETER_TYPE_Range           :
589 		ADD_PROPERTY(new CParameters_PG_Range (Name, ID, pParameter, m_Precision), false);
590 		break;
591 
592 	case PARAMETER_TYPE_Degree          :
593 		ADD_PROPERTY(new CParameters_PG_Degree(Name, ID, pParameter            ), false);
594 		break;
595 
596 	case PARAMETER_TYPE_Date            :
597 		ADD_PROPERTY(new wxDateProperty       (Name, ID, pParameter->asDouble()), false);	// from JDN
598 		pProperty->SetAttribute(wxPG_DATE_PICKER_STYLE, wxDP_DROPDOWN|wxDP_SHOWCENTURY);
599 		break;
600 
601 	case PARAMETER_TYPE_String          :
602 		if( ((CSG_Parameter_String *)pParameter)->is_Password() )
603 		{
604 			ADD_PROPERTY(new wxStringProperty    (Name, ID, pParameter->asString()), false);
605 			pProperty->SetAttribute(wxPG_STRING_PASSWORD, true);
606 		}
607 		else
608 		{
609 			ADD_PROPERTY(new wxLongStringProperty(Name, ID, pParameter->asString()), false);
610 		}
611 		break;
612 
613 	case PARAMETER_TYPE_Color          :
614 		ADD_PROPERTY(new wxColourProperty     (Name, ID, Get_Color_asWX(pParameter->asColor())), false);
615 		pProperty->SetEditor(wxPGEditor_Choice);
616 		break;
617 
618 	case PARAMETER_TYPE_Colors         :
619 		ADD_PROPERTY(new CParameters_PG_Colors(Name, ID, pParameter), true);
620 		break;
621 
622 	case PARAMETER_TYPE_FilePath       :
623 	case PARAMETER_TYPE_Choices        :
624 	case PARAMETER_TYPE_Table_Fields   :
625 		ADD_PROPERTY(new CParameters_PG_Dialog(Name, ID, pParameter), false);
626 		break;
627 
628 	case PARAMETER_TYPE_Text           :
629 	case PARAMETER_TYPE_Font           :
630 	case PARAMETER_TYPE_FixedTable     :
631 	case PARAMETER_TYPE_Parameters     :
632 		ADD_PROPERTY(new CParameters_PG_Dialog(Name, ID, pParameter), true);
633 		break;
634 
635 	case PARAMETER_TYPE_Grid_List      :
636 	case PARAMETER_TYPE_Grids_List     :
637 	case PARAMETER_TYPE_Table_List     :
638 	case PARAMETER_TYPE_Shapes_List    :
639 	case PARAMETER_TYPE_TIN_List       :
640 	case PARAMETER_TYPE_PointCloud_List:
641 		if( !pParameter->is_Output() )
642 		{
643 			ADD_PROPERTY(new CParameters_PG_Dialog(Name, ID, pParameter), true);
644 		}
645 		break;
646 
647 	case PARAMETER_TYPE_Choice         :
648 	case PARAMETER_TYPE_Table_Field    :
649 	case PARAMETER_TYPE_Grid_System    :
650 	case PARAMETER_TYPE_Grid           :
651 	case PARAMETER_TYPE_Grids          :
652 	case PARAMETER_TYPE_Table          :
653 	case PARAMETER_TYPE_Shapes         :
654 	case PARAMETER_TYPE_TIN            :
655 	case PARAMETER_TYPE_PointCloud     :
656 		ADD_PROPERTY(new CParameters_PG_Choice(pParameter), false);
657 		break;
658 	}
659 
660 	//-----------------------------------------------------
661 	return( pProperty );
662 }
663 
664 
665 ///////////////////////////////////////////////////////////
666 //														 //
667 ///////////////////////////////////////////////////////////
668 
669 //---------------------------------------------------------
_Get_Identifier(CSG_Parameter * pParameter)670 wxString CParameters_Control::_Get_Identifier(CSG_Parameter *pParameter)
671 {
672 	wxString	id;
673 
674 	if( pParameter->Get_Parent() )
675 	{
676 		id	= _Get_Identifier(pParameter->Get_Parent()) + wxT(".");
677 	}
678 
679 	id	+= pParameter->Get_Identifier();
680 
681 	return( id );
682 }
683 
684 //---------------------------------------------------------
_Get_Enabled(CSG_Parameter * pParameter)685 bool CParameters_Control::_Get_Enabled(CSG_Parameter *pParameter)
686 {
687 	return( !pParameter || (pParameter->is_Enabled() && _Get_Enabled(pParameter->Get_Parent())) );
688 }
689 
690 
691 ///////////////////////////////////////////////////////////
692 //														 //
693 ///////////////////////////////////////////////////////////
694 
695 //---------------------------------------------------------
_Get_Parameter(wxPGProperty * pProperty)696 CSG_Parameter * CParameters_Control::_Get_Parameter(wxPGProperty *pProperty)
697 {
698 	return( pProperty ? m_pParameters->Get_Parameter(pProperty->GetBaseName().wx_str()) : NULL );
699 }
700 
701 //---------------------------------------------------------
_Set_Parameter(wxPGProperty * pProperty)702 void CParameters_Control::_Set_Parameter(wxPGProperty *pProperty)
703 {
704 	Freeze();
705 
706 	CSG_Parameter	*pParameter	=  _Get_Parameter(pProperty);
707 
708 	if( pParameter )
709 	{
710 		m_bModified	= true;
711 
712 		switch( pParameter->Get_Type() )
713 		{
714 		default:
715 			break;
716 
717 		case PARAMETER_TYPE_Date:
718 			pParameter->Set_Value(((wxDateProperty *)pProperty)->GetDateValue().GetJDN());
719 			break;
720 
721 		case PARAMETER_TYPE_String:
722 		case PARAMETER_TYPE_FilePath:
723 			pParameter->Set_Value(m_pPG->GetPropertyValueAsString(pProperty).wx_str());
724 			break;
725 
726 		case PARAMETER_TYPE_Bool:
727 			pParameter->Set_Value(m_pPG->GetPropertyValueAsBool(pProperty));
728 			break;
729 
730 		case PARAMETER_TYPE_Int:
731 			pParameter->Set_Value(m_pPG->GetPropertyValueAsInt(pProperty));
732 			break;
733 
734 		case PARAMETER_TYPE_Double:
735 			pParameter->Set_Value(m_pPG->GetPropertyValueAsDouble(pProperty));
736 			break;
737 
738 		case PARAMETER_TYPE_Color:
739 			pParameter->Set_Value(Get_Color_asInt(((wxColourProperty *)pProperty)->GetVal().m_colour));
740 			break;
741 		}
742 
743 		if( pParameter->Get_Type() != PARAMETER_TYPE_Date )
744 		{
745 			_Update_Parameters();
746 
747 			m_pPG->SelectProperty(pProperty);
748 		}
749 	}
750 
751 	Thaw();
752 }
753 
754 //---------------------------------------------------------
_Update_Parameter(CSG_Parameter * pParameter)755 void CParameters_Control::_Update_Parameter(CSG_Parameter *pParameter)
756 {
757 	wxPGProperty	*pProperty	= m_pPG->GetProperty(_Get_Identifier(pParameter));
758 
759 	if( pProperty )
760 	{
761 		pProperty->Enable( _Get_Enabled(pParameter));
762 		pProperty->Hide  (!_Get_Enabled(pParameter));
763 
764 		switch( pParameter->Get_Type() )
765 		{
766 		default:
767 			break;
768 
769 		case PARAMETER_TYPE_String:
770 			if( m_pPG->GetPropertyValueAsString	(pProperty).Cmp(pParameter->asString()) != 0 )
771 			{
772 				m_pPG->SetPropertyValue(pProperty, pParameter->asString());
773 			}
774 			break;
775 
776 		case PARAMETER_TYPE_Bool:
777 			if( m_pPG->GetPropertyValueAsBool	(pProperty) != pParameter->asBool() )
778 			{
779 				m_pPG->SetPropertyValue(pProperty, pParameter->asBool());
780 			}
781 			break;
782 
783 		case PARAMETER_TYPE_Int:
784 			if( m_pPG->GetPropertyValueAsInt	(pProperty) != pParameter->asInt() )
785 			{
786 				m_pPG->SetPropertyValue(pProperty, pParameter->asInt());
787 			}
788 			break;
789 
790 		case PARAMETER_TYPE_Double:
791 			if( m_pPG->GetPropertyValueAsDouble	(pProperty) != pParameter->asDouble() )
792 			{
793 				m_pPG->SetPropertyValue(pProperty, pParameter->asDouble());
794 			}
795 			break;
796 
797 		case PARAMETER_TYPE_Range:
798 			((CParameters_PG_Range  *)pProperty)->Update();
799 			break;
800 
801 		case PARAMETER_TYPE_Degree:
802 			((CParameters_PG_Degree *)pProperty)->Update();
803 			break;
804 
805 		case PARAMETER_TYPE_Date:
806 			{
807 				wxDateTime	Date(pParameter->asDouble());
808 
809 				if( ((wxDateProperty *)pProperty)->GetDateValue() != Date )
810 				{
811 					((wxDateProperty *)pProperty)->SetDateValue(Date);
812 				}
813 			}
814 			break;
815 
816 		case PARAMETER_TYPE_Choice         :
817 		case PARAMETER_TYPE_Table_Field    :
818 		case PARAMETER_TYPE_Grid_System    :
819 		case PARAMETER_TYPE_Grid           :
820 		case PARAMETER_TYPE_Grids          :
821 		case PARAMETER_TYPE_Table          :
822 		case PARAMETER_TYPE_Shapes         :
823 		case PARAMETER_TYPE_TIN            :
824 		case PARAMETER_TYPE_PointCloud     :
825 			((CParameters_PG_Choice *)pProperty)->Update();
826 		break;
827 
828 		case PARAMETER_TYPE_Text           :
829 		case PARAMETER_TYPE_FilePath       :
830 		case PARAMETER_TYPE_Font           :
831 		case PARAMETER_TYPE_Table_Fields   :
832 		case PARAMETER_TYPE_Choices        :
833 		case PARAMETER_TYPE_FixedTable     :
834 		case PARAMETER_TYPE_Grid_List      :
835 		case PARAMETER_TYPE_Grids_List     :
836 		case PARAMETER_TYPE_Table_List     :
837 		case PARAMETER_TYPE_Shapes_List    :
838 		case PARAMETER_TYPE_TIN_List       :
839 		case PARAMETER_TYPE_PointCloud_List:
840 		case PARAMETER_TYPE_Parameters     :
841 			((CParameters_PG_Dialog *)pProperty)->Update();
842 			break;
843 		}
844 	}
845 }
846 
847 //---------------------------------------------------------
Update_DataObjects(void)848 bool CParameters_Control::Update_DataObjects(void)
849 {
850 	if( m_pParameters )
851 	{
852 		for(int i=0; i<m_pParameters->Get_Count(); i++)
853 		{
854 			CSG_Parameter	*pParameter	= m_pParameters->Get_Parameter(i);
855 			wxPGProperty	*pProperty	= m_pPG->GetProperty(_Get_Identifier(pParameter));
856 
857 			if( pProperty  )
858 			{
859 				switch( pParameter->Get_Type() )
860 				{
861 				default:
862 					break;
863 
864 				case PARAMETER_TYPE_Grid_System:
865 				case PARAMETER_TYPE_Grid:
866 				case PARAMETER_TYPE_Grids:
867 				case PARAMETER_TYPE_Table:
868 				case PARAMETER_TYPE_Shapes:
869 				case PARAMETER_TYPE_TIN:
870 				case PARAMETER_TYPE_PointCloud:
871 					((CParameters_PG_Choice *)pProperty)->Update();
872 					break;
873 
874 				case PARAMETER_TYPE_Grid_List:
875 				case PARAMETER_TYPE_Grids_List:
876 				case PARAMETER_TYPE_Table_List:
877 				case PARAMETER_TYPE_Shapes_List:
878 				case PARAMETER_TYPE_TIN_List:
879 				case PARAMETER_TYPE_PointCloud_List:
880 					if( pParameter->Check() == false )
881 					{
882 					}
883 					break;
884 				}
885 			}
886 		}
887 	}
888 
889 	return( true );
890 }
891 
892 //---------------------------------------------------------
893 #define UPDATE_DATA_NODE(NODE)	{\
894 	wxPGProperty	*pProperty	= m_pPG->GetProperty(NODE);\
895 	\
896 	if( pProperty )\
897 	{\
898 		bool	bShow	= false;\
899 		\
900 		for(size_t i=0; i<pProperty->GetChildCount() && !bShow; i++)\
901 		{\
902 			if( pProperty->Item(i)->IsEnabled() )\
903 			{\
904 				bShow	= true;\
905 			}\
906 		}\
907 		\
908 		pProperty->Hide(!bShow, wxPG_DONT_RECURSE);\
909 	}\
910 }
911 
912 //---------------------------------------------------------
_Update_Parameters(void)913 void CParameters_Control::_Update_Parameters(void)
914 {
915 	if( m_pParameters )
916 	{
917 		GetParent()->Freeze();
918 
919 		for(int i=0; i<m_pParameters->Get_Count(); i++)
920 		{
921 			_Update_Parameter(m_pParameters->Get_Parameter(i));
922 		}
923 
924 		UPDATE_DATA_NODE("_DATAOBJECT_GRIDS");
925 		UPDATE_DATA_NODE("_DATAOBJECT_TABLES");
926 		UPDATE_DATA_NODE("_DATAOBJECT_SHAPES");
927 		UPDATE_DATA_NODE("_DATAOBJECT_TINS");
928 		UPDATE_DATA_NODE("_DATAOBJECT_POINTCLOUDS");
929 		UPDATE_DATA_NODE("_DATAOBJECT_OPTIONS");
930 
931 		m_pPG->Refresh();
932 
933 		GetParent()->Thaw();
934 	}
935 }
936 
937 //---------------------------------------------------------
_Init_Pararameters(void)938 void CParameters_Control::_Init_Pararameters(void)
939 {
940 	if( m_pParameters )
941 	{
942 		for(int i=0; i<m_pParameters->Get_Count(); i++)
943 		{
944 			m_pParameters->Get_Parameter(i)->has_Changed(PARAMETER_CHECK_ENABLE);
945 		}
946 	}
947 }
948 
949 
950 ///////////////////////////////////////////////////////////
951 //														 //
952 //														 //
953 //														 //
954 ///////////////////////////////////////////////////////////
955 
956 //---------------------------------------------------------
957