1 /****************************************************************************
2 **
3 ** This file is part of the LibreCAD project, a 2D CAD program
4 **
5 ** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl)
6 ** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
7 **
8 **
9 ** This file may be distributed and/or modified under the terms of the
10 ** GNU General Public License version 2 as published by the Free Software
11 ** Foundation and appearing in the file gpl-2.0.txt included in the
12 ** packaging of this file.
13 **
14 ** This program is distributed in the hope that it will be useful,
15 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ** GNU General Public License for more details.
18 **
19 ** You should have received a copy of the GNU General Public License
20 ** along with this program; if not, write to the Free Software
21 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22 **
23 ** This copyright notice MUST APPEAR in all copies of the script!
24 **
25 **********************************************************************/
26 #include "qg_dlgtext.h"
27 
28 #include <QTextCodec>
29 #include <QTextStream>
30 #include <QFileDialog>
31 #include "rs_system.h"
32 #include "rs_settings.h"
33 #include "rs_font.h"
34 #include "rs_graphic.h"
35 #include "rs_math.h"
36 
37 /*
38  *  Constructs a QG_DlgText as a child of 'parent', with the
39  *  name 'name' and widget flags set to 'f'.
40  *
41  *  The dialog will by default be modeless, unless you set 'modal' to
42  *  true to construct a modal dialog.
43  */
QG_DlgText(QWidget * parent,bool modal,Qt::WindowFlags fl)44 QG_DlgText::QG_DlgText(QWidget* parent, bool modal, Qt::WindowFlags fl)
45     : QDialog(parent, fl), saveSettings(true)
46 {
47     setModal(modal);
48     setupUi(this);
49 
50     init();
51 }
52 
53 /*
54  *  Destroys the object and frees any allocated resources
55  */
~QG_DlgText()56 QG_DlgText::~QG_DlgText()
57 {
58     destroy();
59     // no need to delete child widgets, Qt does it all for us
60 }
61 
62 /*
63  *  Sets the strings of the subwidgets using the current
64  *  language.
65  */
languageChange()66 void QG_DlgText::languageChange()
67 {
68     retranslateUi(this);
69 }
70 
init()71 void QG_DlgText::init() {
72     cbFont->init();
73     font=NULL;
74     text = NULL;
75     isNew = false;
76     leOblique->setDisabled(true);
77     updateUniCharComboBox(0);
78     updateUniCharButton(0);
79 }
80 
81 
updateUniCharComboBox(int)82 void QG_DlgText::updateUniCharComboBox(int) {
83     QString t = cbUniPage->currentText();
84     int i1 = t.indexOf('-');
85     int i2 = t.indexOf(']');
86     int min = t.mid(1, i1-1).toInt(NULL, 16);
87     int max = t.mid(i1+1, i2-i1-1).toInt(NULL, 16);
88 
89     cbUniChar->clear();
90     for (int c=min; c<=max; c++) {
91         char buf[5];
92         snprintf(buf, 5, "%04X", c);
93         cbUniChar->addItem(QString("[%1] %2").arg(buf).arg(QChar(c)));
94     }
95 }
96 
97 //set saveText to false, so, settings won't be saved during destroy, feature request#3445306
reject()98 void QG_DlgText::reject() {
99     saveSettings=false;
100     QDialog::reject();
101 }
102 
destroy()103 void QG_DlgText::destroy() {
104     if (isNew&&saveSettings) {
105         RS_SETTINGS->beginGroup("/Draw");
106         RS_SETTINGS->writeEntry("/TextHeight", leHeight->text());
107         RS_SETTINGS->writeEntry("/TextFont", cbFont->currentText());
108         RS_SETTINGS->writeEntry("/TextAlignmentT", getAlignment());
109         RS_SETTINGS->writeEntry("/TextWidthRelation", leWidthRel->text());
110         RS_SETTINGS->writeEntry("/TextStringT", teText->text());
111         RS_SETTINGS->writeEntry("/TextAngle", leAngle->text());
112         RS_SETTINGS->endGroup();
113     }
114 }
115 
116 
117 /**
118  * Sets the text entity represented by this dialog.
119  */
setText(RS_Text & t,bool isNew)120 void QG_DlgText::setText(RS_Text& t, bool isNew) {
121     text = &t;
122     this->isNew = isNew;
123 
124     QString fon;
125     QString height;
126     QString def;
127     QString alignment;
128     //QString letterSpacing;
129     //QString wordSpacing;
130     QString widthRelation;
131     QString str;
132     //QString shape;
133     QString angle;
134 
135     if (isNew) {
136         wPen->hide();
137         lLayer->hide();
138         cbLayer->hide();
139         RS_SETTINGS->beginGroup("/Draw");
140         //default font depending on locale
141         //default font depending on locale (RLZ-> check this: QLocale::system().name() returns "fr_FR")
142         QByteArray iso = RS_System::localeToISO( QLocale::system().name().toLocal8Bit() );
143 //        QByteArray iso = RS_System::localeToISO( QTextCodec::locale() );
144         if (iso=="ISO8859-1") {
145              fon = RS_SETTINGS->readEntry("/TextFont", "normallatin1");
146         } else if (iso=="ISO8859-2") {
147              fon = RS_SETTINGS->readEntry("/TextFont", "normallatin2");
148         } else if (iso=="ISO8859-7") {
149              fon = RS_SETTINGS->readEntry("/TextFont", "greekc");
150         } else if (iso=="KOI8-U" || iso=="KOI8-R") {
151              fon = RS_SETTINGS->readEntry("/TextFont", "cyrillic_ii");
152         } else {
153              fon = RS_SETTINGS->readEntry("/TextFont", "standard");
154                 }
155         height = RS_SETTINGS->readEntry("/TextHeight", "1.0");
156         def = RS_SETTINGS->readEntry("/TextDefault", "1");
157         alignment = RS_SETTINGS->readEntry("/TextAlignmentT", "7");
158         widthRelation = RS_SETTINGS->readEntry("/TextWidthRelation", "1");
159         str = RS_SETTINGS->readEntry("/TextStringT", "");
160         angle = RS_SETTINGS->readEntry("/TextAngle", "0");
161         RS_SETTINGS->endGroup();
162     } else {
163         fon = text->getStyle();
164         setFont(fon);
165         height = QString("%1").arg(text->getHeight());
166         widthRelation = QString("%1").arg(text->getWidthRel());
167         alignment = QString("%1").arg(text->getAlignment());
168         str = text->getText();
169         angle = QString("%1").arg(RS_Math::rad2deg(text->getAngle()));
170         wPen->setPen(text->getPen(false), true, false, "Pen");
171         RS_Graphic* graphic = text->getGraphic();
172         if (graphic) {
173             cbLayer->init(*(graphic->getLayerList()), false, false);
174         }
175         RS_Layer* lay = text->getLayer(false);
176         if (lay) {
177             cbLayer->setLayer(*lay);
178         }
179     }
180 
181     setFont(fon);
182     leHeight->setText(height);
183     setAlignment(alignment.toInt());
184 //    setwidthRel(widthRelation.toDouble());
185     leWidthRel->setText(widthRelation);
186     teText->setText(str);
187     leAngle->setText(angle);
188     teText->setFocus();
189     teText->selectAll();
190 }
191 
192 
193 /**
194  * Updates the text entity represented by the dialog to fit the choices of the user.
195  */
updateText()196 void QG_DlgText::updateText() {
197     if (text) {
198         text->setStyle(cbFont->currentText());
199         text->setHeight(leHeight->text().toDouble());
200         text->setWidthRel(leWidthRel->text().toDouble());
201 
202         text->setText(teText->text());
203         text->setAlignment(getAlignment());
204         text->setAngle(RS_Math::deg2rad(leAngle->text().toDouble()));
205     }
206     if (text && !isNew) {
207         text->setPen(wPen->getPen());
208         text->setLayer(cbLayer->currentText());
209         text->update();
210     }
211 }
212 
213 
214 /*void QG_DlgText::setwidthRel(double rel) {
215     lWidthRel->setText(rel);
216 }*/
217 
setAlignmentTL()218 void QG_DlgText::setAlignmentTL() {
219     setAlignment(1);
220 }
221 
setAlignmentTC()222 void QG_DlgText::setAlignmentTC() {
223     setAlignment(2);
224 }
225 
setAlignmentTR()226 void QG_DlgText::setAlignmentTR() {
227     setAlignment(3);
228 }
229 
setAlignmentML()230 void QG_DlgText::setAlignmentML() {
231     setAlignment(4);
232 }
233 
setAlignmentMC()234 void QG_DlgText::setAlignmentMC() {
235     setAlignment(5);
236 }
237 
setAlignmentMR()238 void QG_DlgText::setAlignmentMR() {
239     setAlignment(6);
240 }
241 
setAlignmentLL()242 void QG_DlgText::setAlignmentLL() {
243     setAlignment(7);
244 }
245 
setAlignmentLC()246 void QG_DlgText::setAlignmentLC() {
247     setAlignment(8);
248 }
249 
setAlignmentLR()250 void QG_DlgText::setAlignmentLR() {
251     setAlignment(9);
252 }
253 
setAlignmentBL()254 void QG_DlgText::setAlignmentBL() {
255     setAlignment(10);
256 }
257 
setAlignmentBC()258 void QG_DlgText::setAlignmentBC() {
259     setAlignment(11);
260 }
261 
setAlignmentBR()262 void QG_DlgText::setAlignmentBR() {
263     setAlignment(12);
264 }
265 
setAlignmentFit()266 void QG_DlgText::setAlignmentFit() {
267     setAlignment(13);
268 }
269 
setAlignmentAlign()270 void QG_DlgText::setAlignmentAlign() {
271     setAlignment(14);
272 }
273 
setAlignmentMiddle()274 void QG_DlgText::setAlignmentMiddle() {
275     setAlignment(15);
276 }
277 
setAlignment(int a)278 void QG_DlgText::setAlignment(int a) {
279     bTL->setChecked(false);
280     bTC->setChecked(false);
281     bTR->setChecked(false);
282     bML->setChecked(false);
283     bMC->setChecked(false);
284     bMR->setChecked(false);
285     bLL->setChecked(false);
286     bLC->setChecked(false);
287     bLR->setChecked(false);
288     bBL->setChecked(false);
289     bBC->setChecked(false);
290     bBR->setChecked(false);
291     rbFit->setChecked(false);
292     rbAligned->setChecked(false);
293     rbMiddle->setChecked(false);
294 
295     switch (a) {
296     case 1:
297         bTL->setChecked(true);
298         break;
299     case 2:
300         bTC->setChecked(true);
301         break;
302     case 3:
303         bTR->setChecked(true);
304         break;
305     case 4:
306         bML->setChecked(true);
307         break;
308     case 5:
309         bMC->setChecked(true);
310         break;
311     case 6:
312         bMR->setChecked(true);
313         break;
314     case 7:
315         bLL->setChecked(true);
316         break;
317     case 8:
318         bLC->setChecked(true);
319         break;
320     case 9:
321         bLR->setChecked(true);
322         break;
323     case 10:
324         bBL->setChecked(true);
325         break;
326     case 11:
327         bBC->setChecked(true);
328         break;
329     case 12:
330         bBR->setChecked(true);
331         break;
332     case 13:
333         rbFit->setChecked(true);
334         break;
335     case 14:
336         rbAligned->setChecked(true);
337         break;
338     case 15:
339         rbMiddle->setChecked(true);
340         break;
341     default:
342         break;
343     }
344 }
345 
getAlignment()346 int QG_DlgText::getAlignment() {
347     if (bTL->isChecked()) {
348         return 1;
349     } else if (bTC->isChecked()) {
350         return 2;
351     } else if (bTR->isChecked()) {
352         return 3;
353     } else if (bML->isChecked()) {
354         return 4;
355     } else if (bMC->isChecked()) {
356         return 5;
357     } else if (bMR->isChecked()) {
358         return 6;
359     } else if (bLL->isChecked()) {
360         return 7;
361     } else if (bLC->isChecked()) {
362         return 8;
363     } else if (bLR->isChecked()) {
364         return 9;
365     } else if (bBL->isChecked()) {
366         return 10;
367     } else if (bBC->isChecked()) {
368         return 11;
369     } else if (bBR->isChecked()) {
370         return 12;
371     } else if (rbFit->isChecked()) {
372         return 13;
373     } else if (rbAligned->isChecked()) {
374         return 14;
375     } else if (rbMiddle->isChecked()) {
376         return 15;
377     }
378 
379     return 7;
380 }
381 
setFont(const QString & f)382 void QG_DlgText::setFont(const QString& f) {
383     cbFont->setCurrentIndex( cbFont->findText(f) );
384     font = cbFont->getFont();
385 //    defaultChanged(false);
386 }
387 
388 /*void QG_DlgText::defaultChanged(bool) {
389     if (cbDefault->isChecked() && font) {
390         leLineSpacingFactor->setText(
391                         QString("%1").arg(font->getLineSpacingFactor()));
392     }
393 }*/
394 
loadText()395 void QG_DlgText::loadText() {
396     QString fn = QFileDialog::getOpenFileName( this, QString(), QString());
397     if (!fn.isEmpty()) {
398         load(fn);
399     }
400 }
401 
load(const QString & fn)402 void QG_DlgText::load(const QString& fn) {
403     QFile f(fn);
404     if (!f.open(QIODevice::ReadOnly)) {
405         return;
406     }
407 
408     QTextStream ts(&f);
409     teText->setText(ts.readAll());
410 }
411 
saveText()412 void QG_DlgText::saveText() {
413     QString fn = QFileDialog::getSaveFileName(this, QString(), QString());
414     if (!fn.isEmpty()) {
415         save(fn);
416     }
417 }
418 
save(const QString & fn)419 void QG_DlgText::save(const QString& fn) {
420     QString text = teText->text();
421     QFile f(fn);
422     if (f.open(QIODevice::WriteOnly)) {
423         QTextStream t(&f);
424         t << text;
425         f.close();
426     }
427 }
428 
insertSymbol(int)429 void QG_DlgText::insertSymbol(int) {
430     QString str = cbSymbol->currentText();
431     int i=str.indexOf('(');
432     if (i!=-1) {
433 //        teText->textCursor().insertText(QString("%1").arg(str.at(i+1)));
434         teText->insert(QString("%1").arg(str.at(i+1)));
435     }
436 }
437 
updateUniCharButton(int)438 void QG_DlgText::updateUniCharButton(int) {
439     QString t = cbUniChar->currentText();
440     int i1 = t.indexOf(']');
441     int c = t.mid(1, i1-1).toInt(NULL, 16);
442     bUnicode->setText(QString("%1").arg(QChar(c)));
443 }
444 
insertChar()445 void QG_DlgText::insertChar() {
446     QString t = cbUniChar->currentText();
447     int i1 = t.indexOf(']');
448     int c = t.mid(1, i1-1).toInt(NULL, 16);
449 //    teText->textCursor().insertText( QString("%1").arg(QChar(c)) );
450     teText->insert( QString("%1").arg(QChar(c)) );
451 }
452 
453