1
2 ///////////////////////////////////////////////////////////
3 // //
4 // SAGA //
5 // //
6 // System for Automated Geoscientific Analyses //
7 // //
8 // User Interface //
9 // //
10 // Program: SAGA //
11 // //
12 //-------------------------------------------------------//
13 // //
14 // VIEW_Layout.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 // Germany //
43 // //
44 // e-mail: oconrad@saga-gis.org //
45 // //
46 ///////////////////////////////////////////////////////////
47
48 //---------------------------------------------------------
49 #include <wx/window.h>
50
51 #include <saga_api/saga_api.h>
52
53 #include "res_commands.h"
54 #include "res_controls.h"
55 #include "res_images.h"
56
57 #include "helper.h"
58
59 #include "wksp_map.h"
60
61 #include "view_ruler.h"
62
63 #include "view_layout.h"
64 #include "view_layout_info.h"
65 #include "view_layout_control.h"
66
67
68 ///////////////////////////////////////////////////////////
69 // //
70 // //
71 // //
72 ///////////////////////////////////////////////////////////
73
74 //---------------------------------------------------------
75 IMPLEMENT_CLASS(CVIEW_Layout, CVIEW_Base);
76
77 //---------------------------------------------------------
BEGIN_EVENT_TABLE(CVIEW_Layout,CVIEW_Base)78 BEGIN_EVENT_TABLE(CVIEW_Layout, CVIEW_Base)
79
80 EVT_KEY_DOWN (CVIEW_Layout::On_Key_Event)
81
82 EVT_SIZE (CVIEW_Layout::On_Size)
83
84 EVT_MENU (ID_CMD_LAYOUT_LOAD , CVIEW_Layout::On_Load )
85 EVT_MENU (ID_CMD_LAYOUT_SAVE , CVIEW_Layout::On_Save )
86 EVT_MENU (ID_CMD_LAYOUT_PROPERTIES , CVIEW_Layout::On_Properties )
87 EVT_MENU (ID_CMD_LAYOUT_PAGE_SETUP , CVIEW_Layout::On_Page_Setup )
88 EVT_MENU (ID_CMD_LAYOUT_PRINT_SETUP , CVIEW_Layout::On_Print_Setup )
89 EVT_MENU (ID_CMD_LAYOUT_PRINT_PREVIEW , CVIEW_Layout::On_Print_Preview)
90 EVT_MENU (ID_CMD_LAYOUT_PRINT , CVIEW_Layout::On_Print )
91 EVT_MENU (ID_CMD_LAYOUT_EXPORT , CVIEW_Layout::On_Export )
92 EVT_MENU (ID_CMD_LAYOUT_TO_CLIPBOARD , CVIEW_Layout::On_Command )
93 EVT_MENU (ID_CMD_LAYOUT_ZOOM_IN , CVIEW_Layout::On_Zoom )
94 EVT_MENU (ID_CMD_LAYOUT_ZOOM_OUT , CVIEW_Layout::On_Zoom )
95 EVT_MENU (ID_CMD_LAYOUT_ZOOM_FULL , CVIEW_Layout::On_Zoom )
96 EVT_MENU (ID_CMD_LAYOUT_ZOOM_ORIGINAL , CVIEW_Layout::On_Zoom )
97
98 EVT_MENU (ID_CMD_LAYOUT_ITEM_MAP , CVIEW_Layout::On_Command )
99 EVT_MENU (ID_CMD_LAYOUT_ITEM_LEGEND , CVIEW_Layout::On_Command )
100 EVT_MENU (ID_CMD_LAYOUT_ITEM_SCALEBAR , CVIEW_Layout::On_Command )
101 EVT_MENU (ID_CMD_LAYOUT_ITEM_SCALE , CVIEW_Layout::On_Command )
102 EVT_MENU (ID_CMD_LAYOUT_ITEM_LABEL , CVIEW_Layout::On_Command )
103 EVT_MENU (ID_CMD_LAYOUT_ITEM_TEXT , CVIEW_Layout::On_Command )
104 EVT_MENU (ID_CMD_LAYOUT_ITEM_IMAGE , CVIEW_Layout::On_Command )
105 EVT_MENU (ID_CMD_LAYOUT_ITEM_PASTE , CVIEW_Layout::On_Command )
106 EVT_MENU (ID_CMD_LAYOUT_ITEM_PROPERTIES , CVIEW_Layout::On_Command )
107 EVT_MENU (ID_CMD_LAYOUT_ITEM_HIDE , CVIEW_Layout::On_Command )
108 EVT_MENU (ID_CMD_LAYOUT_ITEM_DELETE , CVIEW_Layout::On_Command )
109 EVT_MENU (ID_CMD_LAYOUT_ITEM_MOVE_TOP , CVIEW_Layout::On_Command )
110 EVT_MENU (ID_CMD_LAYOUT_ITEM_MOVE_BOTTOM, CVIEW_Layout::On_Command )
111 EVT_MENU (ID_CMD_LAYOUT_ITEM_MOVE_UP , CVIEW_Layout::On_Command )
112 EVT_MENU (ID_CMD_LAYOUT_ITEM_MOVE_DOWN , CVIEW_Layout::On_Command )
113 EVT_MENU (ID_CMD_LAYOUT_IMAGE_SAVE , CVIEW_Layout::On_Command )
114 EVT_MENU (ID_CMD_LAYOUT_IMAGE_RESTORE , CVIEW_Layout::On_Command )
115
116 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_MAP , CVIEW_Layout::On_Command_UI )
117 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_LEGEND , CVIEW_Layout::On_Command_UI )
118 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_SCALEBAR , CVIEW_Layout::On_Command_UI )
119 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_SCALE , CVIEW_Layout::On_Command_UI )
120 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_PASTE , CVIEW_Layout::On_Command_UI )
121 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_HIDE , CVIEW_Layout::On_Command_UI )
122 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_MOVE_TOP , CVIEW_Layout::On_Command_UI )
123 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_MOVE_BOTTOM, CVIEW_Layout::On_Command_UI )
124 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_MOVE_UP , CVIEW_Layout::On_Command_UI )
125 EVT_UPDATE_UI(ID_CMD_LAYOUT_ITEM_MOVE_DOWN , CVIEW_Layout::On_Command_UI )
126
127 END_EVENT_TABLE()
128
129
130 ///////////////////////////////////////////////////////////
131 // //
132 ///////////////////////////////////////////////////////////
133
134 //---------------------------------------------------------
135 CVIEW_Layout::CVIEW_Layout(CVIEW_Layout_Info *pLayout)
136 : CVIEW_Base(pLayout->Get_Map(), ID_VIEW_LAYOUT, _TL("Layout"), ID_IMG_WND_LAYOUT, false)
137 {
138 SetTitle(wxString::Format("%s [%s]", pLayout->Get_Map()->Get_Name().c_str(), _TL("Layout")));
139
140 SYS_Set_Color_BG(this, wxSYS_COLOUR_3DFACE);
141
142 m_pRuler_X = new CVIEW_Ruler(this, RULER_HORIZONTAL|RULER_EDGE_SUNKEN);
143 m_pRuler_Y = new CVIEW_Ruler(this, RULER_VERTICAL |RULER_EDGE_SUNKEN);
144
145 m_pLayout = pLayout;
146
147 m_pControl = new CVIEW_Layout_Control(this, pLayout);
148 m_pControl->SetSize(GetClientSize());
149
150 Do_Show();
151 }
152
153
154 ///////////////////////////////////////////////////////////
155 // //
156 ///////////////////////////////////////////////////////////
157
158 //---------------------------------------------------------
_Create_Menu(void)159 wxMenu * CVIEW_Layout::_Create_Menu(void)
160 {
161 wxMenu *pMenu = new wxMenu, *pSubMenu;
162
163 CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_LOAD);
164 CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_SAVE);
165 pMenu->AppendSeparator();
166 CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_PROPERTIES);
167 CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_PAGE_SETUP);
168 // CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_PRINT_SETUP);
169 CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_PRINT_PREVIEW);
170 pMenu->AppendSeparator();
171 CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_PRINT);
172 CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_EXPORT);
173 CMD_Menu_Add_Item(pMenu , false, ID_CMD_LAYOUT_TO_CLIPBOARD);
174 pMenu->AppendSeparator();
175
176 pSubMenu = new wxMenu;
177 CMD_Menu_Add_Item(pSubMenu, false, ID_CMD_LAYOUT_ZOOM_IN);
178 CMD_Menu_Add_Item(pSubMenu, false, ID_CMD_LAYOUT_ZOOM_OUT);
179 CMD_Menu_Add_Item(pSubMenu, false, ID_CMD_LAYOUT_ZOOM_FULL);
180 // CMD_Menu_Add_Item(pSubMenu, false, ID_CMD_LAYOUT_ZOOM_ORIGINAL);
181 pMenu->AppendSubMenu(pSubMenu, _TL("Zoom"));
182
183 pSubMenu = new wxMenu;
184 // CMD_Menu_Add_Item(pSubMenu, true, ID_CMD_LAYOUT_ITEM_MAP);
185 CMD_Menu_Add_Item(pSubMenu, true, ID_CMD_LAYOUT_ITEM_LEGEND);
186 CMD_Menu_Add_Item(pSubMenu, true, ID_CMD_LAYOUT_ITEM_SCALEBAR);
187 CMD_Menu_Add_Item(pSubMenu, true, ID_CMD_LAYOUT_ITEM_SCALE);
188 pMenu->AppendSubMenu(pSubMenu, _TL("Show"));
189
190 pSubMenu = new wxMenu;
191 CMD_Menu_Add_Item(pSubMenu, false, ID_CMD_LAYOUT_ITEM_LABEL);
192 CMD_Menu_Add_Item(pSubMenu, false, ID_CMD_LAYOUT_ITEM_TEXT);
193 CMD_Menu_Add_Item(pSubMenu, false, ID_CMD_LAYOUT_ITEM_IMAGE);
194 pSubMenu->AppendSeparator();
195 CMD_Menu_Add_Item(pSubMenu, false, ID_CMD_LAYOUT_ITEM_PASTE);
196 pMenu->AppendSubMenu(pSubMenu, _TL("Add"));
197
198 return( pMenu );
199 }
200
201 //---------------------------------------------------------
_Create_ToolBar(void)202 wxToolBarBase * CVIEW_Layout::_Create_ToolBar(void)
203 {
204 wxToolBarBase *pToolBar = CMD_ToolBar_Create(ID_TB_VIEW_LAYOUT);
205
206 // CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_PROPERTIES);
207 CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_PAGE_SETUP);
208 // CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_PRINT_SETUP);
209 CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_PRINT_PREVIEW);
210 CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_PRINT);
211 CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_EXPORT);
212 // CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_TO_CLIPBOARD);
213 CMD_ToolBar_Add_Separator(pToolBar);
214 CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_ZOOM_IN);
215 CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_ZOOM_OUT);
216 CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_ZOOM_FULL);
217 // CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_LAYOUT_ZOOM_ORIGINAL);
218
219 CMD_ToolBar_Add(pToolBar, _TL("Layout"));
220
221 return( pToolBar );
222 }
223
224
225 ///////////////////////////////////////////////////////////
226 // //
227 ///////////////////////////////////////////////////////////
228
229 //---------------------------------------------------------
Do_Destroy(void)230 void CVIEW_Layout::Do_Destroy(void)
231 {
232 m_pControl->Do_Destroy();
233
234 CVIEW_Base::Do_Destroy();
235 }
236
237 //---------------------------------------------------------
Do_Update(void)238 void CVIEW_Layout::Do_Update(void)
239 {
240 m_pControl->Refresh(true);
241 }
242
243
244 ///////////////////////////////////////////////////////////
245 // //
246 ///////////////////////////////////////////////////////////
247
248 //---------------------------------------------------------
On_Key_Event(wxKeyEvent & event)249 void CVIEW_Layout::On_Key_Event(wxKeyEvent &event)
250 {
251 if( event.GetKeyCode() == WXK_F5 )
252 {
253 m_pControl->Refresh();
254 }
255 else if( event.GetKeyCode() == WXK_DELETE )
256 {
257 if( m_pLayout->Can_Delete() && m_pLayout->m_Items.Del(m_pLayout->m_Items.Get_Active()) )
258 {
259 m_pControl->Refresh(false);
260 }
261 }
262 else if( (event.ControlDown() && event.GetUnicodeKey() == 'V')
263 || (event.ShiftDown () && event.GetKeyCode () == WXK_INSERT) )
264 {
265 m_pLayout->Clipboard_Paste();
266 }
267 else
268 {
269 m_pLayout->m_Items.On_Key_Event(event);
270 }
271 }
272
273 //---------------------------------------------------------
On_Size(wxSizeEvent & event)274 void CVIEW_Layout::On_Size(wxSizeEvent &event)
275 {
276 int A = 1;
277 int B = 20;
278 int d = B - 4 * A;
279 int dX = GetClientSize().x - B;
280 int dY = GetClientSize().y - B;
281
282 Freeze();
283
284 m_pRuler_Y->SetSize(wxRect(A, B, d , dY));
285 m_pRuler_X->SetSize(wxRect(B, A, dX, d ));
286 m_pControl->SetSize(wxRect(B, B, dX, dY));
287
288 m_pControl->Zoom_Full();
289
290 Thaw();
291
292 event.Skip();
293 }
294
295
296 ///////////////////////////////////////////////////////////
297 // //
298 ///////////////////////////////////////////////////////////
299
300 //---------------------------------------------------------
Ruler_Set_Position(int x,int y)301 void CVIEW_Layout::Ruler_Set_Position(int x, int y)
302 {
303 m_pRuler_X->Set_Position(x);
304 m_pRuler_Y->Set_Position(y);
305 }
306
307 //---------------------------------------------------------
Ruler_Refresh(double xMin,double xMax,double yMin,double yMax)308 void CVIEW_Layout::Ruler_Refresh(double xMin, double xMax, double yMin, double yMax)
309 {
310 wxRect r(m_pLayout->Get_Margins());
311
312 m_pRuler_X->Set_Range_Core(r.GetLeft(), r.GetLeft() + r.GetWidth ());
313 m_pRuler_Y->Set_Range_Core(r.GetTop (), r.GetTop () + r.GetHeight());
314
315 m_pRuler_X->Set_Range(xMin, xMax);
316 m_pRuler_Y->Set_Range(yMin, yMax);
317 }
318
319
320 ///////////////////////////////////////////////////////////
321 // //
322 ///////////////////////////////////////////////////////////
323
324 //---------------------------------------------------------
On_Load(wxCommandEvent & event)325 void CVIEW_Layout::On_Load(wxCommandEvent &event)
326 {
327 m_pLayout->Load();
328 }
329
330 //---------------------------------------------------------
On_Save(wxCommandEvent & event)331 void CVIEW_Layout::On_Save(wxCommandEvent &event)
332 {
333 m_pLayout->Save();
334 }
335
336 //---------------------------------------------------------
On_Properties(wxCommandEvent & event)337 void CVIEW_Layout::On_Properties(wxCommandEvent &event)
338 {
339 if( m_pLayout->Properties() )
340 {
341 m_pControl->Refresh();
342 }
343 }
344
345 //---------------------------------------------------------
On_Page_Setup(wxCommandEvent & event)346 void CVIEW_Layout::On_Page_Setup(wxCommandEvent &event)
347 {
348 if( m_pLayout->Page_Setup() )
349 {
350 m_pControl->Set_Scrollbars();
351 }
352 }
353
354 //---------------------------------------------------------
On_Print_Setup(wxCommandEvent & event)355 void CVIEW_Layout::On_Print_Setup(wxCommandEvent &event)
356 {
357 if( m_pLayout->Print_Setup() )
358 {
359 m_pControl->Set_Scrollbars();
360 }
361 }
362
363 //---------------------------------------------------------
On_Print_Preview(wxCommandEvent & event)364 void CVIEW_Layout::On_Print_Preview(wxCommandEvent &event)
365 {
366 m_pLayout->Print_Preview();
367 }
368
369 //---------------------------------------------------------
On_Print(wxCommandEvent & event)370 void CVIEW_Layout::On_Print(wxCommandEvent &event)
371 {
372 m_pLayout->Print();
373 }
374
375 //---------------------------------------------------------
On_Export(wxCommandEvent & event)376 void CVIEW_Layout::On_Export(wxCommandEvent &event)
377 {
378 m_pLayout->Export();
379 }
380
381 //---------------------------------------------------------
On_Zoom(wxCommandEvent & event)382 void CVIEW_Layout::On_Zoom(wxCommandEvent &event)
383 {
384 switch( event.GetId() )
385 {
386 case ID_CMD_LAYOUT_ZOOM_IN : m_pControl->Zoom_In (); break;
387 case ID_CMD_LAYOUT_ZOOM_OUT : m_pControl->Zoom_Out (); break;
388 case ID_CMD_LAYOUT_ZOOM_FULL : m_pControl->Zoom_Full (); break;
389 case ID_CMD_LAYOUT_ZOOM_ORIGINAL: m_pControl->Zoom_Original(); break;
390 }
391 }
392
393
394 ///////////////////////////////////////////////////////////
395 // //
396 ///////////////////////////////////////////////////////////
397
398 //---------------------------------------------------------
On_Command(wxCommandEvent & event)399 void CVIEW_Layout::On_Command(wxCommandEvent &event)
400 {
401 m_pLayout->Menu_On_Command(event);
402 }
403
404 //---------------------------------------------------------
On_Command_UI(wxUpdateUIEvent & event)405 void CVIEW_Layout::On_Command_UI(wxUpdateUIEvent &event)
406 {
407 m_pLayout->Menu_On_Command_UI(event);
408 }
409
410
411 ///////////////////////////////////////////////////////////
412 // //
413 // //
414 // //
415 ///////////////////////////////////////////////////////////
416
417 //---------------------------------------------------------
418