1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7
8
9 #include "textpalette.h"
10
11 #include <QCloseEvent>
12 #include <QComboBox>
13 #include <QEvent>
14 #include <QFocusEvent>
15 #include <QKeyEvent>
16 #include <QTransform>
17 #include <QObject>
18 #include <QPoint>
19 #include <QSpacerItem>
20 #include <QStackedWidget>
21 #include <QTimer>
22 #include <QToolBox>
23 #include <QToolTip>
24 #include <QVBoxLayout>
25 #include <QValidator>
26 #include <QWidget>
27
28 #if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES)
29 #define _USE_MATH_DEFINES
30 #endif
31 #include <cmath>
32
33 #include "appmodehelper.h"
34 #include "appmodes.h"
35 #include "pageitem_table.h"
36 #include "pageitem_textframe.h"
37 #include "propertiespalette_text.h"
38 #include "scribus.h"
39 #include "scribusdoc.h"
40 #include "selection.h"
41 #include "undomanager.h"
42
43
TextPalette(QWidget * parent)44 TextPalette::TextPalette( QWidget* parent) : ScDockPalette(parent, "TextPalette", Qt::WindowFlags())
45 {
46 undoManager = UndoManager::instance();
47
48 setObjectName(QString::fromLocal8Bit("TextPalette"));
49 /// setSizePolicy( QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
50
51 QFont f(font());
52 f.setPointSize(f.pointSize()-1);
53 setFont(f);
54
55 textPal = new PropertiesPalette_Text( this );
56 setWidget( textPal );
57
58 languageChange();
59
60 m_haveItem = false;
61 }
62
closeEvent(QCloseEvent * closeEvent)63 void TextPalette::closeEvent(QCloseEvent *closeEvent)
64 {
65 ScDockPalette::closeEvent(closeEvent);
66 }
67
setMainWindow(ScribusMainWindow * mw)68 void TextPalette::setMainWindow(ScribusMainWindow* mw)
69 {
70 m_ScMW = mw;
71
72 // For some reason, the mapToGlobal() / mapFromGlobal() roundtrip
73 // performed below does not give always good results, causing TP to
74 // not display in some situations. Moreover the reparenting is useless
75 // as TP is already created with ScribusMainWindow as parent.
76 /*QPoint p1 = mapToGlobal(pos());
77 QPoint p2 = m_ScMW->mapFromGlobal(p1);
78 setParent(m_ScMW);
79 move(p2);*/
80
81 this->textPal->setMainWindow(mw);
82
83 connect(m_ScMW->appModeHelper, SIGNAL(AppModeChanged(int,int)), this, SLOT(AppModeChanged()));
84 }
85
86
setDoc(ScribusDoc * d)87 void TextPalette::setDoc(ScribusDoc *d)
88 {
89 if((d == (ScribusDoc*) m_doc) || (m_ScMW && m_ScMW->scriptIsRunning()))
90 return;
91
92 if (m_doc)
93 {
94 disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
95 disconnect(m_doc , SIGNAL(docChanged()) , this, SLOT(handleSelectionChanged()));
96 }
97
98 m_doc = d;
99 m_item = nullptr;
100 setEnabled(!m_doc->drawAsPreview);
101
102 m_unitRatio = m_doc->unitRatio();
103 m_unitIndex = m_doc->unitIndex();
104 //qt4 FIXME here
105 m_haveDoc = true;
106 m_haveItem = false;
107
108 textPal->setDoc(m_doc);
109
110 updateColorList();
111
112 connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
113 connect(m_doc , SIGNAL(docChanged()) , this, SLOT(handleSelectionChanged()));
114
115 // Handle properties update when switching document
116 handleSelectionChanged();
117 }
118
unsetDoc()119 void TextPalette::unsetDoc()
120 {
121 if (m_doc)
122 {
123 disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
124 disconnect(m_doc , SIGNAL(docChanged()) , this, SLOT(handleSelectionChanged()));
125 }
126 setEnabled(true);
127 m_haveDoc = false;
128 m_haveItem = false;
129 m_doc=nullptr;
130 m_item = nullptr;
131
132 textPal->unsetItem();
133 textPal->unsetDoc();
134
135 m_haveItem = false;
136 }
137
unsetItem()138 void TextPalette::unsetItem()
139 {
140 m_haveItem = false;
141 m_item = nullptr;
142 textPal->unsetItem();
143 handleSelectionChanged();
144 }
145
currentItemFromSelection()146 PageItem* TextPalette::currentItemFromSelection()
147 {
148 PageItem *currentItem = nullptr;
149
150 if (m_doc)
151 {
152 if (m_doc->m_Selection->count() > 0)
153 currentItem = m_doc->m_Selection->itemAt(0);
154 /* if (m_doc->m_Selection->count() > 1)
155 {
156 int lowestItem = 999999;
157 for (int a=0; a<m_doc->m_Selection->count(); ++a)
158 {
159 currentItem = m_doc->m_Selection->itemAt(a);
160 lowestItem = qMin(lowestItem, m_doc->Items->indexOf(currentItem));
161 }
162 currentItem = m_doc->Items->at(lowestItem);
163 }
164 else if (m_doc->m_Selection->count() == 1)
165 {
166 currentItem = m_doc->m_Selection->itemAt(0);
167 } */
168 }
169
170 return currentItem;
171 }
172
AppModeChanged()173 void TextPalette::AppModeChanged()
174 {
175 if (!m_ScMW || m_ScMW->scriptIsRunning())
176 return;
177 if ((m_haveDoc) && (m_haveItem))
178 {
179 if (m_item->isTable())
180 {
181 textPal->setEnabled(m_doc->appMode == modeEditTable);
182 if (m_doc->appMode == modeEditTable)
183 connect(m_item->asTable(), SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
184 else
185 disconnect(m_item->asTable(), SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
186 }
187 textPal->handleSelectionChanged();
188 }
189 }
190
setCurrentItem(PageItem * item)191 void TextPalette::setCurrentItem(PageItem *item)
192 {
193 if (!m_ScMW || m_ScMW->scriptIsRunning())
194 return;
195 //CB We shouldn't really need to process this if our item is the same one
196 //maybe we do if the item has been changed by scripter.. but that should probably
197 //set some status if so.
198 //FIXME: This won't work until when a canvas deselect happens, m_item must be nullptr.
199 //if (m_item == item)
200 // return;
201
202 if (!item)
203 {
204 unsetItem();
205 return;
206 }
207
208 if (!m_doc)
209 setDoc(item->doc());
210
211 m_haveItem = false;
212 m_item = item;
213
214 if ((m_item->isGroup()) && (!m_item->isSingleSel))
215 textPal->setEnabled(false);
216
217 m_haveItem = true;
218
219 if (!sender() || (m_doc->appMode == modeEditTable))
220 {
221 textPal->handleSelectionChanged();
222 }
223
224 if (m_item->isOSGFrame())
225 {
226 textPal->setEnabled(false);
227 }
228 if (m_item->isSymbol())
229 {
230 textPal->setEnabled(false);
231 }
232 }
233
handleSelectionChanged()234 void TextPalette::handleSelectionChanged()
235 {
236 if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
237 return;
238
239 PageItem* currItem = currentItemFromSelection();
240 if (m_doc->m_Selection->count() > 1)
241 {
242 textPal->setEnabled(false);
243 }
244 else
245 {
246 int itemType = currItem ? (int) currItem->itemType() : -1;
247 m_haveItem = (itemType != -1);
248
249 switch (itemType)
250 {
251 case -1:
252 m_haveItem = false;
253 textPal->setEnabled(false);
254 break;
255 case PageItem::ImageFrame:
256 case PageItem::LatexFrame:
257 case PageItem::OSGFrame:
258 textPal->setEnabled(false);
259 break;
260 case PageItem::TextFrame:
261 textPal->setEnabled(true);
262 break;
263 case PageItem::Line:
264 textPal->setEnabled(false);
265 break;
266 case PageItem::ItemType1:
267 case PageItem::ItemType3:
268 case PageItem::Polygon:
269 case PageItem::RegularPolygon:
270 case PageItem::Arc:
271 textPal->setEnabled(false);
272 break;
273 case PageItem::PolyLine:
274 case PageItem::Spiral:
275 textPal->setEnabled(false);
276 break;
277 case PageItem::PathText:
278 textPal->setEnabled(true);
279 break;
280 case PageItem::Symbol:
281 case PageItem::Group:
282 textPal->setEnabled(false);
283 break;
284 case PageItem::Table:
285 textPal->setEnabled(m_doc->appMode == modeEditTable);
286 break;
287 }
288 }
289
290 updateGeometry();
291 update();
292
293 if (currItem)
294 setCurrentItem(currItem);
295 }
296
unitChange()297 void TextPalette::unitChange()
298 {
299 if (!m_haveDoc)
300 return;
301 bool tmp = m_haveItem;
302 m_haveItem = false;
303 m_unitRatio = m_doc->unitRatio();
304 m_unitIndex = m_doc->unitIndex();
305
306 textPal->unitChange();
307 m_haveItem = tmp;
308 }
309
NewLineMode(int mode)310 void TextPalette::NewLineMode(int mode)
311 {
312 if (!m_ScMW || m_ScMW->scriptIsRunning())
313 return;
314 updateGeometry();
315 repaint();
316 }
317
updateColorList()318 void TextPalette::updateColorList()
319 {
320 if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
321 return;
322
323 textPal->updateColorList();
324
325 assert (m_doc->PageColors.document());
326 }
327
userActionOn()328 bool TextPalette::userActionOn()
329 {
330 bool userActionOn = false;
331 return userActionOn;
332 }
333
changeEvent(QEvent * e)334 void TextPalette::changeEvent(QEvent *e)
335 {
336 if (e->type() == QEvent::LanguageChange)
337 {
338 languageChange();
339 return;
340 }
341 ScDockPalette::changeEvent(e);
342 }
343
languageChange()344 void TextPalette::languageChange()
345 {
346 setWindowTitle( tr("Text Properties"));
347 textPal->languageChange();
348 }
349
350
351