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