From 3d8deb8c131d5f5f94f30b8609967e76d47983b5 Mon Sep 17 00:00:00 2001
From: Anatoly Mihalchenko <tolik@scand.com>
Date: Tue, 21 Jun 2011 11:46:29 +0200
Subject: [PATCH] Graphics ruler: drawing lines

---
 resources/images/cursors/drawRulerLine.png    | Bin 0 -> 444 bytes
 resources/sankore.qrc                         |   1 +
 src/api/UBWidgetUniboardAPI.cpp               |   3 +-
 src/board/UBBoardView.cpp                     |  26 ++-
 src/board/UBDrawingController.cpp             |   1 +
 src/board/UBDrawingController.h               |   4 +
 src/core/UB.h                                 |  12 +-
 src/core/UBDisplayManager.cpp                 |   6 +
 src/desktop/UBDesktopAnnotationController.cpp |   3 +
 src/domain/UBGraphicsDelegateFrame.cpp        |   1 -
 src/domain/UBGraphicsScene.cpp                |  60 ++++---
 src/domain/UBGraphicsScene.h                  |   8 +-
 src/gui/UBDockPalette.cpp                     |   7 +-
 src/gui/UBFloatingPalette.cpp                 |   3 +
 src/gui/UBResources.cpp                       |   1 +
 src/gui/UBResources.h                         |   1 +
 src/tools/UBAbstractDrawRuler.cpp             |   9 +
 src/tools/UBAbstractDrawRuler.h               |  21 +++
 src/tools/UBGraphicsCompass.cpp               |   8 +-
 src/tools/UBGraphicsProtractor.cpp            |   1 -
 src/tools/UBGraphicsRuler.cpp                 | 165 +++++++++++++-----
 src/tools/UBGraphicsRuler.h                   |  12 +-
 src/tools/tools.pri                           |   6 +-
 23 files changed, 275 insertions(+), 84 deletions(-)
 create mode 100644 resources/images/cursors/drawRulerLine.png
 create mode 100644 src/tools/UBAbstractDrawRuler.cpp
 create mode 100644 src/tools/UBAbstractDrawRuler.h

diff --git a/resources/images/cursors/drawRulerLine.png b/resources/images/cursors/drawRulerLine.png
new file mode 100644
index 0000000000000000000000000000000000000000..999f7703d66dae1639681e63fc28e21af797d040
GIT binary patch
literal 444
zcmeAS@N?(olHy`uVBq!ia0vp^3Lq@N1|*eVE!z&H*pj^6UH*dsXT<kAKoQOYkH}&m
z?E%JaC$sH<j9;EEjv*QM-cCQwcSM21_2`d>|0>giAM^CGh6EVT@eK}I{QXl0@4-Tu
z<AwjkHr#!;Yf8$2XKXR%QkNK4)$A0UsIT~Z&QhT#hw51`ehf?sSZMz^RaVUBXmzyC
zJEfYbf|=6_VpiSgxF>Y1>9n<eoZp3emS4aA_-tLX;5*OBbjR$y*9t`W4hpUJ_jzso
z>L&MgQMI!Tv$XS;6`Twz)D1FNW_l#d@FqipQOydTSzq-^le%lx3;c>pj4yXTeQ3LZ
z)3vB)u^C_eH~4bDkT$gP5kH@}k9Bk2wC?Bw=M21lsEH=z9x;CS(TDk1t9%^e9WRTu
zN85XEJj{D(an7@b;oj5K0!!BFFThYxEpd$~Nl7e8wMs5Z1yT$~28M>Z24=cO1|f#V
uRwf2k21eQjMpgy}o!0HnC>nC}Q!>*kaclUIX8#|kfx*+&&t;ucLK6TUUan#Q

literal 0
HcmV?d00001

diff --git a/resources/sankore.qrc b/resources/sankore.qrc
index 9471e2cd..6af43d5d 100644
--- a/resources/sankore.qrc
+++ b/resources/sankore.qrc
@@ -173,6 +173,7 @@
         <file>images/cursors/rotate.png</file>
         <file>images/cursors/resize.png</file>
         <file>images/cursors/drawCompass.png</file>
+	<file>images/cursors/drawRulerLine.png</file>
         <file>images/print/onepage.png</file>
         <file>images/print/thumbnails.png</file>
         <file>images/print/twopages.png</file>
diff --git a/src/api/UBWidgetUniboardAPI.cpp b/src/api/UBWidgetUniboardAPI.cpp
index c6453de9..b8c1e9a9 100644
--- a/src/api/UBWidgetUniboardAPI.cpp
+++ b/src/api/UBWidgetUniboardAPI.cpp
@@ -179,7 +179,8 @@ void UBWidgetUniboardAPI::drawLineTo(const qreal x, const qreal y, const qreal p
         return;
 
     if (mScene)
-    mScene->drawLineTo(QPointF(x, y), pWidth);
+    mScene->drawLineTo(QPointF(x, y), pWidth, 
+		UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line);
 }
 
 
diff --git a/src/board/UBBoardView.cpp b/src/board/UBBoardView.cpp
index ea51f01b..648e4ec1 100644
--- a/src/board/UBBoardView.cpp
+++ b/src/board/UBBoardView.cpp
@@ -450,15 +450,18 @@ UBBoardView::mousePressEvent (QMouseEvent *event)
 
           event->accept ();
         }
-      else
-        {
-          viewport ()->setCursor (QCursor (Qt::BlankCursor));
-
-          if (scene () && !mTabletStylusIsPressed)
-            {
-              scene ()->inputDevicePress (mapToScene (UBGeometryUtils::pointConstrainedInRect (event->pos (), rect ())));
-            }
-          event->accept ();
+		else
+		{
+			if(UBDrawingController::drawingController()->mActiveRuler==NULL)
+			{
+				viewport()->setCursor (QCursor (Qt::BlankCursor));			
+			}
+
+			if (scene () && !mTabletStylusIsPressed)
+			{
+				scene ()->inputDevicePress (mapToScene (UBGeometryUtils::pointConstrainedInRect (event->pos (), rect ())));
+			}
+			event->accept ();
         }
     }
 }
@@ -487,6 +490,11 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event)
     {
       QGraphicsView::mouseMoveEvent (event);
     }
+  else if ((UBDrawingController::drawingController()->isDrawingTool())
+  	&& !mMouseButtonIsPressed)
+  {
+	QGraphicsView::mouseMoveEvent (event);
+  }
   else if (currentTool == UBStylusTool::Text || currentTool == UBStylusTool::Capture)
     {
       if (mRubberBand && (mIsCreatingTextZone || mIsCreatingSceneGrabZone))
diff --git a/src/board/UBDrawingController.cpp b/src/board/UBDrawingController.cpp
index 8b9d546a..849be774 100644
--- a/src/board/UBDrawingController.cpp
+++ b/src/board/UBDrawingController.cpp
@@ -27,6 +27,7 @@ UBDrawingController::UBDrawingController(QObject * parent)
     : QObject(parent)
     , mStylusTool((UBStylusTool::Enum)-1)
     , mLatestDrawingTool((UBStylusTool::Enum)-1)
+	, mActiveRuler(NULL)
 {
     connect(UBSettings::settings(), SIGNAL(colorContextChanged()), this, SIGNAL(colorPaletteChanged()));
 
diff --git a/src/board/UBDrawingController.h b/src/board/UBDrawingController.h
index 59e66d28..0c2b4a97 100644
--- a/src/board/UBDrawingController.h
+++ b/src/board/UBDrawingController.h
@@ -12,6 +12,8 @@
 
 #include "core/UB.h"
 
+class UBAbstractDrawRuler;
+
 class UBDrawingController : public QObject
 {
     Q_OBJECT;
@@ -39,6 +41,8 @@ class UBDrawingController : public QObject
         void setMarkerColor(bool onDarkBackground, const QColor& color, int pIndex);
         void setMarkerAlpha(qreal alpha);
 
+		UBAbstractDrawRuler* mActiveRuler;
+
     public slots:
 
         void setStylusTool(int tool);
diff --git a/src/core/UB.h b/src/core/UB.h
index 7113250e..369897ca 100644
--- a/src/core/UB.h
+++ b/src/core/UB.h
@@ -16,7 +16,17 @@ struct UBStylusTool
 {
     enum Enum
     {
-        Pen = 0, Eraser, Marker, Selector, Hand, ZoomIn, ZoomOut, Pointer, Line, Text, Capture
+        Pen = 0, 
+		Eraser, 
+		Marker, 
+		Selector, 
+		Hand, 
+		ZoomIn, 
+		ZoomOut, 
+		Pointer, 
+		Line, 
+		Text, 
+		Capture
     };
 };
 
diff --git a/src/core/UBDisplayManager.cpp b/src/core/UBDisplayManager.cpp
index b0dc09b9..6a667560 100644
--- a/src/core/UBDisplayManager.cpp
+++ b/src/core/UBDisplayManager.cpp
@@ -114,7 +114,10 @@ void UBDisplayManager::setAsControl(QWidget* pControlWidget )
         mControlWidget->hide();
         mControlWidget->setGeometry(mDesktop->screenGeometry(mControlScreenIndex));
         mControlWidget->showFullScreen();
+		// !!!! Should be included into Windows after QT recompilation
+#ifndef Q_WS_WIN
         mControlWidget->setAttribute(Qt::WA_MacNoShadow);
+#endif
     }
 }
 
@@ -127,7 +130,10 @@ void UBDisplayManager::setAsDisplay(QWidget* pDisplayWidget)
         mDisplayWidget->hide();
         mDisplayWidget->setGeometry(mDesktop->screenGeometry(mDisplayScreenIndex));
         mDisplayWidget->showFullScreen();
+		// !!!! Should be included into Windows after QT recompilation
+#ifndef Q_WS_WIN
         mDisplayWidget->setAttribute(Qt::WA_MacNoShadow);
+#endif
     }
 }
 
diff --git a/src/desktop/UBDesktopAnnotationController.cpp b/src/desktop/UBDesktopAnnotationController.cpp
index 7224a673..5f2e1a9a 100644
--- a/src/desktop/UBDesktopAnnotationController.cpp
+++ b/src/desktop/UBDesktopAnnotationController.cpp
@@ -60,7 +60,10 @@ UBDesktopAnnotationController::UBDesktopAnnotationController(QObject *parent)
     mTransparentDrawingView = new UBBoardView(UBApplication::boardController, 0); // deleted in UBDesktopAnnotationController::destructor
 
     mTransparentDrawingView->setAttribute(Qt::WA_TranslucentBackground, true);
+	// !!!! Should be included into Windows after QT recompilation
+#ifndef Q_WS_WIN
     mTransparentDrawingView->setAttribute(Qt::WA_MacNoShadow, true);
+#endif
     mTransparentDrawingView->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Window);
     mTransparentDrawingView->setCacheMode(QGraphicsView::CacheNone);
     mTransparentDrawingView->resize(UBApplication::desktop()->width(), UBApplication::desktop()->height());
diff --git a/src/domain/UBGraphicsDelegateFrame.cpp b/src/domain/UBGraphicsDelegateFrame.cpp
index 4d743305..50d0433b 100644
--- a/src/domain/UBGraphicsDelegateFrame.cpp
+++ b/src/domain/UBGraphicsDelegateFrame.cpp
@@ -19,7 +19,6 @@
 
 #include "gui/UBResources.h"
 
-const double PI = 4.0 * atan(1.0);
 qreal const UBGraphicsDelegateFrame::mAngleTolerance = 6;
 
 UBGraphicsDelegateFrame::UBGraphicsDelegateFrame(UBGraphicsItemDelegate* pDelegate, QRectF pRect, qreal pFrameWidth, bool respectRatio)
diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp
index 2b400f55..31bd2934 100644
--- a/src/domain/UBGraphicsScene.cpp
+++ b/src/domain/UBGraphicsScene.cpp
@@ -59,8 +59,6 @@ qreal UBGraphicsScene::toolOffsetEraser = 200;
 qreal UBGraphicsScene::toolOffsetCurtain = 1000;
 qreal UBGraphicsScene::toolOffsetPointer = 1100;
 
-const double PI = 4.0 * atan(1.0);
-
 UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent)
     : UBCoreGraphicsScene(parent)
     , mEraser(0)
@@ -163,8 +161,18 @@ bool UBGraphicsScene::inputDevicePress(const QPointF& scenePos, const qreal& pre
 
             mAddedItems.clear();
             mRemovedItems.clear();
-            moveTo(scenePos);
-            drawLineTo(scenePos, width);
+
+			if (UBDrawingController::drawingController()->mActiveRuler)
+			{
+				UBDrawingController::drawingController()->mActiveRuler->StartLine(
+					scenePos, width);
+			}
+			else
+			{
+				moveTo(scenePos);
+				drawLineTo(scenePos, width,
+					UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line);
+			}
             accepted = true;
         }
         else if (currentTool == UBStylusTool::Eraser)
@@ -220,21 +228,29 @@ bool UBGraphicsScene::inputDeviceMove(const QPointF& scenePos, const qreal& pres
             width /= UBApplication::boardController->systemScaleFactor();
             width /= UBApplication::boardController->currentZoom();
 
-            if (currentTool == UBStylusTool::Line)
-            {
-                QLineF radius(mPreviousPoint, position);
-                qreal angle = radius.angle();
-                angle = qRound(angle / 45) * 45;
-                qreal radiusLength = radius.length();
-                QPointF newPosition(
-                    mPreviousPoint.x() + radiusLength * cos((angle * PI) / 180),
-                    mPreviousPoint.y() - radiusLength * sin((angle * PI) / 180));
-                QLineF chord(position, newPosition);
-                if (chord.length() < qMin((int)16, (int)(radiusLength / 20)))
-                    position = newPosition;
-            }
-
-            drawLineTo(position, width);
+			if (dc->mActiveRuler)
+			{
+				dc->mActiveRuler->DrawLine(position, width);
+			}
+			else
+			{
+	            if (currentTool == UBStylusTool::Line)
+		        {
+			        QLineF radius(mPreviousPoint, position);
+				    qreal angle = radius.angle();
+					angle = qRound(angle / 45) * 45;
+	                qreal radiusLength = radius.length();
+		            QPointF newPosition(
+			            mPreviousPoint.x() + radiusLength * cos((angle * PI) / 180),
+				        mPreviousPoint.y() - radiusLength * sin((angle * PI) / 180));
+					QLineF chord(position, newPosition);
+					if (chord.length() < qMin((int)16, (int)(radiusLength / 20)))
+						position = newPosition;
+				}
+
+				drawLineTo(position, width,
+					UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line);
+			}
         }
         else if (currentTool == UBStylusTool::Eraser)
         {
@@ -348,7 +364,7 @@ void UBGraphicsScene::moveTo(const QPointF &pPoint)
 }
 
 
-void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth)
+void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth, bool bLineStyle)
 {
     if (mPreviousWidth == -1.0)
         mPreviousWidth = pWidth;
@@ -364,7 +380,7 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth)
         }
     }
 
-    if (UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line)
+	if (bLineStyle)
     {
         QSetIterator<QGraphicsItem*> itItems(mAddedItems);
 
@@ -388,7 +404,7 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth)
 
     mPreviousPolygonItems.append(polygonItem);
 
-    if (UBDrawingController::drawingController()->stylusTool() != UBStylusTool::Line)
+	if (!bLineStyle)
     {
         mPreviousPoint = pEndPoint;
         mPreviousWidth = pWidth;
diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h
index d07793f8..3302a449 100644
--- a/src/domain/UBGraphicsScene.h
+++ b/src/domain/UBGraphicsScene.h
@@ -37,6 +37,7 @@ class UBDocumentProxy;
 class UBGraphicsCurtainItem;
 class UBGraphicsStroke;
 
+const double PI = 4.0 * atan(1.0);
 
 class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem
 {
@@ -99,7 +100,7 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem
         QRectF normalizedSceneRect(qreal ratio = -1.0);
 
         void moveTo(const QPointF& pPoint);
-        void drawLineTo(const QPointF& pEndPoint, const qreal& pWidth);
+        void drawLineTo(const QPointF& pEndPoint, const qreal& pWidth, bool bLineStyle);
         void eraseLineTo(const QPointF& pEndPoint, const qreal& pWidth);
         void drawArcTo(const QPointF& pCenterPoint, qreal pSpanAngle);
 
@@ -240,6 +241,11 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem
             mTools << item;
         }
 
+		const QPointF& previousPoint()
+		{
+			return mPreviousPoint;
+		}
+
     public slots:
 
         void hideEraser();
diff --git a/src/gui/UBDockPalette.cpp b/src/gui/UBDockPalette.cpp
index 723619bc..aae28de1 100644
--- a/src/gui/UBDockPalette.cpp
+++ b/src/gui/UBDockPalette.cpp
@@ -33,7 +33,12 @@ UBDockPalette::UBDockPalette(QWidget *parent, const char *name)
     {
 	// standalone window
 	setAttribute(Qt::WA_TranslucentBackground);
-	setAttribute(Qt::WA_MacNoShadow);
+
+	// !!!! Should be included into Windows after QT recompilation
+#ifndef Q_WS_WIN
+		setAttribute(Qt::WA_MacNoShadow);
+#endif
+
     }
 
     mBackgroundBrush = QBrush(UBSettings::paletteColor);
diff --git a/src/gui/UBFloatingPalette.cpp b/src/gui/UBFloatingPalette.cpp
index 3f83764a..2338dae1 100644
--- a/src/gui/UBFloatingPalette.cpp
+++ b/src/gui/UBFloatingPalette.cpp
@@ -26,10 +26,13 @@ UBFloatingPalette::UBFloatingPalette(Qt::Corner position, QWidget *parent)
     else
     {
         // standalone window
+		// !!!! Should be included into Windows after QT recompilation
+#ifndef Q_WS_WIN
         setAttribute(Qt::WA_TranslucentBackground);
         setAttribute(Qt::WA_MacAlwaysShowToolWindow);
         setAttribute(Qt::WA_MacNonActivatingToolWindow);
         setAttribute(Qt::WA_MacNoShadow);
+#endif
     }
 
     mBackgroundBrush = QBrush(UBSettings::paletteColor);
diff --git a/src/gui/UBResources.cpp b/src/gui/UBResources.cpp
index 2fe8cecf..0ec5770f 100644
--- a/src/gui/UBResources.cpp
+++ b/src/gui/UBResources.cpp
@@ -43,4 +43,5 @@ void UBResources::init()
     arrowCursor   = QCursor(Qt::ArrowCursor);
     textCursor    = QCursor(Qt::ArrowCursor);
     rotateCursor  = QCursor(QPixmap(":/images/cursors/rotate.png"), 16, 16);
+	drawLineRulerCursor = QCursor(QPixmap(":/images/cursors/drawRulerLine.png"), 3, 12);
 }
diff --git a/src/gui/UBResources.h b/src/gui/UBResources.h
index 6bd21d1c..7f689ba1 100644
--- a/src/gui/UBResources.h
+++ b/src/gui/UBResources.h
@@ -31,6 +31,7 @@ class UBResources : public QObject
          QCursor arrowCursor;
          QCursor textCursor;
          QCursor rotateCursor;
+		 QCursor drawLineRulerCursor;
 };
 
 #endif /* UBRESOURCES_H_ */
diff --git a/src/tools/UBAbstractDrawRuler.cpp b/src/tools/UBAbstractDrawRuler.cpp
new file mode 100644
index 00000000..906895b6
--- /dev/null
+++ b/src/tools/UBAbstractDrawRuler.cpp
@@ -0,0 +1,9 @@
+
+#include "UBAbstractDrawRuler.h"
+
+UBAbstractDrawRuler::UBAbstractDrawRuler()
+{}
+
+
+UBAbstractDrawRuler::~UBAbstractDrawRuler()
+{}
diff --git a/src/tools/UBAbstractDrawRuler.h b/src/tools/UBAbstractDrawRuler.h
new file mode 100644
index 00000000..ae2f423f
--- /dev/null
+++ b/src/tools/UBAbstractDrawRuler.h
@@ -0,0 +1,21 @@
+#ifndef UB_ABSTRACTDRAWRULER_H_
+#define UB_ABSTRACTDRAWRULER_H_
+
+#include <QtGui>
+class UBGraphicsScene;
+
+class UBAbstractDrawRuler : public QObject
+{
+    Q_OBJECT;
+
+    public:
+		UBAbstractDrawRuler();
+		~UBAbstractDrawRuler();
+
+		virtual void StartLine(const QPointF& position, qreal width) = 0;
+		virtual void DrawLine(const QPointF& position, qreal width) = 0;
+		virtual void EndLine() = 0;
+
+};
+
+#endif
\ No newline at end of file
diff --git a/src/tools/UBGraphicsCompass.cpp b/src/tools/UBGraphicsCompass.cpp
index f5495713..ef3489bd 100644
--- a/src/tools/UBGraphicsCompass.cpp
+++ b/src/tools/UBGraphicsCompass.cpp
@@ -16,8 +16,6 @@
 #include "board/UBBoardController.h" // TODO UB 4.x clean that dependency
 #include "board/UBDrawingController.h" // TODO UB 4.x clean that dependency
 
-const double PI = 4.0 * atan(1.0);
-
 const QRect UBGraphicsCompass::sDefaultRect = QRect(0, -20, 300, 48);
 const QColor UBGraphicsCompass::sLightBackgroundMiddleFillColor = QColor(0x72, 0x72, 0x72, sFillTransparency);
 const QColor UBGraphicsCompass::sLightBackgroundEdgeFillColor = QColor(0xc3, 0xc3, 0xc3, sFillTransparency);
@@ -511,9 +509,11 @@ void UBGraphicsCompass::paintCenterCross()
 {
     QPointF needleCrossCenter = mapToScene(needlePosition());
     scene()->moveTo(QPointF(needleCrossCenter.x() - 5, needleCrossCenter.y()));
-    scene()->drawLineTo(QPointF(needleCrossCenter.x() + 5, needleCrossCenter.y()), 1);
+    scene()->drawLineTo(QPointF(needleCrossCenter.x() + 5, needleCrossCenter.y()), 1,
+		UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line);
     scene()->moveTo(QPointF(needleCrossCenter.x(), needleCrossCenter.y() - 5));
-    scene()->drawLineTo(QPointF(needleCrossCenter.x(), needleCrossCenter.y() + 5), 1);
+    scene()->drawLineTo(QPointF(needleCrossCenter.x(), needleCrossCenter.y() + 5), 1,
+		UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line);
 }
 
 QPointF UBGraphicsCompass::needlePosition() const
diff --git a/src/tools/UBGraphicsProtractor.cpp b/src/tools/UBGraphicsProtractor.cpp
index da38a1d2..bed25022 100644
--- a/src/tools/UBGraphicsProtractor.cpp
+++ b/src/tools/UBGraphicsProtractor.cpp
@@ -13,7 +13,6 @@
 #include "board/UBBoardController.h"
 
 
-const double PI = 4.0 * atan(1.0);
 const int UBGraphicsProtractor::sFillTransparency = 127;
 const int UBGraphicsProtractor::sDrawTransparency = 192;
 const QRectF                   UBGraphicsProtractor::sDefaultRect = QRectF(-175, -175, 350, 350);
diff --git a/src/tools/UBGraphicsRuler.cpp b/src/tools/UBGraphicsRuler.cpp
index b8b7a08d..85fa5991 100644
--- a/src/tools/UBGraphicsRuler.cpp
+++ b/src/tools/UBGraphicsRuler.cpp
@@ -13,6 +13,7 @@
 #include "core/UBApplication.h"
 #include "gui/UBResources.h"
 #include "board/UBBoardController.h" // TODO UB 4.x clean that dependency
+#include "board/UBDrawingController.h"
 
 const QRect                     UBGraphicsRuler::sDefaultRect = QRect(0, 0, 800, 96);
 const QColor UBGraphicsRuler::sLightBackgroundMiddleFillColor = QColor(0x72, 0x72, 0x72, sFillTransparency);
@@ -200,29 +201,40 @@ void UBGraphicsRuler::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 
 void UBGraphicsRuler::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
 {
-    mCloseSvgItem->setParentItem(this);
-    mResizeSvgItem->setParentItem(this);
-    mRotateSvgItem->setParentItem(this);
-
-    mShowButtons = true;
-    mCloseSvgItem->setVisible(mShowButtons);
-    mResizeSvgItem->setVisible(mShowButtons);
-    mRotateSvgItem->setVisible(mShowButtons);
-    if (event->pos().x() >= resizeButtonRect().left())
-    {
-        setCursor(resizeCursor());
-    }
-    else
-    {
-        if (closeButtonRect().contains(event->pos()))
-            setCursor(closeCursor());
-        else if (rotateButtonRect().contains(event->pos()))
-            setCursor(rotateCursor());
-        else
-            setCursor(moveCursor());
-    }
-    event->accept();
-    update();
+	UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool ();
+
+	if (currentTool == UBStylusTool::Selector)
+	{
+		mCloseSvgItem->setParentItem(this);
+	    mResizeSvgItem->setParentItem(this);
+		mRotateSvgItem->setParentItem(this);
+
+	    mShowButtons = true;
+		mCloseSvgItem->setVisible(mShowButtons);
+		mResizeSvgItem->setVisible(mShowButtons);
+	    mRotateSvgItem->setVisible(mShowButtons);
+		if (event->pos().x() >= resizeButtonRect().left())
+		{
+			setCursor(resizeCursor());
+		}
+		else
+		{
+			if (closeButtonRect().contains(event->pos()))
+				setCursor(closeCursor());
+			else if (rotateButtonRect().contains(event->pos()))
+				setCursor(rotateCursor());
+			else
+				setCursor(moveCursor());
+		}
+		event->accept();
+		update();
+	}
+	else if (UBDrawingController::drawingController()->isDrawingTool())
+	{
+		setCursor(drawRulerLineCursor());
+		UBDrawingController::drawingController()->mActiveRuler = this;
+		event->accept();
+	}
 }
 
 void UBGraphicsRuler::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
@@ -232,29 +244,39 @@ void UBGraphicsRuler::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
     mCloseSvgItem->setVisible(mShowButtons);
     mResizeSvgItem->setVisible(mShowButtons);
     mRotateSvgItem->setVisible(mShowButtons);
+	UBDrawingController::drawingController()->mActiveRuler = NULL;
     event->accept();
     update();
 }
 
 void UBGraphicsRuler::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
 {
-    mCloseSvgItem->setVisible(mShowButtons);
-    mResizeSvgItem->setVisible(mShowButtons);
-    mRotateSvgItem->setVisible(mShowButtons);
-    if (event->pos().x() >= resizeButtonRect().left())
-    {
-        setCursor(resizeCursor());
-    }
-    else
-    {
-        if (closeButtonRect().contains(event->pos()))
-            setCursor(closeCursor());
-        else if (rotateButtonRect().contains(event->pos()))
-            setCursor(rotateCursor());
-        else
-            setCursor(moveCursor());
-    }
-    event->accept();
+	UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool ();
+
+	if (currentTool == UBStylusTool::Selector)
+	{
+		mCloseSvgItem->setVisible(mShowButtons);
+		mResizeSvgItem->setVisible(mShowButtons);
+		mRotateSvgItem->setVisible(mShowButtons);
+		if (event->pos().x() >= resizeButtonRect().left())
+		{
+			setCursor(resizeCursor());
+		}
+		else
+		{
+			if (closeButtonRect().contains(event->pos()))
+				setCursor(closeCursor());
+			else if (rotateButtonRect().contains(event->pos()))
+				setCursor(rotateCursor());
+			else
+				setCursor(moveCursor());
+		}
+		event->accept();
+	}
+	else if (currentTool == UBStylusTool::Pen || currentTool == UBStylusTool::Marker)
+	{
+		event->accept();
+	}
 }
 
 void UBGraphicsRuler::fillBackground(QPainter *painter)
@@ -456,3 +478,66 @@ void UBGraphicsRuler::updateResizeCursor()
     QCursor resizeCursor  = QCursor(pix.transformed(tr, Qt::SmoothTransformation), pix.width() / 2,  pix.height() / 2);
     mResizeCursor = resizeCursor;
 }
+
+QCursor UBGraphicsRuler::drawRulerLineCursor() const
+{
+	return UBResources::resources()->drawLineRulerCursor;
+}
+
+void UBGraphicsRuler::StartLine(const QPointF& scenePos, qreal width)
+{
+	QPointF itemPos = mapFromScene(scenePos);
+
+	qreal y;
+
+	if (itemPos.y() > rect().y() + rect().height() / 2)
+	{
+		drawLineDirection = 0;
+		y = rect().y() + rect().height() + width / 2;
+	}
+	else
+	{
+		drawLineDirection = 1;
+		y = rect().y() - width /2;
+	}
+	
+	if (itemPos.x() < rect().x() + sLeftEdgeMargin)
+		itemPos.setX(rect().x() + sLeftEdgeMargin);
+	if (itemPos.x() > rect().x() + rect().width() - sLeftEdgeMargin)
+		itemPos.setX(rect().x() + rect().width() - sLeftEdgeMargin);
+
+	itemPos.setY(y);
+	itemPos = mapToScene(itemPos);
+
+	scene()->moveTo(itemPos);
+	scene()->drawLineTo(itemPos, width, true);
+}
+
+void UBGraphicsRuler::DrawLine(const QPointF& scenePos, qreal width)
+{
+	QPointF itemPos = mapFromScene(scenePos);
+
+	qreal y;
+	if (drawLineDirection == 0)
+	{
+		y = rect().y() + rect().height() + width / 2;
+	}
+	else
+	{
+		y = rect().y() - width /2;
+	}
+	if (itemPos.x() < rect().x() + sLeftEdgeMargin)
+		itemPos.setX(rect().x() + sLeftEdgeMargin);
+	if (itemPos.x() > rect().x() + rect().width() - sLeftEdgeMargin)
+		itemPos.setX(rect().x() + rect().width() - sLeftEdgeMargin);
+
+	itemPos.setY(y);
+	itemPos = mapToScene(itemPos);
+
+	// We have to use "pointed" line for marker tool
+	scene()->drawLineTo(itemPos, width, 
+		UBDrawingController::drawingController()->stylusTool() != UBStylusTool::Marker);
+}
+
+void UBGraphicsRuler::EndLine()
+{}
diff --git a/src/tools/UBGraphicsRuler.h b/src/tools/UBGraphicsRuler.h
index 1715aab2..9add46b8 100644
--- a/src/tools/UBGraphicsRuler.h
+++ b/src/tools/UBGraphicsRuler.h
@@ -14,10 +14,11 @@
 
 #include "core/UB.h"
 #include "domain/UBItem.h"
+#include "tools/UBAbstractDrawRuler.h"
 
 class UBGraphicsScene;
 
-class UBGraphicsRuler : public QObject, public QGraphicsRectItem, public UBItem
+class UBGraphicsRuler : public UBAbstractDrawRuler, public QGraphicsRectItem, public UBItem
 {
     Q_OBJECT;
 
@@ -34,6 +35,10 @@ class UBGraphicsRuler : public QObject, public QGraphicsRectItem, public UBItem
 
         virtual UBItem* deepCopy() const;
 
+		virtual void StartLine(const QPointF& position, qreal width);
+		virtual void DrawLine(const QPointF& position, qreal width);
+		virtual void EndLine();
+
     signals:
 
         void hidden();
@@ -63,6 +68,7 @@ class UBGraphicsRuler : public QObject, public QGraphicsRectItem, public UBItem
         QCursor              resizeCursor() const;
         QCursor              rotateCursor() const;
         QCursor               closeCursor() const;
+		QCursor				drawRulerLineCursor() const;
         QRectF           resizeButtonRect() const;
         QRectF            closeButtonRect() const;
         QRectF           rotateButtonRect() const;
@@ -72,6 +78,8 @@ class UBGraphicsRuler : public QObject, public QGraphicsRectItem, public UBItem
         QColor              edgeFillColor() const;
         QFont                        font() const;
 
+		int drawLineDirection;
+
         // Members
         bool mResizing;
         bool mRotating;
@@ -82,6 +90,8 @@ class UBGraphicsRuler : public QObject, public QGraphicsRectItem, public UBItem
         QCursor mResizeCursor;
         qreal mAntiScaleRatio;
 
+		QPointF startDrawPosition;
+
         // Constants
         static const QRect               sDefaultRect;
         static const int              sLeftEdgeMargin = 10;
diff --git a/src/tools/tools.pri b/src/tools/tools.pri
index bd72cb16..690a444b 100644
--- a/src/tools/tools.pri
+++ b/src/tools/tools.pri
@@ -4,11 +4,13 @@ HEADERS      += src/tools/UBGraphicsRuler.h \
                 src/tools/UBGraphicsCompass.h \
                 src/tools/UBToolsManager.h  \
                 src/tools/UBGraphicsCurtainItem.h \
-                src/tools/UBGraphicsCurtainItemDelegate.h
+                src/tools/UBGraphicsCurtainItemDelegate.h \
+                src/tools/UBAbstractDrawRuler.h
                 
 SOURCES      += src/tools/UBGraphicsRuler.cpp \
                 src/tools/UBGraphicsProtractor.cpp \
                 src/tools/UBGraphicsCompass.cpp \
                 src/tools/UBToolsManager.cpp \
                 src/tools/UBGraphicsCurtainItem.cpp \
-                src/tools/UBGraphicsCurtainItemDelegate.cpp \
\ No newline at end of file
+                src/tools/UBGraphicsCurtainItemDelegate.cpp \
+                src/tools/UBAbstractDrawRuler.cpp
\ No newline at end of file