Subversion Repositories Scribus

Rev

Rev 23840 | 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
*/
364 Franz 7
/***************************************************************************
8
 *   Copyright (C) 2004 by Riku Leino                                      *
1184 tsoots 9
 *   tsoots@gmail.com                                                      *
364 Franz 10
 *                                                                         *
11
 *   This program is free software; you can redistribute it and/or modify  *
12
 *   it under the terms of the GNU General Public License as published by  *
13
 *   the Free Software Foundation; either version 2 of the License, or     *
14
 *   (at your option) any later version.                                   *
15
 *                                                                         *
16
 *   This program is distributed in the hope that it will be useful,       *
17
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
19
 *   GNU General Public License for more details.                          *
20
 *                                                                         *
21
 *   You should have received a copy of the GNU General Public License     *
22
 *   along with this program; if not, write to the                         *
23
 *   Free Software Foundation, Inc.,                                       *
18122 mrdocs 24
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             *
364 Franz 25
 ***************************************************************************/
26
 
13649 jghali 27
#include <QCursor>
28
#include <QList>
16546 jghali 29
#include <QProgressBar>
13649 jghali 30
#include <QStringList>
31
 
13648 jghali 32
#include "gtaction.h"
13805 jghali 33
#include "gtfont.h"
34
#include "gtstyle.h"
35
#include "gtparagraphstyle.h"
36
#include "gtframestyle.h"
37
 
38
#include "commonstrings.h"
18084 jghali 39
#include "hyphenator.h"
40
#include "marks.h"
41
#include "notesstyles.h"
42
#include "pageitem_textframe.h"
2834 cbradney 43
#include "prefsmanager.h"
13464 cbradney 44
#include "scclocale.h"
3934 cbradney 45
#include "selection.h"
7478 jghali 46
#include "sccolorengine.h"
19080 craig 47
#include "scribusdoc.h"
13805 jghali 48
#include "scribus.h"
17641 craig 49
#include "undomanager.h"
19267 craig 50
#include "util.h"
18084 jghali 51
#include "util_text.h"
23282 craig 52
#include "ui/contentpalette.h"
13805 jghali 53
#include "ui/missing.h"
54
 
23060 craig 55
gtAction::gtAction(bool append, PageItem* pageitem) :
56
        m_prefsManager(PrefsManager::instance())
57
{       m_textFrame = pageitem;
20606 craig 58
        m_ScMW=m_textFrame->doc()->scMW();
59
        m_it = m_textFrame;
60
        m_lastParagraphStyle = -1;
61
        m_inPara = false;
62
        m_isFirstWrite = true;
63
        m_lastCharWasLineChange = false;
64
        m_currentFrameStyle = "";
65
        m_doAppend = append;
66
        m_updateParagraphStyles = false;
67
        m_overridePStyleFont = true;
68
        m_undoManager = UndoManager::instance();
22516 craig 69
        m_noteStory = nullptr;
70
        m_note = nullptr;
1702 cbradney 71
}
72
 
364 Franz 73
void gtAction::setProgressInfo()
74
{
5781 cbradney 75
        m_ScMW->setStatusBarInfoText(QObject::tr("Importing text"));
76
        m_ScMW->mainWindowProgressBar->reset();
9971 jghali 77
        m_ScMW->mainWindowProgressBar->setMaximum(0); // 0 shows a busy progressbar
364 Franz 78
}
79
 
80
void gtAction::setProgressInfoDone()
81
{
5781 cbradney 82
        m_ScMW->setStatusBarInfoText("");
83
        m_ScMW->mainWindowProgressBar->reset();
9971 jghali 84
        m_ScMW->mainWindowProgressBar->setMaximum(1);
364 Franz 85
}
86
 
22635 craig 87
void gtAction::setInfo(const QString& infoText)
364 Franz 88
{
5781 cbradney 89
        m_ScMW->setStatusBarInfoText(infoText);
364 Franz 90
}
91
 
92
void gtAction::clearFrame()
93
{
20606 craig 94
        m_textFrame->itemText.clear();
364 Franz 95
}
96
 
18084 jghali 97
void gtAction::writeUnstyled(const QString& text, bool isNote)
12895 jghali 98
{
19421 jghali 99
        UndoTransaction activeTransaction;
20606 craig 100
        if (m_isFirstWrite && m_it->itemText.length() > 0)
12895 jghali 101
        {
20606 craig 102
                if (!m_doAppend)
12895 jghali 103
                {
17641 craig 104
                        if (UndoManager::undoEnabled())
20606 craig 105
                                activeTransaction = m_undoManager->beginTransaction(Um::Selection, Um::IGroup, Um::ImportText, "", Um::IDelete);
22600 craig 106
                        if (m_it->nextInChain() != nullptr)
12895 jghali 107
                        {
20606 craig 108
                                PageItem *nextItem = m_it->nextInChain();
22600 craig 109
                                while (nextItem != nullptr)
12895 jghali 110
                                {
17641 craig 111
                                        nextItem->itemText.selectAll();
112
                                        nextItem->asTextFrame()->deleteSelectedTextFromFrame();
12895 jghali 113
                                        nextItem = nextItem->nextInChain();
114
                                }
115
                        }
20606 craig 116
                        m_it->itemText.selectAll();
117
                        m_it->asTextFrame()->deleteSelectedTextFromFrame();
12895 jghali 118
                }
119
        }
120
 
17641 craig 121
        QChar ch0(0), ch5(5), ch10(10), ch13(13);
122
        QString textStr = text;
123
        textStr.remove(ch0);
124
        textStr.remove(ch13);
24000 jghali 125
        textStr.replace(ch10, ch13);
126
        textStr.replace(ch5, ch13);
127
        textStr.replace(QString(0x2028), SpecialChars::LINEBREAK);
128
        textStr.replace(QString(0x2029), SpecialChars::PARSEP);
18084 jghali 129
        if (isNote)
12895 jghali 130
        {
22516 craig 131
                if (m_note == nullptr)
18084 jghali 132
                {
20606 craig 133
                        m_note = m_it->m_Doc->newNote(m_it->m_Doc->m_docNotesStylesList.at(0));
22516 craig 134
                        Q_ASSERT(m_noteStory == nullptr);
20606 craig 135
                        m_noteStory = new StoryText(m_it->m_Doc);
18084 jghali 136
                }
137
                if (textStr == SpecialChars::OBJECT)
138
                {
20606 craig 139
                        NotesStyle* nStyle = m_note->notesStyle();
18084 jghali 140
                        QString label = "NoteMark_" + nStyle->name();
23535 jghali 141
                        if (nStyle->range() == NSRstory)
20606 craig 142
                                label += " in " + m_it->firstInChain()->itemName();
22516 craig 143
                        if (m_it->m_Doc->getMark(label + "_1", MARKNoteMasterType) != nullptr)
20606 craig 144
                                getUniqueName(label,m_it->m_Doc->marksLabelsList(MARKNoteMasterType), "_"); //FIX ME here user should be warned that inserted mark`s label was changed
18084 jghali 145
                        else
146
                                label = label + "_1";
20606 craig 147
                        Mark* mrk = m_it->m_Doc->newMark();
18084 jghali 148
                        mrk->label = label;
149
                        mrk->setType(MARKNoteMasterType);
20606 craig 150
                        mrk->setNotePtr(m_note);
151
                        m_note->setMasterMark(mrk);
152
                        if (m_noteStory->text(m_noteStory->length() -1) == SpecialChars::PARSEP)
153
                                m_noteStory->removeChars(m_noteStory->length() -1, 1);
154
                        m_note->setSaxedText(saxedText(m_noteStory));
23643 jghali 155
                        mrk->clearString();
20606 craig 156
                        mrk->OwnPage = m_it->OwnPage;
157
                        m_it->itemText.insertMark(mrk);
18084 jghali 158
                        if (UndoManager::undoEnabled())
159
                        {
160
                                ScItemsState* is = new ScItemsState(UndoManager::InsertNote);
161
                                is->set("ETEA", mrk->label);
162
                                is->set("MARK", QString("new"));
163
                                is->set("label", mrk->label);
164
                                is->set("type", (int) MARKNoteMasterType);
165
                                is->set("strtxt", QString(""));
166
                                is->set("nStyle", nStyle->name());
20606 craig 167
                                is->set("at", m_it->itemText.cursorPosition() -1);
168
                                is->insertItem("inItem", m_it);
169
                                m_undoManager->action(m_it->m_Doc, is);
18084 jghali 170
                        }
22516 craig 171
                        m_note = nullptr;
20606 craig 172
                        delete m_noteStory;
18084 jghali 173
                }
174
                else
20606 craig 175
                        m_noteStory->insertChars(m_noteStory->length(), textStr);
18084 jghali 176
        }
177
        else
178
        {
20606 craig 179
                int pos = m_it->itemText.length();
18084 jghali 180
                if (UndoManager::undoEnabled())
181
                {
182
                        SimpleState *ss = new SimpleState(Um::AppendText,"",Um::ICreate);
20797 jghali 183
                        ss->set("INSERT_FRAMETEXT");
17641 craig 184
                        ss->set("TEXT_STR",textStr);
185
                        ss->set("START", pos);
20606 craig 186
                        m_undoManager->action(m_it, ss);
18084 jghali 187
                }
20606 craig 188
                m_it->itemText.insertChars(pos, textStr);
12895 jghali 189
        }
20606 craig 190
        m_lastCharWasLineChange = text.right(1) == "\n";
191
        m_isFirstWrite = false;
17641 craig 192
        if (activeTransaction)
193
        {
19421 jghali 194
                activeTransaction.commit();
17641 craig 195
        }
12895 jghali 196
}
197
 
18084 jghali 198
void gtAction::write(const QString& text, gtStyle *style, bool isNote)
364 Franz 199
{
20606 craig 200
        if (m_isFirstWrite)
418 Franz 201
        {
20606 craig 202
                if (!m_doAppend)
418 Franz 203
                {
22600 craig 204
                        if (m_it->nextInChain() != nullptr)
418 Franz 205
                        {
20606 craig 206
                                PageItem *nextItem = m_it->nextInChain();
22600 craig 207
                                while (nextItem != nullptr)
418 Franz 208
                                {
1957 cbradney 209
                                        nextItem->itemText.clear();
7994 avox 210
                                        nextItem = nextItem->nextInChain();
418 Franz 211
                                }
212
                        }
20606 craig 213
                        m_it->itemText.clear();
418 Franz 214
                }
215
        }
411 Franz 216
        int paragraphStyle = -1;
364 Franz 217
        if (style->target() == "paragraph")
218
        {
219
                gtParagraphStyle* pstyle = dynamic_cast<gtParagraphStyle*>(style);
22516 craig 220
                assert(pstyle != nullptr);
364 Franz 221
                paragraphStyle = applyParagraphStyle(pstyle);
20606 craig 222
                if (m_isFirstWrite)
223
                        m_inPara = true;
364 Franz 224
        }
225
        else if (style->target() == "frame")
226
        {
227
                gtFrameStyle* fstyle = dynamic_cast<gtFrameStyle*>(style);
22516 craig 228
                assert(fstyle != nullptr);
364 Franz 229
                applyFrameStyle(fstyle);
230
        }
4546 subik 231
 
20606 craig 232
        if ((m_inPara) && (!m_lastCharWasLineChange) && (text.left(1) != "\n") && (m_lastParagraphStyle != -1))
233
                paragraphStyle = m_lastParagraphStyle;
411 Franz 234
 
235
        if (paragraphStyle == -1)
9730 jghali 236
                paragraphStyle = 0; //::findParagraphStyle(textFrame->doc(), textFrame->doc()->currentStyle);
411 Franz 237
 
20606 craig 238
        const ParagraphStyle& paraStyle = m_textFrame->doc()->paragraphStyles()[paragraphStyle];
9833 jghali 239
 
364 Franz 240
        gtFont* font = style->getFont();
21940 craig 241
//      QString fontName = validateFont(font).scName();
12895 jghali 242
        CharStyle lastStyle, newStyle;
5184 avox 243
        int lastStyleStart = 0;
12895 jghali 244
 
20606 craig 245
        if ((m_inPara) && (!m_overridePStyleFont))
9833 jghali 246
        {
12895 jghali 247
                if (paraStyle.charStyle().font().isNone())
248
                {
249
                        gtFont font2(*font);
250
                        font2.setName(paraStyle.charStyle().font().scName());
251
                        QString fontName2 = validateFont(&font2).scName();
20606 craig 252
                        newStyle.setFont((*m_textFrame->doc()->AllFonts)[fontName2]);
12895 jghali 253
                }
9833 jghali 254
        }
255
        else
256
        {
12895 jghali 257
                setCharStyleAttributes(font, newStyle);
9833 jghali 258
        }
12895 jghali 259
        /*newStyle.eraseCharStyle(paraStyle.charStyle());*/
9833 jghali 260
 
261
        lastStyle = newStyle;
20606 craig 262
        lastStyleStart = m_it->itemText.length();
22516 craig 263
        StoryText* story = nullptr;
18084 jghali 264
        if (isNote)
265
        {
22516 craig 266
                if (m_noteStory == nullptr)
18084 jghali 267
                {
20606 craig 268
                        m_note = m_it->m_Doc->newNote(m_it->m_Doc->m_docNotesStylesList.at(0));
269
                        m_noteStory = new StoryText(m_it->m_Doc);
18084 jghali 270
                }
20606 craig 271
                story = m_noteStory;
18084 jghali 272
        }
273
        else
20606 craig 274
                story = &m_it->itemText;
9833 jghali 275
 
276
        QChar ch0(0), ch5(5), ch10(10), ch13(13);
8595 jghali 277
        for (int a = 0; a < text.length(); ++a)
364 Franz 278
        {
9833 jghali 279
                if ((text.at(a) == ch0) || (text.at(a) == ch13))
364 Franz 280
                        continue;
5184 avox 281
                QChar ch = text.at(a);
9833 jghali 282
                if ((ch == ch10) || (ch == ch5))
283
                        ch = ch13;
284
 
18084 jghali 285
                int pos = story->length();
286
                if (isNote && ch == SpecialChars::OBJECT)
287
                {
20606 craig 288
                        NotesStyle* nStyle = m_note->notesStyle();
18084 jghali 289
                        QString label = "NoteMark_" + nStyle->name();
23535 jghali 290
                        if (nStyle->range() == NSRstory)
20606 craig 291
                                label += " in " + m_it->firstInChain()->itemName();
22516 craig 292
                        if (m_it->m_Doc->getMark(label + "_1", MARKNoteMasterType) != nullptr)
20606 craig 293
                                getUniqueName(label,m_it->m_Doc->marksLabelsList(MARKNoteMasterType), "_"); //FIX ME here user should be warned that inserted mark`s label was changed
18084 jghali 294
                        else
295
                                label = label + "_1";
20606 craig 296
                        Mark* mrk = m_it->m_Doc->newMark();
18084 jghali 297
                        mrk->label = label;
298
                        mrk->setType(MARKNoteMasterType);
20606 craig 299
                        mrk->setNotePtr(m_note);
300
                        m_note->setMasterMark(mrk);
23643 jghali 301
                        mrk->clearString();
20606 craig 302
                        mrk->OwnPage = m_it->OwnPage;
303
                        m_it->itemText.insertMark(mrk);
18084 jghali 304
                        story->applyCharStyle(lastStyleStart, story->length()-lastStyleStart, lastStyle);
305
                        if (paraStyle.hasName())
306
                        {
307
                                ParagraphStyle pStyle;
308
                                pStyle.setParent(paraStyle.name());
309
                                story->applyStyle(qMax(0,story->length()-1), pStyle);
310
                        }
311
                        else
312
                                story->applyStyle(qMax(0,story->length()-1), paraStyle);
313
 
20606 craig 314
                        m_lastCharWasLineChange = text.right(1) == "\n";
315
                        m_inPara = style->target() == "paragraph";
316
                        m_lastParagraphStyle = paragraphStyle;
317
                        if (m_isFirstWrite)
318
                                m_isFirstWrite = false;
18084 jghali 319
                        if (story->text(pos -1) == SpecialChars::PARSEP)
320
                                story->removeChars(pos-1, 1);
20606 craig 321
                        m_note->setSaxedText(saxedText(story));
22516 craig 322
                        m_note = nullptr;
20606 craig 323
                        delete m_noteStory;
22516 craig 324
                        m_noteStory = nullptr;
18084 jghali 325
                        return;
326
                }
22638 craig 327
                story->insertChars(pos, QString(ch));
12895 jghali 328
                if (ch == SpecialChars::PARSEP)
329
                {
330
                        if (paraStyle.hasName())
331
                        {
332
                                ParagraphStyle pstyle;
333
                                pstyle.setParent(paraStyle.name());
18084 jghali 334
                                story->applyStyle(pos, pstyle);
12895 jghali 335
                        }
336
                        else
18084 jghali 337
                                story->applyStyle(pos, paraStyle);
5184 avox 338
                }
364 Franz 339
        }
18084 jghali 340
        story->applyCharStyle(lastStyleStart, story->length()-lastStyleStart, lastStyle);
12895 jghali 341
        if (paraStyle.hasName())
342
        {
343
                ParagraphStyle pStyle;
344
                pStyle.setParent(paraStyle.name());
18084 jghali 345
                story->applyStyle(qMax(0,story->length()-1), pStyle);
12895 jghali 346
        }
347
        else
18084 jghali 348
                story->applyStyle(qMax(0,story->length()-1), paraStyle);
5184 avox 349
 
20606 craig 350
        m_lastCharWasLineChange = text.right(1) == "\n";
351
        m_inPara = style->target() == "paragraph";
352
        m_lastParagraphStyle = paragraphStyle;
353
        if (m_isFirstWrite)
354
                m_isFirstWrite = false;
364 Franz 355
}
356
 
357
int gtAction::findParagraphStyle(gtParagraphStyle* pstyle)
358
{
411 Franz 359
        return findParagraphStyle(pstyle->getName());
360
}
361
 
362
int gtAction::findParagraphStyle(const QString& name)
363
{
364 Franz 364
        int pstyleIndex = -1;
20606 craig 365
        for (int i = 0; i < m_textFrame->doc()->paragraphStyles().count(); ++i)
364 Franz 366
        {
20606 craig 367
                if (m_textFrame->doc()->paragraphStyles()[i].name() == name)
411 Franz 368
                {
364 Franz 369
                        pstyleIndex = i;
370
                        break;
371
                }
372
        }
373
        return pstyleIndex;
374
}
375
 
376
int gtAction::applyParagraphStyle(gtParagraphStyle* pstyle)
377
{
378
        int pstyleIndex = findParagraphStyle(pstyle);
379
        if (pstyleIndex == -1)
380
        {
381
                createParagraphStyle(pstyle);
20606 craig 382
                pstyleIndex = m_textFrame->doc()->paragraphStyles().count() - 1;
364 Franz 383
        }
20606 craig 384
        else if (m_updateParagraphStyles)
411 Franz 385
        {
386
                updateParagraphStyle(pstyleIndex, pstyle);
387
        }
364 Franz 388
        return pstyleIndex;
389
}
390
 
391
void gtAction::applyFrameStyle(gtFrameStyle* fstyle)
392
{
20606 craig 393
        m_textFrame->setColumns(fstyle->getColumns());
394
        m_textFrame->setColumnGap(fstyle->getColumnsGap());
395
        m_textFrame->setFillColor(parseColor(fstyle->getBgColor()));
396
        m_textFrame->setFillShade(fstyle->getBgShade());
397
        ParagraphStyle newTabs(m_textFrame->itemText.defaultStyle());
23840 jghali 398
        newTabs.setTabValues(fstyle->getTabValues());
20606 craig 399
        m_textFrame->itemText.setDefaultStyle(newTabs);
4546 subik 400
 
411 Franz 401
//      gtParagraphStyle* pstyle = new gtParagraphStyle(*fstyle);
402
//      int pstyleIndex = findParagraphStyle(pstyle);
403
//      if (pstyleIndex == -1)
404
//              pstyleIndex = 0;
1065 cbradney 405
//      textFrame->Doc->currentParaStyle = pstyleIndex;
375 Franz 406
 
5559 avox 407
/* FIXME
411 Franz 408
        double linesp;
409
        if (fstyle->getAutoLineSpacing())
410
                linesp = getLineSpacing(fstyle->getFont()->getSize());
411
        else
412
                linesp = fstyle->getLineSpacing();
4584 cbradney 413
        textFrame->setLineSpacing(linesp);
414
        textFrame->setLineSpacingMode(0);
375 Franz 415
        gtFont* font = fstyle->getFont();
5980 avox 416
        Scface* scfont = validateFont(font);
5184 avox 417
        textFrame->setFont(scfont->scName());
4073 cbradney 418
        textFrame->setFontSize(font->getSize());
833 tsoots 419
        textFrame->TxtFill = parseColor(font->getColor());
375 Franz 420
        textFrame->ShTxtFill = font->getShade();
833 tsoots 421
        textFrame->TxtStroke = parseColor(font->getStrokeColor());
375 Franz 422
        textFrame->ShTxtStroke = font->getStrokeShade();
2254 fschmid 423
        textFrame->TxtScale = font->getHscale();
424
        textFrame->TxtScaleV = 1000;
2234 fschmid 425
        textFrame->TxtBase = 0;
2247 fschmid 426
        textFrame->TxtShadowX = 50;
427
        textFrame->TxtShadowY = -50;
2257 fschmid 428
        textFrame->TxtOutline = 10;
2262 fschmid 429
        textFrame->TxtUnderPos = -1;
430
        textFrame->TxtUnderWidth = -1;
2272 fschmid 431
        textFrame->TxtStrikePos = -1;
432
        textFrame->TxtStrikeWidth = -1;
411 Franz 433
        textFrame->ExtraV = font->getKerning();
5559 avox 434
        */
364 Franz 435
}
436
 
437
void gtAction::getFrameFont(gtFont *font)
438
{
20606 craig 439
        const CharStyle& style(m_textFrame->itemText.defaultStyle().charStyle());
5559 avox 440
 
12895 jghali 441
        if (!style.isInhFont())
442
                font->setName(style.font().scName());
443
        if (!style.isInhFontSize())
444
                font->setSize(style.fontSize());
445
        if (!style.isInhFillColor())
446
                font->setColor(style.fillColor());
447
        if (!style.isInhFillShade())
448
                font->setShade(qRound(style.fillShade()));
449
        if (!style.isInhStrokeColor())
450
                font->setStrokeColor(style.strokeColor());
451
        if (!style.isInhStrokeShade())
452
                font->setStrokeShade(qRound(style.strokeShade()));
453
        if (!style.isInhScaleH())
454
                font->setHscale(qRound(style.scaleH()));
364 Franz 455
        font->setKerning(0);
456
}
457
 
458
void gtAction::getFrameStyle(gtFrameStyle *fstyle)
459
{
22832 craig 460
        fstyle->setColumns(m_textFrame->m_columns);
461
        fstyle->setColumnsGap(m_textFrame->m_columnGap);
20606 craig 462
        fstyle->setBgColor(m_textFrame->fillColor());
463
        fstyle->setBgShade(qRound(m_textFrame->fillShade()));
4546 subik 464
 
20606 craig 465
        const ParagraphStyle& vg(m_textFrame->itemText.defaultStyle());
5184 avox 466
        fstyle->setName(vg.name());
467
        fstyle->setLineSpacing(vg.lineSpacing());
8871 cbradney 468
        fstyle->setAdjToBaseline(vg.lineSpacingMode() == ParagraphStyle::BaselineGridLineSpacing);
4546 subik 469
 
12895 jghali 470
        if (!vg.isInhAlignment())
471
                fstyle->setAlignment(vg.alignment());
472
        if (!vg.isInhLeftMargin())
473
                fstyle->setIndent(vg.leftMargin());
474
        if (!vg.isInhFirstIndent())
475
                fstyle->setFirstLineIndent(vg.firstIndent());
476
        if (!vg.isInhGapBefore())
477
                fstyle->setSpaceAbove(vg.gapBefore());
478
        if (!vg.isInhGapAfter())
479
                fstyle->setSpaceBelow(vg.gapAfter());
480
        if (!vg.isInhHasDropCap())
481
                fstyle->setDropCap(vg.hasDropCap());
482
        if (!vg.isInhDropCapLines())
483
                fstyle->setDropCapHeight(vg.dropCapLines());
18047 craig 484
        if (!vg.isInhHasBullet())
485
                fstyle->setBullet(vg.hasBullet(), vg.bulletStr());
486
        if (!vg.isInhHasNum())
487
                fstyle->setNum(vg.hasNum(),vg.numFormat(),vg.numLevel(), vg.numStart(), vg.numPrefix(), vg.numSuffix());
12895 jghali 488
 
364 Franz 489
        gtFont font;
490
        getFrameFont(&font);
491
        fstyle->setFont(font);
387 Franz 492
        fstyle->setName("Default frame style");
364 Franz 493
}
494
 
495
void gtAction::createParagraphStyle(gtParagraphStyle* pstyle)
496
{
20606 craig 497
        ScribusDoc* currDoc=m_textFrame->doc();
10400 subik 498
        for (int i = 0; i < currDoc->paragraphStyles().count(); ++i)
364 Franz 499
        {
7442 avox 500
                if (currDoc->paragraphStyles()[i].name() == pstyle->getName())
6733 avox 501
                        return;
411 Franz 502
        }
364 Franz 503
        gtFont* font = pstyle->getFont();
12895 jghali 504
 
5184 avox 505
        ParagraphStyle vg;
12895 jghali 506
        setParaStyleAttributes(pstyle, vg);
507
        setCharStyleAttributes(font, vg.charStyle());
508
 
509
        // Maybe set those attributes when target is the frame
510
        /*vg.charStyle().setShadowXOffset(50);
5691 avox 511
        vg.charStyle().setShadowYOffset(-50);
512
        vg.charStyle().setOutlineWidth(10);
513
        vg.charStyle().setScaleH(1000);
514
        vg.charStyle().setScaleV(1000);
515
        vg.charStyle().setBaselineOffset(0);
516
        vg.charStyle().setTracking(0);
5781 cbradney 517
        vg.charStyle().setUnderlineOffset(textFrame->doc()->typographicSettings.valueUnderlinePos);
518
        vg.charStyle().setUnderlineWidth(textFrame->doc()->typographicSettings.valueUnderlineWidth);
519
        vg.charStyle().setStrikethruOffset(textFrame->doc()->typographicSettings.valueStrikeThruPos);
12895 jghali 520
        vg.charStyle().setStrikethruWidth(textFrame->doc()->typographicSettings.valueStrikeThruPos);*/
7442 avox 521
 
522
        StyleSet<ParagraphStyle> tmp;
523
        tmp.create(vg);
20606 craig 524
        m_textFrame->doc()->redefineStyles(tmp, false);
7442 avox 525
 
23282 craig 526
        m_ScMW->contentPalette->updateTextStyles();
364 Franz 527
}
528
 
12895 jghali 529
void gtAction:: setCharStyleAttributes(gtFont *font, CharStyle& style)
530
{
531
        int flags = font->getFlags();
532
        style.erase();
533
 
13648 jghali 534
        if ((flags & gtFont::familyWasSet) || (flags & gtFont::weightWasSet) || (flags & gtFont::slantWasSet))
12895 jghali 535
                style.setFont(validateFont(font));
536
        if (flags & gtFont::sizeWasSet)
537
                style.setFontSize(font->getSize());
538
        if (flags & gtFont::effectWasSet)
539
                style.setFeatures(static_cast<StyleFlag>(font->getEffectsValue()).featureList());
540
        if (flags & gtFont::fillColorWasSet)
541
                style.setFillColor(parseColor(font->getColor()));
542
        if (flags & gtFont::fillShadeWasSet)
543
                style.setFillShade(font->getShade());
544
        if (flags & gtFont::strokeColorWasSet)
545
                style.setStrokeColor(parseColor(font->getStrokeColor()));
546
        if (flags & gtFont::strokeShadeWasSet)
547
                style.setStrokeShade(font->getStrokeShade());
548
        if (flags & gtFont::hscaleWasSet)
549
                style.setScaleH(font->getHscale());
550
        if (flags & gtFont::kerningWasSet)
551
                style.setTracking(font->getKerning());
552
}
553
 
554
void gtAction::setParaStyleAttributes(gtParagraphStyle *pstyle, ParagraphStyle& style)
555
{
556
        double linesp;
557
        int flags = pstyle->getFlags();
558
        style.erase();
559
 
560
        style.setName(pstyle->getName());
561
        if (pstyle->getAutoLineSpacing())
562
                linesp = getLineSpacing(pstyle->getFont()->getSize());
563
        else
564
                linesp = pstyle->getLineSpacing();
565
        style.setLineSpacingMode(pstyle->isAdjToBaseline() ? ParagraphStyle::BaselineGridLineSpacing : ParagraphStyle::FixedLineSpacing);
566
        style.setLineSpacing(linesp);
567
 
568
        if (flags & gtParagraphStyle::alignmentWasSet)
569
                style.setAlignment(static_cast<ParagraphStyle::AlignmentType>(pstyle->getAlignment()));
570
        if (flags & gtParagraphStyle::indentWasSet)
571
                style.setLeftMargin(pstyle->getIndent());
572
        if (flags & gtParagraphStyle::firstIndentWasSet)
573
                style.setFirstIndent(pstyle->getFirstLineIndent());
574
        if (flags & gtParagraphStyle::spaceAboveWasSet)
575
                style.setGapBefore(pstyle->getSpaceAbove());
576
        if (flags & gtParagraphStyle::spaceBelowWasSet)
577
                style.setGapAfter(pstyle->getSpaceBelow());
578
        if (flags & gtParagraphStyle::tabValueWasSet)
23840 jghali 579
                style.setTabValues(pstyle->getTabValues());
12895 jghali 580
        if (flags & gtParagraphStyle::dropCapWasSet)
581
                style.setHasDropCap(pstyle->hasDropCap());
582
        if (flags & gtParagraphStyle::dropCapHeightWasSet)
583
                style.setDropCapLines(pstyle->getDropCapHeight());
18047 craig 584
        if (flags & gtParagraphStyle::bulletWasSet)
585
        {
586
                style.setHasBullet(pstyle->hasBullet());
587
                style.setBulletStr(pstyle->getBullet());
588
        }
589
        if (flags & gtParagraphStyle::numWasSet)
590
        {
591
                style.setHasNum(pstyle->hasNum());
592
                style.setNumName(pstyle->getName());
593
                style.setNumFormat(pstyle->getNumFormat());
594
                style.setNumLevel(pstyle->getNumLevel());
595
                style.setNumStart(pstyle->getNumStart());
596
                style.setNumHigher(true);
597
                style.setNumOther(true);
598
                style.setNumPrefix(pstyle->getNumPrefix());
599
                style.setNumSuffix(pstyle->getNumSuffix());
600
        }
601
 
12895 jghali 602
        /*vg.setDropCapOffset(0);*/
603
}
604
 
411 Franz 605
void gtAction::removeParagraphStyle(const QString& name)
606
{
607
        int index = findParagraphStyle(name);
608
        if (index != -1)
609
                removeParagraphStyle(index);
610
}
611
 
612
void gtAction::removeParagraphStyle(int index)
613
{
7442 avox 614
        QMap<QString, QString> map;
20606 craig 615
        map[m_textFrame->doc()->paragraphStyles()[index].name()] = "";
616
        m_textFrame->doc()->replaceStyles(map);
411 Franz 617
}
618
 
1185 tsoots 619
void gtAction::updateParagraphStyle(const QString&, gtParagraphStyle* pstyle)
411 Franz 620
{
621
        int pstyleIndex = findParagraphStyle(pstyle->getName());
622
        if (pstyleIndex != -1)
623
                updateParagraphStyle(pstyleIndex, pstyle);
624
}
625
 
626
void gtAction::updateParagraphStyle(int pstyleIndex, gtParagraphStyle* pstyle)
627
{
628
        gtFont* font = pstyle->getFont();
5184 avox 629
        ParagraphStyle vg;
12895 jghali 630
 
631
        setParaStyleAttributes(pstyle, vg);
632
        setCharStyleAttributes(font, vg.charStyle());
633
 
634
        // Maybe set those attributes when target is the frame
635
        /*vg.charStyle().setShadowXOffset(50);
5691 avox 636
        vg.charStyle().setShadowYOffset(-50);
637
        vg.charStyle().setOutlineWidth(10);
638
        vg.charStyle().setScaleH(1000);
639
        vg.charStyle().setScaleV(1000);
640
        vg.charStyle().setBaselineOffset(0);
641
        vg.charStyle().setTracking(0);
5781 cbradney 642
        vg.charStyle().setUnderlineOffset(textFrame->doc()->typographicSettings.valueUnderlinePos);
643
        vg.charStyle().setUnderlineWidth(textFrame->doc()->typographicSettings.valueUnderlineWidth);
644
        vg.charStyle().setStrikethruOffset(textFrame->doc()->typographicSettings.valueStrikeThruPos);
12895 jghali 645
        vg.charStyle().setStrikethruWidth(textFrame->doc()->typographicSettings.valueStrikeThruPos);*/
646
 
7442 avox 647
        StyleSet<ParagraphStyle> tmp;
648
        tmp.create(vg);
20606 craig 649
        m_textFrame->doc()->redefineStyles(tmp, false);
650
        if (vg.name() != m_textFrame->doc()->paragraphStyles()[pstyleIndex].name())
7442 avox 651
        {
652
                QMap<QString, QString> map;
20606 craig 653
                map[m_textFrame->doc()->paragraphStyles()[pstyleIndex].name()] = vg.name();
654
                m_textFrame->doc()->replaceStyles(map);
7442 avox 655
        }
411 Franz 656
}
657
 
5980 avox 658
ScFace gtAction::validateFont(gtFont* font)
364 Franz 659
{
411 Franz 660
        // Dirty hack for family Times New Roman
661
        if (font->getFamily() == "Times New")
662
        {
663
                font->setFamily("Times New Roman");
664
                if (font->getWeight() == "Roman")
665
                        font->setWeight("Regular");
666
        }
667
 
375 Franz 668
        QString useFont = font->getName();
2877 cbradney 669
        if ((useFont.isNull()) || (useFont.isEmpty()))
20606 craig 670
                useFont = m_textFrame->itemText.defaultStyle().charStyle().font().scName();
23060 craig 671
        else if (m_prefsManager.appPrefs.fontPrefs.AvailFonts[font->getName()].isNone())
364 Franz 672
        {
387 Franz 673
                bool found = false;
9429 jghali 674
                // Do not empty otherwise user may be asked to replace an empty font 
675
                // by font replacement dialog
676
                // useFont = "";
387 Franz 677
                QString tmpName = findFontName(font);
9506 jghali 678
                if (!tmpName.isEmpty())
375 Franz 679
                {
387 Franz 680
                        useFont = tmpName;
681
                        found = true;
375 Franz 682
                }
387 Franz 683
                if (!found)
684
                {
685
                        if (font->getSlant() == gtFont::fontSlants[ITALIC])
686
                        {
687
                                gtFont* tmp = new gtFont(*font);
688
                                tmp->setSlant(OBLIQUE);
689
                                tmpName = findFontName(tmp);
9506 jghali 690
                                if (!tmpName.isEmpty())
387 Franz 691
                                {
692
                                        useFont = tmpName;
693
                                        found = true;
694
                                }
695
                                delete tmp;
696
                        }
697
                        else if (font->getSlant() == gtFont::fontSlants[OBLIQUE])
698
                        {
699
                                gtFont* tmp = new gtFont(*font);
700
                                tmp->setSlant(ITALIC);
701
                                tmpName = findFontName(tmp);
9506 jghali 702
                                if (!tmpName.isEmpty())
387 Franz 703
                                {
704
                                        useFont = tmpName;
705
                                        found = true;
706
                                }
707
                                delete tmp;
708
                        }
709
                        if (!found)
710
                        {
23060 craig 711
                                if (!m_prefsManager.appPrefs.fontPrefs.GFontSub.contains(font->getName()))
387 Franz 712
                                {
22600 craig 713
                                        MissingFont *dia = new MissingFont(nullptr, useFont, m_textFrame->doc());
387 Franz 714
                                        dia->exec();
713 cbradney 715
                                        useFont = dia->getReplacementFont();
23060 craig 716
                                        m_prefsManager.appPrefs.fontPrefs.GFontSub[font->getName()] = useFont;
387 Franz 717
                                        delete dia;
718
                                }
719
                                else
23060 craig 720
                                        useFont = m_prefsManager.appPrefs.fontPrefs.GFontSub[font->getName()];
387 Franz 721
                        }
722
                }
364 Franz 723
        }
411 Franz 724
 
20606 craig 725
        if(!m_textFrame->doc()->UsedFonts.contains(useFont))
726
                m_textFrame->doc()->AddFont(useFont);
23060 craig 727
        return m_prefsManager.appPrefs.fontPrefs.AvailFonts[useFont];
364 Franz 728
}
729
 
387 Franz 730
QString gtAction::findFontName(gtFont* font)
731
{
20388 craig 732
        QString ret;
387 Franz 733
        for (uint i = 0; i < static_cast<uint>(gtFont::NAMECOUNT); ++i)
734
        {
735
                QString nname = font->getName(i);
23060 craig 736
                if (! m_prefsManager.appPrefs.fontPrefs.AvailFonts[nname].isNone())
387 Franz 737
                {
738
                        ret = nname;
739
                        break;
740
                }
741
        }
742
        return ret;
743
}
744
 
411 Franz 745
double gtAction::getLineSpacing(int fontSize)
746
{
20606 craig 747
        return ((fontSize / 10.0) * (static_cast<double>(m_textFrame->doc()->typographicPrefs().autoLineSpacing) / 100));
411 Franz 748
}
749
 
375 Franz 750
double gtAction::getFrameWidth()
751
{
20606 craig 752
        return m_textFrame->width();
375 Franz 753
}
754
 
755
QString gtAction::getFrameName()
756
{
20606 craig 757
        return QString(m_textFrame->itemName());
375 Franz 758
}
759
 
411 Franz 760
bool gtAction::getUpdateParagraphStyles()
761
{
20606 craig 762
        return m_updateParagraphStyles;
411 Franz 763
}
764
 
765
void gtAction::setUpdateParagraphStyles(bool newUPS)
766
{
20606 craig 767
        m_updateParagraphStyles = newUPS;
411 Franz 768
}
769
 
418 Franz 770
bool gtAction::getOverridePStyleFont()
771
{
20606 craig 772
        return m_overridePStyleFont;
418 Franz 773
}
774
void gtAction::setOverridePStyleFont(bool newOPSF)
775
{
20606 craig 776
        m_overridePStyleFont = newOPSF;
418 Franz 777
}
778
 
833 tsoots 779
QString gtAction::parseColor(const QString &s)
780
{
4546 subik 781
        QString ret = CommonStrings::None;
782
        if (s == CommonStrings::None)
833 tsoots 783
                return ret; // don't want None to become Black or any color
784
        bool found = false;
1065 cbradney 785
        ColorList::Iterator it;
20606 craig 786
        for (it = m_textFrame->doc()->PageColors.begin(); it != m_textFrame->doc()->PageColors.end(); ++it)
833 tsoots 787
        {
788
                if (it.key() == s)
789
                {
790
                        ret = it.key();
791
                        found = true;
792
                }
793
        }
794
        if (!found)
795
        {
796
                QColor c;
797
                if( s.startsWith( "rgb(" ) )
798
                {
10394 cbradney 799
                        QString parse = s.trimmed();
10603 fschmid 800
                        QStringList colors = parse.split(',', QString::SkipEmptyParts);
833 tsoots 801
                        QString r = colors[0].right( ( colors[0].length() - 4 ) );
802
                        QString g = colors[1];
803
                        QString b = colors[2].left( ( colors[2].length() - 1 ) );
804
                        if( r.contains( "%" ) )
805
                        {
15498 jghali 806
                                r.chop(1);
13464 cbradney 807
                                r = QString::number( static_cast<int>( ( static_cast<double>( 255 * ScCLocale::toDoubleC(r) ) / 100.0 ) ) );
833 tsoots 808
                        }
809
                        if( g.contains( "%" ) )
810
                        {
15498 jghali 811
                                g.chop(1);
13464 cbradney 812
                                g = QString::number( static_cast<int>( ( static_cast<double>( 255 * ScCLocale::toDoubleC(g) ) / 100.0 ) ) );
833 tsoots 813
                        }
814
                        if( b.contains( "%" ) )
815
                        {
15498 jghali 816
                                b.chop(1);
13464 cbradney 817
                                b = QString::number( static_cast<int>( ( static_cast<double>( 255 * ScCLocale::toDoubleC(b) ) / 100.0 ) ) );
833 tsoots 818
                        }
819
                        c = QColor(r.toInt(), g.toInt(), b.toInt());
820
                }
821
                else
23131 craig 822
                        c.setNamedColor(s.trimmed());
833 tsoots 823
                found = false;
20606 craig 824
                for (it = m_textFrame->doc()->PageColors.begin(); it != m_textFrame->doc()->PageColors.end(); ++it)
833 tsoots 825
                {
20606 craig 826
                        if (c == ScColorEngine::getRGBColor(it.value(), m_textFrame->doc()))
833 tsoots 827
                        {
828
                                ret = it.key();
829
                                found = true;
830
                        }
831
                }
832
                if (!found)
833
                {
2886 fschmid 834
                        ScColor tmp;
833 tsoots 835
                        tmp.fromQColor(c);
20606 craig 836
                        m_textFrame->doc()->PageColors.insert("FromGetText"+c.name(), tmp);
23282 craig 837
                        m_ScMW->contentPalette->updateColorList();
833 tsoots 838
                        ret = "FromGetText"+c.name();
839
                }
840
        }
841
        return ret;
842
}
843
 
364 Franz 844
void gtAction::finalize()
845
{
20606 craig 846
        if (m_textFrame->doc()->docHyphenator->AutoCheck)
847
                m_textFrame->doc()->docHyphenator->slotHyphenate(m_textFrame);
848
        m_textFrame->doc()->regionsChanged()->update(QRectF());
849
        m_textFrame->doc()->changed();
364 Franz 850
}
851
 
852
gtAction::~gtAction()
853
{
854
        finalize();
855
}