diff --git a/src/board/UBBoardPaletteManager.cpp b/src/board/UBBoardPaletteManager.cpp
index 54fe2a33718cc4917cd10318853b758e2cd3e8da..2025076a377db47a806016fdd786d97e842767f1 100644
--- a/src/board/UBBoardPaletteManager.cpp
+++ b/src/board/UBBoardPaletteManager.cpp
@@ -1,996 +1,1019 @@
-/*
- * 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 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "UBBoardPaletteManager.h"
-
-#include "frameworks/UBPlatformUtils.h"
-#include "frameworks/UBFileSystemUtils.h"
-
-#include "core/UBApplication.h"
-#include "core/UBApplicationController.h"
-#include "core/UBSettings.h"
-#include "core/UBSetting.h"
-#include "core/UBDisplayManager.h"
-
-#include "gui/UBMainWindow.h"
-#include "gui/UBStylusPalette.h"
-#include "gui/UBKeyboardPalette.h"
-#include "gui/UBToolWidget.h"
-#include "gui/UBZoomPalette.h"
-#include "gui/UBActionPalette.h"
-#include "gui/UBFavoriteToolPalette.h"
-
-
-#include "web/UBWebPage.h"
-#include "web/UBWebController.h"
-#include "web/browser/WBBrowserWindow.h"
-#include "web/browser/WBTabWidget.h"
-#include "web/browser/WBWebView.h"
-
-#include "desktop/UBDesktopAnnotationController.h"
-
-
-#include "network/UBNetworkAccessManager.h"
-#include "network/UBServerXMLHttpRequest.h"
-
-#include "domain/UBGraphicsScene.h"
-#include "domain/UBAbstractWidget.h"
-#include "domain/UBGraphicsPixmapItem.h"
-
-#include "document/UBDocumentProxy.h"
-#include "podcast/UBPodcastController.h"
-#include "board/UBDrawingController.h"
-
-#include "tools/UBToolsManager.h"
-
-#include "UBBoardController.h"
-
-#include "core/memcheck.h"
-
-UBBoardPaletteManager::UBBoardPaletteManager(QWidget* container, UBBoardController* pBoardController)
-    : QObject(container)
-    , mKeyboardPalette(0)
-    , mContainer(container)
-    , mBoardControler(pBoardController)
-    , mStylusPalette(0)
-    , mZoomPalette(0)
-    , mLeftPalette(NULL)
-    , mRightPalette(NULL)
-    , mBackgroundsPalette(0)
-    , mToolsPalette(0)
-    , mAddItemPalette(0)
-    , mErasePalette(NULL)
-    , mPagePalette(NULL)
-    , mPendingPageButtonPressed(false)
-    , mPendingZoomButtonPressed(false)
-    , mPendingPanButtonPressed(false)
-    , mPendingEraseButtonPressed(false)
-    , mpPageNavigWidget(NULL)
-    , mpLibWidget(NULL)
-    , mpCachePropWidget(NULL)
-    , mpTeacherBarWidget(NULL)
-    , mpDownloadWidget(NULL)
-    , mpDesktopLibWidget(NULL)
-    , mDownloadInProgress(false)
-{
-    setupPalettes();
-    connectPalettes();
-}
-
-
-UBBoardPaletteManager::~UBBoardPaletteManager()
-{
-    delete mAddItemPalette;
-
-
-    if(NULL != mStylusPalette)
-    {
-        delete mStylusPalette;
-        mStylusPalette = NULL;
-    }
-
-    if(NULL != mpDesktopLibWidget)
-    {
-        delete mpDesktopLibWidget;
-        mpDesktopLibWidget = NULL;
-    }
-//     if(NULL != mDesktopRightPalette)
-//     {
-//         delete mDesktopRightPalette;
-//         mDesktopRightPalette = NULL;
-//     }
-}
-
-void UBBoardPaletteManager::initPalettesPosAtStartup()
-{
-    mStylusPalette->initPosition();
-}
-
-void UBBoardPaletteManager::setupLayout()
-{
-
-}
-
-/**
- * \brief Set up the dock palette widgets
- */
-void UBBoardPaletteManager::setupDockPaletteWidgets()
-{
-
-    //------------------------------------------------//
-    // Create the widgets for the dock palettes
-
-    mpPageNavigWidget = new UBPageNavigationWidget();
-//    connect(this, SIGNAL(signal_changeMode(eUBDockPaletteWidgetMode)), mpPageNavigWidget, SLOT(slot_changeMode(eUBDockPaletteWidgetMode)));
-
-    mpLibWidget = new UBLibWidget();
-//    connect(this, SIGNAL(signal_changeMode(eUBDockPaletteWidgetMode)), mpLibWidget, SLOT(slot_changeMode(eUBDockPaletteWidgetMode)));
-
-    mpCachePropWidget = new UBCachePropertiesWidget();
-//    connect(this, SIGNAL(signal_changeMode(eUBDockPaletteWidgetMode)), mpCachePropWidget, SLOT(slot_changeMode(eUBDockPaletteWidgetMode)));
-
-    mpTeacherBarWidget = new UBTeacherBarWidget();
-//    connect(this, SIGNAL(signal_changeMode(eUBDockPaletteWidgetMode)), mpTeacherBarWidget, SLOT(slot_changeMode(eUBDockPaletteWidgetMode)));
-
-    mpDownloadWidget = new UBDockDownloadWidget();
-
-    // Add the dock palettes
-    mLeftPalette = new UBLeftPalette(mContainer);
-
-    // LEFT palette widgets
-    mLeftPalette->registerWidget(mpPageNavigWidget);
-    mLeftPalette->addTab(mpPageNavigWidget);
-
-    // The teacher bar widget will always be there
-    mLeftPalette->registerWidget(mpTeacherBarWidget);
-    mLeftPalette->addTab(mpTeacherBarWidget);
-
-    mLeftPalette->connectSignals();
-
-    mRightPalette = new UBRightPalette(mContainer);
-    // RIGHT palette widgets
-    mRightPalette->registerWidget(mpLibWidget);
-    mRightPalette->addTab(mpLibWidget);
-    // The cache widget will be visible only if a cache is put on the page
-    mRightPalette->registerWidget(mpCachePropWidget);
-
-    //  The download widget will be part of the right palette but
-    //  will become visible only when the first download starts
-    mRightPalette->registerWidget(mpDownloadWidget);
-    mRightPalette->connectSignals();
-    changeMode(eUBDockPaletteWidget_BOARD, true);
-
-    // Hide the tabs that must be hidden
-    mRightPalette->removeTab(mpDownloadWidget);
-    mRightPalette->removeTab(mpCachePropWidget);
-
-//     mLeftPalette->showTabWidget(0);
-//     mRightPalette->showTabWidget(0);
-// 
-//     //------------------------------------------------//
-}
-
-void UBBoardPaletteManager::slot_changeMainMode(UBApplicationController::MainMode mainMode)
-{
-//    Board = 0, Internet, Document, Tutorial, ParaschoolEditor, WebDocument
-
-    switch( mainMode )
-    {
-        case UBApplicationController::Board: 
-            {
-                // call changeMode only when switch NOT from desktop mode
-                if(!UBApplication::applicationController->isShowingDesktop())
-                    changeMode(eUBDockPaletteWidget_BOARD);
-            }
-            break;
-
-        case UBApplicationController::Tutorial:
-            {
-                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
-                    mKeyboardPalette->hide();
-            }
-            break;
-
-        case UBApplicationController::Internet:
-            changeMode(eUBDockPaletteWidget_WEB);
-            break;
-
-        case UBApplicationController::Document:
-            changeMode(eUBDockPaletteWidget_DOCUMENT);
-            break;
-
-        default:
-            {
-                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
-                    mKeyboardPalette->hide();
-            }
-            break;
-    }
-}
-
-void UBBoardPaletteManager::slot_changeDesktopMode(bool isDesktop)
-{
-    UBApplicationController::MainMode currMode = UBApplication::applicationController->displayMode();
-    if(!isDesktop) 
-    {
-        switch( currMode )
-        {
-            case UBApplicationController::Board:
-                changeMode(eUBDockPaletteWidget_BOARD);
-                break;
-
-            default:
-                break;
-        }
-    }
-    else
-        changeMode(eUBDockPaletteWidget_DESKTOP);
-}
-
-void UBBoardPaletteManager::setupPalettes()
-{
-
-    if (UBPlatformUtils::hasVirtualKeyboard())
-    {
-        mKeyboardPalette = new UBKeyboardPalette(0);
-#ifndef Q_WS_WIN
-        connect(mKeyboardPalette, SIGNAL(closed()), mKeyboardPalette, SLOT(onDeactivated()));
-#endif
-#ifndef Q_WS_MAC
-        //     mKeyboardPalette->setParent(mContainer);
-#endif
-    }
-
-    setupDockPaletteWidgets();
-
-
-    // Add the other palettes
-    mStylusPalette = new UBStylusPalette(mContainer, UBSettings::settings()->appToolBarOrientationVertical->get().toBool() ? Qt::Vertical : Qt::Horizontal);
-    connect(mStylusPalette, SIGNAL(stylusToolDoubleClicked(int)), UBApplication::boardController, SLOT(stylusToolDoubleClicked(int)));
-    mStylusPalette->show(); // always show stylus palette at startup
-
-    mZoomPalette = new UBZoomPalette(mContainer);
-
-    QList<QAction*> backgroundsActions;
-
-    backgroundsActions << UBApplication::mainWindow->actionPlainLightBackground;
-    backgroundsActions << UBApplication::mainWindow->actionCrossedLightBackground;
-    backgroundsActions << UBApplication::mainWindow->actionPlainDarkBackground;
-    backgroundsActions << UBApplication::mainWindow->actionCrossedDarkBackground;
-
-    mBackgroundsPalette = new UBActionPalette(backgroundsActions, Qt::Horizontal , mContainer);
-    mBackgroundsPalette->setButtonIconSize(QSize(128, 128));
-    mBackgroundsPalette->groupActions();
-    mBackgroundsPalette->setClosable(true);
-    mBackgroundsPalette->setAutoClose(true);
-    mBackgroundsPalette->adjustSizeAndPosition();
-    mBackgroundsPalette->hide();
-
-    QList<QAction*> addItemActions;
-
-    addItemActions << UBApplication::mainWindow->actionAddItemToCurrentPage;
-    addItemActions << UBApplication::mainWindow->actionAddItemToNewPage;
-    addItemActions << UBApplication::mainWindow->actionAddItemToLibrary;
-
-    mAddItemPalette = new UBActionPalette(addItemActions, Qt::Horizontal, 0);
-    mAddItemPalette->setButtonIconSize(QSize(128, 128));
-    mAddItemPalette->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
-    mAddItemPalette->groupActions();
-    mAddItemPalette->setClosable(true);
-    mAddItemPalette->adjustSizeAndPosition();
-    mAddItemPalette->hide();
-
-    QList<QAction*> eraseActions;
-
-    eraseActions << UBApplication::mainWindow->actionEraseAnnotations;
-    eraseActions << UBApplication::mainWindow->actionEraseItems;
-    eraseActions << UBApplication::mainWindow->actionClearPage;
-
-    mErasePalette = new UBActionPalette(eraseActions, Qt::Horizontal , mContainer);
-    mErasePalette->setButtonIconSize(QSize(128, 128));
-    mErasePalette->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
-    mErasePalette->groupActions();
-    mErasePalette->setClosable(true);
-    mErasePalette->adjustSizeAndPosition();
-    mErasePalette->hide();
-
-    QList<QAction*> pageActions;
-
-    pageActions << UBApplication::mainWindow->actionNewPage;
-    pageActions << UBApplication::mainWindow->actionDuplicatePage;
-    pageActions << UBApplication::mainWindow->actionImportPage;
-
-    mPagePalette = new UBActionPalette(pageActions, Qt::Horizontal , mContainer);
-    mPagePalette->setButtonIconSize(QSize(128, 128));
-    mPagePalette->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
-    mPagePalette->groupActions();
-    mPagePalette->setClosable(true);
-    mPagePalette->adjustSizeAndPosition();
-    mPagePalette->hide();
-
-    connect(UBSettings::settings()->appToolBarOrientationVertical, SIGNAL(changed(QVariant)), this, SLOT(changeStylusPaletteOrientation(QVariant)));
-}
-
-void UBBoardPaletteManager::pagePaletteButtonPressed()
-{
-    mPageButtonPressedTime = QTime::currentTime();
-
-    mPendingPageButtonPressed = true;
-    QTimer::singleShot(1000, this, SLOT(pagePaletteButtonReleased()));
-}
-
-
-void UBBoardPaletteManager::pagePaletteButtonReleased()
-{
-    if (mPendingPageButtonPressed)
-    {
-        if( mPageButtonPressedTime.msecsTo(QTime::currentTime()) > 900)
-        {
-            togglePagePalette(true);
-        }
-        else
-        {
-            UBApplication::mainWindow->actionNewPage->trigger();
-        }
-
-        mPendingPageButtonPressed = false;
-    }
-}
-
-void UBBoardPaletteManager::erasePaletteButtonPressed()
-{
-    mEraseButtonPressedTime = QTime::currentTime();
-
-    mPendingEraseButtonPressed = true;
-    QTimer::singleShot(1000, this, SLOT(erasePaletteButtonReleased()));
-}
-
-
-void UBBoardPaletteManager::erasePaletteButtonReleased()
-{
-    if (mPendingEraseButtonPressed)
-    {
-        if( mEraseButtonPressedTime.msecsTo(QTime::currentTime()) > 900)
-        {
-            toggleErasePalette(true);
-        }
-        else
-        {
-            UBApplication::mainWindow->actionClearPage->trigger();
-        }
-
-        mPendingEraseButtonPressed = false;
-    }
-}
-
-
-
-void UBBoardPaletteManager::linkClicked(const QUrl& url)
-{
-      UBApplication::applicationController->showInternet();
-      UBApplication::webController->loadUrl(url);
-}
-
-
-void UBBoardPaletteManager::purchaseLinkActivated(const QString& link)
-{
-    UBApplication::applicationController->showInternet();
-    UBApplication::webController->loadUrl(QUrl(link));
-}
-
-void UBBoardPaletteManager::connectPalettes()
-{
-    connect(UBApplication::mainWindow->actionStylus, SIGNAL(toggled(bool)), this, SLOT(toggleStylusPalette(bool)));
-
-    foreach(QWidget *widget, UBApplication::mainWindow->actionZoomIn->associatedWidgets())
-    {
-        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
-        if (button)
-        {
-            connect(button, SIGNAL(pressed()), this, SLOT(zoomButtonPressed()));
-            connect(button, SIGNAL(released()), this, SLOT(zoomButtonReleased()));
-        }
-    }
-
-    foreach(QWidget *widget, UBApplication::mainWindow->actionZoomOut->associatedWidgets())
-    {
-        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
-        if (button)
-        {
-            connect(button, SIGNAL(pressed()), this, SLOT(zoomButtonPressed()));
-            connect(button, SIGNAL(released()), this, SLOT(zoomButtonReleased()));
-        }
-    }
-
-    foreach(QWidget *widget, UBApplication::mainWindow->actionHand->associatedWidgets())
-    {
-        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
-        if (button)
-        {
-            connect(button, SIGNAL(pressed()), this, SLOT(panButtonPressed()));
-            connect(button, SIGNAL(released()), this, SLOT(panButtonReleased()));
-        }
-    }
-
-    connect(UBApplication::mainWindow->actionBackgrounds, SIGNAL(toggled(bool)), this, SLOT(toggleBackgroundPalette(bool)));
-    connect(mBackgroundsPalette, SIGNAL(closed()), this, SLOT(backgroundPaletteClosed()));
-
-    connect(UBApplication::mainWindow->actionPlainLightBackground, SIGNAL(triggered()), this, SLOT(changeBackground()));
-    connect(UBApplication::mainWindow->actionCrossedLightBackground, SIGNAL(triggered()), this, SLOT(changeBackground()));
-    connect(UBApplication::mainWindow->actionPlainDarkBackground, SIGNAL(triggered()), this, SLOT(changeBackground()));
-    connect(UBApplication::mainWindow->actionCrossedDarkBackground, SIGNAL(triggered()), this, SLOT(changeBackground()));
-    connect(UBApplication::mainWindow->actionPodcast, SIGNAL(triggered(bool)), this, SLOT(tooglePodcastPalette(bool)));
-
-    connect(UBApplication::mainWindow->actionAddItemToCurrentPage, SIGNAL(triggered()), this, SLOT(addItemToCurrentPage()));
-    connect(UBApplication::mainWindow->actionAddItemToNewPage, SIGNAL(triggered()), this, SLOT(addItemToNewPage()));
-    connect(UBApplication::mainWindow->actionAddItemToLibrary, SIGNAL(triggered()), this, SLOT(addItemToLibrary()));
-
-    connect(UBApplication::mainWindow->actionEraseItems, SIGNAL(triggered()), mErasePalette, SLOT(close()));
-    connect(UBApplication::mainWindow->actionEraseAnnotations, SIGNAL(triggered()), mErasePalette, SLOT(close()));
-    connect(UBApplication::mainWindow->actionClearPage, SIGNAL(triggered()), mErasePalette, SLOT(close()));
-    connect(mErasePalette, SIGNAL(closed()), this, SLOT(erasePaletteClosed()));
-
-    foreach(QWidget *widget, UBApplication::mainWindow->actionErase->associatedWidgets())
-    {
-        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
-        if (button)
-        {
-            connect(button, SIGNAL(pressed()), this, SLOT(erasePaletteButtonPressed()));
-            connect(button, SIGNAL(released()), this, SLOT(erasePaletteButtonReleased()));
-        }
-    }
-
-    connect(UBApplication::mainWindow->actionNewPage, SIGNAL(triggered()), mPagePalette, SLOT(close()));
-    connect(UBApplication::mainWindow->actionDuplicatePage, SIGNAL(triggered()), mPagePalette, SLOT(close()));
-    connect(UBApplication::mainWindow->actionImportPage, SIGNAL(triggered()), mPagePalette, SLOT(close()));
-    connect(mPagePalette, SIGNAL(closed()), this, SLOT(pagePaletteClosed()));
-
-    foreach(QWidget *widget, UBApplication::mainWindow->actionPages->associatedWidgets())
-    {
-        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
-        if (button)
-        {
-            connect(button, SIGNAL(pressed()), this, SLOT(pagePaletteButtonPressed()));
-            connect(button, SIGNAL(released()), this, SLOT(pagePaletteButtonReleased()));
-        }
-    }
-
-}
-
-
-bool isFirstResized = true;
-void UBBoardPaletteManager::containerResized()
-{
-    int innerMargin = UBSettings::boardMargin;
-
-    int userLeft = innerMargin;
-    int userWidth = mContainer->width() - (2 * innerMargin);
-    int userTop = innerMargin;
-    int userHeight = mContainer->height() - (2 * innerMargin);
-
-    if(mStylusPalette)
-    {
-        mStylusPalette->move(userLeft, userTop);
-        mStylusPalette->adjustSizeAndPosition();
-        mStylusPalette->initPosition();
-    }
-
-    if(mZoomPalette)
-    {
-        mZoomPalette->move(userLeft + userWidth - mZoomPalette->width()
-                , userTop + userHeight /*- mPageNumberPalette->height()*/ - innerMargin - mZoomPalette->height());
-        mZoomPalette->adjustSizeAndPosition();
-    }
-
-    if (isFirstResized && mKeyboardPalette && mKeyboardPalette->parent() == UBApplication::boardController->controlContainer())
-    {
-        isFirstResized = false;
-        mKeyboardPalette->move(userLeft + (userWidth - mKeyboardPalette->width())/2,
-                               userTop + (userHeight - mKeyboardPalette->height())/2);
-        mKeyboardPalette->adjustSizeAndPosition();
-    }
-
-    if(mLeftPalette)
-    {
-        mLeftPalette->resize(mLeftPalette->width()-1, mContainer->height());
-        mLeftPalette->resize(mLeftPalette->width(), mContainer->height());
-    }
-
-    if(mRightPalette)
-    {
-        mRightPalette->resize(mRightPalette->width()-1, mContainer->height());
-        mRightPalette->resize(mRightPalette->width(), mContainer->height());
-    }
-}
-
-
-void UBBoardPaletteManager::changeBackground()
-{
-    if (UBApplication::mainWindow->actionCrossedLightBackground->isChecked())
-        UBApplication::boardController->changeBackground(false, true);
-    else if (UBApplication::mainWindow->actionPlainDarkBackground->isChecked())
-        UBApplication::boardController->changeBackground(true, false);
-    else if (UBApplication::mainWindow->actionCrossedDarkBackground->isChecked())
-        UBApplication::boardController->changeBackground(true, true);
-    else
-        UBApplication::boardController->changeBackground(false, false);
-
-    UBApplication::mainWindow->actionBackgrounds->setChecked(false);
-}
-
-
-void UBBoardPaletteManager::activeSceneChanged()
-{
-    UBGraphicsScene *activeScene =  UBApplication::boardController->activeScene();
-    int pageIndex = UBApplication::boardController->activeSceneIndex();
-
-    if (mStylusPalette)
-        connect(mStylusPalette, SIGNAL(mouseEntered()), activeScene, SLOT(hideEraser()));
-
-    if (mpPageNavigWidget)
-    {
-        mpPageNavigWidget->setPageNumber(pageIndex + 1, activeScene->document()->pageCount());
-    }
-
-    if (mZoomPalette)
-        connect(mZoomPalette, SIGNAL(mouseEntered()), activeScene, SLOT(hideEraser()));
-
-    if (mBackgroundsPalette)
-        connect(mBackgroundsPalette, SIGNAL(mouseEntered()), activeScene, SLOT(hideEraser()));
-}
-
-
-void UBBoardPaletteManager::toggleBackgroundPalette(bool checked)
-{
-    mBackgroundsPalette->setVisible(checked);
-
-    if (checked)
-    {
-        UBApplication::mainWindow->actionErase->setChecked(false);
-        UBApplication::mainWindow->actionNewPage->setChecked(false);
-
-        mBackgroundsPalette->adjustSizeAndPosition();
-        mBackgroundsPalette->move((mContainer->width() - mBackgroundsPalette->width()) / 2,
-            (mContainer->height() - mBackgroundsPalette->height()) / 5);
-    }
-}
-
-
-void UBBoardPaletteManager::backgroundPaletteClosed()
-{
-    UBApplication::mainWindow->actionBackgrounds->setChecked(false);
-}
-
-
-void UBBoardPaletteManager::toggleStylusPalette(bool checked)
-{
-    mStylusPalette->setVisible(checked);
-}
-
-
-void UBBoardPaletteManager::toggleErasePalette(bool checked)
-{
-    mErasePalette->setVisible(checked);
-    if (checked)
-    {
-        UBApplication::mainWindow->actionBackgrounds->setChecked(false);
-        UBApplication::mainWindow->actionNewPage->setChecked(false);
-
-        mErasePalette->adjustSizeAndPosition();
-        mErasePalette->move((mContainer->width() - mErasePalette->width()) / 2,
-            (mContainer->height() - mErasePalette->height()) / 5);
-    }
-}
-
-
-void UBBoardPaletteManager::erasePaletteClosed()
-{
-    UBApplication::mainWindow->actionErase->setChecked(false);
-}
-
-
-void UBBoardPaletteManager::togglePagePalette(bool checked)
-{
-    mPagePalette->setVisible(checked);
-    if (checked)
-    {
-        UBApplication::mainWindow->actionBackgrounds->setChecked(false);
-        UBApplication::mainWindow->actionErase->setChecked(false);
-
-        mPagePalette->adjustSizeAndPosition();
-        mPagePalette->move((mContainer->width() - mPagePalette->width()) / 2,
-            (mContainer->height() - mPagePalette->height()) / 5);
-    }
-}
-
-
-void UBBoardPaletteManager::pagePaletteClosed()
-{
-    UBApplication::mainWindow->actionPages->setChecked(false);
-}
-
-
-void UBBoardPaletteManager::tooglePodcastPalette(bool checked)
-{
-    UBPodcastController::instance()->toggleRecordingPalette(checked);
-}
-
-
-void UBBoardPaletteManager::addItem(const QUrl& pUrl)
-{
-    mItemUrl = pUrl;
-    mPixmap = QPixmap();
-    mPos = QPointF(0, 0);
-    mScaleFactor = 1.;
-
-    mAddItemPalette->show();
-    mAddItemPalette->adjustSizeAndPosition();
-
-    QRect controlGeo = UBApplication::applicationController->displayManager()->controlGeometry();
-
-    mAddItemPalette->move(controlGeo.x() + ((controlGeo.width() - mAddItemPalette->geometry().width()) / 2),
-          (controlGeo.y() + (controlGeo.height() - mAddItemPalette->geometry().height()) / 5));
-
-}
-
-void UBBoardPaletteManager::changeMode(eUBDockPaletteWidgetMode newMode, bool isInit)
-{
-    bool rightPaletteVisible = mRightPalette->switchMode(newMode);
-    bool leftPaletteVisible = mLeftPalette->switchMode(newMode);
-
-    switch( newMode )
-    {
-        case eUBDockPaletteWidget_BOARD:
-            {
-                mLeftPalette->assignParent(UBApplication::boardController->controlContainer());
-                mRightPalette->assignParent(UBApplication::boardController->controlContainer());
-                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
-                {
-
-                    if(mKeyboardPalette->m_isVisible)
-                    {
-                        mKeyboardPalette->hide();
-                        mKeyboardPalette->setParent(UBApplication::boardController->controlContainer());
-                        mKeyboardPalette->show();
-                    }
-                    else
-                        mKeyboardPalette->setParent(UBApplication::boardController->controlContainer());
-                }
-
-                mLeftPalette->setVisible(leftPaletteVisible);
-                mRightPalette->setVisible(rightPaletteVisible);
-#ifdef Q_WS_WIN
-                if (rightPaletteVisible)
-                    mRightPalette->setAdditionalVOffset(0);
-#endif
-
-                if( !isInit )
-                    containerResized();
-            }
-            break;
-
-        case eUBDockPaletteWidget_DESKTOP:
-            {
-                mLeftPalette->assignParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
-                mRightPalette->assignParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
-                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
-                {
-
-                    if(mKeyboardPalette->m_isVisible)
-                    {
-                        mKeyboardPalette->hide();
-#ifndef Q_WS_X11
-                        mKeyboardPalette->setParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
-#else
-                        mKeyboardPalette->setParent(0);
-#endif
-                        mKeyboardPalette->show();
-                    }
-                    else
-                        mKeyboardPalette->setParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
-                }
-
-                mLeftPalette->setVisible(leftPaletteVisible);
-                mRightPalette->setVisible(rightPaletteVisible);
-#ifdef Q_WS_WIN
-                if (rightPaletteVisible)
-                    mRightPalette->setAdditionalVOffset(30);
-#endif
-
-                if( !isInit )
-                    UBApplication::applicationController->uninotesController()->TransparentWidgetResized();
-            }
-            break;
-
-        case eUBDockPaletteWidget_WEB:
-            {
-                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
-                {
-                    WBBrowserWindow* brWnd = UBApplication::webController->GetCurrentWebBrowser();
-
-                    if(mKeyboardPalette->m_isVisible)
-                    {
-                        mKeyboardPalette->hide();
-                        mKeyboardPalette->setParent(brWnd);
-                        mKeyboardPalette->show();
-                    }
-                    else
-                        mKeyboardPalette->setParent(brWnd);
-                }
-
-            }
-            break;
-
-        default:
-            {
-                mLeftPalette->setVisible(leftPaletteVisible);
-                mRightPalette->setVisible(rightPaletteVisible);
-                mLeftPalette->assignParent(0);
-                mRightPalette->assignParent(0);
-                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
-                {
-
-                    if(mKeyboardPalette->m_isVisible)
-                    {
-                        mKeyboardPalette->hide();
-                        mKeyboardPalette->setParent(0);
-                        mKeyboardPalette->show();
-                    }
-                    else
-                        mKeyboardPalette->setParent(0);
-                }
-            }
-            break;
-    }
-
-    if( !isInit )
-        UBApplication::boardController->notifyPageChanged();
-
-    emit signal_changeMode(newMode);
-}
-
-/*
-void UBBoardPaletteManager::slot_changeMode(eUBDockPaletteWidgetMode newMode)
-{
-    emit signal_changeMode(newMode);
-}
-*/
-
-void UBBoardPaletteManager::addItem(const QPixmap& pPixmap, const QPointF& pos,  qreal scaleFactor, const QUrl& sourceUrl)
-{
-    mItemUrl = sourceUrl;
-    mPixmap = pPixmap;
-    mPos = pos;
-    mScaleFactor = scaleFactor;
-
-     QRect controlGeo = UBApplication::applicationController->displayManager()->controlGeometry();
-
-    mAddItemPalette->show();
-    mAddItemPalette->adjustSizeAndPosition();
-
-    mAddItemPalette->move(controlGeo.x() + ((controlGeo.width() - mAddItemPalette->geometry().width()) / 2),
-          (controlGeo.y() + (controlGeo.height() - mAddItemPalette->geometry().height()) / 5));
-}
-
-
-void UBBoardPaletteManager::addItemToCurrentPage()
-{
-    UBApplication::applicationController->showBoard();    
-    mAddItemPalette->hide();
-    if(mPixmap.isNull())
-        UBApplication::boardController->downloadURL(mItemUrl);
-    else
-    {
-        UBGraphicsPixmapItem* item = UBApplication::boardController->activeScene()->addPixmap(mPixmap, mPos, mScaleFactor);
-
-        item->setSourceUrl(mItemUrl);
-        item->setSelected(true);
-
-        UBDrawingController::drawingController()->setStylusTool(UBStylusTool::Selector);
-    }
-}
-
-
-void UBBoardPaletteManager::addItemToNewPage()
-{
-    UBApplication::boardController->addScene();
-    addItemToCurrentPage();
-}
-
-
-void UBBoardPaletteManager::addItemToLibrary()
-{
-    if(mPixmap.isNull())
-    {
-       mPixmap = QPixmap(mItemUrl.toLocalFile());
-    }
-
-    if(!mPixmap.isNull())
-    {
-        QString imageDir = UBSettings::settings()->defaultUserImagesDirectory();
-
-        if(mScaleFactor != 1.)
-        {
-             mPixmap = mPixmap.scaled(mScaleFactor * mPixmap.width(), mScaleFactor* mPixmap.height()
-                     , Qt::KeepAspectRatio, Qt::SmoothTransformation);
-        }
-        QImage image = mPixmap.toImage();
-
-        if(NULL != mpLibWidget)
-        {
-            mpLibWidget->libNavigator()->libraryWidget()->libraryController()->importImageOnLibrary(image);
-        }
-    }
-    else
-    {
-        UBApplication::showMessage(tr("Error Adding Image to Library"));
-    }
-
-    mAddItemPalette->hide();
-}
-
-void UBBoardPaletteManager::zoomButtonPressed()
-{
-    mZoomButtonPressedTime = QTime::currentTime();
-
-    mPendingZoomButtonPressed = true;
-    QTimer::singleShot(1000, this, SLOT(zoomButtonReleased()));
-}
-
-
-void UBBoardPaletteManager::zoomButtonReleased()
-{
-    if (mPendingZoomButtonPressed)
-    {
-        if(mZoomButtonPressedTime.msecsTo(QTime::currentTime()) > 900)
-        {
-            mBoardControler->zoomRestore();
-        }
-
-        mPendingZoomButtonPressed = false;
-    }
-}
-
-void UBBoardPaletteManager::panButtonPressed()
-{
-    mPanButtonPressedTime = QTime::currentTime();
-
-    mPendingPanButtonPressed = true;
-    QTimer::singleShot(1000, this, SLOT(panButtonReleased()));
-}
-
-
-void UBBoardPaletteManager::panButtonReleased()
-{
-    if (mPendingPanButtonPressed)
-    {
-        if(mPanButtonPressedTime.msecsTo(QTime::currentTime()) > 900)
-        {
-            mBoardControler->centerRestore();
-        }
-
-        mPendingPanButtonPressed = false;
-    }
-}
-
-void UBBoardPaletteManager::showVirtualKeyboard(bool show)
-{
-    if (mKeyboardPalette)
-        mKeyboardPalette->setVisible(show);
-}
-
-void UBBoardPaletteManager::changeStylusPaletteOrientation(QVariant var)
-{
-    bool bVertical = var.toBool();
-    bool bVisible = mStylusPalette->isVisible();
-
-	// Clean the old palette
-    if(NULL != mStylusPalette)
-    {
-        // TODO : check why this line creates a crash in the application.
-        delete mStylusPalette;
-    }
-
-    // Create the new palette
-    if(bVertical)
-    {
-        mStylusPalette = new UBStylusPalette(mContainer, Qt::Vertical);
-    }
-    else
-    {
-        mStylusPalette = new UBStylusPalette(mContainer, Qt::Horizontal);
-    }
-
-    connect(mStylusPalette, SIGNAL(stylusToolDoubleClicked(int)), UBApplication::boardController, SLOT(stylusToolDoubleClicked(int)));
-    mStylusPalette->setVisible(bVisible); // always show stylus palette at startup
-}
-
-/*
-UBRightPalette* UBBoardPaletteManager::createDesktopRightPalette(QWidget* parent)
-{
-    mpDesktopLibWidget = new UBLibWidget();
-    mDesktopRightPalette = new UBRightPalette(parent);
-    mDesktopRightPalette->registerWidget(mpDesktopLibWidget);
-    mDesktopRightPalette->addTabWidget(mpDesktopLibWidget);
-    mDesktopRightPalette->connectSignals();
-
-    return mDesktopRightPalette;
-}
-*/
-
-void UBBoardPaletteManager::connectToDocumentController()
-{
-    emit connectToDocController();
-}
-
-void UBBoardPaletteManager::refreshPalettes()
-{
-    mRightPalette->update();
-    mLeftPalette->update();
-}
-
-void UBBoardPaletteManager::startDownloads()
-{
-    if(!mDownloadInProgress)
-    {
-        mDownloadInProgress = true;
-        mpDownloadWidget->setVisibleState(true);
-        mRightPalette->addTab(mpDownloadWidget);
-    }
-}
-
-void UBBoardPaletteManager::stopDownloads()
-{
-    if(mDownloadInProgress)
-    {
-        mDownloadInProgress = false;
-        mpDownloadWidget->setVisibleState(false);
-        mRightPalette->removeTab(mpDownloadWidget);
-    }
-}
-
-QRect UBBoardPaletteManager::GetFreeRectGlobalCoords() const
-{
-    QPoint topLeft, bottomRight;
-    if (mLeftPalette) {
-        int x = mLeftPalette->getTabPaletteRect().topRight().x();
-        int y = 0;
-        if (x || y) {
-            topLeft.setX(x);
-            topLeft.setY(y);
-            topLeft = mContainer->mapToGlobal(topLeft);
-        }
-    }
-    if (mRightPalette) {
-        int x = mRightPalette->getTabPaletteRect().topLeft().x();
-        int y = mRightPalette->height();
-        if (x || y) {
-            bottomRight.setX(x);
-            bottomRight.setY(y);
-            bottomRight = mContainer->mapToGlobal(bottomRight);
-        }
-    }
-    return QRect(topLeft, bottomRight);
-}
-
-void UBBoardPaletteManager::ForceTeacherBarToSaveData()
-{
-	mpTeacherBarWidget->saveContent();
-}
-
-void UBBoardPaletteManager::ForceTeacherBarToLoadData()
-{
-	mpTeacherBarWidget->loadContent();
-}
+/*
+ * 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "UBBoardPaletteManager.h"
+
+#include "frameworks/UBPlatformUtils.h"
+#include "frameworks/UBFileSystemUtils.h"
+
+#include "core/UBApplication.h"
+#include "core/UBApplicationController.h"
+#include "core/UBSettings.h"
+#include "core/UBSetting.h"
+#include "core/UBDisplayManager.h"
+
+#include "gui/UBMainWindow.h"
+#include "gui/UBStylusPalette.h"
+#include "gui/UBKeyboardPalette.h"
+#include "gui/UBToolWidget.h"
+#include "gui/UBZoomPalette.h"
+#include "gui/UBActionPalette.h"
+#include "gui/UBFavoriteToolPalette.h"
+
+
+#include "web/UBWebPage.h"
+#include "web/UBWebController.h"
+#include "web/browser/WBBrowserWindow.h"
+#include "web/browser/WBTabWidget.h"
+#include "web/browser/WBWebView.h"
+
+#include "desktop/UBDesktopAnnotationController.h"
+
+
+#include "network/UBNetworkAccessManager.h"
+#include "network/UBServerXMLHttpRequest.h"
+
+#include "domain/UBGraphicsScene.h"
+#include "domain/UBAbstractWidget.h"
+#include "domain/UBGraphicsPixmapItem.h"
+
+#include "document/UBDocumentProxy.h"
+#include "podcast/UBPodcastController.h"
+#include "board/UBDrawingController.h"
+
+#include "tools/UBToolsManager.h"
+
+#include "UBBoardController.h"
+
+#include "core/memcheck.h"
+
+#include "document/UBDocumentController.h"
+
+UBBoardPaletteManager::UBBoardPaletteManager(QWidget* container, UBBoardController* pBoardController)
+    : QObject(container)
+    , mKeyboardPalette(0)
+    , mContainer(container)
+    , mBoardControler(pBoardController)
+    , mStylusPalette(0)
+    , mZoomPalette(0)
+    , mLeftPalette(NULL)
+    , mRightPalette(NULL)
+    , mBackgroundsPalette(0)
+    , mToolsPalette(0)
+    , mAddItemPalette(0)
+    , mErasePalette(NULL)
+    , mPagePalette(NULL)
+    , mPendingPageButtonPressed(false)
+    , mPendingZoomButtonPressed(false)
+    , mPendingPanButtonPressed(false)
+    , mPendingEraseButtonPressed(false)
+    , mpPageNavigWidget(NULL)
+    , mpLibWidget(NULL)
+    , mpCachePropWidget(NULL)
+    , mpTeacherBarWidget(NULL)
+    , mpDownloadWidget(NULL)
+    , mpDesktopLibWidget(NULL)
+    , mDownloadInProgress(false)
+{
+    setupPalettes();
+    connectPalettes();
+}
+
+
+UBBoardPaletteManager::~UBBoardPaletteManager()
+{
+    delete mAddItemPalette;
+
+
+    if(NULL != mStylusPalette)
+    {
+        delete mStylusPalette;
+        mStylusPalette = NULL;
+    }
+
+    if(NULL != mpDesktopLibWidget)
+    {
+        delete mpDesktopLibWidget;
+        mpDesktopLibWidget = NULL;
+    }
+//     if(NULL != mDesktopRightPalette)
+//     {
+//         delete mDesktopRightPalette;
+//         mDesktopRightPalette = NULL;
+//     }
+}
+
+void UBBoardPaletteManager::initPalettesPosAtStartup()
+{
+    mStylusPalette->initPosition();
+}
+
+void UBBoardPaletteManager::setupLayout()
+{
+
+}
+
+/**
+ * \brief Set up the dock palette widgets
+ */
+void UBBoardPaletteManager::setupDockPaletteWidgets()
+{
+
+    //------------------------------------------------//
+    // Create the widgets for the dock palettes
+
+    mpPageNavigWidget = new UBPageNavigationWidget();
+//    connect(this, SIGNAL(signal_changeMode(eUBDockPaletteWidgetMode)), mpPageNavigWidget, SLOT(slot_changeMode(eUBDockPaletteWidgetMode)));
+
+    mpLibWidget = new UBLibWidget();
+//    connect(this, SIGNAL(signal_changeMode(eUBDockPaletteWidgetMode)), mpLibWidget, SLOT(slot_changeMode(eUBDockPaletteWidgetMode)));
+
+    mpCachePropWidget = new UBCachePropertiesWidget();
+//    connect(this, SIGNAL(signal_changeMode(eUBDockPaletteWidgetMode)), mpCachePropWidget, SLOT(slot_changeMode(eUBDockPaletteWidgetMode)));
+
+    mpTeacherBarWidget = new UBTeacherBarWidget();
+//    connect(this, SIGNAL(signal_changeMode(eUBDockPaletteWidgetMode)), mpTeacherBarWidget, SLOT(slot_changeMode(eUBDockPaletteWidgetMode)));
+
+    mpDownloadWidget = new UBDockDownloadWidget();
+
+    // Add the dock palettes
+    mLeftPalette = new UBLeftPalette(mContainer);
+
+    // LEFT palette widgets
+    mLeftPalette->registerWidget(mpPageNavigWidget);
+    mLeftPalette->addTab(mpPageNavigWidget);
+
+    // The teacher bar widget will always be there
+    mLeftPalette->registerWidget(mpTeacherBarWidget);
+    mLeftPalette->addTab(mpTeacherBarWidget);
+
+    mLeftPalette->connectSignals();
+
+    mRightPalette = new UBRightPalette(mContainer);
+    // RIGHT palette widgets
+    mRightPalette->registerWidget(mpLibWidget);
+    mRightPalette->addTab(mpLibWidget);
+    // The cache widget will be visible only if a cache is put on the page
+    mRightPalette->registerWidget(mpCachePropWidget);
+
+    //  The download widget will be part of the right palette but
+    //  will become visible only when the first download starts
+    mRightPalette->registerWidget(mpDownloadWidget);
+    mRightPalette->connectSignals();
+    changeMode(eUBDockPaletteWidget_BOARD, true);
+
+    // Hide the tabs that must be hidden
+    mRightPalette->removeTab(mpDownloadWidget);
+    mRightPalette->removeTab(mpCachePropWidget);
+
+//     mLeftPalette->showTabWidget(0);
+//     mRightPalette->showTabWidget(0);
+// 
+//     //------------------------------------------------//
+}
+
+void UBBoardPaletteManager::slot_changeMainMode(UBApplicationController::MainMode mainMode)
+{
+//    Board = 0, Internet, Document, Tutorial, ParaschoolEditor, WebDocument
+
+    switch( mainMode )
+    {
+        case UBApplicationController::Board: 
+            {
+                // call changeMode only when switch NOT from desktop mode
+                if(!UBApplication::applicationController->isShowingDesktop())
+                    changeMode(eUBDockPaletteWidget_BOARD);
+            }
+            break;
+
+        case UBApplicationController::Tutorial:
+            {
+                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
+                    mKeyboardPalette->hide();
+            }
+            break;
+
+        case UBApplicationController::Internet:
+            changeMode(eUBDockPaletteWidget_WEB);
+            break;
+
+        case UBApplicationController::Document:
+            changeMode(eUBDockPaletteWidget_DOCUMENT);
+            break;
+
+        default:
+            {
+                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
+                    mKeyboardPalette->hide();
+            }
+            break;
+    }
+}
+
+void UBBoardPaletteManager::slot_changeDesktopMode(bool isDesktop)
+{
+    UBApplicationController::MainMode currMode = UBApplication::applicationController->displayMode();
+    if(!isDesktop) 
+    {
+        switch( currMode )
+        {
+            case UBApplicationController::Board:
+                changeMode(eUBDockPaletteWidget_BOARD);
+                break;
+
+            default:
+                break;
+        }
+    }
+    else
+        changeMode(eUBDockPaletteWidget_DESKTOP);
+}
+
+void UBBoardPaletteManager::setupPalettes()
+{
+
+    if (UBPlatformUtils::hasVirtualKeyboard())
+    {
+        mKeyboardPalette = new UBKeyboardPalette(0);
+#ifndef Q_WS_WIN
+        connect(mKeyboardPalette, SIGNAL(closed()), mKeyboardPalette, SLOT(onDeactivated()));
+#endif
+#ifndef Q_WS_MAC
+        //     mKeyboardPalette->setParent(mContainer);
+#endif
+    }
+
+    setupDockPaletteWidgets();
+
+
+    // Add the other palettes
+    mStylusPalette = new UBStylusPalette(mContainer, UBSettings::settings()->appToolBarOrientationVertical->get().toBool() ? Qt::Vertical : Qt::Horizontal);
+    connect(mStylusPalette, SIGNAL(stylusToolDoubleClicked(int)), UBApplication::boardController, SLOT(stylusToolDoubleClicked(int)));
+    mStylusPalette->show(); // always show stylus palette at startup
+
+    mZoomPalette = new UBZoomPalette(mContainer);
+
+    QList<QAction*> backgroundsActions;
+
+    backgroundsActions << UBApplication::mainWindow->actionPlainLightBackground;
+    backgroundsActions << UBApplication::mainWindow->actionCrossedLightBackground;
+    backgroundsActions << UBApplication::mainWindow->actionPlainDarkBackground;
+    backgroundsActions << UBApplication::mainWindow->actionCrossedDarkBackground;
+
+    mBackgroundsPalette = new UBActionPalette(backgroundsActions, Qt::Horizontal , mContainer);
+    mBackgroundsPalette->setButtonIconSize(QSize(128, 128));
+    mBackgroundsPalette->groupActions();
+    mBackgroundsPalette->setClosable(true);
+    mBackgroundsPalette->setAutoClose(true);
+    mBackgroundsPalette->adjustSizeAndPosition();
+    mBackgroundsPalette->hide();
+
+    QList<QAction*> addItemActions;
+
+    addItemActions << UBApplication::mainWindow->actionAddItemToCurrentPage;
+    addItemActions << UBApplication::mainWindow->actionAddItemToNewPage;
+    addItemActions << UBApplication::mainWindow->actionAddItemToLibrary;
+
+    mAddItemPalette = new UBActionPalette(addItemActions, Qt::Horizontal, 0);
+    mAddItemPalette->setButtonIconSize(QSize(128, 128));
+    mAddItemPalette->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+    mAddItemPalette->groupActions();
+    mAddItemPalette->setClosable(true);
+    mAddItemPalette->adjustSizeAndPosition();
+    mAddItemPalette->hide();
+
+    QList<QAction*> eraseActions;
+
+    eraseActions << UBApplication::mainWindow->actionEraseAnnotations;
+    eraseActions << UBApplication::mainWindow->actionEraseItems;
+    eraseActions << UBApplication::mainWindow->actionClearPage;
+
+    mErasePalette = new UBActionPalette(eraseActions, Qt::Horizontal , mContainer);
+    mErasePalette->setButtonIconSize(QSize(128, 128));
+    mErasePalette->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+    mErasePalette->groupActions();
+    mErasePalette->setClosable(true);
+    mErasePalette->adjustSizeAndPosition();
+    mErasePalette->hide();
+
+    QList<QAction*> pageActions;
+
+    pageActions << UBApplication::mainWindow->actionNewPage;
+    pageActions << UBApplication::mainWindow->actionDuplicatePage;
+    pageActions << UBApplication::mainWindow->actionImportPage;
+
+    mPagePalette = new UBActionPalette(pageActions, Qt::Horizontal , mContainer);
+    mPagePalette->setButtonIconSize(QSize(128, 128));
+    mPagePalette->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+    mPagePalette->groupActions();
+    mPagePalette->setClosable(true);
+    mPagePalette->adjustSizeAndPosition();
+    mPagePalette->hide();
+
+    connect(UBSettings::settings()->appToolBarOrientationVertical, SIGNAL(changed(QVariant)), this, SLOT(changeStylusPaletteOrientation(QVariant)));
+}
+
+void UBBoardPaletteManager::pagePaletteButtonPressed()
+{
+    mPageButtonPressedTime = QTime::currentTime();
+
+    mPendingPageButtonPressed = true;
+    QTimer::singleShot(1000, this, SLOT(pagePaletteButtonReleased()));
+}
+
+
+void UBBoardPaletteManager::pagePaletteButtonReleased()
+{
+    if (mPendingPageButtonPressed)
+    {
+        if( mPageButtonPressedTime.msecsTo(QTime::currentTime()) > 900)
+        {
+            togglePagePalette(true);
+        }
+        else
+        {
+            UBApplication::mainWindow->actionNewPage->trigger();
+        }
+
+        mPendingPageButtonPressed = false;
+    }
+}
+
+void UBBoardPaletteManager::erasePaletteButtonPressed()
+{
+    mEraseButtonPressedTime = QTime::currentTime();
+
+    mPendingEraseButtonPressed = true;
+    QTimer::singleShot(1000, this, SLOT(erasePaletteButtonReleased()));
+}
+
+
+void UBBoardPaletteManager::erasePaletteButtonReleased()
+{
+    if (mPendingEraseButtonPressed)
+    {
+        if( mEraseButtonPressedTime.msecsTo(QTime::currentTime()) > 900)
+        {
+            toggleErasePalette(true);
+        }
+        else
+        {
+            UBApplication::mainWindow->actionClearPage->trigger();
+        }
+
+        mPendingEraseButtonPressed = false;
+    }
+}
+
+
+
+void UBBoardPaletteManager::linkClicked(const QUrl& url)
+{
+      UBApplication::applicationController->showInternet();
+      UBApplication::webController->loadUrl(url);
+}
+
+
+void UBBoardPaletteManager::purchaseLinkActivated(const QString& link)
+{
+    UBApplication::applicationController->showInternet();
+    UBApplication::webController->loadUrl(QUrl(link));
+}
+
+void UBBoardPaletteManager::connectPalettes()
+{
+    connect(UBApplication::mainWindow->actionStylus, SIGNAL(toggled(bool)), this, SLOT(toggleStylusPalette(bool)));
+
+    foreach(QWidget *widget, UBApplication::mainWindow->actionZoomIn->associatedWidgets())
+    {
+        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
+        if (button)
+        {
+            connect(button, SIGNAL(pressed()), this, SLOT(zoomButtonPressed()));
+            connect(button, SIGNAL(released()), this, SLOT(zoomButtonReleased()));
+        }
+    }
+
+    foreach(QWidget *widget, UBApplication::mainWindow->actionZoomOut->associatedWidgets())
+    {
+        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
+        if (button)
+        {
+            connect(button, SIGNAL(pressed()), this, SLOT(zoomButtonPressed()));
+            connect(button, SIGNAL(released()), this, SLOT(zoomButtonReleased()));
+        }
+    }
+
+    foreach(QWidget *widget, UBApplication::mainWindow->actionHand->associatedWidgets())
+    {
+        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
+        if (button)
+        {
+            connect(button, SIGNAL(pressed()), this, SLOT(panButtonPressed()));
+            connect(button, SIGNAL(released()), this, SLOT(panButtonReleased()));
+        }
+    }
+
+    connect(UBApplication::mainWindow->actionBackgrounds, SIGNAL(toggled(bool)), this, SLOT(toggleBackgroundPalette(bool)));
+    connect(mBackgroundsPalette, SIGNAL(closed()), this, SLOT(backgroundPaletteClosed()));
+
+    connect(UBApplication::mainWindow->actionPlainLightBackground, SIGNAL(triggered()), this, SLOT(changeBackground()));
+    connect(UBApplication::mainWindow->actionCrossedLightBackground, SIGNAL(triggered()), this, SLOT(changeBackground()));
+    connect(UBApplication::mainWindow->actionPlainDarkBackground, SIGNAL(triggered()), this, SLOT(changeBackground()));
+    connect(UBApplication::mainWindow->actionCrossedDarkBackground, SIGNAL(triggered()), this, SLOT(changeBackground()));
+    connect(UBApplication::mainWindow->actionPodcast, SIGNAL(triggered(bool)), this, SLOT(tooglePodcastPalette(bool)));
+
+    connect(UBApplication::mainWindow->actionAddItemToCurrentPage, SIGNAL(triggered()), this, SLOT(addItemToCurrentPage()));
+    connect(UBApplication::mainWindow->actionAddItemToNewPage, SIGNAL(triggered()), this, SLOT(addItemToNewPage()));
+    connect(UBApplication::mainWindow->actionAddItemToLibrary, SIGNAL(triggered()), this, SLOT(addItemToLibrary()));
+
+    connect(UBApplication::mainWindow->actionEraseItems, SIGNAL(triggered()), mErasePalette, SLOT(close()));
+    connect(UBApplication::mainWindow->actionEraseAnnotations, SIGNAL(triggered()), mErasePalette, SLOT(close()));
+    connect(UBApplication::mainWindow->actionClearPage, SIGNAL(triggered()), mErasePalette, SLOT(close()));
+    connect(mErasePalette, SIGNAL(closed()), this, SLOT(erasePaletteClosed()));
+
+    foreach(QWidget *widget, UBApplication::mainWindow->actionErase->associatedWidgets())
+    {
+        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
+        if (button)
+        {
+            connect(button, SIGNAL(pressed()), this, SLOT(erasePaletteButtonPressed()));
+            connect(button, SIGNAL(released()), this, SLOT(erasePaletteButtonReleased()));
+        }
+    }
+
+    connect(UBApplication::mainWindow->actionNewPage, SIGNAL(triggered()), mPagePalette, SLOT(close()));
+    connect(UBApplication::mainWindow->actionDuplicatePage, SIGNAL(triggered()), mPagePalette, SLOT(close()));
+    connect(UBApplication::mainWindow->actionImportPage, SIGNAL(triggered()), mPagePalette, SLOT(close()));
+    connect(mPagePalette, SIGNAL(closed()), this, SLOT(pagePaletteClosed()));
+
+    foreach(QWidget *widget, UBApplication::mainWindow->actionPages->associatedWidgets())
+    {
+        QAbstractButton *button = qobject_cast<QAbstractButton*>(widget);
+        if (button)
+        {
+            connect(button, SIGNAL(pressed()), this, SLOT(pagePaletteButtonPressed()));
+            connect(button, SIGNAL(released()), this, SLOT(pagePaletteButtonReleased()));
+        }
+    }
+
+}
+
+
+bool isFirstResized = true;
+void UBBoardPaletteManager::containerResized()
+{
+    int innerMargin = UBSettings::boardMargin;
+
+    int userLeft = innerMargin;
+    int userWidth = mContainer->width() - (2 * innerMargin);
+    int userTop = innerMargin;
+    int userHeight = mContainer->height() - (2 * innerMargin);
+
+    if(mStylusPalette)
+    {
+        mStylusPalette->move(userLeft, userTop);
+        mStylusPalette->adjustSizeAndPosition();
+        mStylusPalette->initPosition();
+    }
+
+    if(mZoomPalette)
+    {
+        mZoomPalette->move(userLeft + userWidth - mZoomPalette->width()
+                , userTop + userHeight /*- mPageNumberPalette->height()*/ - innerMargin - mZoomPalette->height());
+        mZoomPalette->adjustSizeAndPosition();
+    }
+
+    if (isFirstResized && mKeyboardPalette && mKeyboardPalette->parent() == UBApplication::boardController->controlContainer())
+    {
+        isFirstResized = false;
+        mKeyboardPalette->move(userLeft + (userWidth - mKeyboardPalette->width())/2,
+                               userTop + (userHeight - mKeyboardPalette->height())/2);
+        mKeyboardPalette->adjustSizeAndPosition();
+    }
+
+    if(mLeftPalette)
+    {
+        mLeftPalette->resize(mLeftPalette->width()-1, mContainer->height());
+        mLeftPalette->resize(mLeftPalette->width(), mContainer->height());
+    }
+
+    if(mRightPalette)
+    {
+        mRightPalette->resize(mRightPalette->width()-1, mContainer->height());
+        mRightPalette->resize(mRightPalette->width(), mContainer->height());
+    }
+}
+
+
+void UBBoardPaletteManager::changeBackground()
+{
+    if (UBApplication::mainWindow->actionCrossedLightBackground->isChecked())
+        UBApplication::boardController->changeBackground(false, true);
+    else if (UBApplication::mainWindow->actionPlainDarkBackground->isChecked())
+        UBApplication::boardController->changeBackground(true, false);
+    else if (UBApplication::mainWindow->actionCrossedDarkBackground->isChecked())
+        UBApplication::boardController->changeBackground(true, true);
+    else
+        UBApplication::boardController->changeBackground(false, false);
+
+    UBApplication::mainWindow->actionBackgrounds->setChecked(false);
+}
+
+
+void UBBoardPaletteManager::activeSceneChanged()
+{
+    UBGraphicsScene *activeScene =  UBApplication::boardController->activeScene();
+    int pageIndex = UBApplication::boardController->activeSceneIndex();
+
+    if (mStylusPalette)
+        connect(mStylusPalette, SIGNAL(mouseEntered()), activeScene, SLOT(hideEraser()));
+
+    if (mpPageNavigWidget)
+    {
+        mpPageNavigWidget->setPageNumber(pageIndex + 1, activeScene->document()->pageCount());
+    }
+
+    if (mZoomPalette)
+        connect(mZoomPalette, SIGNAL(mouseEntered()), activeScene, SLOT(hideEraser()));
+
+    if (mBackgroundsPalette)
+        connect(mBackgroundsPalette, SIGNAL(mouseEntered()), activeScene, SLOT(hideEraser()));
+}
+
+
+void UBBoardPaletteManager::toggleBackgroundPalette(bool checked)
+{
+    mBackgroundsPalette->setVisible(checked);
+
+    if (checked)
+    {
+        UBApplication::mainWindow->actionErase->setChecked(false);
+        UBApplication::mainWindow->actionNewPage->setChecked(false);
+
+        mBackgroundsPalette->adjustSizeAndPosition();
+        mBackgroundsPalette->move((mContainer->width() - mBackgroundsPalette->width()) / 2,
+            (mContainer->height() - mBackgroundsPalette->height()) / 5);
+    }
+}
+
+
+void UBBoardPaletteManager::backgroundPaletteClosed()
+{
+    UBApplication::mainWindow->actionBackgrounds->setChecked(false);
+}
+
+
+void UBBoardPaletteManager::toggleStylusPalette(bool checked)
+{
+    mStylusPalette->setVisible(checked);
+}
+
+
+void UBBoardPaletteManager::toggleErasePalette(bool checked)
+{
+    mErasePalette->setVisible(checked);
+    if (checked)
+    {
+        UBApplication::mainWindow->actionBackgrounds->setChecked(false);
+        UBApplication::mainWindow->actionNewPage->setChecked(false);
+
+        mErasePalette->adjustSizeAndPosition();
+        mErasePalette->move((mContainer->width() - mErasePalette->width()) / 2,
+            (mContainer->height() - mErasePalette->height()) / 5);
+    }
+}
+
+
+void UBBoardPaletteManager::erasePaletteClosed()
+{
+    UBApplication::mainWindow->actionErase->setChecked(false);
+}
+
+
+void UBBoardPaletteManager::togglePagePalette(bool checked)
+{
+    mPagePalette->setVisible(checked);
+    if (checked)
+    {
+        UBApplication::mainWindow->actionBackgrounds->setChecked(false);
+        UBApplication::mainWindow->actionErase->setChecked(false);
+
+        mPagePalette->adjustSizeAndPosition();
+        mPagePalette->move((mContainer->width() - mPagePalette->width()) / 2,
+            (mContainer->height() - mPagePalette->height()) / 5);
+    }
+}
+
+
+void UBBoardPaletteManager::pagePaletteClosed()
+{
+    UBApplication::mainWindow->actionPages->setChecked(false);
+}
+
+
+void UBBoardPaletteManager::tooglePodcastPalette(bool checked)
+{
+    UBPodcastController::instance()->toggleRecordingPalette(checked);
+}
+
+
+void UBBoardPaletteManager::addItem(const QUrl& pUrl)
+{
+    mItemUrl = pUrl;
+    mPixmap = QPixmap();
+    mPos = QPointF(0, 0);
+    mScaleFactor = 1.;
+
+    mAddItemPalette->show();
+    mAddItemPalette->adjustSizeAndPosition();
+
+    QRect controlGeo = UBApplication::applicationController->displayManager()->controlGeometry();
+
+    mAddItemPalette->move(controlGeo.x() + ((controlGeo.width() - mAddItemPalette->geometry().width()) / 2),
+          (controlGeo.y() + (controlGeo.height() - mAddItemPalette->geometry().height()) / 5));
+
+}
+
+void UBBoardPaletteManager::changeMode(eUBDockPaletteWidgetMode newMode, bool isInit)
+{
+    bool rightPaletteVisible = mRightPalette->switchMode(newMode);
+    bool leftPaletteVisible = mLeftPalette->switchMode(newMode);
+
+    switch( newMode )
+    {
+        case eUBDockPaletteWidget_BOARD:
+            {
+                mLeftPalette->assignParent(UBApplication::boardController->controlContainer());
+                mRightPalette->assignParent(UBApplication::boardController->controlContainer());
+                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
+                {
+
+                    if(mKeyboardPalette->m_isVisible)
+                    {
+                        mKeyboardPalette->hide();
+                        mKeyboardPalette->setParent(UBApplication::boardController->controlContainer());
+                        mKeyboardPalette->show();
+                    }
+                    else
+                        mKeyboardPalette->setParent(UBApplication::boardController->controlContainer());
+                }
+
+                mLeftPalette->setVisible(leftPaletteVisible);
+                mRightPalette->setVisible(rightPaletteVisible);
+#ifdef Q_WS_WIN
+                if (rightPaletteVisible)
+                    mRightPalette->setAdditionalVOffset(0);
+#endif
+
+                if( !isInit )
+                    containerResized();
+            }
+            break;
+
+        case eUBDockPaletteWidget_DESKTOP:
+            {
+                mLeftPalette->assignParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
+                mRightPalette->assignParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
+                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
+                {
+
+                    if(mKeyboardPalette->m_isVisible)
+                    {
+                        mKeyboardPalette->hide();
+#ifndef Q_WS_X11
+                        mKeyboardPalette->setParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
+#else
+                        mKeyboardPalette->setParent(0);
+#endif
+                        mKeyboardPalette->show();
+                    }
+                    else
+                        mKeyboardPalette->setParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
+                }
+
+                mLeftPalette->setVisible(leftPaletteVisible);
+                mRightPalette->setVisible(rightPaletteVisible);
+#ifdef Q_WS_WIN
+                if (rightPaletteVisible)
+                    mRightPalette->setAdditionalVOffset(30);
+#endif
+
+                if( !isInit )
+                    UBApplication::applicationController->uninotesController()->TransparentWidgetResized();
+            }
+            break;
+
+        case eUBDockPaletteWidget_WEB:
+            {
+                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
+                {
+                    WBBrowserWindow* brWnd = UBApplication::webController->GetCurrentWebBrowser();
+
+                    if(mKeyboardPalette->m_isVisible)
+                    {
+                        mKeyboardPalette->hide();
+                        mKeyboardPalette->setParent(brWnd);
+                        mKeyboardPalette->show();
+                    }
+                    else
+                        mKeyboardPalette->setParent(brWnd);
+                }
+
+            }
+            break;
+
+        case eUBDockPaletteWidget_DOCUMENT:
+            {
+                mLeftPalette->setVisible(leftPaletteVisible);
+                mRightPalette->setVisible(rightPaletteVisible);
+                mLeftPalette->assignParent(UBApplication::documentController->controlView());
+                mRightPalette->assignParent(UBApplication::documentController->controlView());
+                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
+                {
+
+                    if(mKeyboardPalette->m_isVisible)
+                    {
+                        mKeyboardPalette->hide();
+                        mKeyboardPalette->setParent(UBApplication::documentController->controlView());
+                        mKeyboardPalette->show();
+                    }
+                    else
+                        mKeyboardPalette->setParent(UBApplication::documentController->controlView());                    
+                } 
+            }
+            break;
+
+        default:
+            {
+                mLeftPalette->setVisible(leftPaletteVisible);
+                mRightPalette->setVisible(rightPaletteVisible);
+                mLeftPalette->assignParent(0);
+                mRightPalette->assignParent(0);
+                if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
+                {
+
+                    if(mKeyboardPalette->m_isVisible)
+                    {
+                        mKeyboardPalette->hide();
+                        mKeyboardPalette->setParent(0);
+                        mKeyboardPalette->show();
+                    }
+                    else
+                        mKeyboardPalette->setParent(0);
+                }
+            }
+            break;
+    }
+
+    if( !isInit )
+        UBApplication::boardController->notifyPageChanged();
+
+    emit signal_changeMode(newMode);
+}
+
+/*
+void UBBoardPaletteManager::slot_changeMode(eUBDockPaletteWidgetMode newMode)
+{
+    emit signal_changeMode(newMode);
+}
+*/
+
+void UBBoardPaletteManager::addItem(const QPixmap& pPixmap, const QPointF& pos,  qreal scaleFactor, const QUrl& sourceUrl)
+{
+    mItemUrl = sourceUrl;
+    mPixmap = pPixmap;
+    mPos = pos;
+    mScaleFactor = scaleFactor;
+
+     QRect controlGeo = UBApplication::applicationController->displayManager()->controlGeometry();
+
+    mAddItemPalette->show();
+    mAddItemPalette->adjustSizeAndPosition();
+
+    mAddItemPalette->move(controlGeo.x() + ((controlGeo.width() - mAddItemPalette->geometry().width()) / 2),
+          (controlGeo.y() + (controlGeo.height() - mAddItemPalette->geometry().height()) / 5));
+}
+
+
+void UBBoardPaletteManager::addItemToCurrentPage()
+{
+    UBApplication::applicationController->showBoard();    
+    mAddItemPalette->hide();
+    if(mPixmap.isNull())
+        UBApplication::boardController->downloadURL(mItemUrl);
+    else
+    {
+        UBGraphicsPixmapItem* item = UBApplication::boardController->activeScene()->addPixmap(mPixmap, mPos, mScaleFactor);
+
+        item->setSourceUrl(mItemUrl);
+        item->setSelected(true);
+
+        UBDrawingController::drawingController()->setStylusTool(UBStylusTool::Selector);
+    }
+}
+
+
+void UBBoardPaletteManager::addItemToNewPage()
+{
+    UBApplication::boardController->addScene();
+    addItemToCurrentPage();
+}
+
+
+void UBBoardPaletteManager::addItemToLibrary()
+{
+    if(mPixmap.isNull())
+    {
+       mPixmap = QPixmap(mItemUrl.toLocalFile());
+    }
+
+    if(!mPixmap.isNull())
+    {
+        QString imageDir = UBSettings::settings()->defaultUserImagesDirectory();
+
+        if(mScaleFactor != 1.)
+        {
+             mPixmap = mPixmap.scaled(mScaleFactor * mPixmap.width(), mScaleFactor* mPixmap.height()
+                     , Qt::KeepAspectRatio, Qt::SmoothTransformation);
+        }
+        QImage image = mPixmap.toImage();
+
+        if(NULL != mpLibWidget)
+        {
+            mpLibWidget->libNavigator()->libraryWidget()->libraryController()->importImageOnLibrary(image);
+        }
+    }
+    else
+    {
+        UBApplication::showMessage(tr("Error Adding Image to Library"));
+    }
+
+    mAddItemPalette->hide();
+}
+
+void UBBoardPaletteManager::zoomButtonPressed()
+{
+    mZoomButtonPressedTime = QTime::currentTime();
+
+    mPendingZoomButtonPressed = true;
+    QTimer::singleShot(1000, this, SLOT(zoomButtonReleased()));
+}
+
+
+void UBBoardPaletteManager::zoomButtonReleased()
+{
+    if (mPendingZoomButtonPressed)
+    {
+        if(mZoomButtonPressedTime.msecsTo(QTime::currentTime()) > 900)
+        {
+            mBoardControler->zoomRestore();
+        }
+
+        mPendingZoomButtonPressed = false;
+    }
+}
+
+void UBBoardPaletteManager::panButtonPressed()
+{
+    mPanButtonPressedTime = QTime::currentTime();
+
+    mPendingPanButtonPressed = true;
+    QTimer::singleShot(1000, this, SLOT(panButtonReleased()));
+}
+
+
+void UBBoardPaletteManager::panButtonReleased()
+{
+    if (mPendingPanButtonPressed)
+    {
+        if(mPanButtonPressedTime.msecsTo(QTime::currentTime()) > 900)
+        {
+            mBoardControler->centerRestore();
+        }
+
+        mPendingPanButtonPressed = false;
+    }
+}
+
+void UBBoardPaletteManager::showVirtualKeyboard(bool show)
+{
+    if (mKeyboardPalette)
+        mKeyboardPalette->setVisible(show);
+}
+
+void UBBoardPaletteManager::changeStylusPaletteOrientation(QVariant var)
+{
+    bool bVertical = var.toBool();
+    bool bVisible = mStylusPalette->isVisible();
+
+	// Clean the old palette
+    if(NULL != mStylusPalette)
+    {
+        // TODO : check why this line creates a crash in the application.
+        delete mStylusPalette;
+    }
+
+    // Create the new palette
+    if(bVertical)
+    {
+        mStylusPalette = new UBStylusPalette(mContainer, Qt::Vertical);
+    }
+    else
+    {
+        mStylusPalette = new UBStylusPalette(mContainer, Qt::Horizontal);
+    }
+
+    connect(mStylusPalette, SIGNAL(stylusToolDoubleClicked(int)), UBApplication::boardController, SLOT(stylusToolDoubleClicked(int)));
+    mStylusPalette->setVisible(bVisible); // always show stylus palette at startup
+}
+
+/*
+UBRightPalette* UBBoardPaletteManager::createDesktopRightPalette(QWidget* parent)
+{
+    mpDesktopLibWidget = new UBLibWidget();
+    mDesktopRightPalette = new UBRightPalette(parent);
+    mDesktopRightPalette->registerWidget(mpDesktopLibWidget);
+    mDesktopRightPalette->addTabWidget(mpDesktopLibWidget);
+    mDesktopRightPalette->connectSignals();
+
+    return mDesktopRightPalette;
+}
+*/
+
+void UBBoardPaletteManager::connectToDocumentController()
+{
+    emit connectToDocController();
+}
+
+void UBBoardPaletteManager::refreshPalettes()
+{
+    mRightPalette->update();
+    mLeftPalette->update();
+}
+
+void UBBoardPaletteManager::startDownloads()
+{
+    if(!mDownloadInProgress)
+    {
+        mDownloadInProgress = true;
+        mpDownloadWidget->setVisibleState(true);
+        mRightPalette->addTab(mpDownloadWidget);
+    }
+}
+
+void UBBoardPaletteManager::stopDownloads()
+{
+    if(mDownloadInProgress)
+    {
+        mDownloadInProgress = false;
+        mpDownloadWidget->setVisibleState(false);
+        mRightPalette->removeTab(mpDownloadWidget);
+    }
+}
+
+QRect UBBoardPaletteManager::GetFreeRectGlobalCoords() const
+{
+    QPoint topLeft, bottomRight;
+    if (mLeftPalette) {
+        int x = mLeftPalette->getTabPaletteRect().topRight().x();
+        int y = 0;
+        if (x || y) {
+            topLeft.setX(x);
+            topLeft.setY(y);
+            topLeft = mContainer->mapToGlobal(topLeft);
+        }
+    }
+    if (mRightPalette) {
+        int x = mRightPalette->getTabPaletteRect().topLeft().x();
+        int y = mRightPalette->height();
+        if (x || y) {
+            bottomRight.setX(x);
+            bottomRight.setY(y);
+            bottomRight = mContainer->mapToGlobal(bottomRight);
+        }
+    }
+    return QRect(topLeft, bottomRight);
+}
+
+void UBBoardPaletteManager::ForceTeacherBarToSaveData()
+{
+	mpTeacherBarWidget->saveContent();
+}
+
+void UBBoardPaletteManager::ForceTeacherBarToLoadData()
+{
+	mpTeacherBarWidget->loadContent();
+}