Warning, file /office/calligra/libs/pageapp/KoPADocumentStructureDocker.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* This file is part of the KDE project 0002 * Copyright (C) 2006-2007 Jan Hambrecht <jaham@gmx.net> 0003 * Copyright (C) 2008-2009 Fredy Yanardi <fyanardi@gmail.com> 0004 * Copyright (C) 2009 Jean-Nicolas Artaud <jeannicolasartaud@gmail.com> 0005 * 0006 * This library is free software; you can redistribute it and/or 0007 * modify it under the terms of the GNU Library General Public 0008 * License as published by the Free Software Foundation; either 0009 * version 2 of the License, or (at your option) any later version. 0010 * 0011 * This library is distributed in the hope that it will be useful, 0012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0014 * Library General Public License for more details. 0015 * 0016 * You should have received a copy of the GNU Library General Public License 0017 * along with this library; see the file COPYING.LIB. If not, write to 0018 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0019 * Boston, MA 02110-1301, USA. 0020 */ 0021 0022 #include "KoPADocumentStructureDocker.h" 0023 0024 #include "KoPADocumentModel.h" 0025 #include "KoPADocument.h" 0026 #include "KoPAPageBase.h" 0027 #include "KoPACanvas.h" 0028 #include "KoPAViewBase.h" 0029 0030 #include <KoShapeManager.h> 0031 #include <KoToolManager.h> 0032 #include <KoCanvasBase.h> 0033 #include <KoCanvasController.h> 0034 #include <KoSelection.h> 0035 #include <KoShapeOdfSaveHelper.h> 0036 #include <KoPAOdfPageSaveHelper.h> 0037 #include <KoDrag.h> 0038 #include <KoShapeCreateCommand.h> 0039 #include <KoShapeDeleteCommand.h> 0040 #include <KoShapeReorderCommand.h> 0041 #include <KoShapeLayer.h> 0042 #include <KoShapePaste.h> 0043 #include <KoViewItemContextBar.h> 0044 0045 #include <KoIcon.h> 0046 0047 #include <KSharedConfig> 0048 #include <klocalizedstring.h> 0049 #include <kmessagebox.h> 0050 #include <kconfiggroup.h> 0051 0052 #include <QMimeData> 0053 #include <QMenu> 0054 #include <QInputDialog> 0055 #include <QGridLayout> 0056 #include <QToolButton> 0057 #include <QButtonGroup> 0058 #include <QItemSelection> 0059 #include <QApplication> 0060 #include <QClipboard> 0061 0062 #include <algorithm> 0063 0064 enum ButtonIds 0065 { 0066 Button_Raise, 0067 Button_Lower, 0068 Button_Delete 0069 }; 0070 0071 KoPADocumentStructureDockerFactory::KoPADocumentStructureDockerFactory(KoDocumentSectionView::DisplayMode mode, KoPageApp::PageType pageType) 0072 : m_mode(mode) 0073 , m_pageType(pageType) 0074 { 0075 } 0076 0077 QString KoPADocumentStructureDockerFactory::id() const 0078 { 0079 return QString("document section view"); 0080 } 0081 0082 QDockWidget* KoPADocumentStructureDockerFactory::createDockWidget() 0083 { 0084 return new KoPADocumentStructureDocker(m_mode, m_pageType); 0085 } 0086 0087 KoPADocumentStructureDocker::KoPADocumentStructureDocker(KoDocumentSectionView::DisplayMode mode, KoPageApp::PageType pageType, QWidget* parent) 0088 : QDockWidget(parent) 0089 , KoCanvasObserverBase() 0090 , m_doc(0) 0091 , m_model(0) 0092 { 0093 setWindowTitle(i18n("Document")); 0094 0095 QWidget *mainWidget = new QWidget(this); 0096 QGridLayout* layout = new QGridLayout(mainWidget); 0097 layout->addWidget(m_sectionView = new KoDocumentSectionView(mainWidget), 0, 0, 1, -1); 0098 0099 QToolButton *button = new QToolButton(mainWidget); 0100 button->setIcon(koIcon("list-add")); 0101 if (pageType == KoPageApp::Slide) { 0102 button->setToolTip(i18n("Add a new slide or layer")); 0103 } 0104 else { 0105 button->setToolTip(i18n("Add a new page or layer")); 0106 } 0107 layout->addWidget(button, 1, 0); 0108 0109 QMenu *menu = new QMenu(button); 0110 button->setMenu(menu); 0111 button->setPopupMode(QToolButton::InstantPopup); 0112 menu->addAction(koIcon("document-new"), 0113 (pageType == KoPageApp::Slide) ? i18n("Slide") : i18n("Page"), 0114 this, SLOT(addPage())); 0115 m_addLayerAction = menu->addAction(koIcon("layer-new"), i18n("Layer"), this, SLOT(addLayer())); 0116 0117 m_buttonGroup = new QButtonGroup(mainWidget); 0118 m_buttonGroup->setExclusive(false); 0119 0120 button = new QToolButton(mainWidget); 0121 button->setIcon(koIcon("list-remove")); 0122 button->setToolTip(i18n("Delete selected objects")); 0123 m_buttonGroup->addButton(button, Button_Delete); 0124 layout->addWidget(button, 1, 1); 0125 0126 button = new QToolButton(mainWidget); 0127 button->setIcon(koIcon("arrow-up")); 0128 button->setToolTip(i18n("Raise selected objects")); 0129 m_buttonGroup->addButton(button, Button_Raise); 0130 layout->addWidget(button, 1, 3); 0131 0132 button = new QToolButton(mainWidget); 0133 button->setIcon(koIcon("arrow-down")); 0134 button->setToolTip(i18n("Lower selected objects")); 0135 m_buttonGroup->addButton(button, Button_Lower); 0136 layout->addWidget(button, 1, 4); 0137 0138 button = new QToolButton(mainWidget); 0139 menu = new QMenu(this); 0140 QActionGroup *group = new QActionGroup(this); 0141 0142 m_viewModeActions.insert(KoDocumentSectionView::MinimalMode, 0143 menu->addAction(koIcon("view-list-text"), i18n("Minimal View"), this, SLOT(minimalView()))); 0144 m_viewModeActions.insert(KoDocumentSectionView::DetailedMode, 0145 menu->addAction(koIcon("view-list-details"), i18n("Detailed View"), this, SLOT(detailedView()))); 0146 m_viewModeActions.insert(KoDocumentSectionView::ThumbnailMode, 0147 menu->addAction(koIcon("view-preview"), i18n("Thumbnail View"), this, SLOT(thumbnailView()))); 0148 0149 foreach (QAction* action, m_viewModeActions) { 0150 action->setCheckable(true); 0151 action->setActionGroup(group); 0152 } 0153 0154 button->setMenu(menu); 0155 button->setPopupMode(QToolButton::InstantPopup); 0156 button->setIcon(koIcon("view-choose")); 0157 button->setText(i18n("View mode")); 0158 layout->addWidget(button, 1, 5); 0159 0160 layout->setSpacing(0); 0161 layout->setMargin(3); 0162 layout->setColumnStretch(2, 10); 0163 0164 setWidget(mainWidget); 0165 0166 connect(m_buttonGroup, SIGNAL(buttonClicked(int)), this, SLOT(slotButtonClicked(int))); 0167 0168 m_model = new KoPADocumentModel(this); 0169 m_sectionView->setModel(m_model); 0170 m_sectionView->setSelectionBehavior(QAbstractItemView::SelectRows); 0171 m_sectionView->setSelectionMode(QAbstractItemView::ExtendedSelection); 0172 m_sectionView->setDragDropMode(QAbstractItemView::InternalMove); 0173 0174 connect(m_sectionView, SIGNAL(pressed(QModelIndex)), this, SLOT(itemClicked(QModelIndex))); 0175 connect(m_sectionView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), 0176 this, SLOT(itemSelected(QItemSelection,QItemSelection))); 0177 0178 connect(m_model, SIGNAL(requestPageSelection(int,int)), this, SLOT(selectPages(int,int))); 0179 connect(m_model, SIGNAL(modelReset()), this, SIGNAL(dockerReset())); 0180 0181 KConfigGroup configGroup = KSharedConfig::openConfig()->group("KoPageApp/DocumentStructureDocker"); 0182 QString viewModeString = configGroup.readEntry("ViewMode", ""); 0183 0184 if (viewModeString.isEmpty()) 0185 setViewMode(mode); 0186 else 0187 setViewMode(viewModeFromString(viewModeString)); 0188 0189 m_itemsContextBar = new KoViewItemContextBar(m_sectionView); 0190 } 0191 0192 KoPADocumentStructureDocker::~KoPADocumentStructureDocker() 0193 { 0194 KConfigGroup configGroup = KSharedConfig::openConfig()->group("KoPageApp/DocumentStructureDocker"); 0195 configGroup.writeEntry("ViewMode", viewModeToString(m_sectionView->displayMode())); 0196 } 0197 0198 void KoPADocumentStructureDocker::updateView() 0199 { 0200 m_model->update(); 0201 } 0202 0203 void KoPADocumentStructureDocker::slotButtonClicked(int buttonId) 0204 { 0205 switch (buttonId) 0206 { 0207 case Button_Raise: 0208 raiseItem(); 0209 break; 0210 case Button_Lower: 0211 lowerItem(); 0212 break; 0213 case Button_Delete: 0214 deleteItem(); 0215 break; 0216 } 0217 } 0218 0219 void KoPADocumentStructureDocker::itemClicked(const QModelIndex &index) 0220 { 0221 Q_ASSERT(index.internalPointer()); 0222 0223 if (!index.isValid()) 0224 return; 0225 0226 KoShape *shape = static_cast<KoShape*>(index.internalPointer()); 0227 if (!shape) 0228 return; 0229 // check whether the newly selected shape is a page or shape/layer 0230 bool isPage = (dynamic_cast<KoPAPageBase *>(shape) != 0); 0231 KoCanvasController* canvasController = KoToolManager::instance()->activeCanvasController(); 0232 KoSelection *selection = canvasController->canvas()->shapeManager()->selection(); 0233 0234 if (isPage) { 0235 // no shape is currently selected 0236 if (!m_selectedShapes.isEmpty()) { 0237 m_sectionView->clearSelection(); 0238 selection->deselectAll(); 0239 m_sectionView->setCurrentIndex(index); 0240 m_selectedShapes.clear(); 0241 emit pageChanged(dynamic_cast<KoPAPageBase *>(shape)); 0242 } 0243 else { 0244 // There are more than one page selected 0245 if (m_sectionView->selectionModel()->selectedIndexes().size() == 1) { 0246 emit pageChanged(dynamic_cast<KoPAPageBase *>(shape)); 0247 } 0248 } 0249 } 0250 else { 0251 KoPAPageBase *newPageByShape = m_doc->pageByShape(shape); 0252 // there is already shape(s) selected 0253 if (!m_selectedShapes.isEmpty()) { 0254 // if the newly selected shape is not in the same page as previously 0255 // selected shape(s), then clear previous selection 0256 KoPAPageBase *currentPage = m_doc->pageByShape(m_selectedShapes.first()); 0257 KoShapeLayer *layer = dynamic_cast<KoShapeLayer *>(shape); 0258 if (currentPage != newPageByShape) { 0259 m_sectionView->clearSelection(); 0260 selection->deselectAll(); 0261 m_sectionView->setCurrentIndex(index); 0262 m_selectedShapes.clear(); 0263 emit pageChanged(newPageByShape); 0264 if (layer) { 0265 selection->setActiveLayer(layer); 0266 } 0267 else { 0268 selection->select(shape); 0269 shape->update(); 0270 } 0271 } 0272 else { 0273 QList<KoPAPageBase*> selectedPages; 0274 QList<KoShapeLayer*> selectedLayers; 0275 QList<KoShape*> selectedShapes; 0276 0277 // separate selected layers and selected shapes 0278 extractSelectedLayersAndShapes(selectedPages, selectedLayers, selectedShapes); 0279 0280 // XXX: Do stuff withthe selected pages! 0281 0282 foreach (KoShape* shape, selection->selectedShapes()) { 0283 shape->update(); 0284 } 0285 selection->deselectAll(); 0286 foreach (KoShape* shape, selectedShapes) { 0287 if (shape) { 0288 selection->select(shape); 0289 shape->update(); 0290 } 0291 } 0292 // if we just selected a layer, check whether this layer is already active, if not 0293 // then make it active 0294 if (layer && selection->activeLayer() != layer && selectedLayers.count() <= 1) { 0295 selection->setActiveLayer(layer); 0296 } 0297 } 0298 } 0299 // no shape is selected, meaning only page(s) is selected 0300 else { 0301 m_sectionView->clearSelection(); 0302 m_sectionView->setCurrentIndex(index); 0303 selection->select(shape); 0304 shape->update(); 0305 emit pageChanged(newPageByShape); 0306 } 0307 m_selectedShapes.append(shape); 0308 } 0309 } 0310 0311 void KoPADocumentStructureDocker::addLayer() 0312 { 0313 bool ok = true; 0314 QString name = QInputDialog::getText(this, i18n("New Layer"), i18n("Enter the name of the new layer:"), 0315 QLineEdit::Normal, i18n("New layer"), &ok); 0316 if (ok) { 0317 KoShapeLayer* layer = new KoShapeLayer(); 0318 KoPACanvas * canvas = dynamic_cast<KoPACanvas *>(KoToolManager::instance()->activeCanvasController()->canvas()); 0319 if (canvas) { 0320 layer->setParent(canvas->koPAView()->activePage()); 0321 layer->setName(name); 0322 QList<KoShape*> layers(canvas->koPAView()->activePage()->shapes()); 0323 if (!layers.isEmpty()) { 0324 std::sort(layers.begin(), layers.end(), KoShape::compareShapeZIndex); 0325 layer->setZIndex(layers.last()->zIndex() + 1); 0326 } 0327 KUndo2Command *cmd = new KoShapeCreateCommand(m_doc, layer, 0); 0328 cmd->setText(kundo2_i18n("Create Layer")); 0329 m_doc->addCommand(cmd); 0330 m_model->update(); 0331 } 0332 } 0333 } 0334 0335 void KoPADocumentStructureDocker::deleteItem() 0336 { 0337 QList<KoPAPageBase*> selectedPages; 0338 QList<KoShapeLayer*> selectedLayers; 0339 QList<KoShape*> selectedShapes; 0340 0341 // separate selected layers and selected shapes 0342 extractSelectedLayersAndShapes(selectedPages, selectedLayers, selectedShapes); 0343 0344 KUndo2Command *cmd = 0; 0345 0346 if (selectedLayers.count()) { 0347 if (m_doc->pages().count() > selectedPages.count()) { 0348 QList<KoShape*> deleteShapes; 0349 foreach(KoPAPageBase* page, selectedPages) { 0350 deleteShapes += page->shapes(); 0351 deleteShapes.append(page); 0352 } 0353 cmd = new KoShapeDeleteCommand(m_doc, deleteShapes); 0354 cmd->setText(kundo2_i18n("Delete Layer")); 0355 } 0356 else { 0357 KMessageBox::error(0, i18n("Could not delete all layers. At least one layer is required."), i18n("Error deleting layers")); 0358 } 0359 } 0360 else if (selectedShapes.count()) { 0361 cmd = new KoShapeDeleteCommand(m_doc, selectedShapes); 0362 } 0363 else if (!selectedPages.isEmpty() && selectedPages.count() < m_doc->pages().count()) { 0364 m_doc->removePages(selectedPages); 0365 } 0366 0367 if (cmd) { 0368 m_doc->addCommand(cmd); 0369 m_model->update(); 0370 } 0371 } 0372 0373 void KoPADocumentStructureDocker::raiseItem() 0374 { 0375 QList<KoPAPageBase*> selectedPages; 0376 QList<KoShapeLayer*> selectedLayers; 0377 QList<KoShape*> selectedShapes; 0378 0379 // separate selected layers and selected shapes 0380 extractSelectedLayersAndShapes(selectedPages, selectedLayers, selectedShapes); 0381 0382 KUndo2Command *cmd = 0; 0383 0384 if (selectedLayers.count()) { 0385 // // check if all layers could be raised 0386 // foreach(KoShapeLayer* layer, selectedLayers) 0387 // if (! m_document->canRaiseLayer(layer)) 0388 // return; 0389 0390 // cmd = new KoPALayerReorderCommand(m_document, selectedLayers, KoPALayerReorderCommand::RaiseLayer); 0391 } 0392 else if (selectedShapes.count()) { 0393 cmd = KoShapeReorderCommand::createCommand(selectedShapes, 0394 KoToolManager::instance()->activeCanvasController()->canvas()->shapeManager(), 0395 KoShapeReorderCommand::RaiseShape); 0396 } 0397 0398 if (cmd) { 0399 m_doc->addCommand(cmd); 0400 m_model->update(); 0401 } 0402 } 0403 0404 void KoPADocumentStructureDocker::lowerItem() 0405 { 0406 QList<KoPAPageBase*> selectedPages; 0407 QList<KoShapeLayer*> selectedLayers; 0408 QList<KoShape*> selectedShapes; 0409 0410 // separate selected layers and selected shapes 0411 extractSelectedLayersAndShapes(selectedPages, selectedLayers, selectedShapes); 0412 0413 KUndo2Command *cmd = 0; 0414 0415 if (selectedLayers.count()) { 0416 // // check if all layers could be raised 0417 // foreach(KoShapeLayer* layer, selectedLayers) 0418 // if (! m_document->canLowerLayer(layer)) 0419 // return; 0420 0421 // cmd = new KoPALayerReorderCommand(m_document, selectedLayers, KoPALayerReorderCommand::LowerLayer); 0422 } 0423 else if (selectedShapes.count()) { 0424 cmd = KoShapeReorderCommand::createCommand(selectedShapes, 0425 KoToolManager::instance()->activeCanvasController()->canvas()->shapeManager(), 0426 KoShapeReorderCommand::LowerShape); 0427 } 0428 0429 if (cmd) { 0430 m_doc->addCommand(cmd); 0431 m_model->update(); 0432 } 0433 } 0434 0435 void KoPADocumentStructureDocker::extractSelectedLayersAndShapes(QList<KoPAPageBase*> &pages, QList<KoShapeLayer*> &layers, QList<KoShape*> &shapes) 0436 { 0437 pages.clear(); 0438 layers.clear(); 0439 shapes.clear(); 0440 0441 QModelIndexList selectedItems = m_sectionView->selectionModel()->selectedIndexes(); 0442 if (selectedItems.count() == 0) 0443 return; 0444 0445 // TODO tz: I don't know what is best: 0446 // 1. only make it possible to select one type of object page, layer, shape 0447 // 2. don't add shapes when we already have the page/layer/group in the selection 0448 // separate selected layers and selected shapes 0449 foreach(const QModelIndex & index, selectedItems) { 0450 KoShape *shape = static_cast<KoShape*>(index.internalPointer()); 0451 KoPAPageBase * page = dynamic_cast<KoPAPageBase*>(shape); 0452 if (page) { 0453 pages.append(page); 0454 } 0455 else { 0456 KoShapeLayer *layer = dynamic_cast<KoShapeLayer*>(shape); 0457 if (layer) 0458 layers.append(layer); 0459 else if (! selectedItems.contains(index.parent())) 0460 shapes.append(shape); 0461 } 0462 } 0463 } 0464 0465 void KoPADocumentStructureDocker::setCanvas(KoCanvasBase* canvas) 0466 { 0467 KoPACanvas * c = dynamic_cast<KoPACanvas*> (canvas); 0468 if (c) { 0469 m_doc = c->document(); 0470 m_model->setDocument(m_doc); 0471 m_sectionView->setModel(m_model); 0472 } 0473 } 0474 0475 void KoPADocumentStructureDocker::unsetCanvas() 0476 { 0477 m_doc = 0; 0478 m_model->setDocument(0); 0479 m_sectionView->setModel(0); 0480 } 0481 0482 void KoPADocumentStructureDocker::setActivePage(KoPAPageBase *page) 0483 { 0484 if (m_doc) { 0485 int row = m_doc->pageIndex(page); 0486 QModelIndex index = m_model->index(row, 0); 0487 if (index != m_sectionView->currentIndex() 0488 && index != getRootIndex(m_sectionView->currentIndex())) { 0489 m_sectionView->setCurrentIndex(index); 0490 } 0491 } 0492 } 0493 0494 void KoPADocumentStructureDocker::setMasterMode(bool master) 0495 { 0496 m_model->setMasterMode(master); 0497 } 0498 0499 void KoPADocumentStructureDocker::minimalView() 0500 { 0501 setViewMode(KoDocumentSectionView::MinimalMode); 0502 m_itemsContextBar->disableContextBar(); 0503 } 0504 0505 void KoPADocumentStructureDocker::detailedView() 0506 { 0507 setViewMode(KoDocumentSectionView::DetailedMode); 0508 m_itemsContextBar->disableContextBar(); 0509 } 0510 0511 void KoPADocumentStructureDocker::thumbnailView() 0512 { 0513 setViewMode(KoDocumentSectionView::ThumbnailMode); 0514 m_itemsContextBar->enableContextBar(); 0515 } 0516 0517 void KoPADocumentStructureDocker::setViewMode(KoDocumentSectionView::DisplayMode mode) 0518 { 0519 bool expandable = (mode != KoDocumentSectionView::ThumbnailMode); 0520 0521 // if we switch to non-expandable mode (ThumbnailMode) and if current index 0522 // is not a page, we need to select the corresponding page first, otherwise 0523 // none of the page will be selected when we do collapse all 0524 if (!expandable) { 0525 QModelIndex currentIndex = m_sectionView->currentIndex(); 0526 QModelIndex rootIndex = getRootIndex(currentIndex); 0527 if (currentIndex != rootIndex) { 0528 m_sectionView->setCurrentIndex(rootIndex); 0529 } 0530 m_sectionView->collapseAll(); 0531 } 0532 0533 m_sectionView->setDisplayMode(mode); 0534 m_sectionView->setItemsExpandable(expandable); 0535 m_sectionView->setRootIsDecorated(expandable); 0536 // m_sectionView->setSelectionMode(expandable ? QAbstractItemView::ExtendedSelection : QAbstractItemView::SingleSelection); 0537 0538 m_viewModeActions[mode]->setChecked (true); 0539 } 0540 0541 QModelIndex KoPADocumentStructureDocker::getRootIndex(const QModelIndex &index) const 0542 { 0543 QModelIndex currentIndex; 0544 QModelIndex parentIndex = index.parent(); 0545 if (!parentIndex.isValid()) { 0546 return index; 0547 } 0548 while (parentIndex.isValid()) { 0549 currentIndex = parentIndex; 0550 parentIndex = currentIndex.parent(); 0551 } 0552 0553 return currentIndex; 0554 } 0555 0556 KoDocumentSectionView::DisplayMode KoPADocumentStructureDocker::viewModeFromString(const QString& mode) 0557 { 0558 if (mode == "Minimal") 0559 return KoDocumentSectionView::MinimalMode; 0560 else if (mode == "Detailed") 0561 return KoDocumentSectionView::DetailedMode; 0562 else if (mode == "Thumbnail") 0563 return KoDocumentSectionView::ThumbnailMode; 0564 0565 return KoDocumentSectionView::DetailedMode; 0566 } 0567 0568 QString KoPADocumentStructureDocker::viewModeToString(KoDocumentSectionView::DisplayMode mode) 0569 { 0570 switch (mode) 0571 { 0572 case KoDocumentSectionView::MinimalMode: 0573 return QString("Minimal"); 0574 break; 0575 case KoDocumentSectionView::DetailedMode: 0576 return QString("Detailed"); 0577 break; 0578 case KoDocumentSectionView::ThumbnailMode: 0579 return QString("Thumbnail"); 0580 break; 0581 } 0582 0583 return QString(); 0584 } 0585 0586 void KoPADocumentStructureDocker::itemSelected(const QItemSelection& selected, const QItemSelection& deselected) 0587 { 0588 Q_UNUSED(deselected); 0589 0590 if (selected.indexes().isEmpty()) { 0591 m_buttonGroup->button(Button_Raise)->setEnabled(false); 0592 m_buttonGroup->button(Button_Lower)->setEnabled(false); 0593 m_addLayerAction->setEnabled(false); 0594 } 0595 else { 0596 m_buttonGroup->button(Button_Raise)->setEnabled(true); 0597 m_buttonGroup->button(Button_Lower)->setEnabled(true); 0598 m_addLayerAction->setEnabled(true); 0599 } 0600 0601 if (!m_sectionView->selectionModel()->selectedIndexes().empty() && 0602 m_sectionView->selectionModel()->selectedIndexes().count() < m_doc->pages().count()) { 0603 m_buttonGroup->button(Button_Delete)->setEnabled(true); 0604 } 0605 else { 0606 m_buttonGroup->button(Button_Delete)->setEnabled(false); 0607 } 0608 } 0609 0610 void KoPADocumentStructureDocker::addPage() 0611 { 0612 KoPACanvas * canvas = dynamic_cast<KoPACanvas *>(KoToolManager::instance()->activeCanvasController()->canvas()); 0613 if (canvas) { 0614 canvas->koPAView()->insertPage(); 0615 } 0616 } 0617 0618 void KoPADocumentStructureDocker::contextMenuEvent(QContextMenuEvent* event) 0619 { 0620 QMenu menu(this); 0621 0622 // Not connected yet 0623 if (m_doc->pageType() == KoPageApp::Slide) { 0624 menu.addAction(koIcon("document-new"), i18n("Add a new slide"), this, SLOT(addPage())); 0625 } 0626 else { 0627 menu.addAction(koIcon("document-new"), i18n("Add a new page"), this, SLOT(addPage())); 0628 } 0629 menu.addAction(koIcon("edit-delete"), i18n("Delete selected objects"), this, SLOT(deleteItem())); 0630 menu.addSeparator(); 0631 menu.addAction(koIcon("edit-cut"), i18n("Cut"), this, SLOT(editCut())); 0632 menu.addAction(koIcon("edit-copy"), i18n("Copy"), this, SLOT(editCopy())); 0633 menu.addAction(koIcon("edit-paste"), i18n("Paste"), this, SLOT(editPaste())); 0634 0635 menu.exec(event->globalPos()); 0636 } 0637 0638 void KoPADocumentStructureDocker::editCut() 0639 { 0640 editCopy(); 0641 deleteItem(); 0642 } 0643 0644 void KoPADocumentStructureDocker::editCopy() 0645 { 0646 QList<KoPAPageBase*> pages; 0647 QList<KoShapeLayer*> layers; 0648 QList<KoShape*> shapes; 0649 0650 // separate selected layers and selected shapes 0651 extractSelectedLayersAndShapes(pages, layers, shapes); 0652 0653 foreach (KoShape* shape, layers) { 0654 // Add layers to shapes 0655 shapes.append(shape); 0656 } 0657 0658 if (!shapes.empty()) { 0659 // Copy Shapes or Layers 0660 KoShapeOdfSaveHelper saveHelper(shapes); 0661 KoDrag drag; 0662 drag.setOdf(KoOdf::mimeType(KoOdf::Text), saveHelper); 0663 drag.addToClipboard(); 0664 return; 0665 } 0666 0667 if (!pages.empty()) { 0668 // Copy Pages 0669 KoPAOdfPageSaveHelper saveHelper(m_doc, pages); 0670 KoDrag drag; 0671 drag.setOdf(KoOdf::mimeType(m_doc->documentType()), saveHelper); 0672 drag.addToClipboard(); 0673 } 0674 } 0675 0676 void KoPADocumentStructureDocker::editPaste() 0677 { 0678 const QMimeData * data = QApplication::clipboard()->mimeData(); 0679 0680 if (data->hasFormat(KoOdf::mimeType(KoOdf::Text))) { 0681 // Paste Shapes or Layers 0682 KoCanvasBase* canvas = KoToolManager::instance()->activeCanvasController()->canvas(); 0683 KoShapeManager * shapeManager = canvas->shapeManager(); 0684 KoShapePaste paste(canvas, shapeManager->selection()->activeLayer()); 0685 paste.paste(KoOdf::Text, data); 0686 0687 } 0688 else { 0689 // Paste Pages 0690 KoPACanvas * canvas = static_cast<KoPACanvas *>(KoToolManager::instance()->activeCanvasController()->canvas()); 0691 canvas->koPAView()->pagePaste(); 0692 } 0693 } 0694 0695 void KoPADocumentStructureDocker::selectPages(int start, int count) 0696 { 0697 if ((start < 0) || (count < 1)) { 0698 return; 0699 } 0700 emit pageChanged(m_doc->pageByIndex(start, false)); 0701 m_sectionView->clearSelection(); 0702 for (int i = start; i < (start + count); i++) { 0703 QModelIndex index = m_model->index(i, 0, QModelIndex()); 0704 if (index.isValid()) { 0705 m_sectionView->selectionModel()->select(index, QItemSelectionModel::Select); 0706 } 0707 } 0708 } 0709 0710 // kate: replace-tabs on; space-indent on; indent-width 4; mixedindent off; indent-mode cstyle;