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;