diff options
Diffstat (limited to 'scribus/contextmenu.cpp')
| -rw-r--r-- | scribus/contextmenu.cpp | 465 |
1 files changed, 465 insertions, 0 deletions
diff --git a/scribus/contextmenu.cpp b/scribus/contextmenu.cpp new file mode 100644 index 0000000..baebcb7 --- /dev/null +++ b/scribus/contextmenu.cpp @@ -0,0 +1,465 @@ +/* + For general Scribus (>=1.3.2) copyright and licensing information please refer + to the COPYING file provided with the program. Following this notice may exist + a copyright and/or license notice that predates the release of Scribus 1.3.2 + for which a new license (GPL+exception) is in place. + */ +/*************************************************************************** +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +***************************************************************************/ + +// #include <QDebug> +#include <QFrame> +#include <QGridLayout> +#include <QLabel> +#include <QTextEdit> +#include <QWidget> +#include <QWidgetAction> + +#include "contextmenu.h" +#include "menumanager.h" +#include "prefsmanager.h" +#include "scmimedata.h" +#include "scrapbookpalette.h" +#include "scraction.h" +#include "scribus.h" +#include "scribusdoc.h" +#include "undomanager.h" +#include "canvasmode_legacy.h" + +ContextMenu::ContextMenu(Selection & sel, ScribusMainWindow *actionsParent, ScribusDoc* doc, QWidget * parent) : + QMenu(parent), + m_Sel(sel), + m_AP(actionsParent), + m_doc(doc), + onAPage(false) +{ + if (m_Sel.count()>0) + { + processSelection(); + createMenuItems_Selection(); + } +} + +ContextMenu::ContextMenu(ScribusMainWindow *actionsParent, ScribusDoc* doc, double mx, double my, QWidget * parent) : + QMenu(parent), + m_Sel(Selection(this)), + m_AP(actionsParent), + m_doc(doc) +{ + createMenuItems_NoSelection(mx, my); +} + +void ContextMenu::processSelection() +{ + int selectedItemCount=m_Sel.count(); + if (selectedItemCount == 0) + return; + + PageItem* currItem=NULL; + for (int i = 0; i < selectedItemCount; ++i) + { + currItem = m_Sel.itemAt(i); + if (currItem) + { + currItem->applicableActions(m_actionList); + } + } +} + +void ContextMenu::createMenuItems_Selection() +{ + //CB TODO clean + int selectedItemCount=m_Sel.count(); + if (selectedItemCount==0) + return; + bool itemsAreSameType=m_Sel.itemsAreSameType(); + //Find our doc from first item in selection if we have an item + PageItem *currItem = m_Sel.itemAt(0); + assert(m_doc!=0 && currItem!=0); + + QMenu *menuConvertTo = new QMenu(this); + QMenu *menuEditContents = new QMenu(this); + QMenu *menuInfo = new QMenu(this); + QMenu *menuLayer = new QMenu(this); + QMenu *menuLevel = new QMenu(this); + QMenu *menuPDF = new QMenu(this); + QMenu *menuResolution = new QMenu(this); + + //<-- Add Info + //Test new method with image frames first + if (selectedItemCount==1 && currItem->asImageFrame()) + { + QAction *act = addMenu(menuInfo); + act->setText( ScribusView::tr("In&fo")); + if (currItem->asImageFrame()) + { + QLabel* menuLabel = new QLabel("<html>" + currItem->infoDescription() + "</html>", this); + menuLabel->setFrameShape(QFrame::NoFrame); + QWidgetAction* menuTextWidget = new QWidgetAction(this); + menuTextWidget->setDefaultWidget(menuLabel); + menuInfo->addAction(menuTextWidget); + } + } + else + { + QFrame *infoGroup = new QFrame( m_doc->view() ); + infoGroup->setFrameShape( QFrame::NoFrame ); + QGridLayout *infoGroupLayout = new QGridLayout( infoGroup ); + infoGroupLayout->setAlignment( Qt::AlignTop ); + infoGroupLayout->setSpacing( 2 ); + infoGroupLayout->setMargin( 0 ); + if (currItem->createInfoGroup(infoGroup, infoGroupLayout)) + { + int row = infoGroupLayout->rowCount(); // <a.l.e> + + QLabel *printCT = new QLabel(infoGroup); + QLabel *printT = new QLabel(infoGroup); + printCT->setText( ScribusView::tr("Print: ")); + infoGroupLayout->addWidget( printCT, row, 0, Qt::AlignRight ); + if (currItem->printEnabled()) + printT->setText( ScribusView::tr("Enabled")); + else + printT->setText( ScribusView::tr("Disabled")); + infoGroupLayout->addWidget( printT, row, 1 ); // </a.l.e> + + QWidgetAction* MenAct = new QWidgetAction(this); + MenAct->setDefaultWidget(infoGroup); + menuInfo->addAction(MenAct); + + // Qt4 menuInfo->insertItem(infoGroup); +// currItem->createContextMenu(menuInfo, 5); + QAction *act = addMenu(menuInfo); + act->setText( ScribusView::tr("In&fo")); + } else { + delete infoGroupLayout; + delete infoGroup; + } + } + //--> + + //<-- Add undo + UndoManager * const undoManager(UndoManager::instance()); + if (undoManager->hasUndoActions()) + addAction(m_AP->scrActions["editUndoAction"]); + if (undoManager->hasRedoActions()) + addAction(m_AP->scrActions["editRedoAction"]); + //--> + + //<-- Item specific actions + if (itemsAreSameType) + { + if (m_actionList.contains("editEditRenderSource")) + { + addSeparator(); + addAction(m_AP->scrActions["editEditRenderSource"]); + } + if (m_actionList.contains("fileImportText")) + { + addSeparator(); + addAction(m_AP->scrActions["fileImportText"]); + addAction(m_AP->scrActions["fileImportAppendText"]); + addAction(m_AP->scrActions["toolsEditWithStoryEditor"]); + addAction(m_AP->scrActions["insertSampleText"]); + } + else //enable this for, eg, text on a path + if (m_actionList.contains("toolsEditWithStoryEditor")) + { + addSeparator(); + addAction(m_AP->scrActions["toolsEditWithStoryEditor"]); + } + addSeparator(); + if (m_actionList.contains("fileImportImage")) + addAction(m_AP->scrActions["fileImportImage"]); + if (selectedItemCount==1 && currItem->asImageFrame()) + { + if (QApplication::clipboard()->mimeData()->hasImage()) + addAction(m_AP->scrActions["editPasteImageFromClipboard"]); + } + if (m_actionList.contains("itemAdjustFrameToImage")) + addAction(m_AP->scrActions["itemAdjustFrameToImage"]); + if (m_actionList.contains("itemAdjustImageToFrame")) + addAction(m_AP->scrActions["itemAdjustImageToFrame"]); + if (m_actionList.contains("itemExtendedImageProperties")) + addAction(m_AP->scrActions["itemExtendedImageProperties"]); + if (m_actionList.contains("itemImageInfo")) + addAction(m_AP->scrActions["itemImageInfo"]); + if (m_actionList.contains("itemUpdateImage")) + addAction(m_AP->scrActions["itemUpdateImage"]); + + if (m_actionList.contains("itemPreviewLow")) + { + if (m_actionList.contains("itemImageIsVisible")) + menuResolution->addAction(m_AP->scrActions["itemImageIsVisible"]); + menuResolution->addSeparator(); + if (m_actionList.contains("itemPreviewLow")) + menuResolution->addAction(m_AP->scrActions["itemPreviewLow"]); + if (m_actionList.contains("itemPreviewNormal")) + menuResolution->addAction(m_AP->scrActions["itemPreviewNormal"]); + if (m_actionList.contains("itemPreviewFull")) + menuResolution->addAction(m_AP->scrActions["itemPreviewFull"]); + if (menuResolution->actions().count()>0) + { + QAction *act = addMenu(menuResolution); + act->setText( tr("Preview Settings")); + } + } + + if (m_actionList.contains("styleImageEffects")) + addAction(m_AP->scrActions["styleImageEffects"]); + if (m_actionList.contains("editEditWithImageEditor")) + addAction(m_AP->scrActions["editEditWithImageEditor"]); + if (selectedItemCount==1 && currItem->asImageFrame()) + { + if (currItem->PictureIsAvailable) + { + if (!currItem->isTableItem) + m_AP->scrActions["itemAdjustFrameToImage"]->setEnabled(true); + m_AP->scrActions["itemAdjustImageToFrame"]->setEnabled(true); + if (currItem->pixm.imgInfo.valid) + m_AP->scrActions["itemExtendedImageProperties"]->setEnabled(true); + if (currItem->pixm.imgInfo.exifDataValid) + m_AP->scrActions["itemImageInfo"]->setEnabled(true); + m_AP->scrActions["itemUpdateImage"]->setEnabled(true); + if (currItem->isRaster) + { + m_AP->scrActions["styleImageEffects"]->setEnabled(true); + m_AP->scrActions["editEditWithImageEditor"]->setEnabled(true); + } + } + } + + } + //--> + + //<-- Item Attributes + if (selectedItemCount == 1) + { + addSeparator(); + addAction(m_AP->scrActions["itemAttributes"]); + } + //--> + //<-- Item PDF Options + if (currItem->itemType() == PageItem::TextFrame) + { + QAction *act = addMenu(menuPDF); + act->setText( ScribusView::tr("&PDF Options")); + menuPDF->addAction(m_AP->scrActions["itemPDFIsAnnotation"]); + if (!m_doc->masterPageMode()) + menuPDF->addAction(m_AP->scrActions["itemPDFIsBookmark"]); + if (selectedItemCount == 1) + { + menuPDF->addSeparator(); + if (m_actionList.contains("itemPDFAnnotationProps")) + menuPDF->addAction(m_AP->scrActions["itemPDFAnnotationProps"]); + if (m_actionList.contains("itemPDFFieldProps")) + menuPDF->addAction(m_AP->scrActions["itemPDFFieldProps"]); + } + } + //--> + + //<-- Item Locking + addSeparator(); + addAction(m_AP->scrActions["itemLock"]); + addAction(m_AP->scrActions["itemLockSize"]); + //--> + + if (selectedItemCount>0) + { +// addAction(m_AP->scrActions["itemSendToScrapbook"]); + QAction *actSc = addMenu(m_AP->scrMenuMgr->getLocalPopupMenu("itemSendToScrapbook")); + actSc->setText( ScribusView::tr("Send to Scrapbook")); + addAction(m_AP->scrActions["itemSendToPattern"]); + //<-- Add Layer Items + if (m_doc->layerCount() > 1) + { + QMap<int,int> layerMap; + for (ScLayers::iterator it = m_doc->Layers.begin(); it != m_doc->Layers.end(); ++it) + layerMap.insert((*it).Level, (*it).LNr); + int i=layerMap.count()-1; + while (i>=0) + { + if (m_doc->layerLocked(layerMap[i])) + m_AP->scrLayersActions[QString::number(layerMap[i])]->setEnabled(false); + else + m_AP->scrLayersActions[QString::number(layerMap[i])]->setEnabled(true); + QPixmap pm(20,15); + pm.fill(m_doc->layerMarker(layerMap[i])); + m_AP->scrLayersActions[QString::number(layerMap[i])]->setIcon(pm); + menuLayer->addAction(m_AP->scrLayersActions[QString::number(layerMap[i--])]); + } + QAction *act = addMenu(menuLayer); + act->setText( ScribusView::tr("Send to La&yer")); + } + //--> + } + //<-- Add Groups Items + if (selectedItemCount>1) + { + bool isGroup = true; + int firstElem = -1; + if (currItem->Groups.count() != 0) + firstElem = currItem->Groups.top(); + for (int bx = 0; bx < selectedItemCount && isGroup==true; ++bx) + { + if (m_Sel.itemAt(bx)->Groups.count() != 0) + { + if (m_Sel.itemAt(bx)->Groups.top() != firstElem) + isGroup = false; + } + else + isGroup = false; + } + if (!isGroup) + addAction(m_AP->scrActions["itemGroup"]); + } + if (currItem->Groups.count() != 0) + addAction(m_AP->scrActions["itemUngroup"]); + //--> + + //<-- Add Level Item + if (!currItem->locked()) + { + if ((!currItem->isTableItem) && (!currItem->isSingleSel)) + { + QAction *act = addMenu(menuLevel); + act->setText( ScribusView::tr("Le&vel")); + menuLevel->addAction(m_AP->scrActions["itemRaiseToTop"]); + menuLevel->addAction(m_AP->scrActions["itemRaise"]); + menuLevel->addAction(m_AP->scrActions["itemLower"]); + menuLevel->addAction(m_AP->scrActions["itemLowerToBottom"]); + } + } + //--> + + //<-- Add Convert To Items + if (m_doc->appMode != modeEdit && (itemsAreSameType || currItem->isSingleSel)) //Create convertTo Menu + { + if (m_AP->scrActions["itemConvertToBezierCurve"]->isEnabled() && m_actionList.contains("itemConvertToBezierCurve")) + menuConvertTo->addAction(m_AP->scrActions["itemConvertToBezierCurve"]); + if (m_AP->scrActions["itemConvertToImageFrame"]->isEnabled() && m_actionList.contains("itemConvertToImageFrame")) + menuConvertTo->addAction(m_AP->scrActions["itemConvertToImageFrame"]); + if (m_AP->scrActions["itemConvertToOutlines"]->isEnabled() && m_actionList.contains("itemConvertToOutlines")) + menuConvertTo->addAction(m_AP->scrActions["itemConvertToOutlines"]); + if (m_AP->scrActions["itemConvertToPolygon"]->isEnabled() && m_actionList.contains("itemConvertToPolygon")) + menuConvertTo->addAction(m_AP->scrActions["itemConvertToPolygon"]); + if (m_AP->scrActions["itemConvertToTextFrame"]->isEnabled() && m_actionList.contains("itemConvertToTextFrame")) + menuConvertTo->addAction(m_AP->scrActions["itemConvertToTextFrame"]); + if (menuConvertTo->actions().count()>0) + { + QAction *act = addMenu(menuConvertTo); + act->setText( ScribusView::tr("Conve&rt to")); + } + } + //--> + + //<-- Add Copy/Paste Actions + addSeparator(); + if (!currItem->locked() && !(currItem->isSingleSel)) + addAction(m_AP->scrActions["editCut"]); + if (!(currItem->isSingleSel)) + addAction(m_AP->scrActions["editCopy"]); + if ((m_doc->appMode == modeEdit) && (ScMimeData::clipboardHasScribusText()||ScMimeData::clipboardHasPlainText()) && (currItem->itemType() == PageItem::TextFrame)) + addAction(m_AP->scrActions["editPaste"]); + if (!currItem->locked() && (m_doc->appMode != modeEdit) && (!(currItem->isSingleSel))) + addAction(m_AP->scrActions["itemDelete"]); + //--> + + //<-- Add Contents Actions + if (itemsAreSameType) + { + if (m_actionList.contains("editCopyContents")) + menuEditContents->addAction(m_AP->scrActions["editCopyContents"]); + if (m_actionList.contains("editPasteContents")) + menuEditContents->addAction(m_AP->scrActions["editPasteContents"]); + if (m_actionList.contains("editPasteContentsAbs")) + menuEditContents->addAction(m_AP->scrActions["editPasteContentsAbs"]); + } + if (m_actionList.contains("editClearContents")) + menuEditContents->addAction(m_AP->scrActions["editClearContents"]); + if (menuEditContents->actions().count()>0) + { + QAction *act = addMenu(menuEditContents); + act->setText( ScribusView::tr("Contents")); + } + //--> + + //<-- Add Properties + addSeparator(); + addAction(m_AP->scrActions["toolsProperties"]); + //--> +} + +void ContextMenu::createMenuItems_NoSelection(double mx, double my) +{ + int selectedItemCount=m_Sel.count(); + if (selectedItemCount!=0) + return; + + if (ScMimeData::clipboardHasScribusElem() || ScMimeData::clipboardHasScribusFragment() ) + { + m_doc->view()->dragX = mx; + m_doc->view()->dragY = my; + addAction( ScribusView::tr("&Paste") , m_doc->view(), SLOT(PasteToPage())); + } + if (m_AP->scrRecentPasteActions.count()>0) + { + QMenu* menuPasteRecent = new QMenu(this); + QAction *act = addMenu(menuPasteRecent); + act->setText( ScribusView::tr("Paste Recent")); + + QMap<QString, QPointer<ScrAction> > scrRecentPasteActions; + ScrAction *recentPasteAction; + foreach (recentPasteAction, m_AP->scrRecentPasteActions) + menuPasteRecent->addAction(recentPasteAction); + addSeparator(); + } + QAction *act = addAction( tr("Paste File...")); + connect(act, SIGNAL(triggered()), dynamic_cast<QObject*>(m_doc->view()->m_canvasMode), SLOT(importToPage())); + addSeparator(); + + addAction(m_AP->scrActions["editUndoAction"]); + addAction(m_AP->scrActions["editRedoAction"]); + addSeparator(); + addAction(m_AP->scrActions["viewShowMargins"]); + addAction(m_AP->scrActions["viewShowFrames"]); + addAction(m_AP->scrActions["viewShowLayerMarkers"]); + addAction(m_AP->scrActions["viewShowImages"]); + addAction(m_AP->scrActions["viewShowGrid"]); + addAction(m_AP->scrActions["viewShowGuides"]); + addAction(m_AP->scrActions["viewShowColumnBorders"]); + addAction(m_AP->scrActions["viewShowBaseline"]); + addAction(m_AP->scrActions["viewShowTextChain"]); + addAction(m_AP->scrActions["viewShowRulers"]); + addAction(m_AP->scrActions["viewRulerMode"]); + addSeparator(); + addAction(m_AP->scrActions["viewSnapToGrid"]); + addAction(m_AP->scrActions["viewSnapToGuides"]); + + onAPage = (m_doc->OnPage(mx, my) != -1); + if (onAPage) + { + addSeparator(); + addAction(m_AP->scrActions["pageApplyMasterPage"]); + addAction(m_AP->scrActions["pageManageGuides"]); + addAction(m_AP->scrActions["pageManageMargins"]); + if (m_AP->scrActions["pageDelete"]->isEnabled()) + { + addSeparator(); + pageDeletePrimaryString=m_AP->scrActions["pageDelete"]->text(); + m_AP->scrActions["pageDelete"]->setText(tr("Delete Page")); + addAction(m_AP->scrActions["pageDelete"]); + } + } +} + +ContextMenu::~ContextMenu() +{ + if (onAPage && m_AP->scrActions["pageDelete"]->isEnabled()) + m_AP->scrActions["pageDelete"]->setText(pageDeletePrimaryString); +} |
