@@ -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()); | |||
} | |||
//============================================================================== | |||