Subversion Repositories Scribus

Rev

Rev 3584 | Rev 3914 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1209 cbradney 1
/***************************************************************************
2
    begin                : Jan 2005
3
    copyright            : (C) 2005 by Craig Bradney
4
    email                : cbradney@zip.com.au
5
 ***************************************************************************/
6
 
7
/***************************************************************************
8
 *                                                                         *
9
 *   This program is free software; you can redistribute it and/or modify  *
10
 *   it under the terms of the GNU General Public License as published by  *
11
 *   the Free Software Foundation; either version 2 of the License, or     *
12
 *   (at your option) any later version.                                   *
13
 *                                                                         *
14
 ***************************************************************************/
15
#include <qptrlist.h>
16
#include <qobject.h>
17
#include <qmetaobject.h>
18
#include <qpopupmenu.h>
19
#include "scmenu.h"
1212 fschmid 20
#include "scmenu.moc"
1209 cbradney 21
#include "scraction.h"
3552 avox 22
#include "util.h"
1209 cbradney 23
 
3580 avox 24
ScrPopupMenu::ScrPopupMenu ( QWidget * parent, const char * name, const QString pMenuName, const QString pMenuText, const QString parentName, bool pCheckable ) : QObject(parent, name)
1209 cbradney 25
{
26
        parentMenuName=parentName;
2178 cbradney 27
        parentMenuID=-1;
1209 cbradney 28
        menuText=pMenuText;
29
        menuName=pMenuName;
30
        menuBarID=-1;
31
        menuItemList.clear();
32
        localPopupMenu=new QPopupMenu(parent, name);
3584 avox 33
//      localPopupMenu->setCheckable(pCheckable);
1209 cbradney 34
        enabled=true;
3580 avox 35
        checkable = pCheckable;
1209 cbradney 36
}
37
 
3580 avox 38
ScrPopupMenu::ScrPopupMenu ( QWidget * parent, const char * name, const QString pMenuName, const QIconSet pMenuIcon, const QString pMenuText, const QString parentName, bool pCheckable ) : QObject(parent, name)
3552 avox 39
{
40
        parentMenuName=parentName;
41
        parentMenuID=-1;
42
        menuIcon=pMenuIcon;
43
        menuText=pMenuText;
44
        menuName=pMenuName;
45
        menuBarID=-1;
46
        menuItemList.clear();
47
        localPopupMenu=new QPopupMenu(parent, name);
3584 avox 48
//      localPopupMenu->setCheckable(pCheckable);
3552 avox 49
        enabled=true;
3580 avox 50
        checkable=pCheckable;
3552 avox 51
}
52
 
1209 cbradney 53
ScrPopupMenu::~ScrPopupMenu()
54
{
55
        delete localPopupMenu;
56
}
57
 
58
const QString ScrPopupMenu::getMenuText()
59
{
60
        return menuText;
61
}
62
 
2178 cbradney 63
void ScrPopupMenu::setMenuText(const QString pMenuText)
64
{
65
        menuText=pMenuText;
66
}
67
 
3552 avox 68
const QIconSet ScrPopupMenu::getMenuIcon()
69
{
70
        return menuIcon;
71
}
72
 
73
void ScrPopupMenu::setMenuIcon(const QIconSet pMenuIcon)
74
{
75
        menuIcon=pMenuIcon;
76
}
77
 
1478 cbradney 78
const QString ScrPopupMenu::getMenuName()
79
{
80
        return menuName;
81
}
82
 
2178 cbradney 83
const QString ScrPopupMenu::getParentMenuName()
84
{
85
        return parentMenuName;
86
}
87
 
1209 cbradney 88
void ScrPopupMenu::setMenuBarID(int id)
89
{
90
        menuBarID=id;
91
}
92
 
93
int ScrPopupMenu::getMenuBarID()
94
{
95
        return menuBarID;
96
}
97
 
98
QPopupMenu *ScrPopupMenu::getLocalPopupMenu()
99
{
100
        return localPopupMenu;
101
}
102
 
1478 cbradney 103
bool ScrPopupMenu::hasSubMenu(ScrPopupMenu* subMenu)
104
{
105
        return menuItemList.contains(QGuardedPtr<QObject>(subMenu));
106
}
107
 
2178 cbradney 108
void ScrPopupMenu::setParentMenuID(int id)
109
{
110
        parentMenuID=id;
111
}
112
 
113
 
114
const int ScrPopupMenu::getParentMenuID()
115
{
116
        return parentMenuID;
117
}
118
 
1209 cbradney 119
bool ScrPopupMenu::insertSubMenu(ScrPopupMenu* newSubMenu)
120
{
1227 cbradney 121
        if (newSubMenu)
122
        {
123
                menuItemList.append(newSubMenu);
3580 avox 124
                localPopupMenu->insertItem(newSubMenu->getMenuIcon(), newSubMenu->getMenuText(), newSubMenu->getLocalPopupMenu());
1227 cbradney 125
                return true;
126
        }
127
        else
128
                return false;
1209 cbradney 129
}
130
 
131
bool ScrPopupMenu::removeSubMenu(ScrPopupMenu* subMenu)
132
{
133
        if (menuItemList.remove(subMenu))
134
        {
135
                repopulateLocalMenu();
136
                return true;
137
        }
138
        return false;
139
}
140
 
141
bool ScrPopupMenu::insertMenuItem(ScrAction *newMenuAction)
142
{
1227 cbradney 143
        if (newMenuAction)
144
        {
3587 avox 145
 
146
#ifdef Q_WS_MAC
147
                boolean menuListHasNoIcons = true;
148
                // look for ScrAction or ScrPopupMenu from the end of the list
149
                QValueList< QGuardedPtr<QObject> >::Iterator it = menuItemList.end();
150
                for (--it; it != menuItemList.end(); --it) {
151
                        QObject * menuItem = *it;
152
                        QString menuItemListClassName = menuItem->className();
153
                        if (menuItemListClassName == "ScrAction")
154
                        {
155
                                ScrAction * act = dynamic_cast<ScrAction *>(menuItem);
156
                                menuListHasNoIcons = act->iconSet().isNull();
157
                                break;
158
                        }
159
                        else if (menuItemListClassName == "ScrPopupMenu")
160
                        {
161
                                ScrPopupMenu * men = dynamic_cast<ScrPopupMenu *>(menuItem);
162
                                menuListHasNoIcons = men->getMenuIcon().isNull();
163
                                break;
164
                        }
165
 
166
                }
167
                if (newMenuAction->iconSet().isNull() && ! menuListHasNoIcons)
168
                        newMenuAction->setIconSet(loadIcon("noicon.xpm"));
169
#endif
170
 
1227 cbradney 171
                menuItemList.append(newMenuAction);
3580 avox 172
                newMenuAction->addTo(localPopupMenu);                  
1227 cbradney 173
                return true;
174
        }
175
        else
176
                return false;
1209 cbradney 177
}
178
 
1236 cbradney 179
bool ScrPopupMenu::insertMenuItem(QWidget *widget)
180
{
181
        if (widget)
182
        {
183
                ScrAction *widgetAction = new ScrAction( NULL, "widget_action" );
184
                menuItemList.append(widgetAction);
185
                localPopupMenu->insertItem(widget);
186
                return true;
187
        }
188
        else
189
                return false;
190
}
191
 
1209 cbradney 192
bool ScrPopupMenu::insertMenuItemAfter(ScrAction *newMenuAction, ScrAction *afterMenuAction)
193
{
194
        //Allow duplicate menu items ???
195
        //if (menuItemList.findRef(newMenuAction)!=-1)
196
        //      return false;
197
 
3580 avox 198
#ifdef Q_WS_MAC
199
        if (newMenuAction->iconSet().isNull() && ! (afterMenuAction->iconSet().isNull()))
3552 avox 200
                newMenuAction->setIconSet(loadIcon("noicon.xpm"));
3580 avox 201
#endif
202
 
1478 cbradney 203
        QValueList< QGuardedPtr<QObject> >::Iterator it=menuItemList.find(QGuardedPtr<QObject>(afterMenuAction));
204
        menuItemList.insert(++it, QGuardedPtr<QObject>(newMenuAction));
205
        /*
1209 cbradney 206
        if (index==-1)
207
                return false;
208
        int newIndex=++index;
209
        bool insSuccess=menuItemList.insert(newIndex, newMenuAction);
1478 cbradney 210
 
1209 cbradney 211
        if (!insSuccess)
212
                return false;
1478 cbradney 213
        */
1209 cbradney 214
        return repopulateLocalMenu();
215
}
216
 
217
bool ScrPopupMenu::removeMenuItem(ScrAction *menuAction)
218
{
219
        if (menuItemList.remove(menuAction))
220
        {
221
                repopulateLocalMenu();
222
                return true;
223
        }
224
        return false;
225
}
226
/*
227
bool ScrPopupMenu::insertMenuItemAfter(ScrAction *newMenuAction, const QString afterMenuName)
228
{
229
        bool retVal=true;
230
        bool found=false;
231
        QPtrListIterator<QObject> menuItemListIt(menuItemList);
232
        QObject *object;
233
        while ( (object = menuItemListIt.current()) != 0  )
234
        {
235
                QString menuItemListClassName=object->className();
236
                int index=-1;
237
                //index=menuItemListIt.at();
238
                if (index=-1)
239
                {
240
                        retVal=false;
241
                        break;
242
                }
243
                if (menuItemListClassName=="ScrAction")
244
                {
245
                        qDebug("ScrAction found");
246
                        if(QString(object->name())==QString("separator_action"))
247
                                bool blah=true;//localPopupMenu->insertSeparator();
248
                        else
249
                        {
250
                                //Grab the action from the list, break and call the other after insert function
251
 
252
                                int newIndex=++index;
253
                                bool insSuccess=menuItemList.insert(newIndex, newMenuAction);
254
                                if (!insSuccess)
255
                                        return false;
256
 
257
                        }
258
                }
259
        }
260
        if (!found)
261
                return false;
262
        if (retVal==false)
263
                return false;
264
 
265
        return repopulateLocalMenu();
266
}
267
*/
1236 cbradney 268
 
269
//CB TODO Does NOT handle rebuilding with widgets
1209 cbradney 270
bool ScrPopupMenu::repopulateLocalMenu()
271
{
272
        localPopupMenu->clear();
1493 cbradney 273
        QValueList< QGuardedPtr<QObject> >::Iterator menuItemListIt = menuItemList.begin();
274
        while (menuItemListIt!=menuItemList.end())
1209 cbradney 275
        {
1478 cbradney 276
                QObject *listObj=(*menuItemListIt);
277
                if (listObj==NULL)
278
                {
1493 cbradney 279
                        QValueList< QGuardedPtr<QObject> >::Iterator menuItemListItToDelete = menuItemListIt;
280
                        ++menuItemListIt;
281
                        menuItemList.remove(*menuItemListItToDelete);
1478 cbradney 282
                        continue;
283
                }
284
 
285
                QString menuItemListClassName=listObj->className();
1209 cbradney 286
                if (menuItemListClassName=="ScrAction")
287
                {
288
                        //qDebug("ScrAction found");
1478 cbradney 289
                        if(QString(listObj->name())==QString("separator_action"))
1209 cbradney 290
                                localPopupMenu->insertSeparator();
3580 avox 291
                        else {
292
                                ScrAction * act = dynamic_cast<ScrAction *>(listObj);
293
                                act->addTo(localPopupMenu);
294
                        }
1209 cbradney 295
                }
1478 cbradney 296
                else
297
                {
298
                        if (menuItemListClassName=="ScrPopupMenu")
1209 cbradney 299
                        {
3580 avox 300
                                ScrPopupMenu * men = dynamic_cast<ScrPopupMenu *>(listObj);
301
                                localPopupMenu->insertItem(men->getMenuIcon(), men->getMenuText(), men->getLocalPopupMenu());
1209 cbradney 302
                        }
303
                        else
1478 cbradney 304
                                qDebug(QString("Alien found: %1").arg((*menuItemListIt)->className()));
305
                }
1493 cbradney 306
                ++menuItemListIt;
1209 cbradney 307
        }
308
        return true;
309
}
310
 
1437 cbradney 311
bool ScrPopupMenu::generateEntryList(QStringList *actNames)
312
{
1493 cbradney 313
        QValueList< QGuardedPtr<QObject> >::Iterator menuItemListIt = menuItemList.begin();
314
        while (menuItemListIt!=menuItemList.end())
1437 cbradney 315
        {
1478 cbradney 316
                QObject *listObj=(*menuItemListIt);
317
                if (listObj==NULL)
318
                {
1493 cbradney 319
                        QValueList< QGuardedPtr<QObject> >::Iterator menuItemListItToDelete = menuItemListIt;
320
                        ++menuItemListIt;
321
                        menuItemList.remove(*menuItemListItToDelete);
1478 cbradney 322
                        continue;
323
                }
324
 
325
                QString menuItemListClassName=listObj->className();
1437 cbradney 326
                if (menuItemListClassName=="ScrAction")
327
                {
1478 cbradney 328
                        if(QString(listObj->name())==QString("separator_action"))
1437 cbradney 329
                                ;
330
                        else
331
                        {
1478 cbradney 332
                                ScrAction *sca=dynamic_cast<ScrAction *>(listObj);
1437 cbradney 333
                                if (sca)
334
                                        actNames->append(sca->name());
335
                        }
336
                }
1478 cbradney 337
                else
338
                if (menuItemListClassName=="ScrPopupMenu")
1437 cbradney 339
                {
1478 cbradney 340
                        ScrPopupMenu *scp=dynamic_cast<ScrPopupMenu *>(listObj);
1437 cbradney 341
                        if (scp)
342
                                scp->generateEntryList(actNames);
343
                }
1493 cbradney 344
                ++menuItemListIt;
1437 cbradney 345
        }
346
        return true;
347
 
348
}
349
 
1209 cbradney 350
bool ScrPopupMenu::clear()
351
{
352
        menuItemList.clear(); //CB TODO leaking separators here ?
353
        localPopupMenu->clear();
1437 cbradney 354
        return true;
1209 cbradney 355
}
356
 
357
bool ScrPopupMenu::insertMenuSeparator()
358
{
359
        ScrAction *sepAction = new ScrAction( NULL, "separator_action" );
360
        menuItemList.append(sepAction);
361
        localPopupMenu->insertSeparator();
362
        return true;
363
}
364
 
365
void ScrPopupMenu::setEnabled(bool menuEnabled)
366
{
367
        enabled=menuEnabled;
368
        localPopupMenu->setEnabled(enabled);
369
}