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