Subversion Repositories Scribus

Rev

Rev 4430 | Rev 4784 | 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
    }
3 paul 195
        int ins, mov, mret;
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"));
217
                        pmenu->insertItem( tr("Cancel"));
3 paul 218
                        mret = pmenu->exec(QCursor::pos());
219
                        if (mret == ins)
161 Franz 220
                        {
3 paul 221
                                lv = DraggedI->parent();
222
                                lv = lv ? lv->firstChild() : firstChild();
223
                                if (!DraggedI->Prev == 0)
161 Franz 224
                                {
225
                                        while (lv)
3 paul 226
                                        {
227
                                                ip = (BookMItem*)lv;
228
                                                if (ip->ItemNr == DraggedI->Prev)
229
                                                        break;
230
                                                lv = lv->nextSibling();
161 Franz 231
                                        }
3 paul 232
                                        ip = (BookMItem*)lv;
233
                                        lv = DraggedI->nextSibling();
234
                                        if (lv)
161 Franz 235
                                        {
3 paul 236
                                                ip2 = (BookMItem*)lv;
237
                                                ip2->Prev = ip->ItemNr;
238
                                                ip->Next = ip2->ItemNr;
161 Franz 239
                                        }
3 paul 240
                                        else
241
                                                ip->Next = 0;
161 Franz 242
                                }
3 paul 243
                                lv = DraggedI->parent();
161 Franz 244
                                item->insertItem(DraggedI);
3 paul 245
                                lv ? lv = lv->firstChild() : lv = firstChild();
246
                                if (DraggedI->Prev == 0)
161 Franz 247
                                {
3 paul 248
                                        ip = (BookMItem*)lv;
1874 fschmid 249
                                        if (ip)
250
                                                ip->Prev = 0;
161 Franz 251
                                }
3 paul 252
                                QListViewItemIterator it(this);
253
                                for ( ; it.current(); ++it)
161 Franz 254
                                {
3 paul 255
                                        ite = (BookMItem*)it.current();
256
                                        if (ite->ItemNr == DraggedI->ItemNr)
257
                                                DraggedI = ite;
161 Franz 258
                                }
259
                                DraggedI->Pare = Bite->ItemNr;
260
                                ip = (BookMItem*)item->firstChild();
261
                                Bite->First = ip->ItemNr;
262
                                lv = item->firstChild();
263
                                while (lv)
3 paul 264
                                {
161 Franz 265
                                        if (!lv->nextSibling())
3 paul 266
                                        {
161 Franz 267
                                                ip = (BookMItem*)lv;
268
                                                Bite->Last = ip->ItemNr;
269
                                                break;
3 paul 270
                                        }
161 Franz 271
                                        lv = lv->nextSibling();
3 paul 272
                                }
161 Franz 273
                                if (DraggedI->nextSibling())
3 paul 274
                                {
161 Franz 275
                                        ip = (BookMItem*)DraggedI->nextSibling();
276
                                        DraggedI->Next = ip->ItemNr;
277
                                        ip->Prev = DraggedI->ItemNr;
3 paul 278
                                }
161 Franz 279
                                else
280
                                        DraggedI->Next = 0;
281
                                if (DraggedI != item->firstChild())
3 paul 282
                                {
161 Franz 283
                                        ip = (BookMItem*)DraggedI->itemAbove();
284
                                        DraggedI->Prev = ip->ItemNr;
285
                                        ip->Next = DraggedI->ItemNr;
3 paul 286
                                }
161 Franz 287
                                else
288
                                        DraggedI->Prev = 0;
3 paul 289
                        }
290
                        if (mret == mov)
161 Franz 291
                        {
3 paul 292
                                lv = DraggedI->parent();
293
                                lv ? lv = lv->firstChild() : lv = firstChild();
294
                                if (DraggedI->Prev == 0)
161 Franz 295
                                {
3 paul 296
                                        ip = (BookMItem*)lv->nextSibling();
1065 cbradney 297
                                        if (ip)
298
                                                ip->Prev = 0;
161 Franz 299
                                }
3 paul 300
                                else
161 Franz 301
                                {
302
                                        while (lv)
3 paul 303
                                        {
304
                                                ip = (BookMItem*)lv;
305
                                                if (ip->ItemNr == DraggedI->Prev)
306
                                                        break;
307
                                                lv = lv->nextSibling();
308
                                        }
161 Franz 309
                                }
3 paul 310
                                ip = (BookMItem*)lv;
311
                                lv = DraggedI->nextSibling();
312
                                if (lv)
161 Franz 313
                                {
3 paul 314
                                        ip2 = (BookMItem*)lv;
315
                                        ip2->Prev = ip->ItemNr;
316
                                        ip->Next = ip2->ItemNr;
161 Franz 317
                                }
3 paul 318
                                else
319
                                        ip->Next = 0;
320
                                lv = DraggedI->parent();
161 Franz 321
                                DraggedI->moveItem(item);
3 paul 322
                                lv ? lv = lv->firstChild() : lv = firstChild();
323
                                if (DraggedI->Prev == 0)
161 Franz 324
                                {
3 paul 325
                                        ip = (BookMItem*)lv;
1065 cbradney 326
                                        if (ip)
327
                                                ip->Prev = 0;
161 Franz 328
                                }
3 paul 329
                                QListViewItemIterator it2(this);
330
                                for ( ; it2.current(); ++it2)
161 Franz 331
                                {
3 paul 332
                                        ite = (BookMItem*)it2.current();
333
                                        if (ite->ItemNr == DraggedI->ItemNr)
334
                                                DraggedI = ite;
161 Franz 335
                                }
336
                                ip = (BookMItem*)item;
337
                                DraggedI->Pare = ip->Pare;
338
                                DraggedI->Prev = ip->ItemNr;
339
                                ip->Next = DraggedI->ItemNr;
340
                                if (DraggedI->nextSibling())
3 paul 341
                                {
161 Franz 342
                                        ip = (BookMItem*)DraggedI->nextSibling();
343
                                        DraggedI->Next = ip->ItemNr;
344
                                        ip->Prev = DraggedI->ItemNr;
3 paul 345
                                }
161 Franz 346
                                else
1874 fschmid 347
                                        DraggedI->Next = 0;
161 Franz 348
                                lv = item->parent();
3 paul 349
                                if (lv)
161 Franz 350
                                {
3 paul 351
                                        ip = (BookMItem*)lv->firstChild();
352
                                        ip2 = (BookMItem*)lv;
353
                                        ip2->First = ip->ItemNr;
161 Franz 354
                                        lv = lv->firstChild();
355
                                        while (lv)
3 paul 356
                                        {
161 Franz 357
                                                if (!lv->nextSibling())
3 paul 358
                                                {
161 Franz 359
                                                        ip = (BookMItem*)lv;
360
                                                        ip2->Last = ip->ItemNr;
361
                                                        break;
3 paul 362
                                                }
161 Franz 363
                                                lv = lv->nextSibling();
3 paul 364
                                        }
161 Franz 365
                                }      
3 paul 366
                        }
367
                        delete pmenu;  
161 Franz 368
                        DraggedI = 0;
3 paul 369
                        emit MarkMoved();
370
                }
371
        }
372
}
373
 
374
void BookMView::contentsDragMoveEvent(QDragMoveEvent *e)
375
{
376
        QString text;
377
        if (!QTextDrag::decode(e, text))
161 Franz 378
        {
3 paul 379
                e->ignore();
380
                return;
381
    }
382
        QListViewItem *item = itemAt(contentsToViewport(e->pos()));
161 Franz 383
        if (item)
3 paul 384
        {
385
                setSelected(item, true);
386
                e->accept();
387
        }
161 Franz 388
        else
3 paul 389
                e->ignore();
390
}
391
 
4679 fschmid 392
void BookMView::AddItem(QString text, QString Tit, PageItem *PageObject)
3 paul 393
{
161 Franz 394
        QListViewItem *lv = firstChild();
395
        while (lv)
396
        {
397
                if (!lv->nextSibling())
398
                        break;
399
                lv = lv->nextSibling();
3 paul 400
        }
161 Franz 401
        BookMItem *ip;
3 paul 402
        BookMItem *ite;
403
        if (lv)
4679 fschmid 404
                ite = new BookMItem(this, lv, NrItems+1, PageObject);
3 paul 405
        else
4679 fschmid 406
                ite = new BookMItem(this, NrItems+1, PageObject);
3 paul 407
        ite->setText(0, text);
408
        ite->Titel = Tit;
409
        ite->Next = 0;
161 Franz 410
        if (lv)
3 paul 411
        {
161 Franz 412
                ip = (BookMItem*)lv;
413
                ip->Next = ite->ItemNr;
414
                ite->Prev = ip->ItemNr;
3 paul 415
        }
416
        NrItems++;
417
}
418
 
4679 fschmid 419
void BookMView::DeleteItem(PageItem *pObject)
3 paul 420
{
421
        BookMItem *ite;
4679 fschmid 422
        int nr;
423
        QListViewItemIterator itx(this);
424
        for ( ; itx.current(); ++itx)
425
        {
426
                ite = (BookMItem*)itx.current();
427
                if (ite->PageObject == pObject)
428
                {
429
                        nr = ite->ItemNr;
430
                        break;
431
                }
432
        }
3 paul 433
        BookMItem *ite2 = 0;
434
        BookMItem *ite3;
435
        BookMItem *ite4;
436
        QListViewItemIterator it(this);
437
        for ( ; it.current(); ++it)
161 Franz 438
        {
3 paul 439
                ite = (BookMItem*)it.current();
440
                if (ite->Next == nr)
441
                        ite2 = ite;
442
                if (ite->ItemNr == nr)
161 Franz 443
                {
3 paul 444
                        QListViewItem *pp = ite->firstChild();
445
                        QListViewItem *ppn = ite->nextSibling();
446
                        if ((ite->parent()) && (ite2 == 0) && (ppn))
161 Franz 447
                        {
3 paul 448
                                ite3 = (BookMItem*)ite->parent();
449
                                ite4 = (BookMItem*)ppn;
450
                                ite3->First = ite4->ItemNr;
161 Franz 451
                        }
3 paul 452
                        while (pp)
161 Franz 453
                        {
454
                        ite->parent() ? ite->parent()->insertItem(pp) : pp->moveItem(ite);
3 paul 455
                                pp = ite->firstChild();
161 Franz 456
                        }
3 paul 457
                        if (ppn)
161 Franz 458
                        {
3 paul 459
                                ite3 = (BookMItem*)ppn;
460
                                if (ite2)
161 Franz 461
                                {
3 paul 462
                                        ite2->Next = ite3->ItemNr;
463
                                        ite3->Prev = ite2->ItemNr;
161 Franz 464
                                }
3 paul 465
                                else
466
                                        ite3->Prev = 0;
161 Franz 467
                        }
3 paul 468
                        else
469
                                if (ite2)
470
                                        ite2->Next = 0;
471
                        delete ite;
472
                }
161 Franz 473
        }
3 paul 474
        QMap<int,int> Tabl;
475
        Tabl.clear();
476
        Tabl[0] = 0;
477
        int Counter = 1;
478
        QListViewItemIterator itn(this);
479
        for ( ; itn.current(); ++itn)
161 Franz 480
        {
3 paul 481
                ite = (BookMItem*)itn.current();
482
                Tabl[ite->ItemNr] = Counter;
483
                Counter++;
161 Franz 484
        }
3 paul 485
        QListViewItemIterator itnf(this);
486
        for ( ; itnf.current(); ++itnf)
161 Franz 487
        {
3 paul 488
                ite = (BookMItem*)itnf.current();
489
                ite->ItemNr = Tabl[ite->ItemNr];
490
                ite->Pare = Tabl[ite->Pare];
491
                ite->Next = Tabl[ite->Next];
492
                ite->Prev = Tabl[ite->Prev];
493
                ite->First = Tabl[ite->First];
494
                ite->Last = Tabl[ite->Last];
161 Franz 495
        }
3 paul 496
}
497
 
4679 fschmid 498
void BookMView::SetAction(PageItem *currItem, QString Act)
3 paul 499
{
500
        BookMItem *ite;
501
        QListViewItemIterator it(this);
502
        for ( ; it.current(); ++it)
161 Franz 503
        {
3 paul 504
                ite = (BookMItem*)it.current();
4679 fschmid 505
                if (ite->PageObject == currItem)
161 Franz 506
                {
3 paul 507
                        ite->Action = Act;
508
                        break;
509
                }
161 Franz 510
        }
3 paul 511
}
512
 
1957 cbradney 513
void BookMView::ChangeText(PageItem *currItem)
3 paul 514
{
515
        BookMItem *ite;
516
        QString bm = "";
517
        QString bm2 = "";
518
        QString cc;
1957 cbradney 519
        for (uint d = 0; d < currItem->itemText.count(); ++d)
161 Franz 520
        {
1957 cbradney 521
                cc = currItem->itemText.at(d)->ch;
3 paul 522
                if ((cc == QChar(13)) || (cc == QChar(10)))
523
                        break;
524
                if ((cc == "(") || (cc == ")") || (cc == "\\"))
525
                        bm2 += "\\";
161 Franz 526
                bm += cc;
527
                bm2 += cc;
528
        }
3 paul 529
        QListViewItemIterator it(this);
530
        for ( ; it.current(); ++it)
161 Franz 531
        {
3 paul 532
                ite = (BookMItem*)it.current();
4679 fschmid 533
                if (ite->PageObject == currItem)
161 Franz 534
                {
3 paul 535
                        ite->setText(0, bm);
536
                        ite->Titel = bm2;
537
                        break;
538
                }
161 Franz 539
        }
3 paul 540
}
541
 
2196 cbradney 542
void BookMView::languageChange()
543
{
544
        setColumnText(idBookMarkCol, tr("Bookmarks"));
545
}