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