Subversion Repositories Scribus

Rev

Rev 4679 | Rev 4889 | 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
/***************************************************************************
8
                          bookmwin.cpp  -  description
9
                             -------------------
10
    begin                : Mon Feb 11 2002
11
    copyright            : (C) 2002 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
23
 
24
#include "bookmwin.h"
25
#include "bookmwin.moc"
26
#include <qpixmap.h>
27
#include <qdragobject.h>
28
#include <qpopupmenu.h>
29
#include <qcursor.h>
366 Franz 30
#include <qheader.h>
31
 
3 paul 32
extern QPixmap loadIcon(QString nam);
33
 
34
BookMItem::BookMItem(QListViewItem* parent, struct ScribusDoc::BookMa *Bm) : QListViewItem(parent)
35
{
36
        SetUp(Bm);
37
}
38
 
39
BookMItem::BookMItem(QListViewItem* parent, QListViewItem* after, struct ScribusDoc::BookMa *Bm) : QListViewItem(parent, after)
40
{
41
        SetUp(Bm);
42
}
43
 
44
BookMItem::BookMItem(QListView* parent, QListViewItem* after, struct ScribusDoc::BookMa *Bm) : QListViewItem(parent, after)
45
{
46
        SetUp(Bm);
47
}
48
 
49
BookMItem::BookMItem(QListView* parent, struct ScribusDoc::BookMa *Bm) : QListViewItem(parent)
50
{
51
        SetUp(Bm);
52
}
53
 
4679 fschmid 54
BookMItem::BookMItem(QListView* parent, QListViewItem* after, int nr, PageItem* PObject) : QListViewItem(parent, after)
3 paul 55
{
56
        ItemNr = nr;
4679 fschmid 57
        PageObject = PObject;
3 paul 58
        PdfObj = 0;
59
        Action = "";
60
        First = 0;
61
        Last = 0;
62
        Prev = 0;
63
        Next = 0;
64
        Pare = 0;
65
}
66
 
4679 fschmid 67
BookMItem::BookMItem(QListView* parent, int nr, PageItem* PObject) : QListViewItem(parent)
3 paul 68
{
69
        ItemNr = nr;
4679 fschmid 70
        PageObject = PObject;
3 paul 71
        PdfObj = 0;
72
        Action = "";
73
        First = 0;
74
        Last = 0;
75
        Prev = 0;
76
        Next = 0;
77
        Pare = 0;
78
}
79
 
80
void BookMItem::SetUp(struct ScribusDoc::BookMa *Bm)
81
{
82
        ItemNr = Bm->ItemNr;
83
        PdfObj = 0;
84
        Action = Bm->Aktion;
85
        First = Bm->First;
86
        Last = Bm->Last;
87
        Prev = Bm->Prev;
88
        Next = Bm->Next;
89
        Pare = Bm->Parent;
90
        Titel = Bm->Title;
4679 fschmid 91
        PageObject = Bm->PageObject;
3 paul 92
        setText(0, Bm->Text);
93
}
94
 
95
QString BookMItem::key(int, bool) const
96
{
97
        QString tmp;
98
        tmp.sprintf("%5d", ItemNr);
99
        return tmp;
100
}
101
 
102
 
103
BookMView::BookMView(QWidget* parent) : QListView(parent)
104
{
105
        NrItems = 0;
106
        Mpressed = false;
107
        DraggedI = 0;
108
        First = 1;
109
        Last = 0;
110
        setAcceptDrops(true);
111
        viewport()->setAcceptDrops(true);
112
        setRootIsDecorated(true);
2196 cbradney 113
        idBookMarkCol=addColumn("Bookmarks");
3 paul 114
        setResizeMode(QListView::AllColumns);
115
        setSelectionMode(QListView::NoSelection);
116
        setSorting(-1,1);
2196 cbradney 117
        languageChange();
3 paul 118
}
119
 
120
void BookMView::AddPageItem(PageItem* ite)
121
{
122
        QString bm = "";
123
        QString bm2 = "";
124
        QString cc;
1065 cbradney 125
        for (uint d = 0; d < ite->itemText.count(); ++d)
161 Franz 126
        {
1065 cbradney 127
                cc = ite->itemText.at(d)->ch;
3 paul 128
                if ((cc == QChar(13)) || (cc == QChar(10)))
129
                        break;
55 Franz 130
                if (cc == QChar(29))
131
                        cc = " ";
3 paul 132
                if ((cc == "(") || (cc == ")") || (cc == "\\"))
133
                        bm2 += "\\";
161 Franz 134
                bm += cc;
135
                bm2 += cc;
136
        }
4679 fschmid 137
        AddItem(bm, bm2, ite);
3 paul 138
        Last = NrItems;
139
}
140
 
366 Franz 141
void BookMView::contentsMouseReleaseEvent(QMouseEvent *e)
3 paul 142
{
366 Franz 143
        if (Mpressed)
144
        {
145
                QListViewItem *i = itemAt(contentsToViewport(e->pos()));
146
                QPoint p = contentsToViewport(e->pos());
147
                if ( i )
148
                {
149
                        if ( p.x() > header()->cellPos( header()->mapToActual( 0 ) ) + treeStepSize() * ( i->depth() + ( rootIsDecorated() ? 1 : 0) ) + itemMargin() ||
150
                                        p.x() < header()->cellPos( header()->mapToActual( 0 ) ) )
151
                        {
152
                                BookMItem *ip;
153
                                ip = (BookMItem*)i;
4679 fschmid 154
                                emit SelectElement(ip->PageObject);
366 Franz 155
                        }
156
                }
157
        }
3 paul 158
        Mpressed = false;
159
}
160
 
161
void BookMView::contentsMousePressEvent(QMouseEvent* e)
162
{
163
        QListView::contentsMousePressEvent(e);
164
        QListViewItem *i = itemAt(contentsToViewport(e->pos()));
165
        if (i)
161 Franz 166
        {
3 paul 167
                Mpos = e->pos();
168
                Mpressed = true;
161 Franz 169
        }
3 paul 170
}
171
 
172
void BookMView::contentsMouseMoveEvent(QMouseEvent* e)
173
{
174
        if ((Mpressed) && ((Mpos - e->pos()).manhattanLength() > 4))
161 Franz 175
        {
3 paul 176
                Mpressed = false;
177
                QListViewItem *i = itemAt(contentsToViewport(Mpos));
178
                if (i)
161 Franz 179
                {
3 paul 180
                        DraggedI = (BookMItem*)i;
181
                        QDragObject *dr = new QTextDrag(i->text(0), this, "BMD");
182
                        dr->drag();
183
                }
161 Franz 184
        }
3 paul 185
}
186
 
187
void BookMView::contentsDropEvent(QDropEvent *e)
188
{
189
        QString text;
161 Franz 190
        if (!QTextDrag::decode(e, text))
191
        {
192
                e->ignore();
193
                return;
194
    }
4784 fschmid 195
        int ins, mov, mret, can;
3 paul 196
        QListViewItem *pp;
197
        QListViewItem *lv;
198
        BookMItem *ip;
199
        BookMItem *ip2;
200
        BookMItem *ite;
201
        QListViewItem *item = itemAt(contentsToViewport(e->pos()));
202
        BookMItem *Bite = (BookMItem*)item;
161 Franz 203
        if ((item) && (DraggedI != 0))
3 paul 204
        {
161 Franz 205
                if ((BookMItem*)item != DraggedI)
3 paul 206
                {
161 Franz 207
                        pp = item->parent();
208
                        while (pp)
3 paul 209
                        {
161 Franz 210
                                if (pp == DraggedI)
211
                                        return;
212
                                pp = pp->parent();
3 paul 213
                        }
214
                        QPopupMenu *pmenu = new QPopupMenu();
112 Franz 215
                        mov = pmenu->insertItem( tr("Move Bookmark"));
216
                        ins = pmenu->insertItem( tr("Insert Bookmark"));
4784 fschmid 217
                        can = pmenu->insertItem( tr("Cancel"));
3 paul 218
                        mret = pmenu->exec(QCursor::pos());
4784 fschmid 219
                        if (mret != can)
161 Franz 220
                        {
4784 fschmid 221
                                if (mret == ins)
161 Franz 222
                                {
4784 fschmid 223
                                        lv = DraggedI->parent();
224
                                        lv = lv ? lv->firstChild() : firstChild();
225
                                        if (!DraggedI->Prev == 0)
226
                                        {
227
                                                while (lv)
228
                                                {
229
                                                        ip = (BookMItem*)lv;
230
                                                        if (ip->ItemNr == DraggedI->Prev)
231
                                                                break;
232
                                                        lv = lv->nextSibling();
233
                                                }
234
                                                ip = (BookMItem*)lv;
235
                                                lv = DraggedI->nextSibling();
236
                                                if (lv)
237
                                                {
238
                                                        ip2 = (BookMItem*)lv;
239
                                                        ip2->Prev = ip->ItemNr;
240
                                                        ip->Next = ip2->ItemNr;
241
                                                }
242
                                                else
243
                                                        ip->Next = 0;
244
                                        }
245
                                        lv = DraggedI->parent();
246
                                        item->insertItem(DraggedI);
247
                                        lv ? lv = lv->firstChild() : lv = firstChild();
248
                                        if (DraggedI->Prev == 0)
249
                                        {
250
                                                ip = (BookMItem*)lv;
251
                                                if (ip)
252
                                                        ip->Prev = 0;
253
                                        }
254
                                        QListViewItemIterator it(this);
255
                                        for ( ; it.current(); ++it)
256
                                        {
257
                                                ite = (BookMItem*)it.current();
258
                                                if (ite->ItemNr == DraggedI->ItemNr)
259
                                                        DraggedI = ite;
260
                                        }
261
                                        DraggedI->Pare = Bite->ItemNr;
262
                                        ip = (BookMItem*)item->firstChild();
263
                                        Bite->First = ip->ItemNr;
264
                                        lv = item->firstChild();
161 Franz 265
                                        while (lv)
3 paul 266
                                        {
4784 fschmid 267
                                                if (!lv->nextSibling())
268
                                                {
269
                                                        ip = (BookMItem*)lv;
270
                                                        Bite->Last = ip->ItemNr;
3 paul 271
                                                        break;
4784 fschmid 272
                                                }
3 paul 273
                                                lv = lv->nextSibling();
161 Franz 274
                                        }
4784 fschmid 275
                                        if (DraggedI->nextSibling())
276
                                        {
277
                                                ip = (BookMItem*)DraggedI->nextSibling();
278
                                                DraggedI->Next = ip->ItemNr;
279
                                                ip->Prev = DraggedI->ItemNr;
280
                                        }
281
                                        else
282
                                                DraggedI->Next = 0;
283
                                        if (DraggedI != item->firstChild())
284
                                        {
285
                                                ip = (BookMItem*)DraggedI->itemAbove();
286
                                                DraggedI->Prev = ip->ItemNr;
287
                                                ip->Next = DraggedI->ItemNr;
288
                                        }
289
                                        else
290
                                                DraggedI->Prev = 0;
291
                                        emit changed();
292
                                }
293
                                if (mret == mov)
294
                                {
295
                                        lv = DraggedI->parent();
296
                                        lv ? lv = lv->firstChild() : lv = firstChild();
297
                                        if (DraggedI->Prev == 0)
298
                                        {
299
                                                ip = (BookMItem*)lv->nextSibling();
300
                                                if (ip)
301
                                                        ip->Prev = 0;
302
                                        }
303
                                        else
304
                                        {
305
                                                while (lv)
306
                                                {
307
                                                        ip = (BookMItem*)lv;
308
                                                        if (ip->ItemNr == DraggedI->Prev)
309
                                                                break;
310
                                                        lv = lv->nextSibling();
311
                                                }
312
                                        }
3 paul 313
                                        ip = (BookMItem*)lv;
314
                                        lv = DraggedI->nextSibling();
315
                                        if (lv)
161 Franz 316
                                        {
3 paul 317
                                                ip2 = (BookMItem*)lv;
318
                                                ip2->Prev = ip->ItemNr;
319
                                                ip->Next = ip2->ItemNr;
161 Franz 320
                                        }
3 paul 321
                                        else
322
                                                ip->Next = 0;
4784 fschmid 323
                                        lv = DraggedI->parent();
324
                                        DraggedI->moveItem(item);
325
                                        lv ? lv = lv->firstChild() : lv = firstChild();
326
                                        if (DraggedI->Prev == 0)
3 paul 327
                                        {
328
                                                ip = (BookMItem*)lv;
4784 fschmid 329
                                                if (ip)
330
                                                        ip->Prev = 0;
3 paul 331
                                        }
4784 fschmid 332
                                        QListViewItemIterator it2(this);
333
                                        for ( ; it2.current(); ++it2)
334
                                        {
335
                                                ite = (BookMItem*)it2.current();
336
                                                if (ite->ItemNr == DraggedI->ItemNr)
337
                                                        DraggedI = ite;
338
                                        }
339
                                        ip = (BookMItem*)item;
340
                                        DraggedI->Pare = ip->Pare;
341
                                        DraggedI->Prev = ip->ItemNr;
342
                                        ip->Next = DraggedI->ItemNr;
343
                                        if (DraggedI->nextSibling())
344
                                        {
345
                                                ip = (BookMItem*)DraggedI->nextSibling();
346
                                                DraggedI->Next = ip->ItemNr;
347
                                                ip->Prev = DraggedI->ItemNr;
348
                                        }
349
                                        else
350
                                                DraggedI->Next = 0;
351
                                        lv = item->parent();
352
                                        if (lv)
353
                                        {
354
                                                ip = (BookMItem*)lv->firstChild();
355
                                                ip2 = (BookMItem*)lv;
356
                                                ip2->First = ip->ItemNr;
357
                                                lv = lv->firstChild();
358
                                                while (lv)
359
                                                {
360
                                                        if (!lv->nextSibling())
361
                                                        {
362
                                                                ip = (BookMItem*)lv;
363
                                                                ip2->Last = ip->ItemNr;
364
                                                                break;
365
                                                        }
366
                                                        lv = lv->nextSibling();
367
                                                }
368
                                        }
369
                                        emit changed();
161 Franz 370
                                }
4784 fschmid 371
                                emit MarkMoved();
3 paul 372
                        }
373
                        delete pmenu;  
161 Franz 374
                        DraggedI = 0;
3 paul 375
                }
376
        }
377
}
378
 
379
void BookMView::contentsDragMoveEvent(QDragMoveEvent *e)
380
{
381
        QString text;
382
        if (!QTextDrag::decode(e, text))
161 Franz 383
        {
3 paul 384
                e->ignore();
385
                return;
386
    }
387
        QListViewItem *item = itemAt(contentsToViewport(e->pos()));
161 Franz 388
        if (item)
3 paul 389
        {
390
                setSelected(item, true);
391
                e->accept();
392
        }
161 Franz 393
        else
3 paul 394
                e->ignore();
395
}
396
 
4679 fschmid 397
void BookMView::AddItem(QString text, QString Tit, PageItem *PageObject)
3 paul 398
{
161 Franz 399
        QListViewItem *lv = firstChild();
400
        while (lv)
401
        {
402
                if (!lv->nextSibling())
403
                        break;
404
                lv = lv->nextSibling();
3 paul 405
        }
161 Franz 406
        BookMItem *ip;
3 paul 407
        BookMItem *ite;
408
        if (lv)
4679 fschmid 409
                ite = new BookMItem(this, lv, NrItems+1, PageObject);
3 paul 410
        else
4679 fschmid 411
                ite = new BookMItem(this, NrItems+1, PageObject);
3 paul 412
        ite->setText(0, text);
413
        ite->Titel = Tit;
414
        ite->Next = 0;
161 Franz 415
        if (lv)
3 paul 416
        {
161 Franz 417
                ip = (BookMItem*)lv;
418
                ip->Next = ite->ItemNr;
419
                ite->Prev = ip->ItemNr;
3 paul 420
        }
421
        NrItems++;
422
}
423
 
4679 fschmid 424
void BookMView::DeleteItem(PageItem *pObject)
3 paul 425
{
426
        BookMItem *ite;
4679 fschmid 427
        int nr;
428
        QListViewItemIterator itx(this);
429
        for ( ; itx.current(); ++itx)
430
        {
431
                ite = (BookMItem*)itx.current();
432
                if (ite->PageObject == pObject)
433
                {
434
                        nr = ite->ItemNr;
435
                        break;
436
                }
437
        }
3 paul 438
        BookMItem *ite2 = 0;
439
        BookMItem *ite3;
440
        BookMItem *ite4;
441
        QListViewItemIterator it(this);
442
        for ( ; it.current(); ++it)
161 Franz 443
        {
3 paul 444
                ite = (BookMItem*)it.current();
445
                if (ite->Next == nr)
446
                        ite2 = ite;
447
                if (ite->ItemNr == nr)
161 Franz 448
                {
3 paul 449
                        QListViewItem *pp = ite->firstChild();
450
                        QListViewItem *ppn = ite->nextSibling();
451
                        if ((ite->parent()) && (ite2 == 0) && (ppn))
161 Franz 452
                        {
3 paul 453
                                ite3 = (BookMItem*)ite->parent();
454
                                ite4 = (BookMItem*)ppn;
455
                                ite3->First = ite4->ItemNr;
161 Franz 456
                        }
3 paul 457
                        while (pp)
161 Franz 458
                        {
459
                        ite->parent() ? ite->parent()->insertItem(pp) : pp->moveItem(ite);
3 paul 460
                                pp = ite->firstChild();
161 Franz 461
                        }
3 paul 462
                        if (ppn)
161 Franz 463
                        {
3 paul 464
                                ite3 = (BookMItem*)ppn;
465
                                if (ite2)
161 Franz 466
                                {
3 paul 467
                                        ite2->Next = ite3->ItemNr;
468
                                        ite3->Prev = ite2->ItemNr;
161 Franz 469
                                }
3 paul 470
                                else
471
                                        ite3->Prev = 0;
161 Franz 472
                        }
3 paul 473
                        else
474
                                if (ite2)
475
                                        ite2->Next = 0;
476
                        delete ite;
477
                }
161 Franz 478
        }
3 paul 479
        QMap<int,int> Tabl;
480
        Tabl.clear();
481
        Tabl[0] = 0;
482
        int Counter = 1;
483
        QListViewItemIterator itn(this);
484
        for ( ; itn.current(); ++itn)
161 Franz 485
        {
3 paul 486
                ite = (BookMItem*)itn.current();
487
                Tabl[ite->ItemNr] = Counter;
488
                Counter++;
161 Franz 489
        }
3 paul 490
        QListViewItemIterator itnf(this);
491
        for ( ; itnf.current(); ++itnf)
161 Franz 492
        {
3 paul 493
                ite = (BookMItem*)itnf.current();
494
                ite->ItemNr = Tabl[ite->ItemNr];
495
                ite->Pare = Tabl[ite->Pare];
496
                ite->Next = Tabl[ite->Next];
497
                ite->Prev = Tabl[ite->Prev];
498
                ite->First = Tabl[ite->First];
499
                ite->Last = Tabl[ite->Last];
161 Franz 500
        }
3 paul 501
}
502
 
4679 fschmid 503
void BookMView::SetAction(PageItem *currItem, QString Act)
3 paul 504
{
505
        BookMItem *ite;
506
        QListViewItemIterator it(this);
507
        for ( ; it.current(); ++it)
161 Franz 508
        {
3 paul 509
                ite = (BookMItem*)it.current();
4679 fschmid 510
                if (ite->PageObject == currItem)
161 Franz 511
                {
3 paul 512
                        ite->Action = Act;
513
                        break;
514
                }
161 Franz 515
        }
3 paul 516
}
517
 
1957 cbradney 518
void BookMView::ChangeText(PageItem *currItem)
3 paul 519
{
520
        BookMItem *ite;
521
        QString bm = "";
522
        QString bm2 = "";
523
        QString cc;
1957 cbradney 524
        for (uint d = 0; d < currItem->itemText.count(); ++d)
161 Franz 525
        {
1957 cbradney 526
                cc = currItem->itemText.at(d)->ch;
3 paul 527
                if ((cc == QChar(13)) || (cc == QChar(10)))
528
                        break;
529
                if ((cc == "(") || (cc == ")") || (cc == "\\"))
530
                        bm2 += "\\";
161 Franz 531
                bm += cc;
532
                bm2 += cc;
533
        }
3 paul 534
        QListViewItemIterator it(this);
535
        for ( ; it.current(); ++it)
161 Franz 536
        {
3 paul 537
                ite = (BookMItem*)it.current();
4679 fschmid 538
                if (ite->PageObject == currItem)
161 Franz 539
                {
3 paul 540
                        ite->setText(0, bm);
541
                        ite->Titel = bm2;
542
                        break;
543
                }
161 Franz 544
        }
3 paul 545
}
546
 
2196 cbradney 547
void BookMView::languageChange()
548
{
549
        setColumnText(idBookMarkCol, tr("Bookmarks"));
550
}