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 #include <cassert>
9 
10 #include "commonstrings.h"
11 #include "printlanguagecombo.h"
12 #include "scribusstructs.h"
13 #include "util_printer.h"
14 
PrintLanguageCombo(QWidget * parent)15 PrintLanguageCombo::PrintLanguageCombo(QWidget* parent) : QComboBox(parent)
16 {
17 	setEditable(false);
18 
19 	addItem(CommonStrings::trPostScript1, (int) PrintLanguage::PostScript1);
20 	addItem(CommonStrings::trPostScript2, (int) PrintLanguage::PostScript2);
21 	addItem(CommonStrings::trPostScript3, (int) PrintLanguage::PostScript3);
22 
23 	setCurrentIndex(2);
24 }
25 
addLanguage(PrintLanguage prnLanguage)26 void PrintLanguageCombo::addLanguage(PrintLanguage prnLanguage)
27 {
28 	if (prnLanguage == PrintLanguage::PostScript1)
29 		addItem(CommonStrings::trPostScript1, (int) PrintLanguage::PostScript1);
30 	else if (prnLanguage == PrintLanguage::PostScript2)
31 		addItem(CommonStrings::trPostScript2, (int) PrintLanguage::PostScript2);
32 	else if (prnLanguage == PrintLanguage::PostScript3)
33 		addItem(CommonStrings::trPostScript3, (int) PrintLanguage::PostScript3);
34 	else if (prnLanguage == PrintLanguage::WindowsGDI)
35 		addItem(CommonStrings::trWindowsGDI, (int) PrintLanguage::WindowsGDI);
36 	else if (prnLanguage == PrintLanguage::PDF)
37 		addItem(CommonStrings::trPDF, (int) PrintLanguage::PDF);
38 }
39 
currentLanguage() const40 PrintLanguage PrintLanguageCombo::currentLanguage() const
41 {
42 	return static_cast<PrintLanguage>(this->currentData().toInt());
43 }
44 
findLanguage(PrintLanguage prnLanguage) const45 int PrintLanguageCombo::findLanguage(PrintLanguage prnLanguage) const
46 {
47 	for (int i = 0; i < this->count(); ++i)
48 	{
49 		PrintLanguage printLanguage = languageAt(i);
50 		if (printLanguage == prnLanguage)
51 			return i;
52 	}
53 
54 	return -1;
55 }
56 
hasLanguage(PrintLanguage prnLanguage) const57 bool PrintLanguageCombo::hasLanguage(PrintLanguage prnLanguage) const
58 {
59 	for (int i = 0; i < this->count(); ++i)
60 	{
61 		PrintLanguage printLanguage = languageAt(i);
62 		if (printLanguage == prnLanguage)
63 			return true;
64 	}
65 
66 	return false;
67 }
68 
hasPDF() const69 bool PrintLanguageCombo::hasPDF() const
70 {
71 	for (int i = 0; i < this->count(); ++i)
72 	{
73 		PrintLanguage prnLanguage = languageAt(i);
74 		if (prnLanguage == PrintLanguage::PDF)
75 			return true;
76 	}
77 
78 	return false;
79 }
80 
hasPostscript() const81 bool PrintLanguageCombo::hasPostscript() const
82 {
83 	for (int i = 0; i < this->count(); ++i)
84 	{
85 		PrintLanguage prnLanguage = languageAt(i);
86 		if (prnLanguage == PrintLanguage::PostScript1)
87 			return true;
88 		if (prnLanguage == PrintLanguage::PostScript2)
89 			return true;
90 		if (prnLanguage == PrintLanguage::PostScript3)
91 			return true;
92 	}
93 
94 	return false;
95 }
96 
languageAt(int index) const97 PrintLanguage PrintLanguageCombo::languageAt(int index) const
98 {
99 	assert(index >= 0 && index < this->count());
100 	return ((PrintLanguage) itemData(index).toInt());
101 }
102 
setCurrentLanguage(PrintLanguage prnLanguage)103 void PrintLanguageCombo::setCurrentLanguage(PrintLanguage prnLanguage)
104 {
105 	int newIndex = findData((int) prnLanguage);
106 	if (newIndex >= 0)
107 		setCurrentIndex(newIndex);
108 }
109 
setupLanguages(const QString & printerName,bool toFile)110 void PrintLanguageCombo::setupLanguages(const QString& printerName, bool toFile)
111 {
112 	int index = 0, oldPDLIndex = -1;
113 	QString oldPDL  = this->currentText();
114 
115 	clear();
116 
117 	PrintLanguageMap printLanguageMap = PrinterUtil::getPrintLanguageSupport(printerName, toFile);
118 	if (printLanguageMap.count() <= 0)
119 	{
120 #if defined(Q_OS_WIN32)
121 		printLanguageMap.insert(CommonStrings::trWindowsGDI, PrintLanguage::WindowsGDI);
122 #else
123 		printLanguageMap.insert(CommonStrings::trPostScript3, PrintLanguage::PostScript3);
124 #endif
125 	}
126 
127 	PrintLanguageMap::Iterator itEnd = printLanguageMap.end();
128 	for (auto it = printLanguageMap.begin(); it != itEnd; ++it)
129 	{
130 		addItem(it.key(), (int) it.value());
131 		if (it.key() == oldPDL)
132 			oldPDLIndex = index;
133 		index++;
134 	}
135 
136 	// Try to not default on PostScript 1 when switching
137 	// from a GDI printer to a Postscript printer
138 	if (oldPDLIndex < 0)
139 		oldPDLIndex = findText(CommonStrings::trPostScript3);
140 	if (oldPDLIndex < 0)
141 	{
142 		PrintLanguage defaultPrintLang = PrinterUtil::getDefaultPrintLanguage(printerName, toFile);
143 		oldPDLIndex = findData((int) defaultPrintLang);
144 	}
145 	if (oldPDLIndex < 0)
146 		oldPDLIndex = 0;
147 	setCurrentIndex(oldPDLIndex);
148 }
149 
changeEvent(QEvent * e)150 void PrintLanguageCombo::changeEvent(QEvent *e)
151 {
152 	if (e->type() == QEvent::LanguageChange)
153 	{
154 		languageChange();
155 		return;
156 	}
157 
158 	QWidget::changeEvent(e);
159 }
160 
languageChange()161 void PrintLanguageCombo::languageChange()
162 {
163 	for (int i = 0; i < this->count(); ++i)
164 	{
165 		PrintLanguage prnLanguage = languageAt(i);
166 		if (prnLanguage == PrintLanguage::PostScript1)
167 			setItemText(i, CommonStrings::trPostScript1);
168 		if (prnLanguage == PrintLanguage::PostScript2)
169 			setItemText(i, CommonStrings::trPostScript2);
170 		if (prnLanguage == PrintLanguage::PostScript3)
171 			setItemText(i, CommonStrings::trPostScript3);
172 		if (prnLanguage == PrintLanguage::WindowsGDI)
173 			setItemText(i, CommonStrings::trWindowsGDI);
174 		if (prnLanguage == PrintLanguage::PDF)
175 			setItemText(i, CommonStrings::trPDF);
176 	}
177 }