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 "propertiespalette.h"
10 
11 #include <QCloseEvent>
12 #include <QComboBox>
13 #include <QEvent>
14 #include <QFocusEvent>
15 #include <QKeyEvent>
16 #include <QObject>
17 #include <QPoint>
18 #include <QSpacerItem>
19 #include <QStackedWidget>
20 #include <QTimer>
21 #include <QToolBox>
22 #include <QToolTip>
23 #include <QTransform>
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 "arrowchooser.h"
36 #include "autoform.h"
37 #include "basepointwidget.h"
38 #include "colorcombo.h"
39 #include "colorlistbox.h"
40 #include "commonstrings.h"
41 #include "cpalette.h"
42 #include "dasheditor.h"
43 #include "pageitem_table.h"
44 #include "propertiespalette_line.h"
45 #include "propertiespalette_shadow.h"
46 #include "propertiespalette_shape.h"
47 #include "propertiespalette_utils.h"
48 #include "propertiespalette_xyz.h"
49 #include "transparencypalette.h"
50 #include "scribus.h"
51 #include "scribusview.h"
52 #include "selection.h"
53 #include "undomanager.h"
54 #include "units.h"
55 #include "util_math.h"
56 
57 
PropertiesPalette(QWidget * parent)58 PropertiesPalette::PropertiesPalette( QWidget* parent) : ScDockPalette(parent, "PropertiesPalette", Qt::WindowFlags())
59 {
60 	undoManager = UndoManager::instance();
61 
62 	setObjectName(QString::fromLocal8Bit("PropertiesPalette"));
63 	setSizePolicy( QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
64 
65 	QFont f(font());
66 	f.setPointSize(f.pointSize()-1);
67 	setFont(f);
68 
69 	TabStack = new ScTreeWidget( this );
70 //	Uncomment this line if the new behaviour makes any trouble.
71 //	TabStack->setToolBoxMode(true);
72 
73 	xyzPal = new PropertiesPalette_XYZ( this );
74 	idXYZItem = TabStack->addItem( xyzPal, "X, Y, &Z" );
75 
76 	shadowPal = new PropertiesPalette_Shadow( this );
77 	idShadowItem = TabStack->addItem( shadowPal, "Drop Shadow" );
78 
79 	shapePal = new PropertiesPalette_Shape( this );
80 	idShapeItem = TabStack->addItem( shapePal, "&Shape" );
81 
82 	linePal = new PropertiesPalette_Line(this);
83 	idLineItem=TabStack->addItem( linePal, "&Line" );
84 
85 	colorPalette = new ColorPalette(this);
86 	idColorsItem = TabStack->addItem(colorPalette, "&Colors" );
87 
88 	transparencyPalette = new TransparencyPalette(this);
89 	idTransparencyItem = TabStack->addItem(transparencyPalette, "&Transparency" );
90 
91 	setWidget( TabStack );
92 
93 	languageChange();
94 
95 	connect(linePal, SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
96 	connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
97 
98 	connect(colorPalette, SIGNAL(NewSpecial(double,double,double,double,double,double,double,double,double,double)), this, SLOT(NewSpGradient(double,double,double,double,double,double,double,double,double,double )));
99 	connect(colorPalette, SIGNAL(editGradient(int)), this, SLOT(toggleGradientEdit(int)));
100 	connect(transparencyPalette, SIGNAL(NewSpecial(double,double,double,double,double,double,double,double,double,double)), this, SLOT(NewSpGradientM(double,double,double,double,double,double,double,double )));
101 	connect(transparencyPalette, SIGNAL(editGradient()), this, SLOT(toggleGradientEditM()));
102 
103 	m_haveItem = false;
104 	for (int i = 1; i < 10; ++i)
105 		TabStack->setItemEnabled(i, false);
106 	TabStack->setCurrentIndex(0);
107 	TabStack->widget(0)->setEnabled(false);
108 	TabStack->setItemEnabled(0, false);
109 }
110 
closeEvent(QCloseEvent * closeEvent)111 void PropertiesPalette::closeEvent(QCloseEvent *closeEvent)
112 {
113 	if (m_ScMW && !m_ScMW->scriptIsRunning())
114 	{
115 		if (m_haveDoc && m_haveItem && colorPalette->gradEditButton->isChecked())
116 		{
117 			m_ScMW->view->requestMode(modeNormal);
118 			m_ScMW->view->RefreshGradient(m_item);
119 		}
120 	}
121 	ScDockPalette::closeEvent(closeEvent);
122 }
123 
setMainWindow(ScribusMainWindow * mw)124 void PropertiesPalette::setMainWindow(ScribusMainWindow* mw)
125 {
126 	m_ScMW = mw;
127 
128 	// For some reason, the mapToGlobal() / mapFromGlobal() roundtrip
129 	// performed below does not give always good results, causing PP to
130 	// not display in some situations. Moreover the reparenting is useless
131 	// as PP is already created with ScribusMainWindow as parent.
132 	/*QPoint p1 = mapToGlobal(pos());
133 	QPoint p2 = m_ScMW->mapFromGlobal(p1);
134 	setParent(m_ScMW);
135 	move(p2);*/
136 
137 	this->xyzPal->setMainWindow(mw);
138 	this->shadowPal->setMainWindow(mw);
139 	this->shapePal->setMainWindow(mw);
140 	this->linePal->setMainWindow(mw);
141 
142 	//connect(this->Cpal, SIGNAL(gradientChanged()), m_ScMW, SLOT(updtGradFill()));
143 	//connect(this->Cpal, SIGNAL(strokeGradientChanged()), m_ScMW, SLOT(updtGradStroke()));
144 	connect(this->transparencyPalette, SIGNAL(gradientChanged()), this, SLOT(handleGradientChanged()));
145 	connect(m_ScMW->appModeHelper, SIGNAL(AppModeChanged(int,int)), this, SLOT(AppModeChanged()));
146 }
147 
SelTab(int t)148 void PropertiesPalette::SelTab(int t)
149 {
150 	if (!m_ScMW || m_ScMW->scriptIsRunning())
151 		return;
152 
153 	if (!TabStack->widget(t)->isVisible())
154 		return;
155 
156 	bool focusNowSet = false;
157 	foreach (QObject *o, TabStack->widget(t)->children())
158 	{
159 		// Layouts, boxes etc aren't widgets at all
160 		// so let's skip them silently...
161 		QWidget *w = qobject_cast<QWidget*>(o);
162 		if (!w)
163 			continue;
164 
165 		QWidget *i = TabStack->widget(t);
166 		while ((i = i->nextInFocusChain()) != TabStack->widget(t))
167 		{
168 			if (((i->focusPolicy() & Qt::TabFocus) == Qt::TabFocus) && !i->focusProxy() && i->isEnabled())
169 			{
170 				focusNowSet = true;
171 				i->setFocus();
172 				break;
173 			}
174 		}
175 
176 		if (focusNowSet)
177 			break;
178 	}
179 }
180 
setDoc(ScribusDoc * d)181 void PropertiesPalette::setDoc(ScribusDoc *d)
182 {
183 	if((d == (ScribusDoc*) m_doc) || (m_ScMW && m_ScMW->scriptIsRunning()))
184 		return;
185 
186 	if (m_doc)
187 	{
188 		disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
189 		disconnect(m_doc, SIGNAL(docChanged()), this, SLOT(handleSelectionChanged()));
190 	}
191 
192 	m_doc = d;
193 	m_item = nullptr;
194 	setEnabled(!m_doc->drawAsPreview);
195 	colorPalette->setDocument(m_doc);
196 	colorPalette->setCurrentItem(nullptr);
197 	transparencyPalette->setDocument(m_doc);
198 	transparencyPalette->setCurrentItem(nullptr);
199 
200 	m_unitRatio = m_doc->unitRatio();
201 	m_unitIndex = m_doc->unitIndex();
202 	m_haveDoc = true;
203 	m_haveItem = false;
204 
205 	xyzPal->setDoc(m_doc);
206 	shadowPal->setDoc(m_doc);
207 	shapePal->setDoc(m_doc);
208 	linePal->setDoc(m_doc);
209 
210 	updateColorList();
211 
212 	connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
213 	connect(m_doc, SIGNAL(docChanged()), this, SLOT(handleSelectionChanged()));
214 
215 	// Handle properties update when switching document
216 	handleSelectionChanged();
217 }
218 
unsetDoc()219 void PropertiesPalette::unsetDoc()
220 {
221 	if (m_doc)
222 	{
223 		disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
224 		disconnect(m_doc, SIGNAL(docChanged()), this, SLOT(handleSelectionChanged()));
225 	}
226 	setEnabled(true);
227 	m_haveDoc = false;
228 	m_haveItem = false;
229 	m_doc=nullptr;
230 	m_item = nullptr;
231 
232 	xyzPal->unsetItem();
233 	xyzPal->unsetDoc();
234 	shadowPal->unsetItem();
235 	shadowPal->unsetDoc();
236 	shapePal->unsetItem();
237 	shapePal->unsetDoc();
238 	linePal->unsetItem();
239 	linePal->unsetDoc();
240 
241 	colorPalette->setCurrentItem(nullptr);
242 	colorPalette->setDocument(nullptr);
243 	transparencyPalette->setCurrentItem(nullptr);
244 	transparencyPalette->setDocument(nullptr);
245 
246 	m_haveItem = false;
247 	for (int ws = 1; ws < 10; ++ws)
248 		TabStack->setItemEnabled(ws, false);
249 	TabStack->widget(0)->setEnabled(false);
250 	TabStack->setItemEnabled(idXYZItem, false);
251 }
252 
unsetItem()253 void PropertiesPalette::unsetItem()
254 {
255 	m_haveItem = false;
256 	m_item = nullptr;
257 	colorPalette->setCurrentItem(nullptr);
258 	transparencyPalette->setCurrentItem(nullptr);
259 	shapePal->unsetItem();
260 	linePal->unsetItem();
261 	handleSelectionChanged();
262 }
263 
setTextFlowMode(PageItem::TextFlowMode mode)264 void PropertiesPalette::setTextFlowMode(PageItem::TextFlowMode mode)
265 {
266 	if (!m_ScMW || m_ScMW->scriptIsRunning() || !m_haveItem)
267 		return;
268 	shapePal->showTextFlowMode(mode);
269 }
270 
currentItemFromSelection()271 PageItem* PropertiesPalette::currentItemFromSelection()
272 {
273 	if (m_doc && m_doc->m_Selection->count() > 0)
274 		return m_doc->m_Selection->itemAt(0);
275 	return nullptr;
276 }
277 
AppModeChanged()278 void PropertiesPalette::AppModeChanged()
279 {
280 	if (!m_ScMW || m_ScMW->scriptIsRunning())
281 		return;
282 	if ((m_haveDoc) && (m_haveItem))
283 	{
284 		// TODO: not sure that this is still needed...
285 		if (m_item->isTable())
286 		{
287 			if (m_doc->appMode == modeEditTable)
288 				connect(m_item->asTable(), SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
289 			else
290 				disconnect(m_item->asTable(), SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
291 		}
292 	}
293 }
294 
setCurrentItem(PageItem * item)295 void PropertiesPalette::setCurrentItem(PageItem *item)
296 {
297 	if (!m_ScMW || m_ScMW->scriptIsRunning())
298 		return;
299 	//CB We shouldn't really need to process this if our item is the same one
300 	//maybe we do if the item has been changed by scripter.. but that should probably
301 	//set some status if so.
302 	//FIXME: This won't work until when a canvas deselect happens, m_item must be nullptr.
303 	//if (m_item == item)
304 	//	return;
305 
306 	if (!item)
307 	{
308 		unsetItem();
309 		return;
310 	}
311 
312 	int oldTabIndex = TabStack->currentIndex();
313 
314 	if (!m_doc)
315 		setDoc(item->doc());
316 
317 	disconnect(TabStack, SIGNAL(currentChanged2(int)) , this, SLOT(SelTab(int)));
318 	disconnect(linePal , SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
319 
320 	m_haveItem = false;
321 	m_item = item;
322 
323 	transparencyPalette->setCurrentItem(m_item);
324 
325 	setTextFlowMode(m_item->textFlowMode());
326 
327 	connect(linePal , SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
328 
329 //CB replaces old emits from PageItem::emitAllToGUI()
330 	setLocked(item->locked());
331 
332 	if ((m_item->isGroup()) && (!m_item->isSingleSel))
333 	{
334 		TabStack->setItemEnabled(idXYZItem, true);
335 		TabStack->setItemEnabled(idShadowItem, true);
336 		TabStack->setItemEnabled(idShapeItem, true);
337 		TabStack->setItemEnabled(idLineItem, false);
338 		TabStack->setItemEnabled(idColorsItem, false);
339 		TabStack->setItemEnabled(idTransparencyItem, true);
340 	}
341 
342 	m_haveItem = true;
343 
344 	if (oldTabIndex != TabStack->currentIndex())
345 	{
346 		//Must be called only when necessary : cause focus problem
347 		//in spinboxes when processing valueChanged() signals
348 		SelTab(TabStack->currentIndex());
349 	}
350 
351 	if (!sender() || (m_doc->appMode == modeEditTable))
352 	{
353 		xyzPal->handleSelectionChanged();
354 		shadowPal->handleSelectionChanged();
355 		shapePal->handleSelectionChanged();
356 		linePal->handleSelectionChanged();
357 		colorPalette->handleSelectionChanged();
358 	}
359 
360 	if (m_item->isOSGFrame())
361 	{
362 		TabStack->setItemEnabled(idXYZItem, true);
363 		TabStack->setItemEnabled(idShadowItem, true);
364 		TabStack->setItemEnabled(idShapeItem, true);
365 		TabStack->setItemEnabled(idLineItem, false);
366 		TabStack->setItemEnabled(idColorsItem, true);
367 		TabStack->setItemEnabled(idTransparencyItem, false);
368 	}
369 	if (m_item->asSymbol())
370 	{
371 		TabStack->setItemEnabled(idXYZItem, true);
372 		TabStack->setItemEnabled(idShadowItem, true);
373 		TabStack->setItemEnabled(idShapeItem, false);
374 		TabStack->setItemEnabled(idLineItem, false);
375 		TabStack->setItemEnabled(idColorsItem, false);
376 		TabStack->setItemEnabled(idTransparencyItem, false);
377 	}
378 	connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
379 }
380 
handleSelectionChanged()381 void PropertiesPalette::handleSelectionChanged()
382 {
383 	if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
384 		return;
385 	int currentTab = TabStack->currentIndex();
386 	disconnect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
387 
388 	PageItem* currItem = currentItemFromSelection();
389 	if (m_doc->m_Selection->count() > 1)
390 	{
391 		for (int ws = 1; ws < 10; ++ws)
392 			TabStack->setItemEnabled(ws, false);
393 		TabStack->widget(0)->setEnabled(true);
394 		TabStack->setItemEnabled(idXYZItem, true);
395 		TabStack->setItemEnabled(idShadowItem, true);
396 		TabStack->setItemEnabled(idLineItem, true);
397 		TabStack->setItemEnabled(idColorsItem, true);
398 		TabStack->setItemEnabled(idTransparencyItem, true);
399 	}
400 	else
401 	{
402 		int itemType = currItem ? (int) currItem->itemType() : -1;
403 		m_haveItem   = (itemType != -1);
404 
405 //		int visID = TabStack->currentIndex();
406 		TabStack->widget(0)->setEnabled(true);
407 		TabStack->setItemEnabled(idXYZItem, true);
408 		TabStack->setItemEnabled(idColorsItem, true);
409 		TabStack->setItemEnabled(idTransparencyItem, true);
410 		switch (itemType)
411 		{
412 		case -1:
413 			m_haveItem = false;
414 			for (int ws = 1; ws < 10; ++ws)
415 				TabStack->setItemEnabled(ws, false);
416 			TabStack->widget(0)->setEnabled(false);
417 			TabStack->setItemEnabled(idXYZItem, false);
418 			colorPalette->showGradient(0);
419 			break;
420 		case PageItem::ImageFrame:
421 		case PageItem::LatexFrame:
422 		case PageItem::OSGFrame:
423 			if (currItem->isOSGFrame())
424 			{
425 				TabStack->setItemEnabled(idXYZItem, true);
426 				TabStack->setItemEnabled(idShadowItem, true);
427 				TabStack->setItemEnabled(idShapeItem, true);
428 				TabStack->setItemEnabled(idLineItem, false);
429 				TabStack->setItemEnabled(idColorsItem, true);
430 				TabStack->setItemEnabled(idTransparencyItem, false);
431 			}
432 			else
433 			{
434 				TabStack->setItemEnabled(idXYZItem, true);
435 				TabStack->setItemEnabled(idShadowItem, true);
436 				TabStack->setItemEnabled(idShapeItem, true);
437 				TabStack->setItemEnabled(idLineItem, true);
438 			}
439 			break;
440 		case PageItem::Group:
441 		case PageItem::Symbol:
442 		case PageItem::Table:
443 		case PageItem::TextFrame:
444 			TabStack->setItemEnabled(idShadowItem, true);
445 			TabStack->setItemEnabled(idShapeItem, true);
446 			TabStack->setItemEnabled(idLineItem, true);
447 			break;
448 		case PageItem::Line:
449 			TabStack->setItemEnabled(idShadowItem, true);
450 			TabStack->setItemEnabled(idShapeItem, false);
451 			TabStack->setItemEnabled(idLineItem, true);
452 			break;
453 		case PageItem::ItemType1:
454 		case PageItem::ItemType3:
455 		case PageItem::Polygon:
456 		case PageItem::RegularPolygon:
457 		case PageItem::Arc:
458 			TabStack->setItemEnabled(idShadowItem, true);
459 			TabStack->setItemEnabled(idShapeItem, true);
460 			TabStack->setItemEnabled(idLineItem, true);
461 			break;
462 		case PageItem::PolyLine:
463 		case PageItem::Spiral:
464 			TabStack->setItemEnabled(idShadowItem, true);
465 			TabStack->setItemEnabled(idShapeItem, true);
466 			TabStack->setItemEnabled(idLineItem, true);
467 			break;
468 		case PageItem::PathText:
469 			TabStack->setItemEnabled(idShadowItem, true);
470 			TabStack->setItemEnabled(idShapeItem, true);
471 			TabStack->setItemEnabled(idLineItem, true);
472 			break;
473 		}
474 	}
475 	if (TabStack->isItemEnabled(currentTab) && (TabStack->currentIndex() != currentTab))
476 		TabStack->setCurrentIndex(currentTab);
477 	updateGeometry();
478 	update();
479 	connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
480 
481 	if (currItem)
482 	{
483 		setCurrentItem(currItem);
484 	}
485 }
486 
unitChange()487 void PropertiesPalette::unitChange()
488 {
489 	if (!m_haveDoc)
490 		return;
491 	bool tmp = m_haveItem;
492 	m_haveItem = false;
493 	double oldRatio = m_unitRatio;
494 	m_unitRatio = m_doc->unitRatio();
495 	m_unitIndex = m_doc->unitIndex();
496 
497 	xyzPal->unitChange();
498 	shadowPal->unitChange();
499 	shapePal->unitChange();
500 	linePal->unitChange();
501 
502 	colorPalette->unitChange(oldRatio, m_unitRatio, m_doc->unitIndex());
503 	transparencyPalette->unitChange(oldRatio, m_unitRatio, m_doc->unitIndex());
504 	m_haveItem = tmp;
505 }
506 
NewLineMode(int mode)507 void PropertiesPalette::NewLineMode(int mode)
508 {
509 	if (!m_ScMW || m_ScMW->scriptIsRunning())
510 		return;
511 	xyzPal->setLineMode(mode);
512 	xyzPal->showWH(m_item->width(), m_item->height());
513 	updateGeometry();
514 	repaint();
515 }
516 
handleNewShape(int frameType)517 void PropertiesPalette::handleNewShape(int frameType)
518 {
519 	if (!m_ScMW || m_ScMW->scriptIsRunning())
520 		return;
521 	if ((m_haveDoc) && (m_haveItem))
522 	{
523 		if ((m_item->itemType() == PageItem::PolyLine) || (m_item->itemType() == PageItem::PathText))
524 			return;
525 		shapePal->setRoundRectEnabled(frameType == 0);
526 	}
527 }
528 
NewSpGradient(double x1,double y1,double x2,double y2,double fx,double fy,double sg,double sk,double cx,double cy)529 void PropertiesPalette::NewSpGradient(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk, double cx, double cy)
530 {
531 	if (!m_ScMW || m_ScMW->scriptIsRunning())
532 		return;
533 	if ((m_haveDoc) && (m_haveItem))
534 	{
535 		QRectF upRect;
536 		UndoTransaction trans;
537 		if (UndoManager::undoEnabled())
538 			trans = undoManager->beginTransaction(Um::Selection, Um::ILine, Um::GradPos + "p", "", Um::ILine);
539 		if (m_ScMW->view->editStrokeGradient == 1)
540 		{
541 			m_item->setGradientStrokeStart(x1 / m_unitRatio, y1 / m_unitRatio);
542 			m_item->setGradientStrokeEnd(x2 / m_unitRatio, y2 / m_unitRatio);
543 			m_item->setGradientStrokeFocal(fx / m_unitRatio, fy / m_unitRatio);
544 			m_item->setGradientStrokeScale(sg);
545 			m_item->setGradientStrokeSkew(sk);
546 			if (m_item->strokeGradientType() == 6)
547 			{
548 				m_item->setGradientStrokeFocal(m_item->gradientStrokeStartX(), m_item->gradientStrokeStartY());
549 			}
550 			m_item->update();
551 			upRect = QRectF(m_item->gradientStrokeStart(), m_item->gradientStrokeEnd());
552 			double radEnd = distance(m_item->gradientStrokeEndX() - m_item->gradientStrokeStartX(), m_item->gradientStrokeEndY() - m_item->gradientStrokeStartY());
553 			double rotEnd = xy2Deg(m_item->gradientStrokeEndX() - m_item->gradientStrokeStartX(), m_item->gradientStrokeEndY() - m_item->gradientStrokeStartY());
554 			QTransform m;
555 			m.translate(m_item->gradientStrokeStartX(), m_item->gradientStrokeStartY());
556 			m.rotate(rotEnd);
557 			m.rotate(-90);
558 			m.rotate(m_item->gradientStrokeSkew());
559 			m.translate(radEnd * m_item->gradientStrokeScale(), 0);
560 			QPointF shP = m.map(QPointF(0,0));
561 			upRect = upRect.united(QRectF(shP, m_item->gradientStrokeEnd()).normalized());
562 			upRect = upRect.united(QRectF(shP, m_item->gradientStrokeStart()).normalized());
563 			upRect |= QRectF(shP, QPointF(0, 0)).normalized();
564 			upRect |= QRectF(shP, QPointF(m_item->width(), m_item->height())).normalized();
565 		}
566 		else if (m_ScMW->view->editStrokeGradient == 3)
567 		{
568 			m_item->setGradientControl1(FPoint(x1 / m_unitRatio, y1 / m_unitRatio));
569 			m_item->setGradientControl2(FPoint(x2 / m_unitRatio, y2 / m_unitRatio));
570 			m_item->setGradientControl3(FPoint(fx / m_unitRatio, fy / m_unitRatio));
571 			m_item->setGradientControl4(FPoint(sg / m_unitRatio, sk / m_unitRatio));
572 			m_item->update();
573 			upRect = QRectF(QPointF(-m_item->width(), -m_item->height()), QPointF(m_item->width() * 2, m_item->height() * 2)).normalized();
574 		}
575 		else if (m_ScMW->view->editStrokeGradient == 4)
576 		{
577 			m_item->setGradientControl1(FPoint(x1 / m_unitRatio, y1 / m_unitRatio));
578 			m_item->setGradientControl2(FPoint(x2 / m_unitRatio, y2 / m_unitRatio));
579 			m_item->setGradientControl3(FPoint(fx / m_unitRatio, fy / m_unitRatio));
580 			m_item->setGradientControl4(FPoint(sg / m_unitRatio, sk / m_unitRatio));
581 			m_item->setGradientControl5(FPoint(cx / m_unitRatio, cy / m_unitRatio));
582 			m_item->update();
583 			upRect = QRectF(QPointF(-m_item->width(), -m_item->height()), QPointF(m_item->width() * 2, m_item->height() * 2)).normalized();
584 		}
585 		else
586 		{
587 			if (m_item->gradientType() == 13 && UndoManager::undoEnabled())
588 			{
589 				SimpleState *ss= new SimpleState("Refresh");
590 				ss->set("UNDO_UPDATE_CONICAL");
591 				undoManager->action(m_item,ss);
592 			}
593 			m_item->setGradientStart(x1 / m_unitRatio, y1 / m_unitRatio);
594 			m_item->setGradientEnd(x2 / m_unitRatio, y2 / m_unitRatio);
595 			m_item->setGradientFocal(fx / m_unitRatio, fy / m_unitRatio);
596 			m_item->setGradientScale(sg);
597 			m_item->setGradientSkew(sk);
598 			if (m_item->strokeGradientType() == 6)
599 			{
600 				m_item->setGradientFocal(m_item->gradientStartX(), m_item->gradientStartY());
601 			}
602 			if (m_item->gradientType() == 13 && UndoManager::undoEnabled())
603 			{
604 				m_item->createConicalMesh();
605 				SimpleState *ss= new SimpleState("Refresh");
606 				ss->set("REDO_UPDATE_CONICAL");
607 				undoManager->action(m_item,ss);
608 			}
609 			m_item->update();
610 			upRect = QRectF(m_item->gradientStart(), m_item->gradientEnd());
611 			double radEnd = distance(m_item->gradientEndX() - m_item->gradientStartX(), m_item->gradientEndY() - m_item->gradientStartY());
612 			double rotEnd = xy2Deg(m_item->gradientEndX() - m_item->gradientStartX(), m_item->gradientEndY() - m_item->gradientStartY());
613 			QTransform m;
614 			m.translate(m_item->gradientStartX(), m_item->gradientStartY());
615 			m.rotate(rotEnd);
616 			m.rotate(-90);
617 			m.rotate(m_item->gradientSkew());
618 			m.translate(radEnd * m_item->gradientScale(), 0);
619 			QPointF shP = m.map(QPointF(0,0));
620 			upRect |= QRectF(shP, m_item->gradientEnd()).normalized();
621 			upRect |= QRectF(shP, m_item->gradientStart()).normalized();
622 			upRect |= QRectF(shP, QPointF(0, 0)).normalized();
623 			upRect |= QRectF(shP, QPointF(m_item->width(), m_item->height())).normalized();
624 		}
625 		if (trans)
626 			trans.commit();
627 		upRect.translate(m_item->xPos(), m_item->yPos());
628 		m_doc->regionsChanged()->update(upRect.adjusted(-10.0, -10.0, 10.0, 10.0));
629 		m_doc->changed();
630 	}
631 }
632 
toggleGradientEdit(int stroke)633 void PropertiesPalette::toggleGradientEdit(int stroke)
634 {
635 	if (!m_ScMW || m_ScMW->scriptIsRunning())
636 		return;
637 	if ((m_haveDoc) && (m_haveItem))
638 	{
639 		m_ScMW->view->editStrokeGradient = stroke;
640 		if (stroke == 1)
641 		{
642 			if (colorPalette->gradEditButtonStroke->isChecked())
643 				m_ScMW->view->requestMode(modeEditGradientVectors);
644 			else
645 				m_ScMW->view->requestMode(modeNormal);
646 		}
647 		else
648 		{
649 			if ((colorPalette->gradEditButton->isChecked()) || (colorPalette->editMeshColors->isChecked()))
650 			{
651 				if ((stroke == 5) || (stroke == 6) || (stroke == 7))
652 					m_ScMW->view->requestMode(modeEditMeshGradient);
653 				else if ((stroke == 8) || (stroke == 9) || (stroke == 10) || (stroke == 11))
654 					m_ScMW->view->requestMode(modeEditMeshPatch);
655 				else
656 					m_ScMW->view->requestMode(modeEditGradientVectors);
657 			}
658 			else
659 				m_ScMW->view->requestMode(modeNormal);
660 		}
661 		m_ScMW->view->RefreshGradient(m_item);
662 	}
663 }
664 
NewSpGradientM(double x1,double y1,double x2,double y2,double fx,double fy,double sg,double sk)665 void PropertiesPalette::NewSpGradientM(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk)
666 {
667 	if (!m_ScMW || m_ScMW->scriptIsRunning())
668 		return;
669 	if ((m_haveDoc) && (m_haveItem))
670 	{
671 		QRectF upRect;
672 		UndoTransaction trans;
673 		if (UndoManager::undoEnabled())
674 			trans = undoManager->beginTransaction(Um::Selection, Um::ILine, Um::GradPos + "o", "", Um::ILine);
675 		m_item->setGradientMaskStart(x1 / m_unitRatio, y1 / m_unitRatio);
676 		m_item->setGradientMaskEnd(x2 / m_unitRatio, y2 / m_unitRatio);
677 		m_item->setGradientMaskFocal(fx / m_unitRatio, fy / m_unitRatio);
678 		m_item->setGradientMaskScale(sg);
679 		m_item->setGradientMaskSkew(sk);
680 		if ((m_item->GrMask == GradMask_Linear) || (m_item->GrMask == GradMask_LinearLumAlpha))
681 		{
682 			m_item->setGradientMaskFocal(m_item->GrMaskStartX, m_item->GrMaskStartY);
683 		}
684 		m_item->update();
685 		if (trans)
686 		{
687 			trans.commit();
688 		}
689 		upRect = QRectF(m_item->gradientMaskStart(), m_item->gradientMaskEnd());
690 		double radEnd = distance(m_item->GrMaskEndX - m_item->GrMaskStartX, m_item->GrMaskEndY - m_item->GrMaskStartY);
691 		double rotEnd = xy2Deg(m_item->GrMaskEndX - m_item->GrMaskStartX, m_item->GrMaskEndY - m_item->GrMaskStartY);
692 		QTransform m;
693 		m.translate(m_item->GrMaskStartX, m_item->GrMaskStartY);
694 		m.rotate(rotEnd);
695 		m.rotate(-90);
696 		m.rotate(m_item->GrMaskSkew);
697 		m.translate(radEnd * m_item->GrMaskScale, 0);
698 		QPointF shP = m.map(QPointF(0,0));
699 		upRect |= QRectF(shP, m_item->gradientMaskEnd()).normalized();
700 		upRect |= QRectF(shP, m_item->gradientMaskStart()).normalized();
701 		upRect |= QRectF(shP, QPointF(0, 0)).normalized();
702 		upRect |= QRectF(shP, QPointF(m_item->width(), m_item->height())).normalized();
703 		upRect.translate(m_item->xPos(), m_item->yPos());
704 		m_doc->regionsChanged()->update(upRect.adjusted(-10.0, -10.0, 10.0, 10.0));
705 		m_doc->changed();
706 	}
707 }
708 
toggleGradientEditM()709 void PropertiesPalette::toggleGradientEditM()
710 {
711 	if (!m_ScMW || m_ScMW->scriptIsRunning())
712 		return;
713 	if ((m_haveDoc) && (m_haveItem))
714 	{
715 		m_ScMW->view->editStrokeGradient = 2;
716 		if (transparencyPalette->gradEditButton->isChecked())
717 			m_ScMW->view->requestMode(modeEditGradientVectors);
718 		else
719 			m_ScMW->view->requestMode(modeNormal);
720 	}
721 }
722 
updateColorList()723 void PropertiesPalette::updateColorList()
724 {
725 	if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
726 		return;
727 
728 	colorPalette->updateColorList();
729 	transparencyPalette->updateColorList();
730 	shadowPal->updateColorList();
731 
732 	assert (m_doc->PageColors.document());
733 }
734 
userActionOn()735 bool PropertiesPalette::userActionOn()
736 {
737 	return xyzPal->userActionOn();
738 }
739 
changeEvent(QEvent * e)740 void PropertiesPalette::changeEvent(QEvent *e)
741 {
742 	if (e->type() == QEvent::LanguageChange)
743 	{
744 		languageChange();
745 		return;
746 	}
747 	ScDockPalette::changeEvent(e);
748 }
749 
languageChange()750 void PropertiesPalette::languageChange()
751 {
752 	setWindowTitle( tr("Properties"));
753 
754 	TabStack->setItemText(idXYZItem, tr("X, Y, &Z"));
755 	TabStack->setItemText(idShadowItem, tr("Drop Shadow"));
756 	TabStack->setItemText(idShapeItem, tr("&Shape"));
757 	TabStack->setItemText(idLineItem, tr("&Line"));
758 	TabStack->setItemText(idColorsItem, tr("&Colors"));
759 	TabStack->setItemText(idTransparencyItem, tr("&Transparency"));
760 
761 	xyzPal->languageChange();
762 	shadowPal->languageChange();
763 	shapePal->languageChange();
764 	colorPalette->languageChange();
765 	linePal->languageChange();
766 }
767 
setGradientEditMode(bool on)768 void PropertiesPalette::setGradientEditMode(bool on)
769 {
770 	colorPalette->gradEditButton->setChecked(on);
771 }
772 
endPatchAdd()773 void PropertiesPalette::endPatchAdd()
774 {
775 	colorPalette->endPatchAdd();
776 }
777 
updateColorSpecialGradient()778 void PropertiesPalette::updateColorSpecialGradient()
779 {
780 	if (!m_haveDoc)
781 		return;
782 	if(m_doc->m_Selection->isEmpty())
783 		return;
784 
785 	PageItem *currItem=m_doc->m_Selection->itemAt(0);
786 	if (currItem)
787 	{
788 		if (m_ScMW->view->editStrokeGradient == 0)
789 			colorPalette->setSpecialGradient(currItem->GrStartX, currItem->GrStartY, currItem->GrEndX, currItem->GrEndY, currItem->GrFocalX, currItem->GrFocalY, currItem->GrScale, currItem->GrSkew, 0, 0);
790 		else if (m_ScMW->view->editStrokeGradient == 1)
791 			colorPalette->setSpecialGradient(currItem->GrStrokeStartX, currItem->GrStrokeStartY, currItem->GrStrokeEndX, currItem->GrStrokeEndY, currItem->GrStrokeFocalX, currItem->GrStrokeFocalY, currItem->GrStrokeScale, currItem->GrStrokeSkew, 0, 0);
792 		else if (m_ScMW->view->editStrokeGradient == 3)
793 			colorPalette->setSpecialGradient(currItem->GrControl1.x(), currItem->GrControl1.y(), currItem->GrControl2.x(), currItem->GrControl2.y(), currItem->GrControl3.x(), currItem->GrControl3.y(), currItem->GrControl4.x(), currItem->GrControl4.y(), 0, 0);
794 		else if (m_ScMW->view->editStrokeGradient == 4)
795 			colorPalette->setSpecialGradient(currItem->GrControl1.x(), currItem->GrControl1.y(), currItem->GrControl2.x(), currItem->GrControl2.y(), currItem->GrControl3.x(), currItem->GrControl3.y(), currItem->GrControl4.x(), currItem->GrControl4.y(), currItem->GrControl5.x(), currItem->GrControl5.y());
796 		else if ((m_ScMW->view->editStrokeGradient == 5) || (m_ScMW->view->editStrokeGradient == 6))
797 			colorPalette->setMeshPoint();
798 		else if (m_ScMW->view->editStrokeGradient == 8)
799 			colorPalette->setMeshPatchPoint();
800 		else if (m_ScMW->view->editStrokeGradient == 9)
801 			colorPalette->setMeshPatch();
802 		else if (currItem->isGroup())
803 			transparencyPalette->setSpecialGradient(currItem->GrMaskStartX, currItem->GrMaskStartY, currItem->GrMaskEndX, currItem->GrMaskEndY, currItem->GrMaskFocalX, currItem->GrMaskFocalY, currItem->GrMaskScale, currItem->GrMaskSkew);
804 	}
805 }
806 
setLocked(bool isLocked)807 void PropertiesPalette::setLocked(bool isLocked)
808 {
809 	shapePal->setLocked(isLocked);
810 }
811 
handleShapeEdit()812 void PropertiesPalette::handleShapeEdit()
813 {
814 	if (!m_ScMW || m_ScMW->scriptIsRunning())
815 		return;
816 	if ((m_haveDoc) && (m_haveItem))
817 		shapePal->setRoundRectEnabled(false);
818 }
819 
handleGradientChanged()820 void PropertiesPalette::handleGradientChanged()
821 {
822 	if (!m_ScMW || m_ScMW->scriptIsRunning())
823 		return;
824 	if ((m_haveDoc) && (m_haveItem))
825 	{
826 		VGradient vg(transparencyPalette->gradEdit->gradient());
827 		m_doc->itemSelection_SetMaskGradient(vg);
828 	}
829 }
830