Subversion Repositories Scribus

Rev

Rev 5093 | Rev 5739 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 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
*/
1202 fschmid 7
#include <qtextcodec.h>
8
#include <qcursor.h>
9
#include <qtimer.h>
10
#include <qlabel.h>
3698 cbradney 11
#include <qpixmap.h>
1202 fschmid 12
#include <qpushbutton.h>
13
#include <qtable.h>
14
#include <qlayout.h>
15
#include <qtooltip.h>
16
#include <qstringlist.h>
17
#include <qcombobox.h>
18
#include <qfont.h>
19
#include <qpopupmenu.h>
3698 cbradney 20
#include <qwidget.h>
1202 fschmid 21
 
22
#include "scribus.h"
3698 cbradney 23
#include "scribusdoc.h"
24
#include "scribusview.h"
1202 fschmid 25
#include "fontcombo.h"
26
#include "charselect.h"
27
#include "charselect.moc"
3543 avox 28
#include "sccombobox.h"
1202 fschmid 29
#include "scpainter.h"
2688 craig 30
 
31
#include "scconfig.h"
32
 
1202 fschmid 33
#include <ft2build.h>
34
#include FT_FREETYPE_H
35
#include FT_OUTLINE_H
36
#include FT_GLYPH_H
2529 craig 37
#include "scfontmetrics.h"
38
#include "util.h"
1202 fschmid 39
 
1896 cbradney 40
#ifdef QT_MAC
41
Zoom::Zoom(QWidget* parent, QPixmap pix, uint val) : QDialog( parent, "Edit", false, WStyle_Customize | WStyle_NoBorder | WType_Popup)
42
#else
1888 fschmid 43
Zoom::Zoom(QWidget* parent, QPixmap pix, uint val) : QDialog( parent, "Edit", false, WStyle_Customize | WStyle_NoBorder)
1896 cbradney 44
#endif
1202 fschmid 45
{
1885 cbradney 46
        int newwidth=pix.width()+2;
47
        int newheight=pix.height()+20;
48
        resize(newwidth,newheight);
49
        setMinimumSize(QSize(newwidth,newheight));
50
        setMaximumSize(QSize(newwidth,newheight));
51
        pixm = pix;
1202 fschmid 52
        QString tmp;
53
        tmp.sprintf("%04X", val);
54
        valu = "0x"+tmp;
55
}
56
 
57
void Zoom::paintEvent(QPaintEvent *)
58
{
59
        QPainter p;
60
        p.begin(this);
61
        p.setPen(black);
62
        p.setBrush(NoBrush);
63
        p.drawRect(0, 0, width(), height());
64
        p.drawPixmap(1, 1, pixm);
65
        p.drawText(5, height()-3, valu);
66
        p.end();
67
}
68
 
4026 craig 69
ChTable::ChTable(CharSelect* parent, ScribusMainWindow *pl) : QTable(parent)
1202 fschmid 70
{
71
        watchTimer = new QTimer(this);
72
//      connect(watchTimer, SIGNAL(timeout()), this, SLOT(showAlternate()));
73
        mPressed = false;
74
        alternate = false;
75
        rowA = 0;
76
        colA = 0;
77
        ap = pl;
78
        par = parent;
1888 fschmid 79
        dia = 0;
3849 subik 80
        QToolTip::add(this, "<qt>" + tr("You can see a thumbnail if you press and hold down the right mouse button. The Insert key inserts a Glyph into the Selection below and the Delete key removes the last inserted one") + "</qt>");
1202 fschmid 81
}
82
 
3455 avox 83
 
3849 subik 84
QRect ChTable::cellGeometry ( int /*row*/, int /*col*/ ) const
3455 avox 85
{
4534 fschmid 86
        int widthHeight = QMAX(18 + qRound(-(*ap->doc->AllFonts)[par->fontInUse]->numDescender * 18) + 5, 18);
4565 fschmid 87
        return QRect(0, 0, widthHeight, widthHeight+20);
3455 avox 88
 
89
}
90
 
91
 
3849 subik 92
void ChTable::paintCell( QPainter * qp, int row, int col, const QRect & cr, bool /*selected*/, const QColorGroup & /*cg*/ )
3455 avox 93
{
94
        static QPixmap pixm;
95
 
3849 subik 96
        uint cc = row * 16 + col;
3455 avox 97
        if (cc >= maxCount)
98
        return;
99
 
100
        QRect sz = cellGeometry(row, col);
101
        pixm.resize(sz.width(), sz.height());
102
 
103
        ScPainter *p = new ScPainter(&pixm, cr.width(), cr.height());
104
        p->clear();
105
        pixm.fill(white);
106
        QWMatrix chma;
4565 fschmid 107
        chma.scale(1.6, 1.6);
3455 avox 108
        qp->eraseRect(0, 0, cr.width(), cr.height());
4565 fschmid 109
        QFont fo = qp->font();
4578 fschmid 110
        fo.setPixelSize(9);
4565 fschmid 111
        qp->setFont(fo);
3455 avox 112
        static FPointArray gly;
113
        int len = (*ap->doc->AllFonts)[par->fontInUse]->GlyphArray[par->characters[cc]].Outlines.size();
114
        gly.resize(len);
115
        gly.putPoints(0, len, (*ap->doc->AllFonts)[par->fontInUse]->GlyphArray[par->characters[cc]].Outlines );
116
        if (gly.size() > 4)
117
        {
118
                gly.map(chma);
4565 fschmid 119
                double ww = sz.width() - (*ap->doc->AllFonts)[par->fontInUse]->CharWidth[par->characters[cc]]*16;
3455 avox 120
                p->translate(ww / 2, 1);
121
                p->setBrush(black);
122
                p->setFillMode(1);
123
                p->setupPolygon(&gly);
124
                p->fillPath();
125
                p->end();
126
                int x = QMAX(0, (cr.width() - sz.width()) / 2);
4528 fschmid 127
                qp->drawPixmap(x, 1, pixm);
128
                QString tmp;
129
                tmp.sprintf("%04X", par->characters[row*16+col]);
4578 fschmid 130
//              tmp.prepend("0x");
4528 fschmid 131
                qp->setPen(black);
4565 fschmid 132
                qp->drawText(QRect(2, cr.height()-10, cr.width()-4, 9),Qt::AlignCenter, tmp);
3455 avox 133
        }
3849 subik 134
        qp->setPen(gray);
3455 avox 135
        qp->drawRect(0, 0, cr.width(), cr.height());
136
        delete p;
137
}
138
 
139
 
1202 fschmid 140
void ChTable::keyPressEvent(QKeyEvent *k)
141
{
142
        switch (k->key())
143
        {
144
                case Key_Backspace:
145
                case Key_Delete:
146
                        emit delChar();
147
                        break;
148
                case Key_Insert:
149
                        emit selectChar(currentRow(), currentColumn());
150
                        break;
151
        }
152
        QTable::keyPressEvent(k);
153
}
154
 
155
void ChTable::contentsMousePressEvent(QMouseEvent* e)
156
{
157
        e->accept();
158
        uint r = rowAt(e->pos().y());
159
        uint c = columnAt(e->pos().x());
160
        QString font;
161
        font = par->fontInUse;
162
        mPressed = true;
163
        alternate = false;
164
        if ((e->button() == RightButton) && ((r*16+c) < maxCount))
165
        {
166
                watchTimer->stop();
167
                int bh = 48 + qRound(-(*ap->doc->AllFonts)[font]->numDescender * 48) + 3;
168
                QPixmap pixm(bh,bh);
169
                ScPainter *p = new ScPainter(&pixm, bh, bh);
170
                p->clear();
171
                pixm.fill(white);
172
                QWMatrix chma;
173
                chma.scale(4.8, 4.8);
174
                FPointArray gly = (*ap->doc->AllFonts)[font]->GlyphArray[par->characters[r*16+c]].Outlines.copy();
175
                double ww = bh - (*ap->doc->AllFonts)[font]->CharWidth[par->characters[r*16+c]]*48;
176
                if (gly.size() > 4)
177
                {
178
                        gly.map(chma);
179
                        p->translate(ww / 2, 1);
180
                        p->setBrush(black);
181
                        p->setFillMode(1);
182
                        p->setupPolygon(&gly);
183
                        p->fillPath();
184
                        p->end();
185
                }
186
                delete p;
187
                dia = new Zoom(this, pixm, par->characters[r*16+c]);
188
                QPoint ps = QCursor::pos();
189
                dia->move(ps.x()-2, ps.y()-2);
1888 fschmid 190
                dia->setModal(false);
1202 fschmid 191
                dia->show();
192
        }
193
/*      if (e->button() == LeftButton)
194
        {
195
                rowA = rowAt(e->pos().y());
196
                colA = columnAt(e->pos().x());
197
                watchTimer->start(3000, true);
198
        } */
199
        QTable::contentsMousePressEvent(e);
200
}
201
 
202
void ChTable::contentsMouseReleaseEvent(QMouseEvent* e)
203
{
204
        e->accept();
205
        watchTimer->stop();
206
        if ((e->button() == RightButton) && (mPressed))
207
        {
1888 fschmid 208
                if (dia)
209
                {
210
                        dia->close();
211
                        delete dia;
212
                        dia = 0;
213
                }
1202 fschmid 214
        }
215
        if ((e->button() == LeftButton) && (!alternate))
216
                emit selectChar(rowAt(e->pos().y()), columnAt(e->pos().x()));
217
        mPressed = false;
218
        alternate = false;
219
        QTable::contentsMouseReleaseEvent(e);
220
}
221
 
222
void ChTable::showAlternate()
223
{
224
/*      watchTimer->stop();
225
        alternate = true;
226
        QString font;
227
        QString chToIns = "";
228
        font = par->fontInUse;
229
        uint baseChar = rowA*16+colA;
230
        if (baseChar < maxCount)
231
        {
232
                QPopupMenu *pmen = new QPopupMenu();
233
                chToIns = QChar(par->characters[baseChar]);
3500 avox 234
                pmen->insertItem(FontSample((*ap->doc->AllFonts)[font], 20, chToIns, paletteBackgroundColor(), true));
1202 fschmid 235
                if ((*ap->doc->AllFonts)[font]->CharWidth.contains(par->characters[baseChar] + 0xF720))
236
                {
237
                        chToIns = QChar(par->characters[baseChar] + 0xF720);
3500 avox 238
                        pmen->insertItem(FontSample((*ap->doc->AllFonts)[font], 20, chToIns, paletteBackgroundColor(), true));
1202 fschmid 239
                }
240
                int re = pmen->indexOf(pmen->exec(QCursor::pos()));
241
                delete pmen;
242
        } */
243
}
244
 
3207 craig 245
CharSelect::CharSelect( QWidget* parent, PageItem *item) : QDialog( parent, "CharSelect", true, 0 )
1202 fschmid 246
{
4026 craig 247
        fontInUse = ScMW->doc->CurrFont;
3207 craig 248
        needReturn = false;
3475 cbradney 249
        installEventFilter(this);
4026 craig 250
        run(parent, item, ScMW);
3207 craig 251
}
252
 
253
CharSelect::CharSelect( QWidget* parent, PageItem *item, QString font) : QDialog( parent, "CharSelect", true, 0 )
254
{
1202 fschmid 255
        fontInUse = font;
3207 craig 256
        needReturn = true;
3475 cbradney 257
        installEventFilter(this);
4026 craig 258
        run(parent, item, ScMW);
3207 craig 259
}
260
 
261
 
262
const QString & CharSelect::getCharacters()
263
{
264
        return m_characters;
265
}
266
 
267
 
4026 craig 268
void CharSelect::run( QWidget* /*parent*/, PageItem *item, ScribusMainWindow *pl)
3207 craig 269
{
270
        setCaption( tr( "Select Character:" )+" "+fontInUse );
1202 fschmid 271
        ite = item;
272
        ap = pl;
273
        setIcon(loadIcon("AppIcon.png"));
274
        zAuswahlLayout = new QVBoxLayout( this );
275
        zAuswahlLayout->setSpacing( 6 );
276
        zAuswahlLayout->setMargin( 11 );
277
 
278
        selectionsLayout = new QHBoxLayout();
279
        selectionsLayout->setSpacing( 6 );
280
        selectionsLayout->setMargin( 0 );
281
        fontLabel = new QLabel( this, "fontLabel" );
282
        fontLabel->setText( tr( "Font:" ) );
283
        selectionsLayout->addWidget( fontLabel );
2834 cbradney 284
        fontSelector = new FontCombo(this);
1202 fschmid 285
        fontSelector->setMaximumSize(190, 30);
286
        fontSelector->setCurrentText(fontInUse);
287
        selectionsLayout->addWidget( fontSelector );
3207 craig 288
        if ((ap->doc->currentParaStyle > 4) || needReturn)
1202 fschmid 289
                fontSelector->setEnabled(false);
290
        rangeLabel = new QLabel( this, "fontLabel" );
291
        rangeLabel->setText( tr( "Character Class:" ) );
292
        selectionsLayout->addWidget( rangeLabel );
3680 cbradney 293
        rangeSelector = new ScComboBox( false, this, "rangeSelector" );
1202 fschmid 294
        characterClass = 0;
295
        selectionsLayout->addWidget( rangeSelector );
296
        QSpacerItem* spacer2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
297
        selectionsLayout->addItem( spacer2 );
298
        zAuswahlLayout->addLayout(selectionsLayout);
299
        zTabelle = new ChTable( this, pl);
300
        zTabelle->setNumCols( 16 );
301
        zTabelle->setLeftMargin(0);
302
        zTabelle->verticalHeader()->hide();
303
        zTabelle->setTopMargin(0);
304
        zTabelle->horizontalHeader()->hide();
305
        zTabelle->setSorting(false);
306
        zTabelle->setSelectionMode(QTable::NoSelection);
307
        zTabelle->setColumnMovingEnabled(false);
308
        zTabelle->setRowMovingEnabled(false);
309
        scanFont();
2640 cbradney 310
        zAuswahlLayout->addWidget( zTabelle );
4578 fschmid 311
 
312
        layout3 = new QHBoxLayout;
313
        layout3->setSpacing( 6 );
314
        layout3->setMargin( 0 );
315
 
316
        layout2 = new QVBoxLayout;
317
        layout2->setSpacing( 6 );
318
        layout2->setMargin( 0 );
1202 fschmid 319
 
4578 fschmid 320
        insCode = new QLineEdit( this, "insText" );
321
        insCode->setMaxLength(4);
322
        insCode->setInputMask(">NNNN");
4582 fschmid 323
        insCode->clear();
4660 cbradney 324
        insText = new QLabel( insCode, tr("&Insert Code:"), this, "insText" );
325
        insCode->setFixedWidth(insText->width());
326
        layout2->addWidget( insText );
4578 fschmid 327
        layout2->addWidget( insCode );
328
 
329
        layout3->addLayout(layout2, Qt::AlignLeft);
330
 
1202 fschmid 331
        sample = new QLabel( this, "Zeichen" );
332
        sample->setFrameShape(QFrame::Box);
333
        sample->setPaletteBackgroundColor(paletteBackgroundColor());
4578 fschmid 334
        sample->setMinimumHeight(52);
335
        sample->setMinimumWidth(460);
336
        layout3->addWidget( sample );
337
        zAuswahlLayout->addLayout( layout3 );
1202 fschmid 338
 
339
        layout1 = new QHBoxLayout;
340
        layout1->setSpacing( 6 );
341
        layout1->setMargin( 0 );
342
        QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
343
        layout1->addItem( spacer );
344
 
1284 fschmid 345
        insertButton = new QPushButton( tr( "&Insert" ), this, "insertButton" );
1202 fschmid 346
        layout1->addWidget( insertButton );
1284 fschmid 347
        deleteButton = new QPushButton( tr("C&lear"), this, "deleteButton" );
1202 fschmid 348
        layout1->addWidget( deleteButton );
1284 fschmid 349
        closeButton = new QPushButton( tr("&Close"), this, "closeButton" );
1202 fschmid 350
        layout1->addWidget( closeButton );
351
        zAuswahlLayout->addLayout( layout1 );
352
        delEdit();
353
//tooltips
354
        QToolTip::add( insertButton, tr( "Insert the characters at the cursor in the text" ) );
355
        QToolTip::add( deleteButton, tr( "Delete the current selection(s)." ) );
4660 cbradney 356
        QToolTip::add( closeButton, tr( "Close this dialog and return to text editing" ) );
357
        QToolTip::add( insCode, tr( "Type in a four digit unicode value directly here" ) );
1202 fschmid 358
        // signals and slots connections
359
        connect(closeButton, SIGNAL(clicked()), this, SLOT(accept()));
360
        connect(deleteButton, SIGNAL(clicked()), this, SLOT(delEdit()));
361
        connect(insertButton, SIGNAL(clicked()), this, SLOT(insChar()));
362
        connect(zTabelle, SIGNAL(selectChar(uint, uint)), this, SLOT(newChar(uint, uint)));
363
        connect(zTabelle, SIGNAL(delChar()), this, SLOT(delChar()));
364
        connect(fontSelector, SIGNAL(activated(int)), this, SLOT(newFont(int)));
365
        connect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int)));
4578 fschmid 366
        connect(insCode, SIGNAL(returnPressed()), this, SLOT(newChar()));
367
        connect(insCode, SIGNAL(lostFocus()), this, SLOT(newChar()));
1202 fschmid 368
        setupRangeCombo();
3475 cbradney 369
        newCharClass(0);
1202 fschmid 370
}
371
 
372
void CharSelect::scanFont()
373
{
374
        FT_Face face;
375
        FT_ULong  charcode;
376
        FT_UInt   gindex;
377
        gindex = 0;
378
        allClasses.clear();
379
        charactersFull.clear();
380
        charactersLatin1.clear();
381
        charactersLatin1Supplement.clear();
382
        charactersLatinExtendedA.clear();
383
        charactersLatinExtendedB.clear();
384
        charactersGeneralPunctuation.clear();
385
        charactersSuperSubscripts.clear();
386
        charactersCurrencySymbols.clear();
387
        charactersLetterlikeSymbols.clear();
388
        charactersNumberForms.clear();
389
        charactersArrows.clear();
390
        charactersMathematicalOperators.clear();
391
        charactersBoxDrawing.clear();
392
        charactersBlockElements.clear();
393
        charactersGeometricShapes.clear();
394
        charactersMiscellaneousSymbols.clear();
395
        charactersDingbats.clear();
396
        charactersSmallFormVariants.clear();
397
        charactersAlphabeticPresentationForms.clear();
398
        charactersSpecial.clear();
399
        charactersGreek.clear();
400
        charactersGreekExtended.clear();
401
        charactersCyrillic.clear();
402
        charactersCyrillicSupplement.clear();
403
        charactersArabic.clear();
404
        charactersArabicPresentationFormsA.clear();
405
        charactersArabicPresentationFormsB.clear();
406
        charactersHebrew.clear();
407
        face = ap->doc->FFonts[fontInUse];
1885 cbradney 408
        if (!face) {
409
                return;
410
        }
2640 cbradney 411
        setBestEncoding(face);
1202 fschmid 412
        charcode = FT_Get_First_Char(face, &gindex );
413
        while (gindex != 0)
414
        {
415
                charactersFull.append(charcode);
416
                if ((charcode >= 0x0020 ) && (charcode <= 0x007F))
417
                        charactersLatin1.append(charcode);
418
                else if ((charcode >= 0x0080 ) && (charcode <= 0x00FF))
419
                        charactersLatin1Supplement.append(charcode);
420
                else if ((charcode >= 0x0100 ) && (charcode <= 0x017F))
421
                        charactersLatinExtendedA.append(charcode);
422
                else if ((charcode >= 0x0180 ) && (charcode <= 0x024F))
423
                        charactersLatinExtendedB.append(charcode);
424
                else if ((charcode >= 0x0370 ) && (charcode <= 0x03FF))
425
                        charactersGreek.append(charcode);
426
                else if ((charcode >= 0x0400 ) && (charcode <= 0x04FF))
427
                        charactersCyrillic.append(charcode);
428
                else if ((charcode >= 0x0500 ) && (charcode <= 0x052F))
429
                        charactersCyrillicSupplement.append(charcode);
430
                else if ((charcode >= 0x0590 ) && (charcode <= 0x05FF))
431
                        charactersHebrew.append(charcode);
432
                else if ((charcode >= 0x0600 ) && (charcode <= 0x06FF))
433
                        charactersArabic.append(charcode);
434
                else if ((charcode >= 0x1F00 ) && (charcode <= 0x1FFF))
435
                        charactersGreekExtended.append(charcode);
436
                else if ((charcode >= 0x2000 ) && (charcode <= 0x206F))
437
                        charactersGeneralPunctuation.append(charcode);
438
                else if ((charcode >= 0x2070 ) && (charcode <= 0x209F))
439
                        charactersSuperSubscripts.append(charcode);
440
                else if ((charcode >= 0x20A0 ) && (charcode <= 0x20CF))
441
                        charactersCurrencySymbols.append(charcode);
442
                else if ((charcode >= 0x2100 ) && (charcode <= 0x214F))
443
                        charactersLetterlikeSymbols.append(charcode);
444
                else if ((charcode >= 0x2150 ) && (charcode <= 0x218F))
445
                        charactersNumberForms.append(charcode);
446
                else if ((charcode >= 0x2190 ) && (charcode <= 0x2190))
447
                        charactersArrows.append(charcode);
448
                else if ((charcode >= 0x2200 ) && (charcode <= 0x22FF))
449
                        charactersMathematicalOperators.append(charcode);
450
                else if ((charcode >= 0x2500 ) && (charcode <= 0x257F))
451
                        charactersBoxDrawing.append(charcode);
452
                else if ((charcode >= 0x2580 ) && (charcode <= 0x259F))
453
                        charactersBlockElements.append(charcode);
454
                else if ((charcode >= 0x25A0 ) && (charcode <= 0x25FF))
455
                        charactersGeometricShapes.append(charcode);
456
                else if ((charcode >= 0x2600 ) && (charcode <= 0x26FF))
457
                        charactersMiscellaneousSymbols.append(charcode);
458
                else if ((charcode >= 0x2700 ) && (charcode <= 0x27BF))
459
                        charactersDingbats.append(charcode);
460
                else if ((charcode >= 0xFE50 ) && (charcode <= 0xFE6F))
461
                        charactersSmallFormVariants.append(charcode);
462
                else if ((charcode >= 0xFB00 ) && (charcode <= 0xFB4F))
463
                        charactersAlphabeticPresentationForms.append(charcode);
464
                else if ((charcode >= 0xFB50 ) && (charcode <= 0xFDFF))
465
                        charactersArabicPresentationFormsA.append(charcode);
466
                else if ((charcode >= 0xFE70 ) && (charcode <= 0xFEFF))
467
                        charactersArabicPresentationFormsB.append(charcode);
468
                else if ((charcode >= 0xFFF0 ) && (charcode <= 0xFFFF))
469
                        charactersSpecial.append(charcode);
470
                charcode = FT_Get_Next_Char(face, charcode, &gindex );
471
        }
472
        allClasses.append(charactersFull);
473
        allClasses.append(charactersLatin1);
474
        allClasses.append(charactersLatin1Supplement);
475
        allClasses.append(charactersLatinExtendedA);
476
        allClasses.append(charactersLatinExtendedB);
477
        allClasses.append(charactersGeneralPunctuation);
478
        allClasses.append(charactersSuperSubscripts);
479
        allClasses.append(charactersCurrencySymbols);
480
        allClasses.append(charactersLetterlikeSymbols);
481
        allClasses.append(charactersNumberForms);
482
        allClasses.append(charactersArrows);
483
        allClasses.append(charactersMathematicalOperators);
484
        allClasses.append(charactersBoxDrawing);
485
        allClasses.append(charactersBlockElements);
486
        allClasses.append(charactersGeometricShapes);
487
        allClasses.append(charactersMiscellaneousSymbols);
488
        allClasses.append(charactersDingbats);
489
        allClasses.append(charactersSmallFormVariants);
490
        allClasses.append(charactersAlphabeticPresentationForms);
491
        allClasses.append(charactersSpecial);
492
        allClasses.append(charactersGreek);
493
        allClasses.append(charactersGreekExtended);
494
        allClasses.append(charactersCyrillic);
495
        allClasses.append(charactersCyrillicSupplement);
496
        allClasses.append(charactersArabic);
497
        allClasses.append(charactersArabicPresentationFormsA);
498
        allClasses.append(charactersArabicPresentationFormsB);
499
        allClasses.append(charactersHebrew);
500
}
501
 
502
void CharSelect::setupRangeCombo()
503
{
504
        disconnect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int)));
505
        int counter = 0;
506
        rangeSelector->clear();
507
        rangeSelector->insertItem( tr("Full Character Set"));
508
        usedCharClasses.insert(counter, 0);
509
        counter++;
510
        if (charactersLatin1.count() != 0)
511
        {
512
                rangeSelector->insertItem( tr("Basic Latin"));
513
                usedCharClasses.insert(counter, 1);
514
                counter++;
515
        }
516
        if (charactersLatin1Supplement.count() != 0)
517
        {
518
                rangeSelector->insertItem( tr("Latin-1 Supplement"));
519
                usedCharClasses.insert(counter, 2);
520
                counter++;
521
        }
522
        if (charactersLatinExtendedA.count() != 0)
523
        {
524
                rangeSelector->insertItem( tr("Latin Extended-A"));
525
                usedCharClasses.insert(counter, 3);
526
                counter++;
527
        }
528
        if (charactersLatinExtendedB.count() != 0)
529
        {
530
                rangeSelector->insertItem( tr("Latin Extended-B"));
531
                usedCharClasses.insert(counter, 4);
532
                counter++;
533
        }
534
        if (charactersGeneralPunctuation.count() != 0)
535
        {
536
                rangeSelector->insertItem( tr("General Punctuation"));
537
                usedCharClasses.insert(counter, 5);
538
                counter++;
539
        }
540
        if (charactersSuperSubscripts.count() != 0)
541
        {
542
                rangeSelector->insertItem( tr("Super- and Subscripts"));
543
                usedCharClasses.insert(counter, 6);
544
                counter++;
545
        }
546
        if (charactersCurrencySymbols.count() != 0)
547
        {
548
                rangeSelector->insertItem( tr("Currency Symbols"));
549
                usedCharClasses.insert(counter, 7);
550
                counter++;
551
        }
552
        if (charactersLetterlikeSymbols.count() != 0)
553
        {
554
                rangeSelector->insertItem( tr("Letterlike Symbols"));
555
                usedCharClasses.insert(counter, 8);
556
                counter++;
557
        }
558
        if (charactersNumberForms.count() != 0)
559
        {
560
                rangeSelector->insertItem( tr("Number Forms"));
561
                usedCharClasses.insert(counter, 9);
562
                counter++;
563
        }
564
        if (charactersArrows.count() != 0)
565
        {
566
                rangeSelector->insertItem( tr("Arrows"));
567
                usedCharClasses.insert(counter, 10);
568
                counter++;
569
        }
570
        if (charactersMathematicalOperators.count() != 0)
571
        {
572
                rangeSelector->insertItem( tr("Mathematical Operators"));
573
                usedCharClasses.insert(counter, 11);
574
                counter++;
575
        }
576
        if (charactersBoxDrawing.count() != 0)
577
        {
578
                rangeSelector->insertItem( tr("Box Drawing"));
579
                usedCharClasses.insert(counter, 12);
580
                counter++;
581
        }
582
        if (charactersBlockElements.count() != 0)
583
        {
584
                rangeSelector->insertItem( tr("Block Elements"));
585
                usedCharClasses.insert(counter, 13);
586
                counter++;
587
        }
588
        if (charactersGeometricShapes.count() != 0)
589
        {
590
                rangeSelector->insertItem( tr("Geometric Shapes"));
591
                usedCharClasses.insert(counter, 14);
592
                counter++;
593
        }
594
        if (charactersMiscellaneousSymbols.count() != 0)
595
        {
596
                rangeSelector->insertItem( tr("Miscellaneous Symbols"));
597
                usedCharClasses.insert(counter, 15);
598
                counter++;
599
        }
600
        if (charactersDingbats.count() != 0)
601
        {
602
                rangeSelector->insertItem( tr("Dingbats"));
603
                usedCharClasses.insert(counter, 16);
604
                counter++;
605
        }
606
        if (charactersSmallFormVariants.count() != 0)
607
        {
608
                rangeSelector->insertItem( tr("Small Form Variants"));
609
                usedCharClasses.insert(counter, 17);
610
                counter++;
611
        }
612
        if (charactersAlphabeticPresentationForms.count() != 0)
613
        {
614
                rangeSelector->insertItem( tr("Ligatures"));
615
                usedCharClasses.insert(counter, 18);
616
                counter++;
617
        }
618
        if (charactersSpecial.count() != 0)
619
        {
620
                rangeSelector->insertItem( tr("Specials"));
621
                usedCharClasses.insert(counter, 19);
622
                counter++;
623
        }
624
        if (charactersGreek.count() != 0)
625
        {
626
                rangeSelector->insertItem( tr("Greek"));
627
                usedCharClasses.insert(counter, 20);
628
                counter++;
629
        }
630
        if (charactersGreekExtended.count() != 0)
631
        {
632
                rangeSelector->insertItem( tr("Greek Extended"));
633
                usedCharClasses.insert(counter, 21);
634
                counter++;
635
        }
636
        if (charactersCyrillic.count() != 0)
637
        {
638
                rangeSelector->insertItem( tr("Cyrillic"));
639
                usedCharClasses.insert(counter, 22);
640
                counter++;
641
        }
642
        if (charactersCyrillicSupplement.count() != 0)
643
        {
644
                rangeSelector->insertItem( tr("Cyrillic Supplement"));
645
                usedCharClasses.insert(counter, 23);
646
                counter++;
647
        }
648
        if (charactersArabic.count() != 0)
649
        {
650
                rangeSelector->insertItem( tr("Arabic"));
651
                usedCharClasses.insert(counter, 24);
652
                counter++;
653
        }
654
        if (charactersArabicPresentationFormsA.count() != 0)
655
        {
656
                rangeSelector->insertItem( tr("Arabic Extended A"));
657
                usedCharClasses.insert(counter, 25);
658
                counter++;
659
        }
660
        if (charactersArabicPresentationFormsB.count() != 0)
661
        {
662
                rangeSelector->insertItem( tr("Arabic Extended B"));
663
                usedCharClasses.insert(counter, 26);
664
                counter++;
665
        }
666
        if (charactersHebrew.count() != 0)
667
        {
668
                rangeSelector->insertItem( tr("Hebrew"));
669
                usedCharClasses.insert(counter, 27);
670
                counter++;
671
        }
672
        rangeSelector->setCurrentItem(0);
673
        connect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int)));
674
}
675
 
676
void CharSelect::generatePreview(int charClass)
677
{
678
        FT_Face face;
3455 avox 679
        zTabelle->maxCount = 0;
1202 fschmid 680
        characters.clear();
681
        zTabelle->setNumRows( 0 );
682
        characters = allClasses[charClass];
683
        face = ap->doc->FFonts[fontInUse];
1885 cbradney 684
        if (!face) {
685
                maxCount = 0;
686
                return;
687
        }
2640 cbradney 688
        setBestEncoding(face);
1202 fschmid 689
        maxCount = characters.count();
690
        zTabelle->maxCount = maxCount;
691
        int ab = maxCount / 16;
692
        int ac = maxCount % 16;
693
        if (ac != 0)
694
                ab++;
695
        zTabelle->setNumRows( ab );
3477 cbradney 696
        recalcCellSizes();
1202 fschmid 697
}
698
 
699
void CharSelect::newCharClass(int c)
700
{
701
        characterClass = usedCharClasses[c];
702
        generatePreview(characterClass);
703
}
704
 
705
void CharSelect::newFont(int font)
706
{
3455 avox 707
        zTabelle->maxCount = 0;
3462 fschmid 708
        QString oldFont = fontInUse;
1202 fschmid 709
        fontInUse = fontSelector->text(font);
710
        delEdit();
711
        setCaption( tr( "Select Character:" )+" "+fontInUse );
712
        ap->SetNewFont(fontInUse);
4026 craig 713
        if (ScMW->doc->CurrFont != fontInUse)
3462 fschmid 714
        {
715
                disconnect(fontSelector, SIGNAL(activated(int)), this, SLOT(newFont(int)));
4026 craig 716
                fontSelector->RebuildList(ScMW->doc);
717
                fontInUse = ScMW->doc->CurrFont;
3462 fschmid 718
                setCaption( tr( "Select Character:" )+" "+fontInUse );
719
                fontSelector->setCurrentText(fontInUse);
720
                connect(fontSelector, SIGNAL(activated(int)), this, SLOT(newFont(int)));
721
        }
1202 fschmid 722
        scanFont();
723
        generatePreview(0);
724
        characterClass = 0;
725
        setupRangeCombo();
726
}
727
 
4578 fschmid 728
void CharSelect::newChar()
729
{
730
        QString tx = insCode->text();
731
        tx.prepend("0x");
732
        bool ok = false;
733
        uint code = tx.toUInt(&ok, 16);
734
        if ((ok) && (code > 31))
735
        {
736
                chToIns += QChar(code);
737
                sample->setPixmap(FontSample((*ap->doc->AllFonts)[fontInUse], 28, chToIns, paletteBackgroundColor(), true));
738
                insertButton->setEnabled(true);
739
        }
740
}
741
 
1202 fschmid 742
void CharSelect::newChar(uint r, uint c) // , int b, const QPoint &pp)
743
{
744
        if ((r*16+c) < maxCount)
745
        {
746
                chToIns += QChar(characters[r*16+c]);
2295 cbradney 747
                sample->setPixmap(FontSample((*ap->doc->AllFonts)[fontInUse], 28, chToIns, paletteBackgroundColor(), true));
1202 fschmid 748
                insertButton->setEnabled(true);
4582 fschmid 749
                QString tmp;
750
                tmp.sprintf("%04X", characters[r*16+c]);
751
                insCode->setText(tmp);
1202 fschmid 752
        }
753
}
754
 
755
void CharSelect::delChar()
756
{
757
        if (chToIns.length() == 0)
758
                return;
759
        if (chToIns.length() == 1)
760
        {
761
                delEdit();
762
                return;
763
        }
764
        chToIns.truncate(chToIns.length() - 1);
2295 cbradney 765
        sample->setPixmap(FontSample((*ap->doc->AllFonts)[fontInUse], 28, chToIns, paletteBackgroundColor(), true));
1202 fschmid 766
        insertButton->setEnabled(true);
767
}
768
 
769
void CharSelect::delEdit()
770
{
771
        chToIns = "";
772
        QPixmap pm(1,28);
773
        pm.fill(paletteBackgroundColor());
774
        sample->setPixmap(pm);
775
        insertButton->setEnabled(false);
776
}
777
 
778
void CharSelect::insChar()
779
{
3207 craig 780
        if (needReturn)
1202 fschmid 781
        {
3207 craig 782
                m_characters = chToIns;
1202 fschmid 783
                delEdit();
784
                return;
785
        }
4513 cbradney 786
        if (ite->HasSel)
787
                ite->asTextFrame()->deleteSelectedTextFromFrame();
4689 mrdocs 788
        ScText *hg;
1202 fschmid 789
        for (uint a=0; a<chToIns.length(); ++a)
790
        {
791
                hg = new ScText;
792
                hg->ch = chToIns.at(a);
793
                if (hg->ch == QChar(10))
794
                        hg->ch = QChar(13);
795
                if (hg->ch == QChar(9))
796
                        hg->ch = " ";
1789 fschmid 797
                hg->cfont = (*ap->doc->AllFonts)[fontInUse];
1202 fschmid 798
                hg->csize = ap->doc->CurrFontSize;
799
                hg->ccolor = ap->doc->CurrTextFill;
800
                hg->cshade = ap->doc->CurrTextFillSh;
801
                hg->cstroke = ap->doc->CurrTextStroke;
802
                hg->cshade2 = ap->doc->CurrTextStrokeSh;
803
                hg->cscale = ap->doc->CurrTextScale;
2230 fschmid 804
                hg->cscalev = ap->doc->CurrTextScaleV;
2234 fschmid 805
                hg->cbase = ap->doc->CurrTextBase;
2247 fschmid 806
                hg->cshadowx = ap->doc->CurrTextShadowX;
807
                hg->cshadowy = ap->doc->CurrTextShadowY;
2257 fschmid 808
                hg->coutline = ap->doc->CurrTextOutline;
2262 fschmid 809
                hg->cunderpos = ap->doc->CurrTextUnderPos;
810
                hg->cunderwidth = ap->doc->CurrTextUnderWidth;
2272 fschmid 811
                hg->cstrikepos = ap->doc->CurrTextStrikePos;
812
                hg->cstrikewidth = ap->doc->CurrTextStrikeWidth;
1202 fschmid 813
                hg->cselect = false;
814
                hg->cstyle = ap->doc->CurrentStyle;
815
                hg->cab = ap->doc->currentParaStyle;
2877 cbradney 816
                if (!ap->doc->docParagraphStyles[ap->doc->currentParaStyle].Font.isEmpty())
1202 fschmid 817
                {
1789 fschmid 818
                        hg->cfont = (*ap->doc->AllFonts)[ap->doc->docParagraphStyles[ap->doc->currentParaStyle].Font];
1202 fschmid 819
                        hg->csize = ap->doc->docParagraphStyles[ap->doc->currentParaStyle].FontSize;
820
                }
821
                hg->cextra = 0;
822
                hg->cselect = false;
823
                hg->xp = 0;
824
                hg->yp = 0;
825
                hg->PRot = 0;
826
                hg->PtransX = 0;
827
                hg->PtransY = 0;
2434 fschmid 828
                hg->cembedded = 0;
1202 fschmid 829
                ite->itemText.insert(ite->CPos, hg);
830
                ite->CPos += 1;
831
        }
832
        ap->view->DrawNew();
833
        ap->slotDocCh();
5586 cbradney 834
        delEdit();
1202 fschmid 835
}
3475 cbradney 836
 
3849 subik 837
bool CharSelect::eventFilter( QObject */*obj*/, QEvent *ev )
3475 cbradney 838
{
839
        if ( ev->type() == QEvent::Show )
840
        {
3477 cbradney 841
                recalcCellSizes();
3475 cbradney 842
                return true;
3849 subik 843
        }
844
        else
3475 cbradney 845
                return false;
3477 cbradney 846
}
847
 
848
void CharSelect::recalcCellSizes()
849
{
850
        int cellWidth = zTabelle->width() / 16;
3478 cbradney 851
        int cellHeight = cellWidth;
3477 cbradney 852
        for (int d = 0; d < 16; ++d)
853
                zTabelle->setColumnStretchable(d, TRUE);
854
        for (int d = 0; d < zTabelle->numRows(); ++d)
855
                zTabelle->setRowHeight(d, cellHeight);
856
        zTabelle->updateScrollBars();
3543 avox 857
}