Subversion Repositories Scribus

Rev

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