]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/InsertTableWidget.C
replace if/else with switch
[lyx.git] / src / frontends / qt4 / InsertTableWidget.C
1 /**\r
2  * \file InsertTableWidget.C\r
3  *\r
4  * This file is part of LyX, the document processor.\r
5  * Licence details can be found in the file COPYING.\r
6  *\r
7  * \author Edwin Leuven\r
8  *\r
9  * Full author contact details are available in file CREDITS.\r
10  */\r
11 \r
12 #include <config.h>\r
13 \r
14 #include "BufferView.h" // needed for lyxfunc\r
15 #include "lyxfunc.h"\r
16 #include "FuncStatus.h"\r
17 #include "funcrequest.h"\r
18 #include "LyXView.h"\r
19 #include "debug.h"\r
20 \r
21 #include "qt_helpers.h"\r
22 \r
23 #include "InsertTableWidget.h"\r
24 #include <QMouseEvent>\r
25 #include <QString>\r
26 #include <QToolTip>\r
27 #include <QPainter>\r
28 #include <QCoreApplication>\r
29 \r
30 \r
31 namespace lyx {\r
32 namespace frontend {\r
33 \r
34 InsertTableWidget::InsertTableWidget(LyXView & lyxView, FuncRequest const & func, QWidget * parent)\r
35         : QWidget(parent, Qt::Popup), colwidth_(20), rowheight_(12), lyxView_(lyxView), func_(func)\r
36 {\r
37         init();\r
38         setMouseTracking(true);\r
39 }\r
40 \r
41 \r
42 void InsertTableWidget::init()\r
43 {\r
44         rows_ = 5;\r
45         cols_ = 5;\r
46         bottom_ = 0;\r
47         right_ = 0;\r
48         underMouse_ = false;\r
49 }\r
50 \r
51 \r
52 void InsertTableWidget::show(bool show)\r
53 {\r
54         if (!show)\r
55                 return;\r
56 \r
57         init();\r
58         resetGeometry();\r
59         setVisible(true);\r
60         emit visible(true);\r
61 }\r
62 \r
63 \r
64 void InsertTableWidget::resetGeometry()\r
65 {\r
66         QPoint p = parentWidget()->mapToGlobal(parentWidget()->geometry().bottomLeft());\r
67         setGeometry(p.x() - parentWidget()->pos().x(), \r
68                                 p.y() - parentWidget()->pos().y(),\r
69                                 cols_ * colwidth_ + 1, rows_ * rowheight_ + 1);\r
70 }\r
71 \r
72 \r
73 void InsertTableWidget::mouseMoveEvent(QMouseEvent * event)\r
74 {\r
75         // do this ourselves because when the mouse leaves the app\r
76         // we get an enter event (ie underMouse() is true)!!\r
77         underMouse_ = geometry().contains(event->globalPos());\r
78         if (!underMouse_)\r
79                 return;\r
80 \r
81         int const r0 = right_;\r
82         int const b0 = bottom_;\r
83         right_ = event->x()/colwidth_ + 1;\r
84         bottom_ = event->y()/rowheight_ + 1;\r
85 \r
86         if (bottom_ == rows_) {\r
87                 ++rows_;\r
88                 resetGeometry();\r
89         }\r
90 \r
91         if (right_ == cols_) {\r
92                 ++cols_;\r
93                 resetGeometry();\r
94         }\r
95 \r
96         if (bottom_ != b0 || right_ != r0)\r
97                 update();\r
98 \r
99         QString status = QString("%1x%2").arg(bottom_).arg(right_);\r
100         QToolTip::showText(event->globalPos(), status , this); \r
101 }\r
102 \r
103 \r
104 bool InsertTableWidget::event(QEvent * event)\r
105 {\r
106         switch (event->type()) {\r
107         case QEvent::MouseMove: {\r
108                 QMouseEvent * me = dynamic_cast<QMouseEvent *>(event);\r
109                 mouseMoveEvent(me);\r
110                 return true;\r
111                 }\r
112         case QEvent::MouseButtonRelease: {\r
113                 QMouseEvent * me = dynamic_cast<QMouseEvent *>(event);\r
114                 mouseReleaseEvent(me);\r
115                 return true;\r
116                 }\r
117         case QEvent::MouseButtonPress: {\r
118                 // swallow this one...\r
119                 return true;\r
120                 }\r
121         case QEvent::Leave: {\r
122                 bottom_ = 0;\r
123                 right_ = 0;\r
124                 update();\r
125                 return true;\r
126                 }\r
127         default:\r
128                 return QWidget::event(event);\r
129         }\r
130 }\r
131 \r
132 \r
133 void InsertTableWidget::mouseReleaseEvent(QMouseEvent * event)\r
134 {\r
135         if (underMouse_) {\r
136                 QString const data = QString("%1 %2").arg(bottom_).arg(right_);\r
137                 lyxView_.getLyXFunc().dispatch(FuncRequest(LFUN_TABULAR_INSERT, fromqstr(data)));\r
138         }\r
139         emit visible(false);\r
140         close();\r
141 }\r
142 \r
143 \r
144 void InsertTableWidget::paintEvent(QPaintEvent * event)\r
145 {\r
146         drawGrid(rows_, cols_, Qt::white);\r
147         if (underMouse_)\r
148                 drawGrid(bottom_, right_, Qt::darkBlue);\r
149 }\r
150 \r
151 \r
152 void InsertTableWidget::drawGrid(int const rows, int const cols, Qt::GlobalColor const color)\r
153 {\r
154         QPainter painter(this);\r
155         painter.setPen(Qt::darkGray);\r
156         painter.setBrush(color);\r
157 \r
158         for (int r = 0 ; r < rows ; ++r ) {\r
159                 for (int c = 0 ; c < cols ; ++c ) {\r
160                         QRect rectangle(c * colwidth_, r * rowheight_, colwidth_, rowheight_);\r
161                         painter.drawRect(rectangle);\r
162                 }\r
163         }\r
164 }\r
165 \r
166 \r
167 void InsertTableWidget::updateParent()\r
168 {\r
169         FuncStatus const status = lyxView_.getLyXFunc().getStatus(func_);\r
170         parentWidget()->setEnabled(status.enabled());\r
171 }\r
172 \r
173 \r
174 } // namespace frontend\r
175 } // namespace lyx\r
176 \r
177 #include "InsertTableWidget_moc.cpp"\r