| @@ -9299,16 +9299,154 @@ private: | |||
| /*** End of inlined file: juce_ModifierKeys.h ***/ | |||
| /*** Start of inlined file: juce_Point.h ***/ | |||
| #ifndef __JUCE_POINT_JUCEHEADER__ | |||
| #define __JUCE_POINT_JUCEHEADER__ | |||
| /*** Start of inlined file: juce_AffineTransform.h ***/ | |||
| #ifndef __JUCE_AFFINETRANSFORM_JUCEHEADER__ | |||
| #define __JUCE_AFFINETRANSFORM_JUCEHEADER__ | |||
| class JUCE_API AffineTransform | |||
| { | |||
| public: | |||
| AffineTransform() throw(); | |||
| AffineTransform (const AffineTransform& other) throw(); | |||
| AffineTransform (const float mat00, const float mat01, const float mat02, | |||
| const float mat10, const float mat11, const float mat12) throw(); | |||
| const AffineTransform& operator= (const AffineTransform& other) throw(); | |||
| bool operator== (const AffineTransform& other) const throw(); | |||
| bool operator!= (const AffineTransform& other) const throw(); | |||
| static const AffineTransform identity; | |||
| void transformPoint (float& x, | |||
| float& y) const throw(); | |||
| void transformPoint (double& x, | |||
| double& y) const throw(); | |||
| const AffineTransform translated (const float deltaX, | |||
| const float deltaY) const throw(); | |||
| static const AffineTransform translation (const float deltaX, | |||
| const float deltaY) throw(); | |||
| const AffineTransform rotated (const float angleInRadians) const throw(); | |||
| const AffineTransform rotated (const float angleInRadians, | |||
| const float pivotX, | |||
| const float pivotY) const throw(); | |||
| static const AffineTransform rotation (const float angleInRadians) throw(); | |||
| static const AffineTransform rotation (const float angleInRadians, | |||
| const float pivotX, | |||
| const float pivotY) throw(); | |||
| const AffineTransform scaled (const float factorX, | |||
| const float factorY) const throw(); | |||
| static const AffineTransform scale (const float factorX, | |||
| const float factorY) throw(); | |||
| const AffineTransform sheared (const float shearX, | |||
| const float shearY) const throw(); | |||
| const AffineTransform inverted() const throw(); | |||
| const AffineTransform followedBy (const AffineTransform& other) const throw(); | |||
| bool isIdentity() const throw(); | |||
| bool isSingularity() const throw(); | |||
| bool isOnlyTranslation() const throw(); | |||
| float getTranslationX() const throw() { return mat02; } | |||
| float getTranslationY() const throw() { return mat12; } | |||
| juce_UseDebuggingNewOperator | |||
| float mat00, mat01, mat02; | |||
| float mat10, mat11, mat12; | |||
| private: | |||
| const AffineTransform followedBy (const float mat00, const float mat01, const float mat02, | |||
| const float mat10, const float mat11, const float mat12) const throw(); | |||
| }; | |||
| #endif // __JUCE_AFFINETRANSFORM_JUCEHEADER__ | |||
| /*** End of inlined file: juce_AffineTransform.h ***/ | |||
| template <typename ValueType> | |||
| class Point | |||
| { | |||
| public: | |||
| Point() throw() : x (0), y (0) {} | |||
| Point (const Point& other) throw() : x (other.x), y (other.y) {} | |||
| Point (const ValueType initialX, const ValueType initialY) throw() : x (initialX), y (initialY) {} | |||
| ~Point() throw() {} | |||
| Point& operator= (const Point& other) throw() { x = other.x; y = other.y; return *this; } | |||
| inline ValueType getX() const throw() { return x; } | |||
| inline ValueType getY() const throw() { return y; } | |||
| inline bool operator== (const Point& other) const throw() { return x == other.x && y == other.y; } | |||
| inline bool operator!= (const Point& other) const throw() { return x != other.x || y != other.y; } | |||
| bool isOrigin() const throw() { return x == ValueType() && y == ValueType(); } | |||
| void setXY (const ValueType newX, const ValueType newY) throw() { x = newX; y = newY; } | |||
| void addXY (const ValueType xToAdd, const ValueType yToAdd) throw() { x += xToAdd; y += yToAdd; } | |||
| const Point operator+ (const Point& other) const throw() { return Point (x + other.x, y + other.y); } | |||
| Point& operator+= (const Point& other) throw() { x += other.x; y += other.y; return *this; } | |||
| const Point operator- (const Point& other) const throw() { return Point (x - other.x, y - other.y); } | |||
| Point& operator-= (const Point& other) throw() { x -= other.x; y -= other.y; return *this; } | |||
| ValueType getDistanceFrom (const Point& other) const throw() { return (ValueType) juce_hypot (x - other.x, y - other.y); } | |||
| void applyTransform (const AffineTransform& transform) throw() { transform.transformPoint (x, y); } | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| ValueType x, y; | |||
| }; | |||
| #endif // __JUCE_POINT_JUCEHEADER__ | |||
| /*** End of inlined file: juce_Point.h ***/ | |||
| class JUCE_API MouseEvent | |||
| { | |||
| public: | |||
| MouseEvent (const int x, const int y, | |||
| MouseEvent (const Point<int>& position, | |||
| const ModifierKeys& modifiers, | |||
| Component* const originator, | |||
| const Time& eventTime, | |||
| const int mouseDownX, | |||
| const int mouseDownY, | |||
| const Point<int> mouseDownPos, | |||
| const Time& mouseDownTime, | |||
| const int numberOfClicks, | |||
| const bool mouseWasDragged) throw(); | |||
| @@ -9331,6 +9469,8 @@ public: | |||
| int getMouseDownY() const throw(); | |||
| const Point<int> getMouseDownPosition() const throw(); | |||
| int getDistanceFromDragStart() const throw(); | |||
| int getDistanceFromDragStartX() const throw(); | |||
| @@ -9343,13 +9483,19 @@ public: | |||
| int getLengthOfMousePress() const throw(); | |||
| int getScreenX() const throw(); | |||
| const Point<int> getPosition() const throw(); | |||
| int getScreenX() const; | |||
| int getScreenY() const throw(); | |||
| int getScreenY() const; | |||
| int getMouseDownScreenX() const throw(); | |||
| const Point<int> getScreenPosition() const; | |||
| int getMouseDownScreenY() const throw(); | |||
| int getMouseDownScreenX() const; | |||
| int getMouseDownScreenY() const; | |||
| const Point<int> getMouseDownScreenPosition() const; | |||
| const MouseEvent getEventRelativeTo (Component* const otherComponent) const throw(); | |||
| @@ -9360,7 +9506,7 @@ public: | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| int mouseDownX, mouseDownY; | |||
| Point<int> mouseDownPos; | |||
| Time mouseDownTime; | |||
| int numberOfClicks; | |||
| bool wasMovedSinceMouseDown; | |||
| @@ -9619,138 +9765,6 @@ public: | |||
| #define __JUCE_PATH_JUCEHEADER__ | |||
| /*** Start of inlined file: juce_AffineTransform.h ***/ | |||
| #ifndef __JUCE_AFFINETRANSFORM_JUCEHEADER__ | |||
| #define __JUCE_AFFINETRANSFORM_JUCEHEADER__ | |||
| class JUCE_API AffineTransform | |||
| { | |||
| public: | |||
| AffineTransform() throw(); | |||
| AffineTransform (const AffineTransform& other) throw(); | |||
| AffineTransform (const float mat00, const float mat01, const float mat02, | |||
| const float mat10, const float mat11, const float mat12) throw(); | |||
| const AffineTransform& operator= (const AffineTransform& other) throw(); | |||
| bool operator== (const AffineTransform& other) const throw(); | |||
| bool operator!= (const AffineTransform& other) const throw(); | |||
| static const AffineTransform identity; | |||
| void transformPoint (float& x, | |||
| float& y) const throw(); | |||
| void transformPoint (double& x, | |||
| double& y) const throw(); | |||
| const AffineTransform translated (const float deltaX, | |||
| const float deltaY) const throw(); | |||
| static const AffineTransform translation (const float deltaX, | |||
| const float deltaY) throw(); | |||
| const AffineTransform rotated (const float angleInRadians) const throw(); | |||
| const AffineTransform rotated (const float angleInRadians, | |||
| const float pivotX, | |||
| const float pivotY) const throw(); | |||
| static const AffineTransform rotation (const float angleInRadians) throw(); | |||
| static const AffineTransform rotation (const float angleInRadians, | |||
| const float pivotX, | |||
| const float pivotY) throw(); | |||
| const AffineTransform scaled (const float factorX, | |||
| const float factorY) const throw(); | |||
| static const AffineTransform scale (const float factorX, | |||
| const float factorY) throw(); | |||
| const AffineTransform sheared (const float shearX, | |||
| const float shearY) const throw(); | |||
| const AffineTransform inverted() const throw(); | |||
| const AffineTransform followedBy (const AffineTransform& other) const throw(); | |||
| bool isIdentity() const throw(); | |||
| bool isSingularity() const throw(); | |||
| bool isOnlyTranslation() const throw(); | |||
| float getTranslationX() const throw() { return mat02; } | |||
| float getTranslationY() const throw() { return mat12; } | |||
| juce_UseDebuggingNewOperator | |||
| float mat00, mat01, mat02; | |||
| float mat10, mat11, mat12; | |||
| private: | |||
| const AffineTransform followedBy (const float mat00, const float mat01, const float mat02, | |||
| const float mat10, const float mat11, const float mat12) const throw(); | |||
| }; | |||
| #endif // __JUCE_AFFINETRANSFORM_JUCEHEADER__ | |||
| /*** End of inlined file: juce_AffineTransform.h ***/ | |||
| /*** Start of inlined file: juce_Point.h ***/ | |||
| #ifndef __JUCE_POINT_JUCEHEADER__ | |||
| #define __JUCE_POINT_JUCEHEADER__ | |||
| template <typename ValueType> | |||
| class Point | |||
| { | |||
| public: | |||
| Point() throw() : x (0), y (0) {} | |||
| Point (const Point& other) throw() : x (other.x), y (other.y) {} | |||
| Point (const ValueType initialX, const ValueType initialY) throw() : x (initialX), y (initialY) {} | |||
| ~Point() throw() {} | |||
| Point& operator= (const Point& other) throw() { x = other.x; y = other.y; return *this; } | |||
| inline ValueType getX() const throw() { return x; } | |||
| inline ValueType getY() const throw() { return y; } | |||
| void setXY (const ValueType newX, const ValueType newY) throw() { x = newX; y = newY; } | |||
| void addXY (const ValueType xToAdd, const ValueType yToAdd) throw() { x += xToAdd; y += yToAdd; } | |||
| const Point operator+ (const Point& other) const throw() { return Point (x + other.x, y + other.y); } | |||
| Point& operator+= (const Point& other) throw() { x += other.x; y += other.y; return *this; } | |||
| const Point operator- (const Point& other) const throw() { return Point (x - other.x, y - other.y); } | |||
| Point& operator-= (const Point& other) throw() { x -= other.x; y -= other.y; return *this; } | |||
| void applyTransform (const AffineTransform& transform) throw() { transform.transformPoint (x, y); } | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| ValueType x, y; | |||
| }; | |||
| #endif // __JUCE_POINT_JUCEHEADER__ | |||
| /*** End of inlined file: juce_Point.h ***/ | |||
| /*** Start of inlined file: juce_Rectangle.h ***/ | |||
| #ifndef __JUCE_RECTANGLE_JUCEHEADER__ | |||
| #define __JUCE_RECTANGLE_JUCEHEADER__ | |||
| @@ -9810,10 +9824,14 @@ public: | |||
| inline ValueType getCentreY() const throw() { return y + h / (ValueType) 2; } | |||
| inline const Point<ValueType> getCentre() const throw() { return Point<ValueType> (x + w / (ValueType) 2, y + h / (ValueType) 2); } | |||
| bool isEmpty() const throw() { return w <= 0 || h <= 0; } | |||
| const Point<ValueType> getPosition() const throw() { return Point<ValueType> (x, y); } | |||
| void setPosition (const Point<ValueType>& newPos) throw() { x = newPos.getX(); y = newPos.getY(); } | |||
| void setPosition (const ValueType newX, const ValueType newY) throw() { x = newX; y = newY; } | |||
| void setSize (const ValueType newWidth, const ValueType newHeight) throw() { w = newWidth; h = newHeight; } | |||
| @@ -9910,12 +9928,23 @@ public: | |||
| return xCoord >= x && yCoord >= y && xCoord < x + w && yCoord < y + h; | |||
| } | |||
| bool contains (const Point<ValueType> point) const throw() | |||
| { | |||
| return point.getX() >= x && point.getY() >= y && point.getX() < x + w && point.getY() < y + h; | |||
| } | |||
| bool contains (const Rectangle& other) const throw() | |||
| { | |||
| return x <= other.x && y <= other.y | |||
| && x + w >= other.x + other.w && y + h >= other.y + other.h; | |||
| } | |||
| const Point<ValueType> getConstrainedPoint (const Point<ValueType>& point) const throw() | |||
| { | |||
| return Point<ValueType> (jlimit (x, x + w, point.getX()), | |||
| jlimit (y, y + h, point.getY())); | |||
| } | |||
| bool intersects (const Rectangle& other) const throw() | |||
| { | |||
| return x + w > other.x | |||
| @@ -12243,13 +12272,11 @@ public: | |||
| virtual void getBounds (int& x, int& y, int& w, int& h) const = 0; | |||
| virtual int getScreenX() const = 0; | |||
| virtual const Point<int> getScreenPosition() const = 0; | |||
| virtual int getScreenY() const = 0; | |||
| virtual const Point<int> relativePositionToGlobal (const Point<int>& relativePosition) = 0; | |||
| virtual void relativePositionToGlobal (int& x, int& y) = 0; | |||
| virtual void globalPositionToRelative (int& x, int& y) = 0; | |||
| virtual const Point<int> globalPositionToRelative (const Point<int>& screenPosition) = 0; | |||
| virtual void setMinimised (bool shouldBeMinimised) = 0; | |||
| @@ -12291,7 +12318,7 @@ public: | |||
| virtual void grabFocus() = 0; | |||
| virtual void textInputRequired (int x, int y) = 0; | |||
| virtual void textInputRequired (const Point<int>& position) = 0; | |||
| void handleFocusGain(); | |||
| void handleFocusLoss(); | |||
| @@ -12448,16 +12475,18 @@ public: | |||
| void getVisibleArea (RectangleList& result, | |||
| const bool includeSiblings) const; | |||
| int getScreenX() const throw(); | |||
| int getScreenX() const; | |||
| int getScreenY() const; | |||
| int getScreenY() const throw(); | |||
| const Point<int> getScreenPosition() const; | |||
| void relativePositionToGlobal (int& x, int& y) const throw(); | |||
| const Point<int> relativePositionToGlobal (const Point<int>& relativePosition) const; | |||
| void globalPositionToRelative (int& x, int& y) const throw(); | |||
| const Point<int> globalPositionToRelative (const Point<int>& screenPosition) const; | |||
| void relativePositionToOtherComponent (const Component* const targetComponent, | |||
| int& x, int& y) const throw(); | |||
| const Point<int> relativePositionToOtherComponent (const Component* const targetComponent, | |||
| const Point<int>& positionRelativeToThis) const; | |||
| void setTopLeftPosition (const int x, const int y); | |||
| @@ -12690,7 +12719,7 @@ public: | |||
| static bool JUCE_CALLTYPE isMouseButtonDownAnywhere() throw(); | |||
| void getMouseXYRelative (int& x, int& y) const throw(); | |||
| const Point<int> getMouseXYRelative() const; | |||
| static Component* JUCE_CALLTYPE getComponentUnderMouse() throw(); | |||
| @@ -12834,8 +12863,7 @@ private: | |||
| void sendEnablementChangeMessage(); | |||
| static void* runModalLoopCallback (void*); | |||
| static void bringModalComponentToFront(); | |||
| void subtractObscuredRegions (RectangleList& result, | |||
| const int deltaX, const int deltaY, | |||
| void subtractObscuredRegions (RectangleList& result, const Point<int>& delta, | |||
| const Rectangle<int>& clipRect, | |||
| const Component* const compToAvoid) const throw(); | |||
| void clipObscuredRegions (Graphics& g, const Rectangle<int>& clipRect, | |||
| @@ -13233,13 +13261,13 @@ public: | |||
| const Rectangle<int> getMainMonitorArea (const bool clippedToWorkArea = true) const throw(); | |||
| const Rectangle<int> getMonitorAreaContaining (int x, int y, const bool clippedToWorkArea = true) const throw(); | |||
| const Rectangle<int> getMonitorAreaContaining (const Point<int>& position, const bool clippedToWorkArea = true) const throw(); | |||
| static void getMousePosition (int& x, int& y) throw(); | |||
| static const Point<int> getMousePosition(); | |||
| static void setMousePosition (int x, int y) throw(); | |||
| static void setMousePosition (const Point<int>& newPosition); | |||
| static void getLastMouseDownPosition (int& x, int& y) throw(); | |||
| static const Point<int> getLastMouseDownPosition() throw(); | |||
| static int getMouseButtonClickCounter() throw(); | |||
| @@ -13264,8 +13292,7 @@ public: | |||
| Component* getComponent (const int index) const throw(); | |||
| Component* findComponentAt (const int screenX, | |||
| const int screenY) const; | |||
| Component* findComponentAt (const Point<int>& screenPosition) const; | |||
| juce_UseDebuggingNewOperator | |||
| @@ -13289,7 +13316,8 @@ private: | |||
| Array <Rectangle<int> > monitorCoordsClipped, monitorCoordsUnclipped; | |||
| int lastFakeMouseMoveX, lastFakeMouseMoveY, mouseClickCounter; | |||
| Point<int> lastFakeMouseMove; | |||
| int mouseClickCounter; | |||
| bool mouseMovedSignificantlySincePressed; | |||
| struct RecentMouseDown | |||
| @@ -15893,7 +15921,8 @@ public: | |||
| private: | |||
| int millisecondsBeforeTipAppears; | |||
| int mouseX, mouseY, mouseClicks; | |||
| Point<int> lastMousePos; | |||
| int mouseClicks; | |||
| unsigned int lastCompChangeTime, lastHideTime; | |||
| Component* lastComponentUnderMouse; | |||
| bool changedCompsSinceShown; | |||
| @@ -18663,7 +18692,7 @@ private: | |||
| Component* headerComponent; | |||
| int totalItems, rowHeight, minimumRowWidth; | |||
| int outlineThickness; | |||
| int lastMouseX, lastMouseY, lastRowSelected; | |||
| int lastRowSelected; | |||
| bool mouseMoveSelects, multipleSelection, hasDoneInitialUpdate; | |||
| SparseSet <int> selected; | |||
| @@ -22864,7 +22893,7 @@ public: | |||
| private: | |||
| ComponentBoundsConstrainer* constrainer; | |||
| int originalX, originalY; | |||
| Point<int> originalPos; | |||
| }; | |||
| #endif // __JUCE_COMPONENTDRAGGER_JUCEHEADER__ | |||
| @@ -23800,7 +23829,7 @@ private: | |||
| ComponentPeer* lastPeer; | |||
| VoidArray registeredParentComps; | |||
| bool reentrant; | |||
| int lastX, lastY, lastWidth, lastHeight; | |||
| Rectangle<int> lastBounds; | |||
| #ifdef JUCE_DEBUG | |||
| ScopedPointer <ComponentDeletionWatcher> deletionWatcher; | |||
| #endif | |||
| @@ -26595,10 +26624,10 @@ private: | |||
| int octaveNumForMiddleC; | |||
| void getKeyPos (int midiNoteNumber, int& x, int& w) const; | |||
| int xyToNote (int x, int y, float& mousePositionVelocity); | |||
| int remappedXYToNote (int x, int y, float& mousePositionVelocity) const; | |||
| int xyToNote (const Point<int>& pos, float& mousePositionVelocity); | |||
| int remappedXYToNote (const Point<int>& pos, float& mousePositionVelocity) const; | |||
| void resetAnyKeysInUse(); | |||
| void updateNoteUnderMouse (int x, int y); | |||
| void updateNoteUnderMouse (const Point<int>& pos); | |||
| void repaintNote (const int midiNoteNumber); | |||
| MidiKeyboardComponent (const MidiKeyboardComponent&); | |||
| @@ -233,20 +233,14 @@ Button::ButtonState Button::updateState (const MouseEvent* const e) | |||
| if (isEnabled() && isVisible() && ! isCurrentlyBlockedByAnotherModalComponent()) | |||
| { | |||
| int mx, my; | |||
| Point<int> mousePos; | |||
| if (e == 0) | |||
| { | |||
| getMouseXYRelative (mx, my); | |||
| } | |||
| mousePos = getMouseXYRelative(); | |||
| else | |||
| { | |||
| const MouseEvent e2 (e->getEventRelativeTo (this)); | |||
| mx = e2.x; | |||
| my = e2.y; | |||
| } | |||
| mousePos = e->getEventRelativeTo (this).getPosition(); | |||
| const bool over = reallyContains (mx, my, true); | |||
| const bool over = reallyContains (mousePos.getX(), mousePos.getY(), true); | |||
| const bool down = isMouseButtonDown(); | |||
| if ((down && (over || (triggerOnMouseDown && buttonState == buttonDown))) || isKeyDown) | |||
| @@ -802,11 +802,7 @@ void ListBox::mouseMove (const MouseEvent& e) | |||
| if (mouseMoveSelects) | |||
| { | |||
| const MouseEvent e2 (e.getEventRelativeTo (this)); | |||
| selectRow (getRowContainingPosition (e2.x, e2.y), true); | |||
| lastMouseX = e2.x; | |||
| lastMouseY = e2.y; | |||
| } | |||
| } | |||
| @@ -898,10 +894,8 @@ Image* ListBox::createSnapshotOfSelectedRows (int& imageX, int& imageY) | |||
| if (rowComp != 0 && isRowSelected (firstRow + i)) | |||
| { | |||
| int x = 0, y = 0; | |||
| rowComp->relativePositionToOtherComponent (this, x, y); | |||
| const Rectangle<int> rowRect (x, y, rowComp->getWidth(), rowComp->getHeight()); | |||
| const Point<int> pos (rowComp->relativePositionToOtherComponent (this, Point<int>())); | |||
| const Rectangle<int> rowRect (pos.getX(), pos.getY(), rowComp->getWidth(), rowComp->getHeight()); | |||
| if (imageArea.isEmpty()) | |||
| imageArea = rowRect; | |||
| @@ -921,11 +915,10 @@ Image* ListBox::createSnapshotOfSelectedRows (int& imageX, int& imageY) | |||
| if (rowComp != 0 && isRowSelected (firstRow + i)) | |||
| { | |||
| int x = 0, y = 0; | |||
| rowComp->relativePositionToOtherComponent (this, x, y); | |||
| const Point<int> pos (rowComp->relativePositionToOtherComponent (this, Point<int>())); | |||
| Graphics g (*snapshot); | |||
| g.setOrigin (x - imageX, y - imageY); | |||
| g.setOrigin (pos.getX() - imageX, pos.getY() - imageY); | |||
| if (g.reduceClipRegion (0, 0, rowComp->getWidth(), rowComp->getHeight())) | |||
| rowComp->paintEntireComponent (g); | |||
| } | |||
| @@ -572,7 +572,7 @@ private: | |||
| Component* headerComponent; | |||
| int totalItems, rowHeight, minimumRowWidth; | |||
| int outlineThickness; | |||
| int lastMouseX, lastMouseY, lastRowSelected; | |||
| int lastRowSelected; | |||
| bool mouseMoveSelects, multipleSelection, hasDoneInitialUpdate; | |||
| SparseSet <int> selected; | |||
| @@ -1150,34 +1150,32 @@ void Slider::restoreMouseIfHidden() | |||
| if (style == RotaryHorizontalDrag || style == RotaryVerticalDrag) | |||
| { | |||
| int x, y, downX, downY; | |||
| Desktop::getMousePosition (x, y); | |||
| Desktop::getLastMouseDownPosition (downX, downY); | |||
| Point<int> mousePos (Desktop::getMousePosition()); | |||
| const Point<int> lastMouseDown (Desktop::getLastMouseDownPosition()); | |||
| if (style == RotaryHorizontalDrag) | |||
| { | |||
| const double posDiff = valueToProportionOfLength (pos) - valueToProportionOfLength (valueOnMouseDown); | |||
| x = roundToInt (pixelsForFullDragExtent * posDiff + downX); | |||
| y = downY; | |||
| mousePos = Point<int> (roundToInt (pixelsForFullDragExtent * posDiff + lastMouseDown.getX()), | |||
| lastMouseDown.getY()); | |||
| } | |||
| else | |||
| { | |||
| const double posDiff = valueToProportionOfLength (valueOnMouseDown) - valueToProportionOfLength (pos); | |||
| x = downX; | |||
| y = roundToInt (pixelsForFullDragExtent * posDiff + downY); | |||
| mousePos = Point<int> (lastMouseDown.getX(), | |||
| roundToInt (pixelsForFullDragExtent * posDiff + lastMouseDown.getY())); | |||
| } | |||
| Desktop::setMousePosition (x, y); | |||
| Desktop::setMousePosition (mousePos); | |||
| } | |||
| else | |||
| { | |||
| const int pixelPos = (int) getLinearSliderPos (pos); | |||
| int x = isHorizontal() ? pixelPos : (getWidth() / 2); | |||
| int y = isVertical() ? pixelPos : (getHeight() / 2); | |||
| const Point<int> pos (isHorizontal() ? pixelPos : (getWidth() / 2), | |||
| isVertical() ? pixelPos : (getHeight() / 2)); | |||
| relativePositionToGlobal (x, y); | |||
| Desktop::setMousePosition (x, y); | |||
| Desktop::setMousePosition (relativePositionToGlobal (pos)); | |||
| } | |||
| } | |||
| } | |||
| @@ -797,10 +797,7 @@ void TableHeaderComponent::mouseUp (const MouseEvent& e) | |||
| const MouseCursor TableHeaderComponent::getMouseCursor() | |||
| { | |||
| int x, y; | |||
| getMouseXYRelative (x, y); | |||
| if (columnIdBeingResized != 0 || (getResizeDraggerAt (x) != 0 && ! isMouseButtonDown())) | |||
| if (columnIdBeingResized != 0 || (getResizeDraggerAt (getMouseXYRelative().getX()) != 0 && ! isMouseButtonDown())) | |||
| return MouseCursor (MouseCursor::LeftRightResizeCursor); | |||
| return Component::getMouseCursor(); | |||
| @@ -229,10 +229,7 @@ public: | |||
| const String getTooltip() | |||
| { | |||
| int x, y; | |||
| getMouseXYRelative (x, y); | |||
| const int columnId = owner.getHeader()->getColumnIdAtX (x); | |||
| const int columnId = owner.getHeader()->getColumnIdAtX (getMouseXYRelative().getX()); | |||
| if (columnId != 0 && owner.getModel() != 0) | |||
| return owner.getModel()->getCellTooltip (row, columnId); | |||
| @@ -2126,8 +2126,7 @@ void TextEditor::focusGained (FocusChangeType) | |||
| ComponentPeer* const peer = getPeer(); | |||
| if (peer != 0 && ! isReadOnly()) | |||
| peer->textInputRequired (getScreenX() - peer->getScreenX(), | |||
| getScreenY() - peer->getScreenY()); | |||
| peer->textInputRequired (getScreenPosition() - peer->getScreenPosition()); | |||
| } | |||
| void TextEditor::focusLost (FocusChangeType) | |||
| @@ -306,11 +306,8 @@ public: | |||
| const String getTooltip() | |||
| { | |||
| int x, y; | |||
| getMouseXYRelative (x, y); | |||
| Rectangle<int> pos; | |||
| TreeViewItem* const item = findItemAt (y, pos); | |||
| TreeViewItem* const item = findItemAt (getMouseXYRelative().getY(), pos); | |||
| if (item != 0) | |||
| return item->getTooltip(); | |||
| @@ -557,10 +554,8 @@ TreeViewItem* TreeView::getItemOnRow (int index) const | |||
| TreeViewItem* TreeView::getItemAt (int y) const throw() | |||
| { | |||
| TreeViewContentComponent* const tc = (TreeViewContentComponent*) viewport->getViewedComponent(); | |||
| int x; | |||
| relativePositionToOtherComponent (tc, x, y); | |||
| Rectangle<int> pos; | |||
| return tc->findItemAt (y, pos); | |||
| return tc->findItemAt (relativePositionToOtherComponent (tc, Point<int> (0, y)).getY(), pos); | |||
| } | |||
| TreeViewItem* TreeView::findItemFromIdentifierString (const String& identifierString) const | |||
| @@ -53,8 +53,7 @@ static const int customCommandMessage = 0x7fff0001; | |||
| static const int exitModalStateMessage = 0x7fff0002; | |||
| //============================================================================== | |||
| static int unboundedMouseOffsetX = 0; | |||
| static int unboundedMouseOffsetY = 0; | |||
| static Point<int> unboundedMouseOffset; | |||
| static bool isUnboundedMouseModeOn = false; | |||
| static bool isCursorVisibleUntilOffscreen; | |||
| @@ -412,8 +411,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) | |||
| jmax (1, getHeight())); | |||
| #endif | |||
| int x = 0, y = 0; | |||
| relativePositionToGlobal (x, y); | |||
| const Point<int> topLeft (relativePositionToGlobal (Point<int> (0, 0))); | |||
| bool wasFullscreen = false; | |||
| bool wasMinimised = false; | |||
| @@ -429,7 +427,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) | |||
| removeFromDesktop(); | |||
| setTopLeftPosition (x, y); | |||
| setTopLeftPosition (topLeft.getX(), topLeft.getY()); | |||
| } | |||
| if (parentComponent_ != 0) | |||
| @@ -443,8 +441,8 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) | |||
| Desktop::getInstance().addDesktopComponent (this); | |||
| bounds_.setPosition (x, y); | |||
| peer->setBounds (x, y, getWidth(), getHeight(), false); | |||
| bounds_.setPosition (topLeft); | |||
| peer->setBounds (topLeft.getX(), topLeft.getY(), getWidth(), getHeight(), false); | |||
| peer->setVisible (isVisible()); | |||
| @@ -741,57 +739,60 @@ int Component::getParentHeight() const throw() | |||
| : getParentMonitorArea().getHeight(); | |||
| } | |||
| int Component::getScreenX() const throw() | |||
| int Component::getScreenX() const | |||
| { | |||
| return (parentComponent_ != 0) ? parentComponent_->getScreenX() + getX() | |||
| : (flags.hasHeavyweightPeerFlag ? getPeer()->getScreenX() | |||
| : getX()); | |||
| return getScreenPosition().getX(); | |||
| } | |||
| int Component::getScreenY() const throw() | |||
| int Component::getScreenY() const | |||
| { | |||
| return (parentComponent_ != 0) ? parentComponent_->getScreenY() + getY() | |||
| : (flags.hasHeavyweightPeerFlag ? getPeer()->getScreenY() | |||
| : getY()); | |||
| return getScreenPosition().getY(); | |||
| } | |||
| void Component::relativePositionToGlobal (int& x, int& y) const throw() | |||
| const Point<int> Component::getScreenPosition() const | |||
| { | |||
| return (parentComponent_ != 0) ? parentComponent_->getScreenPosition() + getPosition() | |||
| : (flags.hasHeavyweightPeerFlag ? getPeer()->getScreenPosition() | |||
| : getPosition()); | |||
| } | |||
| const Point<int> Component::relativePositionToGlobal (const Point<int>& relativePosition) const | |||
| { | |||
| const Component* c = this; | |||
| Point<int> p (relativePosition); | |||
| do | |||
| { | |||
| if (c->flags.hasHeavyweightPeerFlag) | |||
| { | |||
| c->getPeer()->relativePositionToGlobal (x, y); | |||
| break; | |||
| } | |||
| return c->getPeer()->relativePositionToGlobal (p); | |||
| x += c->getX(); | |||
| y += c->getY(); | |||
| p += c->getPosition(); | |||
| c = c->parentComponent_; | |||
| } | |||
| while (c != 0); | |||
| return p; | |||
| } | |||
| void Component::globalPositionToRelative (int& x, int& y) const throw() | |||
| const Point<int> Component::globalPositionToRelative (const Point<int>& screenPosition) const | |||
| { | |||
| if (flags.hasHeavyweightPeerFlag) | |||
| { | |||
| getPeer()->globalPositionToRelative (x, y); | |||
| return getPeer()->globalPositionToRelative (screenPosition); | |||
| } | |||
| else | |||
| { | |||
| if (parentComponent_ != 0) | |||
| parentComponent_->globalPositionToRelative (x, y); | |||
| return parentComponent_->globalPositionToRelative (screenPosition) - getPosition(); | |||
| x -= getX(); | |||
| y -= getY(); | |||
| return screenPosition - getPosition(); | |||
| } | |||
| } | |||
| void Component::relativePositionToOtherComponent (const Component* const targetComponent, int& x, int& y) const throw() | |||
| const Point<int> Component::relativePositionToOtherComponent (const Component* const targetComponent, const Point<int>& positionRelativeToThis) const | |||
| { | |||
| Point<int> p (positionRelativeToThis); | |||
| if (targetComponent != 0) | |||
| { | |||
| const Component* c = this; | |||
| @@ -799,22 +800,23 @@ void Component::relativePositionToOtherComponent (const Component* const targetC | |||
| do | |||
| { | |||
| if (c == targetComponent) | |||
| return; | |||
| return p; | |||
| if (c->flags.hasHeavyweightPeerFlag) | |||
| { | |||
| c->getPeer()->relativePositionToGlobal (x, y); | |||
| p = c->getPeer()->relativePositionToGlobal (p); | |||
| break; | |||
| } | |||
| x += c->getX(); | |||
| y += c->getY(); | |||
| p += c->getPosition(); | |||
| c = c->parentComponent_; | |||
| } | |||
| while (c != 0); | |||
| targetComponent->globalPositionToRelative (x, y); | |||
| p = targetComponent->globalPositionToRelative (p); | |||
| } | |||
| return p; | |||
| } | |||
| //============================================================================== | |||
| @@ -1546,10 +1548,9 @@ void Component::setMouseCursor (const MouseCursor& cursor) throw() | |||
| if (flags.visibleFlag) | |||
| { | |||
| int mx, my; | |||
| getMouseXYRelative (mx, my); | |||
| const Point<int> mousePos (getMouseXYRelative()); | |||
| if (flags.draggingFlag || reallyContains (mx, my, false)) | |||
| if (flags.draggingFlag || reallyContains (mousePos.getX(), mousePos.getY(), false)) | |||
| { | |||
| internalUpdateMouseCursor (false); | |||
| } | |||
| @@ -1574,9 +1575,8 @@ void Component::internalUpdateMouseCursor (bool forcedUpdate) throw() | |||
| { | |||
| MouseCursor mc (getLookAndFeel().getMouseCursorFor (*this)); | |||
| if (isUnboundedMouseModeOn && (unboundedMouseOffsetX != 0 | |||
| || unboundedMouseOffsetY != 0 | |||
| || ! isCursorVisibleUntilOffscreen)) | |||
| if (isUnboundedMouseModeOn | |||
| && ((! unboundedMouseOffset.isOrigin()) || ! isCursorVisibleUntilOffscreen)) | |||
| { | |||
| mc = MouseCursor::NoCursor; | |||
| forcedUpdate = true; | |||
| @@ -1989,22 +1989,18 @@ void Component::getVisibleArea (RectangleList& result, | |||
| { | |||
| const Component* const c = getTopLevelComponent(); | |||
| int x = 0, y = 0; | |||
| c->relativePositionToOtherComponent (this, x, y); | |||
| c->subtractObscuredRegions (result, x, y, | |||
| c->subtractObscuredRegions (result, c->relativePositionToOtherComponent (this, Point<int>()), | |||
| Rectangle<int> (0, 0, c->getWidth(), c->getHeight()), | |||
| this); | |||
| } | |||
| subtractObscuredRegions (result, 0, 0, unclipped, 0); | |||
| subtractObscuredRegions (result, Point<int>(), unclipped, 0); | |||
| result.consolidate(); | |||
| } | |||
| } | |||
| void Component::subtractObscuredRegions (RectangleList& result, | |||
| const int deltaX, | |||
| const int deltaY, | |||
| const Point<int>& delta, | |||
| const Rectangle<int>& clipRect, | |||
| const Component* const compToAvoid) const throw() | |||
| { | |||
| @@ -2017,7 +2013,7 @@ void Component::subtractObscuredRegions (RectangleList& result, | |||
| if (c->isOpaque()) | |||
| { | |||
| Rectangle<int> childBounds (c->bounds_.getIntersection (clipRect)); | |||
| childBounds.translate (deltaX, deltaY); | |||
| childBounds.translate (delta.getX(), delta.getY()); | |||
| result.subtract (childBounds); | |||
| } | |||
| @@ -2026,11 +2022,8 @@ void Component::subtractObscuredRegions (RectangleList& result, | |||
| Rectangle<int> newClip (clipRect.getIntersection (c->bounds_)); | |||
| newClip.translate (-c->getX(), -c->getY()); | |||
| c->subtractObscuredRegions (result, | |||
| c->getX() + deltaX, | |||
| c->getY() + deltaY, | |||
| newClip, | |||
| compToAvoid); | |||
| c->subtractObscuredRegions (result, c->getPosition() + delta, | |||
| newClip, compToAvoid); | |||
| } | |||
| } | |||
| } | |||
| @@ -2253,11 +2246,11 @@ void Component::internalMouseEnter (int x, int y, int64 time) | |||
| if (flags.repaintOnMouseActivityFlag) | |||
| repaint(); | |||
| const MouseEvent me (x, y, | |||
| const MouseEvent me (Point<int> (x, y), | |||
| ModifierKeys::getCurrentModifiers(), | |||
| this, | |||
| Time (time), | |||
| x, y, | |||
| Point<int> (x, y), | |||
| Time (time), | |||
| 0, false); | |||
| @@ -2338,11 +2331,11 @@ void Component::internalMouseExit (int x, int y, int64 time) | |||
| if (flags.repaintOnMouseActivityFlag) | |||
| repaint(); | |||
| const MouseEvent me (x, y, | |||
| const MouseEvent me (Point<int> (x, y), | |||
| ModifierKeys::getCurrentModifiers(), | |||
| this, | |||
| Time (time), | |||
| x, y, | |||
| Point<int> (x, y), | |||
| Time (time), | |||
| 0, false); | |||
| mouseExit (me); | |||
| @@ -2409,15 +2402,13 @@ public: | |||
| if (c != 0 && c->isMouseButtonDown()) | |||
| { | |||
| int x, y; | |||
| c->getMouseXYRelative (x, y); | |||
| const Point<int> mousePos (c->getMouseXYRelative()); | |||
| // the offsets have been added on, so must be taken off before calling the | |||
| // drag.. otherwise they'll be added twice | |||
| x -= unboundedMouseOffsetX; | |||
| y -= unboundedMouseOffsetY; | |||
| c->internalMouseDrag (x, y, Time::currentTimeMillis()); | |||
| c->internalMouseDrag (mousePos.getX() - unboundedMouseOffset.getX(), | |||
| mousePos.getY() - unboundedMouseOffset.getY(), | |||
| Time::currentTimeMillis()); | |||
| } | |||
| } | |||
| @@ -2451,9 +2442,7 @@ void Component::internalMouseDown (const int x, const int y, const int64 time) | |||
| { | |||
| Desktop& desktop = Desktop::getInstance(); | |||
| int gx = x, gy = y; | |||
| relativePositionToGlobal (gx, gy); | |||
| desktop.registerMouseDown (Point<int> (gx, gy), time, this); | |||
| desktop.registerMouseDown (relativePositionToGlobal (Point<int> (x, y)), time, this); | |||
| const ComponentDeletionWatcher deletionChecker (this); | |||
| @@ -2469,11 +2458,11 @@ void Component::internalMouseDown (const int x, const int y, const int64 time) | |||
| if (isCurrentlyBlockedByAnotherModalComponent()) | |||
| { | |||
| // allow blocked mouse-events to go to global listeners.. | |||
| const MouseEvent me (x, y, | |||
| const MouseEvent me (Point<int> (x, y), | |||
| ModifierKeys::getCurrentModifiers(), | |||
| this, | |||
| Time (time), | |||
| x, y, | |||
| Point<int> (x, y), | |||
| desktop.getLastMouseDownTime(), | |||
| desktop.getNumberOfMultipleClicks(), | |||
| false); | |||
| @@ -2522,11 +2511,11 @@ void Component::internalMouseDown (const int x, const int y, const int64 time) | |||
| if (flags.repaintOnMouseActivityFlag) | |||
| repaint(); | |||
| const MouseEvent me (x, y, | |||
| const MouseEvent me (Point<int> (x, y), | |||
| ModifierKeys::getCurrentModifiers(), | |||
| this, | |||
| desktop.getLastMouseDownTime(), | |||
| x, y, | |||
| Point<int> (x, y), | |||
| desktop.getLastMouseDownTime(), | |||
| desktop.getNumberOfMultipleClicks(), | |||
| false); | |||
| @@ -2591,29 +2580,24 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int | |||
| flags.draggingFlag = false; | |||
| deleteAndZero (dragRepeater); | |||
| x += unboundedMouseOffsetX; | |||
| y += unboundedMouseOffsetY; | |||
| x += unboundedMouseOffset.getX(); | |||
| y += unboundedMouseOffset.getY(); | |||
| int gx = x, gy = y; | |||
| relativePositionToGlobal (gx, gy); | |||
| desktop.registerMouseDrag (Point<int> (gx, gy)); | |||
| desktop.registerMouseDrag (relativePositionToGlobal (Point<int> (x, y))); | |||
| const ComponentDeletionWatcher deletionChecker (this); | |||
| if (flags.repaintOnMouseActivityFlag) | |||
| repaint(); | |||
| int mdx, mdy; | |||
| Desktop::getLastMouseDownPosition (mdx, mdy); | |||
| globalPositionToRelative (mdx, mdy); | |||
| const Point<int> mouseDownPos (globalPositionToRelative (Desktop::getLastMouseDownPosition())); | |||
| const Time lastMouseDownTime (desktop.getLastMouseDownTime()); | |||
| const MouseEvent me (x, y, | |||
| const MouseEvent me (Point<int> (x, y), | |||
| oldModifiers, | |||
| this, | |||
| Time (time), | |||
| mdx, mdy, | |||
| mouseDownPos, | |||
| lastMouseDownTime, | |||
| desktop.getNumberOfMultipleClicks(), | |||
| desktop.mouseMovedSignificantlySincePressed | |||
| @@ -2733,26 +2717,21 @@ void Component::internalMouseDrag (int x, int y, const int64 time) | |||
| flags.mouseOverFlag = reallyContains (x, y, false); | |||
| x += unboundedMouseOffsetX; | |||
| y += unboundedMouseOffsetY; | |||
| x += unboundedMouseOffset.getX(); | |||
| y += unboundedMouseOffset.getY(); | |||
| int gx = x, gy = y; | |||
| relativePositionToGlobal (gx, gy); | |||
| desktop.registerMouseDrag (Point<int> (gx, gy)); | |||
| desktop.registerMouseDrag (relativePositionToGlobal (Point<int> (x, y))); | |||
| const ComponentDeletionWatcher deletionChecker (this); | |||
| int mdx, mdy; | |||
| Desktop::getLastMouseDownPosition (mdx, mdy); | |||
| globalPositionToRelative (mdx, mdy); | |||
| const Point<int> mouseDownPos (globalPositionToRelative (Desktop::getLastMouseDownPosition())); | |||
| const Time lastMouseDownTime (desktop.getLastMouseDownTime()); | |||
| const MouseEvent me (x, y, | |||
| const MouseEvent me (Point<int> (x, y), | |||
| ModifierKeys::getCurrentModifiers(), | |||
| this, | |||
| Time (time), | |||
| mdx, mdy, | |||
| mouseDownPos, | |||
| lastMouseDownTime, | |||
| desktop.getNumberOfMultipleClicks(), | |||
| desktop.mouseMovedSignificantlySincePressed | |||
| @@ -2812,37 +2791,30 @@ void Component::internalMouseDrag (int x, int y, const int64 time) | |||
| if (isUnboundedMouseModeOn) | |||
| { | |||
| Rectangle<int> screenArea (getParentMonitorArea().expanded (-2, -2)); | |||
| Point<int> mousePos (Desktop::getMousePosition()); | |||
| int mx, my; | |||
| Desktop::getMousePosition (mx, my); | |||
| if (! screenArea.contains (mx, my)) | |||
| if (! screenArea.contains (mousePos)) | |||
| { | |||
| int deltaX = 0, deltaY = 0; | |||
| if (mx <= screenArea.getX() || mx >= screenArea.getRight()) | |||
| deltaX = getScreenX() + getWidth() / 2 - mx; | |||
| if (mousePos.getX() <= screenArea.getX() || mousePos.getX() >= screenArea.getRight()) | |||
| deltaX = getScreenX() + getWidth() / 2 - mousePos.getX(); | |||
| if (my <= screenArea.getY() || my >= screenArea.getBottom()) | |||
| deltaY = getScreenY() + getHeight() / 2 - my; | |||
| if (mousePos.getY() <= screenArea.getY() || mousePos.getY() >= screenArea.getBottom()) | |||
| deltaY = getScreenY() + getHeight() / 2 - mousePos.getY(); | |||
| unboundedMouseOffsetX -= deltaX; | |||
| unboundedMouseOffsetY -= deltaY; | |||
| unboundedMouseOffset -= Point<int> (deltaX, deltaY); | |||
| Desktop::setMousePosition (mx + deltaX, | |||
| my + deltaY); | |||
| Desktop::setMousePosition (mousePos + Point<int> (deltaX, deltaY)); | |||
| } | |||
| else if (isCursorVisibleUntilOffscreen | |||
| && (unboundedMouseOffsetX != 0 || unboundedMouseOffsetY != 0) | |||
| && screenArea.contains (mx + unboundedMouseOffsetX, | |||
| my + unboundedMouseOffsetY)) | |||
| && (! unboundedMouseOffset.isOrigin()) | |||
| && screenArea.contains (mousePos + unboundedMouseOffset)) | |||
| { | |||
| mx += unboundedMouseOffsetX; | |||
| my += unboundedMouseOffsetY; | |||
| unboundedMouseOffsetX = 0; | |||
| unboundedMouseOffsetY = 0; | |||
| mousePos += unboundedMouseOffset; | |||
| unboundedMouseOffset = Point<int>(); | |||
| Desktop::setMousePosition (mx, my); | |||
| Desktop::setMousePosition (mousePos); | |||
| } | |||
| } | |||
| @@ -2859,11 +2831,11 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) | |||
| { | |||
| Desktop& desktop = Desktop::getInstance(); | |||
| const MouseEvent me (x, y, | |||
| const MouseEvent me (Point<int> (x, y), | |||
| ModifierKeys::getCurrentModifiers(), | |||
| this, | |||
| Time (time), | |||
| x, y, | |||
| Point<int> (x, y), | |||
| Time (time), | |||
| 0, false); | |||
| @@ -2939,14 +2911,13 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, | |||
| const float wheelIncrementX = intAmountX * (1.0f / 256.0f); | |||
| const float wheelIncrementY = intAmountY * (1.0f / 256.0f); | |||
| int mx, my; | |||
| getMouseXYRelative (mx, my); | |||
| const Point<int> mousePos (getMouseXYRelative()); | |||
| const MouseEvent me (mx, my, | |||
| const MouseEvent me (mousePos, | |||
| ModifierKeys::getCurrentModifiers(), | |||
| this, | |||
| Time (time), | |||
| mx, my, | |||
| mousePos, | |||
| Time (time), | |||
| 0, false); | |||
| @@ -3403,13 +3374,9 @@ bool JUCE_CALLTYPE Component::isMouseButtonDownAnywhere() throw() | |||
| return ModifierKeys::getCurrentModifiers().isAnyMouseButtonDown(); | |||
| } | |||
| void Component::getMouseXYRelative (int& mx, int& my) const throw() | |||
| const Point<int> Component::getMouseXYRelative() const | |||
| { | |||
| Desktop::getMousePosition (mx, my); | |||
| globalPositionToRelative (mx, my); | |||
| mx += unboundedMouseOffsetX; | |||
| my += unboundedMouseOffsetY; | |||
| return globalPositionToRelative (Desktop::getMousePosition()) + unboundedMouseOffset; | |||
| } | |||
| void Component::enableUnboundedMouseMovement (bool enable, | |||
| @@ -3421,25 +3388,15 @@ void Component::enableUnboundedMouseMovement (bool enable, | |||
| if (enable != isUnboundedMouseModeOn) | |||
| { | |||
| if ((! enable) && ((! isCursorVisibleUntilOffscreen) | |||
| || unboundedMouseOffsetX != 0 | |||
| || unboundedMouseOffsetY != 0)) | |||
| || ! unboundedMouseOffset.isOrigin())) | |||
| { | |||
| // when released, return the mouse to within the component's bounds | |||
| int mx, my; | |||
| getMouseXYRelative (mx, my); | |||
| mx = jlimit (0, getWidth(), mx); | |||
| my = jlimit (0, getHeight(), my); | |||
| relativePositionToGlobal (mx, my); | |||
| Desktop::setMousePosition (mx, my); | |||
| Desktop::setMousePosition (relativePositionToGlobal (Rectangle<int> (0, 0, getWidth(), getHeight()) | |||
| .getConstrainedPoint (getMouseXYRelative()))); | |||
| } | |||
| isUnboundedMouseModeOn = enable; | |||
| unboundedMouseOffsetX = 0; | |||
| unboundedMouseOffsetY = 0; | |||
| unboundedMouseOffset = Point<int>(); | |||
| internalUpdateMouseCursor (true); | |||
| } | |||
| @@ -3453,11 +3410,9 @@ Component* JUCE_CALLTYPE Component::getComponentUnderMouse() throw() | |||
| //============================================================================== | |||
| const Rectangle<int> Component::getParentMonitorArea() const throw() | |||
| { | |||
| int centreX = getWidth() / 2; | |||
| int centreY = getHeight() / 2; | |||
| relativePositionToGlobal (centreX, centreY); | |||
| return Desktop::getInstance().getMonitorAreaContaining (centreX, centreY); | |||
| return Desktop::getInstance() | |||
| .getMonitorAreaContaining (relativePositionToGlobal (Point<int> (getWidth() / 2, | |||
| getHeight() / 2))); | |||
| } | |||
| //============================================================================== | |||
| @@ -343,33 +343,37 @@ public: | |||
| @see getX, relativePositionToGlobal | |||
| */ | |||
| int getScreenX() const throw(); | |||
| int getScreenX() const; | |||
| /** Returns this component's y co-ordinate relative the the screen's top-left origin. | |||
| @see getY, relativePositionToGlobal | |||
| */ | |||
| int getScreenY() const throw(); | |||
| int getScreenY() const; | |||
| /** Returns the position of this component's top-left corner relative to the screen's top-left. | |||
| */ | |||
| const Point<int> getScreenPosition() const; | |||
| /** Converts a position relative to this component's top-left into a screen co-ordinate. | |||
| @see globalPositionToRelative, relativePositionToOtherComponent | |||
| */ | |||
| void relativePositionToGlobal (int& x, int& y) const throw(); | |||
| const Point<int> relativePositionToGlobal (const Point<int>& relativePosition) const; | |||
| /** Converts a screen co-ordinate into a position relative to this component's top-left. | |||
| @see relativePositionToGlobal, relativePositionToOtherComponent | |||
| */ | |||
| void globalPositionToRelative (int& x, int& y) const throw(); | |||
| const Point<int> globalPositionToRelative (const Point<int>& screenPosition) const; | |||
| /** Converts a position relative to this component's top-left into a position | |||
| relative to another component's top-left. | |||
| @see relativePositionToGlobal, globalPositionToRelative | |||
| */ | |||
| void relativePositionToOtherComponent (const Component* const targetComponent, | |||
| int& x, int& y) const throw(); | |||
| const Point<int> relativePositionToOtherComponent (const Component* const targetComponent, | |||
| const Point<int>& positionRelativeToThis) const; | |||
| //============================================================================== | |||
| /** Moves the component to a new position. | |||
| @@ -1578,7 +1582,7 @@ public: | |||
| The co-ordinates are relative to the component's top-left corner. | |||
| */ | |||
| void getMouseXYRelative (int& x, int& y) const throw(); | |||
| const Point<int> getMouseXYRelative() const; | |||
| /** Returns the component that's currently underneath the mouse. | |||
| @@ -1979,8 +1983,7 @@ private: | |||
| void sendEnablementChangeMessage(); | |||
| static void* runModalLoopCallback (void*); | |||
| static void bringModalComponentToFront(); | |||
| void subtractObscuredRegions (RectangleList& result, | |||
| const int deltaX, const int deltaY, | |||
| void subtractObscuredRegions (RectangleList& result, const Point<int>& delta, | |||
| const Rectangle<int>& clipRect, | |||
| const Component* const compToAvoid) const throw(); | |||
| void clipObscuredRegions (Graphics& g, const Rectangle<int>& clipRect, | |||
| @@ -34,9 +34,7 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| Desktop::Desktop() throw() | |||
| : lastFakeMouseMoveX (0), | |||
| lastFakeMouseMoveY (0), | |||
| mouseClickCounter (0), | |||
| : mouseClickCounter (0), | |||
| mouseMovedSignificantlySincePressed (false), | |||
| kioskModeComponent (0) | |||
| { | |||
| @@ -118,7 +116,7 @@ const Rectangle<int> Desktop::getMainMonitorArea (const bool clippedToWorkArea) | |||
| return getDisplayMonitorCoordinates (0, clippedToWorkArea); | |||
| } | |||
| const Rectangle<int> Desktop::getMonitorAreaContaining (int cx, int cy, const bool clippedToWorkArea) const throw() | |||
| const Rectangle<int> Desktop::getMonitorAreaContaining (const Point<int>& position, const bool clippedToWorkArea) const throw() | |||
| { | |||
| Rectangle<int> best (getMainMonitorArea (clippedToWorkArea)); | |||
| double bestDistance = 1.0e10; | |||
| @@ -127,11 +125,10 @@ const Rectangle<int> Desktop::getMonitorAreaContaining (int cx, int cy, const bo | |||
| { | |||
| const Rectangle<int> rect (getDisplayMonitorCoordinates (i, clippedToWorkArea)); | |||
| if (rect.contains (cx, cy)) | |||
| if (rect.contains (position)) | |||
| return rect; | |||
| const double distance = juce_hypot ((double) (rect.getCentreX() - cx), | |||
| (double) (rect.getCentreY() - cy)); | |||
| const double distance = rect.getCentre().getDistanceFrom (position); | |||
| if (distance < bestDistance) | |||
| { | |||
| @@ -154,18 +151,15 @@ Component* Desktop::getComponent (const int index) const throw() | |||
| return desktopComponents [index]; | |||
| } | |||
| Component* Desktop::findComponentAt (const int screenX, | |||
| const int screenY) const | |||
| Component* Desktop::findComponentAt (const Point<int>& screenPosition) const | |||
| { | |||
| for (int i = desktopComponents.size(); --i >= 0;) | |||
| { | |||
| Component* const c = desktopComponents.getUnchecked(i); | |||
| const Point<int> relative (c->globalPositionToRelative (screenPosition)); | |||
| int x = screenX, y = screenY; | |||
| c->globalPositionToRelative (x, y); | |||
| if (c->contains (x, y)) | |||
| return c->getComponentAt (x, y); | |||
| if (c->contains (relative.getX(), relative.getY())) | |||
| return c->getComponentAt (relative.getX(), relative.getY()); | |||
| } | |||
| return 0; | |||
| @@ -208,11 +202,9 @@ void Desktop::componentBroughtToFront (Component* const c) throw() | |||
| } | |||
| //============================================================================== | |||
| void Desktop::getLastMouseDownPosition (int& x, int& y) throw() | |||
| const Point<int> Desktop::getLastMouseDownPosition() throw() | |||
| { | |||
| const Desktop& d = getInstance(); | |||
| x = d.mouseDowns[0].position.getX(); | |||
| y = d.mouseDowns[0].position.getY(); | |||
| return getInstance().mouseDowns[0].position; | |||
| } | |||
| int Desktop::getMouseButtonClickCounter() throw() | |||
| @@ -327,10 +319,7 @@ void Desktop::handleAsyncUpdate() | |||
| //============================================================================== | |||
| void Desktop::timerCallback() | |||
| { | |||
| int x, y; | |||
| getMousePosition (x, y); | |||
| if (lastFakeMouseMoveX != x || lastFakeMouseMoveY != y) | |||
| if (lastFakeMouseMove != getMousePosition()) | |||
| sendMouseMove(); | |||
| } | |||
| @@ -340,26 +329,18 @@ void Desktop::sendMouseMove() | |||
| { | |||
| startTimer (20); | |||
| int x, y; | |||
| getMousePosition (x, y); | |||
| lastFakeMouseMoveX = x; | |||
| lastFakeMouseMoveY = y; | |||
| lastFakeMouseMove = getMousePosition(); | |||
| Component* const target = findComponentAt (x, y); | |||
| Component* const target = findComponentAt (lastFakeMouseMove); | |||
| if (target != 0) | |||
| { | |||
| target->globalPositionToRelative (x, y); | |||
| ComponentDeletionWatcher deletionChecker (target); | |||
| const Point<int> pos (target->globalPositionToRelative (lastFakeMouseMove)); | |||
| const Time now (Time::getCurrentTime()); | |||
| const MouseEvent me (x, y, | |||
| ModifierKeys::getCurrentModifiers(), | |||
| target, | |||
| Time::getCurrentTime(), | |||
| x, y, | |||
| Time::getCurrentTime(), | |||
| 0, false); | |||
| const MouseEvent me (pos, ModifierKeys::getCurrentModifiers(), | |||
| target, now, pos, now, 0, false); | |||
| for (int i = mouseListeners.size(); --i >= 0;) | |||
| { | |||
| @@ -384,7 +365,7 @@ void Desktop::resetTimer() throw() | |||
| else | |||
| startTimer (100); | |||
| getMousePosition (lastFakeMouseMoveX, lastFakeMouseMoveY); | |||
| lastFakeMouseMove = getMousePosition(); | |||
| } | |||
| //============================================================================== | |||
| @@ -91,7 +91,7 @@ public: | |||
| If clippedToWorkArea is true, it will exclude any areas like the taskbar on Windows, | |||
| or the menu bar on Mac. If clippedToWorkArea is false, the entire monitor area is returned. | |||
| */ | |||
| const Rectangle<int> getMonitorAreaContaining (int x, int y, const bool clippedToWorkArea = true) const throw(); | |||
| const Rectangle<int> getMonitorAreaContaining (const Point<int>& position, const bool clippedToWorkArea = true) const throw(); | |||
| //============================================================================== | |||
| @@ -99,17 +99,17 @@ public: | |||
| The co-ordinates are relative to the top-left of the main monitor. | |||
| */ | |||
| static void getMousePosition (int& x, int& y) throw(); | |||
| static const Point<int> getMousePosition(); | |||
| /** Makes the mouse pointer jump to a given location. | |||
| The co-ordinates are relative to the top-left of the main monitor. | |||
| */ | |||
| static void setMousePosition (int x, int y) throw(); | |||
| static void setMousePosition (const Point<int>& newPosition); | |||
| /** Returns the last position at which a mouse button was pressed. | |||
| */ | |||
| static void getLastMouseDownPosition (int& x, int& y) throw(); | |||
| static const Point<int> getLastMouseDownPosition() throw(); | |||
| /** Returns the number of times the mouse button has been clicked since the | |||
| app started. | |||
| @@ -218,8 +218,7 @@ public: | |||
| Returns 0 if the co-ordinates are inside a non-Juce window. | |||
| */ | |||
| Component* findComponentAt (const int screenX, | |||
| const int screenY) const; | |||
| Component* findComponentAt (const Point<int>& screenPosition) const; | |||
| //============================================================================== | |||
| @@ -251,7 +250,8 @@ private: | |||
| Array <Rectangle<int> > monitorCoordsClipped, monitorCoordsUnclipped; | |||
| int lastFakeMouseMoveX, lastFakeMouseMoveY, mouseClickCounter; | |||
| Point<int> lastFakeMouseMove; | |||
| int mouseClickCounter; | |||
| bool mouseMovedSignificantlySincePressed; | |||
| struct RecentMouseDown | |||
| @@ -153,8 +153,7 @@ void ComponentBoundsConstrainer::setBoundsForComponent (Component* const compone | |||
| if (peer != 0) | |||
| border = peer->getFrameSize(); | |||
| limits = Desktop::getInstance().getMonitorAreaContaining (bounds.getCentreX(), | |||
| bounds.getCentreY()); | |||
| limits = Desktop::getInstance().getMonitorAreaContaining (bounds.getCentre()); | |||
| } | |||
| else | |||
| { | |||
| @@ -98,17 +98,14 @@ void ComponentMovementWatcher::componentMovedOrResized (Component&, bool wasMove | |||
| if (wasMoved) | |||
| { | |||
| int x = 0, y = 0; | |||
| component->relativePositionToOtherComponent (component->getTopLevelComponent(), x, y); | |||
| const Point<int> pos (component->relativePositionToOtherComponent (component->getTopLevelComponent(), Point<int>())); | |||
| wasMoved = (lastX != x || lastY != y); | |||
| lastX = x; | |||
| lastY = y; | |||
| wasMoved = lastBounds.getPosition() != pos; | |||
| lastBounds.setPosition (pos); | |||
| } | |||
| wasResized = (lastWidth != component->getWidth() || lastHeight != component->getHeight()); | |||
| lastWidth = component->getWidth(); | |||
| lastHeight = component->getHeight(); | |||
| wasResized = (lastBounds.getWidth() != component->getWidth() || lastBounds.getHeight() != component->getHeight()); | |||
| lastBounds.setSize (component->getWidth(), component->getHeight()); | |||
| if (wasMoved || wasResized) | |||
| componentMovedOrResized (wasMoved, wasResized); | |||
| @@ -81,7 +81,7 @@ private: | |||
| ComponentPeer* lastPeer; | |||
| VoidArray registeredParentComps; | |||
| bool reentrant; | |||
| int lastX, lastY, lastWidth, lastHeight; | |||
| Rectangle<int> lastBounds; | |||
| #ifdef JUCE_DEBUG | |||
| ScopedPointer <ComponentDeletionWatcher> deletionWatcher; | |||
| #endif | |||
| @@ -279,9 +279,8 @@ void MenuBarComponent::showMenu (int index) | |||
| if (prevCompDeletionChecker != 0 && ! prevCompDeletionChecker->hasBeenDeleted()) | |||
| prevFocused->grabKeyboardFocus(); | |||
| int mx, my; | |||
| getMouseXYRelative (mx, my); | |||
| updateItemUnderMouse (mx, my); | |||
| const Point<int> mousePos (getMouseXYRelative()); | |||
| updateItemUnderMouse (mousePos.getX(), mousePos.getY()); | |||
| repaint(); | |||
| if (result != 0) | |||
| @@ -320,10 +319,9 @@ void MenuBarComponent::mouseExit (const MouseEvent& e) | |||
| void MenuBarComponent::mouseDown (const MouseEvent& e) | |||
| { | |||
| const MouseEvent e2 (e.getEventRelativeTo (this)); | |||
| if (currentPopupIndex < 0) | |||
| { | |||
| const MouseEvent e2 (e.getEventRelativeTo (this)); | |||
| updateItemUnderMouse (e2.x, e2.y); | |||
| currentPopupIndex = -2; | |||
| @@ -440,9 +438,8 @@ void MenuBarComponent::timerCallback() | |||
| { | |||
| stopTimer(); | |||
| int mx, my; | |||
| getMouseXYRelative (mx, my); | |||
| updateItemUnderMouse (mx, my); | |||
| const Point<int> mousePos (getMouseXYRelative()); | |||
| updateItemUnderMouse (mousePos.getX(), mousePos.getY()); | |||
| } | |||
| @@ -271,8 +271,6 @@ public: | |||
| menuBarComponent (0), | |||
| managerOfChosenCommand (0), | |||
| componentAttachedTo (0), | |||
| lastMouseX (0), | |||
| lastMouseY (0), | |||
| minimumWidth (0), | |||
| maximumNumColumns (7), | |||
| standardItemHeight (0), | |||
| @@ -492,7 +490,7 @@ public: | |||
| void mouseWheelMove (const MouseEvent&, float /*amountX*/, float amountY) | |||
| { | |||
| alterChildYPos (roundToInt (-10.0f * amountY * PopupMenuSettings::scrollZone)); | |||
| lastMouseX = -1; | |||
| lastMouse = Point<int> (-1, -1); | |||
| } | |||
| bool keyPressed (const KeyPress& key) | |||
| @@ -572,10 +570,9 @@ public: | |||
| // as they'll expect the menu to go away, and in fact it'll just | |||
| // come back. So only dismiss synchronously if they're not on the original | |||
| // comp that we're attached to. | |||
| int mx, my; | |||
| componentAttachedTo->getMouseXYRelative (mx, my); | |||
| const Point<int> mousePos (componentAttachedTo->getMouseXYRelative()); | |||
| if (componentAttachedTo->reallyContains (mx, my, true)) | |||
| if (componentAttachedTo->reallyContains (mousePos.getX(), mousePos.getY(), true)) | |||
| { | |||
| postCommandMessage (PopupMenuSettings::dismissCommandId); // dismiss asynchrounously | |||
| return; | |||
| @@ -614,16 +611,13 @@ public: | |||
| startTimer (PopupMenuSettings::timerInterval); // do this in case it was called from a mouse | |||
| // move rather than a real timer callback | |||
| int mx, my; | |||
| Desktop::getMousePosition (mx, my); | |||
| int x = mx, y = my; | |||
| globalPositionToRelative (x, y); | |||
| const Point<int> globalMousePos (Desktop::getMousePosition()); | |||
| const Point<int> localMousePos (globalPositionToRelative (globalMousePos)); | |||
| const uint32 now = Time::getMillisecondCounter(); | |||
| if (now > timeEnteredCurrentChildComp + 100 | |||
| && reallyContains (x, y, true) | |||
| && reallyContains (localMousePos.getX(), localMousePos.getY(), true) | |||
| && currentChild->isValidComponent() | |||
| && (! disableMouseMoves) | |||
| && ! (activeSubMenu != 0 && activeSubMenu->isVisible())) | |||
| @@ -631,17 +625,17 @@ public: | |||
| showSubMenuFor (currentChild); | |||
| } | |||
| if (mx != lastMouseX || my != lastMouseY || now > lastMouseMoveTime + 350) | |||
| if (globalMousePos != lastMouse || now > lastMouseMoveTime + 350) | |||
| { | |||
| highlightItemUnderMouse (mx, my, x, y); | |||
| highlightItemUnderMouse (globalMousePos, localMousePos); | |||
| } | |||
| bool overScrollArea = false; | |||
| if (isScrolling() | |||
| && (isOver || (isDown && ((unsigned int) x) < (unsigned int) getWidth())) | |||
| && ((isScrollZoneActive (false) && y < PopupMenuSettings::scrollZone) | |||
| || (isScrollZoneActive (true) && y > getHeight() - PopupMenuSettings::scrollZone))) | |||
| && (isOver || (isDown && ((unsigned int) localMousePos.getX()) < (unsigned int) getWidth())) | |||
| && ((isScrollZoneActive (false) && localMousePos.getY() < PopupMenuSettings::scrollZone) | |||
| || (isScrollZoneActive (true) && localMousePos.getY() > getHeight() - PopupMenuSettings::scrollZone))) | |||
| { | |||
| if (now > lastScroll + 20) | |||
| { | |||
| @@ -651,13 +645,13 @@ public: | |||
| for (int i = 0; i < getNumChildComponents() && amount == 0; ++i) | |||
| amount = ((int) scrollAcceleration) * getChildComponent (i)->getHeight(); | |||
| alterChildYPos (y < PopupMenuSettings::scrollZone ? -amount : amount); | |||
| alterChildYPos (localMousePos.getY() < PopupMenuSettings::scrollZone ? -amount : amount); | |||
| lastScroll = now; | |||
| } | |||
| overScrollArea = true; | |||
| lastMouseX = -1; // trigger a mouse-move | |||
| lastMouse = Point<int> (-1, -1); // trigger a mouse-move | |||
| } | |||
| else | |||
| { | |||
| @@ -669,7 +663,7 @@ public: | |||
| if (hideOnExit && hasBeenOver && (! isOverAny) && activeSubMenu != 0) | |||
| { | |||
| activeSubMenu->updateMouseOverStatus (mx, my); | |||
| activeSubMenu->updateMouseOverStatus (globalMousePos); | |||
| isOverAny = isOverAnyMenu(); | |||
| } | |||
| @@ -715,7 +709,7 @@ public: | |||
| else if (wasDown && now > menuCreationTime + 250 | |||
| && ! (isDown || overScrollArea)) | |||
| { | |||
| isOver = reallyContains (x, y, true); | |||
| isOver = reallyContains (localMousePos.getX(), localMousePos.getY(), true); | |||
| if (isOver) | |||
| { | |||
| @@ -759,7 +753,7 @@ private: | |||
| Component* componentAttachedTo; | |||
| ScopedPointer <ComponentDeletionWatcher> attachedCompWatcher; | |||
| Rectangle<int> windowPos; | |||
| int lastMouseX, lastMouseY; | |||
| Point<int> lastMouse; | |||
| int minimumWidth, maximumNumColumns, standardItemHeight; | |||
| bool isOver, hasBeenOver, isDown, needsToScroll; | |||
| bool dismissOnMouseUp, hideOnExit, disableMouseMoves, hasAnyJuceCompHadFocus; | |||
| @@ -789,14 +783,13 @@ private: | |||
| && (isOver || (activeSubMenu != 0 && activeSubMenu->isOverChildren())); | |||
| } | |||
| void updateMouseOverStatus (const int mx, const int my) | |||
| void updateMouseOverStatus (const Point<int>& globalMousePos) | |||
| { | |||
| int rx = mx, ry = my; | |||
| globalPositionToRelative (rx, ry); | |||
| isOver = reallyContains (rx, ry, true); | |||
| const Point<int> relPos (globalPositionToRelative (globalMousePos)); | |||
| isOver = reallyContains (relPos.getX(), relPos.getY(), true); | |||
| if (activeSubMenu != 0) | |||
| activeSubMenu->updateMouseOverStatus (mx, my); | |||
| activeSubMenu->updateMouseOverStatus (globalMousePos); | |||
| } | |||
| bool treeContains (const Window* const window) const throw() | |||
| @@ -823,8 +816,8 @@ private: | |||
| const bool alignToRectangle) | |||
| { | |||
| const Rectangle<int> mon (Desktop::getInstance() | |||
| .getMonitorAreaContaining ((minX + maxX) / 2, | |||
| (minY + maxY) / 2, | |||
| .getMonitorAreaContaining (Point<int> ((minX + maxX) / 2, | |||
| (minY + maxY) / 2), | |||
| #if JUCE_MAC | |||
| true)); | |||
| #else | |||
| @@ -995,10 +988,7 @@ private: | |||
| windowPos.getHeight() - (PopupMenuSettings::scrollZone + m->getHeight())), | |||
| currentY); | |||
| const Rectangle<int> mon (Desktop::getInstance() | |||
| .getMonitorAreaContaining (windowPos.getX(), | |||
| windowPos.getY(), | |||
| true)); | |||
| const Rectangle<int> mon (Desktop::getInstance().getMonitorAreaContaining (windowPos.getPosition(), true)); | |||
| int deltaY = wantedY - currentY; | |||
| @@ -1124,15 +1114,13 @@ private: | |||
| if (childComp->isValidComponent() && childComp->itemInfo.hasActiveSubMenu()) | |||
| { | |||
| int left = 0, top = 0; | |||
| childComp->relativePositionToGlobal (left, top); | |||
| int right = childComp->getWidth(), bottom = childComp->getHeight(); | |||
| childComp->relativePositionToGlobal (right, bottom); | |||
| const Point<int> topLeft (childComp->relativePositionToGlobal (Point<int>())); | |||
| const Point<int> bottomRight (childComp->relativePositionToGlobal (Point<int> (childComp->getWidth(), childComp->getHeight()))); | |||
| activeSubMenu = Window::create (*(childComp->itemInfo.subMenu), | |||
| dismissOnMouseUp, | |||
| this, | |||
| left, right, top, bottom, | |||
| topLeft.getX(), bottomRight.getX(), topLeft.getY(), bottomRight.getY(), | |||
| 0, maximumNumColumns, | |||
| standardItemHeight, | |||
| false, 0, menuBarComponent, | |||
| @@ -1151,14 +1139,14 @@ private: | |||
| return false; | |||
| } | |||
| void highlightItemUnderMouse (const int mx, const int my, const int x, const int y) | |||
| void highlightItemUnderMouse (const Point<int>& globalMousePos, const Point<int>& localMousePos) | |||
| { | |||
| isOver = reallyContains (x, y, true); | |||
| isOver = reallyContains (localMousePos.getX(), localMousePos.getY(), true); | |||
| if (isOver) | |||
| hasBeenOver = true; | |||
| if (abs (lastMouseX - mx) > 2 || abs (lastMouseY - my) > 2) | |||
| if (lastMouse.getDistanceFrom (globalMousePos) > 2) | |||
| { | |||
| lastMouseMoveTime = Time::getApproximateMillisecondCounter(); | |||
| @@ -1173,7 +1161,7 @@ private: | |||
| jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()) | |||
| if (isOver && (activeSubMenu != 0) && (mx != lastMouseX || my != lastMouseY)) | |||
| if (isOver && (activeSubMenu != 0) && globalMousePos != lastMouse) | |||
| { | |||
| // try to intelligently guess whether the user is moving the mouse towards a currently-open | |||
| // submenu. To do this, look at whether the mouse stays inside a triangular region that | |||
| @@ -1183,31 +1171,30 @@ private: | |||
| if (activeSubMenu->getX() > getX()) | |||
| { | |||
| lastMouseX -= 2; // to enlarge the triangle a bit, in case the mouse only moves a couple of pixels | |||
| lastMouse -= Point<int> (2, 0); // to enlarge the triangle a bit, in case the mouse only moves a couple of pixels | |||
| } | |||
| else | |||
| { | |||
| lastMouseX += 2; | |||
| lastMouse += Point<int> (2, 0); | |||
| subX += activeSubMenu->getWidth(); | |||
| } | |||
| Path areaTowardsSubMenu; | |||
| areaTowardsSubMenu.addTriangle ((float) lastMouseX, | |||
| (float) lastMouseY, | |||
| areaTowardsSubMenu.addTriangle ((float) lastMouse.getX(), | |||
| (float) lastMouse.getY(), | |||
| subX, | |||
| (float) activeSubMenu->getScreenY(), | |||
| subX, | |||
| (float) (activeSubMenu->getScreenY() + activeSubMenu->getHeight())); | |||
| isMovingTowardsMenu = areaTowardsSubMenu.contains ((float) mx, (float) my); | |||
| isMovingTowardsMenu = areaTowardsSubMenu.contains ((float) globalMousePos.getX(), (float) globalMousePos.getY()); | |||
| } | |||
| lastMouseX = mx; | |||
| lastMouseY = my; | |||
| lastMouse = globalMousePos; | |||
| if (! isMovingTowardsMenu) | |||
| { | |||
| Component* c = getComponentAt (x, y); | |||
| Component* c = getComponentAt (localMousePos.getX(), localMousePos.getY()); | |||
| if (c == this) | |||
| c = 0; | |||
| @@ -1619,10 +1606,9 @@ int PopupMenu::show (const int itemIdThatMustBeVisible, | |||
| const int maximumNumColumns, | |||
| const int standardItemHeight) | |||
| { | |||
| int x, y; | |||
| Desktop::getMousePosition (x, y); | |||
| const Point<int> mousePos (Desktop::getMousePosition()); | |||
| return showAt (x, y, | |||
| return showAt (mousePos.getX(), mousePos.getY(), | |||
| itemIdThatMustBeVisible, | |||
| minimumWidth, | |||
| maximumNumColumns, | |||
| @@ -33,9 +33,7 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| ComponentDragger::ComponentDragger() | |||
| : constrainer (0), | |||
| originalX (0), | |||
| originalY (0) | |||
| : constrainer (0) | |||
| { | |||
| } | |||
| @@ -52,9 +50,7 @@ void ComponentDragger::startDraggingComponent (Component* const componentToDrag, | |||
| if (componentToDrag->isValidComponent()) | |||
| { | |||
| constrainer = constrainer_; | |||
| originalX = 0; | |||
| originalY = 0; | |||
| componentToDrag->relativePositionToGlobal (originalX, originalY); | |||
| originalPos = componentToDrag->relativePositionToGlobal (Point<int>()); | |||
| } | |||
| } | |||
| @@ -65,23 +61,22 @@ void ComponentDragger::dragComponent (Component* const componentToDrag, const Mo | |||
| if (componentToDrag->isValidComponent()) | |||
| { | |||
| int x = originalX; | |||
| int y = originalY; | |||
| Point<int> pos (originalPos); | |||
| int w = componentToDrag->getWidth(); | |||
| int h = componentToDrag->getHeight(); | |||
| const Component* const parentComp = componentToDrag->getParentComponent(); | |||
| if (parentComp != 0) | |||
| parentComp->globalPositionToRelative (x, y); | |||
| pos = parentComp->globalPositionToRelative (pos); | |||
| x += e.getDistanceFromDragStartX(); | |||
| y += e.getDistanceFromDragStartY(); | |||
| pos += Point<int> (e.getDistanceFromDragStartX(), | |||
| e.getDistanceFromDragStartY()); | |||
| if (constrainer != 0) | |||
| constrainer->setBoundsForComponent (componentToDrag, Rectangle<int> (x, y, w, h), | |||
| constrainer->setBoundsForComponent (componentToDrag, Rectangle<int> (pos.getX(), pos.getY(), w, h), | |||
| false, false, false, false); | |||
| else | |||
| componentToDrag->setBounds (x, y, w, h); | |||
| componentToDrag->setBounds (pos.getX(), pos.getY(), w, h); | |||
| } | |||
| } | |||
| @@ -98,7 +98,7 @@ public: | |||
| private: | |||
| ComponentBoundsConstrainer* constrainer; | |||
| int originalX, originalY; | |||
| Point<int> originalPos; | |||
| }; | |||
| #endif // __JUCE_COMPONENTDRAGGER_JUCEHEADER__ | |||
| @@ -53,7 +53,7 @@ private: | |||
| DragAndDropTarget* currentlyOver; | |||
| String dragDesc; | |||
| const int imageX, imageY; | |||
| const Point<int> imageOffset; | |||
| bool hasCheckedForExternalDrag, drawImage; | |||
| DragImageComponent (const DragImageComponent&); | |||
| @@ -64,14 +64,13 @@ public: | |||
| const String& desc, | |||
| Component* const s, | |||
| DragAndDropContainer* const o, | |||
| const int imageX_, const int imageY_) | |||
| const Point<int>& imageOffset_) | |||
| : image (im), | |||
| source (s), | |||
| owner (o), | |||
| currentlyOver (0), | |||
| dragDesc (desc), | |||
| imageX (imageX_), | |||
| imageY (imageY_), | |||
| imageOffset (imageOffset_), | |||
| hasCheckedForExternalDrag (false), | |||
| drawImage (true) | |||
| { | |||
| @@ -120,21 +119,19 @@ public: | |||
| } | |||
| } | |||
| DragAndDropTarget* findTarget (const int screenX, const int screenY, | |||
| int& relX, int& relY) const | |||
| DragAndDropTarget* findTarget (const Point<int>& screenPos, | |||
| Point<int>& relativePos) const | |||
| { | |||
| Component* hit = getParentComponent(); | |||
| if (hit == 0) | |||
| { | |||
| hit = Desktop::getInstance().findComponentAt (screenX, screenY); | |||
| hit = Desktop::getInstance().findComponentAt (screenPos); | |||
| } | |||
| else | |||
| { | |||
| int rx = screenX, ry = screenY; | |||
| hit->globalPositionToRelative (rx, ry); | |||
| hit = hit->getComponentAt (rx, ry); | |||
| const Point<int> relPos (hit->globalPositionToRelative (screenPos)); | |||
| hit = hit->getComponentAt (relPos.getX(), relPos.getY()); | |||
| } | |||
| // (note: use a local copy of the dragDesc member in case the callback runs | |||
| @@ -147,9 +144,7 @@ public: | |||
| if (ddt != 0 && ddt->isInterestedInDragSource (dragDescLocal, source)) | |||
| { | |||
| relX = screenX; | |||
| relY = screenY; | |||
| hit->globalPositionToRelative (relX, relY); | |||
| relativePos = hit->globalPositionToRelative (screenPos); | |||
| return ddt; | |||
| } | |||
| @@ -168,14 +163,12 @@ public: | |||
| bool dropAccepted = false; | |||
| DragAndDropTarget* ddt = 0; | |||
| int relX = 0, relY = 0; | |||
| Point<int> relPos; | |||
| if (isVisible()) | |||
| { | |||
| setVisible (false); | |||
| ddt = findTarget (e.getScreenX(), | |||
| e.getScreenY(), | |||
| relX, relY); | |||
| ddt = findTarget (e.getScreenPosition(), relPos); | |||
| // fade this component and remove it - it'll be deleted later by the timer callback | |||
| @@ -189,17 +182,15 @@ public: | |||
| } | |||
| else | |||
| { | |||
| int targetX = source->getWidth() / 2; | |||
| int targetY = source->getHeight() / 2; | |||
| source->relativePositionToGlobal (targetX, targetY); | |||
| const Point<int> target (source->relativePositionToGlobal (Point<int> (source->getWidth() / 2, | |||
| source->getHeight() / 2))); | |||
| int ourCentreX = getWidth() / 2; | |||
| int ourCentreY = getHeight() / 2; | |||
| relativePositionToGlobal (ourCentreX, ourCentreY); | |||
| const Point<int> ourCentre (relativePositionToGlobal (Point<int> (getWidth() / 2, | |||
| getHeight() / 2))); | |||
| fadeOutComponent (120, | |||
| targetX - ourCentreX, | |||
| targetY - ourCentreY); | |||
| target.getX() - ourCentre.getX(), | |||
| target.getY() - ourCentre.getY()); | |||
| } | |||
| } | |||
| @@ -215,31 +206,30 @@ public: | |||
| currentlyOverWatcher = 0; | |||
| currentlyOver = 0; | |||
| ddt->itemDropped (dragDescLocal, source, relX, relY); | |||
| ddt->itemDropped (dragDescLocal, source, relPos.getX(), relPos.getY()); | |||
| } | |||
| // careful - this object could now be deleted.. | |||
| } | |||
| } | |||
| void updateLocation (const bool canDoExternalDrag, int x, int y) | |||
| void updateLocation (const bool canDoExternalDrag, const Point<int>& screenPos) | |||
| { | |||
| // (note: use a local copy of the dragDesc member in case the callback runs | |||
| // a modal loop and deletes this object before it returns) | |||
| const String dragDescLocal (dragDesc); | |||
| int newX = x + imageX; | |||
| int newY = y + imageY; | |||
| Point<int> newPos (screenPos + imageOffset); | |||
| if (getParentComponent() != 0) | |||
| getParentComponent()->globalPositionToRelative (newX, newY); | |||
| newPos = getParentComponent()->globalPositionToRelative (newPos); | |||
| //if (newX != getX() || newY != getY()) | |||
| { | |||
| setTopLeftPosition (newX, newY); | |||
| setTopLeftPosition (newPos.getX(), newPos.getY()); | |||
| int relX = 0, relY = 0; | |||
| DragAndDropTarget* const ddt = findTarget (x, y, relX, relY); | |||
| Point<int> relPos; | |||
| DragAndDropTarget* const ddt = findTarget (screenPos, relPos); | |||
| drawImage = (ddt == 0) || ddt->shouldDrawDragImageWhenOver(); | |||
| @@ -266,7 +256,7 @@ public: | |||
| currentlyOverWatcher = new ComponentDeletionWatcher (dynamic_cast <Component*> (ddt)); | |||
| if (currentlyOver->isInterestedInDragSource (dragDescLocal, source)) | |||
| currentlyOver->itemDragEnter (dragDescLocal, source, relX, relY); | |||
| currentlyOver->itemDragEnter (dragDescLocal, source, relPos.getX(), relPos.getY()); | |||
| } | |||
| } | |||
| else if (currentlyOverWatcher != 0 && currentlyOverWatcher->hasBeenDeleted()) | |||
| @@ -277,13 +267,13 @@ public: | |||
| if (currentlyOver != 0 | |||
| && currentlyOver->isInterestedInDragSource (dragDescLocal, source)) | |||
| currentlyOver->itemDragMove (dragDescLocal, source, relX, relY); | |||
| currentlyOver->itemDragMove (dragDescLocal, source, relPos.getX(), relPos.getY()); | |||
| if (currentlyOver == 0 | |||
| && canDoExternalDrag | |||
| && ! hasCheckedForExternalDrag) | |||
| { | |||
| if (Desktop::getInstance().findComponentAt (x, y) == 0) | |||
| if (Desktop::getInstance().findComponentAt (screenPos) == 0) | |||
| { | |||
| hasCheckedForExternalDrag = true; | |||
| StringArray files; | |||
| @@ -311,7 +301,7 @@ public: | |||
| void mouseDrag (const MouseEvent& e) | |||
| { | |||
| if (e.originalComponent != this) | |||
| updateLocation (true, e.getScreenX(), e.getScreenY()); | |||
| updateLocation (true, e.getScreenPosition()); | |||
| } | |||
| void timerCallback() | |||
| @@ -355,9 +345,8 @@ void DragAndDropContainer::startDragging (const String& sourceDescription, | |||
| if (thisComp != 0) | |||
| { | |||
| int mx, my; | |||
| Desktop::getLastMouseDownPosition (mx, my); | |||
| int imageX = 0, imageY = 0; | |||
| const Point<int> lastMouseDown (Desktop::getLastMouseDownPosition()); | |||
| Point<int> imageOffset; | |||
| if (dragImage == 0) | |||
| { | |||
| @@ -377,18 +366,17 @@ void DragAndDropContainer::startDragging (const String& sourceDescription, | |||
| const int lo = 150; | |||
| const int hi = 400; | |||
| int rx = mx, ry = my; | |||
| sourceComponent->globalPositionToRelative (rx, ry); | |||
| const int cx = jlimit (0, dragImage->getWidth(), rx); | |||
| const int cy = jlimit (0, dragImage->getHeight(), ry); | |||
| Point<int> relPos (sourceComponent->globalPositionToRelative (lastMouseDown)); | |||
| Point<int> clipped (Rectangle<int> (0, 0, dragImage->getWidth(), dragImage->getHeight()) | |||
| .getConstrainedPoint (relPos)); | |||
| for (int y = dragImage->getHeight(); --y >= 0;) | |||
| { | |||
| const double dy = (y - cy) * (y - cy); | |||
| const double dy = (y - clipped.getY()) * (y - clipped.getY()); | |||
| for (int x = dragImage->getWidth(); --x >= 0;) | |||
| { | |||
| const int dx = x - cx; | |||
| const int dx = x - clipped.getX(); | |||
| const int distance = roundToInt (sqrt (dx * dx + dy)); | |||
| if (distance > lo) | |||
| @@ -402,25 +390,19 @@ void DragAndDropContainer::startDragging (const String& sourceDescription, | |||
| } | |||
| } | |||
| imageX = -cx; | |||
| imageY = -cy; | |||
| imageOffset = Point<int>() - clipped; | |||
| } | |||
| else | |||
| { | |||
| if (imageOffsetFromMouse == 0) | |||
| { | |||
| imageX = dragImage->getWidth() / -2; | |||
| imageY = dragImage->getHeight() / -2; | |||
| } | |||
| imageOffset = Point<int> (dragImage->getWidth() / -2, | |||
| dragImage->getHeight() / -2); | |||
| else | |||
| { | |||
| imageX = imageOffsetFromMouse->getX(); | |||
| imageY = imageOffsetFromMouse->getY(); | |||
| } | |||
| imageOffset = *imageOffsetFromMouse; | |||
| } | |||
| dragImageComponent = new DragImageComponent (dragImage.release(), sourceDescription, sourceComponent, | |||
| this, imageX, imageY); | |||
| this, imageOffset); | |||
| currentDragDesc = sourceDescription; | |||
| @@ -436,7 +418,7 @@ void DragAndDropContainer::startDragging (const String& sourceDescription, | |||
| else | |||
| thisComp->addChildComponent (dragImageComponent); | |||
| ((DragImageComponent*) dragImageComponent)->updateLocation (false, mx, my); | |||
| ((DragImageComponent*) dragImageComponent)->updateLocation (false, lastMouseDown); | |||
| dragImageComponent->setVisible (true); | |||
| } | |||
| else | |||
| @@ -32,24 +32,21 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| MouseEvent::MouseEvent (const int x_, | |||
| const int y_, | |||
| MouseEvent::MouseEvent (const Point<int>& position, | |||
| const ModifierKeys& mods_, | |||
| Component* const originator, | |||
| const Time& eventTime_, | |||
| const int mouseDownX_, | |||
| const int mouseDownY_, | |||
| const Point<int> mouseDownPos_, | |||
| const Time& mouseDownTime_, | |||
| const int numberOfClicks_, | |||
| const bool mouseWasDragged) throw() | |||
| : x (x_), | |||
| y (y_), | |||
| : x (position.getX()), | |||
| y (position.getY()), | |||
| mods (mods_), | |||
| eventComponent (originator), | |||
| originalComponent (originator), | |||
| eventTime (eventTime_), | |||
| mouseDownX (mouseDownX_), | |||
| mouseDownY (mouseDownY_), | |||
| mouseDownPos (mouseDownPos_), | |||
| mouseDownTime (mouseDownTime_), | |||
| numberOfClicks (numberOfClicks_), | |||
| wasMovedSinceMouseDown (mouseWasDragged) | |||
| @@ -68,22 +65,27 @@ bool MouseEvent::mouseWasClicked() const throw() | |||
| int MouseEvent::getMouseDownX() const throw() | |||
| { | |||
| return mouseDownX; | |||
| return mouseDownPos.getX(); | |||
| } | |||
| int MouseEvent::getMouseDownY() const throw() | |||
| { | |||
| return mouseDownY; | |||
| return mouseDownPos.getY(); | |||
| } | |||
| const Point<int> MouseEvent::getMouseDownPosition() const throw() | |||
| { | |||
| return mouseDownPos; | |||
| } | |||
| int MouseEvent::getDistanceFromDragStartX() const throw() | |||
| { | |||
| return x - mouseDownX; | |||
| return x - mouseDownPos.getX(); | |||
| } | |||
| int MouseEvent::getDistanceFromDragStartY() const throw() | |||
| { | |||
| return y - mouseDownY; | |||
| return y - mouseDownPos.getY(); | |||
| } | |||
| int MouseEvent::getDistanceFromDragStart() const throw() | |||
| @@ -101,32 +103,39 @@ int MouseEvent::getLengthOfMousePress() const throw() | |||
| } | |||
| //============================================================================== | |||
| int MouseEvent::getScreenX() const throw() | |||
| const Point<int> MouseEvent::getPosition() const throw() | |||
| { | |||
| return Point<int> (x, y); | |||
| } | |||
| int MouseEvent::getScreenX() const | |||
| { | |||
| return getScreenPosition().getX(); | |||
| } | |||
| int MouseEvent::getScreenY() const | |||
| { | |||
| int sx = x, sy = y; | |||
| eventComponent->relativePositionToGlobal (sx, sy); | |||
| return sx; | |||
| return getScreenPosition().getY(); | |||
| } | |||
| int MouseEvent::getScreenY() const throw() | |||
| const Point<int> MouseEvent::getScreenPosition() const | |||
| { | |||
| int sx = x, sy = y; | |||
| eventComponent->relativePositionToGlobal (sx, sy); | |||
| return sy; | |||
| return eventComponent->relativePositionToGlobal (Point<int> (x, y)); | |||
| } | |||
| int MouseEvent::getMouseDownScreenX() const throw() | |||
| int MouseEvent::getMouseDownScreenX() const | |||
| { | |||
| int sx = mouseDownX, sy = mouseDownY; | |||
| eventComponent->relativePositionToGlobal (sx, sy); | |||
| return sx; | |||
| return getMouseDownScreenPosition().getX(); | |||
| } | |||
| int MouseEvent::getMouseDownScreenY() const throw() | |||
| int MouseEvent::getMouseDownScreenY() const | |||
| { | |||
| int sx = mouseDownX, sy = mouseDownY; | |||
| eventComponent->relativePositionToGlobal (sx, sy); | |||
| return sy; | |||
| return getMouseDownScreenPosition().getY(); | |||
| } | |||
| const Point<int> MouseEvent::getMouseDownScreenPosition() const | |||
| { | |||
| return eventComponent->relativePositionToGlobal (mouseDownPos); | |||
| } | |||
| //============================================================================== | |||
| @@ -138,13 +147,14 @@ const MouseEvent MouseEvent::getEventRelativeTo (Component* const otherComponent | |||
| return *this; | |||
| } | |||
| MouseEvent me (*this); | |||
| eventComponent->relativePositionToOtherComponent (otherComponent, me.x, me.y); | |||
| eventComponent->relativePositionToOtherComponent (otherComponent, me.mouseDownX, me.mouseDownY); | |||
| me.eventComponent = otherComponent; | |||
| return me; | |||
| return MouseEvent (eventComponent->relativePositionToOtherComponent (otherComponent, Point<int> (x, y)), | |||
| mods, | |||
| originalComponent, | |||
| eventTime, | |||
| eventComponent->relativePositionToOtherComponent (otherComponent, mouseDownPos), | |||
| mouseDownTime, | |||
| numberOfClicks, | |||
| wasMovedSinceMouseDown); | |||
| } | |||
| //============================================================================== | |||
| @@ -29,6 +29,7 @@ | |||
| class Component; | |||
| #include "../keyboard/juce_ModifierKeys.h" | |||
| #include "../../../core/juce_Time.h" | |||
| #include "../../graphics/geometry/juce_Point.h" | |||
| //============================================================================== | |||
| @@ -46,29 +47,24 @@ public: | |||
| Normally an application will never need to use this. | |||
| @param x the x position of the mouse, relative to the component that is passed-in | |||
| @param y the y position of the mouse, relative to the component that is passed-in | |||
| @param position the position of the mouse, relative to the component that is passed-in | |||
| @param modifiers the key modifiers at the time of the event | |||
| @param originator the component that the mouse event applies to | |||
| @param eventTime the time the event happened | |||
| @param mouseDownX the x position of the corresponding mouse-down event (relative to the component that is passed-in). | |||
| @param mouseDownPos the position of the corresponding mouse-down event (relative to the component that is passed-in). | |||
| If there isn't a corresponding mouse-down (e.g. for a mouse-move), this will just be | |||
| the same as the current mouse-x position. | |||
| @param mouseDownY the y position of the corresponding mouse-down event (relative to the component that is passed-in) | |||
| If there isn't a corresponding mouse-down (e.g. for a mouse-move), this will just be | |||
| the same as the current mouse-y position. | |||
| @param mouseDownTime the time at which the corresponding mouse-down event happened | |||
| If there isn't a corresponding mouse-down (e.g. for a mouse-move), this will just be | |||
| the same as the current mouse-event time. | |||
| @param numberOfClicks how many clicks, e.g. a double-click event will be 2, a triple-click will be 3, etc | |||
| @param mouseWasDragged whether the mouse has been dragged significantly since the previous mouse-down | |||
| */ | |||
| MouseEvent (const int x, const int y, | |||
| MouseEvent (const Point<int>& position, | |||
| const ModifierKeys& modifiers, | |||
| Component* const originator, | |||
| const Time& eventTime, | |||
| const int mouseDownX, | |||
| const int mouseDownY, | |||
| const Point<int> mouseDownPos, | |||
| const Time& mouseDownTime, | |||
| const int numberOfClicks, | |||
| const bool mouseWasDragged) throw(); | |||
| @@ -146,6 +142,14 @@ public: | |||
| */ | |||
| int getMouseDownY() const throw(); | |||
| /** Returns the co-ordinates of the last place that a mouse was pressed. | |||
| The co-ordinates are relative to the component specified in MouseEvent::component. | |||
| @see getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasClicked | |||
| */ | |||
| const Point<int> getMouseDownPosition() const throw(); | |||
| /** Returns the straight-line distance between where the mouse is now and where it | |||
| was the last time the button was pressed. | |||
| @@ -203,13 +207,20 @@ public: | |||
| int getLengthOfMousePress() const throw(); | |||
| //============================================================================== | |||
| /** The position of the mouse when the event occurred. | |||
| This position is relative to the top-left of the component to which the | |||
| event applies (as indicated by the MouseEvent::eventComponent field). | |||
| */ | |||
| const Point<int> getPosition() const throw(); | |||
| /** Returns the mouse x position of this event, in global screen co-ordinates. | |||
| The co-ordinates are relative to the top-left of the main monitor. | |||
| @see getMouseDownScreenX, Desktop::getMousePosition | |||
| */ | |||
| int getScreenX() const throw(); | |||
| int getScreenX() const; | |||
| /** Returns the mouse y position of this event, in global screen co-ordinates. | |||
| @@ -217,7 +228,15 @@ public: | |||
| @see getMouseDownScreenY, Desktop::getMousePosition | |||
| */ | |||
| int getScreenY() const throw(); | |||
| int getScreenY() const; | |||
| /** Returns the mouse position of this event, in global screen co-ordinates. | |||
| The co-ordinates are relative to the top-left of the main monitor. | |||
| @see getMouseDownScreenY, Desktop::getMousePosition | |||
| */ | |||
| const Point<int> getScreenPosition() const; | |||
| /** Returns the x co-ordinate at which the mouse button was last pressed. | |||
| @@ -225,7 +244,7 @@ public: | |||
| @see getScreenX, Desktop::getMousePosition | |||
| */ | |||
| int getMouseDownScreenX() const throw(); | |||
| int getMouseDownScreenX() const; | |||
| /** Returns the y co-ordinate at which the mouse button was last pressed. | |||
| @@ -233,7 +252,15 @@ public: | |||
| @see getScreenY, Desktop::getMousePosition | |||
| */ | |||
| int getMouseDownScreenY() const throw(); | |||
| int getMouseDownScreenY() const; | |||
| /** Returns the co-ordinates at which the mouse button was last pressed. | |||
| The co-ordinates are relative to the top-left of the main monitor. | |||
| @see getScreenY, Desktop::getMousePosition | |||
| */ | |||
| const Point<int> getMouseDownScreenPosition() const; | |||
| //============================================================================== | |||
| /** Creates a version of this event that is relative to a different component. | |||
| @@ -267,7 +294,7 @@ public: | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| int mouseDownX, mouseDownY; | |||
| Point<int> mouseDownPos; | |||
| Time mouseDownTime; | |||
| int numberOfClicks; | |||
| bool wasMovedSinceMouseDown; | |||
| @@ -78,13 +78,12 @@ void MouseHoverDetector::hoverTimerCallback() | |||
| if (source != 0) | |||
| { | |||
| int mx, my; | |||
| source->getMouseXYRelative (mx, my); | |||
| const Point<int> pos (source->getMouseXYRelative()); | |||
| if (source->reallyContains (mx, my, false)) | |||
| if (source->reallyContains (pos.getX(), pos.getY(), false)) | |||
| { | |||
| hasJustHovered = true; | |||
| mouseHovered (mx, my); | |||
| mouseHovered (pos.getX(), pos.getY()); | |||
| } | |||
| } | |||
| } | |||
| @@ -98,15 +98,14 @@ void BubbleComponent::setPosition (Component* componentToPointTo) | |||
| { | |||
| jassert (componentToPointTo->isValidComponent()); | |||
| int tx = 0; | |||
| int ty = 0; | |||
| Point<int> pos; | |||
| if (getParentComponent() != 0) | |||
| componentToPointTo->relativePositionToOtherComponent (getParentComponent(), tx, ty); | |||
| pos = componentToPointTo->relativePositionToOtherComponent (getParentComponent(), pos); | |||
| else | |||
| componentToPointTo->relativePositionToGlobal (tx, ty); | |||
| pos = componentToPointTo->relativePositionToGlobal (pos); | |||
| setPosition (Rectangle<int> (tx, ty, componentToPointTo->getWidth(), componentToPointTo->getHeight())); | |||
| setPosition (Rectangle<int> (pos.getX(), pos.getY(), componentToPointTo->getWidth(), componentToPointTo->getHeight())); | |||
| } | |||
| void BubbleComponent::setPosition (const int arrowTipX_, | |||
| @@ -76,11 +76,11 @@ public: | |||
| peer->grabFocus(); | |||
| } | |||
| void textInputRequired (int x, int y) | |||
| void textInputRequired (const Point<int>& position) | |||
| { | |||
| ComponentPeer* peer = magnifierComp->getPeer(); | |||
| if (peer != 0) | |||
| peer->textInputRequired (x, y); | |||
| peer->textInputRequired (position); | |||
| } | |||
| void getBounds (int& x, int& y, int& w, int& h) const | |||
| @@ -91,25 +91,25 @@ public: | |||
| h = component->getHeight(); | |||
| } | |||
| int getScreenX() const { return magnifierComp->getScreenX(); } | |||
| int getScreenY() const { return magnifierComp->getScreenY(); } | |||
| const Point<int> getScreenPosition() const | |||
| { | |||
| return magnifierComp->getScreenPosition(); | |||
| } | |||
| void relativePositionToGlobal (int& x, int& y) | |||
| const Point<int> relativePositionToGlobal (const Point<int>& relativePosition) | |||
| { | |||
| const double zoom = magnifierComp->getScaleFactor(); | |||
| x = roundToInt (x * zoom); | |||
| y = roundToInt (y * zoom); | |||
| magnifierComp->relativePositionToGlobal (x, y); | |||
| return magnifierComp->relativePositionToGlobal (Point<int> (roundToInt (relativePosition.getX() * zoom), | |||
| roundToInt (relativePosition.getY() * zoom))); | |||
| } | |||
| void globalPositionToRelative (int& x, int& y) | |||
| const Point<int> globalPositionToRelative (const Point<int>& screenPosition) | |||
| { | |||
| magnifierComp->globalPositionToRelative (x, y); | |||
| const Point<int> p (magnifierComp->globalPositionToRelative (screenPosition)); | |||
| const double zoom = magnifierComp->getScaleFactor(); | |||
| x = roundToInt (x / zoom); | |||
| y = roundToInt (y / zoom); | |||
| return Point<int> (roundToInt (p.getX() / zoom), | |||
| roundToInt (p.getY() / zoom)); | |||
| } | |||
| bool contains (int x, int y, bool) const | |||
| @@ -251,27 +251,29 @@ int MidiKeyboardComponent::getKeyStartPosition (const int midiNoteNumber) const | |||
| static const uint8 whiteNotes[] = { 0, 2, 4, 5, 7, 9, 11 }; | |||
| static const uint8 blackNotes[] = { 1, 3, 6, 8, 10 }; | |||
| int MidiKeyboardComponent::xyToNote (int x, int y, float& mousePositionVelocity) | |||
| int MidiKeyboardComponent::xyToNote (const Point<int>& pos, float& mousePositionVelocity) | |||
| { | |||
| if (! reallyContains (x, y, false)) | |||
| if (! reallyContains (pos.getX(), pos.getY(), false)) | |||
| return -1; | |||
| Point<int> p (pos); | |||
| if (orientation != horizontalKeyboard) | |||
| { | |||
| swapVariables (x, y); | |||
| p = Point<int> (p.getY(), p.getX()); | |||
| if (orientation == verticalKeyboardFacingLeft) | |||
| y = getWidth() - y; | |||
| p = Point<int> (p.getX(), getWidth() - p.getY()); | |||
| else | |||
| x = getHeight() - x; | |||
| p = Point<int> (getHeight() - p.getX(), p.getY()); | |||
| } | |||
| return remappedXYToNote (x + xOffset, y, mousePositionVelocity); | |||
| return remappedXYToNote (p + Point<int> (xOffset, 0), mousePositionVelocity); | |||
| } | |||
| int MidiKeyboardComponent::remappedXYToNote (int x, int y, float& mousePositionVelocity) const | |||
| int MidiKeyboardComponent::remappedXYToNote (const Point<int>& pos, float& mousePositionVelocity) const | |||
| { | |||
| if (y < blackNoteLength) | |||
| if (pos.getY() < blackNoteLength) | |||
| { | |||
| for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12) | |||
| { | |||
| @@ -285,9 +287,9 @@ int MidiKeyboardComponent::remappedXYToNote (int x, int y, float& mousePositionV | |||
| getKeyPos (note, kx, kw); | |||
| kx += xOffset; | |||
| if (x >= kx && x < kx + kw) | |||
| if (pos.getX() >= kx && pos.getX() < kx + kw) | |||
| { | |||
| mousePositionVelocity = y / (float) blackNoteLength; | |||
| mousePositionVelocity = pos.getY() / (float) blackNoteLength; | |||
| return note; | |||
| } | |||
| } | |||
| @@ -307,10 +309,10 @@ int MidiKeyboardComponent::remappedXYToNote (int x, int y, float& mousePositionV | |||
| getKeyPos (note, kx, kw); | |||
| kx += xOffset; | |||
| if (x >= kx && x < kx + kw) | |||
| if (pos.getX() >= kx && pos.getX() < kx + kw) | |||
| { | |||
| const int whiteNoteLength = (orientation == horizontalKeyboard) ? getHeight() : getWidth(); | |||
| mousePositionVelocity = y / (float) whiteNoteLength; | |||
| mousePositionVelocity = pos.getY() / (float) whiteNoteLength; | |||
| return note; | |||
| } | |||
| } | |||
| @@ -643,7 +645,7 @@ void MidiKeyboardComponent::resized() | |||
| float mousePositionVelocity; | |||
| const int spaceAvailable = w - scrollButtonW * 2; | |||
| const int lastStartKey = remappedXYToNote (endOfLastKey - spaceAvailable, 0, mousePositionVelocity) + 1; | |||
| const int lastStartKey = remappedXYToNote (Point<int> (endOfLastKey - spaceAvailable, 0), mousePositionVelocity) + 1; | |||
| if (lastStartKey >= 0 && firstKey > lastStartKey) | |||
| { | |||
| @@ -699,11 +701,11 @@ void MidiKeyboardComponent::resetAnyKeysInUse() | |||
| } | |||
| } | |||
| void MidiKeyboardComponent::updateNoteUnderMouse (int x, int y) | |||
| void MidiKeyboardComponent::updateNoteUnderMouse (const Point<int>& pos) | |||
| { | |||
| float mousePositionVelocity = 0.0f; | |||
| const int newNote = (mouseDragging || isMouseOver()) | |||
| ? xyToNote (x, y, mousePositionVelocity) : -1; | |||
| ? xyToNote (pos, mousePositionVelocity) : -1; | |||
| if (noteUnderMouse != newNote) | |||
| { | |||
| @@ -735,19 +737,19 @@ void MidiKeyboardComponent::updateNoteUnderMouse (int x, int y) | |||
| void MidiKeyboardComponent::mouseMove (const MouseEvent& e) | |||
| { | |||
| updateNoteUnderMouse (e.x, e.y); | |||
| updateNoteUnderMouse (e.getPosition()); | |||
| stopTimer(); | |||
| } | |||
| void MidiKeyboardComponent::mouseDrag (const MouseEvent& e) | |||
| { | |||
| float mousePositionVelocity; | |||
| const int newNote = xyToNote (e.x, e.y, mousePositionVelocity); | |||
| const int newNote = xyToNote (e.getPosition(), mousePositionVelocity); | |||
| if (newNote >= 0) | |||
| mouseDraggedToKey (newNote, e); | |||
| updateNoteUnderMouse (e.x, e.y); | |||
| updateNoteUnderMouse (e.getPosition()); | |||
| } | |||
| bool MidiKeyboardComponent::mouseDownOnKey (int /*midiNoteNumber*/, const MouseEvent&) | |||
| @@ -762,7 +764,7 @@ void MidiKeyboardComponent::mouseDraggedToKey (int /*midiNoteNumber*/, const Mou | |||
| void MidiKeyboardComponent::mouseDown (const MouseEvent& e) | |||
| { | |||
| float mousePositionVelocity; | |||
| const int newNote = xyToNote (e.x, e.y, mousePositionVelocity); | |||
| const int newNote = xyToNote (e.getPosition(), mousePositionVelocity); | |||
| mouseDragging = false; | |||
| if (newNote >= 0 && mouseDownOnKey (newNote, e)) | |||
| @@ -771,7 +773,7 @@ void MidiKeyboardComponent::mouseDown (const MouseEvent& e) | |||
| noteUnderMouse = -1; | |||
| mouseDragging = true; | |||
| updateNoteUnderMouse (e.x, e.y); | |||
| updateNoteUnderMouse (e.getPosition()); | |||
| startTimer (500); | |||
| } | |||
| } | |||
| @@ -779,19 +781,19 @@ void MidiKeyboardComponent::mouseDown (const MouseEvent& e) | |||
| void MidiKeyboardComponent::mouseUp (const MouseEvent& e) | |||
| { | |||
| mouseDragging = false; | |||
| updateNoteUnderMouse (e.x, e.y); | |||
| updateNoteUnderMouse (e.getPosition()); | |||
| stopTimer(); | |||
| } | |||
| void MidiKeyboardComponent::mouseEnter (const MouseEvent& e) | |||
| { | |||
| updateNoteUnderMouse (e.x, e.y); | |||
| updateNoteUnderMouse (e.getPosition()); | |||
| } | |||
| void MidiKeyboardComponent::mouseExit (const MouseEvent& e) | |||
| { | |||
| updateNoteUnderMouse (e.x, e.y); | |||
| updateNoteUnderMouse (e.getPosition()); | |||
| } | |||
| void MidiKeyboardComponent::mouseWheelMove (const MouseEvent&, float ix, float iy) | |||
| @@ -801,10 +803,7 @@ void MidiKeyboardComponent::mouseWheelMove (const MouseEvent&, float ix, float i | |||
| void MidiKeyboardComponent::timerCallback() | |||
| { | |||
| int mx, my; | |||
| getMouseXYRelative (mx, my); | |||
| updateNoteUnderMouse (mx, my); | |||
| updateNoteUnderMouse (getMouseXYRelative()); | |||
| } | |||
| //============================================================================== | |||
| @@ -405,10 +405,10 @@ private: | |||
| int octaveNumForMiddleC; | |||
| void getKeyPos (int midiNoteNumber, int& x, int& w) const; | |||
| int xyToNote (int x, int y, float& mousePositionVelocity); | |||
| int remappedXYToNote (int x, int y, float& mousePositionVelocity) const; | |||
| int xyToNote (const Point<int>& pos, float& mousePositionVelocity); | |||
| int remappedXYToNote (const Point<int>& pos, float& mousePositionVelocity) const; | |||
| void resetAnyKeysInUse(); | |||
| void updateNoteUnderMouse (int x, int y); | |||
| void updateNoteUnderMouse (const Point<int>& pos); | |||
| void repaintNote (const int midiNoteNumber); | |||
| MidiKeyboardComponent (const MidiKeyboardComponent&); | |||
| @@ -259,9 +259,8 @@ void OpenGLComponent::paint (Graphics&) | |||
| if (peer != 0) | |||
| { | |||
| peer->addMaskedRegion (getScreenX() - peer->getScreenX(), | |||
| getScreenY() - peer->getScreenY(), | |||
| getWidth(), getHeight()); | |||
| const Point<int> topLeft (getScreenPosition() - peer->getScreenPosition()); | |||
| peer->addMaskedRegion (topLeft.getX(), topLeft.getY(), getWidth(), getHeight()); | |||
| } | |||
| } | |||
| } | |||
| @@ -114,24 +114,22 @@ void ComponentPeer::handleMouseEnter (int x, int y, const int64 time) | |||
| { | |||
| jassert (Component::componentUnderMouse->isValidComponent()); | |||
| const int oldX = x; | |||
| const int oldY = y; | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseExit (x, y, time); | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseExit (relPos.getX(), relPos.getY(), time); | |||
| Component::componentUnderMouse = 0; | |||
| if (deletionChecker.hasBeenDeleted()) | |||
| return; | |||
| c = component->getComponentAt (oldX, oldY); | |||
| c = component->getComponentAt (x, y); | |||
| } | |||
| Component::componentUnderMouse = c; | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseEnter (x, y, time); | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseEnter (relPos.getX(), relPos.getY(), time); | |||
| } | |||
| } | |||
| @@ -147,16 +145,10 @@ void ComponentPeer::handleMouseMove (int x, int y, const int64 time) | |||
| if (c != Component::componentUnderMouse) | |||
| { | |||
| const int oldX = x; | |||
| const int oldY = y; | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseExit (x, y, time); | |||
| x = oldX; | |||
| y = oldY; | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseExit (relPos.getX(), relPos.getY(), time); | |||
| Component::componentUnderMouse = 0; | |||
| if (deletionChecker.hasBeenDeleted()) | |||
| @@ -169,10 +161,8 @@ void ComponentPeer::handleMouseMove (int x, int y, const int64 time) | |||
| if (c != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (c, x, y); | |||
| c->internalMouseEnter (x, y, time); | |||
| x = oldX; | |||
| y = oldY; | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (c, Point<int> (x, y))); | |||
| c->internalMouseEnter (relPos.getX(), relPos.getY(), time); | |||
| if (deletionChecker.hasBeenDeleted()) | |||
| return; // if this window has just been deleted.. | |||
| @@ -181,8 +171,8 @@ void ComponentPeer::handleMouseMove (int x, int y, const int64 time) | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseMove (x, y, time); | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseMove (relPos.getX(), relPos.getY(), time); | |||
| } | |||
| } | |||
| @@ -197,8 +187,8 @@ void ComponentPeer::handleMouseDown (int x, int y, const int64 time) | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseDown (x, y, time); | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseDown (relPos.getX(), relPos.getY(), time); | |||
| } | |||
| } | |||
| } | |||
| @@ -209,8 +199,8 @@ void ComponentPeer::handleMouseDrag (int x, int y, const int64 time) | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseDrag (x, y, time); | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseDrag (relPos.getX(), relPos.getY(), time); | |||
| } | |||
| } | |||
| @@ -225,39 +215,34 @@ void ComponentPeer::handleMouseUp (const int oldModifiers, int x, int y, const i | |||
| if (c != Component::componentUnderMouse) | |||
| { | |||
| const int oldX = x; | |||
| const int oldY = y; | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseUp (oldModifiers, x, y, time); | |||
| x = oldX; | |||
| y = oldY; | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseUp (oldModifiers, relPos.getX(), relPos.getY(), time); | |||
| if (Component::componentUnderMouse != 0) | |||
| Component::componentUnderMouse->internalMouseExit (x, y, time); | |||
| Component::componentUnderMouse->internalMouseExit (relPos.getX(), relPos.getY(), time); | |||
| if (deletionChecker.hasBeenDeleted()) | |||
| return; | |||
| c = component->getComponentAt (oldX, oldY); | |||
| c = component->getComponentAt (x, y); | |||
| } | |||
| Component::componentUnderMouse = c; | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseEnter (x, y, time); | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseEnter (relPos.getX(), relPos.getY(), time); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseUp (oldModifiers, x, y, time); | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseUp (oldModifiers, relPos.getX(), relPos.getY(), time); | |||
| } | |||
| } | |||
| } | |||
| @@ -270,9 +255,8 @@ void ComponentPeer::handleMouseExit (int x, int y, const int64 time) | |||
| if (Component::componentUnderMouse != 0) | |||
| { | |||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | |||
| Component::componentUnderMouse->internalMouseExit (x, y, time); | |||
| const Point<int> relPos (component->relativePositionToOtherComponent (Component::componentUnderMouse, Point<int> (x, y))); | |||
| Component::componentUnderMouse->internalMouseExit (relPos.getX(), relPos.getY(), time); | |||
| Component::componentUnderMouse = 0; | |||
| } | |||
| } | |||
| @@ -299,14 +283,13 @@ void ComponentPeer::sendFakeMouseMove() throw() | |||
| component->bounds_.setBounds (realX, realY, realW, realH); | |||
| } | |||
| int x, y; | |||
| component->getMouseXYRelative (x, y); | |||
| const Point<int> pos (component->getMouseXYRelative()); | |||
| if (((unsigned int) x) < (unsigned int) component->getWidth() | |||
| && ((unsigned int) y) < (unsigned int) component->getHeight() | |||
| && contains (x, y, false)) | |||
| if (((unsigned int) pos.getX()) < (unsigned int) component->getWidth() | |||
| && ((unsigned int) pos.getY()) < (unsigned int) component->getHeight() | |||
| && contains (pos.getX(), pos.getY(), false)) | |||
| { | |||
| postMessage (new Message (fakeMouseMoveMessage, x, y, 0)); | |||
| postMessage (new Message (fakeMouseMoveMessage, pos.getX(), pos.getY(), 0)); | |||
| } | |||
| fakeMouseMessageSent = true; | |||
| @@ -638,11 +621,10 @@ void ComponentPeer::handleFileDragMove (const StringArray& files, int x, int y) | |||
| if (newTarget != 0) | |||
| { | |||
| Component* const targetComp = dynamic_cast <Component*> (newTarget); | |||
| int mx = x, my = y; | |||
| component->relativePositionToOtherComponent (targetComp, mx, my); | |||
| const Point<int> pos (component->relativePositionToOtherComponent (targetComp, Point<int> (x, y))); | |||
| dragAndDropTargetComponent = new ComponentDeletionWatcher (dynamic_cast <Component*> (newTarget)); | |||
| newTarget->fileDragEnter (files, mx, my); | |||
| newTarget->fileDragEnter (files, pos.getX(), pos.getY()); | |||
| } | |||
| } | |||
| } | |||
| @@ -654,9 +636,9 @@ void ComponentPeer::handleFileDragMove (const StringArray& files, int x, int y) | |||
| if (newTarget != 0) | |||
| { | |||
| Component* const targetComp = dynamic_cast <Component*> (newTarget); | |||
| component->relativePositionToOtherComponent (targetComp, x, y); | |||
| const Point<int> pos (component->relativePositionToOtherComponent (targetComp, Point<int> (x, y))); | |||
| newTarget->fileDragMove (files, x, y); | |||
| newTarget->fileDragMove (files, pos.getX(), pos.getY()); | |||
| } | |||
| } | |||
| @@ -691,8 +673,8 @@ void ComponentPeer::handleFileDragDrop (const StringArray& files, int x, int y) | |||
| return; | |||
| } | |||
| component->relativePositionToOtherComponent (targetComp, x, y); | |||
| target->filesDropped (files, x, y); | |||
| const Point<int> pos (component->relativePositionToOtherComponent (targetComp, Point<int> (x, y))); | |||
| target->filesDropped (files, pos.getX(), pos.getY()); | |||
| } | |||
| } | |||
| } | |||
| @@ -150,16 +150,13 @@ public: | |||
| virtual void getBounds (int& x, int& y, int& w, int& h) const = 0; | |||
| /** Returns the x-position of this window, relative to the screen's origin. */ | |||
| virtual int getScreenX() const = 0; | |||
| /** Returns the y-position of this window, relative to the screen's origin. */ | |||
| virtual int getScreenY() const = 0; | |||
| virtual const Point<int> getScreenPosition() const = 0; | |||
| /** Converts a position relative to the top-left of this component to screen co-ordinates. */ | |||
| virtual void relativePositionToGlobal (int& x, int& y) = 0; | |||
| virtual const Point<int> relativePositionToGlobal (const Point<int>& relativePosition) = 0; | |||
| /** Converts a screen co-ordinate to a position relative to the top-left of this component. */ | |||
| virtual void globalPositionToRelative (int& x, int& y) = 0; | |||
| virtual const Point<int> globalPositionToRelative (const Point<int>& screenPosition) = 0; | |||
| /** Minimises the window. */ | |||
| virtual void setMinimised (bool shouldBeMinimised) = 0; | |||
| @@ -255,7 +252,7 @@ public: | |||
| This may cause things like a virtual on-screen keyboard to appear, depending | |||
| on the OS. | |||
| */ | |||
| virtual void textInputRequired (int x, int y) = 0; | |||
| virtual void textInputRequired (const Point<int>& position) = 0; | |||
| /** Called when the window gains keyboard focus. */ | |||
| void handleFocusGain(); | |||
| @@ -475,8 +475,7 @@ bool ResizableWindow::restoreWindowStateFromString (const String& s) | |||
| if (newPos.isEmpty()) | |||
| return false; | |||
| const Rectangle<int> screen (Desktop::getInstance().getMonitorAreaContaining (newPos.getCentreX(), | |||
| newPos.getCentreY())); | |||
| const Rectangle<int> screen (Desktop::getInstance().getMonitorAreaContaining (newPos.getCentre())); | |||
| ComponentPeer* const peer = isOnDesktop() ? getPeer() : 0; | |||
| if (peer != 0) | |||
| @@ -40,8 +40,6 @@ TooltipWindow::TooltipWindow (Component* const parentComponent, | |||
| const int millisecondsBeforeTipAppears_) | |||
| : Component ("tooltip"), | |||
| millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_), | |||
| mouseX (0), | |||
| mouseY (0), | |||
| lastHideTime (0), | |||
| lastComponentUnderMouse (0), | |||
| changedCompsSinceShown (true) | |||
| @@ -80,24 +78,23 @@ void TooltipWindow::showFor (const String& tip) | |||
| jassert (tip.isNotEmpty()); | |||
| tipShowing = tip; | |||
| int mx, my; | |||
| Desktop::getMousePosition (mx, my); | |||
| Point<int> mousePos (Desktop::getMousePosition()); | |||
| if (getParentComponent() != 0) | |||
| getParentComponent()->globalPositionToRelative (mx, my); | |||
| mousePos = getParentComponent()->globalPositionToRelative (mousePos); | |||
| int x, y, w, h; | |||
| getLookAndFeel().getTooltipSize (tip, w, h); | |||
| if (mx > getParentWidth() / 2) | |||
| x = mx - (w + 12); | |||
| if (mousePos.getX() > getParentWidth() / 2) | |||
| x = mousePos.getX() - (w + 12); | |||
| else | |||
| x = mx + 24; | |||
| x = mousePos.getX() + 24; | |||
| if (my > getParentHeight() / 2) | |||
| y = my - (h + 6); | |||
| if (mousePos.getY() > getParentHeight() / 2) | |||
| y = mousePos.getY() - (h + 6); | |||
| else | |||
| y = my + 6; | |||
| y = mousePos.getY() + 6; | |||
| setBounds (x, y, w, h); | |||
| setVisible (true); | |||
| @@ -148,11 +145,9 @@ void TooltipWindow::timerCallback() | |||
| const bool mouseWasClicked = clickCount > mouseClicks; | |||
| mouseClicks = clickCount; | |||
| int mx, my; | |||
| Desktop::getMousePosition (mx, my); | |||
| const bool mouseMovedQuickly = (abs (mx - mouseX) + abs (my - mouseY) > 12); | |||
| mouseX = mx; | |||
| mouseY = my; | |||
| const Point<int> mousePos (Desktop::getMousePosition()); | |||
| const bool mouseMovedQuickly = mousePos.getDistanceFrom (lastMousePos) > 12; | |||
| lastMousePos = mousePos; | |||
| if (tipChanged || mouseWasClicked || mouseMovedQuickly) | |||
| lastCompChangeTime = now; | |||
| @@ -100,7 +100,8 @@ public: | |||
| private: | |||
| //============================================================================== | |||
| int millisecondsBeforeTipAppears; | |||
| int mouseX, mouseY, mouseClicks; | |||
| Point<int> lastMousePos; | |||
| int mouseClicks; | |||
| unsigned int lastCompChangeTime, lastHideTime; | |||
| Component* lastComponentUnderMouse; | |||
| bool changedCompsSinceShown; | |||
| @@ -291,22 +291,21 @@ void TopLevelWindow::centreAroundComponent (Component* c, const int width, const | |||
| } | |||
| else | |||
| { | |||
| int x = (c->getWidth() - width) / 2; | |||
| int y = (c->getHeight() - height) / 2; | |||
| c->relativePositionToGlobal (x, y); | |||
| Point<int> p (c->relativePositionToGlobal (Point<int> ((c->getWidth() - width) / 2, | |||
| (c->getHeight() - height) / 2))); | |||
| Rectangle<int> parentArea (c->getParentMonitorArea()); | |||
| if (getParentComponent() != 0) | |||
| { | |||
| getParentComponent()->globalPositionToRelative (x, y); | |||
| p = getParentComponent()->globalPositionToRelative (p); | |||
| parentArea.setBounds (0, 0, getParentWidth(), getParentHeight()); | |||
| } | |||
| parentArea.reduce (12, 12); | |||
| setBounds (jlimit (parentArea.getX(), jmax (parentArea.getX(), parentArea.getRight() - width), x), | |||
| jlimit (parentArea.getY(), jmax (parentArea.getY(), parentArea.getBottom() - height), y), | |||
| setBounds (jlimit (parentArea.getX(), jmax (parentArea.getX(), parentArea.getRight() - width), p.getX()), | |||
| jlimit (parentArea.getY(), jmax (parentArea.getY(), parentArea.getBottom() - height), p.getY()), | |||
| width, height); | |||
| } | |||
| } | |||
| @@ -65,6 +65,12 @@ public: | |||
| /** Returns the point's y co-ordinate. */ | |||
| inline ValueType getY() const throw() { return y; } | |||
| inline bool operator== (const Point& other) const throw() { return x == other.x && y == other.y; } | |||
| inline bool operator!= (const Point& other) const throw() { return x != other.x || y != other.y; } | |||
| /** Returns true if the point is (0, 0). */ | |||
| bool isOrigin() const throw() { return x == ValueType() && y == ValueType(); } | |||
| /** Changes the point's x and y co-ordinates. */ | |||
| void setXY (const ValueType newX, const ValueType newY) throw() { x = newX; y = newY; } | |||
| @@ -83,13 +89,15 @@ public: | |||
| /** Subtracts another point's co-ordinates to this one. */ | |||
| Point& operator-= (const Point& other) throw() { x -= other.x; y -= other.y; return *this; } | |||
| /** Returns the straight-line distance between this point and another one. */ | |||
| ValueType getDistanceFrom (const Point& other) const throw() { return (ValueType) juce_hypot (x - other.x, y - other.y); } | |||
| /** Uses a transform to change the point's co-ordinates. | |||
| This will only compile if ValueType = float! | |||
| @see AffineTransform::transformPoint | |||
| */ | |||
| void applyTransform (const AffineTransform& transform) throw() { transform.transformPoint (x, y); } | |||
| //============================================================================== | |||
| juce_UseDebuggingNewOperator | |||
| @@ -107,6 +107,8 @@ public: | |||
| /** Returns the y co-ordinate of the rectangle's centre. */ | |||
| inline ValueType getCentreY() const throw() { return y + h / (ValueType) 2; } | |||
| inline const Point<ValueType> getCentre() const throw() { return Point<ValueType> (x + w / (ValueType) 2, y + h / (ValueType) 2); } | |||
| /** Returns true if the rectangle's width and height are both zero or less */ | |||
| bool isEmpty() const throw() { return w <= 0 || h <= 0; } | |||
| @@ -114,6 +116,9 @@ public: | |||
| /** Returns the rectangle's top-left position as a Point. */ | |||
| const Point<ValueType> getPosition() const throw() { return Point<ValueType> (x, y); } | |||
| /** Changes the position of the rectangle's top-left corner (leaving its size unchanged). */ | |||
| void setPosition (const Point<ValueType>& newPos) throw() { x = newPos.getX(); y = newPos.getY(); } | |||
| /** Changes the position of the rectangle's top-left corner (leaving its size unchanged). */ | |||
| void setPosition (const ValueType newX, const ValueType newY) throw() { x = newX; y = newY; } | |||
| @@ -256,6 +261,12 @@ public: | |||
| return xCoord >= x && yCoord >= y && xCoord < x + w && yCoord < y + h; | |||
| } | |||
| /** Returns true if this co-ordinate is inside the rectangle. */ | |||
| bool contains (const Point<ValueType> point) const throw() | |||
| { | |||
| return point.getX() >= x && point.getY() >= y && point.getX() < x + w && point.getY() < y + h; | |||
| } | |||
| /** Returns true if this other rectangle is completely inside this one. */ | |||
| bool contains (const Rectangle& other) const throw() | |||
| { | |||
| @@ -263,6 +274,13 @@ public: | |||
| && x + w >= other.x + other.w && y + h >= other.y + other.h; | |||
| } | |||
| /** Returns the nearest point to the specified point that lies within this rectangle. */ | |||
| const Point<ValueType> getConstrainedPoint (const Point<ValueType>& point) const throw() | |||
| { | |||
| return Point<ValueType> (jlimit (x, x + w, point.getX()), | |||
| jlimit (y, y + h, point.getY())); | |||
| } | |||
| /** Returns true if any part of another rectangle overlaps this one. */ | |||
| bool intersects (const Rectangle& other) const throw() | |||
| { | |||
| @@ -111,7 +111,7 @@ static const int eventMask = NoEventMask | KeyPressMask | KeyReleaseMask | Butto | |||
| //============================================================================== | |||
| static int pointerMap[5]; | |||
| static int lastMousePosX = 0, lastMousePosY = 0; | |||
| static Point<int> lastMousePos; | |||
| enum MouseButtons | |||
| { | |||
| @@ -789,26 +789,19 @@ public: | |||
| h = wh; | |||
| } | |||
| int getScreenX() const | |||
| const Point<int> getScreenPosition() const | |||
| { | |||
| return wx; | |||
| return Point<int> (wx, wy); | |||
| } | |||
| int getScreenY() const | |||
| const Point<int> relativePositionToGlobal (const Point<int>& relativePosition) | |||
| { | |||
| return wy; | |||
| return relativePosition + getScreenPosition(); | |||
| } | |||
| void relativePositionToGlobal (int& x, int& y) | |||
| const Point<int> globalPositionToRelative (const Point<int>& screenPosition) | |||
| { | |||
| x += wx; | |||
| y += wy; | |||
| } | |||
| void globalPositionToRelative (int& x, int& y) | |||
| { | |||
| x -= wx; | |||
| y -= wy; | |||
| return screenPosition - getScreenPosition(); | |||
| } | |||
| void setMinimised (bool shouldBeMinimised) | |||
| @@ -1091,7 +1084,7 @@ public: | |||
| } | |||
| } | |||
| void textInputRequired (int /*x*/, int /*y*/) | |||
| void textInputRequired (const Point<int>&) | |||
| { | |||
| } | |||
| @@ -1352,7 +1345,7 @@ public: | |||
| getEventTime (buttonPressEvent->time)); | |||
| } | |||
| lastMousePosX = lastMousePosY = 0x100000; | |||
| lastMousePos = Point<int> (0x100000, 0x100000); | |||
| break; | |||
| } | |||
| @@ -1376,7 +1369,7 @@ public: | |||
| buttonRelEvent->x, buttonRelEvent->y, | |||
| getEventTime (buttonRelEvent->time)); | |||
| lastMousePosX = lastMousePosY = 0x100000; | |||
| lastMousePos = Point<int> (0x100000, 0x100000); | |||
| break; | |||
| } | |||
| @@ -1386,13 +1379,11 @@ public: | |||
| updateKeyModifiers (movedEvent->state); | |||
| int x, y, mouseMods; | |||
| getMousePos (x, y, mouseMods); | |||
| Point<int> mousePos (Desktop::getMousePosition()); | |||
| if (lastMousePosX != x || lastMousePosY != y) | |||
| if (lastMousePos != mousePos) | |||
| { | |||
| lastMousePosX = x; | |||
| lastMousePosY = y; | |||
| lastMousePos = mousePos; | |||
| if (parentWindow != 0 && (styleFlags & windowHasTitleBar) == 0) | |||
| { | |||
| @@ -1411,26 +1402,23 @@ public: | |||
| { | |||
| parentWindow = wParent; | |||
| updateBounds(); | |||
| x -= getScreenX(); | |||
| y -= getScreenY(); | |||
| mousePos -= getScreenPosition(); | |||
| } | |||
| else | |||
| { | |||
| parentWindow = 0; | |||
| x -= getScreenX(); | |||
| y -= getScreenY(); | |||
| mousePos -= getScreenPosition(); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| x -= getScreenX(); | |||
| y -= getScreenY(); | |||
| mousePos -= getScreenPosition(); | |||
| } | |||
| if ((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0) | |||
| handleMouseMove (x, y, getEventTime (movedEvent->time)); | |||
| handleMouseMove (mousePos.getX(), mousePos.getY(), getEventTime (movedEvent->time)); | |||
| else | |||
| handleMouseDrag (x, y, getEventTime (movedEvent->time)); | |||
| handleMouseDrag (mousePos.getX(), mousePos.getY(), getEventTime (movedEvent->time)); | |||
| } | |||
| break; | |||
| @@ -1438,7 +1426,7 @@ public: | |||
| case EnterNotify: | |||
| { | |||
| lastMousePosX = lastMousePosY = 0x100000; | |||
| lastMousePos = Point<int> (0x100000, 0x100000); | |||
| const XEnterWindowEvent* const enterEvent = (const XEnterWindowEvent*) &event->xcrossing; | |||
| if ((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0 | |||
| @@ -2336,7 +2324,7 @@ private: | |||
| void resetDragAndDrop() | |||
| { | |||
| dragAndDropFiles.clear(); | |||
| lastDropX = lastDropY = -1; | |||
| lastDropPos = Point<int> (-1, -1); | |||
| dragAndDropCurrentMimeType = 0; | |||
| dragAndDropSourceWindow = 0; | |||
| srcMimeTypeAtomList.clear(); | |||
| @@ -2401,14 +2389,13 @@ private: | |||
| dragAndDropSourceWindow = clientMsg->data.l[0]; | |||
| const int dropX = ((int) clientMsg->data.l[2] >> 16) - getScreenX(); | |||
| const int dropY = ((int) clientMsg->data.l[2] & 0xffff) - getScreenY(); | |||
| Point<int> dropPos ((int) clientMsg->data.l[2] >> 16, | |||
| (int) clientMsg->data.l[2] & 0xffff); | |||
| dropPos -= getScreenPosition(); | |||
| if (lastDropX != dropX || lastDropY != dropY) | |||
| if (lastDropPos != dropPos) | |||
| { | |||
| lastDropX = dropX; | |||
| lastDropY = dropY; | |||
| lastDropPos = dropPos; | |||
| dragAndDropTimestamp = clientMsg->data.l[3]; | |||
| Atom targetAction = XA_XdndActionCopy; | |||
| @@ -2428,7 +2415,7 @@ private: | |||
| updateDraggedFileList (clientMsg); | |||
| if (dragAndDropFiles.size() > 0) | |||
| handleFileDragMove (dragAndDropFiles, dropX, dropY); | |||
| handleFileDragMove (dragAndDropFiles, dropPos.getX(), dropPos.getY()); | |||
| } | |||
| } | |||
| @@ -2438,13 +2425,13 @@ private: | |||
| updateDraggedFileList (clientMsg); | |||
| const StringArray files (dragAndDropFiles); | |||
| const int lastX = lastDropX, lastY = lastDropY; | |||
| const Point<int> lastPos (lastDropPos); | |||
| sendDragAndDropFinish(); | |||
| resetDragAndDrop(); | |||
| if (files.size() > 0) | |||
| handleFileDragDrop (files, lastX, lastY); | |||
| handleFileDragDrop (files, lastPos.getX(), lastPos.getY()); | |||
| } | |||
| void handleDragAndDropEnter (const XClientMessageEvent* const clientMsg) | |||
| @@ -2578,7 +2565,8 @@ private: | |||
| } | |||
| StringArray dragAndDropFiles; | |||
| int dragAndDropTimestamp, lastDropX, lastDropY; | |||
| int dragAndDropTimestamp; | |||
| Point<int> lastDropPos; | |||
| Atom XA_OtherMime, dragAndDropCurrentMimeType; | |||
| Window dragAndDropSourceWindow; | |||
| @@ -2737,17 +2725,18 @@ bool Desktop::canUseSemiTransparentWindows() throw() | |||
| return false; | |||
| } | |||
| void Desktop::getMousePosition (int& x, int& y) throw() | |||
| const Point<int> Desktop::getMousePosition() | |||
| { | |||
| int mouseMods; | |||
| int x, y, mouseMods; | |||
| getMousePos (x, y, mouseMods); | |||
| return Point<int> (x, y); | |||
| } | |||
| void Desktop::setMousePosition (int x, int y) throw() | |||
| void Desktop::setMousePosition (const Point<int>& newPosition) | |||
| { | |||
| ScopedXLock xlock; | |||
| Window root = RootWindow (display, DefaultScreen (display)); | |||
| XWarpPointer (display, None, root, 0, 0, 0, 0, x, y); | |||
| XWarpPointer (display, None, root, 0, 0, 0, 0, newPosition.getX(), newPosition.getY()); | |||
| } | |||
| @@ -93,10 +93,9 @@ public: | |||
| void setBounds (int x, int y, int w, int h, const bool isNowFullScreen); | |||
| void getBounds (int& x, int& y, int& w, int& h, const bool global) const; | |||
| void getBounds (int& x, int& y, int& w, int& h) const; | |||
| int getScreenX() const; | |||
| int getScreenY() const; | |||
| void relativePositionToGlobal (int& x, int& y); | |||
| void globalPositionToRelative (int& x, int& y); | |||
| const Point<int> getScreenPosition() const; | |||
| const Point<int> relativePositionToGlobal (const Point<int>& relativePosition); | |||
| const Point<int> globalPositionToRelative (const Point<int>& screenPosition); | |||
| void setMinimised (bool shouldBeMinimised); | |||
| bool isMinimised() const; | |||
| void setFullScreen (bool shouldBeFullScreen); | |||
| @@ -121,7 +120,7 @@ public: | |||
| virtual void viewFocusLoss(); | |||
| bool isFocused() const; | |||
| void grabFocus(); | |||
| void textInputRequired (int x, int y); | |||
| void textInputRequired (const Point<int>& position); | |||
| //============================================================================== | |||
| void repaint (int x, int y, int w, int h); | |||
| @@ -717,7 +716,7 @@ void UIViewComponentPeer::grabFocus() | |||
| } | |||
| } | |||
| void UIViewComponentPeer::textInputRequired (int /*x*/, int /*y*/) | |||
| void UIViewComponentPeer::textInputRequired (const Point<int>&) | |||
| { | |||
| } | |||
| @@ -817,13 +816,12 @@ bool Desktop::canUseSemiTransparentWindows() throw() | |||
| return true; | |||
| } | |||
| void Desktop::getMousePosition (int& x, int& y) throw() | |||
| const Point<int> Desktop::getMousePosition() | |||
| { | |||
| x = juce_lastMouseX; | |||
| y = juce_lastMouseY; | |||
| return Point<int> (juce_lastMouseX, juce_lastMouseY); | |||
| } | |||
| void Desktop::setMousePosition (int x, int y) throw() | |||
| void Desktop::setMousePosition (const Point<int>&) | |||
| { | |||
| } | |||
| @@ -145,20 +145,19 @@ bool Desktop::canUseSemiTransparentWindows() throw() | |||
| return true; | |||
| } | |||
| void Desktop::getMousePosition (int& x, int& y) throw() | |||
| const Point<int> Desktop::getMousePosition() | |||
| { | |||
| const ScopedAutoReleasePool pool; | |||
| const NSPoint p ([NSEvent mouseLocation]); | |||
| x = roundToInt (p.x); | |||
| y = roundToInt ([[[NSScreen screens] objectAtIndex: 0] frame].size.height - p.y); | |||
| return Point<int> (roundToInt (p.x), roundToInt ([[[NSScreen screens] objectAtIndex: 0] frame].size.height - p.y)); | |||
| } | |||
| void Desktop::setMousePosition (int x, int y) throw() | |||
| void Desktop::setMousePosition (const Point<int>& newPosition) | |||
| { | |||
| // this rubbish needs to be done around the warp call, to avoid causing a | |||
| // bizarre glitch.. | |||
| CGAssociateMouseAndMouseCursorPosition (false); | |||
| CGWarpMouseCursorPosition (CGPointMake (x, y)); | |||
| CGWarpMouseCursorPosition (CGPointMake (newPosition.getX(), newPosition.getY())); | |||
| CGAssociateMouseAndMouseCursorPosition (true); | |||
| } | |||
| @@ -76,12 +76,11 @@ public: | |||
| if (topComp->getPeer() != 0) | |||
| { | |||
| int x = 0, y = 0; | |||
| owner->relativePositionToOtherComponent (topComp, x, y); | |||
| const Point<int> pos (owner->relativePositionToOtherComponent (topComp, Point<int>())); | |||
| NSRect r; | |||
| r.origin.x = (float) x; | |||
| r.origin.y = (float) y; | |||
| r.origin.x = (float) pos.getX(); | |||
| r.origin.y = (float) pos.getY(); | |||
| r.size.width = (float) owner->getWidth(); | |||
| r.size.height = (float) owner->getHeight(); | |||
| r.origin.y = [[view superview] frame].size.height - (r.origin.y + r.size.height); | |||
| @@ -135,10 +135,9 @@ public: | |||
| void setBounds (int x, int y, int w, int h, const bool isNowFullScreen); | |||
| void getBounds (int& x, int& y, int& w, int& h, const bool global) const; | |||
| void getBounds (int& x, int& y, int& w, int& h) const; | |||
| int getScreenX() const; | |||
| int getScreenY() const; | |||
| void relativePositionToGlobal (int& x, int& y); | |||
| void globalPositionToRelative (int& x, int& y); | |||
| const Point<int> getScreenPosition() const; | |||
| const Point<int> relativePositionToGlobal (const Point<int>& relativePosition); | |||
| const Point<int> globalPositionToRelative (const Point<int>& screenPosition); | |||
| void setMinimised (bool shouldBeMinimised); | |||
| bool isMinimised() const; | |||
| void setFullScreen (bool shouldBeFullScreen); | |||
| @@ -199,7 +198,7 @@ public: | |||
| virtual void viewFocusLoss(); | |||
| bool isFocused() const; | |||
| void grabFocus(); | |||
| void textInputRequired (int x, int y); | |||
| void textInputRequired (const Point<int>& position); | |||
| //============================================================================== | |||
| void repaint (int x, int y, int w, int h); | |||
| @@ -858,34 +857,21 @@ void NSViewComponentPeer::getBounds (int& x, int& y, int& w, int& h) const | |||
| getBounds (x, y, w, h, ! isSharedWindow); | |||
| } | |||
| int NSViewComponentPeer::getScreenX() const | |||
| const Point<int> NSViewComponentPeer::getScreenPosition() const | |||
| { | |||
| int x, y, w, h; | |||
| getBounds (x, y, w, h, true); | |||
| return x; | |||
| return Point<int> (x, y); | |||
| } | |||
| int NSViewComponentPeer::getScreenY() const | |||
| const Point<int> NSViewComponentPeer::relativePositionToGlobal (const Point<int>& relativePosition) | |||
| { | |||
| int x, y, w, h; | |||
| getBounds (x, y, w, h, true); | |||
| return y; | |||
| } | |||
| void NSViewComponentPeer::relativePositionToGlobal (int& x, int& y) | |||
| { | |||
| int wx, wy, ww, wh; | |||
| getBounds (wx, wy, ww, wh, true); | |||
| x += wx; | |||
| y += wy; | |||
| return relativePosition + getScreenPosition(); | |||
| } | |||
| void NSViewComponentPeer::globalPositionToRelative (int& x, int& y) | |||
| const Point<int> NSViewComponentPeer::globalPositionToRelative (const Point<int>& screenPosition) | |||
| { | |||
| int wx, wy, ww, wh; | |||
| getBounds (wx, wy, ww, wh, true); | |||
| x -= wx; | |||
| y -= wy; | |||
| return screenPosition - getScreenPosition(); | |||
| } | |||
| NSRect NSViewComponentPeer::constrainRect (NSRect r) | |||
| @@ -1125,7 +1111,7 @@ void NSViewComponentPeer::grabFocus() | |||
| } | |||
| } | |||
| void NSViewComponentPeer::textInputRequired (int /*x*/, int /*y*/) | |||
| void NSViewComponentPeer::textInputRequired (const Point<int>&) | |||
| { | |||
| } | |||
| @@ -1288,13 +1274,10 @@ void NSViewComponentPeer::redirectMouseWheel (NSEvent* ev) | |||
| void NSViewComponentPeer::showArrowCursorIfNeeded() | |||
| { | |||
| if (Component::getComponentUnderMouse() == 0) | |||
| if (Component::getComponentUnderMouse() == 0 | |||
| && Desktop::getInstance().findComponentAt (Desktop::getInstance().getMousePosition()) == 0) | |||
| { | |||
| int mx, my; | |||
| Desktop::getInstance().getMousePosition (mx, my); | |||
| if (Desktop::getInstance().findComponentAt (mx, my) == 0) | |||
| [[NSCursor arrowCursor] set]; | |||
| [[NSCursor arrowCursor] set]; | |||
| } | |||
| } | |||
| @@ -286,10 +286,9 @@ public: | |||
| if (topComp->getPeer() != 0) | |||
| { | |||
| int x = 0, y = 0; | |||
| owner->relativePositionToOtherComponent (topComp, x, y); | |||
| const Point<int> pos (owner->relativePositionToOtherComponent (topComp, Point<int>())); | |||
| owner->setControlBounds (Rectangle<int> (x, y, owner->getWidth(), owner->getHeight())); | |||
| owner->setControlBounds (Rectangle<int> (pos.getX(), pos.getY(), owner->getWidth(), owner->getHeight())); | |||
| } | |||
| } | |||
| @@ -452,9 +451,7 @@ bool ActiveXControlComponent::createControl (const void* controlIID) | |||
| if (dynamic_cast <Win32ComponentPeer*> (peer) != 0) | |||
| { | |||
| int x = 0, y = 0; | |||
| relativePositionToOtherComponent (getTopLevelComponent(), x, y); | |||
| const Point<int> pos (relativePositionToOtherComponent (getTopLevelComponent(), Point<int>())); | |||
| HWND hwnd = (HWND) peer->getNativeHandle(); | |||
| ScopedPointer <ActiveXControlData> info (new ActiveXControlData (hwnd, this)); | |||
| @@ -469,15 +466,15 @@ bool ActiveXControlComponent::createControl (const void* controlIID) | |||
| if (OleSetContainedObject (info->control, TRUE) == S_OK) | |||
| { | |||
| RECT rect; | |||
| rect.left = x; | |||
| rect.top = y; | |||
| rect.right = x + getWidth(); | |||
| rect.bottom = y + getHeight(); | |||
| rect.left = pos.getX(); | |||
| rect.top = pos.getY(); | |||
| rect.right = pos.getX() + getWidth(); | |||
| rect.bottom = pos.getY() + getHeight(); | |||
| if (info->control->DoVerb (OLEIVERB_SHOW, 0, info->clientSite, 0, hwnd, &rect) == S_OK) | |||
| { | |||
| control = info.release(); | |||
| setControlBounds (Rectangle<int> (x, y, getWidth(), getHeight())); | |||
| setControlBounds (Rectangle<int> (pos.getX(), pos.getY(), getWidth(), getHeight())); | |||
| ((ActiveXControlData*) control)->controlHWND = getHWND (this); | |||
| @@ -590,36 +590,22 @@ public: | |||
| h -= windowBorder.getTopAndBottom(); | |||
| } | |||
| int getScreenX() const | |||
| const Point<int> getScreenPosition() const | |||
| { | |||
| RECT r; | |||
| GetWindowRect (hwnd, &r); | |||
| return r.left + windowBorder.getLeft(); | |||
| return Point<int> (r.left + windowBorder.getLeft(), | |||
| r.top + windowBorder.getTop()); | |||
| } | |||
| int getScreenY() const | |||
| const Point<int> relativePositionToGlobal (const Point<int>& relativePosition) | |||
| { | |||
| RECT r; | |||
| GetWindowRect (hwnd, &r); | |||
| return r.top + windowBorder.getTop(); | |||
| return relativePosition + getScreenPosition(); | |||
| } | |||
| void relativePositionToGlobal (int& x, int& y) | |||
| const Point<int> globalPositionToRelative (const Point<int>& screenPosition) | |||
| { | |||
| RECT r; | |||
| GetWindowRect (hwnd, &r); | |||
| x += r.left + windowBorder.getLeft(); | |||
| y += r.top + windowBorder.getTop(); | |||
| } | |||
| void globalPositionToRelative (int& x, int& y) | |||
| { | |||
| RECT r; | |||
| GetWindowRect (hwnd, &r); | |||
| x -= r.left + windowBorder.getLeft(); | |||
| y -= r.top + windowBorder.getTop(); | |||
| return screenPosition - getScreenPosition(); | |||
| } | |||
| void setMinimised (bool shouldBeMinimised) | |||
| @@ -779,7 +765,7 @@ public: | |||
| shouldDeactivateTitleBar = oldDeactivate; | |||
| } | |||
| void textInputRequired (int /*x*/, int /*y*/) | |||
| void textInputRequired (const Point<int>&) | |||
| { | |||
| if (! hasCreatedCaret) | |||
| { | |||
| @@ -1691,9 +1677,8 @@ private: | |||
| HRESULT __stdcall DragEnter (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) | |||
| { | |||
| updateFileList (pDataObject); | |||
| int x = mousePos.x, y = mousePos.y; | |||
| owner->globalPositionToRelative (x, y); | |||
| owner->handleFileDragMove (files, x, y); | |||
| const Point<int> pos (owner->globalPositionToRelative (Point<int> (mousePos.x, mousePos.y))); | |||
| owner->handleFileDragMove (files, pos.getX(), pos.getY()); | |||
| *pdwEffect = DROPEFFECT_COPY; | |||
| return S_OK; | |||
| } | |||
| @@ -1706,9 +1691,8 @@ private: | |||
| HRESULT __stdcall DragOver (DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) | |||
| { | |||
| int x = mousePos.x, y = mousePos.y; | |||
| owner->globalPositionToRelative (x, y); | |||
| owner->handleFileDragMove (files, x, y); | |||
| const Point<int> pos (owner->globalPositionToRelative (Point<int> (mousePos.x, mousePos.y))); | |||
| owner->handleFileDragMove (files, pos.getX(), pos.getY()); | |||
| *pdwEffect = DROPEFFECT_COPY; | |||
| return S_OK; | |||
| } | |||
| @@ -1716,9 +1700,8 @@ private: | |||
| HRESULT __stdcall Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) | |||
| { | |||
| updateFileList (pDataObject); | |||
| int x = mousePos.x, y = mousePos.y; | |||
| owner->globalPositionToRelative (x, y); | |||
| owner->handleFileDragDrop (files, x, y); | |||
| const Point<int> pos (owner->globalPositionToRelative (Point<int> (mousePos.x, mousePos.y))); | |||
| owner->handleFileDragDrop (files, pos.getX(), pos.getY()); | |||
| *pdwEffect = DROPEFFECT_COPY; | |||
| return S_OK; | |||
| } | |||
| @@ -2001,9 +1984,8 @@ private: | |||
| if (LOWORD (wParam) == WA_CLICKACTIVE | |||
| && component->isCurrentlyBlockedByAnotherModalComponent()) | |||
| { | |||
| int mx, my; | |||
| component->getMouseXYRelative (mx, my); | |||
| Component* const underMouse = component->getComponentAt (mx, my); | |||
| const Point<int> mousePos (component->getMouseXYRelative()); | |||
| Component* const underMouse = component->getComponentAt (mousePos.getX(), mousePos.getY()); | |||
| if (underMouse != 0 && underMouse->isCurrentlyBlockedByAnotherModalComponent()) | |||
| Component::getCurrentlyModalComponent()->inputAttemptWhenModal(); | |||
| @@ -2072,8 +2054,8 @@ private: | |||
| { | |||
| const int oldModifiers = currentModifiers; | |||
| MouseEvent e (0, 0, ModifierKeys::getCurrentModifiersRealtime(), component, | |||
| getMouseEventTime(), 0, 0, getMouseEventTime(), 1, false); | |||
| MouseEvent e (Point<int>(), ModifierKeys::getCurrentModifiersRealtime(), component, | |||
| getMouseEventTime(), Point<int>(), getMouseEventTime(), 1, false); | |||
| if (lParam == WM_LBUTTONDOWN || lParam == WM_LBUTTONDBLCLK) | |||
| e.mods = ModifierKeys (e.mods.getRawFlags() | ModifierKeys::leftButtonModifier); | |||
| @@ -2321,17 +2303,16 @@ bool AlertWindow::showNativeDialogBox (const String& title, | |||
| //============================================================================== | |||
| void Desktop::getMousePosition (int& x, int& y) throw() | |||
| const Point<int> Desktop::getMousePosition() | |||
| { | |||
| POINT mousePos; | |||
| GetCursorPos (&mousePos); | |||
| x = mousePos.x; | |||
| y = mousePos.y; | |||
| return Point<int> (mousePos.x, mousePos.y); | |||
| } | |||
| void Desktop::setMousePosition (int x, int y) throw() | |||
| void Desktop::setMousePosition (const Point<int>& newPosition) | |||
| { | |||
| SetCursorPos (x, y); | |||
| SetCursorPos (newPosition.getX(), newPosition.getY()); | |||
| } | |||
| //============================================================================== | |||