Subversion Repositories Scribus

Rev

Rev 12930 | 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
*/
3 paul 7
#include "muster.h"
8
#include "muster.moc"
9
#include "newtemp.h"
118 Franz 10
#include "mergedoc.h"
923 cbradney 11
#include <qlayout.h>
12
#include <qlistbox.h>
13
#include <qpushbutton.h>
118 Franz 14
#include <qcursor.h>
923 cbradney 15
#include <qstring.h>
1414 fschmid 16
#include <qtooltip.h>
3670 cbradney 17
#include "page.h"
4122 cbradney 18
#include "pagestructs.h"
923 cbradney 19
#include "scribusdoc.h"
20
#include "scribusview.h"
2533 craig 21
#include "util.h"
3510 cbradney 22
#include "commonstrings.h"
4069 craig 23
#include "scribus.h"
3 paul 24
 
3953 cbradney 25
#include "scmessagebox.h"
26
 
2093 cbradney 27
MasterPagesPalette::MasterPagesPalette( QWidget* parent, ScribusDoc *pCurrentDoc, ScribusView *pCurrentView, QString masterPageName)
225 Franz 28
                : QDialog( parent, "Muster", false, WDestructiveClose)
3 paul 29
{
2093 cbradney 30
        setCaption( tr( "Edit Master Pages" ) );
225 Franz 31
        setIcon(loadIcon("AppIcon.png"));
923 cbradney 32
        currentDoc = pCurrentDoc;
33
        currentView = pCurrentView;
2093 cbradney 34
        masterPagesLayout = new QVBoxLayout( this, 5, 5 );
1414 fschmid 35
        buttonLayout = new QHBoxLayout;
36
        buttonLayout->setSpacing( 5 );
923 cbradney 37
        buttonLayout->setMargin( 0 );
2439 cbradney 38
        importButton = new QToolButton(this, "importButton" );
2093 cbradney 39
        importButton->setPixmap(loadIcon("fileopen.png"));
2439 cbradney 40
        newButton = new QToolButton(this, "newButton" );
1414 fschmid 41
        newButton->setPixmap(loadIcon("filenew.png"));
2439 cbradney 42
        duplicateButton = new QToolButton(this, "DublicateB" );
1414 fschmid 43
        duplicateButton->setPixmap(loadIcon("editcopy22.png"));
2439 cbradney 44
        deleteButton = new QToolButton(this, "deleteButton" );
1414 fschmid 45
        deleteButton->setPixmap(loadIcon("edittrash.png"));
923 cbradney 46
        buttonLayout->addWidget( newButton );
47
        buttonLayout->addWidget( duplicateButton );
2093 cbradney 48
        buttonLayout->addWidget( importButton );
923 cbradney 49
        buttonLayout->addWidget( deleteButton );
2093 cbradney 50
        masterPagesLayout->addLayout( buttonLayout );
51
        masterPageData = new QListBox( this, "masterPageData" );
52
        masterPageData->setMinimumSize( QSize( 100, 240 ) );
53
        masterPagesLayout->addWidget( masterPageData );
3 paul 54
 
1414 fschmid 55
 
2877 cbradney 56
        if (masterPageName.isEmpty())
161 Franz 57
        {
225 Franz 58
                sMuster = "Normal";
2093 cbradney 59
                updateMasterPageList(sMuster);
60
                currentView->showMasterPage(0);
161 Franz 61
        }
62
        else
63
        {
2093 cbradney 64
                sMuster = masterPageName;
65
                updateMasterPageList(sMuster);
66
                currentView->showMasterPage(currentDoc->MasterNames[sMuster]);
161 Franz 67
        }
923 cbradney 68
 
4907 cbradney 69
        setMinimumSize(sizeHint());
3 paul 70
 
3725 cbradney 71
        QToolTip::add( duplicateButton, tr( "Duplicate the selected master page" ) );
72
        QToolTip::add( deleteButton, tr( "Delete the selected master page" ) );
73
        QToolTip::add( newButton, tr( "Add a new master page" ) );
74
        QToolTip::add( importButton, tr( "Import master pages from another document" ) );
225 Franz 75
        // signals and slots connections
2093 cbradney 76
        connect(duplicateButton, SIGNAL(clicked()), this, SLOT(duplicateMasterPage()));
77
        connect(deleteButton, SIGNAL(clicked()), this, SLOT(deleteMasterPage()));
78
        connect(newButton, SIGNAL(clicked()), this, SLOT(newMasterPage()));
79
        connect(importButton, SIGNAL(clicked()), this, SLOT(appendPage()));
80
        connect(masterPageData, SIGNAL(highlighted(QListBoxItem*)), this, SLOT(selectMasterPage(QListBoxItem*)));
6955 cbradney 81
        connect(masterPageData, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(renameMasterPage( QListBoxItem*)));
3 paul 82
}
83
 
2093 cbradney 84
void MasterPagesPalette::reject()
1830 fschmid 85
{
86
        emit finished();
87
        QDialog::reject();
88
}
89
 
2093 cbradney 90
void MasterPagesPalette::closeEvent(QCloseEvent *closeEvent)
3 paul 91
{
923 cbradney 92
        emit finished();
93
        closeEvent->accept();
3 paul 94
}
95
 
2093 cbradney 96
void MasterPagesPalette::deleteMasterPage()
3 paul 97
{
98
        if (sMuster == "Normal")
99
                return;
3953 cbradney 100
        int exit=ScMessageBox::warning(this,
3510 cbradney 101
                                      CommonStrings::trWarning,
2093 cbradney 102
                                      tr("Do you really want to delete this master page?"),
3953 cbradney 103
                                      tr("&Yes"),
348 Franz 104
                                      tr("&No"),
225 Franz 105
                                      0, QMessageBox::No, QMessageBox::Yes);
3953 cbradney 106
        if (exit == 0)
225 Franz 107
        {
4069 craig 108
                ScMW->DeletePage2(currentDoc->MasterNames[sMuster]);
4615 cbradney 109
                //<<CB TODO Move back into ScribusDoc::deleteMasterPage();
110
                //This must happen after the pages have been reformed (view/doc)
10158 jghali 111
                currentDoc->rebuildMasterNames();
4615 cbradney 112
                // and fix up any pages that refer to the deleted master page
10158 jghali 113
                currentDoc->replaceMasterPage(sMuster);
4615 cbradney 114
                //>>
115
 
3 paul 116
                sMuster = "Normal";
2093 cbradney 117
                updateMasterPageList(sMuster);
3724 cbradney 118
                //currentDoc->MasterPages = currentDoc->Pages;
3691 cbradney 119
                emit docAltered();
161 Franz 120
        }
3 paul 121
}
122
 
2093 cbradney 123
void MasterPagesPalette::duplicateMasterPage()
3 paul 124
{
2093 cbradney 125
        QString MasterPageName;
225 Franz 126
        int nr;
3885 cbradney 127
        //bool atf;
1065 cbradney 128
        struct CopyPasteBuffer Buffer;
4577 cbradney 129
        NewTm *dia = new NewTm(this, tr("&Name:"), tr("New Master Page"), currentDoc, tr("Copy of %1").arg(sMuster));
225 Franz 130
        if (dia->exec())
131
        {
11180 fschmid 132
                ScMW->NoFrameEdit();
2093 cbradney 133
                MasterPageName = dia->Answer->text();
12933 jghali 134
                while (currentDoc->MasterNames.contains(MasterPageName) || (MasterPageName == "Normal") || MasterPageName.isEmpty())
225 Franz 135
                {
136
                        if (!dia->exec())
137
                        {
138
                                delete dia;
139
                                return;
140
                        }
2093 cbradney 141
                        MasterPageName = dia->Answer->text();
225 Franz 142
                }
3724 cbradney 143
                nr = currentDoc->Pages->count();
3885 cbradney 144
                //currentDoc->MasterNames.insert(MasterPageName, nr);
145
                //currentDoc->pageCount = 0;
146
                //atf = currentDoc->usesAutomaticTextFrames();
147
                //currentDoc->setUsesAutomaticTextFrames(false);
148
                //emit createNew(nr);
10448 jghali 149
                Page* pageFrom = currentDoc->currentPage;
3906 cbradney 150
                currentDoc->currentPage=currentDoc->addMasterPage(nr, MasterPageName);
2891 cbradney 151
                currentDoc->setLoading(true);
10448 jghali 152
                currentDoc->currentPage->initialMargins.Top    = pageFrom->initialMargins.Top;
153
                currentDoc->currentPage->initialMargins.Bottom = pageFrom->initialMargins.Bottom;
154
                currentDoc->currentPage->initialMargins.Left   = pageFrom->initialMargins.Left;
155
                currentDoc->currentPage->initialMargins.Right  = pageFrom->initialMargins.Right;
156
                currentDoc->currentPage->Margins.Top    = pageFrom->Margins.Top;
157
                currentDoc->currentPage->Margins.Bottom = pageFrom->Margins.Bottom;
158
                currentDoc->currentPage->Margins.Left   = pageFrom->Margins.Left;
159
                currentDoc->currentPage->Margins.Right  = pageFrom->Margins.Right;
3035 fschmid 160
                if (currentDoc->currentPageLayout != singlePage)
161
                {
162
                        int lp = dia->Links->currentItem();
163
                        if (lp == 0)
164
                                lp = 1;
165
                        else if (lp == static_cast<int>(dia->Links->count()-1))
166
                                lp = 0;
167
                        else
168
                                lp++;
3724 cbradney 169
                        currentDoc->Pages->at(nr)->LeftPg = lp;
3035 fschmid 170
                }
923 cbradney 171
                int inde = currentDoc->MasterNames[sMuster];
457 fschmid 172
                QMap<int,int> TableID;
234 Franz 173
                QPtrList<PageItem> TableItems;
174
                TableID.clear();
175
                TableItems.clear();
3724 cbradney 176
                if (currentDoc->Pages->at(inde)->YGuides.count() != 0)
449 fschmid 177
                {
1065 cbradney 178
                        currentDoc->currentPage->YGuides.clear();
3724 cbradney 179
                        for (uint y = 0; y < currentDoc->Pages->at(inde)->YGuides.count(); ++y)
449 fschmid 180
                        {
3724 cbradney 181
                                currentDoc->currentPage->YGuides.append(currentDoc->Pages->at(inde)->YGuides[y]);
449 fschmid 182
                        }
1065 cbradney 183
                        qHeapSort(currentDoc->currentPage->YGuides);
449 fschmid 184
                }
3724 cbradney 185
                if (currentDoc->Pages->at(inde)->XGuides.count() != 0)
449 fschmid 186
                {
3187 fschmid 187
                        currentDoc->currentPage->XGuides.clear();
3724 cbradney 188
                        for (uint x = 0; x < currentDoc->Pages->at(inde)->XGuides.count(); ++x)
449 fschmid 189
                        {
3724 cbradney 190
                                currentDoc->currentPage->XGuides.append(currentDoc->Pages->at(inde)->XGuides[x]);
449 fschmid 191
                        }
1065 cbradney 192
                        qHeapSort(currentDoc->currentPage->XGuides);
449 fschmid 193
                }
3727 cbradney 194
                uint end = currentDoc->Items->count();
3318 fschmid 195
                int GrMax = currentDoc->GroupCounter;
457 fschmid 196
                for (uint a = 0; a < end; ++a)
161 Franz 197
                {
3727 cbradney 198
                        PageItem *itemToCopy = currentDoc->Items->at(a);
199
                        if (currentDoc->Items->at(a)->OwnPage == inde)
234 Franz 200
                        {
3318 fschmid 201
                                itemToCopy->copyToCopyPasteBuffer(&Buffer);
202
                                if (itemToCopy->Groups.count() != 0)
203
                                {
204
                                        Buffer.Groups.clear();
205
                                        QValueStack<int>::Iterator nx;
206
                                        QValueStack<int> tmpGroup;
207
                                        for (nx = itemToCopy->Groups.begin(); nx != itemToCopy->Groups.end(); ++nx)
208
                                        {
209
                                                tmpGroup.push((*nx)+currentDoc->GroupCounter);
210
                                                GrMax = QMAX(GrMax, (*nx)+currentDoc->GroupCounter);
211
                                        }
212
                                        for (nx = tmpGroup.begin(); nx != tmpGroup.end(); ++nx)
213
                                        {
214
                                                Buffer.Groups.push((*nx));
215
                                        }
216
                                }
923 cbradney 217
                                currentView->PasteItem(&Buffer, true, true);
3727 cbradney 218
                                PageItem* Neu = currentDoc->Items->at(currentDoc->Items->count()-1);
3318 fschmid 219
                                Neu->OnMasterPage = MasterPageName;
457 fschmid 220
                                if (Neu->isTableItem)
221
                                {
222
                                        TableItems.append(Neu);
223
                                        TableID.insert(a, Neu->ItemNr);
224
                                }
234 Franz 225
                        }
161 Franz 226
                }
234 Franz 227
                if (TableItems.count() != 0)
228
                {
229
                        for (uint ttc = 0; ttc < TableItems.count(); ++ttc)
230
                        {
231
                                PageItem* ta = TableItems.at(ttc);
232
                                if (ta->TopLinkID != -1)
3727 cbradney 233
                                        ta->TopLink = currentDoc->Items->at(TableID[ta->TopLinkID]);
234 Franz 234
                                else
235
                                        ta->TopLink = 0;
236
                                if (ta->LeftLinkID != -1)
3727 cbradney 237
                                        ta->LeftLink = currentDoc->Items->at(TableID[ta->LeftLinkID]);
234 Franz 238
                                else
239
                                        ta->LeftLink = 0;
240
                                if (ta->RightLinkID != -1)
3727 cbradney 241
                                        ta->RightLink = currentDoc->Items->at(TableID[ta->RightLinkID]);
234 Franz 242
                                else
243
                                        ta->RightLink = 0;
244
                                if (ta->BottomLinkID != -1)
3727 cbradney 245
                                        ta->BottomLink = currentDoc->Items->at(TableID[ta->BottomLinkID]);
234 Franz 246
                                else
247
                                        ta->BottomLink = 0;
248
                        }
249
                }
923 cbradney 250
                currentView->Deselect(true);
251
                currentView->DrawNew();
3885 cbradney 252
                //currentDoc->Pages->at(nr)->setPageName(MasterPageName);
253
                //currentDoc->Pages->at(nr)->MPageNam = "";
2093 cbradney 254
                updateMasterPageList(MasterPageName);
3885 cbradney 255
                //currentDoc->setUsesAutomaticTextFrames(atf);
3724 cbradney 256
                //currentDoc->MasterPages = currentDoc->Pages;
2891 cbradney 257
                currentDoc->setLoading(false);
1756 fschmid 258
                currentView->DrawNew();
3318 fschmid 259
                currentDoc->GroupCounter = GrMax + 1;
3691 cbradney 260
                emit docAltered();
225 Franz 261
        }
262
        delete dia;
3 paul 263
}
264
 
2093 cbradney 265
void MasterPagesPalette::newMasterPage()
3 paul 266
{
2093 cbradney 267
        QString MasterPageName;
4287 cbradney 268
        int nr = currentDoc->Pages->count();
4577 cbradney 269
        NewTm *dia = new NewTm(this, tr("Name:"), tr("New MasterPage"), currentDoc, tr("New Master Page %1").arg(nr));
225 Franz 270
        if (dia->exec())
271
        {
11180 fschmid 272
                ScMW->NoFrameEdit();
2093 cbradney 273
                MasterPageName = dia->Answer->text();
12930 jghali 274
                while (currentDoc->MasterNames.contains(MasterPageName) || (MasterPageName == "Normal") || MasterPageName.isEmpty())
225 Franz 275
                {
276
                        if (!dia->exec())
277
                        {
278
                                delete dia;
279
                                return;
280
                        }
2093 cbradney 281
                        MasterPageName = dia->Answer->text();
225 Franz 282
                }
3906 cbradney 283
                currentDoc->currentPage=currentDoc->addMasterPage(nr, MasterPageName);
3787 cbradney 284
 
285
                //currentDoc->MasterNames.insert(MasterPageName, nr);
286
                //currentDoc->pageCount = 0;
287
                //atf = currentDoc->usesAutomaticTextFrames();
288
                //currentDoc->setUsesAutomaticTextFrames(false);
289
                //emit createNew(nr);
3035 fschmid 290
                if (currentDoc->currentPageLayout != singlePage)
291
                {
292
                        int lp = dia->Links->currentItem();
293
                        if (lp == 0)
294
                                lp = 1;
295
                        else if (lp == static_cast<int>(dia->Links->count()-1))
296
                                lp = 0;
297
                        else
298
                                lp++;
3724 cbradney 299
                        currentDoc->Pages->at(nr)->LeftPg = lp;
3035 fschmid 300
                }
3787 cbradney 301
                //currentDoc->Pages->at(nr)->setPageName(MasterPageName);
302
                //currentDoc->Pages->at(nr)->MPageNam = "";
2093 cbradney 303
                updateMasterPageList(MasterPageName);
3787 cbradney 304
                //currentDoc->setUsesAutomaticTextFrames(atf);
2093 cbradney 305
                currentView->showMasterPage(currentDoc->MasterNames[MasterPageName]);
3035 fschmid 306
                currentView->reformPages();
3724 cbradney 307
                //currentDoc->MasterPages = currentDoc->Pages;
3691 cbradney 308
                emit docAltered();
225 Franz 309
        }
310
        delete dia;
3 paul 311
}
312
 
2093 cbradney 313
void MasterPagesPalette::appendPage()
118 Franz 314
{
3885 cbradney 315
        //bool atf;
118 Franz 316
        MergeDoc *dia = new MergeDoc(this, true);
317
        if (dia->exec())
161 Franz 318
        {
11180 fschmid 319
                ScMW->NoFrameEdit();
118 Franz 320
                qApp->setOverrideCursor(QCursor(waitCursor), true);
3885 cbradney 321
                int nr = currentDoc->Pages->count();
322
                //currentDoc->pageCount = 0;
323
                //atf = currentDoc->usesAutomaticTextFrames();
324
                //currentDoc->setUsesAutomaticTextFrames(false);
325
                //emit createNew(nr);
326
                QString MasterPageName(dia->getMasterPageNameText());
327
                QString MasterPageName2(MasterPageName);
328
                int copyC = 1;
329
                while (currentDoc->MasterNames.contains(MasterPageName2))
330
                {
331
                        MasterPageName2 = tr("Copy #%1 of ").arg(copyC)+MasterPageName;
332
                        copyC++;
333
                }
4286 cbradney 334
                currentDoc->currentPage=currentDoc->addMasterPage(nr, MasterPageName2);
118 Franz 335
                qApp->processEvents();
4619 cbradney 336
                //CB TODO: If we are loading to a new name, we rely on doc->onpage in 
337
                //FileLoader::PasteItem as this call doesnt pass in the new destination page
4684 cbradney 338
                ScMW->loadPage(dia->getFromDoc(), dia->getMasterPageNameItem(), true, MasterPageName2);
118 Franz 339
                qApp->processEvents();
3885 cbradney 340
                /*
3724 cbradney 341
                MasterPageName = currentDoc->Pages->at(nr)->PageNam;
2093 cbradney 342
                MasterPageName2 = MasterPageName;
118 Franz 343
                int copyC = 1;
2093 cbradney 344
                while (currentDoc->MasterNames.contains(MasterPageName2))
161 Franz 345
                {
2093 cbradney 346
                        MasterPageName2 = tr("Copy #%1 of ").arg(copyC)+MasterPageName;
118 Franz 347
                        copyC++;
161 Franz 348
                }
2093 cbradney 349
                currentDoc->MasterNames.insert(MasterPageName2, nr);
3724 cbradney 350
                currentDoc->Pages->at(nr)->setPageName(MasterPageName2);
351
                currentDoc->Pages->at(nr)->MPageNam = "";
3885 cbradney 352
                */
2093 cbradney 353
                updateMasterPageList(MasterPageName2);
3885 cbradney 354
                //currentDoc->setUsesAutomaticTextFrames(atf);
2093 cbradney 355
                currentView->showMasterPage(currentDoc->MasterNames[MasterPageName2]);
118 Franz 356
                qApp->setOverrideCursor(QCursor(arrowCursor), true);
3724 cbradney 357
                //currentDoc->MasterPages = currentDoc->Pages;
3691 cbradney 358
                emit docAltered();
161 Franz 359
        }
118 Franz 360
        delete dia;
361
}
362
 
2093 cbradney 363
void MasterPagesPalette::selectMasterPage(QListBoxItem *item)
3 paul 364
{
923 cbradney 365
        sMuster = item->text();
366
        deleteButton->setEnabled(currentDoc->MasterNames.count() == 1 ? false : true);
225 Franz 367
        if (sMuster == tr("Normal"))
368
        {
369
                sMuster = "Normal";
923 cbradney 370
                deleteButton->setEnabled(false);
225 Franz 371
        }
161 Franz 372
        else
923 cbradney 373
                deleteButton->setEnabled(true);
11180 fschmid 374
        ScMW->NoFrameEdit();
2093 cbradney 375
        currentView->showMasterPage(currentDoc->MasterNames[sMuster]);
3 paul 376
}
377
 
2093 cbradney 378
void MasterPagesPalette::selectMasterPage(QString name)
1268 fschmid 379
{
380
        sMuster = name;
381
        deleteButton->setEnabled(currentDoc->MasterNames.count() == 1 ? false : true);
382
        if (sMuster == tr("Normal"))
383
        {
384
                sMuster = "Normal";
385
                deleteButton->setEnabled(false);
386
        }
387
        else
388
                deleteButton->setEnabled(true);
11180 fschmid 389
        ScMW->NoFrameEdit();
2093 cbradney 390
        currentView->showMasterPage(currentDoc->MasterNames[sMuster]);
1268 fschmid 391
}
392
 
10309 jghali 393
void MasterPagesPalette::updateMasterPageList(void)
394
{
395
        QString masterPageName = (currentDoc->MasterNames.contains(sMuster)) ? sMuster : QString("Normal");
396
        updateMasterPageList(masterPageName);
397
}
398
 
2093 cbradney 399
void MasterPagesPalette::updateMasterPageList(QString MasterPageName)
3 paul 400
{
2093 cbradney 401
        masterPageData->clear();
923 cbradney 402
        for (QMap<QString,int>::Iterator it = currentDoc->MasterNames.begin(); it != currentDoc->MasterNames.end(); ++it)
2093 cbradney 403
                masterPageData->insertItem(it.key() == "Normal" ? tr("Normal") : it.key());
923 cbradney 404
        deleteButton->setEnabled(currentDoc->MasterNames.count() == 1 ? false : true);
2093 cbradney 405
        if (MasterPageName == "Normal")
225 Franz 406
        {
2093 cbradney 407
                MasterPageName = tr("Normal");
923 cbradney 408
                deleteButton->setEnabled(false);
225 Franz 409
        }
2093 cbradney 410
        masterPageData->setSelected(masterPageData->index(masterPageData->findItem(MasterPageName)), true);
3 paul 411
}
412
 
6955 cbradney 413
void MasterPagesPalette::renameMasterPage(QListBoxItem * item)
414
{
415
        QString oldName(item->text());
416
        if ((oldName == CommonStrings::masterPageNormal) || (oldName == CommonStrings::trMasterPageNormal) || (oldName == CommonStrings::trMasterPageNormalLeft) || (oldName == CommonStrings::trMasterPageNormalMiddle) || (oldName == CommonStrings::trMasterPageNormalRight))
417
        {
418
                QMessageBox::information( this, tr("Unable to Rename Master Page"), tr("The Normal page is not allowed to be renamed."), QMessageBox::Ok );
419
                return;
420
        }
421
        bool ok;
422
        QString newName = QInputDialog::getText(
423
                        tr("Rename Master Page"), tr("New Name:"), QLineEdit::Normal,
424
                        oldName, &ok, this );
425
        if (ok && !newName.isEmpty())
426
                if (currentDoc->renameMasterPage( oldName, newName))
427
                        updateMasterPageList(newName);
428
}