Subversion Repositories Scribus

Rev

Rev 10355 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5850 tsoots 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
*/
10195 cbradney 7
#include <QMenu>
10340 subik 8
#include <QToolTip>
10193 subik 9
#include <QMessageBox>
10
 
10340 subik 11
#include "prefsmanager.h"
12
#include "prefsfile.h"
13
#include "commonstrings.h"
14
#include "scribusdoc.h"
15
#include "scribusview.h"
4829 tsoots 16
#include "stylemanager.h"
10340 subik 17
#include "shortcutwidget.h"
18
#include "styleview.h"
4829 tsoots 19
#include "styleitem.h"
5153 tsoots 20
#include "smreplacedia.h"
10340 subik 21
#include "selection.h"
22
#include "customfdialog.h"
8274 tsoots 23
#include "smtextstyles.h"
24
#include "smlinestyle.h"
10355 subik 25
#include "smlinestylewidget.h"
10340 subik 26
#include "smstyleimport.h"
8274 tsoots 27
#include "fileloader.h"
10340 subik 28
#include "scraction.h"
4829 tsoots 29
 
10193 subik 30
 
6976 tsoots 31
const QString StyleManager::SEPARATOR = "$$$$"; // dumb but it works
6949 tsoots 32
 
10355 subik 33
StyleManager::StyleManager(QWidget *parent, const char *name)
34
        : ScrPaletteBase(parent, name), item_(0), widget_(0),
35
        shortcutWidget_(0), currentType_(QString::null), isEditMode_(true), doc_(0)
4829 tsoots 36
{
8524 subik 37
        setupUi(this);
10379 subik 38
 
6072 tsoots 39
        uniqueLabel->hide();
6048 tsoots 40
        rightFrame->hide();
10340 subik 41
 
6051 tsoots 42
        applyButton->setEnabled(false);
43
        resetButton->setEnabled(false);
10193 subik 44
        layout_ = new QGridLayout(mainFrame);
10195 cbradney 45
        newPopup_ = new QMenu(newButton);
46
        rightClickPopup_ = new QMenu(styleView);
6029 tsoots 47
        newButton->setPopup(newPopup_);
6047 tsoots 48
        QString pname(name);
8459 cbradney 49
        if (pname.isEmpty())
6047 tsoots 50
                pname = "styleManager";
51
        prefs_ = PrefsManager::instance()->prefsFile->getContext(pname);
8952 tsoots 52
        isEditMode_ = true;
8428 cbradney 53
        isStoryEditMode_ = false;
6047 tsoots 54
        editPosition_.setX(prefs_->getInt("eX", x()));
55
        editPosition_.setY(prefs_->getInt("eY", y()));
6029 tsoots 56
 
9521 jghali 57
        newButton->setEnabled(false);
58
        cloneButton->setEnabled(false);
59
        importButton->setEnabled(false);
60
        deleteButton->setEnabled(false);
61
        rightClickPopup_->setEnabled(false);
62
        newPopup_->setEnabled(false);
63
 
6044 tsoots 64
        connect(newPopup_, SIGNAL(activated(int)), this, SLOT(slotNewPopup(int)));
65
        connect(okButton, SIGNAL(clicked()), this, SLOT(slotOk()));
8274 tsoots 66
        connect(importButton, SIGNAL(clicked()), this, SLOT(slotImport()));
6044 tsoots 67
        connect(resetButton, SIGNAL(clicked()), this, SLOT(slotClean()));
6025 tsoots 68
        connect(applyButton, SIGNAL(clicked()), this, SLOT(slotApply()));
6029 tsoots 69
        connect(deleteButton, SIGNAL(clicked()), this, SLOT(slotDelete()));
6047 tsoots 70
        connect(cloneButton, SIGNAL(clicked()), this, SLOT(slotClone()));
6044 tsoots 71
        connect(newButton, SIGNAL(clicked()), this, SLOT(slotNew()));
10340 subik 72
        connect(styleView, SIGNAL(customContextMenuRequested(const QPoint &)),
73
                        this, SLOT(slotRightClick(const QPoint &)));
74
        connect(styleView, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
75
                        this, SLOT(slotDoubleClick(QTreeWidgetItem *, int)));
6029 tsoots 76
 
6025 tsoots 77
        languageChange();
5850 tsoots 78
        slotOk();
4829 tsoots 79
}
80
 
6025 tsoots 81
void StyleManager::languageChange()
82
{
7039 tsoots 83
/***********************************/
84
/*      Begin Tooltips             */
85
/***********************************/
86
// These are for general Style Manager widgets (not for c/pstyles except the name field
87
 
88
        // for the "<< Done" button when in edit mode
89
        exitEditModeOk_ = tr("Apply all changes and exit edit mode");
90
        // for the "Edit >>" button when not in edit mode
91
        enterEditModeOk_= tr("Edit styles");
92
 
93
        QToolTip::add(nameEdit,     tr("Name of the selected style"));
94
        QToolTip::add(resetButton,  tr("Reset all changes"));
95
        QToolTip::add(applyButton,  tr("Apply all changes"));
96
        QToolTip::add(newButton,    tr("Create a new style"));
97
        QToolTip::add(importButton, tr("Import styles from another document"));
98
        QToolTip::add(cloneButton,  tr("Clone selected style"));
99
        QToolTip::add(deleteButton, tr("Delete selected styles"));
100
 
101
/***********************************/
102
/*      End Tooltips               */
103
/***********************************/
104
 
6260 fschmid 105
        nameLabel->setText( tr("Name:"));
106
        resetButton->setText( tr("&Reset"));
107
        applyButton->setText( tr("&Apply"));
8428 cbradney 108
        doneText= tr("&Done");
109
        editText= tr("&Edit");
110
        setOkButtonText();
6260 fschmid 111
        newButton->setText( tr("&New"));
112
        importButton->setText( tr("&Import"));
113
        cloneButton->setText( tr("&Clone"));
114
        deleteButton->setText( tr("&Delete"));
8428 cbradney 115
 
6025 tsoots 116
        if (isEditMode_)
7039 tsoots 117
                QToolTip::add(okButton, exitEditModeOk_);
118
        else
119
                QToolTip::add(okButton, enterEditModeOk_);
6025 tsoots 120
 
121
        if (shortcutWidget_)
122
                shortcutWidget_->languageChange();
123
 
6029 tsoots 124
        newPopup_->clear();
6051 tsoots 125
        QStringList popupStrings;
9790 avox 126
        for (int i = 0; i < items_.count(); ++i)
6029 tsoots 127
        {
6051 tsoots 128
                popupStrings << items_.at(i)->typeNameSingular();
6025 tsoots 129
                items_.at(i)->languageChange();
6913 tsoots 130
                styleClassesPS_[items_.at(i)->typeNamePlural()] = items_.at(i)->typeNameSingular();
131
                styleClassesSP_[items_.at(i)->typeNameSingular()] = items_.at(i)->typeNamePlural();
6029 tsoots 132
        }
6051 tsoots 133
        popupStrings.sort();
8578 jghali 134
        for (int i = 0; i < popupStrings.count(); ++i)
6051 tsoots 135
                newPopup_->insertItem(popupStrings[i]);
6029 tsoots 136
 
137
        styleView->clear();
9790 avox 138
        for (int i = 0; i < items_.count(); ++i)
6044 tsoots 139
                addNewType(items_.at(i));
6051 tsoots 140
 
141
        rightClickPopup_->clear();
6913 tsoots 142
        rcpNewId_ = rightClickPopup_->insertItem( tr("New"), newPopup_);
6260 fschmid 143
        rightClickPopup_->insertItem( tr("Import"), this, SLOT(slotImport()));
6051 tsoots 144
        rightClickPopup_->insertSeparator();
7123 fschmid 145
        rcpEditId_ = rightClickPopup_->insertItem( tr("Edit"), this, SLOT(slotEdit()));
6260 fschmid 146
        rcpCloneId_ = rightClickPopup_->insertItem( tr("Clone"), this, SLOT(slotClone()));
147
        rcpToScrapId_ = rightClickPopup_->insertItem( tr("Send to Scrapbook"), this, SLOT(slotScrap()));
6051 tsoots 148
        rightClickPopup_->insertSeparator();
6260 fschmid 149
        rcpDeleteId_ = rightClickPopup_->insertItem( tr("Delete"), this, SLOT(slotDelete()));
6025 tsoots 150
}
151
 
8453 tsoots 152
void StyleManager::unitChange()
153
{
154
        if (doc_)
155
        {
9790 avox 156
                for (int i = 0; i < items_.count(); ++i)
8453 tsoots 157
                        items_.at(i)->unitChange();
158
 
159
                slotSetupWidget();
160
        }
161
}
162
 
8428 cbradney 163
void StyleManager::setOkButtonText()
164
{
165
        if (!isStoryEditMode_)
166
                okButton->setText(isEditMode_ ? "<< " + doneText : editText + " >>");
167
        else
168
                okButton->setText(CommonStrings::tr_OK);
169
}
170
 
7840 cbradney 171
void StyleManager::setDoc(ScribusDoc *doc)
4829 tsoots 172
{
6072 tsoots 173
        if (doc)
5859 tsoots 174
        {
6949 tsoots 175
                doc_ = doc;
6072 tsoots 176
                newButton->setEnabled(true);
177
                cloneButton->setEnabled(true);
178
                importButton->setEnabled(true);
179
                deleteButton->setEnabled(true);
180
                rightClickPopup_->setEnabled(true);
181
                newPopup_->setEnabled(true);
6044 tsoots 182
                connect(doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(slotDocSelectionChanged()));
5859 tsoots 183
        }
6072 tsoots 184
        else
185
        {
6949 tsoots 186
                doc_ = 0;
6072 tsoots 187
                newButton->setEnabled(false);
188
                cloneButton->setEnabled(false);
189
                importButton->setEnabled(false);
190
                deleteButton->setEnabled(false);
191
                rightClickPopup_->setEnabled(false);
192
                newPopup_->setEnabled(false);
193
        }
5859 tsoots 194
 
5850 tsoots 195
        // clear the style list and reload from new doc
196
        styleView->clear();
6949 tsoots 197
        styleActions_.clear();
9790 avox 198
        for (int i = 0; i < items_.count(); ++i)
5850 tsoots 199
        {
4829 tsoots 200
                items_.at(i)->currentDoc(doc);
6044 tsoots 201
                addNewType(items_.at(i)); // forces a reload
8453 tsoots 202
                if (doc_)
203
                        items_.at(i)->unitChange();
5850 tsoots 204
        }
4829 tsoots 205
}
206
 
8443 cbradney 207
void StyleManager::updateColorList()
208
{
9790 avox 209
        for (int i = 0; i < items_.count(); ++i)
8443 cbradney 210
        {
211
                items_.at(i)->currentDoc(doc_);
212
                items_.at(i)->reload();
213
        }
214
}
215
 
4829 tsoots 216
void StyleManager::addStyle(StyleItem *item)
217
{
218
        items_.append(item);
6044 tsoots 219
        addNewType(item);
9664 tsoots 220
        languageChange(); // upgrade the popup menu with the new item
6025 tsoots 221
        connect(item, SIGNAL(selectionDirty()), this, SLOT(slotDirty()));
4829 tsoots 222
}
223
 
224
void StyleManager::slotApply()
225
{
6072 tsoots 226
        if (applyButton->isEnabled())
227
        {
9790 avox 228
                for (int i = 0; i < items_.count(); ++i)
6072 tsoots 229
                        items_.at(i)->apply();
230
        }
6025 tsoots 231
 
232
        slotClean();
4829 tsoots 233
}
234
 
235
void StyleManager::slotDelete()
236
{
6915 tsoots 237
        if (!isEditMode_)
238
                slotOk(); // switch to edit mode before deleting
239
 
6913 tsoots 240
        QStringList selected;
6051 tsoots 241
 
8459 cbradney 242
        if (!rcStyle_.isNull())
6913 tsoots 243
                selected << rcStyle_;
244
        else
245
        {
10340 subik 246
                QTreeWidgetItemIterator it(styleView, QTreeWidgetItemIterator::Selected);
247
                while (*it)
248
                {
249
                        selected << (*it)->text(0);
6913 tsoots 250
                        ++it;
251
                }
5153 tsoots 252
        }
9790 avox 253
        if (!item_ || selected.isEmpty())
6044 tsoots 254
                return; // nothing to delete
255
 
5850 tsoots 256
        QStringList tmp;
9790 avox 257
        QList<StyleName> styles = item_->styles(false); // get list from cache
8578 jghali 258
        for (int i = 0; i < styles.count(); ++i)
5850 tsoots 259
                tmp << styles[i].first;
8814 cbradney 260
        SMReplaceDia *dia = new SMReplaceDia(selected, tmp, this);
6051 tsoots 261
        if (dia->exec() && item_)
5153 tsoots 262
        {
6051 tsoots 263
                item_->deleteStyles(dia->items());
264
                applyButton->setEnabled(true);
265
                resetButton->setEnabled(true);
266
                reloadStyleView(false);
5153 tsoots 267
        }
6051 tsoots 268
 
5153 tsoots 269
        delete dia;
4829 tsoots 270
}
271
 
272
 
273
void StyleManager::slotImport()
274
{
8274 tsoots 275
        if (!doc_)
276
                return;
277
 
278
        PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
279
        QString wdir = dirs->get("editformats", ".");
8286 tsoots 280
        CustomFDialog dia(this, wdir, tr("Open"), tr("documents (*.sla *.sla.gz *.scd *.scd.gz);;All Files (*)"));
8274 tsoots 281
        if (dia.exec() == QDialog::Accepted)
282
        {
283
                QString selectedFile = dia.selectedFile();
284
                dirs->set("editformats", selectedFile.left(selectedFile.findRev("/")));
285
 
286
                StyleSet<ParagraphStyle> tmpParaStyles;
287
                StyleSet<CharStyle> tmpCharStyles;
288
                QMap<QString, multiLine> tmpLineStyles;
289
 
290
                doc_->loadStylesFromFile(selectedFile, &tmpParaStyles, &tmpCharStyles, &tmpLineStyles);
291
 
292
// FIXME Once all styles are derived from Style remove this and make a proper
293
//       implementation
294
// Start hack
295
 
296
                SMParagraphStyle *pstyle = 0;
297
                SMCharacterStyle *cstyle = 0;
298
                SMLineStyle      *lstyle = 0;
9790 avox 299
                for (int i = 0; i < items_.count(); ++i)
8274 tsoots 300
                {
301
                        pstyle = dynamic_cast<SMParagraphStyle*>(items_.at(i));
302
                        if (pstyle)
303
                                break;
304
                }
9790 avox 305
                for (int i = 0; i < items_.count(); ++i)
8274 tsoots 306
                {
307
                        cstyle = dynamic_cast<SMCharacterStyle*>(items_.at(i));
308
                        if (cstyle)
309
                                break;
310
                }
9790 avox 311
                for (int i = 0; i < items_.count(); ++i)
8274 tsoots 312
                {
313
                        lstyle = dynamic_cast<SMLineStyle*>(items_.at(i));
314
                        if (lstyle)
315
                                break;
316
                }
317
 
318
                Q_ASSERT(pstyle && cstyle && lstyle);
319
 
10332 subik 320
                SMStyleImport *dia2 = new SMStyleImport(this, &tmpParaStyles, &tmpCharStyles, &tmpLineStyles);
8274 tsoots 321
// end hack
322
 
9790 avox 323
                QList<QPair<QString, QString> > selected;
8274 tsoots 324
                if (dia2->exec())
325
                {
8286 tsoots 326
                        if (!isEditMode_)
327
                                slotOk();
8274 tsoots 328
                        QStringList neededColors;
329
                        neededColors.clear();
10332 subik 330
 
331
                        foreach (QString aStyle, dia2->paragraphStyles())
8274 tsoots 332
                        {
10332 subik 333
                                ParagraphStyle& sty(tmpParaStyles[tmpParaStyles.find(aStyle)]);
334
                                if (dia2->clashRename())
8274 tsoots 335
                                {
10332 subik 336
                                        sty.setName(pstyle->getUniqueName(sty.name()));
337
                                        pstyle->tmpStyles()->create(sty);
338
                                }
339
                                else
340
                                {
341
                                        if (pstyle->tmpStyles()->find(sty.name()) >= 0)
342
                                                (*(pstyle->tmpStyles()))[pstyle->tmpStyles()->find(/*it.data()*/aStyle)] = sty;
343
                                        else
8274 tsoots 344
                                                pstyle->tmpStyles()->create(sty);
345
                                }
10332 subik 346
                                selected << QPair<QString, QString>(pstyle->typeName(), sty.name());
347
                                if ((!doc_->PageColors.contains(sty.charStyle().strokeColor())) && (!neededColors.contains(sty.charStyle().strokeColor())))
348
                                        neededColors.append(sty.charStyle().strokeColor());
349
                                if ((!doc_->PageColors.contains(sty.charStyle().fillColor())) && (!neededColors.contains(sty.charStyle().fillColor())))
350
                                        neededColors.append(sty.charStyle().fillColor());
8274 tsoots 351
                        }
352
 
10332 subik 353
                        foreach (QString aStyle, dia2->characterStyles())
8286 tsoots 354
                        {
10332 subik 355
                                CharStyle& sty(tmpCharStyles[tmpCharStyles.find(/*it.data()*/aStyle)]);
356
                                if (dia2->clashRename())
8286 tsoots 357
                                {
10332 subik 358
                                        sty.setName(cstyle->getUniqueName(sty.name()));
359
                                        cstyle->tmpStyles()->create(sty);
360
                                }
361
                                else
362
                                {
363
                                        if (cstyle->tmpStyles()->find(sty.name()) >= 0)
364
                                                (*(cstyle->tmpStyles()))[cstyle->tmpStyles()->find(/*it.data()*/aStyle)] = sty;
365
                                        else
8286 tsoots 366
                                                cstyle->tmpStyles()->create(sty);
367
                                }
10332 subik 368
                                selected << QPair<QString, QString>(cstyle->typeName(), sty.name());
369
                                if ((!doc_->PageColors.contains(sty.strokeColor())) && (!neededColors.contains(sty.strokeColor())))
370
                                        neededColors.append(sty.strokeColor());
371
                                if ((!doc_->PageColors.contains(sty.fillColor())) && (!neededColors.contains(sty.fillColor())))
372
                                        neededColors.append(sty.fillColor());
8286 tsoots 373
                        }
8274 tsoots 374
 
10332 subik 375
                        foreach (QString aStyle, dia2->lineStyles())
8286 tsoots 376
                        {
10332 subik 377
                                multiLine &sty = tmpLineStyles[/*it.data()*/aStyle];
378
                                QString styName = aStyle;
8286 tsoots 379
 
10332 subik 380
                                if (dia2->clashRename())
381
                                        styName = lstyle->getUniqueName(aStyle);
382
 
383
                                lstyle->tmpLines[styName] = sty;
384
                                selected << QPair<QString, QString>(lstyle->typeName(), styName);
385
 
386
                                for (int i = 0; i < sty.count(); ++i)
8286 tsoots 387
                                {
10332 subik 388
                                        if ((!doc_->PageColors.contains(sty[i].Color)) && (!neededColors.contains(sty[i].Color)))
389
                                                neededColors.append(sty[i].Color);
8286 tsoots 390
                                }
391
                        }
392
 
8274 tsoots 393
                        if (!neededColors.isEmpty())
394
                        {
395
                                FileLoader fl(selectedFile);
396
                                if (fl.TestFile() == -1)
8286 tsoots 397
                                { //TODO put in nice user warning
398
                                        delete dia2;
8274 tsoots 399
                                        return;
8286 tsoots 400
                                }
8274 tsoots 401
                                ColorList LColors;
402
                                if (fl.ReadColors(selectedFile, LColors))
403
                                {
404
                                        ColorList::Iterator itc;
405
                                        for (itc = LColors.begin(); itc != LColors.end(); ++itc)
406
                                        {
407
                                                if (neededColors.contains(itc.key()))
408
                                                        doc_->PageColors.insert(itc.key(), itc.data());
409
                                        }
410
                                }
411
                        }
412
                }
413
                delete dia2;
8292 tsoots 414
// Start hack part 2
415
                pstyle->currentDoc(doc_);
416
                cstyle->currentDoc(doc_);
417
// end hack part 2
8274 tsoots 418
                reloadStyleView(false);
8286 tsoots 419
                setSelection(selected);
420
                slotDirty();
421
                slotSetupWidget();
8274 tsoots 422
        }
423
        else
424
                return;
4829 tsoots 425
}
426
 
9790 avox 427
void StyleManager::setSelection(const QList<QPair<QString, QString> > &selected)
8286 tsoots 428
{
429
        styleView->clearSelection();
430
 
10340 subik 431
        QTreeWidgetItemIterator it(styleView, QTreeWidgetItemIterator::Selectable);
8286 tsoots 432
        StyleViewItem *item;
433
 
10340 subik 434
        while (*it)
8286 tsoots 435
        {
10340 subik 436
                item = dynamic_cast<StyleViewItem*>(*it);
8286 tsoots 437
                if (item)
438
                {
8578 jghali 439
                        for (int i = 0; i < selected.count(); ++i)
8286 tsoots 440
                        {
441
                                if (item->rootName() == selected[i].first && item->text(NAME_COL) == selected[i].second)
442
                                {
443
                                        styleView->setCurrentItem(item);
444
                                        item->setSelected(true);
445
                                }
446
                        }
447
                }
448
                ++it;
449
        }
450
}
451
 
6913 tsoots 452
void StyleManager::slotEdit()
453
{
454
        if (!isEditMode_)
455
                slotOk(); // switch to edit mode for cloning
4829 tsoots 456
 
8459 cbradney 457
        if (!rcStyle_.isNull())
6913 tsoots 458
        {
10340 subik 459
                QTreeWidgetItemIterator it(styleView);
460
                while (*it)
6913 tsoots 461
                {
10340 subik 462
                        StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it);
6913 tsoots 463
                        if (item && !item->isRoot())
464
                        {
465
                                if (item->rootName() == styleClassesSP_[rcType_] &&
466
                                    item->text(0) == rcStyle_)
467
                                {
468
                                        styleView->setCurrentItem(item);
469
                                        item->setSelected(true);
470
                                        break;
471
                                }
472
                        }
473
                        ++it;
474
                }
475
                rcStyle_ = QString::null;
476
                rcType_ = QString::null;
477
        }
478
}
479
 
480
 
4829 tsoots 481
void StyleManager::slotClone()
482
{
6051 tsoots 483
        if (!isEditMode_)
484
                slotOk(); // switch to edit mode for cloning
485
 
8459 cbradney 486
        if (!rcStyle_.isNull())
6913 tsoots 487
        {
10340 subik 488
                QTreeWidgetItemIterator it(styleView);
489
                while (*it)
6913 tsoots 490
                {
10340 subik 491
                        StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it);
6913 tsoots 492
                        if (item && !item->isRoot())
493
                        {
494
                                if (item->rootName() == styleClassesSP_[rcType_] &&
495
                                    item->text(0) == rcStyle_)
496
                                {
497
                                        styleView->setCurrentItem(item);
498
                                        item->setSelected(true);
499
                                        break;
500
                                }
501
                        }
502
                        ++it;
503
                }
504
                rcStyle_ = QString::null;
505
                rcType_ = QString::null;
506
        }
507
 
10340 subik 508
        QTreeWidgetItemIterator it(styleView, QTreeWidgetItemIterator::Selected);
9790 avox 509
        QList<QPair<QString, QString> > names;
6047 tsoots 510
 
10340 subik 511
        while (*it)
6047 tsoots 512
        { // can't create styles here cause createNewStyle() alters the selection
10340 subik 513
                StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it);
6047 tsoots 514
                if (item)
515
                        names << QPair<QString, QString>(item->rootName(), item->text(NAME_COL));
516
                ++it;
517
        }
518
 
8578 jghali 519
        for (int i = 0; i < names.count(); ++i)
6047 tsoots 520
                createNewStyle(names[i].first, names[i].second);
4829 tsoots 521
}
522
 
6051 tsoots 523
void StyleManager::slotScrap()
524
{
525
 
526
}
4829 tsoots 527
 
6051 tsoots 528
 
4829 tsoots 529
void StyleManager::slotNew()
530
{
8322 cbradney 531
//#5334: Dont open into edit mdoe until user has selected a style type
532
//      if (!isEditMode_)
533
//              slotOk(); // switch to edit mode for a new style
6051 tsoots 534
 
6044 tsoots 535
        // TODO maybe there's something more clever for this
536
        newPopup_->exec(newButton->mapToGlobal(QPoint(0, newButton->height() + 2)));
4829 tsoots 537
}
538
 
6029 tsoots 539
void StyleManager::slotNewPopup(int i)
540
{
6051 tsoots 541
        if (!isEditMode_)
542
                slotOk(); // switch to edit mode for a new style
543
 
6913 tsoots 544
        QString typeName = rcType_;
8459 cbradney 545
        if (typeName.isNull())
6913 tsoots 546
                typeName = newPopup_->text(i);
8459 cbradney 547
        else if (typeName.isNull() && i < 0)
7744 tsoots 548
                return; // nothing to create
6913 tsoots 549
 
6915 tsoots 550
        rcType_ = QString::null;
551
        rcStyle_ = QString::null;
552
 
6047 tsoots 553
        createNewStyle(typeName);
554
}
555
 
10340 subik 556
void StyleManager::slotRightClick(/*StyleViewItem *item, */const QPoint &point/*, int col*/)
6051 tsoots 557
{
10340 subik 558
        StyleViewItem *item = static_cast<StyleViewItem*>(styleView->currentItem());
6913 tsoots 559
        rcStyle_ = QString::null;
560
        rcType_ = QString::null;
561
 
562
        if (isEditMode_ && item) // make item the only selection if in edit mode
563
        {                        // default behaviour for right clicking is not to select the item
564
                styleView->clearSelection();
565
                styleView->setCurrentItem(item);
566
                item->setSelected(true);
567
        }
568
 
10340 subik 569
        if (item && !item->isRoot())
6051 tsoots 570
        {
6913 tsoots 571
                rightClickPopup_->removeItem(rcpNewId_);
10340 subik 572
                rcpNewId_ = rightClickPopup_->insertItem( tr("New %1").arg(styleClassesPS_[item->rootName()]),
6913 tsoots 573
                                                         this, SLOT(slotNewPopup(int)), 0, -1, 0);
6051 tsoots 574
                rightClickPopup_->setItemEnabled(rcpDeleteId_, true);
6913 tsoots 575
                rightClickPopup_->setItemEnabled(rcpEditId_, true);
6051 tsoots 576
                rightClickPopup_->setItemEnabled(rcpCloneId_, true);
577
                rightClickPopup_->setItemEnabled(rcpToScrapId_, true);
10340 subik 578
                rcStyle_ = item->text(0);
579
                rcType_ = styleClassesPS_[item->rootName()];
580
                loadType(styleClassesPS_[item->rootName()]);
6051 tsoots 581
        }
10340 subik 582
        else if (item && item->isRoot())
6913 tsoots 583
        {
584
                rightClickPopup_->removeItem(rcpNewId_);
10340 subik 585
                rcpNewId_ = rightClickPopup_->insertItem( tr("New %1").arg(styleClassesPS_[item->text(0)]),
6913 tsoots 586
                                                         this, SLOT(slotNewPopup(int)), 0, -1, 0);
587
                rightClickPopup_->setItemEnabled(rcpDeleteId_, false);
588
                rightClickPopup_->setItemEnabled(rcpEditId_, false);
589
                rightClickPopup_->setItemEnabled(rcpCloneId_, false);
590
                rightClickPopup_->setItemEnabled(rcpToScrapId_, false);
10340 subik 591
                rcType_ = styleClassesPS_[item->text(0)];
6913 tsoots 592
                loadType(rcType_);
593
        }
6051 tsoots 594
        else
595
        {
6913 tsoots 596
                rightClickPopup_->removeItem(rcpNewId_);
7123 fschmid 597
                rcpNewId_ = rightClickPopup_->insertItem( tr("New"), newPopup_, -1, 0);
6051 tsoots 598
                rightClickPopup_->setItemEnabled(rcpDeleteId_, false);
6913 tsoots 599
                rightClickPopup_->setItemEnabled(rcpEditId_, false);
6051 tsoots 600
                rightClickPopup_->setItemEnabled(rcpCloneId_, false);
601
                rightClickPopup_->setItemEnabled(rcpToScrapId_, false);
602
        }
603
 
10340 subik 604
        rightClickPopup_->exec(styleView->mapToGlobal(point));
6051 tsoots 605
}
606
 
10340 subik 607
void StyleManager::slotDoubleClick(QTreeWidgetItem *item, /*const QPoint &point, */int col)
7744 tsoots 608
{
609
        rcStyle_ = QString::null;
610
        rcType_ = QString::null;
611
 
612
        if (isEditMode_ && item) // make item the only selection if in edit mode
613
        {
614
                styleView->clearSelection();
615
                styleView->setCurrentItem(item);
616
                item->setSelected(true);
617
                return; // work done, already in edit mode
618
        }
619
 
620
        StyleViewItem *sitem = dynamic_cast<StyleViewItem*>(item);
621
        if (sitem && !sitem->isRoot())
622
        {
623
                rcType_ = sitem->rootName();
624
                rcStyle_ = sitem->text(0);
625
                slotOk(); // switch to edit mode
626
        }
627
        else if (sitem && sitem->isRoot())
628
        {
629
                rcType_ = sitem->text(0);
630
                slotNewPopup(-1);
631
        }
632
        rcStyle_ = QString::null;
633
        rcType_ = QString::null;
634
}
635
 
6047 tsoots 636
void StyleManager::createNewStyle(const QString &typeName, const QString &fromParent)
637
{
9521 jghali 638
        if (!doc_)
639
                return;
6913 tsoots 640
        loadType(typeName); // get the right style class
6044 tsoots 641
        Q_ASSERT(item_);
8459 cbradney 642
        QString newName = fromParent.isNull() ?
6047 tsoots 643
                        item_->newStyle() : item_->newStyle(fromParent);
8459 cbradney 644
        if (newName.isNull())
6044 tsoots 645
                return;
10340 subik 646
        StyleViewItem *root = 0;
647
        QTreeWidgetItemIterator it(styleView, QTreeWidgetItemIterator::NotSelectable);
648
        while (*it)
6044 tsoots 649
        {
10340 subik 650
                StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it);
6044 tsoots 651
                if (item)
652
                {
653
                        if (item->text(NAME_COL) == item_->typeName())
654
                        {
655
                                root = item;
656
                                break;
657
                        }
658
                }
659
                ++it;
660
        }
9810 avox 661
        assert(root);
6044 tsoots 662
        styleView->clearSelection();
663
        StyleViewItem *newItem = new StyleViewItem(root, newName, item_->typeName());
664
        Q_CHECK_PTR(newItem);
665
        newItem->setDirty(true);
666
        styleView->setCurrentItem(newItem);
667
        newItem->setSelected(true);
668
        slotSetupWidget();
6047 tsoots 669
        nameEdit->setFocus();
670
        nameEdit->selectAll();
6051 tsoots 671
        applyButton->setEnabled(true);
672
        resetButton->setEnabled(true);
6029 tsoots 673
}
674
 
7047 tsoots 675
// open or close edit mode
5850 tsoots 676
void StyleManager::slotOk()
677
{
7065 tsoots 678
        static bool isFirst = true;
5850 tsoots 679
        if (isEditMode_)
680
        {
10340 subik 681
                disconnect(styleView, SIGNAL(itemSelectionChanged()), this, SLOT(slotSetupWidget()));
5850 tsoots 682
                slotApply();
10340 subik 683
                styleView->setSelectionMode(QAbstractItemView::MultiSelection);
6260 fschmid 684
                okButton->setText(QString("%1 >>").arg( tr("&Edit")));
5850 tsoots 685
                editFrame->hide();
686
                applyButton->hide();
6044 tsoots 687
                resetButton->hide();
6047 tsoots 688
                rightFrame->hide();
5850 tsoots 689
                isEditMode_ = false;
9790 avox 690
                for (int i = 0; i < items_.count(); ++i)
6023 tsoots 691
                {
692
                        items_.at(i)->apply();
693
                        items_.at(i)->editMode(false);
694
                }
7039 tsoots 695
                QToolTip::add(okButton, enterEditModeOk_);
6025 tsoots 696
                slotClean();
6044 tsoots 697
                slotDocSelectionChanged();
10379 subik 698
 
7065 tsoots 699
                if (!isFirst)
700
                        move(editPosition_);
6047 tsoots 701
                prefs_->set("isEditMode", isEditMode_);
10340 subik 702
                connect(styleView, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
703
                        this, SLOT(slotApplyStyle(QTreeWidgetItem*,QTreeWidgetItem*)));
704
                connect(styleView, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
705
                                this, SLOT(slotApplyStyle(QTreeWidgetItem*,int)));
8428 cbradney 706
                if (isStoryEditMode_)
707
                {
708
                        isStoryEditMode_=false;
709
                        hide();
710
                }
5850 tsoots 711
        }
712
        else
713
        {
10340 subik 714
                disconnect(styleView, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
715
                                   this, SLOT(slotApplyStyle(QTreeWidgetItem*,QTreeWidgetItem*)));
716
                disconnect(styleView, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
717
                                   this, SLOT(slotApplyStyle(QTreeWidgetItem*,int)));
9663 tsoots 718
 
6044 tsoots 719
                slotSetupWidget();
10340 subik 720
                styleView->setSelectionMode(QAbstractItemView::ExtendedSelection);
6047 tsoots 721
                editPosition_.setX(x());
722
                editPosition_.setY(y());
723
                prefs_->set("eX", x());
724
                prefs_->set("eY", y());
5850 tsoots 725
                editFrame->show();
726
                applyButton->show();
6044 tsoots 727
                resetButton->show();
6047 tsoots 728
                rightFrame->show();
5850 tsoots 729
                isEditMode_ = true;
9790 avox 730
                for (int i = 0; i < items_.count(); ++i)
6023 tsoots 731
                        items_.at(i)->editMode(true);
7039 tsoots 732
                QToolTip::add(okButton, exitEditModeOk_);
6025 tsoots 733
                slotClean();
10379 subik 734
 
6047 tsoots 735
                prefs_->set("isEditMode", isEditMode_);
10340 subik 736
                connect(styleView, SIGNAL(itemSelectionChanged()), this, SLOT(slotSetupWidget()));
5850 tsoots 737
        }
8428 cbradney 738
        setOkButtonText();
10379 subik 739
        isFirst = false;
740
 
741
        resize(1, 1); // megahack to keep palette small
742
        updateGeometry();
743
        adjustSize();
5850 tsoots 744
}
745
 
6051 tsoots 746
void StyleManager::addNewType(StyleItem *item, bool loadFromDoc)
4829 tsoots 747
{
748
        if (item) {
5850 tsoots 749
                item_ = item;
750
 
9790 avox 751
                QList<StyleName> styles = item_->styles(loadFromDoc);
6102 tsoots 752
                StyleViewItem *rootItem = new StyleViewItem(styleView, item_->typeName());
10340 subik 753
                styleView->expandItem(rootItem);
6102 tsoots 754
                QMap<QString, StyleViewItem*> sitems;
755
 
8578 jghali 756
                for (int i = 0; i < styles.count(); ++i) // set the list of styles of this type
5850 tsoots 757
                {
6949 tsoots 758
                        StyleViewItem *sitem;
8459 cbradney 759
                        if (styles[i].second.isNull())
6102 tsoots 760
                        {
6949 tsoots 761
                                sitem = new StyleViewItem(rootItem, styles[i].first, item_->typeName());
6102 tsoots 762
                        }
8788 cbradney 763
                        else if (sitems.contains(styles[i].second))
6102 tsoots 764
                        {
8788 cbradney 765
                                StyleViewItem *parent = sitems[styles[i].second];
766
                                sitem = new StyleViewItem(parent, styles[i].first, item_->typeName());
10340 subik 767
                                styleView->expandItem(parent);
8788 cbradney 768
                        }
769
                        else
770
                        {
771
                                bool postpone = false;
772
                                // search if parent is in remaing styles
8905 jghali 773
                                for (int j = i+1; j < styles.count(); ++j)
8126 tsoots 774
                                {
8788 cbradney 775
                                        if (styles[j].first == styles[i].second)
776
                                        {
777
                                                styles.append(styles[i]); // postpone
778
                                                postpone = true;
779
                                        }
780
                                }
781
                                if (postpone)
8126 tsoots 782
                                        continue;
8788 cbradney 783
                                else
784
                                {
785
                                        qDebug(QString("stylemanager: unknown parent '%1' of %2 style '%3'").arg(styles[i].second).arg(item_->typeName()).arg(styles[i].first));
786
                                        sitem = new StyleViewItem(rootItem, styles[i].first, item_->typeName());
8126 tsoots 787
                                }
6102 tsoots 788
                        }
8788 cbradney 789
 
790
                        sitems[styles[i].first] = sitem;
791
                        sitem->setText(SHORTCUT_COL, item_->shortcut(sitem->text(NAME_COL)));
792
 
7752 tsoots 793
                        QString key = sitem->rootName() + SEPARATOR + sitem->text(NAME_COL);
794
                        if (styleActions_.contains(key))
795
                                continue;
796
 
797
                        styleActions_[key] =
9857 cbradney 798
                                new ScrAction(ScrAction::DataQString, QPixmap(), QPixmap(), "", sitem->text(SHORTCUT_COL), doc_->view(), 0, 0.0, key);
7752 tsoots 799
                        connect(styleActions_[key], SIGNAL(activatedData(QString)),
800
                                        this, SLOT(slotApplyStyle(QString)));
4829 tsoots 801
                }
6044 tsoots 802
        }
4829 tsoots 803
}
804
 
6025 tsoots 805
void StyleManager::slotDirty()
806
{
10340 subik 807
        QTreeWidgetItemIterator it(styleView, QTreeWidgetItemIterator::Selected);
6025 tsoots 808
 
10340 subik 809
        while (*it)
810
        {
811
                StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it);
6025 tsoots 812
                if (item)
813
                {
814
                        item->setDirty(true);
815
                        applyButton->setEnabled(true);
6044 tsoots 816
                        resetButton->setEnabled(true);
6025 tsoots 817
                }
818
                ++it;
819
        }
6051 tsoots 820
        applyButton->setEnabled(true);
821
        resetButton->setEnabled(true);
6025 tsoots 822
}
823
 
824
void StyleManager::slotClean()
825
{
10340 subik 826
        QTreeWidgetItemIterator it(styleView);
6025 tsoots 827
 
10340 subik 828
        while (*it)
829
        {
830
                StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it);
6025 tsoots 831
                if (item)
832
                        item->setDirty(false);
833
                ++it;
834
        }
6029 tsoots 835
 
8287 tsoots 836
        if (isEditMode_)
6029 tsoots 837
        {
8287 tsoots 838
                StyleItem *tmp = item_;
839
 
9790 avox 840
                for (int i = 0; i < items_.count(); ++i)
8287 tsoots 841
                {
842
                        item_ = items_.at(i);
843
                        reloadStyleView();
844
                }
6044 tsoots 845
                slotSetupWidget();
8287 tsoots 846
                item_ = tmp;
6029 tsoots 847
        }
6051 tsoots 848
        applyButton->setEnabled(false);
849
        resetButton->setEnabled(false);
6072 tsoots 850
        uniqueLabel->hide();
6025 tsoots 851
}
852
 
6051 tsoots 853
void StyleManager::reloadStyleView(bool loadFromDoc)
6047 tsoots 854
{
10340 subik 855
        QTreeWidgetItemIterator it(styleView, QTreeWidgetItemIterator::Selected);
9790 avox 856
        QList<QPair<QString, QString> > selected;
6047 tsoots 857
 
10340 subik 858
        while (*it)
6047 tsoots 859
        {
10340 subik 860
                StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it);
6047 tsoots 861
                if (item)
862
                        selected << QPair<QString, QString>(item->rootName(), item->text(NAME_COL));
863
                ++it;
864
        }
865
 
866
        styleView->clear();
6051 tsoots 867
        if (item_ && loadFromDoc)
6047 tsoots 868
                item_->reload();
869
 
9790 avox 870
        for (int i = 0; i < items_.count(); ++i)
6051 tsoots 871
                addNewType(items_.at(i), false);
6047 tsoots 872
 
10340 subik 873
        QTreeWidgetItemIterator it2(styleView, QTreeWidgetItemIterator::Selectable);
6047 tsoots 874
 
10340 subik 875
        while (*it2)
6047 tsoots 876
        {
10340 subik 877
                StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it2);
6047 tsoots 878
                if (item)
879
                {
8613 cbradney 880
                        for (int i = 0; i < selected.count(); ++i)
6047 tsoots 881
                        {
882
                                if (selected[i].first == item->rootName() &&
883
                                    selected[i].second == item->text(NAME_COL))
884
                                {
885
                                        item->setDirty(false);
886
                                        styleView->setCurrentItem(item);
887
                                        item->setSelected(true);
888
                                        break;
889
                                }
890
                        }
891
                }
892
                ++it2;
893
        }
894
 
895
        styleView->repaint();
896
}
897
 
5850 tsoots 898
void StyleManager::insertShortcutPage(QTabWidget *twidget)
4829 tsoots 899
{
5850 tsoots 900
        if (twidget)
901
        {
902
                if (!shortcutWidget_)
6091 tsoots 903
                {
5850 tsoots 904
                        shortcutWidget_ = new ShortcutWidget(0, "shortcutWidget_");
6091 tsoots 905
                        connect(shortcutWidget_, SIGNAL(newKey(const QString&)),
906
                                        this, SLOT(slotShortcutChanged(const QString&)));
907
                }
5850 tsoots 908
                twidget->addTab(shortcutWidget_, tr("Shortcut"));
909
        }
910
}
4829 tsoots 911
 
912
void StyleManager::slotNameChanged(const QString& name)
913
{
9790 avox 914
        if (item_ && !nameIsUnique(name))
6072 tsoots 915
        {
916
                uniqueLabel->show();
917
                okButton->setEnabled(false);
918
                applyButton->setEnabled(false);
919
                return;
920
        }
921
        else if (uniqueLabel->isVisible())
922
        {
923
                uniqueLabel->hide();
924
                okButton->setEnabled(true);
925
                applyButton->setEnabled(true);
926
        }
927
 
6949 tsoots 928
 
4829 tsoots 929
        if (item_)
6949 tsoots 930
        {
4829 tsoots 931
                item_->nameChanged(name);
6949 tsoots 932
                updateActionName(styleView->currentItem()->text(NAME_COL), name);
8965 avox 933
                styleView->currentItem()->setText(NAME_COL, name);
934
                applyButton->setEnabled(true);
935
                resetButton->setEnabled(true);
6949 tsoots 936
        }
4829 tsoots 937
}
938
 
8965 avox 939
 
6949 tsoots 940
void StyleManager::updateActionName(const QString &oldName, const QString &newName)
941
{
942
        if (!item_)
943
                return;
944
        QString oldKey = item_->typeName() + SEPARATOR + oldName;
945
        QString newKey = item_->typeName() + SEPARATOR + newName;
946
 
947
        if (styleActions_.contains(oldKey))
948
        {
949
                ScrAction *a = styleActions_[oldKey];
950
                disconnect(a, SIGNAL(activatedData(QString)), this, SLOT(slotApplyStyle(QString)));
8613 cbradney 951
                ScrAction *b = new ScrAction(ScrAction::DataQString, QPixmap(), QPixmap(), "",
9857 cbradney 952
                                       a->accel(), doc_->view(), 0, 0.0, newKey);
6949 tsoots 953
                styleActions_.remove(oldKey);
954
                delete a;
955
                styleActions_[newKey] = b;
956
                connect(b, SIGNAL(activatedData(QString)), this, SLOT(slotApplyStyle(QString)));
957
        }
958
}
959
 
6091 tsoots 960
void StyleManager::slotShortcutChanged(const QString& shortcut)
961
{
6949 tsoots 962
        if (!doc_)
963
                return;
964
 
965
        StyleViewItem *sitem = dynamic_cast<StyleViewItem*>(styleView->currentItem());
966
        if (!sitem)
967
                return;
968
 
8459 cbradney 969
        if (!shortcut.isNull() && shortcutExists(shortcut))
6949 tsoots 970
        {
971
                QMessageBox::information(this, CommonStrings::trWarning,
972
                                         tr("This key sequence is already in use"),
973
                                         CommonStrings::tr_OK);
974
                shortcutWidget_->setShortcut(item_->shortcut(sitem->text(NAME_COL)));
975
                return;
976
        }
977
 
8459 cbradney 978
        sitem->setText(SHORTCUT_COL, shortcut.isNull() ? "" : shortcut);
6949 tsoots 979
        QString key = sitem->rootName() + SEPARATOR + sitem->text(NAME_COL);
980
        if (styleActions_.contains(key))
981
                styleActions_[key]->setAccel(shortcut);
982
        else
983
        {
984
                styleActions_[key] =
9857 cbradney 985
                        new ScrAction(ScrAction::DataQString, QPixmap(), QPixmap(), "", shortcut, doc_->view(), 0, 0.0, key);
6949 tsoots 986
                connect(styleActions_[key], SIGNAL(activatedData(QString)),
987
                        this, SLOT(slotApplyStyle(QString)));
988
        }
989
 
990
        if (item_)
991
                item_->setShortcut(shortcut);
6091 tsoots 992
}
993
 
6949 tsoots 994
bool StyleManager::shortcutExists(const QString &keys)
995
{
996
        QKeySequence key(keys);
997
 
8501 cbradney 998
        QMap<QString, QPointer<ScrAction> >::iterator it;
6949 tsoots 999
        for (it = styleActions_.begin(); it != styleActions_.end(); ++it)
1000
        {
1001
                if ((*it)->accel() == key)
1002
                        return true;
1003
        }
1004
 
1005
        ApplicationPrefs *prefsData=&(PrefsManager::instance()->appPrefs);
1006
        for (QMap<QString,Keys>::Iterator it=prefsData->KeyActions.begin();
1007
             it!=prefsData->KeyActions.end(); ++it)
1008
        {
8613 cbradney 1009
                if (key.matches(it.data().keySequence) != QKeySequence::NoMatch)
6949 tsoots 1010
                        return true;
1011
        }
1012
 
1013
        return false;
1014
}
1015
 
1016
void StyleManager::slotApplyStyle(QString keyString)
1017
{
1018
        if (isEditMode_)
1019
                return;
1020
 
1021
        QStringList slist = QStringList::split(SEPARATOR, keyString);
1022
        Q_ASSERT(slist.count() == 2);
1023
 
1024
        loadType(slist[0]);
1025
        item_->toSelection(slist[1]);
1026
        slotDocSelectionChanged();
1027
}
1028
 
6072 tsoots 1029
bool StyleManager::nameIsUnique(const QString &name)
1030
{
9790 avox 1031
        QList<StyleName> names = item_->styles(false);
8578 jghali 1032
        for (int i = 0; i < names.count(); ++i)
6072 tsoots 1033
        {
1034
                if (names[i].first == name)
1035
                        return false;
1036
        }
1037
        return true;
1038
}
6044 tsoots 1039
 
1040
// setups the selected type and edit widgets related to it
1041
void StyleManager::slotSetupWidget()
5859 tsoots 1042
{
6044 tsoots 1043
        QPair<QString, QStringList> selection = namesFromSelection();
1044
        QString typeName = selection.first;
5859 tsoots 1045
 
8459 cbradney 1046
        if (typeName.isNull() && widget_)
6044 tsoots 1047
                widget_->setEnabled(false); // nothing selected or two or more different types
1048
        else if (!item_ || item_->typeName() != typeName || widget_ != item_->widget())
1049
                loadType(typeName); // new type selected
1050
        else if (widget_ && !widget_->isEnabled())
1051
                widget_->setEnabled(true);
1052
 
6047 tsoots 1053
        disconnect(nameEdit, SIGNAL(textChanged(const QString&)),
1054
                   this, SLOT(slotNameChanged(const QString&)));
8459 cbradney 1055
        if (!typeName.isNull())
6047 tsoots 1056
        {
6949 tsoots 1057
                item_->selected(selection.second);
6047 tsoots 1058
                if (selection.second.count() > 1)
1059
                {
7123 fschmid 1060
                        nameEdit->setText( tr("More than one style selected"));
6047 tsoots 1061
                        nameEdit->setEnabled(false);
6091 tsoots 1062
                        shortcutWidget_->setEnabled(false);
6949 tsoots 1063
                        shortcutWidget_->setShortcut(QString::null);
6047 tsoots 1064
                }
1065
                else
1066
                {
1067
                        nameEdit->setText(selection.second[0]);
1068
                        nameEdit->setEnabled(true);
6091 tsoots 1069
                        shortcutWidget_->setEnabled(true);
6949 tsoots 1070
                        shortcutWidget_->setShortcut(item_->shortcut(selection.second[0]));
6047 tsoots 1071
                }
1072
        }
1073
        else
1074
        {
1075
                nameEdit->setText("");
1076
                nameEdit->setEnabled(false);
1077
        }
7020 tsoots 1078
 
6047 tsoots 1079
        connect(nameEdit, SIGNAL(textChanged(const QString&)),
1080
                this, SLOT(slotNameChanged(const QString&)));
7020 tsoots 1081
 
6044 tsoots 1082
}
1083
 
10340 subik 1084
void StyleManager::slotApplyStyle(QTreeWidgetItem *item)
6044 tsoots 1085
{
1086
        StyleViewItem *sitem = dynamic_cast<StyleViewItem*>(item);
1087
 
1088
        if (isEditMode_ || !sitem || sitem->isRoot())
1089
                return; // don't apply a style in edit mode or if there was no item/type selected
1090
 
5859 tsoots 1091
        styleView->clearSelection();
1092
 
6044 tsoots 1093
        if (!item_ || item_->typeName() != sitem->rootName())
1094
                loadType(sitem->rootName()); // load the type where we want to apply this style
1095
 
1096
        Q_ASSERT(item_);
1097
 
1098
        item_->toSelection(sitem->text(NAME_COL)); // apply selected style to the selection
1099
 
1100
        slotDocSelectionChanged();
1101
}
1102
 
10340 subik 1103
void StyleManager::slotApplyStyle(QTreeWidgetItem *newitem, QTreeWidgetItem *)
1104
{
1105
        slotApplyStyle(newitem);
1106
}
1107
 
1108
void StyleManager::slotApplyStyle(QTreeWidgetItem *item, int)
1109
{
1110
        slotApplyStyle(item);
1111
}
1112
 
6044 tsoots 1113
void StyleManager::slotDocSelectionChanged()
1114
{
1115
        if (isEditMode_)
1116
                return; // don't track changes when in edit mode
1117
 
10340 subik 1118
        disconnect(styleView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
1119
                   this, SLOT(slotApplyStyle(QTreeWidgetItem*, QTreeWidgetItem*)));
6044 tsoots 1120
 
1121
        styleView->clearSelection();
1122
 
9790 avox 1123
        QList<QPair<QString, QString> > selected;
6044 tsoots 1124
 
9790 avox 1125
        for (int i = 0; i < items_.count(); ++i)
6044 tsoots 1126
                selected << QPair<QString, QString>(items_.at(i)->typeName(), items_.at(i)->fromSelection());
1127
 
10340 subik 1128
        QTreeWidgetItemIterator it(styleView, QTreeWidgetItemIterator::Selectable);
6044 tsoots 1129
        StyleViewItem *item;
1130
 
10340 subik 1131
        while (*it)
5859 tsoots 1132
        {
10340 subik 1133
                item = dynamic_cast<StyleViewItem*>(*it);
6044 tsoots 1134
                if (item)
5859 tsoots 1135
                {
8578 jghali 1136
                        for (int i = 0; i < selected.count(); ++i)
5859 tsoots 1137
                        {
6044 tsoots 1138
                                if (item->rootName() == selected[i].first && item->text(NAME_COL) == selected[i].second)
5859 tsoots 1139
                                {
1140
                                        styleView->setCurrentItem(item);
1141
                                        item->setSelected(true);
1142
                                }
1143
                        }
1144
                }
6044 tsoots 1145
                ++it;
5859 tsoots 1146
        }
6044 tsoots 1147
 
10340 subik 1148
        connect(styleView, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
1149
                this, SLOT(slotApplyStyle(QTreeWidgetItem*,QTreeWidgetItem*)));
5859 tsoots 1150
}
1151
 
6091 tsoots 1152
void StyleManager::slotDocStylesChanged()
1153
{
1154
        qDebug("slotDocStylesChanged()");
1155
}
1156
 
6044 tsoots 1157
// QPair.first == QString::null if nothing is selected or if
1158
// there are items from more than one type in the selection
1159
// if selection is valid (only from single type) QPair.first will
1160
// include the type name and QPair.second will have all the selected
1161
// stylenames in it
1162
QPair<QString, QStringList> StyleManager::namesFromSelection()
5871 tsoots 1163
{
8459 cbradney 1164
        QString typeName(QString::null);
6044 tsoots 1165
        QStringList styleNames;
6913 tsoots 1166
 
8459 cbradney 1167
        if (rcStyle_.isNull())
5871 tsoots 1168
        {
10340 subik 1169
                QTreeWidgetItemIterator it(styleView, QTreeWidgetItemIterator::Selected);
1170
                while (*it)
5871 tsoots 1171
                {
10340 subik 1172
                        StyleViewItem *item = dynamic_cast<StyleViewItem*>(*it);
6913 tsoots 1173
                        if (!item)
1174
                        {
1175
                                ++it;
1176
                                continue;
1177
                        }
8459 cbradney 1178
                        else if (typeName.isNull())
6913 tsoots 1179
                                typeName = item->rootName();
8459 cbradney 1180
                        else if (!typeName.isNull() && typeName != item->rootName())
6913 tsoots 1181
                        {
1182
                                typeName = QString::null;
1183
                                break; // two different types selected returning null
1184
                        }
1185
 
1186
                        if (!item->isRoot())
1187
                                styleNames << item->text(NAME_COL);
1188
 
6044 tsoots 1189
                        ++it;
5871 tsoots 1190
                }
1191
        }
6913 tsoots 1192
        else // right click selection which doesn't show in the gui
1193
        {
1194
                typeName = rcType_;
1195
                styleNames << rcStyle_;
1196
        }
6044 tsoots 1197
        return QPair<QString, QStringList>(typeName, styleNames);
1198
}
1199
 
1200
// sets the current type to name including item_ and the main widget
1201
// for editing styles
1202
void StyleManager::loadType(const QString &name)
1203
{
1204
        item_ = 0;
9790 avox 1205
        for (int i = 0; i < items_.count(); ++i)
5871 tsoots 1206
        {
6913 tsoots 1207
                if (items_.at(i)->typeNameSingular() == name || items_.at(i)->typeName() == name)
6044 tsoots 1208
                {
1209
                        item_ = items_.at(i);
1210
                        break;
1211
                }
5871 tsoots 1212
        }
6044 tsoots 1213
        if (!item_)
1214
                return;
1215
 
1216
        if (widget_)
1217
        {   // remove the old style type's widget
1218
                widget_->hide();
1219
                layout_->remove(widget_);
1220
                widget_->reparent(0,0, QPoint(0,0), false);
9790 avox 1221
                // show the widget for the new style type
1222
                if (shortcutWidget_)
1223
                        widget_->removeTab(widget_->indexOf(shortcutWidget_));
5871 tsoots 1224
        }
6044 tsoots 1225
        widget_ = item_->widget(); // show the widget for the style type
1226
        insertShortcutPage(widget_);
1227
        widget_->reparent(mainFrame, 0, QPoint(0,0), true);
1228
        layout_->addWidget(widget_, 0, 0);
9663 tsoots 1229
        layout()->activate();
5871 tsoots 1230
}
1231
 
4829 tsoots 1232
void StyleManager::hideEvent(QHideEvent *e)
1233
{
7047 tsoots 1234
        prefs_->set("eX", x());
1235
        prefs_->set("eY", y());
6047 tsoots 1236
        prefs_->set("isEditMode", isEditMode_);
7047 tsoots 1237
        prefs_->set("InitX", x());
1238
        prefs_->set("InitY", y());
7065 tsoots 1239
        storeVisibility(false);
1240
        storePosition();
9563 fschmid 1241
        ScrPaletteBase::hideEvent(e);
7047 tsoots 1242
        emit closed();
1243
}
1244
 
1245
void StyleManager::closeEvent(QCloseEvent *e)
1246
{
1247
        prefs_->set("eX", x());
1248
        prefs_->set("eY", y());
1249
        prefs_->set("isEditMode", isEditMode_);
1250
        prefs_->set("InitX", x());
1251
        prefs_->set("InitY", y());
7065 tsoots 1252
        storeVisibility(false);
1253
        storePosition();
9563 fschmid 1254
        ScrPaletteBase::closeEvent(e);
4829 tsoots 1255
        emit closed();
1256
}
1257
 
7047 tsoots 1258
void StyleManager::showEvent(QShowEvent *e)
1259
{
1260
        static bool isFirst = true;
8428 cbradney 1261
        if (isModal())
1262
        {
1263
                isStoryEditMode_=true;
1264
                applyButton->setEnabled(false);
1265
                slotEdit();
1266
        }
1267
        setOkButtonText();
9563 fschmid 1268
        ScrPaletteBase::showEvent(e);
7047 tsoots 1269
        if (isFirst)
1270
        {
1271
                QPoint p(prefs_->getInt("InitX", x()), prefs_->getInt("InitY", y()));
1272
                move(p);
1273
                isFirst = false;
1274
        }
1275
}
1276
 
4829 tsoots 1277
StyleManager::~StyleManager()
1278
{
7047 tsoots 1279
        prefs_->set("eX", x());
1280
        prefs_->set("eY", y());
1281
        prefs_->set("isEditMode", isEditMode_);
1282
        prefs_->set("InitX", x());
1283
        prefs_->set("InitY", y());
7065 tsoots 1284
        storeVisibility(this->isVisible());
1285
        storePosition();
4829 tsoots 1286
}