Browse Source

Changed some methods that were using (x, y) parameters to use Point objects instead.

tags/2021-05-28
Julian Storer 15 years ago
parent
commit
06c63c63aa
45 changed files with 1253 additions and 1586 deletions
  1. +478
    -686
      juce_amalgamated.cpp
  2. +198
    -169
      juce_amalgamated.h
  3. +4
    -10
      src/gui/components/buttons/juce_Button.cpp
  4. +4
    -11
      src/gui/components/controls/juce_ListBox.cpp
  5. +1
    -1
      src/gui/components/controls/juce_ListBox.h
  6. +10
    -12
      src/gui/components/controls/juce_Slider.cpp
  7. +1
    -4
      src/gui/components/controls/juce_TableHeaderComponent.cpp
  8. +1
    -4
      src/gui/components/controls/juce_TableListBox.cpp
  9. +1
    -2
      src/gui/components/controls/juce_TextEditor.cpp
  10. +2
    -7
      src/gui/components/controls/juce_TreeView.cpp
  11. +97
    -142
      src/gui/components/juce_Component.cpp
  12. +12
    -9
      src/gui/components/juce_Component.h
  13. +18
    -37
      src/gui/components/juce_Desktop.cpp
  14. +7
    -7
      src/gui/components/juce_Desktop.h
  15. +1
    -2
      src/gui/components/layout/juce_ComponentBoundsConstrainer.cpp
  16. +5
    -8
      src/gui/components/layout/juce_ComponentMovementWatcher.cpp
  17. +1
    -1
      src/gui/components/layout/juce_ComponentMovementWatcher.h
  18. +5
    -8
      src/gui/components/menus/juce_MenuBarComponent.cpp
  19. +39
    -53
      src/gui/components/menus/juce_PopupMenu.cpp
  20. +8
    -13
      src/gui/components/mouse/juce_ComponentDragger.cpp
  21. +1
    -1
      src/gui/components/mouse/juce_ComponentDragger.h
  22. +41
    -59
      src/gui/components/mouse/juce_DragAndDropContainer.cpp
  23. +45
    -35
      src/gui/components/mouse/juce_MouseEvent.cpp
  24. +41
    -14
      src/gui/components/mouse/juce_MouseEvent.h
  25. +3
    -4
      src/gui/components/mouse/juce_MouseHoverDetector.cpp
  26. +4
    -5
      src/gui/components/special/juce_BubbleComponent.cpp
  27. +14
    -14
      src/gui/components/special/juce_MagnifierComponent.cpp
  28. +26
    -27
      src/gui/components/special/juce_MidiKeyboardComponent.cpp
  29. +3
    -3
      src/gui/components/special/juce_MidiKeyboardComponent.h
  30. +2
    -3
      src/gui/components/special/juce_OpenGLComponent.cpp
  31. +36
    -54
      src/gui/components/windows/juce_ComponentPeer.cpp
  32. +4
    -7
      src/gui/components/windows/juce_ComponentPeer.h
  33. +1
    -2
      src/gui/components/windows/juce_ResizableWindow.cpp
  34. +11
    -16
      src/gui/components/windows/juce_TooltipWindow.cpp
  35. +2
    -1
      src/gui/components/windows/juce_TooltipWindow.h
  36. +5
    -6
      src/gui/components/windows/juce_TopLevelWindow.cpp
  37. +9
    -1
      src/gui/graphics/geometry/juce_Point.h
  38. +18
    -0
      src/gui/graphics/geometry/juce_Rectangle.h
  39. +35
    -46
      src/native/linux/juce_linux_Windowing.cpp
  40. +8
    -10
      src/native/mac/juce_iphone_UIViewComponentPeer.mm
  41. +4
    -5
      src/native/mac/juce_mac_MiscUtilities.mm
  42. +3
    -4
      src/native/mac/juce_mac_NSViewComponent.mm
  43. +14
    -31
      src/native/mac/juce_mac_NSViewComponentPeer.mm
  44. +8
    -11
      src/native/windows/juce_win32_ActiveXComponent.cpp
  45. +22
    -41
      src/native/windows/juce_win32_Windowing.cpp

+ 478
- 686
juce_amalgamated.cpp
File diff suppressed because it is too large
View File


+ 198
- 169
juce_amalgamated.h View File

@@ -9299,16 +9299,154 @@ private:
/*** End of inlined file: juce_ModifierKeys.h ***/ /*** 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 class JUCE_API MouseEvent
{ {
public: public:


MouseEvent (const int x, const int y,
MouseEvent (const Point<int>& position,
const ModifierKeys& modifiers, const ModifierKeys& modifiers,
Component* const originator, Component* const originator,
const Time& eventTime, const Time& eventTime,
const int mouseDownX,
const int mouseDownY,
const Point<int> mouseDownPos,
const Time& mouseDownTime, const Time& mouseDownTime,
const int numberOfClicks, const int numberOfClicks,
const bool mouseWasDragged) throw(); const bool mouseWasDragged) throw();
@@ -9331,6 +9469,8 @@ public:


int getMouseDownY() const throw(); int getMouseDownY() const throw();


const Point<int> getMouseDownPosition() const throw();

int getDistanceFromDragStart() const throw(); int getDistanceFromDragStart() const throw();


int getDistanceFromDragStartX() const throw(); int getDistanceFromDragStartX() const throw();
@@ -9343,13 +9483,19 @@ public:


int getLengthOfMousePress() const throw(); 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(); const MouseEvent getEventRelativeTo (Component* const otherComponent) const throw();


@@ -9360,7 +9506,7 @@ public:
juce_UseDebuggingNewOperator juce_UseDebuggingNewOperator


private: private:
int mouseDownX, mouseDownY;
Point<int> mouseDownPos;
Time mouseDownTime; Time mouseDownTime;
int numberOfClicks; int numberOfClicks;
bool wasMovedSinceMouseDown; bool wasMovedSinceMouseDown;
@@ -9619,138 +9765,6 @@ public:
#define __JUCE_PATH_JUCEHEADER__ #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 ***/ /*** Start of inlined file: juce_Rectangle.h ***/
#ifndef __JUCE_RECTANGLE_JUCEHEADER__ #ifndef __JUCE_RECTANGLE_JUCEHEADER__
#define __JUCE_RECTANGLE_JUCEHEADER__ #define __JUCE_RECTANGLE_JUCEHEADER__
@@ -9810,10 +9824,14 @@ public:


inline ValueType getCentreY() const throw() { return y + h / (ValueType) 2; } 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; } bool isEmpty() const throw() { return w <= 0 || h <= 0; }


const Point<ValueType> getPosition() const throw() { return Point<ValueType> (x, y); } 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 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; } 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; 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() bool contains (const Rectangle& other) const throw()
{ {
return x <= other.x && y <= other.y return x <= other.x && y <= other.y
&& x + w >= other.x + other.w && y + h >= other.y + other.h; && 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() bool intersects (const Rectangle& other) const throw()
{ {
return x + w > other.x return x + w > other.x
@@ -12243,13 +12272,11 @@ public:


virtual void getBounds (int& x, int& y, int& w, int& h) const = 0; 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; virtual void setMinimised (bool shouldBeMinimised) = 0;


@@ -12291,7 +12318,7 @@ public:


virtual void grabFocus() = 0; virtual void grabFocus() = 0;


virtual void textInputRequired (int x, int y) = 0;
virtual void textInputRequired (const Point<int>& position) = 0;


void handleFocusGain(); void handleFocusGain();
void handleFocusLoss(); void handleFocusLoss();
@@ -12448,16 +12475,18 @@ public:
void getVisibleArea (RectangleList& result, void getVisibleArea (RectangleList& result,
const bool includeSiblings) const; 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); void setTopLeftPosition (const int x, const int y);


@@ -12690,7 +12719,7 @@ public:


static bool JUCE_CALLTYPE isMouseButtonDownAnywhere() throw(); 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(); static Component* JUCE_CALLTYPE getComponentUnderMouse() throw();


@@ -12834,8 +12863,7 @@ private:
void sendEnablementChangeMessage(); void sendEnablementChangeMessage();
static void* runModalLoopCallback (void*); static void* runModalLoopCallback (void*);
static void bringModalComponentToFront(); 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 Rectangle<int>& clipRect,
const Component* const compToAvoid) const throw(); const Component* const compToAvoid) const throw();
void clipObscuredRegions (Graphics& g, const Rectangle<int>& clipRect, 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> 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(); static int getMouseButtonClickCounter() throw();


@@ -13264,8 +13292,7 @@ public:


Component* getComponent (const int index) const throw(); 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 juce_UseDebuggingNewOperator


@@ -13289,7 +13316,8 @@ private:


Array <Rectangle<int> > monitorCoordsClipped, monitorCoordsUnclipped; Array <Rectangle<int> > monitorCoordsClipped, monitorCoordsUnclipped;


int lastFakeMouseMoveX, lastFakeMouseMoveY, mouseClickCounter;
Point<int> lastFakeMouseMove;
int mouseClickCounter;
bool mouseMovedSignificantlySincePressed; bool mouseMovedSignificantlySincePressed;


struct RecentMouseDown struct RecentMouseDown
@@ -15893,7 +15921,8 @@ public:
private: private:


int millisecondsBeforeTipAppears; int millisecondsBeforeTipAppears;
int mouseX, mouseY, mouseClicks;
Point<int> lastMousePos;
int mouseClicks;
unsigned int lastCompChangeTime, lastHideTime; unsigned int lastCompChangeTime, lastHideTime;
Component* lastComponentUnderMouse; Component* lastComponentUnderMouse;
bool changedCompsSinceShown; bool changedCompsSinceShown;
@@ -18663,7 +18692,7 @@ private:
Component* headerComponent; Component* headerComponent;
int totalItems, rowHeight, minimumRowWidth; int totalItems, rowHeight, minimumRowWidth;
int outlineThickness; int outlineThickness;
int lastMouseX, lastMouseY, lastRowSelected;
int lastRowSelected;
bool mouseMoveSelects, multipleSelection, hasDoneInitialUpdate; bool mouseMoveSelects, multipleSelection, hasDoneInitialUpdate;
SparseSet <int> selected; SparseSet <int> selected;


@@ -22864,7 +22893,7 @@ public:


private: private:
ComponentBoundsConstrainer* constrainer; ComponentBoundsConstrainer* constrainer;
int originalX, originalY;
Point<int> originalPos;
}; };


#endif // __JUCE_COMPONENTDRAGGER_JUCEHEADER__ #endif // __JUCE_COMPONENTDRAGGER_JUCEHEADER__
@@ -23800,7 +23829,7 @@ private:
ComponentPeer* lastPeer; ComponentPeer* lastPeer;
VoidArray registeredParentComps; VoidArray registeredParentComps;
bool reentrant; bool reentrant;
int lastX, lastY, lastWidth, lastHeight;
Rectangle<int> lastBounds;
#ifdef JUCE_DEBUG #ifdef JUCE_DEBUG
ScopedPointer <ComponentDeletionWatcher> deletionWatcher; ScopedPointer <ComponentDeletionWatcher> deletionWatcher;
#endif #endif
@@ -26595,10 +26624,10 @@ private:
int octaveNumForMiddleC; int octaveNumForMiddleC;


void getKeyPos (int midiNoteNumber, int& x, int& w) const; 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 resetAnyKeysInUse();
void updateNoteUnderMouse (int x, int y);
void updateNoteUnderMouse (const Point<int>& pos);
void repaintNote (const int midiNoteNumber); void repaintNote (const int midiNoteNumber);


MidiKeyboardComponent (const MidiKeyboardComponent&); MidiKeyboardComponent (const MidiKeyboardComponent&);


+ 4
- 10
src/gui/components/buttons/juce_Button.cpp View File

@@ -233,20 +233,14 @@ Button::ButtonState Button::updateState (const MouseEvent* const e)
if (isEnabled() && isVisible() && ! isCurrentlyBlockedByAnotherModalComponent()) if (isEnabled() && isVisible() && ! isCurrentlyBlockedByAnotherModalComponent())
{ {
int mx, my;
Point<int> mousePos;
if (e == 0) if (e == 0)
{
getMouseXYRelative (mx, my);
}
mousePos = getMouseXYRelative();
else 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(); const bool down = isMouseButtonDown();
if ((down && (over || (triggerOnMouseDown && buttonState == buttonDown))) || isKeyDown) if ((down && (over || (triggerOnMouseDown && buttonState == buttonDown))) || isKeyDown)


+ 4
- 11
src/gui/components/controls/juce_ListBox.cpp View File

@@ -802,11 +802,7 @@ void ListBox::mouseMove (const MouseEvent& e)
if (mouseMoveSelects) if (mouseMoveSelects)
{ {
const MouseEvent e2 (e.getEventRelativeTo (this)); const MouseEvent e2 (e.getEventRelativeTo (this));
selectRow (getRowContainingPosition (e2.x, e2.y), true); 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)) 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()) if (imageArea.isEmpty())
imageArea = rowRect; imageArea = rowRect;
@@ -921,11 +915,10 @@ Image* ListBox::createSnapshotOfSelectedRows (int& imageX, int& imageY)
if (rowComp != 0 && isRowSelected (firstRow + i)) 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); 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())) if (g.reduceClipRegion (0, 0, rowComp->getWidth(), rowComp->getHeight()))
rowComp->paintEntireComponent (g); rowComp->paintEntireComponent (g);
} }


+ 1
- 1
src/gui/components/controls/juce_ListBox.h View File

@@ -572,7 +572,7 @@ private:
Component* headerComponent; Component* headerComponent;
int totalItems, rowHeight, minimumRowWidth; int totalItems, rowHeight, minimumRowWidth;
int outlineThickness; int outlineThickness;
int lastMouseX, lastMouseY, lastRowSelected;
int lastRowSelected;
bool mouseMoveSelects, multipleSelection, hasDoneInitialUpdate; bool mouseMoveSelects, multipleSelection, hasDoneInitialUpdate;
SparseSet <int> selected; SparseSet <int> selected;


+ 10
- 12
src/gui/components/controls/juce_Slider.cpp View File

@@ -1150,34 +1150,32 @@ void Slider::restoreMouseIfHidden()
if (style == RotaryHorizontalDrag || style == RotaryVerticalDrag) 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) if (style == RotaryHorizontalDrag)
{ {
const double posDiff = valueToProportionOfLength (pos) - valueToProportionOfLength (valueOnMouseDown); 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 else
{ {
const double posDiff = valueToProportionOfLength (valueOnMouseDown) - valueToProportionOfLength (pos); 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 else
{ {
const int pixelPos = (int) getLinearSliderPos (pos); 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));
} }
} }
} }


+ 1
- 4
src/gui/components/controls/juce_TableHeaderComponent.cpp View File

@@ -797,10 +797,7 @@ void TableHeaderComponent::mouseUp (const MouseEvent& e)
const MouseCursor TableHeaderComponent::getMouseCursor() 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 MouseCursor (MouseCursor::LeftRightResizeCursor);
return Component::getMouseCursor(); return Component::getMouseCursor();


+ 1
- 4
src/gui/components/controls/juce_TableListBox.cpp View File

@@ -229,10 +229,7 @@ public:
const String getTooltip() 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) if (columnId != 0 && owner.getModel() != 0)
return owner.getModel()->getCellTooltip (row, columnId); return owner.getModel()->getCellTooltip (row, columnId);


+ 1
- 2
src/gui/components/controls/juce_TextEditor.cpp View File

@@ -2126,8 +2126,7 @@ void TextEditor::focusGained (FocusChangeType)
ComponentPeer* const peer = getPeer(); ComponentPeer* const peer = getPeer();
if (peer != 0 && ! isReadOnly()) if (peer != 0 && ! isReadOnly())
peer->textInputRequired (getScreenX() - peer->getScreenX(),
getScreenY() - peer->getScreenY());
peer->textInputRequired (getScreenPosition() - peer->getScreenPosition());
} }
void TextEditor::focusLost (FocusChangeType) void TextEditor::focusLost (FocusChangeType)


+ 2
- 7
src/gui/components/controls/juce_TreeView.cpp View File

@@ -306,11 +306,8 @@ public:
const String getTooltip() const String getTooltip()
{ {
int x, y;
getMouseXYRelative (x, y);
Rectangle<int> pos; Rectangle<int> pos;
TreeViewItem* const item = findItemAt (y, pos);
TreeViewItem* const item = findItemAt (getMouseXYRelative().getY(), pos);
if (item != 0) if (item != 0)
return item->getTooltip(); return item->getTooltip();
@@ -557,10 +554,8 @@ TreeViewItem* TreeView::getItemOnRow (int index) const
TreeViewItem* TreeView::getItemAt (int y) const throw() TreeViewItem* TreeView::getItemAt (int y) const throw()
{ {
TreeViewContentComponent* const tc = (TreeViewContentComponent*) viewport->getViewedComponent(); TreeViewContentComponent* const tc = (TreeViewContentComponent*) viewport->getViewedComponent();
int x;
relativePositionToOtherComponent (tc, x, y);
Rectangle<int> pos; 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 TreeViewItem* TreeView::findItemFromIdentifierString (const String& identifierString) const


+ 97
- 142
src/gui/components/juce_Component.cpp View File

@@ -53,8 +53,7 @@ static const int customCommandMessage = 0x7fff0001;
static const int exitModalStateMessage = 0x7fff0002; static const int exitModalStateMessage = 0x7fff0002;
//============================================================================== //==============================================================================
static int unboundedMouseOffsetX = 0;
static int unboundedMouseOffsetY = 0;
static Point<int> unboundedMouseOffset;
static bool isUnboundedMouseModeOn = false; static bool isUnboundedMouseModeOn = false;
static bool isCursorVisibleUntilOffscreen; static bool isCursorVisibleUntilOffscreen;
@@ -412,8 +411,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo)
jmax (1, getHeight())); jmax (1, getHeight()));
#endif #endif
int x = 0, y = 0;
relativePositionToGlobal (x, y);
const Point<int> topLeft (relativePositionToGlobal (Point<int> (0, 0)));
bool wasFullscreen = false; bool wasFullscreen = false;
bool wasMinimised = false; bool wasMinimised = false;
@@ -429,7 +427,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo)
removeFromDesktop(); removeFromDesktop();
setTopLeftPosition (x, y);
setTopLeftPosition (topLeft.getX(), topLeft.getY());
} }
if (parentComponent_ != 0) if (parentComponent_ != 0)
@@ -443,8 +441,8 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo)
Desktop::getInstance().addDesktopComponent (this); 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()); peer->setVisible (isVisible());
@@ -741,57 +739,60 @@ int Component::getParentHeight() const throw()
: getParentMonitorArea().getHeight(); : 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; const Component* c = this;
Point<int> p (relativePosition);
do do
{ {
if (c->flags.hasHeavyweightPeerFlag) 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_; c = c->parentComponent_;
} }
while (c != 0); 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) if (flags.hasHeavyweightPeerFlag)
{ {
getPeer()->globalPositionToRelative (x, y);
return getPeer()->globalPositionToRelative (screenPosition);
} }
else else
{ {
if (parentComponent_ != 0) 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) if (targetComponent != 0)
{ {
const Component* c = this; const Component* c = this;
@@ -799,22 +800,23 @@ void Component::relativePositionToOtherComponent (const Component* const targetC
do do
{ {
if (c == targetComponent) if (c == targetComponent)
return;
return p;
if (c->flags.hasHeavyweightPeerFlag) if (c->flags.hasHeavyweightPeerFlag)
{ {
c->getPeer()->relativePositionToGlobal (x, y);
p = c->getPeer()->relativePositionToGlobal (p);
break; break;
} }
x += c->getX();
y += c->getY();
p += c->getPosition();
c = c->parentComponent_; c = c->parentComponent_;
} }
while (c != 0); 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) 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); internalUpdateMouseCursor (false);
} }
@@ -1574,9 +1575,8 @@ void Component::internalUpdateMouseCursor (bool forcedUpdate) throw()
{ {
MouseCursor mc (getLookAndFeel().getMouseCursorFor (*this)); MouseCursor mc (getLookAndFeel().getMouseCursorFor (*this));
if (isUnboundedMouseModeOn && (unboundedMouseOffsetX != 0
|| unboundedMouseOffsetY != 0
|| ! isCursorVisibleUntilOffscreen))
if (isUnboundedMouseModeOn
&& ((! unboundedMouseOffset.isOrigin()) || ! isCursorVisibleUntilOffscreen))
{ {
mc = MouseCursor::NoCursor; mc = MouseCursor::NoCursor;
forcedUpdate = true; forcedUpdate = true;
@@ -1989,22 +1989,18 @@ void Component::getVisibleArea (RectangleList& result,
{ {
const Component* const c = getTopLevelComponent(); 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()), Rectangle<int> (0, 0, c->getWidth(), c->getHeight()),
this); this);
} }
subtractObscuredRegions (result, 0, 0, unclipped, 0);
subtractObscuredRegions (result, Point<int>(), unclipped, 0);
result.consolidate(); result.consolidate();
} }
} }
void Component::subtractObscuredRegions (RectangleList& result, void Component::subtractObscuredRegions (RectangleList& result,
const int deltaX,
const int deltaY,
const Point<int>& delta,
const Rectangle<int>& clipRect, const Rectangle<int>& clipRect,
const Component* const compToAvoid) const throw() const Component* const compToAvoid) const throw()
{ {
@@ -2017,7 +2013,7 @@ void Component::subtractObscuredRegions (RectangleList& result,
if (c->isOpaque()) if (c->isOpaque())
{ {
Rectangle<int> childBounds (c->bounds_.getIntersection (clipRect)); Rectangle<int> childBounds (c->bounds_.getIntersection (clipRect));
childBounds.translate (deltaX, deltaY);
childBounds.translate (delta.getX(), delta.getY());
result.subtract (childBounds); result.subtract (childBounds);
} }
@@ -2026,11 +2022,8 @@ void Component::subtractObscuredRegions (RectangleList& result,
Rectangle<int> newClip (clipRect.getIntersection (c->bounds_)); Rectangle<int> newClip (clipRect.getIntersection (c->bounds_));
newClip.translate (-c->getX(), -c->getY()); 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) if (flags.repaintOnMouseActivityFlag)
repaint(); repaint();
const MouseEvent me (x, y,
const MouseEvent me (Point<int> (x, y),
ModifierKeys::getCurrentModifiers(), ModifierKeys::getCurrentModifiers(),
this, this,
Time (time), Time (time),
x, y,
Point<int> (x, y),
Time (time), Time (time),
0, false); 0, false);
@@ -2338,11 +2331,11 @@ void Component::internalMouseExit (int x, int y, int64 time)
if (flags.repaintOnMouseActivityFlag) if (flags.repaintOnMouseActivityFlag)
repaint(); repaint();
const MouseEvent me (x, y,
const MouseEvent me (Point<int> (x, y),
ModifierKeys::getCurrentModifiers(), ModifierKeys::getCurrentModifiers(),
this, this,
Time (time), Time (time),
x, y,
Point<int> (x, y),
Time (time), Time (time),
0, false); 0, false);
mouseExit (me); mouseExit (me);
@@ -2409,15 +2402,13 @@ public:
if (c != 0 && c->isMouseButtonDown()) 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 // the offsets have been added on, so must be taken off before calling the
// drag.. otherwise they'll be added twice // 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(); 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); const ComponentDeletionWatcher deletionChecker (this);
@@ -2469,11 +2458,11 @@ void Component::internalMouseDown (const int x, const int y, const int64 time)
if (isCurrentlyBlockedByAnotherModalComponent()) if (isCurrentlyBlockedByAnotherModalComponent())
{ {
// allow blocked mouse-events to go to global listeners.. // allow blocked mouse-events to go to global listeners..
const MouseEvent me (x, y,
const MouseEvent me (Point<int> (x, y),
ModifierKeys::getCurrentModifiers(), ModifierKeys::getCurrentModifiers(),
this, this,
Time (time), Time (time),
x, y,
Point<int> (x, y),
desktop.getLastMouseDownTime(), desktop.getLastMouseDownTime(),
desktop.getNumberOfMultipleClicks(), desktop.getNumberOfMultipleClicks(),
false); false);
@@ -2522,11 +2511,11 @@ void Component::internalMouseDown (const int x, const int y, const int64 time)
if (flags.repaintOnMouseActivityFlag) if (flags.repaintOnMouseActivityFlag)
repaint(); repaint();
const MouseEvent me (x, y,
const MouseEvent me (Point<int> (x, y),
ModifierKeys::getCurrentModifiers(), ModifierKeys::getCurrentModifiers(),
this, this,
desktop.getLastMouseDownTime(), desktop.getLastMouseDownTime(),
x, y,
Point<int> (x, y),
desktop.getLastMouseDownTime(), desktop.getLastMouseDownTime(),
desktop.getNumberOfMultipleClicks(), desktop.getNumberOfMultipleClicks(),
false); false);
@@ -2591,29 +2580,24 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int
flags.draggingFlag = false; flags.draggingFlag = false;
deleteAndZero (dragRepeater); 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); const ComponentDeletionWatcher deletionChecker (this);
if (flags.repaintOnMouseActivityFlag) if (flags.repaintOnMouseActivityFlag)
repaint(); repaint();
int mdx, mdy;
Desktop::getLastMouseDownPosition (mdx, mdy);
globalPositionToRelative (mdx, mdy);
const Point<int> mouseDownPos (globalPositionToRelative (Desktop::getLastMouseDownPosition()));
const Time lastMouseDownTime (desktop.getLastMouseDownTime()); const Time lastMouseDownTime (desktop.getLastMouseDownTime());
const MouseEvent me (x, y,
const MouseEvent me (Point<int> (x, y),
oldModifiers, oldModifiers,
this, this,
Time (time), Time (time),
mdx, mdy,
mouseDownPos,
lastMouseDownTime, lastMouseDownTime,
desktop.getNumberOfMultipleClicks(), desktop.getNumberOfMultipleClicks(),
desktop.mouseMovedSignificantlySincePressed desktop.mouseMovedSignificantlySincePressed
@@ -2733,26 +2717,21 @@ void Component::internalMouseDrag (int x, int y, const int64 time)
flags.mouseOverFlag = reallyContains (x, y, false); 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); 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 Time lastMouseDownTime (desktop.getLastMouseDownTime());
const MouseEvent me (x, y,
const MouseEvent me (Point<int> (x, y),
ModifierKeys::getCurrentModifiers(), ModifierKeys::getCurrentModifiers(),
this, this,
Time (time), Time (time),
mdx, mdy,
mouseDownPos,
lastMouseDownTime, lastMouseDownTime,
desktop.getNumberOfMultipleClicks(), desktop.getNumberOfMultipleClicks(),
desktop.mouseMovedSignificantlySincePressed desktop.mouseMovedSignificantlySincePressed
@@ -2812,37 +2791,30 @@ void Component::internalMouseDrag (int x, int y, const int64 time)
if (isUnboundedMouseModeOn) if (isUnboundedMouseModeOn)
{ {
Rectangle<int> screenArea (getParentMonitorArea().expanded (-2, -2)); 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; 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 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(); Desktop& desktop = Desktop::getInstance();
const MouseEvent me (x, y,
const MouseEvent me (Point<int> (x, y),
ModifierKeys::getCurrentModifiers(), ModifierKeys::getCurrentModifiers(),
this, this,
Time (time), Time (time),
x, y,
Point<int> (x, y),
Time (time), Time (time),
0, false); 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 wheelIncrementX = intAmountX * (1.0f / 256.0f);
const float wheelIncrementY = intAmountY * (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(), ModifierKeys::getCurrentModifiers(),
this, this,
Time (time), Time (time),
mx, my,
mousePos,
Time (time), Time (time),
0, false); 0, false);
@@ -3403,13 +3374,9 @@ bool JUCE_CALLTYPE Component::isMouseButtonDownAnywhere() throw()
return ModifierKeys::getCurrentModifiers().isAnyMouseButtonDown(); 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, void Component::enableUnboundedMouseMovement (bool enable,
@@ -3421,25 +3388,15 @@ void Component::enableUnboundedMouseMovement (bool enable,
if (enable != isUnboundedMouseModeOn) if (enable != isUnboundedMouseModeOn)
{ {
if ((! enable) && ((! isCursorVisibleUntilOffscreen) if ((! enable) && ((! isCursorVisibleUntilOffscreen)
|| unboundedMouseOffsetX != 0
|| unboundedMouseOffsetY != 0))
|| ! unboundedMouseOffset.isOrigin()))
{ {
// when released, return the mouse to within the component's bounds // 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; isUnboundedMouseModeOn = enable;
unboundedMouseOffsetX = 0;
unboundedMouseOffsetY = 0;
unboundedMouseOffset = Point<int>();
internalUpdateMouseCursor (true); internalUpdateMouseCursor (true);
} }
@@ -3453,11 +3410,9 @@ Component* JUCE_CALLTYPE Component::getComponentUnderMouse() throw()
//============================================================================== //==============================================================================
const Rectangle<int> Component::getParentMonitorArea() const 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)));
} }
//============================================================================== //==============================================================================


+ 12
- 9
src/gui/components/juce_Component.h View File

@@ -343,33 +343,37 @@ public:
@see getX, relativePositionToGlobal @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. /** Returns this component's y co-ordinate relative the the screen's top-left origin.
@see getY, relativePositionToGlobal @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. /** Converts a position relative to this component's top-left into a screen co-ordinate.
@see globalPositionToRelative, relativePositionToOtherComponent @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. /** Converts a screen co-ordinate into a position relative to this component's top-left.
@see relativePositionToGlobal, relativePositionToOtherComponent @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 /** Converts a position relative to this component's top-left into a position
relative to another component's top-left. relative to another component's top-left.
@see relativePositionToGlobal, globalPositionToRelative @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. /** Moves the component to a new position.
@@ -1578,7 +1582,7 @@ public:
The co-ordinates are relative to the component's top-left corner. 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. /** Returns the component that's currently underneath the mouse.
@@ -1979,8 +1983,7 @@ private:
void sendEnablementChangeMessage(); void sendEnablementChangeMessage();
static void* runModalLoopCallback (void*); static void* runModalLoopCallback (void*);
static void bringModalComponentToFront(); 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 Rectangle<int>& clipRect,
const Component* const compToAvoid) const throw(); const Component* const compToAvoid) const throw();
void clipObscuredRegions (Graphics& g, const Rectangle<int>& clipRect, void clipObscuredRegions (Graphics& g, const Rectangle<int>& clipRect,


+ 18
- 37
src/gui/components/juce_Desktop.cpp View File

@@ -34,9 +34,7 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
Desktop::Desktop() throw() Desktop::Desktop() throw()
: lastFakeMouseMoveX (0),
lastFakeMouseMoveY (0),
mouseClickCounter (0),
: mouseClickCounter (0),
mouseMovedSignificantlySincePressed (false), mouseMovedSignificantlySincePressed (false),
kioskModeComponent (0) kioskModeComponent (0)
{ {
@@ -118,7 +116,7 @@ const Rectangle<int> Desktop::getMainMonitorArea (const bool clippedToWorkArea)
return getDisplayMonitorCoordinates (0, 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)); Rectangle<int> best (getMainMonitorArea (clippedToWorkArea));
double bestDistance = 1.0e10; 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)); const Rectangle<int> rect (getDisplayMonitorCoordinates (i, clippedToWorkArea));
if (rect.contains (cx, cy))
if (rect.contains (position))
return rect; 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) if (distance < bestDistance)
{ {
@@ -154,18 +151,15 @@ Component* Desktop::getComponent (const int index) const throw()
return desktopComponents [index]; 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;) for (int i = desktopComponents.size(); --i >= 0;)
{ {
Component* const c = desktopComponents.getUnchecked(i); 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; 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() int Desktop::getMouseButtonClickCounter() throw()
@@ -327,10 +319,7 @@ void Desktop::handleAsyncUpdate()
//============================================================================== //==============================================================================
void Desktop::timerCallback() void Desktop::timerCallback()
{ {
int x, y;
getMousePosition (x, y);
if (lastFakeMouseMoveX != x || lastFakeMouseMoveY != y)
if (lastFakeMouseMove != getMousePosition())
sendMouseMove(); sendMouseMove();
} }
@@ -340,26 +329,18 @@ void Desktop::sendMouseMove()
{ {
startTimer (20); 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) if (target != 0)
{ {
target->globalPositionToRelative (x, y);
ComponentDeletionWatcher deletionChecker (target); 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;) for (int i = mouseListeners.size(); --i >= 0;)
{ {
@@ -384,7 +365,7 @@ void Desktop::resetTimer() throw()
else else
startTimer (100); startTimer (100);
getMousePosition (lastFakeMouseMoveX, lastFakeMouseMoveY);
lastFakeMouseMove = getMousePosition();
} }
//============================================================================== //==============================================================================


+ 7
- 7
src/gui/components/juce_Desktop.h View File

@@ -91,7 +91,7 @@ public:
If clippedToWorkArea is true, it will exclude any areas like the taskbar on Windows, 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. 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. 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. /** Makes the mouse pointer jump to a given location.
The co-ordinates are relative to the top-left of the main monitor. 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. /** 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 /** Returns the number of times the mouse button has been clicked since the
app started. app started.
@@ -218,8 +218,7 @@ public:
Returns 0 if the co-ordinates are inside a non-Juce window. 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; Array <Rectangle<int> > monitorCoordsClipped, monitorCoordsUnclipped;
int lastFakeMouseMoveX, lastFakeMouseMoveY, mouseClickCounter;
Point<int> lastFakeMouseMove;
int mouseClickCounter;
bool mouseMovedSignificantlySincePressed; bool mouseMovedSignificantlySincePressed;
struct RecentMouseDown struct RecentMouseDown


+ 1
- 2
src/gui/components/layout/juce_ComponentBoundsConstrainer.cpp View File

@@ -153,8 +153,7 @@ void ComponentBoundsConstrainer::setBoundsForComponent (Component* const compone
if (peer != 0) if (peer != 0)
border = peer->getFrameSize(); border = peer->getFrameSize();
limits = Desktop::getInstance().getMonitorAreaContaining (bounds.getCentreX(),
bounds.getCentreY());
limits = Desktop::getInstance().getMonitorAreaContaining (bounds.getCentre());
} }
else else
{ {


+ 5
- 8
src/gui/components/layout/juce_ComponentMovementWatcher.cpp View File

@@ -98,17 +98,14 @@ void ComponentMovementWatcher::componentMovedOrResized (Component&, bool wasMove
if (wasMoved) 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) if (wasMoved || wasResized)
componentMovedOrResized (wasMoved, wasResized); componentMovedOrResized (wasMoved, wasResized);


+ 1
- 1
src/gui/components/layout/juce_ComponentMovementWatcher.h View File

@@ -81,7 +81,7 @@ private:
ComponentPeer* lastPeer; ComponentPeer* lastPeer;
VoidArray registeredParentComps; VoidArray registeredParentComps;
bool reentrant; bool reentrant;
int lastX, lastY, lastWidth, lastHeight;
Rectangle<int> lastBounds;
#ifdef JUCE_DEBUG #ifdef JUCE_DEBUG
ScopedPointer <ComponentDeletionWatcher> deletionWatcher; ScopedPointer <ComponentDeletionWatcher> deletionWatcher;
#endif #endif


+ 5
- 8
src/gui/components/menus/juce_MenuBarComponent.cpp View File

@@ -279,9 +279,8 @@ void MenuBarComponent::showMenu (int index)
if (prevCompDeletionChecker != 0 && ! prevCompDeletionChecker->hasBeenDeleted()) if (prevCompDeletionChecker != 0 && ! prevCompDeletionChecker->hasBeenDeleted())
prevFocused->grabKeyboardFocus(); prevFocused->grabKeyboardFocus();
int mx, my;
getMouseXYRelative (mx, my);
updateItemUnderMouse (mx, my);
const Point<int> mousePos (getMouseXYRelative());
updateItemUnderMouse (mousePos.getX(), mousePos.getY());
repaint(); repaint();
if (result != 0) if (result != 0)
@@ -320,10 +319,9 @@ void MenuBarComponent::mouseExit (const MouseEvent& e)
void MenuBarComponent::mouseDown (const MouseEvent& e) void MenuBarComponent::mouseDown (const MouseEvent& e)
{ {
const MouseEvent e2 (e.getEventRelativeTo (this));
if (currentPopupIndex < 0) if (currentPopupIndex < 0)
{ {
const MouseEvent e2 (e.getEventRelativeTo (this));
updateItemUnderMouse (e2.x, e2.y); updateItemUnderMouse (e2.x, e2.y);
currentPopupIndex = -2; currentPopupIndex = -2;
@@ -440,9 +438,8 @@ void MenuBarComponent::timerCallback()
{ {
stopTimer(); stopTimer();
int mx, my;
getMouseXYRelative (mx, my);
updateItemUnderMouse (mx, my);
const Point<int> mousePos (getMouseXYRelative());
updateItemUnderMouse (mousePos.getX(), mousePos.getY());
} }


+ 39
- 53
src/gui/components/menus/juce_PopupMenu.cpp View File

@@ -271,8 +271,6 @@ public:
menuBarComponent (0), menuBarComponent (0),
managerOfChosenCommand (0), managerOfChosenCommand (0),
componentAttachedTo (0), componentAttachedTo (0),
lastMouseX (0),
lastMouseY (0),
minimumWidth (0), minimumWidth (0),
maximumNumColumns (7), maximumNumColumns (7),
standardItemHeight (0), standardItemHeight (0),
@@ -492,7 +490,7 @@ public:
void mouseWheelMove (const MouseEvent&, float /*amountX*/, float amountY) void mouseWheelMove (const MouseEvent&, float /*amountX*/, float amountY)
{ {
alterChildYPos (roundToInt (-10.0f * amountY * PopupMenuSettings::scrollZone)); alterChildYPos (roundToInt (-10.0f * amountY * PopupMenuSettings::scrollZone));
lastMouseX = -1;
lastMouse = Point<int> (-1, -1);
} }
bool keyPressed (const KeyPress& key) 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 // 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 // come back. So only dismiss synchronously if they're not on the original
// comp that we're attached to. // 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 postCommandMessage (PopupMenuSettings::dismissCommandId); // dismiss asynchrounously
return; return;
@@ -614,16 +611,13 @@ public:
startTimer (PopupMenuSettings::timerInterval); // do this in case it was called from a mouse startTimer (PopupMenuSettings::timerInterval); // do this in case it was called from a mouse
// move rather than a real timer callback // 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(); const uint32 now = Time::getMillisecondCounter();
if (now > timeEnteredCurrentChildComp + 100 if (now > timeEnteredCurrentChildComp + 100
&& reallyContains (x, y, true)
&& reallyContains (localMousePos.getX(), localMousePos.getY(), true)
&& currentChild->isValidComponent() && currentChild->isValidComponent()
&& (! disableMouseMoves) && (! disableMouseMoves)
&& ! (activeSubMenu != 0 && activeSubMenu->isVisible())) && ! (activeSubMenu != 0 && activeSubMenu->isVisible()))
@@ -631,17 +625,17 @@ public:
showSubMenuFor (currentChild); 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; bool overScrollArea = false;
if (isScrolling() 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) if (now > lastScroll + 20)
{ {
@@ -651,13 +645,13 @@ public:
for (int i = 0; i < getNumChildComponents() && amount == 0; ++i) for (int i = 0; i < getNumChildComponents() && amount == 0; ++i)
amount = ((int) scrollAcceleration) * getChildComponent (i)->getHeight(); amount = ((int) scrollAcceleration) * getChildComponent (i)->getHeight();
alterChildYPos (y < PopupMenuSettings::scrollZone ? -amount : amount);
alterChildYPos (localMousePos.getY() < PopupMenuSettings::scrollZone ? -amount : amount);
lastScroll = now; lastScroll = now;
} }
overScrollArea = true; overScrollArea = true;
lastMouseX = -1; // trigger a mouse-move
lastMouse = Point<int> (-1, -1); // trigger a mouse-move
} }
else else
{ {
@@ -669,7 +663,7 @@ public:
if (hideOnExit && hasBeenOver && (! isOverAny) && activeSubMenu != 0) if (hideOnExit && hasBeenOver && (! isOverAny) && activeSubMenu != 0)
{ {
activeSubMenu->updateMouseOverStatus (mx, my);
activeSubMenu->updateMouseOverStatus (globalMousePos);
isOverAny = isOverAnyMenu(); isOverAny = isOverAnyMenu();
} }
@@ -715,7 +709,7 @@ public:
else if (wasDown && now > menuCreationTime + 250 else if (wasDown && now > menuCreationTime + 250
&& ! (isDown || overScrollArea)) && ! (isDown || overScrollArea))
{ {
isOver = reallyContains (x, y, true);
isOver = reallyContains (localMousePos.getX(), localMousePos.getY(), true);
if (isOver) if (isOver)
{ {
@@ -759,7 +753,7 @@ private:
Component* componentAttachedTo; Component* componentAttachedTo;
ScopedPointer <ComponentDeletionWatcher> attachedCompWatcher; ScopedPointer <ComponentDeletionWatcher> attachedCompWatcher;
Rectangle<int> windowPos; Rectangle<int> windowPos;
int lastMouseX, lastMouseY;
Point<int> lastMouse;
int minimumWidth, maximumNumColumns, standardItemHeight; int minimumWidth, maximumNumColumns, standardItemHeight;
bool isOver, hasBeenOver, isDown, needsToScroll; bool isOver, hasBeenOver, isDown, needsToScroll;
bool dismissOnMouseUp, hideOnExit, disableMouseMoves, hasAnyJuceCompHadFocus; bool dismissOnMouseUp, hideOnExit, disableMouseMoves, hasAnyJuceCompHadFocus;
@@ -789,14 +783,13 @@ private:
&& (isOver || (activeSubMenu != 0 && activeSubMenu->isOverChildren())); && (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) if (activeSubMenu != 0)
activeSubMenu->updateMouseOverStatus (mx, my);
activeSubMenu->updateMouseOverStatus (globalMousePos);
} }
bool treeContains (const Window* const window) const throw() bool treeContains (const Window* const window) const throw()
@@ -823,8 +816,8 @@ private:
const bool alignToRectangle) const bool alignToRectangle)
{ {
const Rectangle<int> mon (Desktop::getInstance() 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 #if JUCE_MAC
true)); true));
#else #else
@@ -995,10 +988,7 @@ private:
windowPos.getHeight() - (PopupMenuSettings::scrollZone + m->getHeight())), windowPos.getHeight() - (PopupMenuSettings::scrollZone + m->getHeight())),
currentY); 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; int deltaY = wantedY - currentY;
@@ -1124,15 +1114,13 @@ private:
if (childComp->isValidComponent() && childComp->itemInfo.hasActiveSubMenu()) 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), activeSubMenu = Window::create (*(childComp->itemInfo.subMenu),
dismissOnMouseUp, dismissOnMouseUp,
this, this,
left, right, top, bottom,
topLeft.getX(), bottomRight.getX(), topLeft.getY(), bottomRight.getY(),
0, maximumNumColumns, 0, maximumNumColumns,
standardItemHeight, standardItemHeight,
false, 0, menuBarComponent, false, 0, menuBarComponent,
@@ -1151,14 +1139,14 @@ private:
return false; 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) if (isOver)
hasBeenOver = true; hasBeenOver = true;
if (abs (lastMouseX - mx) > 2 || abs (lastMouseY - my) > 2)
if (lastMouse.getDistanceFrom (globalMousePos) > 2)
{ {
lastMouseMoveTime = Time::getApproximateMillisecondCounter(); lastMouseMoveTime = Time::getApproximateMillisecondCounter();
@@ -1173,7 +1161,7 @@ private:
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()) 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 // 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 // submenu. To do this, look at whether the mouse stays inside a triangular region that
@@ -1183,31 +1171,30 @@ private:
if (activeSubMenu->getX() > getX()) 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 else
{ {
lastMouseX += 2;
lastMouse += Point<int> (2, 0);
subX += activeSubMenu->getWidth(); subX += activeSubMenu->getWidth();
} }
Path areaTowardsSubMenu; Path areaTowardsSubMenu;
areaTowardsSubMenu.addTriangle ((float) lastMouseX,
(float) lastMouseY,
areaTowardsSubMenu.addTriangle ((float) lastMouse.getX(),
(float) lastMouse.getY(),
subX, subX,
(float) activeSubMenu->getScreenY(), (float) activeSubMenu->getScreenY(),
subX, subX,
(float) (activeSubMenu->getScreenY() + activeSubMenu->getHeight())); (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) if (! isMovingTowardsMenu)
{ {
Component* c = getComponentAt (x, y);
Component* c = getComponentAt (localMousePos.getX(), localMousePos.getY());
if (c == this) if (c == this)
c = 0; c = 0;
@@ -1619,10 +1606,9 @@ int PopupMenu::show (const int itemIdThatMustBeVisible,
const int maximumNumColumns, const int maximumNumColumns,
const int standardItemHeight) 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, itemIdThatMustBeVisible,
minimumWidth, minimumWidth,
maximumNumColumns, maximumNumColumns,


+ 8
- 13
src/gui/components/mouse/juce_ComponentDragger.cpp View File

@@ -33,9 +33,7 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
ComponentDragger::ComponentDragger() ComponentDragger::ComponentDragger()
: constrainer (0),
originalX (0),
originalY (0)
: constrainer (0)
{ {
} }
@@ -52,9 +50,7 @@ void ComponentDragger::startDraggingComponent (Component* const componentToDrag,
if (componentToDrag->isValidComponent()) if (componentToDrag->isValidComponent())
{ {
constrainer = constrainer_; 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()) if (componentToDrag->isValidComponent())
{ {
int x = originalX;
int y = originalY;
Point<int> pos (originalPos);
int w = componentToDrag->getWidth(); int w = componentToDrag->getWidth();
int h = componentToDrag->getHeight(); int h = componentToDrag->getHeight();
const Component* const parentComp = componentToDrag->getParentComponent(); const Component* const parentComp = componentToDrag->getParentComponent();
if (parentComp != 0) 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) 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); false, false, false, false);
else else
componentToDrag->setBounds (x, y, w, h);
componentToDrag->setBounds (pos.getX(), pos.getY(), w, h);
} }
} }


+ 1
- 1
src/gui/components/mouse/juce_ComponentDragger.h View File

@@ -98,7 +98,7 @@ public:
private: private:
ComponentBoundsConstrainer* constrainer; ComponentBoundsConstrainer* constrainer;
int originalX, originalY;
Point<int> originalPos;
}; };
#endif // __JUCE_COMPONENTDRAGGER_JUCEHEADER__ #endif // __JUCE_COMPONENTDRAGGER_JUCEHEADER__

+ 41
- 59
src/gui/components/mouse/juce_DragAndDropContainer.cpp View File

@@ -53,7 +53,7 @@ private:
DragAndDropTarget* currentlyOver; DragAndDropTarget* currentlyOver;
String dragDesc; String dragDesc;
const int imageX, imageY;
const Point<int> imageOffset;
bool hasCheckedForExternalDrag, drawImage; bool hasCheckedForExternalDrag, drawImage;
DragImageComponent (const DragImageComponent&); DragImageComponent (const DragImageComponent&);
@@ -64,14 +64,13 @@ public:
const String& desc, const String& desc,
Component* const s, Component* const s,
DragAndDropContainer* const o, DragAndDropContainer* const o,
const int imageX_, const int imageY_)
const Point<int>& imageOffset_)
: image (im), : image (im),
source (s), source (s),
owner (o), owner (o),
currentlyOver (0), currentlyOver (0),
dragDesc (desc), dragDesc (desc),
imageX (imageX_),
imageY (imageY_),
imageOffset (imageOffset_),
hasCheckedForExternalDrag (false), hasCheckedForExternalDrag (false),
drawImage (true) 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(); Component* hit = getParentComponent();
if (hit == 0) if (hit == 0)
{ {
hit = Desktop::getInstance().findComponentAt (screenX, screenY);
hit = Desktop::getInstance().findComponentAt (screenPos);
} }
else 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 // (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)) if (ddt != 0 && ddt->isInterestedInDragSource (dragDescLocal, source))
{ {
relX = screenX;
relY = screenY;
hit->globalPositionToRelative (relX, relY);
relativePos = hit->globalPositionToRelative (screenPos);
return ddt; return ddt;
} }
@@ -168,14 +163,12 @@ public:
bool dropAccepted = false; bool dropAccepted = false;
DragAndDropTarget* ddt = 0; DragAndDropTarget* ddt = 0;
int relX = 0, relY = 0;
Point<int> relPos;
if (isVisible()) if (isVisible())
{ {
setVisible (false); 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 // fade this component and remove it - it'll be deleted later by the timer callback
@@ -189,17 +182,15 @@ public:
} }
else 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, fadeOutComponent (120,
targetX - ourCentreX,
targetY - ourCentreY);
target.getX() - ourCentre.getX(),
target.getY() - ourCentre.getY());
} }
} }
@@ -215,31 +206,30 @@ public:
currentlyOverWatcher = 0; currentlyOverWatcher = 0;
currentlyOver = 0; currentlyOver = 0;
ddt->itemDropped (dragDescLocal, source, relX, relY);
ddt->itemDropped (dragDescLocal, source, relPos.getX(), relPos.getY());
} }
// careful - this object could now be deleted.. // 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 // (note: use a local copy of the dragDesc member in case the callback runs
// a modal loop and deletes this object before it returns) // a modal loop and deletes this object before it returns)
const String dragDescLocal (dragDesc); const String dragDescLocal (dragDesc);
int newX = x + imageX;
int newY = y + imageY;
Point<int> newPos (screenPos + imageOffset);
if (getParentComponent() != 0) if (getParentComponent() != 0)
getParentComponent()->globalPositionToRelative (newX, newY);
newPos = getParentComponent()->globalPositionToRelative (newPos);
//if (newX != getX() || newY != getY()) //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(); drawImage = (ddt == 0) || ddt->shouldDrawDragImageWhenOver();
@@ -266,7 +256,7 @@ public:
currentlyOverWatcher = new ComponentDeletionWatcher (dynamic_cast <Component*> (ddt)); currentlyOverWatcher = new ComponentDeletionWatcher (dynamic_cast <Component*> (ddt));
if (currentlyOver->isInterestedInDragSource (dragDescLocal, source)) 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()) else if (currentlyOverWatcher != 0 && currentlyOverWatcher->hasBeenDeleted())
@@ -277,13 +267,13 @@ public:
if (currentlyOver != 0 if (currentlyOver != 0
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source)) && currentlyOver->isInterestedInDragSource (dragDescLocal, source))
currentlyOver->itemDragMove (dragDescLocal, source, relX, relY);
currentlyOver->itemDragMove (dragDescLocal, source, relPos.getX(), relPos.getY());
if (currentlyOver == 0 if (currentlyOver == 0
&& canDoExternalDrag && canDoExternalDrag
&& ! hasCheckedForExternalDrag) && ! hasCheckedForExternalDrag)
{ {
if (Desktop::getInstance().findComponentAt (x, y) == 0)
if (Desktop::getInstance().findComponentAt (screenPos) == 0)
{ {
hasCheckedForExternalDrag = true; hasCheckedForExternalDrag = true;
StringArray files; StringArray files;
@@ -311,7 +301,7 @@ public:
void mouseDrag (const MouseEvent& e) void mouseDrag (const MouseEvent& e)
{ {
if (e.originalComponent != this) if (e.originalComponent != this)
updateLocation (true, e.getScreenX(), e.getScreenY());
updateLocation (true, e.getScreenPosition());
} }
void timerCallback() void timerCallback()
@@ -355,9 +345,8 @@ void DragAndDropContainer::startDragging (const String& sourceDescription,
if (thisComp != 0) 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) if (dragImage == 0)
{ {
@@ -377,18 +366,17 @@ void DragAndDropContainer::startDragging (const String& sourceDescription,
const int lo = 150; const int lo = 150;
const int hi = 400; 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;) 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;) 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)); const int distance = roundToInt (sqrt (dx * dx + dy));
if (distance > lo) if (distance > lo)
@@ -402,25 +390,19 @@ void DragAndDropContainer::startDragging (const String& sourceDescription,
} }
} }
imageX = -cx;
imageY = -cy;
imageOffset = Point<int>() - clipped;
} }
else else
{ {
if (imageOffsetFromMouse == 0) if (imageOffsetFromMouse == 0)
{
imageX = dragImage->getWidth() / -2;
imageY = dragImage->getHeight() / -2;
}
imageOffset = Point<int> (dragImage->getWidth() / -2,
dragImage->getHeight() / -2);
else else
{
imageX = imageOffsetFromMouse->getX();
imageY = imageOffsetFromMouse->getY();
}
imageOffset = *imageOffsetFromMouse;
} }
dragImageComponent = new DragImageComponent (dragImage.release(), sourceDescription, sourceComponent, dragImageComponent = new DragImageComponent (dragImage.release(), sourceDescription, sourceComponent,
this, imageX, imageY);
this, imageOffset);
currentDragDesc = sourceDescription; currentDragDesc = sourceDescription;
@@ -436,7 +418,7 @@ void DragAndDropContainer::startDragging (const String& sourceDescription,
else else
thisComp->addChildComponent (dragImageComponent); thisComp->addChildComponent (dragImageComponent);
((DragImageComponent*) dragImageComponent)->updateLocation (false, mx, my);
((DragImageComponent*) dragImageComponent)->updateLocation (false, lastMouseDown);
dragImageComponent->setVisible (true); dragImageComponent->setVisible (true);
} }
else else


+ 45
- 35
src/gui/components/mouse/juce_MouseEvent.cpp View File

@@ -32,24 +32,21 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
MouseEvent::MouseEvent (const int x_,
const int y_,
MouseEvent::MouseEvent (const Point<int>& position,
const ModifierKeys& mods_, const ModifierKeys& mods_,
Component* const originator, Component* const originator,
const Time& eventTime_, const Time& eventTime_,
const int mouseDownX_,
const int mouseDownY_,
const Point<int> mouseDownPos_,
const Time& mouseDownTime_, const Time& mouseDownTime_,
const int numberOfClicks_, const int numberOfClicks_,
const bool mouseWasDragged) throw() const bool mouseWasDragged) throw()
: x (x_),
y (y_),
: x (position.getX()),
y (position.getY()),
mods (mods_), mods (mods_),
eventComponent (originator), eventComponent (originator),
originalComponent (originator), originalComponent (originator),
eventTime (eventTime_), eventTime (eventTime_),
mouseDownX (mouseDownX_),
mouseDownY (mouseDownY_),
mouseDownPos (mouseDownPos_),
mouseDownTime (mouseDownTime_), mouseDownTime (mouseDownTime_),
numberOfClicks (numberOfClicks_), numberOfClicks (numberOfClicks_),
wasMovedSinceMouseDown (mouseWasDragged) wasMovedSinceMouseDown (mouseWasDragged)
@@ -68,22 +65,27 @@ bool MouseEvent::mouseWasClicked() const throw()
int MouseEvent::getMouseDownX() const throw() int MouseEvent::getMouseDownX() const throw()
{ {
return mouseDownX;
return mouseDownPos.getX();
} }
int MouseEvent::getMouseDownY() const throw() int MouseEvent::getMouseDownY() const throw()
{ {
return mouseDownY;
return mouseDownPos.getY();
}
const Point<int> MouseEvent::getMouseDownPosition() const throw()
{
return mouseDownPos;
} }
int MouseEvent::getDistanceFromDragStartX() const throw() int MouseEvent::getDistanceFromDragStartX() const throw()
{ {
return x - mouseDownX;
return x - mouseDownPos.getX();
} }
int MouseEvent::getDistanceFromDragStartY() const throw() int MouseEvent::getDistanceFromDragStartY() const throw()
{ {
return y - mouseDownY;
return y - mouseDownPos.getY();
} }
int MouseEvent::getDistanceFromDragStart() const throw() 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; 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);
} }
//============================================================================== //==============================================================================


+ 41
- 14
src/gui/components/mouse/juce_MouseEvent.h View File

@@ -29,6 +29,7 @@
class Component; class Component;
#include "../keyboard/juce_ModifierKeys.h" #include "../keyboard/juce_ModifierKeys.h"
#include "../../../core/juce_Time.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. 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 modifiers the key modifiers at the time of the event
@param originator the component that the mouse event applies to @param originator the component that the mouse event applies to
@param eventTime the time the event happened @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 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. 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 @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 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. 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 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 @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, const ModifierKeys& modifiers,
Component* const originator, Component* const originator,
const Time& eventTime, const Time& eventTime,
const int mouseDownX,
const int mouseDownY,
const Point<int> mouseDownPos,
const Time& mouseDownTime, const Time& mouseDownTime,
const int numberOfClicks, const int numberOfClicks,
const bool mouseWasDragged) throw(); const bool mouseWasDragged) throw();
@@ -146,6 +142,14 @@ public:
*/ */
int getMouseDownY() const throw(); 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 /** Returns the straight-line distance between where the mouse is now and where it
was the last time the button was pressed. was the last time the button was pressed.
@@ -203,13 +207,20 @@ public:
int getLengthOfMousePress() const throw(); 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. /** 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. The co-ordinates are relative to the top-left of the main monitor.
@see getMouseDownScreenX, Desktop::getMousePosition @see getMouseDownScreenX, Desktop::getMousePosition
*/ */
int getScreenX() const throw();
int getScreenX() const;
/** Returns the mouse y position of this event, in global screen co-ordinates. /** Returns the mouse y position of this event, in global screen co-ordinates.
@@ -217,7 +228,15 @@ public:
@see getMouseDownScreenY, Desktop::getMousePosition @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. /** Returns the x co-ordinate at which the mouse button was last pressed.
@@ -225,7 +244,7 @@ public:
@see getScreenX, Desktop::getMousePosition @see getScreenX, Desktop::getMousePosition
*/ */
int getMouseDownScreenX() const throw();
int getMouseDownScreenX() const;
/** Returns the y co-ordinate at which the mouse button was last pressed. /** Returns the y co-ordinate at which the mouse button was last pressed.
@@ -233,7 +252,15 @@ public:
@see getScreenY, Desktop::getMousePosition @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. /** Creates a version of this event that is relative to a different component.
@@ -267,7 +294,7 @@ public:
juce_UseDebuggingNewOperator juce_UseDebuggingNewOperator
private: private:
int mouseDownX, mouseDownY;
Point<int> mouseDownPos;
Time mouseDownTime; Time mouseDownTime;
int numberOfClicks; int numberOfClicks;
bool wasMovedSinceMouseDown; bool wasMovedSinceMouseDown;


+ 3
- 4
src/gui/components/mouse/juce_MouseHoverDetector.cpp View File

@@ -78,13 +78,12 @@ void MouseHoverDetector::hoverTimerCallback()
if (source != 0) 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; hasJustHovered = true;
mouseHovered (mx, my);
mouseHovered (pos.getX(), pos.getY());
} }
} }
} }


+ 4
- 5
src/gui/components/special/juce_BubbleComponent.cpp View File

@@ -98,15 +98,14 @@ void BubbleComponent::setPosition (Component* componentToPointTo)
{ {
jassert (componentToPointTo->isValidComponent()); jassert (componentToPointTo->isValidComponent());
int tx = 0;
int ty = 0;
Point<int> pos;
if (getParentComponent() != 0) if (getParentComponent() != 0)
componentToPointTo->relativePositionToOtherComponent (getParentComponent(), tx, ty);
pos = componentToPointTo->relativePositionToOtherComponent (getParentComponent(), pos);
else 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_, void BubbleComponent::setPosition (const int arrowTipX_,


+ 14
- 14
src/gui/components/special/juce_MagnifierComponent.cpp View File

@@ -76,11 +76,11 @@ public:
peer->grabFocus(); peer->grabFocus();
} }
void textInputRequired (int x, int y)
void textInputRequired (const Point<int>& position)
{ {
ComponentPeer* peer = magnifierComp->getPeer(); ComponentPeer* peer = magnifierComp->getPeer();
if (peer != 0) if (peer != 0)
peer->textInputRequired (x, y);
peer->textInputRequired (position);
} }
void getBounds (int& x, int& y, int& w, int& h) const void getBounds (int& x, int& y, int& w, int& h) const
@@ -91,25 +91,25 @@ public:
h = component->getHeight(); 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(); 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(); 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 bool contains (int x, int y, bool) const


+ 26
- 27
src/gui/components/special/juce_MidiKeyboardComponent.cpp View File

@@ -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 whiteNotes[] = { 0, 2, 4, 5, 7, 9, 11 };
static const uint8 blackNotes[] = { 1, 3, 6, 8, 10 }; 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; return -1;
Point<int> p (pos);
if (orientation != horizontalKeyboard) if (orientation != horizontalKeyboard)
{ {
swapVariables (x, y);
p = Point<int> (p.getY(), p.getX());
if (orientation == verticalKeyboardFacingLeft) if (orientation == verticalKeyboardFacingLeft)
y = getWidth() - y;
p = Point<int> (p.getX(), getWidth() - p.getY());
else 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) 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); getKeyPos (note, kx, kw);
kx += xOffset; 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; return note;
} }
} }
@@ -307,10 +309,10 @@ int MidiKeyboardComponent::remappedXYToNote (int x, int y, float& mousePositionV
getKeyPos (note, kx, kw); getKeyPos (note, kx, kw);
kx += xOffset; kx += xOffset;
if (x >= kx && x < kx + kw)
if (pos.getX() >= kx && pos.getX() < kx + kw)
{ {
const int whiteNoteLength = (orientation == horizontalKeyboard) ? getHeight() : getWidth(); const int whiteNoteLength = (orientation == horizontalKeyboard) ? getHeight() : getWidth();
mousePositionVelocity = y / (float) whiteNoteLength;
mousePositionVelocity = pos.getY() / (float) whiteNoteLength;
return note; return note;
} }
} }
@@ -643,7 +645,7 @@ void MidiKeyboardComponent::resized()
float mousePositionVelocity; float mousePositionVelocity;
const int spaceAvailable = w - scrollButtonW * 2; 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) 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; float mousePositionVelocity = 0.0f;
const int newNote = (mouseDragging || isMouseOver()) const int newNote = (mouseDragging || isMouseOver())
? xyToNote (x, y, mousePositionVelocity) : -1;
? xyToNote (pos, mousePositionVelocity) : -1;
if (noteUnderMouse != newNote) if (noteUnderMouse != newNote)
{ {
@@ -735,19 +737,19 @@ void MidiKeyboardComponent::updateNoteUnderMouse (int x, int y)
void MidiKeyboardComponent::mouseMove (const MouseEvent& e) void MidiKeyboardComponent::mouseMove (const MouseEvent& e)
{ {
updateNoteUnderMouse (e.x, e.y);
updateNoteUnderMouse (e.getPosition());
stopTimer(); stopTimer();
} }
void MidiKeyboardComponent::mouseDrag (const MouseEvent& e) void MidiKeyboardComponent::mouseDrag (const MouseEvent& e)
{ {
float mousePositionVelocity; float mousePositionVelocity;
const int newNote = xyToNote (e.x, e.y, mousePositionVelocity);
const int newNote = xyToNote (e.getPosition(), mousePositionVelocity);
if (newNote >= 0) if (newNote >= 0)
mouseDraggedToKey (newNote, e); mouseDraggedToKey (newNote, e);
updateNoteUnderMouse (e.x, e.y);
updateNoteUnderMouse (e.getPosition());
} }
bool MidiKeyboardComponent::mouseDownOnKey (int /*midiNoteNumber*/, const MouseEvent&) bool MidiKeyboardComponent::mouseDownOnKey (int /*midiNoteNumber*/, const MouseEvent&)
@@ -762,7 +764,7 @@ void MidiKeyboardComponent::mouseDraggedToKey (int /*midiNoteNumber*/, const Mou
void MidiKeyboardComponent::mouseDown (const MouseEvent& e) void MidiKeyboardComponent::mouseDown (const MouseEvent& e)
{ {
float mousePositionVelocity; float mousePositionVelocity;
const int newNote = xyToNote (e.x, e.y, mousePositionVelocity);
const int newNote = xyToNote (e.getPosition(), mousePositionVelocity);
mouseDragging = false; mouseDragging = false;
if (newNote >= 0 && mouseDownOnKey (newNote, e)) if (newNote >= 0 && mouseDownOnKey (newNote, e))
@@ -771,7 +773,7 @@ void MidiKeyboardComponent::mouseDown (const MouseEvent& e)
noteUnderMouse = -1; noteUnderMouse = -1;
mouseDragging = true; mouseDragging = true;
updateNoteUnderMouse (e.x, e.y);
updateNoteUnderMouse (e.getPosition());
startTimer (500); startTimer (500);
} }
} }
@@ -779,19 +781,19 @@ void MidiKeyboardComponent::mouseDown (const MouseEvent& e)
void MidiKeyboardComponent::mouseUp (const MouseEvent& e) void MidiKeyboardComponent::mouseUp (const MouseEvent& e)
{ {
mouseDragging = false; mouseDragging = false;
updateNoteUnderMouse (e.x, e.y);
updateNoteUnderMouse (e.getPosition());
stopTimer(); stopTimer();
} }
void MidiKeyboardComponent::mouseEnter (const MouseEvent& e) void MidiKeyboardComponent::mouseEnter (const MouseEvent& e)
{ {
updateNoteUnderMouse (e.x, e.y);
updateNoteUnderMouse (e.getPosition());
} }
void MidiKeyboardComponent::mouseExit (const MouseEvent& e) void MidiKeyboardComponent::mouseExit (const MouseEvent& e)
{ {
updateNoteUnderMouse (e.x, e.y);
updateNoteUnderMouse (e.getPosition());
} }
void MidiKeyboardComponent::mouseWheelMove (const MouseEvent&, float ix, float iy) 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() void MidiKeyboardComponent::timerCallback()
{ {
int mx, my;
getMouseXYRelative (mx, my);
updateNoteUnderMouse (mx, my);
updateNoteUnderMouse (getMouseXYRelative());
} }
//============================================================================== //==============================================================================


+ 3
- 3
src/gui/components/special/juce_MidiKeyboardComponent.h View File

@@ -405,10 +405,10 @@ private:
int octaveNumForMiddleC; int octaveNumForMiddleC;
void getKeyPos (int midiNoteNumber, int& x, int& w) const; 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 resetAnyKeysInUse();
void updateNoteUnderMouse (int x, int y);
void updateNoteUnderMouse (const Point<int>& pos);
void repaintNote (const int midiNoteNumber); void repaintNote (const int midiNoteNumber);
MidiKeyboardComponent (const MidiKeyboardComponent&); MidiKeyboardComponent (const MidiKeyboardComponent&);


+ 2
- 3
src/gui/components/special/juce_OpenGLComponent.cpp View File

@@ -259,9 +259,8 @@ void OpenGLComponent::paint (Graphics&)
if (peer != 0) 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());
} }
} }
} }


+ 36
- 54
src/gui/components/windows/juce_ComponentPeer.cpp View File

@@ -114,24 +114,22 @@ void ComponentPeer::handleMouseEnter (int x, int y, const int64 time)
{ {
jassert (Component::componentUnderMouse->isValidComponent()); 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; Component::componentUnderMouse = 0;
if (deletionChecker.hasBeenDeleted()) if (deletionChecker.hasBeenDeleted())
return; return;
c = component->getComponentAt (oldX, oldY);
c = component->getComponentAt (x, y);
} }
Component::componentUnderMouse = c; Component::componentUnderMouse = c;
if (Component::componentUnderMouse != 0) 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) if (c != Component::componentUnderMouse)
{ {
const int oldX = x;
const int oldY = y;
if (Component::componentUnderMouse != 0) 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; Component::componentUnderMouse = 0;
if (deletionChecker.hasBeenDeleted()) if (deletionChecker.hasBeenDeleted())
@@ -169,10 +161,8 @@ void ComponentPeer::handleMouseMove (int x, int y, const int64 time)
if (c != 0) 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()) if (deletionChecker.hasBeenDeleted())
return; // if this window has just been deleted.. 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) 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) 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) 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) if (c != Component::componentUnderMouse)
{ {
const int oldX = x;
const int oldY = y;
if (Component::componentUnderMouse != 0) 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) if (Component::componentUnderMouse != 0)
Component::componentUnderMouse->internalMouseExit (x, y, time);
Component::componentUnderMouse->internalMouseExit (relPos.getX(), relPos.getY(), time);
if (deletionChecker.hasBeenDeleted()) if (deletionChecker.hasBeenDeleted())
return; return;
c = component->getComponentAt (oldX, oldY);
c = component->getComponentAt (x, y);
} }
Component::componentUnderMouse = c; Component::componentUnderMouse = c;
if (Component::componentUnderMouse != 0) 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 else
{ {
if (Component::componentUnderMouse != 0) 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) 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; Component::componentUnderMouse = 0;
} }
} }
@@ -299,14 +283,13 @@ void ComponentPeer::sendFakeMouseMove() throw()
component->bounds_.setBounds (realX, realY, realW, realH); 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; fakeMouseMessageSent = true;
@@ -638,11 +621,10 @@ void ComponentPeer::handleFileDragMove (const StringArray& files, int x, int y)
if (newTarget != 0) if (newTarget != 0)
{ {
Component* const targetComp = dynamic_cast <Component*> (newTarget); 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)); 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) if (newTarget != 0)
{ {
Component* const targetComp = dynamic_cast <Component*> (newTarget); 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; 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());
} }
} }
} }


+ 4
- 7
src/gui/components/windows/juce_ComponentPeer.h View File

@@ -150,16 +150,13 @@ public:
virtual void getBounds (int& x, int& y, int& w, int& h) const = 0; 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. */ /** 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. */ /** 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. */ /** 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. */ /** Minimises the window. */
virtual void setMinimised (bool shouldBeMinimised) = 0; virtual void setMinimised (bool shouldBeMinimised) = 0;
@@ -255,7 +252,7 @@ public:
This may cause things like a virtual on-screen keyboard to appear, depending This may cause things like a virtual on-screen keyboard to appear, depending
on the OS. 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. */ /** Called when the window gains keyboard focus. */
void handleFocusGain(); void handleFocusGain();


+ 1
- 2
src/gui/components/windows/juce_ResizableWindow.cpp View File

@@ -475,8 +475,7 @@ bool ResizableWindow::restoreWindowStateFromString (const String& s)
if (newPos.isEmpty()) if (newPos.isEmpty())
return false; 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; ComponentPeer* const peer = isOnDesktop() ? getPeer() : 0;
if (peer != 0) if (peer != 0)


+ 11
- 16
src/gui/components/windows/juce_TooltipWindow.cpp View File

@@ -40,8 +40,6 @@ TooltipWindow::TooltipWindow (Component* const parentComponent,
const int millisecondsBeforeTipAppears_) const int millisecondsBeforeTipAppears_)
: Component ("tooltip"), : Component ("tooltip"),
millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_), millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_),
mouseX (0),
mouseY (0),
lastHideTime (0), lastHideTime (0),
lastComponentUnderMouse (0), lastComponentUnderMouse (0),
changedCompsSinceShown (true) changedCompsSinceShown (true)
@@ -80,24 +78,23 @@ void TooltipWindow::showFor (const String& tip)
jassert (tip.isNotEmpty()); jassert (tip.isNotEmpty());
tipShowing = tip; tipShowing = tip;
int mx, my;
Desktop::getMousePosition (mx, my);
Point<int> mousePos (Desktop::getMousePosition());
if (getParentComponent() != 0) if (getParentComponent() != 0)
getParentComponent()->globalPositionToRelative (mx, my);
mousePos = getParentComponent()->globalPositionToRelative (mousePos);
int x, y, w, h; int x, y, w, h;
getLookAndFeel().getTooltipSize (tip, 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 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 else
y = my + 6;
y = mousePos.getY() + 6;
setBounds (x, y, w, h); setBounds (x, y, w, h);
setVisible (true); setVisible (true);
@@ -148,11 +145,9 @@ void TooltipWindow::timerCallback()
const bool mouseWasClicked = clickCount > mouseClicks; const bool mouseWasClicked = clickCount > mouseClicks;
mouseClicks = clickCount; 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) if (tipChanged || mouseWasClicked || mouseMovedQuickly)
lastCompChangeTime = now; lastCompChangeTime = now;


+ 2
- 1
src/gui/components/windows/juce_TooltipWindow.h View File

@@ -100,7 +100,8 @@ public:
private: private:
//============================================================================== //==============================================================================
int millisecondsBeforeTipAppears; int millisecondsBeforeTipAppears;
int mouseX, mouseY, mouseClicks;
Point<int> lastMousePos;
int mouseClicks;
unsigned int lastCompChangeTime, lastHideTime; unsigned int lastCompChangeTime, lastHideTime;
Component* lastComponentUnderMouse; Component* lastComponentUnderMouse;
bool changedCompsSinceShown; bool changedCompsSinceShown;


+ 5
- 6
src/gui/components/windows/juce_TopLevelWindow.cpp View File

@@ -291,22 +291,21 @@ void TopLevelWindow::centreAroundComponent (Component* c, const int width, const
} }
else 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()); Rectangle<int> parentArea (c->getParentMonitorArea());
if (getParentComponent() != 0) if (getParentComponent() != 0)
{ {
getParentComponent()->globalPositionToRelative (x, y);
p = getParentComponent()->globalPositionToRelative (p);
parentArea.setBounds (0, 0, getParentWidth(), getParentHeight()); parentArea.setBounds (0, 0, getParentWidth(), getParentHeight());
} }
parentArea.reduce (12, 12); 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); width, height);
} }
} }


+ 9
- 1
src/gui/graphics/geometry/juce_Point.h View File

@@ -65,6 +65,12 @@ public:
/** Returns the point's y co-ordinate. */ /** Returns the point's y co-ordinate. */
inline ValueType getY() const throw() { return y; } 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. */ /** Changes the point's x and y co-ordinates. */
void setXY (const ValueType newX, const ValueType newY) throw() { x = newX; y = newY; } 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. */ /** Subtracts another point's co-ordinates to this one. */
Point& operator-= (const Point& other) throw() { x -= other.x; y -= other.y; return *this; } 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. /** Uses a transform to change the point's co-ordinates.
This will only compile if ValueType = float! This will only compile if ValueType = float!
@see AffineTransform::transformPoint @see AffineTransform::transformPoint
*/ */
void applyTransform (const AffineTransform& transform) throw() { transform.transformPoint (x, y); } void applyTransform (const AffineTransform& transform) throw() { transform.transformPoint (x, y); }
//============================================================================== //==============================================================================
juce_UseDebuggingNewOperator juce_UseDebuggingNewOperator


+ 18
- 0
src/gui/graphics/geometry/juce_Rectangle.h View File

@@ -107,6 +107,8 @@ public:
/** Returns the y co-ordinate of the rectangle's centre. */ /** Returns the y co-ordinate of the rectangle's centre. */
inline ValueType getCentreY() const throw() { return y + h / (ValueType) 2; } 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 */ /** Returns true if the rectangle's width and height are both zero or less */
bool isEmpty() const throw() { return w <= 0 || h <= 0; } bool isEmpty() const throw() { return w <= 0 || h <= 0; }
@@ -114,6 +116,9 @@ public:
/** Returns the rectangle's top-left position as a Point. */ /** Returns the rectangle's top-left position as a Point. */
const Point<ValueType> getPosition() const throw() { return Point<ValueType> (x, y); } 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). */ /** 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; } 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; 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. */ /** Returns true if this other rectangle is completely inside this one. */
bool contains (const Rectangle& other) const throw() bool contains (const Rectangle& other) const throw()
{ {
@@ -263,6 +274,13 @@ public:
&& x + w >= other.x + other.w && y + h >= other.y + other.h; && 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. */ /** Returns true if any part of another rectangle overlaps this one. */
bool intersects (const Rectangle& other) const throw() bool intersects (const Rectangle& other) const throw()
{ {


+ 35
- 46
src/native/linux/juce_linux_Windowing.cpp View File

@@ -111,7 +111,7 @@ static const int eventMask = NoEventMask | KeyPressMask | KeyReleaseMask | Butto
//============================================================================== //==============================================================================
static int pointerMap[5]; static int pointerMap[5];
static int lastMousePosX = 0, lastMousePosY = 0;
static Point<int> lastMousePos;
enum MouseButtons enum MouseButtons
{ {
@@ -789,26 +789,19 @@ public:
h = wh; 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) 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)); getEventTime (buttonPressEvent->time));
} }
lastMousePosX = lastMousePosY = 0x100000;
lastMousePos = Point<int> (0x100000, 0x100000);
break; break;
} }
@@ -1376,7 +1369,7 @@ public:
buttonRelEvent->x, buttonRelEvent->y, buttonRelEvent->x, buttonRelEvent->y,
getEventTime (buttonRelEvent->time)); getEventTime (buttonRelEvent->time));
lastMousePosX = lastMousePosY = 0x100000;
lastMousePos = Point<int> (0x100000, 0x100000);
break; break;
} }
@@ -1386,13 +1379,11 @@ public:
updateKeyModifiers (movedEvent->state); 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) if (parentWindow != 0 && (styleFlags & windowHasTitleBar) == 0)
{ {
@@ -1411,26 +1402,23 @@ public:
{ {
parentWindow = wParent; parentWindow = wParent;
updateBounds(); updateBounds();
x -= getScreenX();
y -= getScreenY();
mousePos -= getScreenPosition();
} }
else else
{ {
parentWindow = 0; parentWindow = 0;
x -= getScreenX();
y -= getScreenY();
mousePos -= getScreenPosition();
} }
} }
else else
{ {
x -= getScreenX();
y -= getScreenY();
mousePos -= getScreenPosition();
} }
if ((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0) if ((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0)
handleMouseMove (x, y, getEventTime (movedEvent->time));
handleMouseMove (mousePos.getX(), mousePos.getY(), getEventTime (movedEvent->time));
else else
handleMouseDrag (x, y, getEventTime (movedEvent->time));
handleMouseDrag (mousePos.getX(), mousePos.getY(), getEventTime (movedEvent->time));
} }
break; break;
@@ -1438,7 +1426,7 @@ public:
case EnterNotify: case EnterNotify:
{ {
lastMousePosX = lastMousePosY = 0x100000;
lastMousePos = Point<int> (0x100000, 0x100000);
const XEnterWindowEvent* const enterEvent = (const XEnterWindowEvent*) &event->xcrossing; const XEnterWindowEvent* const enterEvent = (const XEnterWindowEvent*) &event->xcrossing;
if ((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0 if ((currentModifiers & ModifierKeys::allMouseButtonModifiers) == 0
@@ -2336,7 +2324,7 @@ private:
void resetDragAndDrop() void resetDragAndDrop()
{ {
dragAndDropFiles.clear(); dragAndDropFiles.clear();
lastDropX = lastDropY = -1;
lastDropPos = Point<int> (-1, -1);
dragAndDropCurrentMimeType = 0; dragAndDropCurrentMimeType = 0;
dragAndDropSourceWindow = 0; dragAndDropSourceWindow = 0;
srcMimeTypeAtomList.clear(); srcMimeTypeAtomList.clear();
@@ -2401,14 +2389,13 @@ private:
dragAndDropSourceWindow = clientMsg->data.l[0]; 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]; dragAndDropTimestamp = clientMsg->data.l[3];
Atom targetAction = XA_XdndActionCopy; Atom targetAction = XA_XdndActionCopy;
@@ -2428,7 +2415,7 @@ private:
updateDraggedFileList (clientMsg); updateDraggedFileList (clientMsg);
if (dragAndDropFiles.size() > 0) if (dragAndDropFiles.size() > 0)
handleFileDragMove (dragAndDropFiles, dropX, dropY);
handleFileDragMove (dragAndDropFiles, dropPos.getX(), dropPos.getY());
} }
} }
@@ -2438,13 +2425,13 @@ private:
updateDraggedFileList (clientMsg); updateDraggedFileList (clientMsg);
const StringArray files (dragAndDropFiles); const StringArray files (dragAndDropFiles);
const int lastX = lastDropX, lastY = lastDropY;
const Point<int> lastPos (lastDropPos);
sendDragAndDropFinish(); sendDragAndDropFinish();
resetDragAndDrop(); resetDragAndDrop();
if (files.size() > 0) if (files.size() > 0)
handleFileDragDrop (files, lastX, lastY);
handleFileDragDrop (files, lastPos.getX(), lastPos.getY());
} }
void handleDragAndDropEnter (const XClientMessageEvent* const clientMsg) void handleDragAndDropEnter (const XClientMessageEvent* const clientMsg)
@@ -2578,7 +2565,8 @@ private:
} }
StringArray dragAndDropFiles; StringArray dragAndDropFiles;
int dragAndDropTimestamp, lastDropX, lastDropY;
int dragAndDropTimestamp;
Point<int> lastDropPos;
Atom XA_OtherMime, dragAndDropCurrentMimeType; Atom XA_OtherMime, dragAndDropCurrentMimeType;
Window dragAndDropSourceWindow; Window dragAndDropSourceWindow;
@@ -2737,17 +2725,18 @@ bool Desktop::canUseSemiTransparentWindows() throw()
return false; 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); 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; ScopedXLock xlock;
Window root = RootWindow (display, DefaultScreen (display)); 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());
} }


+ 8
- 10
src/native/mac/juce_iphone_UIViewComponentPeer.mm View File

@@ -93,10 +93,9 @@ public:
void setBounds (int x, int y, int w, int h, const bool isNowFullScreen); 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 bool global) const;
void getBounds (int& x, int& y, int& w, int& h) 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); void setMinimised (bool shouldBeMinimised);
bool isMinimised() const; bool isMinimised() const;
void setFullScreen (bool shouldBeFullScreen); void setFullScreen (bool shouldBeFullScreen);
@@ -121,7 +120,7 @@ public:
virtual void viewFocusLoss(); virtual void viewFocusLoss();
bool isFocused() const; bool isFocused() const;
void grabFocus(); void grabFocus();
void textInputRequired (int x, int y);
void textInputRequired (const Point<int>& position);
//============================================================================== //==============================================================================
void repaint (int x, int y, int w, int h); 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; 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>&)
{ {
} }


+ 4
- 5
src/native/mac/juce_mac_MiscUtilities.mm View File

@@ -145,20 +145,19 @@ bool Desktop::canUseSemiTransparentWindows() throw()
return true; return true;
} }
void Desktop::getMousePosition (int& x, int& y) throw()
const Point<int> Desktop::getMousePosition()
{ {
const ScopedAutoReleasePool pool; const ScopedAutoReleasePool pool;
const NSPoint p ([NSEvent mouseLocation]); 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 // this rubbish needs to be done around the warp call, to avoid causing a
// bizarre glitch.. // bizarre glitch..
CGAssociateMouseAndMouseCursorPosition (false); CGAssociateMouseAndMouseCursorPosition (false);
CGWarpMouseCursorPosition (CGPointMake (x, y));
CGWarpMouseCursorPosition (CGPointMake (newPosition.getX(), newPosition.getY()));
CGAssociateMouseAndMouseCursorPosition (true); CGAssociateMouseAndMouseCursorPosition (true);
} }


+ 3
- 4
src/native/mac/juce_mac_NSViewComponent.mm View File

@@ -76,12 +76,11 @@ public:
if (topComp->getPeer() != 0) 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; 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.width = (float) owner->getWidth();
r.size.height = (float) owner->getHeight(); r.size.height = (float) owner->getHeight();
r.origin.y = [[view superview] frame].size.height - (r.origin.y + r.size.height); r.origin.y = [[view superview] frame].size.height - (r.origin.y + r.size.height);


+ 14
- 31
src/native/mac/juce_mac_NSViewComponentPeer.mm View File

@@ -135,10 +135,9 @@ public:
void setBounds (int x, int y, int w, int h, const bool isNowFullScreen); 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 bool global) const;
void getBounds (int& x, int& y, int& w, int& h) 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); void setMinimised (bool shouldBeMinimised);
bool isMinimised() const; bool isMinimised() const;
void setFullScreen (bool shouldBeFullScreen); void setFullScreen (bool shouldBeFullScreen);
@@ -199,7 +198,7 @@ public:
virtual void viewFocusLoss(); virtual void viewFocusLoss();
bool isFocused() const; bool isFocused() const;
void grabFocus(); void grabFocus();
void textInputRequired (int x, int y);
void textInputRequired (const Point<int>& position);
//============================================================================== //==============================================================================
void repaint (int x, int y, int w, int h); 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); getBounds (x, y, w, h, ! isSharedWindow);
} }
int NSViewComponentPeer::getScreenX() const
const Point<int> NSViewComponentPeer::getScreenPosition() const
{ {
int x, y, w, h; int x, y, w, h;
getBounds (x, y, w, h, true); 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) 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() 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];
} }
} }


+ 8
- 11
src/native/windows/juce_win32_ActiveXComponent.cpp View File

@@ -286,10 +286,9 @@ public:
if (topComp->getPeer() != 0) 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) 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(); HWND hwnd = (HWND) peer->getNativeHandle();
ScopedPointer <ActiveXControlData> info (new ActiveXControlData (hwnd, this)); ScopedPointer <ActiveXControlData> info (new ActiveXControlData (hwnd, this));
@@ -469,15 +466,15 @@ bool ActiveXControlComponent::createControl (const void* controlIID)
if (OleSetContainedObject (info->control, TRUE) == S_OK) if (OleSetContainedObject (info->control, TRUE) == S_OK)
{ {
RECT rect; 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) if (info->control->DoVerb (OLEIVERB_SHOW, 0, info->clientSite, 0, hwnd, &rect) == S_OK)
{ {
control = info.release(); control = info.release();
setControlBounds (Rectangle<int> (x, y, getWidth(), getHeight()));
setControlBounds (Rectangle<int> (pos.getX(), pos.getY(), getWidth(), getHeight()));
((ActiveXControlData*) control)->controlHWND = getHWND (this); ((ActiveXControlData*) control)->controlHWND = getHWND (this);


+ 22
- 41
src/native/windows/juce_win32_Windowing.cpp View File

@@ -590,36 +590,22 @@ public:
h -= windowBorder.getTopAndBottom(); h -= windowBorder.getTopAndBottom();
} }
int getScreenX() const
const Point<int> getScreenPosition() const
{ {
RECT r; RECT r;
GetWindowRect (hwnd, &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) void setMinimised (bool shouldBeMinimised)
@@ -779,7 +765,7 @@ public:
shouldDeactivateTitleBar = oldDeactivate; shouldDeactivateTitleBar = oldDeactivate;
} }
void textInputRequired (int /*x*/, int /*y*/)
void textInputRequired (const Point<int>&)
{ {
if (! hasCreatedCaret) if (! hasCreatedCaret)
{ {
@@ -1691,9 +1677,8 @@ private:
HRESULT __stdcall DragEnter (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) HRESULT __stdcall DragEnter (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect)
{ {
updateFileList (pDataObject); 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; *pdwEffect = DROPEFFECT_COPY;
return S_OK; return S_OK;
} }
@@ -1706,9 +1691,8 @@ private:
HRESULT __stdcall DragOver (DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) 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; *pdwEffect = DROPEFFECT_COPY;
return S_OK; return S_OK;
} }
@@ -1716,9 +1700,8 @@ private:
HRESULT __stdcall Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) HRESULT __stdcall Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect)
{ {
updateFileList (pDataObject); 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; *pdwEffect = DROPEFFECT_COPY;
return S_OK; return S_OK;
} }
@@ -2001,9 +1984,8 @@ private:
if (LOWORD (wParam) == WA_CLICKACTIVE if (LOWORD (wParam) == WA_CLICKACTIVE
&& component->isCurrentlyBlockedByAnotherModalComponent()) && 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()) if (underMouse != 0 && underMouse->isCurrentlyBlockedByAnotherModalComponent())
Component::getCurrentlyModalComponent()->inputAttemptWhenModal(); Component::getCurrentlyModalComponent()->inputAttemptWhenModal();
@@ -2072,8 +2054,8 @@ private:
{ {
const int oldModifiers = currentModifiers; 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) if (lParam == WM_LBUTTONDOWN || lParam == WM_LBUTTONDBLCLK)
e.mods = ModifierKeys (e.mods.getRawFlags() | ModifierKeys::leftButtonModifier); 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; POINT mousePos;
GetCursorPos (&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());
} }
//============================================================================== //==============================================================================


Loading…
Cancel
Save