All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
LayoutEditor.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2001-2009 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/maptools/LayoutEditor.cpp
22 
23  \brief The map editor....
24 */
25 
26 #include "LayoutEditor.h"
27 #include "DraftLayoutEditor.h"
28 #include "DataFrame.h"
29 #include "TextFrame.h"
30 #include "EditorInfo.h"
31 #include "GeographicGridFrame.h"
32 #include "UTMGridFrame.h"
33 #include "GraphicScaleFrame.h"
34 #include "../canvas/MultiThreadMapDisplay.h"
35 
36 // Qt
37 
38 #include <QtGui/QPainter>
39 #include <QtGui/QColor>
40 #include <QtGui/QApplication>
41 #include <QtGui/QMessageBox>
42 #include <QtGui/QInputDialog>
43 #include <QtCore/QDir>
44 
45 te::qt::widgets::LayoutEditor::LayoutEditor(QWidget* parent, Qt::WindowFlags f) :
46  QWidget(parent, f),
47  m_idCount(1),
48  m_paperSize(QSize(210, 297)),
49  m_horizontalRulerWidth(30), // definir tamanho da ruler horizontal em pixels
50  m_verticalRulerWidth(38), // definir tamanho da ruler vertical em pixels
51  m_layoutObjectSelected(0),
52  m_dataPan(false),
53  m_showRulerGrid(true),
54  m_rulerGridLines(1),
55  m_undoBufferSize(100),
56  m_editorState(0),
57  m_resize(false),
58  m_move(false)
59 {
60  setMouseTracking(true);
61  setWindowTitle("Layout Editor");
62 
63  m_auxWidget = new QWidget(this, Qt::Widget);
64  m_auxWidget->setWindowOpacity(0);
65 
67  m_draftLayoutEditor->setWindowOpacity(0);
68 
69  m_putUndo = false;
70  resize(600, 600);
71  m_putUndo = true;
72 
73  // inicializar com papel A4
74  m_paperSize = QSize(210, 297);
75 
76  // insert empty data frame
77  int a = m_paperSize.width();
78  if(a > m_paperSize.height())
79  a = m_paperSize.height();
80 
81  int frameX = qRound((double)a/8);
82  int frameY = 100;
83  int frameWidth = qRound((double)a * .75);
84  int frameHeight = frameWidth;
85  QRectF frameRect(frameX, frameY, frameWidth, frameHeight);
86 
87  te::qt::widgets::DataFrame* df = new te::qt::widgets::DataFrame(frameRect, this, Qt::Widget);
88  df->setData(0);
89  insert(df);
90 
91  // insert text frames
92  int pointSize = 24;
93  te::qt::widgets::TextFrame* tf = new te::qt::widgets::TextFrame(QPointF(10, 10), "INPE\nTerraView\nVersao 5.0", pointSize, this, Qt::Widget);
94  insert(tf);
95 
96  tf = new te::qt::widgets::TextFrame(QPointF(10, 270), "divisao de processamento de imagens", pointSize, this, Qt::Widget);
97  insert(tf);
98 
99  m_zoomInPixmap = 0;
100  m_zoomOutPixmap = 0;
101  m_panPixmap = 0;
102  m_zmouseMode = 0;
103 }
104 
105 te::qt::widgets::LayoutEditor::LayoutEditor(const QSize& paperSize, QWidget* parent, Qt::WindowFlags f) :
106  QWidget(parent, f),
107  m_idCount(1),
108  m_paperSize(paperSize),
109  m_horizontalRulerWidth(30), // definir tamanho da ruler horizontal em pixels
110  m_verticalRulerWidth(38), // definir tamanho da ruler vertical em pixels
111  m_layoutObjectSelected(0),
112  m_dataPan(false),
113  m_showRulerGrid(true),
114  m_rulerGridLines(1),
115  m_undoBufferSize(100),
116  m_editorState(0),
117  m_resize(false),
118  m_move(false)
119 {
120  setMouseTracking(true);
121  setWindowTitle("Layout Editor");
122 
123  m_auxWidget = new QWidget(this, Qt::Widget);
124  m_auxWidget->setWindowOpacity(0);
125 
127  m_draftLayoutEditor->setWindowOpacity(0);
128 
129  m_putUndo = false;
130  resize(600, 600);
131  m_putUndo = true;
132 
133  m_zoomInPixmap = 0;
134  m_zoomOutPixmap = 0;
135  m_panPixmap = 0;
136  m_zmouseMode = 0;
137 }
138 
140 {
141  hide();
142  delete m_draftLayoutEditor;
143  delete m_editorState;
144 
145  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
146  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
147  delete *it;
148  m_layoutObjects.clear();
149 
150  for(it = m_undoLayoutObjects.begin(); it != m_undoLayoutObjects.end(); ++it)
151  delete *it;
152  m_undoLayoutObjects.clear();
153 
154  delete m_zoomInPixmap;
155  delete m_zoomOutPixmap;
156  delete m_panPixmap;
157 }
158 
160 {
161  int delta = qRound((double)m_paperSize.width() / 100);
162  m_paperViewRect.setWidth(m_paperSize.width() + delta + delta);
163  m_paperViewRect.setHeight(m_paperSize.height() + delta + delta);
164  m_paperViewRect.moveCenter(QPointF(((double)m_paperSize.width()/2.), (double)m_paperSize.height()/2.));
165 
166  m_paperViewReseted = true;
167 }
168 
170 {
171  if(m_editorState)
172  {
173  m_editorState->m_paperViewRect = m_paperViewRect;
174  m_editorState->m_paperSize = m_paperSize;
175  m_editorState->m_rulerGridLines = m_rulerGridLines;
176  m_editorState->m_showRulerGrid = m_showRulerGrid;
177  m_editorState->m_rect = m_rect;
178  m_editorState->m_resize = m_resize;
179  m_editorState->m_move = m_move;
180  }
181 }
182 
184 {
185  if(m_paperViewRect.isValid() == false)
186  resetPaperView();
187 
188  // criar o totalPixmap que representa a area do paperView + as rulers
189  int tw = size().width();
190  int w = tw - 2 * m_verticalRulerWidth;
191  int th = size().height();
192  int h = th - 2 * m_horizontalRulerWidth;
193 
194  if(m_paperViewReseted)
195  {
196  double relw = (double)w / (double)m_paperViewRect.width();
197  double relh = (double)h / (double)m_paperViewRect.height();
198 
199  int nw, nh, ntw, nth;
200  // ajustar m_paperViewRect sobre o display
201  if(relw < relh)
202  {
203  nh = qRound((double)(w) * m_paperViewRect.height() / m_paperViewRect.width());
204  nth = h + 2 * m_horizontalRulerWidth;
205 
206  QPointF c = m_paperViewRect.center();
207  double v = (double)h / (double)nh;
208  double d = (double)m_paperViewRect.height() * v;
209  m_paperViewRect = QRect(0., 0., m_paperViewRect.width(), d);
210  m_paperViewRect.moveCenter(c);
211  }
212  else
213  {
214  nw = qRound((double)(h) * m_paperViewRect.width() / m_paperViewRect.height());
215  ntw = w + 2 * m_verticalRulerWidth;
216 
217  QPointF c = m_paperViewRect.center();
218  double v = (double)w / (double)nw;
219  double d = (double)m_paperViewRect.width() * v;
220  m_paperViewRect = QRect(0., 0., d, m_paperViewRect.height());
221  m_paperViewRect.moveCenter(c);
222  }
223  }
224 
225  m_totalPixmap = QPixmap(tw, th);
226  m_totalPixmap.fill(Qt::gray);
227 
228  // criar o pixmap que representa o paperview (regiao de visualizacao)
229  m_viewPixmap = QPixmap(w, h);
230 
231  if(putUndo)
232  {
233  // if resize operation in progress
234  // calculate new paperView
235  if(m_difTopLeft != QPointF(0., 0.)) // top left resized
236  {
237  QRectF r(m_difTopLeft, QSize(w, h));
238  m_paperViewRect = m_matrixPaperViewToVp.inverted().mapRect(r);
239  }
240  else if(m_difBottomRight != QPointF(0., 0.)) // bottom right resized
241  {
242  QRectF r(QPoint(0., 0.), QSize(w, h));
243  m_paperViewRect = m_matrixPaperViewToVp.inverted().mapRect(r);
244  }
245  }
246 
247  // agora podemos calcular a escala entre o paperView e o viewport
248  double scalePaperViewToVp = (double)m_viewPixmap.width() / m_paperViewRect.width();
249 
250  // criar a matrix de transformacao paperView to Viewport
251  QMatrix matrixOld = m_matrixPaperViewToVp;
252  m_matrixPaperViewToVp.reset();
253  m_matrixPaperViewToVp.scale(scalePaperViewToVp, -scalePaperViewToVp);
254  m_matrixPaperViewToVp.translate(-m_paperViewRect.left(), -m_paperViewRect.bottom());
255 
256  m_matrix.reset();
257  m_matrix.scale(scalePaperViewToVp, -scalePaperViewToVp);
258  double tx = m_paperViewRect.left() + (double)m_verticalRulerWidth / scalePaperViewToVp;
259  double ty = m_paperViewRect.bottom() - (double)m_horizontalRulerWidth / scalePaperViewToVp;
260  m_matrix.translate(-tx, -ty);
261 
262  // insert rulers to totalPixmap
263  insertRulers();
264 
265  QPainter painter(&m_viewPixmap);
266  painter.setMatrix(m_matrixPaperViewToVp);
267 
268  // desenhar retangulo do papel
269  painter.setBrush(Qt::NoBrush);
270  QPen pen(QColor(0, 0, 255, 255));
271  pen.setStyle(Qt::DashLine);
272  painter.setPen(pen);
273  painter.drawRect(QRect(0, 0, m_paperSize.width(), m_paperSize.height()));
274  painter.end();
275 
276  //// copiar paperView to totalPixmap
277  //// NOTA: totalPixmap eh a area de visualizacao + as reguas (eventualmente pode ser a folha toda... depende do zoom)
278  //painter.begin(&m_totalPixmap);
279  //painter.drawPixmap(m_verticalRulerWidth, m_horizontalRulerWidth, m_viewPixmap);
280 
281  //painter.end();
282 
283  m_paperViewReseted = false;
284 
285  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
286  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
287  (*it)->adjust();
288 
289  update();
290 
291  if(putUndo)
292  appendToUndo();
293 }
294 
295 void te::qt::widgets::LayoutEditor::appendToUndo() // usado para quando muda o frame work
296 {
297  if(m_undoBufferSize)
298  {
299  if(m_editorState == 0)
300  {
301  m_editorState = new te::qt::widgets::EditorInfo(this);
302  copyState();
303  }
305 
306  // verifique se ultrapassa o numero de undos. Se sim, retire os mais antigos undo.
307  while(m_undoLayoutObjects.size() >= (unsigned int)m_undoBufferSize)
308  {
309  std::vector<te::qt::widgets::LayoutObject*>::iterator it = m_undoLayoutObjects.begin();
311  m_undoLayoutObjects.erase(it);
312  delete (fa);
313  }
314 
315  // se a operacao � resize, elimine os desnecessarios
316  if(m_resize || m_move) // � resize ou move operation
317  {
318  te::qt::widgets::LayoutObject *fu = 0, *fap = 0;
319  std::vector<te::qt::widgets::LayoutObject*>::reverse_iterator it = m_undoLayoutObjects.rbegin();
320  if(it != m_undoLayoutObjects.rend())
321  {
322  fu = *it;
323  ++it;
324  if(it != m_undoLayoutObjects.rend())
325  {
326  fap = *it;
327 
328  if(fu && fap)
329  {
330  if(fu->getId() == 0 && fap->getId() == 0) // � viewer edition
331  {
334 
335  if((eiu->m_resize || eiu->m_move) && (eiap->m_resize || eiap->m_move))
336  {
337  m_undoLayoutObjects.pop_back();
338  delete fu;
339  if(m_undoLayoutObjects.size() > 1)
340  {
341  m_undoLayoutObjects.pop_back();
342  delete fap;
343  }
344  }
345  }
346  }
347  }
348  }
349  }
350 
351  m_undoLayoutObjects.push_back(ei);
352  m_resize = false;
353  m_move = false;
354  copyState();
355  }
356 }
357 
359 {
360  return m_horizontalRulerWidth;
361 }
362 
364 {
365  return m_verticalRulerWidth;
366 }
367 
369 {
370  int s = m_undoBufferSize - size;
371 
372  if(s > 0)
373  {
374  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
375  for(int i = 0; i != s; ++i)
376  {
377  it = m_undoLayoutObjects.begin();
379  m_undoLayoutObjects.erase(it);
380  delete (f);
381  }
382  }
383 }
384 
386 {
387  return m_undoBufferSize;
388 }
389 
391 {
392  // calcular horizontal ruler width
393  int horizontalRulerWidth = qRound((double)(m_totalPixmap.height() - m_viewPixmap.height()) / 2);
394 
395  // calcular vertical ruler width
396  int verticalRulerWidth = qRound((double)(m_totalPixmap.width() - m_viewPixmap.width()) / 2);
397 
398  // valores minimos e maximos das reguas
399  double xmin = m_paperViewRect.left();
400  double xmax = m_paperViewRect.right();
401  double ymin = m_paperViewRect.top();
402  double ymax = m_paperViewRect.bottom();
403 
404  // definir a resolucao da regua de acordo com a escala
405  double scale = m_matrixPaperViewToVp.m11();
406  if(scale > 4)
407  {
408  m_rulerSmall = 1;
409  m_rulerMedium = 5;
410  m_rulerLarge = 10;
411  }
412  else if(scale > 2)
413  {
414  m_rulerSmall = 2;
415  m_rulerMedium = 10;
416  m_rulerLarge = 20;
417  }
418  else if(scale > 1)
419  {
420  m_rulerSmall = 5;
421  m_rulerMedium = 25;
422  m_rulerLarge = 50;
423  }
424  else if(scale > .5)
425  {
426  m_rulerSmall = 10;
427  m_rulerMedium = 50;
428  m_rulerLarge = 100;
429  }
430  else if(scale > .25)
431  {
432  m_rulerSmall = 20;
433  m_rulerMedium = 100;
434  m_rulerLarge = 200;
435  }
436  else if(scale > .125)
437  {
438  m_rulerSmall = 50;
439  m_rulerMedium = 250;
440  m_rulerLarge = 500;
441  }
442  else
443  {
444  m_rulerSmall = 100;
445  m_rulerMedium = 500;
446  m_rulerLarge = 1000;
447  }
448 
449  // create horizontal rulers
450  QPixmap rulerBottom(m_viewPixmap.width(), horizontalRulerWidth);
451  rulerBottom.fill(Qt::gray);
452  QPixmap rulerTop(rulerBottom);
453 
454  QString num;
455  QPainter painter1(&rulerBottom);
456  QPen pen(Qt::black);
457  painter1.setPen(pen);
458  QFont font("");
459  int fontSize = 11; // medida da fonte em pixels
460  font.setPixelSize(fontSize);
461  painter1.setFont(font);
462 
463  QPainter painter2(&rulerTop);
464  painter2.setPen(pen);
465  painter2.setFont(font);
466 
467  int ini = 1;
468  int peq = 5;
469  int medio = 8;
470  int grande = 10;
471  QPoint pb1(0, ini);
472  QPoint pb2(0, peq);
473  QPoint pb3(0, medio);
474  QPoint pb4(0, grande);
475  QPoint pb5(0, fontSize + grande);
476  QPoint pt1(0, horizontalRulerWidth - ini);
477  QPoint pt2(0, horizontalRulerWidth - peq);
478  QPoint pt3(0, horizontalRulerWidth - medio);
479  QPoint pt4(0, horizontalRulerWidth - grande);
480  QPoint pt5(0, horizontalRulerWidth - fontSize - grande);
481  int a = xmin;
482  while(a <= (xmax+1))
483  {
484  int xp = qRound(m_matrixPaperViewToVp.map(QPoint(a, m_paperViewRect.top())).x());
485  pb1.setX(xp);
486  pb2.setX(xp);
487  pb3.setX(xp);
488  pb4.setX(xp);
489  pb5.setX(xp);
490  pt1.setX(xp);
491  pt2.setX(xp);
492  pt3.setX(xp);
493  pt4.setX(xp);
494  pt5.setX(xp);
495  if((a % m_rulerLarge) == 0)
496  {
497  painter1.drawLine(pb1, pb4);
498  num.setNum(a);
499  QRectF br = painter1.boundingRect(QRectF(0, 0, rulerBottom.width(), rulerBottom.height()), Qt::AlignHCenter, num);
500  br.moveCenter(pb5);
501  painter1.drawText(br, num);
502 
503  painter2.drawLine(pt1, pt4);
504  br.moveCenter(pt5);
505  painter2.drawText(br, num);
506  }
507  else if((a % m_rulerMedium) == 0)
508  {
509  painter1.drawLine(pb1, pb3);
510  painter2.drawLine(pt1, pt3);
511  }
512  else if((a % m_rulerSmall) == 0)
513  {
514  painter1.drawLine(pb1, pb2);
515  painter2.drawLine(pt1, pt2);
516  }
517  a++;
518  }
519  painter1.end();
520  painter2.end();
521 
522 
523  // create vertical rules
524  QPixmap rulerRight(verticalRulerWidth, m_viewPixmap.height());
525  rulerRight.fill(Qt::gray);
526  QPixmap rulerLeft(rulerRight);
527 
528  painter1.begin(&rulerRight);
529  painter1.setPen(pen);
530  painter1.setFont(font);
531 
532  painter2.begin(&rulerLeft);
533  painter2.setPen(pen);
534  painter2.setFont(font);
535 
536  QPoint pr1(ini, 0);
537  QPoint pr2(peq, 0);
538  QPoint pr3(medio, 0);
539  QPoint pr4(grande, 0);
540  QPoint pr5(fontSize + grande, 0);
541  QPoint pl1(verticalRulerWidth - ini, 0);
542  QPoint pl2(verticalRulerWidth - peq, 0);
543  QPoint pl3(verticalRulerWidth - medio, 0);
544  QPoint pl4(verticalRulerWidth - grande, 0);
545  QPoint pl5(verticalRulerWidth - fontSize - grande, 0);
546  a = ymin;
547  while(a <= (ymax+1))
548  {
549  int yp = m_matrixPaperViewToVp.map(QPoint(0, a)).y();
550  pr1.setY(yp);
551  pr2.setY(yp);
552  pr3.setY(yp);
553  pr4.setY(yp);
554  pr5.setY(yp);
555  pl1.setY(yp);
556  pl2.setY(yp);
557  pl3.setY(yp);
558  pl4.setY(yp);
559  pl5.setY(yp);
560  if((a % m_rulerLarge) == 0)
561  {
562  painter1.drawLine(pr1, pr4);
563  num.setNum(a);
564  QRectF br = painter1.boundingRect(QRectF(0, 0, rulerRight.width(), rulerRight.height()), Qt::AlignHCenter, num);
565  br.moveCenter(pr5);
566  painter1.drawText(br, num);
567 
568  painter2.drawLine(pl1, pl4);
569  br.moveCenter(pl5);
570  painter2.drawText(br, num);
571  }
572  else if((a % m_rulerMedium) == 0)
573  {
574  painter1.drawLine(pr1, pr3);
575  painter2.drawLine(pl1, pl3);
576  }
577  else if((a % m_rulerSmall) == 0)
578  {
579  painter1.drawLine(pr1, pr2);
580  painter2.drawLine(pl1, pl2);
581  }
582  a++;
583  }
584  painter1.end();
585  painter2.end();
586  painter1.begin(&m_totalPixmap);
587 
588  painter1.drawPixmap(verticalRulerWidth, m_totalPixmap.height() - horizontalRulerWidth, rulerBottom);
589  painter1.drawPixmap(verticalRulerWidth, 0, rulerTop);
590  painter1.drawPixmap(m_totalPixmap.width() - verticalRulerWidth, horizontalRulerWidth, rulerRight);
591  painter1.drawPixmap(0, horizontalRulerWidth, rulerLeft);
592  painter1.end();
593 
594  createRulerGrid();
595 }
596 
598 {
599  if(m_showRulerGrid == true)
600  return;
601  m_showRulerGrid = true;
602  draw();
603 }
604 
606 {
607  if(m_showRulerGrid == false)
608  return;
609  m_showRulerGrid = false;
610  draw();
611 }
612 
614 {
615  m_rulerGridPixmap = QPixmap(m_viewPixmap.width(), m_viewPixmap.height());
616  m_rulerGridPixmap.fill(Qt::white);
617 
618  // valores minimos e maximos das reguas
619  int xmin = qRound(m_paperViewRect.left()) - m_rulerLarge;
620  int xmax = qRound(m_paperViewRect.right()) + m_rulerLarge;
621  int ymin = qRound(m_paperViewRect.top()) - m_rulerLarge;
622  int ymax = qRound(m_paperViewRect.bottom()) + m_rulerLarge;
623 
624  while(xmin <= xmax)
625  {
626  if((xmin % m_rulerSmall) == 0)
627  break;
628  xmin++;
629  }
630 
631  while(ymin <= ymax)
632  {
633  if((ymin % m_rulerSmall) == 0)
634  break;
635  ymin++;
636  }
637 
638  QPainter painter(&m_rulerGridPixmap);
639  painter.setMatrix(m_matrixPaperViewToVp);
640  QPen pen(Qt::blue);
641 
642  int line;
643  //QPoint p1(xmin, m_paperViewRect.top());
644  QPoint p1(xmin, ymin);
645  QPoint p2(xmin, ymax);
646  while(p1.x() <= xmax)
647  {
648  painter.setPen(QPen(Qt::blue));
649  line = 1;
650  if((p1.x() % m_rulerLarge) == 0)
651  {
652  line = 3;
653  painter.setPen(QPen(Qt::red));
654  }
655  else if((p1.x() % m_rulerMedium) == 0)
656  {
657  line = 2;
658  painter.setPen(QPen(Qt::green));
659  }
660 
661  if(line >= m_rulerGridLines)
662  painter.drawLine(p1, p2);
663 
664  p1.setX(p1.x() + m_rulerSmall);
665  p2.setX(p2.x() + m_rulerSmall);
666  }
667 
668  //p1 = QPoint(m_paperViewRect.left(), ymin);
669  p1 = QPoint(xmin, ymin);
670  p2 = QPoint(xmax, ymin);
671  while(p1.y() <= ymax)
672  {
673  painter.setPen(QPen(Qt::blue));
674  line = 1;
675  if((p1.y() % m_rulerLarge) == 0)
676  {
677  line = 3;
678  painter.setPen(QPen(Qt::red));
679  }
680  else if((p1.y() % m_rulerMedium) == 0)
681  {
682  line = 2;
683  painter.setPen(QPen(Qt::green));
684  }
685 
686  if(line >= m_rulerGridLines)
687  painter.drawLine(p1, p2);
688 
689  p1.setY(p1.y() + m_rulerSmall);
690  p2.setY(p2.y() + m_rulerSmall);
691  }
692 }
693 
695 {
696  QPainter painter(this);
697 
698  int x = 0;
699  int y = 0;
700 
701  if(size().width() > m_totalPixmap.width())
702  x = qRound((double)(size().width() - m_totalPixmap.width()) / 2);
703  if(size().height() > m_totalPixmap.height())
704  y = qRound((double)(size().height() - m_totalPixmap.height()) / 2);
705 
706  painter.drawPixmap(x, y, m_totalPixmap);
707  m_draftLayoutEditor->update();
708 }
709 
711 {
712  m_resize = true;
713  copyState();
714  int w = width() - m_verticalRulerWidth - m_verticalRulerWidth;
715  int h = height() - m_horizontalRulerWidth - m_horizontalRulerWidth;
716  m_auxWidget->resize(w, h);
717  m_auxWidget->move(m_verticalRulerWidth, m_horizontalRulerWidth);
718  m_auxWidget->show();
719 
720  m_draftLayoutEditor->resize(w, h);
721  m_draftLayoutEditor->getDraftPixmap()->fill(Qt::transparent);
722 
723  m_difTopLeft = QPointF(0., 0.);
724  m_difBottomRight = QPointF(0., 0.);
725 
726  QRect rec(pos().x(), pos().y(), size().width(), size().height());
727  if(m_rect.isValid())
728  {
729  if(rec.topLeft() != m_rect.topLeft())
730  m_difTopLeft = rec.topLeft() - m_rect.topLeft();
731  else
732  m_difBottomRight = rec.bottomRight() - m_rect.bottomRight();
733  }
734  m_rect = rec;
735 
736  createWorkingArea(m_putUndo);
737  draw();
738 
739  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
740  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
741  (*it)->adjust();
742 }
743 
744 // O evento de move eh chamado apos mover, mas,
745 // tambem � chamado antes de resize top/left
747 {
748  // usado para manter o papel na mesma posicao durante o resize top/left
749  if(m_putUndo)
750  {
751  // informacoes de undo para poder voltar aa posicao anterior
752  //if(m_rect.isValid())
753  // appendToUndo();
754  if(m_rect.isValid())
755  {
756  m_move = true;
757  copyState();
758  m_difTopLeft = pos() - m_rect.topLeft();
759 
760  m_rect.moveTopLeft(pos());
761  createWorkingArea(m_putUndo);
762  draw();
763 
764  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
765  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
766  (*it)->adjust();
767  }
768  }
769 }
770 
772 {
773  m_paperSize = size;
774  createWorkingArea();
775  draw();
776 }
777 
779 {
780  return m_paperSize;
781 }
782 
784 {
785  return m_paperViewRect;
786 }
787 
789 {
790  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
791  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
792  {
793  if((*it)->getId() == id)
794  return (*it);
795  }
796  return 0;
797 }
798 
799 // n�o use este metodo para inserir frames durante a edi��o
801 {
802  if(f->getId() == 0)
803  f->setId(m_idCount++);
804  m_layoutObjects.push_back(f);
805 }
806 
808 {
809  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
810  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
811  {
812  if((*it) == f)
813  {
814  m_layoutObjects.erase(it);
815  break;
816  }
817  }
818 }
819 
821 {
823  if(f->windowTitle() == "TextFrame")
825  else if(f->windowTitle() == "DataFrame")
827  else
828  return;
829 
830  while(m_undoLayoutObjects.size() >= (unsigned int)m_undoBufferSize)
831  {
832  std::vector<te::qt::widgets::LayoutObject*>::iterator it = m_undoLayoutObjects.begin();
834  m_undoLayoutObjects.erase(it);
835  delete (f);
836  }
837 
838  if(f->getId() != 0) // � frame edition
839  {
841  frame->setNew(false);
842  }
843 
844  m_undoLayoutObjects.push_back(cf);
845  cf->hide();
846 
847  setFrameSelected(f);
848 }
849 
851 {
852  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
853  for(it = m_undoLayoutObjects.begin(); it != m_undoLayoutObjects.end(); ++it)
854  {
855  if((*it) == f)
856  {
857  m_undoLayoutObjects.erase(it);
858  break;
859  }
860  }
861 }
862 
864 {
865  QPointF pp = m_matrixPaperViewToVp.inverted().map(p);
866  QPointF ps = m_matrixPaperViewToVp.inverted().map(m_startPan);
867  m_startPan = p;
868 
869  QPointF dif = pp - ps;
870  QPointF c = m_paperViewRect.center();
871  c -= dif;
872  m_paperViewRect.moveCenter(c);
873 
874  createWorkingArea();
875  draw();
876 }
877 
879 {
880  m_viewPixmap.fill(Qt::white);
881 
882  QPainter painter(&m_viewPixmap);
883  if(m_showRulerGrid)
884  painter.drawPixmap(0, 0, m_rulerGridPixmap);
885 
886  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
887  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
888  {
889  if((*it)->windowTitle() == "DataFrame")
890  {
892  if(df->getFrameRect().intersects(m_paperViewRect))
893  df->draw();
894  }
895  }
896 
897  QRect pr = m_matrixPaperViewToVp.mapRect(QRect(0, 0, m_paperSize.width(), m_paperSize.height()));
898 
899  // desenhar retangulo do papel
900  painter.setBrush(Qt::NoBrush);
901  QPen pen(QColor(0, 0, 255, 255));
902  pen.setStyle(Qt::DashLine);
903  pen.setWidth(3);
904  painter.setPen(pen);
905  painter.drawRect(pr);
906  painter.end();
907 
908  // copiar papel to totalPixmap
909  painter.begin(&m_totalPixmap);
910  painter.drawPixmap(m_verticalRulerWidth, m_horizontalRulerWidth, m_viewPixmap);
911 
912  painter.end();
913 
914  update();
915 }
916 
918 {
919  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
920  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
921  {
922  if((*it)->windowTitle() == "DataFrame")
923  {
925  df->drawButtonClicked();
926  }
927  }
928 }
929 
931 {
932  if(e->button() == Qt::MidButton)
933  {
934  int i = m_zmouseMode + 1;
935  if(i > 3)
936  i = 0;
937  setMouseMode(i);
938  return;
939  }
940 
941  m_difTopLeft = QPointF(0., 0.);
942  m_difBottomRight = QPointF(0., 0.);
943  m_zdataFrame = 0;
944 
945  m_zpressPoint = e->pos();
946  if(m_zmouseMode == 3)
947  {
948  //unsetCursor();
949  //QCursor cursor(Qt::OpenHandCursor);
950  //setCursor(cursor);
951  m_zpanEnd = false;
952  m_zpixmap = QPixmap(m_totalPixmap);
953 
954  // desenha os layout objects sobre m_zpixmap
955  QPoint p(m_verticalRulerWidth, m_horizontalRulerWidth);
956  QPainter painter(&m_zpixmap);
957 
958  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
959  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
960  {
961  QRectF r = (*it)->getFrameRect();
962  if(r.isValid())
963  {
964  QPixmap* pixmap = (*it)->getPixmap();
965  if(pixmap && pixmap->isNull() == false)
966  {
967  r = m_matrixPaperViewToVp.mapRect(r);
968  r.moveCenter(r.center() + p);
969  painter.drawPixmap(r, *pixmap, pixmap->rect());
970  }
971  if((*it)->windowTitle() == "DataFrame")
972  {
974  if(df->getUTMGridFrame())
975  {
976  QRect r = df->getUTMGridFrame()->getFrameRect().toRect();
977  QPixmap* pixmap = df->getUTMGridFrame()->getPixmap();
978  if(pixmap && pixmap->isNull() == false)
979  {
980  r = m_matrixPaperViewToVp.mapRect(r);
981  r.moveCenter(r.center() + p);
982  painter.drawPixmap(r, *pixmap, pixmap->rect());
983  }
984  }
985  if(df->getGeoGridFrame())
986  {
987  QRect r = df->getGeoGridFrame()->getFrameRect().toRect();
988  QPixmap* pixmap = df->getGeoGridFrame()->getPixmap();
989  if(pixmap && pixmap->isNull() == false)
990  {
991  r = m_matrixPaperViewToVp.mapRect(r);
992  r.moveCenter(r.center() + p);
993  painter.drawPixmap(r, *pixmap, pixmap->rect());
994  }
995  }
996  if(df->getGraphicScaleFrame())
997  {
998  QRect r = df->getGraphicScaleFrame()->getFrameRect().toRect();
999  QPixmap* pixmap = df->getGraphicScaleFrame()->getPixmap();
1000  if(pixmap && pixmap->isNull() == false)
1001  {
1002  r = m_matrixPaperViewToVp.mapRect(r);
1003  r.moveCenter(r.center() + p);
1004  painter.drawPixmap(r, *pixmap, pixmap->rect());
1005  }
1006  }
1007  }
1008  }
1009  }
1010  }
1011 
1012  if(e->modifiers() == Qt::ControlModifier)
1013  {
1014  //get Data Frame
1015  m_zdataFrame = 0;
1016  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
1017  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
1018  {
1019  if((*it)->windowTitle() == "DataFrame")
1020  {
1022  QRectF r = df->getFrameRect();
1023  QPointF p = QPoint(e->pos().x(), e->pos().y());
1024  p = m_matrixPaperViewToVp.inverted().map(p);
1025  if(r.contains(p))
1026  {
1027  if(df->getData())
1028  {
1029  m_zdataFrame = df;
1030  m_zpixmap = QPixmap(*df->getPixmap());
1031  }
1032  else
1033  m_zdataFrame = 0;
1034  break;
1035  }
1036  }
1037  }
1038  }
1039 }
1040 
1042 {
1043  if(e->modifiers() == Qt::ControlModifier && m_zdataFrame == 0)
1044  return;
1045 
1046  m_zpoint = e->pos();
1047 
1048  if(e->buttons() == Qt::LeftButton) //atual estado do botao
1049  {
1050  if(m_zmouseMode == 3)
1051  {
1052  if(cursor().shape() != Qt::ClosedHandCursor)
1053  {
1054  unsetCursor();
1055  QCursor cursor(Qt::ClosedHandCursor);
1056  setCursor(cursor);
1057  }
1058 
1059  if(e->modifiers() == Qt::NoModifier) // pan sobre paper view
1060  {
1061  hideAllObjects();
1062  m_zrect = QRect();
1063  QPoint pfrom(m_zpressPoint.x(), m_zpressPoint.y());
1064  QPoint pto(e->pos().x(), e->pos().y());
1065  QPoint dif = pto - pfrom;
1066 
1067  m_totalPixmap.fill(Qt::white);
1068  QPainter painter(&m_totalPixmap);
1069  QRect r = m_totalPixmap.rect();
1070  QPoint c(r.center() + dif);
1071  r.moveCenter(c);
1072  painter.drawPixmap(r, m_zpixmap, m_zpixmap.rect());
1073  painter.end();
1074  update();
1075  }
1076  else if(e->modifiers() == Qt::ControlModifier && m_zdataFrame) // pan sobre data frame
1077  {
1078  m_zrect = QRect();
1079  QPoint pfrom(m_zpressPoint.x(), m_zpressPoint.y());
1080  QPoint pto(e->pos().x(), e->pos().y());
1081  QPoint dif = pto - pfrom;
1082 
1083  QPixmap* pix = m_zdataFrame->getMapDisplay()->getDisplayPixmap();
1084  pix->fill(Qt::white);
1085  QPainter painter(pix);
1086  QRect r = m_zpixmap.rect();
1087  QPoint c(r.center() + dif);
1088  r.moveCenter(c);
1089  painter.drawPixmap(r, m_zpixmap, m_zpixmap.rect());
1090  painter.end();
1091  m_zdataFrame->getMapDisplay()->update();
1092  }
1093  }
1094  else if(m_zmouseMode == 2) // zoom out
1095  {
1096  m_zrect = QRect();
1097  }
1098  else if(m_zmouseMode == 1) // zoom in
1099  {
1100  int w = abs(m_zpoint.x() - m_zpressPoint.x()) + 1;
1101  int h = abs(m_zpoint.y() - m_zpressPoint.y()) + 1;
1102  if(m_zpoint.x() > m_zpressPoint.x() && m_zpoint.y() > m_zpressPoint.y())
1103  m_zrect.setRect(m_zpressPoint.x(), m_zpressPoint.y(), w, h);
1104  else if(m_zpoint.x() > m_zpressPoint.x() && m_zpoint.y() < m_zpressPoint.y())
1105  m_zrect.setRect(m_zpressPoint.x(), m_zpoint.y(), w, h);
1106  else if(m_zpoint.x() < m_zpressPoint.x() && m_zpoint.y() < m_zpressPoint.y())
1107  m_zrect.setRect(m_zpoint.x(), m_zpoint.y(), w, h);
1108  else
1109  m_zrect.setRect(m_zpoint.x(), m_zpressPoint.y(), w, h);
1110  drawRectArea();
1111  }
1112  }
1113 }
1114 
1116 {
1117  double zoomFat = 1.5;
1118 
1119  if(m_zmouseMode == 3)
1120  {
1121  unsetCursor();
1122  QCursor cursor(Qt::OpenHandCursor);
1123  setCursor(cursor);
1124  }
1125 
1126  // zoom and Pan on the paper view
1127  if(e->modifiers() == Qt::NoModifier)
1128  {
1129  if(e->button() == Qt::LeftButton) // botao que causou o evento
1130  {
1131  if(m_zmouseMode == 1) // zoom in area (paper view)
1132  {
1133  if(m_zrect.isValid() && m_zrect.width() > 2 && m_zrect.height() > 2)
1134  {
1135  QRectF r(m_zrect.left(), m_zrect.top(), m_zrect.width(), m_zrect.height());
1136  r = m_matrixPaperViewToVp.inverted().mapRect(r);
1137  adjustAspectRatio(r, m_paperViewRect);
1138  m_paperViewRect = r;
1139  createWorkingArea();
1140  draw();
1141  }
1142  else // zoom in (paper view)
1143  {
1144  QPointF c(m_zpressPoint.x(), m_zpressPoint.y());
1145  QPointF cf = m_matrixPaperViewToVp.inverted().map(c);
1146  double w = m_paperViewRect.width() / zoomFat;
1147  double h = m_paperViewRect.height() / zoomFat;
1148  m_paperViewRect = QRectF(0, 0, w, h);
1149  m_paperViewRect.moveCenter(cf);
1150  createWorkingArea();
1151  draw();
1152  }
1153  m_zrect = QRect();
1154  drawRectArea();
1155  }
1156  else if(m_zmouseMode == 2) // zoom out (paper view)
1157  {
1158  QPointF c(m_zpressPoint.x(), m_zpressPoint.y());
1159  QPointF cf = m_matrixPaperViewToVp.inverted().map(c);
1160  double w = m_paperViewRect.width() * zoomFat;
1161  double h = m_paperViewRect.height() * zoomFat;
1162  m_paperViewRect = QRectF(0, 0, w, h);
1163  m_paperViewRect.moveCenter(cf);
1164  createWorkingArea();
1165  draw();
1166  }
1167  else if(m_zmouseMode == 3) // pan (paper view)
1168  {
1169  m_zpanEnd = true;
1170  QPointF pfrom(m_zpressPoint.x(), m_zpressPoint.y());
1171  pfrom = m_matrixPaperViewToVp.inverted().map(pfrom);
1172 
1173  QPointF pto(e->pos().x(), e->pos().y());
1174  pto = m_matrixPaperViewToVp.inverted().map(pto);
1175 
1176  QPointF dif = pto - pfrom;
1177  QPointF c = m_paperViewRect.center();
1178  c -= dif;
1179  m_paperViewRect.moveCenter(c);
1180  createWorkingArea();
1181  showAllObjects();
1182  draw();
1183  }
1184  }
1185  }
1186 
1187  // Zoom and Pan on the data frame
1188  else if(e->modifiers() == Qt::ControlModifier && m_zdataFrame)
1189  {
1190  // data frame em mm
1191  QRectF fr = m_zdataFrame->getFrameRect();
1192  // data frame em pixels
1193  QRectF frp = m_matrixPaperViewToVp.mapRect(fr);
1194 
1195  double magDecl = m_zdataFrame->getMagneticDeclination();
1196  QMatrix auxMatrix;
1197  auxMatrix.translate(frp.width()/2., frp.height()/2.);
1198  auxMatrix.rotate(magDecl);
1199  auxMatrix.translate(-frp.width()/2., -frp.height()/2.);
1200 
1201  if(e->button() == Qt::LeftButton) // botao que causou o evento
1202  {
1203  if(m_zmouseMode == 1) // zoom in area (data frame)
1204  {
1205  if(m_zrect.isValid() && m_zrect.width() > 2 && m_zrect.height() > 2)
1206  {
1207  insertCopy2Undo(m_zdataFrame);
1208 
1209  // m_zrect tem posicao em relacao ao layout editor
1210  // mova para ser em relacao ao frame
1211  QPoint cc = m_zrect.center();
1212  cc -= m_zdataFrame->pos();
1213  m_zrect.moveCenter(cc);
1214 
1215  // faca a correcao da declinacao magnetica sobre cc
1216  cc = auxMatrix.inverted().map(cc);
1217 
1218  // retorne a posicao para ser em relacao ao layout editor
1219  cc += m_zdataFrame->pos();
1220  m_zrect.moveCenter(cc);
1221 
1222  QRectF zr(m_zrect.left(), m_zrect.top(), m_zrect.width(), m_zrect.height());
1223 
1224  // area do zoom em mm
1225  zr = m_matrixPaperViewToVp.inverted().mapRect(zr);
1226  // ajusta a relacao de aspecto da area do zoom em relacao ao do frame
1227  adjustAspectRatio(zr, fr);
1228 
1229  // area do world
1230  QRectF r = m_zdataFrame->getDataRect();
1231 
1232  // calcule new world data rect
1233  double x1 = r.left() + ((zr.left() - fr.left()) / fr.width()) * r.width();
1234  double y1 = r.top() + ((zr.top() - fr.top()) / fr.height()) * r.height();
1235  double w = r.width() * (zr.width() / fr.width());
1236  double h = r.height() * (zr.height() / fr.height());
1237  QRectF nr(x1, y1, w, h);
1238  m_zdataFrame->setDataRect(nr);
1239  if(m_zdataFrame->getGraphicScaleFrame())
1240  {
1241  double step = m_zdataFrame->getGraphicScaleFrame()->getStep();
1242  step *= zr.width() / fr.width();
1243  m_zdataFrame->getGraphicScaleFrame()->findNiceStep(step);
1244  }
1245  createWorkingArea(false);
1246  draw();
1247  }
1248  else // zoom in (data frame)
1249  {
1250  insertCopy2Undo(m_zdataFrame);
1251 
1252  // posicao em relacao ao layout editor
1253  QPointF c(m_zpressPoint.x(), m_zpressPoint.y());
1254 
1255  // mova para ser em relacao ao frame
1256  c -= m_zdataFrame->pos();
1257 
1258  // faca a correcao da declinacao magnetica para c
1259  c = auxMatrix.inverted().map(c);
1260 
1261  // retorne a posicao para ser em relacao ao layout editor
1262  c += m_zdataFrame->pos();
1263 
1264  // centro do zoom em mm
1265  QPointF cf = m_matrixPaperViewToVp.inverted().map(c);
1266 
1267  // area do world
1268  QRectF r = m_zdataFrame->getDataRect();
1269 
1270  // calcule new world data center
1271  double x1 = r.left() + ((cf.x() - fr.left()) / fr.width()) * r.width();
1272  double y1 = r.top() + ((cf.y() - fr.top()) / fr.height()) * r.height();
1273 
1274  // calcule novo world data rect
1275  double w = r.width() / zoomFat;
1276  double h = r.height() / zoomFat;
1277  QRectF nr(0, 0, w, h);
1278  nr.moveCenter(QPointF(x1, y1));
1279 
1280  m_zdataFrame->setDataRect(nr);
1281  if(m_zdataFrame->getGraphicScaleFrame())
1282  {
1283  double step = m_zdataFrame->getGraphicScaleFrame()->getStep();
1284  step /= zoomFat;
1285  m_zdataFrame->getGraphicScaleFrame()->findNiceStep(step);
1286  }
1287  createWorkingArea(false);
1288  draw();
1289  }
1290  m_zrect = QRect();
1291  drawRectArea();
1292  }
1293  else if(m_zmouseMode == 2) // zoom out (data frame)
1294  {
1295  insertCopy2Undo(m_zdataFrame);
1296 
1297  // posicao em relacao ao layout editor
1298  QPointF c(m_zpressPoint.x(), m_zpressPoint.y());
1299 
1300  // mova para ser em relacao ao frame
1301  c -= m_zdataFrame->pos();
1302 
1303  // faca a correcao da declinacao magnetica para c
1304  c = auxMatrix.inverted().map(c);
1305 
1306  // retorne a posicao para ser em relacao ao layout editor
1307  c += m_zdataFrame->pos();
1308 
1309  // centro do zoom em mm
1310  QPointF cf = m_matrixPaperViewToVp.inverted().map(c);
1311 
1312  // area do world
1313  QRectF r = m_zdataFrame->getDataRect();
1314 
1315  // calcule new world data center
1316  double x1 = r.left() + ((cf.x() - fr.left()) / fr.width()) * r.width();
1317  double y1 = r.top() + ((cf.y() - fr.top()) / fr.height()) * r.height();
1318 
1319  // calcule novo world data rect
1320  double w = r.width() * zoomFat;
1321  double h = r.height() * zoomFat;
1322  QRectF nr(0, 0, w, h);
1323  nr.moveCenter(QPointF(x1, y1));
1324 
1325  m_zdataFrame->setDataRect(nr);
1326  if(m_zdataFrame->getGraphicScaleFrame())
1327  {
1328  double step = m_zdataFrame->getGraphicScaleFrame()->getStep();
1329  step *= zoomFat;
1330  m_zdataFrame->getGraphicScaleFrame()->findNiceStep(step);
1331  }
1332  createWorkingArea(false);
1333  draw();
1334  }
1335  else if(m_zmouseMode == 3) // pan (data frame)
1336  {
1337  insertCopy2Undo(m_zdataFrame);
1338 
1339  m_zpanEnd = true;
1340  QPointF pfrom(m_zpressPoint.x(), m_zpressPoint.y());
1341  QPointF pto(e->pos().x(), e->pos().y());
1342 
1343  // faca a correcao da declinacao magnetica para pfrom e pto
1344  pfrom = auxMatrix.inverted().map(pfrom);
1345  pto = auxMatrix.inverted().map(pto);
1346 
1347  // converta pfrom e pto para mm
1348  pfrom = m_matrixPaperViewToVp.inverted().map(pfrom);
1349  pto = m_matrixPaperViewToVp.inverted().map(pto);
1350 
1351  // calcule o deslocamento
1352  QPointF dif = pto - pfrom;
1353 
1354  QPointF fc = fr.center();
1355 
1356  // new center do frame em mm
1357  fc -= dif;
1358 
1359  // calcule new world rect
1360  // old world rect
1361  QRectF r = m_zdataFrame->getDataRect();
1362  double x1 = r.left() + ((fc.x() - fr.left()) / fr.width()) * r.width();
1363  double y1 = r.top() + ((fc.y() - fr.top()) / fr.height()) * r.height();
1364 
1365  // new world rect
1366  r.moveCenter(QPointF(x1, y1));
1367 
1368  m_zdataFrame->setDataRect(r);
1369  draw();
1370  }
1371  }
1372  }
1373  m_zdataFrame = 0;
1374 }
1375 
1377 {
1378  QPixmap* pixmap = getDraftPixmap();
1379  pixmap->fill(QColor(0, 0, 0, 0));
1380 
1381  if(m_zrect.isValid())
1382  {
1383  QPainter painter(pixmap);
1384  if(m_zdataFrame)
1385  {
1386  painter.setPen(Qt::red);
1387  painter.setBrush(QColor(255, 0, 0, 80));
1388  }
1389  else
1390  {
1391  painter.setPen(Qt::blue);
1392  painter.setBrush(QColor(0, 0, 255, 80));
1393  }
1394  painter.drawRect(m_zrect);
1395  }
1396  update();
1397 }
1398 
1400 {
1401  m_zmouseMode = m;
1402 
1403  if(m_zmouseMode == 0)
1404  sendEventToChildren(true);
1405  else
1406  sendEventToChildren(false);
1407 
1408  QDir dir;
1409  if(dir.exists("../../../terralib5/resources/themes/terralib/32x32/zoomInCursor.png"))
1410  if(m_zoomInPixmap == 0)
1411  m_zoomInPixmap = new QPixmap("../../../terralib5/resources/themes/terralib/32x32/zoomInCursor.png");
1412 
1413  if(dir.exists("../../../terralib5/resources/themes/terralib/32x32/zoomOutCursor.png"))
1414  if(m_zoomOutPixmap == 0)
1415  m_zoomOutPixmap = new QPixmap("../../../terralib5/resources/themes/terralib/32x32/zoomOutCursor.png");
1416 
1417  //if(dir.exists("../../../terralib5/resources/themes/terralib/48x48/panCursor.png"))
1418  // if(m_panPixmap == 0)
1419  // m_panPixmap = new QPixmap("../../../terralib5/resources/themes/terralib/48x48/panCursor.png");
1420 
1421 
1422  QCursor* cursor = 0;
1423 
1424  if(m_zmouseMode == 0)
1425  cursor = new QCursor(Qt::ArrowCursor);
1426  else if(m_zmouseMode == 1)
1427  {
1428  if(m_zoomInPixmap)
1429  cursor = new QCursor(*m_zoomInPixmap, 9, 9);
1430  else
1431  cursor = new QCursor(Qt::PointingHandCursor);
1432  }
1433  else if(m_zmouseMode == 2)
1434  {
1435  if(m_zoomOutPixmap)
1436  cursor = new QCursor(*m_zoomOutPixmap, 9, 9);
1437  else
1438  cursor = new QCursor(Qt::SizeAllCursor);
1439  }
1440  else if(m_zmouseMode == 3)
1441  {
1442  //if(m_panPixmap)
1443  // cursor = new QCursor(*m_panPixmap, 24, 24);
1444  //else
1445  // cursor = new QCursor(Qt::OpenHandCursor);
1446  cursor = new QCursor(Qt::OpenHandCursor);
1447  }
1448 
1449  unsetCursor();
1450  setCursor(*cursor);
1451  delete cursor;
1452 }
1453 
1454 void te::qt::widgets::LayoutEditor::adjustAspectRatio(QRectF& r, const QRectF& ref)
1455 {
1456  double llx = r.left();
1457  double lly = r.top();
1458  double urx = r.right();
1459  double ury = r.bottom();
1460  double ww = r.width();
1461  double wh = r.height();
1462 
1463  double widthByHeight = ref.width() / ref.height();
1464 
1465  if(widthByHeight > ww / wh)
1466  {
1467  double v = ww;
1468 
1469  ww = wh * widthByHeight;
1470  llx = llx - (ww - v) / 2.0;
1471  urx = llx + ww;
1472  }
1473  else
1474  {
1475  double v = wh;
1476 
1477  wh = ww / widthByHeight;
1478  lly = lly - (wh - v) / 2.0;
1479  ury = lly + wh;
1480  }
1481 
1482  r = QRectF(llx, lly, urx-llx, ury-lly);
1483 }
1484 
1486 {
1487  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
1488  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
1489  (*it)->hide();
1490 }
1491 
1493 {
1494  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
1495  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
1496  (*it)->show();
1497 }
1498 
1500 {
1501  int i = m_zmouseMode;
1502  int d = e->delta();
1503  if(d > 0)
1504  i++;
1505  else
1506  i--;
1507 
1508  if(i > 3)
1509  i = 0;
1510  else if(i < 0)
1511  i = 3;
1512  setMouseMode(i);
1513 }
1514 
1516 {
1517  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
1518  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
1519  (*it)->sendEventToChildren(b);
1520 
1521  for(it = m_undoLayoutObjects.begin(); it != m_undoLayoutObjects.end(); ++it)
1522  (*it)->sendEventToChildren(b);
1523 
1524  if(b == false)
1525  {
1526  setFrameSelected(0);
1527  while(QApplication::overrideCursor())
1528  QApplication::restoreOverrideCursor();
1529 
1530  raiseDraftLayoutEditor();
1531  m_draftLayoutEditor->installEventFilter(this);
1532  }
1533  else
1534  {
1535  lowerDraftLayoutEditor();
1536  m_draftLayoutEditor->removeEventFilter(this);
1537  }
1538 }
1539 
1540 bool te::qt::widgets::LayoutEditor::eventFilter(QObject* obj, QEvent* e)
1541 {
1542  if(e->type() == QEvent::Paint)
1543  return false;
1544 
1545 
1546  if(obj == m_draftLayoutEditor)
1547  {
1548  if(e->type() == QEvent::DragEnter)
1549  {
1550  QDragEnterEvent* dragEnterEvent = (QDragEnterEvent*)e;
1551  const QMimeData* mime = dragEnterEvent->mimeData();
1552  QString s = mime->data("application/x-terralib;value=\"DraggedItems\"").constData();
1553  if(s.isEmpty() == false)
1554  {
1555  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
1556  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
1557  {
1558  if((*it)->windowTitle() == "DataFrame")
1559  {
1560  (*it)->sendEventToChildren(true);
1561  (*it)->raise();
1562  }
1563  }
1564  return false;
1565  }
1566  }
1567  else if(e->type() == QEvent::DragMove)
1568  return false;
1569  else if(e->type() == QEvent::Drop)
1570  return false;
1571  else if(e->type() == QEvent::Resize)
1572  return false;
1573  else
1574  m_draftLayoutEditor->raise();
1575 
1576  if(e->type() == QEvent::MouseButtonPress)
1577  mousePressEvent((QMouseEvent*)e);
1578  else if(e->type() == QEvent::MouseMove)
1579  mouseMoveEvent((QMouseEvent*)e);
1580  else if(e->type() == QEvent::MouseButtonRelease)
1581  mouseReleaseEvent((QMouseEvent*)e);
1582  else if(e->type() == QEvent::Wheel)
1583  wheelEvent((QWheelEvent*)e);
1584  }
1585 
1586  return true;
1587 }
1588 
1590 {
1591  m_difTopLeft = QPointF(0., 0.);
1592  m_difBottomRight = QPointF(0., 0.);
1593 
1594  int k = e->key();
1595  int modifier = e->modifiers();
1596  QString text = e->text();
1597 
1598  switch(e->key())
1599  {
1600  case Qt::Key_Minus: // ZOOM OUT
1601  {
1602  if(m_layoutObjectSelected)
1603  {
1604  double scale = m_layoutObjectSelected->getScale() * 1.2;
1605  m_layoutObjectSelected->setScale(scale);
1606  draw();
1607  }
1608  else
1609  {
1610  double w = m_paperViewRect.width() * 1.2;
1611  double h = m_paperViewRect.height() * 1.2;
1612  QPointF c = m_paperViewRect.center();
1613  m_paperViewRect.setWidth(w);
1614  m_paperViewRect.setHeight(h);
1615  m_paperViewRect.moveCenter(c);
1616  createWorkingArea();
1617  draw();
1618  }
1619  }
1620  break;
1621  case Qt::Key_Plus: // ZOOM IN
1622  {
1623  if(m_layoutObjectSelected)
1624  {
1625  double scale = m_layoutObjectSelected->getScale() / 1.2;
1626  m_layoutObjectSelected->setScale(scale);
1627  draw();
1628  }
1629  else
1630  {
1631  double w = m_paperViewRect.width() / 1.2;
1632  double h = m_paperViewRect.height() / 1.2;
1633  QPointF c = m_paperViewRect.center();
1634  m_paperViewRect.setWidth(w);
1635  m_paperViewRect.setHeight(h);
1636  m_paperViewRect.moveCenter(c);
1637  createWorkingArea();
1638  draw();
1639  }
1640  }
1641  break;
1642  case Qt::Key_Slash: // ZOOM OUT
1643  {
1644  if(m_layoutObjectSelected)
1645  {
1646  double scale = m_layoutObjectSelected->getScale() * 2;
1647  m_layoutObjectSelected->setScale(scale);
1648  draw();
1649  }
1650  else
1651  {
1652  double w = m_paperViewRect.width() * 2;
1653  double h = m_paperViewRect.height() * 2;
1654  QPointF c = m_paperViewRect.center();
1655  m_paperViewRect.setWidth(w);
1656  m_paperViewRect.setHeight(h);
1657  m_paperViewRect.moveCenter(c);
1658  createWorkingArea();
1659  draw();
1660  }
1661  }
1662  break;
1663  case Qt::Key_Asterisk: // ZOOM IN
1664  {
1665  if(m_layoutObjectSelected)
1666  {
1667  double scale = m_layoutObjectSelected->getScale() / 2;
1668  m_layoutObjectSelected->setScale(scale);
1669  draw();
1670  }
1671  else
1672  {
1673  double w = m_paperViewRect.width() / 2;
1674  double h = m_paperViewRect.height() / 2;
1675  QPointF c = m_paperViewRect.center();
1676  m_paperViewRect.setWidth(w);
1677  m_paperViewRect.setHeight(h);
1678  m_paperViewRect.moveCenter(c);
1679  createWorkingArea();
1680  draw();
1681  }
1682  }
1683  break;
1684  case Qt::Key_F1: // ALL RULLER GRID
1685  {
1686  if(m_rulerGridLines != 1 || m_showRulerGrid == false)
1687  {
1689  m_undoLayoutObjects.push_back(f);
1690 
1691  m_rulerGridLines = 1;
1692  createRulerGrid();
1693  m_showRulerGrid = false;
1694  showRulerGrid();
1695  copyState();
1696  }
1697  }
1698  break;
1699  case Qt::Key_F2: // PARCIAL RULLER GRID
1700  {
1701  if(m_rulerGridLines != 2 || m_showRulerGrid == false)
1702  {
1704  m_undoLayoutObjects.push_back(f);
1705 
1706  m_rulerGridLines = 2;
1707  createRulerGrid();
1708  m_showRulerGrid = false;
1709  showRulerGrid();
1710  copyState();
1711  }
1712  }
1713  break;
1714  case Qt::Key_F3: // PARCIAL RULLER GFRID
1715  {
1716  if(m_rulerGridLines != 3 || m_showRulerGrid == false)
1717  {
1719  m_undoLayoutObjects.push_back(f);
1720 
1721  m_rulerGridLines = 3;
1722  createRulerGrid();
1723  m_showRulerGrid = false;
1724  showRulerGrid();
1725  copyState();
1726  }
1727  }
1728  break;
1729  case Qt::Key_F4: // NO RULLER GRID
1730  {
1731  if(m_showRulerGrid == true)
1732  {
1734  m_undoLayoutObjects.push_back(f);
1735 
1736  hideRulerGrid();
1737  copyState();
1738  }
1739  }
1740  break;
1741  case Qt::Key_Left: // ALIGN LEFT or PAN
1742  {
1743  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1744  {
1745  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1746  if(f->getAlign() != Qt::AlignLeft)
1747  {
1748  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1749  f->setAlign(Qt::AlignLeft);
1750  f->adjust();
1751  f->showSelectionPoints();
1752  f->toolTip(f->getGlobalPositionCenter(), "Align");
1753  insertCopy2Undo(f);
1754  }
1755  }
1756  else if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "DataFrame")
1757  {
1758  te::qt::widgets::DataFrame* f = (te::qt::widgets::DataFrame*)m_layoutObjectSelected;
1759  QRectF r = f->getDataRect();
1760  double w = r.width();
1761  r = QRectF(r.left() - w / 5, r.top(), w, r.height());
1762  f->setDataRect(r);
1763  draw();
1764  }
1765  else
1766  {
1767  double w = m_paperViewRect.width();
1768  m_paperViewRect = QRectF(m_paperViewRect.left() - w / 5, m_paperViewRect.top(), w, m_paperViewRect.height());
1769  createWorkingArea();
1770  draw();
1771  }
1772  }
1773  break;
1774  case Qt::Key_Right: // ALIGN RIGHT or PAN
1775  {
1776  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1777  {
1778  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1779  if(f->getAlign() != Qt::AlignRight)
1780  {
1781  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1782  f->setAlign(Qt::AlignRight);
1783  f->adjust();
1784  f->showSelectionPoints();
1785  f->toolTip(f->getGlobalPositionCenter(), "Align");
1786  insertCopy2Undo(f);
1787  }
1788  }
1789  else if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "DataFrame")
1790  {
1791  te::qt::widgets::DataFrame* f = (te::qt::widgets::DataFrame*)m_layoutObjectSelected;
1792  QRectF r = f->getDataRect();
1793  double w = r.width();
1794  r = QRectF(r.left() + w / 5, r.top(), w, r.height());
1795  f->setDataRect(r);
1796  draw();
1797  }
1798  else
1799  {
1800  double w = m_paperViewRect.width();
1801  m_paperViewRect = QRectF(m_paperViewRect.left() + w / 5, m_paperViewRect.top(), w, m_paperViewRect.height());
1802  createWorkingArea();
1803  draw();
1804  }
1805  }
1806  break;
1807  case Qt::Key_Up: // ALIGN CENTER or PAN
1808  {
1809  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1810  {
1811  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1812  if(f->getAlign() != Qt::AlignHCenter)
1813  {
1814  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1815  f->setAlign(Qt::AlignHCenter);
1816  f->adjust();
1817  f->showSelectionPoints();
1818  f->toolTip(f->getGlobalPositionCenter(), "Align");
1819  insertCopy2Undo(f);
1820  }
1821  }
1822  else if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "DataFrame")
1823  {
1824  te::qt::widgets::DataFrame* f = (te::qt::widgets::DataFrame*)m_layoutObjectSelected;
1825  QRectF r = f->getDataRect();
1826  double h = r.height();
1827  r = QRectF(r.left(), r.top() + h / 5, r.width(), h);
1828  f->setDataRect(r);
1829  draw();
1830  }
1831  else
1832  {
1833  double h = m_paperViewRect.height();
1834  m_paperViewRect = QRectF(m_paperViewRect.left(), m_paperViewRect.top() + h/5, m_paperViewRect.width(), h);
1835  createWorkingArea();
1836  draw();
1837  }
1838  }
1839  break;
1840  case Qt::Key_Down: // ALIGN CENTER or PAN
1841  {
1842  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1843  {
1844  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1845  if(f->getAlign() != Qt::AlignHCenter)
1846  {
1847  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1848  f->setAlign(Qt::AlignHCenter);
1849  f->adjust();
1850  f->showSelectionPoints();
1851  f->toolTip(f->getGlobalPositionCenter(), "Align");
1852  insertCopy2Undo(f);
1853  }
1854  }
1855  else if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "DataFrame")
1856  {
1857  te::qt::widgets::DataFrame* f = (te::qt::widgets::DataFrame*)m_layoutObjectSelected;
1858  QRectF r = f->getDataRect();
1859  double h = r.height();
1860  r = QRectF(r.left(), r.top() - h / 5, r.width(), h);
1861  f->setDataRect(r);
1862  draw();
1863  }
1864  else
1865  {
1866  double h = m_paperViewRect.height();
1867  m_paperViewRect = QRectF(m_paperViewRect.left(), m_paperViewRect.top() - h/5, m_paperViewRect.width(), h);
1868  createWorkingArea();
1869  draw();
1870  }
1871  }
1872  break;
1873  case Qt::Key_W: // WEIGHT
1874  {
1875  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1876  {
1877  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1878  QFont::Weight weight = f->getWeight();
1879  if(modifier == Qt::NoModifier)
1880  {
1881  if(weight == QFont::Light)
1882  weight = QFont::Normal;
1883  else if(weight == QFont::Normal)
1884  weight = QFont::DemiBold;
1885  else if(weight == QFont::DemiBold)
1886  weight = QFont::Bold;
1887  else if(weight == QFont::Bold)
1888  weight = QFont::Black;
1889  else
1890  weight = QFont::Light;
1891  }
1892  else
1893  {
1894  if(weight == QFont::Light)
1895  weight = QFont::Black;
1896  else if(weight == QFont::Black)
1897  weight = QFont::Bold;
1898  else if(weight == QFont::Bold)
1899  weight = QFont::DemiBold;
1900  else if(weight == QFont::DemiBold)
1901  weight = QFont::Normal;
1902  else
1903  weight = QFont::Light;
1904  }
1905 
1906  f->setWeight(weight);
1907  f->adjust();
1908  f->showSelectionPoints();
1909  f->toolTip(f->getGlobalPositionCenter(), "Weight");
1910  insertCopy2Undo(f);
1911  }
1912  }
1913  break;
1914  case Qt::Key_C: // CAPITALIZATION
1915  {
1916  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1917  {
1918  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1919  QFont::Capitalization cap = f->getCapitalization();
1920  if(cap == QFont::MixedCase)
1921  cap = QFont::AllUppercase;
1922  else if(cap == QFont::AllUppercase)
1923  cap = QFont::AllLowercase;
1924  else if(cap == QFont::AllLowercase)
1925  cap = QFont::SmallCaps;
1926  else if(cap == QFont::SmallCaps)
1927  cap = QFont::Capitalize;
1928  else
1929  cap = QFont::MixedCase;
1930 
1931  f->setCapitalization(cap);
1932  f->adjust();
1933  f->showSelectionPoints();
1934  f->toolTip(f->getGlobalPositionCenter(), "Capitalization");
1935  insertCopy2Undo(f);
1936  }
1937  }
1938  break;
1939  case Qt::Key_O: // OVERLINE
1940  {
1941  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1942  {
1943  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1944  if(f->getOverline())
1945  f->setOverline(false);
1946  else
1947  f->setOverline(true);
1948 
1949  f->adjust();
1950  f->showSelectionPoints();
1951  f->toolTip(f->getGlobalPositionCenter(), "Overline");
1952  insertCopy2Undo(f);
1953  }
1954  }
1955  break;
1956  case Qt::Key_U: // UNDERLINE
1957  {
1958  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1959  {
1960  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1961  if(f->getUnderline())
1962  f->setUnderline(false);
1963  else
1964  f->setUnderline(true);
1965 
1966  f->adjust();
1967  f->showSelectionPoints();
1968  f->toolTip(f->getGlobalPositionCenter(), "Underline");
1969  insertCopy2Undo(f);
1970  }
1971  }
1972  break;
1973  case Qt::Key_K: // STRIKE OUT
1974  {
1975  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1976  {
1977  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1978  if(f->getStrikeOut())
1979  f->setStrikeOut(false);
1980  else
1981  f->setStrikeOut(true);
1982 
1983  f->adjust();
1984  f->showSelectionPoints();
1985  f->toolTip(f->getGlobalPositionCenter(), "StrikeOut");
1986  insertCopy2Undo(f);
1987  }
1988  }
1989  break;
1990  case Qt::Key_S: // FONT STYLE
1991  {
1992  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
1993  {
1994  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
1995  QFont::Style style = f->getStyle();
1996  if(style == QFont::StyleNormal)
1997  style = QFont::StyleItalic;
1998  else if(style == QFont::StyleItalic)
1999  style = QFont::StyleOblique;
2000  else
2001  style = QFont::StyleNormal;
2002 
2003  f->setStyle(style);
2004  f->adjust();
2005  f->showSelectionPoints();
2006  f->toolTip(f->getGlobalPositionCenter(), "Style");
2007  insertCopy2Undo(f);
2008  }
2009  }
2010  break;
2011  case Qt::Key_Space: // LETTER SPACING
2012  {
2013  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
2014  {
2015  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
2016  double letterSpacing = f->getLetterSpacing();
2017  if(modifier == Qt::NoModifier)
2018  letterSpacing = letterSpacing * 1.1;
2019  else
2020  letterSpacing = letterSpacing / 1.1;
2021 
2022  f->setLetterSpacing(letterSpacing);
2023  f->adjust();
2024  f->showSelectionPoints();
2025  f->toolTip(f->getGlobalPositionCenter(), "LetterSpacing");
2026  insertCopy2Undo(f);
2027  }
2028  }
2029  break;
2030  case Qt::Key_L: // WORD SPACING
2031  {
2032  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
2033  {
2034  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
2035  double wordSpacing = f->getWordSpacing();
2036  if(modifier == Qt::NoModifier)
2037  wordSpacing += 1;
2038  else
2039  wordSpacing -= 1;
2040 
2041  f->setWordSpacing(wordSpacing);
2042  f->adjust();
2043  f->showSelectionPoints();
2044  f->toolTip(f->getGlobalPositionCenter(), "WordSpacing");
2045  insertCopy2Undo(f);
2046  }
2047  }
2048  break;
2049  case Qt::Key_T:
2050  {
2051  if(modifier == Qt::AltModifier)
2052  {
2053  if(m_layoutObjectSelected)
2054  {
2055  if(m_layoutObjectSelected->windowTitle() == "TextFrame") // change text string
2056  {
2057  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
2058  QString s = f->getText();
2059  bool ok;
2060  QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"),
2061  tr("Change Text:"), QLineEdit::Normal,
2062  s, &ok);
2063  if(ok && !text.isEmpty())
2064  {
2065  f->setText(text);
2066  f->adjust();
2067  f->showSelectionPoints();
2068  }
2069 
2070  insertCopy2Undo(f);
2071  draw();
2072  }
2073  if(m_layoutObjectSelected->windowTitle() == "DataFrame") // change geographical data
2074  {
2075  QMessageBox::information(this, "Change Geographical Data", "Use drag drop...");
2076  return;
2077  }
2078  }
2079  else // insert Text
2080  {
2081  QPointF c = m_paperViewRect.center();
2082  te::qt::widgets::TextFrame* nf = new te::qt::widgets::TextFrame(c , "new text", 50, this, Qt::Widget);
2083  nf->setId(m_idCount++); // numero do frame
2084  nf->setNew(true); // para o control Z poder deletar o frame criado
2085  insertCopy2Undo(nf); // esta linha tem que vir antes da insercao do frame no map editor (para preparar o undo).
2086  insert(nf);
2087  nf->adjust();
2088  nf->showSelectionPoints();
2089  m_layoutObjectSelected = nf;
2090  draw();
2091  }
2092  }
2093  }
2094  break;
2095  case Qt::Key_Delete: // DELETE FRAME
2096  {
2097  if(m_layoutObjectSelected)
2098  {
2099  m_layoutObjectSelected->hideSelectionPoints();
2100  remove(m_layoutObjectSelected);
2101  insertCopy2Undo(m_layoutObjectSelected);
2102  m_layoutObjectSelected->hide();
2103  delete m_layoutObjectSelected;
2104  m_layoutObjectSelected = 0;
2105  te::qt::widgets::LayoutObject* f = m_undoLayoutObjects[m_undoLayoutObjects.size()-1];
2106  f->hideSelectionPoints();
2107  f->hide();
2108  setFrameSelected(0);
2109  update();
2110  }
2111  }
2112  break;
2113  case Qt::Key_Z: // UNDO
2114  {
2115  if(modifier == Qt::ControlModifier)
2116  {
2117  m_layoutObjectSelected = 0;
2118  while(QApplication::overrideCursor())
2119  QApplication::restoreOverrideCursor();
2120 
2121  te::qt::widgets::LayoutObject* undof = 0;
2122  std::vector<te::qt::widgets::LayoutObject*>::reverse_iterator it = m_undoLayoutObjects.rbegin();
2123  if(it == m_undoLayoutObjects.rend())
2124  {
2125  QMessageBox::information(this, "Undo", "Undo Buffer is Empty");
2126  return;
2127  }
2128  getDraftPixmap()->fill(Qt::transparent);
2129 
2130  undof = *it;
2131  if(undof->getId() != 0)
2132  {
2133  te::qt::widgets::LayoutObject* f = find(undof->getId()); // busca o frame no vetor de layoutObject
2134  if(f) // recuperando frame editado
2135  {
2136  if(undof->isNew()) // este frame foi criado por edicao - remova da lista de frames
2137  {
2138  remove(f);
2139  delete f;
2140  removeUndo(undof); // remove do buffer de undo
2141  delete undof;
2142  undof = 0;
2143  }
2144  else
2145  {
2146  // troque o frame pelo frame do undo
2147  remove(f); // remove frame do vetor de layoutObject
2148  removeUndo(undof); // remove do buffer de undo
2149  delete f;
2150  insert(undof); // faca a troca
2151  }
2152  }
2153  // se o frame nao existe � porque ele foi deletado.
2154  else // recuperando frame deletado
2155  {
2156  removeUndo(undof);
2157  insert(undof);
2158  }
2159 
2160  if(undof)
2161  {
2162  if(undof->windowTitle() == "DataFrame")
2163  {
2165  te::map::AbstractLayerPtr data(df->getData());
2166  QRectF dr = df->getDataRect();
2167  df->setData(0, df->getMapDisplay()->getSRID(), df->getDataRect());
2168  df->setData(data, df->getMapDisplay()->getSRID(), df->getDataRect());
2169  df->draw();
2170  }
2171  undof->show();
2172  undof->raise();
2173  undof->adjust();
2174  }
2175  update();
2176  }
2177  // id = 0 significa alteracao no state do map editor. Recupere o state anterior.
2178  else // working area is changed
2179  {
2181  m_paperViewRect = ei->m_paperViewRect;
2182  m_paperSize = ei->m_paperSize;
2183  m_rulerGridLines = ei->m_rulerGridLines;
2184  QRect r = ei->m_rect;
2185  m_putUndo = false;
2186  if(r.topLeft() != pos())
2187  move(r.topLeft());
2188  if(r.size() != rect().size())
2189  resize(r.width(), r.height());
2190  else
2191  createWorkingArea(false);
2192  m_putUndo = true;
2193 
2194  if(ei->m_showRulerGrid)
2195  {
2196  m_showRulerGrid = false;
2197  showRulerGrid();
2198  }
2199  else
2200  draw();
2201  removeUndo(undof);
2202  delete undof;
2203  copyState();
2204  }
2205  }
2206  }
2207  break;
2208  case Qt::Key_V: // COPY FRAME
2209  {
2210  if(modifier == Qt::ControlModifier)
2211  {
2212  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "TextFrame")
2213  {
2214  te::qt::widgets::TextFrame* f = (te::qt::widgets::TextFrame*)m_layoutObjectSelected;
2216  nf->setId(m_idCount++); // numero do frame
2217  nf->setNew(true); // para o control Z poder deletar o frame criado
2218  insertCopy2Undo(nf); // esta linha tem que vir antes da insercao do frame no map editor (para preparar o undo).
2219  insert(nf);
2220  nf->adjust();
2221  nf->showSelectionPoints();
2222  m_layoutObjectSelected = nf;
2223  update();
2224  }
2225  else if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "DataFrame")
2226  {
2227  te::qt::widgets::DataFrame* f = (te::qt::widgets::DataFrame*)m_layoutObjectSelected;
2229  nf->setId(m_idCount++); // numero do frame
2230  nf->setNew(true); // para o control Z poder deletar o frame criado
2231  insertCopy2Undo(nf); // esta linha tem que vir antes da insercao do frame no map editor (para preparar o undo).
2232  insert(nf);
2233  nf->adjust();
2234  nf->showSelectionPoints();
2235  m_layoutObjectSelected = nf;
2236  nf->getMapDisplay()->refresh();
2237  update();
2238  }
2239  }
2240  }
2241  break;
2242  case Qt::Key_R: // REMOVE MAP DISPLAY EVENT FILTER
2243  sendEventToChildren(false);
2244  break;
2245  case Qt::Key_I: // INSERT MAP DISPLAY EVENT FILTER
2246  sendEventToChildren(true);
2247  break;
2248 
2249  case Qt::Key_P: // CHANGE PROJECTION
2250  if(m_layoutObjectSelected && m_layoutObjectSelected->windowTitle() == "DataFrame")
2251  {
2252  te::qt::widgets::DataFrame* f = (te::qt::widgets::DataFrame*)m_layoutObjectSelected;
2253  if(f->getMapDisplay()->getSRID() == 3031)
2254  f->getMapDisplay()->setSRID(f->getData()->getSRID());
2255  else
2256  f->getMapDisplay()->setSRID(3031); // TE_SRS_WGS84_ANTARTIC_POLAR_STEREOGRAPHIC
2257  draw();
2258  }
2259  break;
2260 
2261  case Qt::Key_F: // CHANGE PAPER FORMAT (PORTRAIT / LANDSCAPE)
2262  {
2263  copyState();
2264  //m_paperViewRect = QRectF();
2265  setPaperSize(QSize(m_paperSize.height(), m_paperSize.width()));
2266  }
2267  break;
2268 
2269  case Qt::Key_A: // FIT PAPER
2270  {
2271  copyState();
2272  resetPaperView();
2273  setPaperSize(m_paperSize);
2274  }
2275  break;
2276 
2277  case Qt::Key_0: // A0
2278  {
2279  if(m_paperSize.width() > m_paperSize.height())
2280  m_paperSize = QSize(1189, 841);
2281  else
2282  m_paperSize = QSize(841, 1189);
2283  setPaperSize(m_paperSize);
2284  copyState();
2285  }
2286  break;
2287 
2288  case Qt::Key_1: // A1
2289  {
2290  if(m_paperSize.width() > m_paperSize.height())
2291  m_paperSize = QSize(841, 594);
2292  else
2293  m_paperSize = QSize(594, 841);
2294  setPaperSize(m_paperSize);
2295  copyState();
2296  }
2297  break;
2298 
2299  case Qt::Key_2: // A2
2300  {
2301  if(m_paperSize.width() > m_paperSize.height())
2302  m_paperSize = QSize(594, 420);
2303  else
2304  m_paperSize = QSize(420, 594);
2305  setPaperSize(m_paperSize);
2306  copyState();
2307  }
2308  break;
2309 
2310  case Qt::Key_3: // A3
2311  {
2312  if(m_paperSize.width() > m_paperSize.height())
2313  m_paperSize = QSize(420, 297);
2314  else
2315  m_paperSize = QSize(297, 420);
2316  setPaperSize(m_paperSize);
2317  copyState();
2318  }
2319  break;
2320 
2321  case Qt::Key_4: // A4
2322  {
2323  if(m_paperSize.width() > m_paperSize.height())
2324  m_paperSize = QSize(297, 210);
2325  else
2326  m_paperSize = QSize(210, 297);
2327  setPaperSize(m_paperSize);
2328  copyState();
2329  }
2330  break;
2331 
2332  default:
2333  break;
2334  }
2335 }
2336 
2338 {
2339  return m_matrixPaperViewToVp;
2340 }
2341 
2343 {
2344  return m_matrix;
2345 }
2346 
2348 {
2349  if(m_layoutObjectSelected)
2350  m_layoutObjectSelected->hideSelectionPoints();
2351 
2352  m_layoutObjectSelected = f;
2353  if(m_layoutObjectSelected)
2354  m_layoutObjectSelected->showSelectionPoints();
2355 }
2356 
2358 {
2359  return m_layoutObjectSelected;
2360 }
2361 
2362 //void te::qt::widgets::LayoutEditor::setDataFrameSelected(te::qt::widgets::DataFrame* df)
2363 //{
2364 // if(m_dataFrameSelected)
2365 // m_dataFrameSelected->hideSelectionPoints();
2366 //
2367 // m_dataFrameSelected = df;
2368 // if(m_dataFrameSelected)
2369 // m_dataFrameSelected->showSelectionPoints();
2370 //}
2371 //
2372 //te::qt::widgets::DataFrame* te::qt::widgets::LayoutEditor::getDataFrameSelected()
2373 //{
2374 // return m_dataFrameSelected;
2375 //}
2376 //
2377 //void te::qt::widgets::LayoutEditor::setTextFrameSelected(te::qt::widgets::TextFrame* tf)
2378 //{
2379 // if(m_textFrameSelected)
2380 // m_textFrameSelected->hideSelectionPoints();
2381 //
2382 // m_textFrameSelected = tf;
2383 // if(m_textFrameSelected)
2384 // m_textFrameSelected->showSelectionPoints();
2385 //}
2386 //
2387 //te::qt::widgets::TextFrame* te::qt::widgets::LayoutEditor::getTextFrameSelected()
2388 //{
2389 // return m_textFrameSelected;
2390 //}
2391 
2393 {
2394  return m_auxWidget;
2395 }
2396 
2398 {
2399  return m_draftLayoutEditor->getDraftPixmap();
2400 }
2401 
2403 {
2404  m_draftLayoutEditor->raise();
2405  m_draftLayoutEditor->getDraftPixmap()->fill(Qt::transparent);
2406 }
2407 
2409 {
2410  m_draftLayoutEditor->lower();
2411 }
2412 
2414 {
2415  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
2416  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
2417  {
2418  if((*it)->windowTitle() == "DataFrame")
2419  {
2421  QPixmap* pixmap = df->getLastDisplayContent();
2422  QPixmap* content = df->getMapDisplay()->getDisplayPixmap();
2423  content->fill(Qt::transparent);
2424 
2425  QPainter painter(content);
2426  painter.drawPixmap(0, 0, *pixmap);
2427  painter.end();
2428 
2429  if(df->getFrameRect().intersects(m_paperViewRect))
2430  df->drawLayerSelection();
2431  }
2432  }
2433 }
2434 
2436 {
2437  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
2438  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
2439  {
2440  if((*it)->windowTitle() == "DataFrame")
2441  {
2443  df->setSelectionColor(selColor);
2444  }
2445  }
2446 }
2447 
2449 {
2450  std::vector<te::qt::widgets::LayoutObject*>::iterator it;
2451  for(it = m_layoutObjects.begin(); it != m_layoutObjects.end(); ++it)
2452  {
2453  if((*it)->windowTitle() == "DataFrame")
2454  {
2456  df->getMapDisplay()->setBackgroundColor(cor);
2457  }
2458  }
2459 }
void setNew(bool)
Definition: Frame.cpp:103
te::qt::widgets::GraphicScaleFrame * getGraphicScaleFrame()
Definition: DataFrame.cpp:1376
virtual QPixmap * getDisplayPixmap() const
It returns the map display pixmap.
Definition: MapDisplay.cpp:214
void mouseMoveEvent(QMouseEvent *e)
QPixmap * getLastDisplayContent()
Definition: DataFrame.cpp:1267
virtual QPixmap * getPixmap()
void keyPressEvent(QKeyEvent *e)
void remove(te::qt::widgets::LayoutObject *)
QFont::Capitalization getCapitalization()
Definition: TextFrame.cpp:375
mydialect insert("+", new te::da::BinaryOpEncoder("+"))
void moveEvent(QMoveEvent *event)
virtual void setBackgroundColor(const QColor &color)
Sets the map display background color.
Definition: MapDisplay.cpp:325
void setSelectionColor(QColor selColor)
Definition: DataFrame.cpp:1287
QFont::Weight getWeight()
Definition: TextFrame.cpp:364
void setDataRect(QRectF &r)
Definition: DataFrame.cpp:269
te::map::AbstractLayer * getData()
Definition: DataFrame.cpp:381
bool eventFilter(QObject *, QEvent *)
void paintEvent(QPaintEvent *event)
QRectF getFrameRect()
Definition: Frame.cpp:116
void setWeight(QFont::Weight)
Definition: TextFrame.cpp:369
A TextFrame ....
Definition: TextFrame.h:56
void insert(te::qt::widgets::LayoutObject *)
void mousePressEvent(QMouseEvent *e)
void createWorkingArea(bool undo=true)
virtual int getSRID() const
It return the Spatial Reference System used by the Map Display.
Definition: MapDisplay.cpp:73
te::qt::widgets::LayoutObject * find(unsigned int)
void setPaperSize(const QSize &size)
void setSelectionColor(QColor selColor)
te::qt::widgets::UTMGridFrame * getUTMGridFrame()
Definition: DataFrame.cpp:1371
A DataFrame ....
Definition: DataFrame.h:59
te::qt::widgets::LayoutObject * getFrameSelected()
void removeUndo(te::qt::widgets::LayoutObject *)
void pan(const QPointF &p)
virtual void showSelectionPoints()
void wheelEvent(QWheelEvent *e)
void adjustAspectRatio(QRectF &r, const QRectF &ref)
void setLetterSpacing(double)
Definition: TextFrame.cpp:424
virtual void setSRID(const int &srid, bool doRefresh=true)
It sets a new Spatial Reference System to be used by the Map Display.
Definition: MapDisplay.cpp:78
void refresh()
It updates the contents in the map display.
void setStyle(QFont::Style)
Definition: TextFrame.cpp:358
void setUndoBufferSize(const int &size)
void insertCopy2Undo(te::qt::widgets::LayoutObject *)
void setFrameSelected(te::qt::widgets::LayoutObject *)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void mouseReleaseEvent(QMouseEvent *e)
void setCapitalization(QFont::Capitalization)
Definition: TextFrame.cpp:380
virtual int getSRID() const
It returns the Spatial Reference System ID associated to the Layer.
void toolTip(const QPoint &, const QString &)
Definition: TextFrame.cpp:718
DraftLayoutEditor * m_draftLayoutEditor
Definition: LayoutEditor.h:145
LayoutEditor(QWidget *parent=0, Qt::WindowFlags f=Qt::Window)
te::qt::widgets::GeographicGridFrame * getGeoGridFrame()
Definition: DataFrame.cpp:1366
void resizeEvent(QResizeEvent *event)
void setText(const QString &t)
Definition: TextFrame.cpp:194
void setData(te::map::AbstractLayerPtr d, int nsrid=TE_UNKNOWN_SRS, QRectF r=QRectF())
Definition: DataFrame.cpp:415
te::qt::widgets::MultiThreadMapDisplay * getMapDisplay()
Definition: DataFrame.cpp:264