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