The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

795 lines
25KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library - "Jules' Utility Class Extensions"
  4. Copyright 2004-9 by Raw Material Software Ltd.
  5. ------------------------------------------------------------------------------
  6. JUCE can be redistributed and/or modified under the terms of the GNU General
  7. Public License (Version 2), as published by the Free Software Foundation.
  8. A copy of the license is included in the JUCE distribution, or can be found
  9. online at www.gnu.org/licenses.
  10. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
  11. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  12. A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  13. ------------------------------------------------------------------------------
  14. To release a closed-source product which uses JUCE, commercial licenses are
  15. available: visit www.rawmaterialsoftware.com/juce for more information.
  16. ==============================================================================
  17. */
  18. #include "../../../core/juce_StandardHeader.h"
  19. BEGIN_JUCE_NAMESPACE
  20. #include "../../../application/juce_Application.h"
  21. #include "../juce_Component.h"
  22. #include "../juce_ComponentDeletionWatcher.h"
  23. #include "../juce_Desktop.h"
  24. #include "../../../events/juce_MessageManager.h"
  25. #include "../../../core/juce_Time.h"
  26. #include "../../../core/juce_Random.h"
  27. #include "../layout/juce_ComponentBoundsConstrainer.h"
  28. #include "../mouse/juce_FileDragAndDropTarget.h"
  29. //#define JUCE_ENABLE_REPAINT_DEBUGGING 1
  30. //==============================================================================
  31. // these are over in juce_component.cpp
  32. extern int64 juce_recentMouseDownTimes[4];
  33. extern int juce_recentMouseDownX [4];
  34. extern int juce_recentMouseDownY [4];
  35. extern Component* juce_recentMouseDownComponent [4];
  36. extern int juce_LastMousePosX;
  37. extern int juce_LastMousePosY;
  38. extern int juce_MouseClickCounter;
  39. extern bool juce_MouseHasMovedSignificantlySincePressed;
  40. static const int fakeMouseMoveMessage = 0x7fff00ff;
  41. static VoidArray heavyweightPeers (4);
  42. //==============================================================================
  43. ComponentPeer::ComponentPeer (Component* const component_,
  44. const int styleFlags_) throw()
  45. : component (component_),
  46. styleFlags (styleFlags_),
  47. lastPaintTime (0),
  48. constrainer (0),
  49. lastFocusedComponent (0),
  50. lastDragAndDropCompUnderMouse (0),
  51. fakeMouseMessageSent (false),
  52. isWindowMinimised (false)
  53. {
  54. heavyweightPeers.add (this);
  55. }
  56. ComponentPeer::~ComponentPeer()
  57. {
  58. heavyweightPeers.removeValue (this);
  59. Desktop::getInstance().triggerFocusCallback();
  60. }
  61. //==============================================================================
  62. int ComponentPeer::getNumPeers() throw()
  63. {
  64. return heavyweightPeers.size();
  65. }
  66. ComponentPeer* ComponentPeer::getPeer (const int index) throw()
  67. {
  68. return (ComponentPeer*) heavyweightPeers [index];
  69. }
  70. ComponentPeer* ComponentPeer::getPeerFor (const Component* const component) throw()
  71. {
  72. for (int i = heavyweightPeers.size(); --i >= 0;)
  73. {
  74. ComponentPeer* const peer = (ComponentPeer*) heavyweightPeers.getUnchecked(i);
  75. if (peer->getComponent() == component)
  76. return peer;
  77. }
  78. return 0;
  79. }
  80. bool ComponentPeer::isValidPeer (const ComponentPeer* const peer) throw()
  81. {
  82. return heavyweightPeers.contains (const_cast <ComponentPeer*> (peer));
  83. }
  84. void ComponentPeer::updateCurrentModifiers() throw()
  85. {
  86. ModifierKeys::updateCurrentModifiers();
  87. }
  88. //==============================================================================
  89. void ComponentPeer::handleMouseEnter (int x, int y, const int64 time)
  90. {
  91. jassert (component->isValidComponent());
  92. updateCurrentModifiers();
  93. Component* c = component->getComponentAt (x, y);
  94. const ComponentDeletionWatcher deletionChecker (component);
  95. if (c != Component::componentUnderMouse && Component::componentUnderMouse != 0)
  96. {
  97. jassert (Component::componentUnderMouse->isValidComponent());
  98. const int oldX = x;
  99. const int oldY = y;
  100. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  101. Component::componentUnderMouse->internalMouseExit (x, y, time);
  102. Component::componentUnderMouse = 0;
  103. if (deletionChecker.hasBeenDeleted())
  104. return;
  105. c = component->getComponentAt (oldX, oldY);
  106. }
  107. Component::componentUnderMouse = c;
  108. if (Component::componentUnderMouse != 0)
  109. {
  110. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  111. Component::componentUnderMouse->internalMouseEnter (x, y, time);
  112. }
  113. }
  114. void ComponentPeer::handleMouseMove (int x, int y, const int64 time)
  115. {
  116. jassert (component->isValidComponent());
  117. updateCurrentModifiers();
  118. fakeMouseMessageSent = false;
  119. const ComponentDeletionWatcher deletionChecker (component);
  120. Component* c = component->getComponentAt (x, y);
  121. if (c != Component::componentUnderMouse)
  122. {
  123. const int oldX = x;
  124. const int oldY = y;
  125. if (Component::componentUnderMouse != 0)
  126. {
  127. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  128. Component::componentUnderMouse->internalMouseExit (x, y, time);
  129. x = oldX;
  130. y = oldY;
  131. Component::componentUnderMouse = 0;
  132. if (deletionChecker.hasBeenDeleted())
  133. return; // if this window has just been deleted..
  134. c = component->getComponentAt (x, y);
  135. }
  136. Component::componentUnderMouse = c;
  137. if (c != 0)
  138. {
  139. component->relativePositionToOtherComponent (c, x, y);
  140. c->internalMouseEnter (x, y, time);
  141. x = oldX;
  142. y = oldY;
  143. if (deletionChecker.hasBeenDeleted())
  144. return; // if this window has just been deleted..
  145. }
  146. }
  147. if (Component::componentUnderMouse != 0)
  148. {
  149. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  150. Component::componentUnderMouse->internalMouseMove (x, y, time);
  151. }
  152. }
  153. void ComponentPeer::handleMouseDown (int x, int y, const int64 time)
  154. {
  155. ++juce_MouseClickCounter;
  156. updateCurrentModifiers();
  157. int numMouseButtonsDown = 0;
  158. if (ModifierKeys::getCurrentModifiers().isLeftButtonDown())
  159. ++numMouseButtonsDown;
  160. if (ModifierKeys::getCurrentModifiers().isRightButtonDown())
  161. ++numMouseButtonsDown;
  162. if (ModifierKeys::getCurrentModifiers().isMiddleButtonDown())
  163. ++numMouseButtonsDown;
  164. if (numMouseButtonsDown == 1)
  165. {
  166. Component::componentUnderMouse = component->getComponentAt (x, y);
  167. if (Component::componentUnderMouse != 0)
  168. {
  169. // can't set these in the mouseDownInt() method, because it's re-entrant, so do it here..
  170. for (int i = numElementsInArray (juce_recentMouseDownTimes); --i > 0;)
  171. {
  172. juce_recentMouseDownTimes [i] = juce_recentMouseDownTimes [i - 1];
  173. juce_recentMouseDownX [i] = juce_recentMouseDownX [i - 1];
  174. juce_recentMouseDownY [i] = juce_recentMouseDownY [i - 1];
  175. juce_recentMouseDownComponent [i] = juce_recentMouseDownComponent [i - 1];
  176. }
  177. juce_recentMouseDownTimes[0] = time;
  178. juce_recentMouseDownX[0] = x;
  179. juce_recentMouseDownY[0] = y;
  180. juce_recentMouseDownComponent[0] = Component::componentUnderMouse;
  181. relativePositionToGlobal (juce_recentMouseDownX[0], juce_recentMouseDownY[0]);
  182. juce_MouseHasMovedSignificantlySincePressed = false;
  183. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  184. Component::componentUnderMouse->internalMouseDown (x, y);
  185. }
  186. }
  187. }
  188. void ComponentPeer::handleMouseDrag (int x, int y, const int64 time)
  189. {
  190. updateCurrentModifiers();
  191. if (Component::componentUnderMouse != 0)
  192. {
  193. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  194. Component::componentUnderMouse->internalMouseDrag (x, y, time);
  195. }
  196. }
  197. void ComponentPeer::handleMouseUp (const int oldModifiers, int x, int y, const int64 time)
  198. {
  199. updateCurrentModifiers();
  200. int numMouseButtonsDown = 0;
  201. if ((oldModifiers & ModifierKeys::leftButtonModifier) != 0)
  202. ++numMouseButtonsDown;
  203. if ((oldModifiers & ModifierKeys::rightButtonModifier) != 0)
  204. ++numMouseButtonsDown;
  205. if ((oldModifiers & ModifierKeys::middleButtonModifier) != 0)
  206. ++numMouseButtonsDown;
  207. if (numMouseButtonsDown == 1)
  208. {
  209. const ComponentDeletionWatcher deletionChecker (component);
  210. Component* c = component->getComponentAt (x, y);
  211. if (c != Component::componentUnderMouse)
  212. {
  213. const int oldX = x;
  214. const int oldY = y;
  215. if (Component::componentUnderMouse != 0)
  216. {
  217. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  218. Component::componentUnderMouse->internalMouseUp (oldModifiers, x, y, time);
  219. x = oldX;
  220. y = oldY;
  221. if (Component::componentUnderMouse != 0)
  222. Component::componentUnderMouse->internalMouseExit (x, y, time);
  223. if (deletionChecker.hasBeenDeleted())
  224. return;
  225. c = component->getComponentAt (oldX, oldY);
  226. }
  227. Component::componentUnderMouse = c;
  228. if (Component::componentUnderMouse != 0)
  229. {
  230. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  231. Component::componentUnderMouse->internalMouseEnter (x, y, time);
  232. }
  233. }
  234. else
  235. {
  236. if (Component::componentUnderMouse != 0)
  237. {
  238. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  239. Component::componentUnderMouse->internalMouseUp (oldModifiers, x, y, time);
  240. }
  241. }
  242. }
  243. }
  244. void ComponentPeer::handleMouseExit (int x, int y, const int64 time)
  245. {
  246. jassert (component->isValidComponent());
  247. updateCurrentModifiers();
  248. if (Component::componentUnderMouse != 0)
  249. {
  250. component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
  251. Component::componentUnderMouse->internalMouseExit (x, y, time);
  252. Component::componentUnderMouse = 0;
  253. }
  254. }
  255. void ComponentPeer::handleMouseWheel (const int amountX, const int amountY, const int64 time)
  256. {
  257. updateCurrentModifiers();
  258. if (Component::componentUnderMouse != 0)
  259. Component::componentUnderMouse->internalMouseWheel (amountX, amountY, time);
  260. }
  261. void ComponentPeer::sendFakeMouseMove() throw()
  262. {
  263. if ((! fakeMouseMessageSent)
  264. && component->flags.hasHeavyweightPeerFlag
  265. && ! ModifierKeys::getCurrentModifiers().isAnyMouseButtonDown())
  266. {
  267. if (! isMinimised())
  268. {
  269. int realX, realY, realW, realH;
  270. getBounds (realX, realY, realW, realH);
  271. component->bounds_.setBounds (realX, realY, realW, realH);
  272. }
  273. int x, y;
  274. component->getMouseXYRelative (x, y);
  275. if (((unsigned int) x) < (unsigned int) component->getWidth()
  276. && ((unsigned int) y) < (unsigned int) component->getHeight()
  277. && contains (x, y, false))
  278. {
  279. postMessage (new Message (fakeMouseMoveMessage, x, y, 0));
  280. }
  281. fakeMouseMessageSent = true;
  282. }
  283. }
  284. void ComponentPeer::handleMessage (const Message& message)
  285. {
  286. if (message.intParameter1 == fakeMouseMoveMessage)
  287. {
  288. if (! ModifierKeys::getCurrentModifiers().isAnyMouseButtonDown())
  289. handleMouseMove (message.intParameter2,
  290. message.intParameter3,
  291. Time::currentTimeMillis());
  292. }
  293. }
  294. //==============================================================================
  295. void ComponentPeer::handlePaint (LowLevelGraphicsContext& contextToPaintTo)
  296. {
  297. Graphics g (&contextToPaintTo);
  298. #if JUCE_ENABLE_REPAINT_DEBUGGING
  299. g.saveState();
  300. #endif
  301. JUCE_TRY
  302. {
  303. component->paintEntireComponent (g);
  304. }
  305. JUCE_CATCH_EXCEPTION
  306. #if JUCE_ENABLE_REPAINT_DEBUGGING
  307. // enabling this code will fill all areas that get repainted with a colour overlay, to show
  308. // clearly when things are being repainted.
  309. {
  310. g.restoreState();
  311. g.fillAll (Colour ((uint8) Random::getSystemRandom().nextInt (255),
  312. (uint8) Random::getSystemRandom().nextInt (255),
  313. (uint8) Random::getSystemRandom().nextInt (255),
  314. (uint8) 0x50));
  315. }
  316. #endif
  317. }
  318. bool ComponentPeer::handleKeyPress (const int keyCode,
  319. const juce_wchar textCharacter)
  320. {
  321. updateCurrentModifiers();
  322. Component* target = Component::currentlyFocusedComponent->isValidComponent()
  323. ? Component::currentlyFocusedComponent
  324. : component;
  325. if (target->isCurrentlyBlockedByAnotherModalComponent())
  326. {
  327. Component* const currentModalComp = Component::getCurrentlyModalComponent();
  328. if (currentModalComp != 0)
  329. target = currentModalComp;
  330. }
  331. const KeyPress keyInfo (keyCode,
  332. ModifierKeys::getCurrentModifiers().getRawFlags()
  333. & ModifierKeys::allKeyboardModifiers,
  334. textCharacter);
  335. bool keyWasUsed = false;
  336. while (target != 0)
  337. {
  338. const ComponentDeletionWatcher deletionChecker (target);
  339. if (target->keyListeners_ != 0)
  340. {
  341. for (int i = target->keyListeners_->size(); --i >= 0;)
  342. {
  343. keyWasUsed = ((KeyListener*) target->keyListeners_->getUnchecked(i))->keyPressed (keyInfo, target);
  344. if (keyWasUsed || deletionChecker.hasBeenDeleted())
  345. return keyWasUsed;
  346. i = jmin (i, target->keyListeners_->size());
  347. }
  348. }
  349. keyWasUsed = target->keyPressed (keyInfo);
  350. if (keyWasUsed || deletionChecker.hasBeenDeleted())
  351. break;
  352. if (keyInfo.isKeyCode (KeyPress::tabKey) && Component::getCurrentlyFocusedComponent() != 0)
  353. {
  354. Component* const currentlyFocused = Component::getCurrentlyFocusedComponent();
  355. currentlyFocused->moveKeyboardFocusToSibling (! keyInfo.getModifiers().isShiftDown());
  356. keyWasUsed = (currentlyFocused != Component::getCurrentlyFocusedComponent());
  357. break;
  358. }
  359. target = target->parentComponent_;
  360. }
  361. return keyWasUsed;
  362. }
  363. bool ComponentPeer::handleKeyUpOrDown (const bool isKeyDown)
  364. {
  365. updateCurrentModifiers();
  366. Component* target = Component::currentlyFocusedComponent->isValidComponent()
  367. ? Component::currentlyFocusedComponent
  368. : component;
  369. if (target->isCurrentlyBlockedByAnotherModalComponent())
  370. {
  371. Component* const currentModalComp = Component::getCurrentlyModalComponent();
  372. if (currentModalComp != 0)
  373. target = currentModalComp;
  374. }
  375. bool keyWasUsed = false;
  376. while (target != 0)
  377. {
  378. const ComponentDeletionWatcher deletionChecker (target);
  379. keyWasUsed = target->keyStateChanged (isKeyDown);
  380. if (keyWasUsed || deletionChecker.hasBeenDeleted())
  381. break;
  382. if (target->keyListeners_ != 0)
  383. {
  384. for (int i = target->keyListeners_->size(); --i >= 0;)
  385. {
  386. keyWasUsed = ((KeyListener*) target->keyListeners_->getUnchecked(i))->keyStateChanged (isKeyDown, target);
  387. if (keyWasUsed || deletionChecker.hasBeenDeleted())
  388. return keyWasUsed;
  389. i = jmin (i, target->keyListeners_->size());
  390. }
  391. }
  392. target = target->parentComponent_;
  393. }
  394. return keyWasUsed;
  395. }
  396. void ComponentPeer::handleModifierKeysChange()
  397. {
  398. updateCurrentModifiers();
  399. Component* target = Component::getComponentUnderMouse();
  400. if (target == 0)
  401. target = Component::getCurrentlyFocusedComponent();
  402. if (target == 0)
  403. target = component;
  404. if (target->isValidComponent())
  405. target->internalModifierKeysChanged();
  406. }
  407. //==============================================================================
  408. void ComponentPeer::handleBroughtToFront()
  409. {
  410. updateCurrentModifiers();
  411. if (component != 0)
  412. component->internalBroughtToFront();
  413. }
  414. void ComponentPeer::setConstrainer (ComponentBoundsConstrainer* const newConstrainer) throw()
  415. {
  416. constrainer = newConstrainer;
  417. }
  418. void ComponentPeer::handleMovedOrResized()
  419. {
  420. jassert (component->isValidComponent());
  421. updateCurrentModifiers();
  422. const bool nowMinimised = isMinimised();
  423. if (component->flags.hasHeavyweightPeerFlag && ! nowMinimised)
  424. {
  425. const ComponentDeletionWatcher deletionChecker (component);
  426. int realX, realY, realW, realH;
  427. getBounds (realX, realY, realW, realH);
  428. const bool wasMoved = (component->getX() != realX || component->getY() != realY);
  429. const bool wasResized = (component->getWidth() != realW || component->getHeight() != realH);
  430. if (wasMoved || wasResized)
  431. {
  432. component->bounds_.setBounds (realX, realY, realW, realH);
  433. if (wasResized)
  434. component->repaint();
  435. component->sendMovedResizedMessages (wasMoved, wasResized);
  436. if (deletionChecker.hasBeenDeleted())
  437. return;
  438. }
  439. }
  440. if (isWindowMinimised != nowMinimised)
  441. {
  442. isWindowMinimised = nowMinimised;
  443. component->minimisationStateChanged (nowMinimised);
  444. component->sendVisibilityChangeMessage();
  445. }
  446. if (! isFullScreen())
  447. lastNonFullscreenBounds = component->getBounds();
  448. }
  449. void ComponentPeer::handleFocusGain()
  450. {
  451. updateCurrentModifiers();
  452. if (component->isParentOf (lastFocusedComponent))
  453. {
  454. Component::currentlyFocusedComponent = lastFocusedComponent;
  455. Desktop::getInstance().triggerFocusCallback();
  456. lastFocusedComponent->internalFocusGain (Component::focusChangedDirectly);
  457. }
  458. else
  459. {
  460. if (! component->isCurrentlyBlockedByAnotherModalComponent())
  461. component->grabKeyboardFocus();
  462. else
  463. Component::bringModalComponentToFront();
  464. }
  465. }
  466. void ComponentPeer::handleFocusLoss()
  467. {
  468. updateCurrentModifiers();
  469. if (component->hasKeyboardFocus (true))
  470. {
  471. lastFocusedComponent = Component::currentlyFocusedComponent;
  472. if (lastFocusedComponent != 0)
  473. {
  474. Component::currentlyFocusedComponent = 0;
  475. Desktop::getInstance().triggerFocusCallback();
  476. lastFocusedComponent->internalFocusLoss (Component::focusChangedByMouseClick);
  477. }
  478. }
  479. }
  480. Component* ComponentPeer::getLastFocusedSubcomponent() const throw()
  481. {
  482. return (component->isParentOf (lastFocusedComponent) && lastFocusedComponent->isShowing())
  483. ? lastFocusedComponent
  484. : component;
  485. }
  486. void ComponentPeer::handleScreenSizeChange()
  487. {
  488. updateCurrentModifiers();
  489. component->parentSizeChanged();
  490. handleMovedOrResized();
  491. }
  492. void ComponentPeer::setNonFullScreenBounds (const Rectangle& newBounds) throw()
  493. {
  494. lastNonFullscreenBounds = newBounds;
  495. }
  496. const Rectangle& ComponentPeer::getNonFullScreenBounds() const throw()
  497. {
  498. return lastNonFullscreenBounds;
  499. }
  500. //==============================================================================
  501. static FileDragAndDropTarget* findDragAndDropTarget (Component* c,
  502. const StringArray& files,
  503. FileDragAndDropTarget* const lastOne)
  504. {
  505. while (c != 0)
  506. {
  507. FileDragAndDropTarget* const t = dynamic_cast <FileDragAndDropTarget*> (c);
  508. if (t != 0 && (t == lastOne || t->isInterestedInFileDrag (files)))
  509. return t;
  510. c = c->getParentComponent();
  511. }
  512. return 0;
  513. }
  514. void ComponentPeer::handleFileDragMove (const StringArray& files, int x, int y)
  515. {
  516. updateCurrentModifiers();
  517. FileDragAndDropTarget* lastTarget = 0;
  518. if (dragAndDropTargetComponent != 0 && ! dragAndDropTargetComponent->hasBeenDeleted())
  519. lastTarget = const_cast <FileDragAndDropTarget*> (dynamic_cast <const FileDragAndDropTarget*> (dragAndDropTargetComponent->getComponent()));
  520. FileDragAndDropTarget* newTarget = 0;
  521. Component* const compUnderMouse = component->getComponentAt (x, y);
  522. if (compUnderMouse != lastDragAndDropCompUnderMouse)
  523. {
  524. lastDragAndDropCompUnderMouse = compUnderMouse;
  525. newTarget = findDragAndDropTarget (compUnderMouse, files, lastTarget);
  526. if (newTarget != lastTarget)
  527. {
  528. if (lastTarget != 0)
  529. lastTarget->fileDragExit (files);
  530. dragAndDropTargetComponent = 0;
  531. if (newTarget != 0)
  532. {
  533. Component* const targetComp = dynamic_cast <Component*> (newTarget);
  534. int mx = x, my = y;
  535. component->relativePositionToOtherComponent (targetComp, mx, my);
  536. dragAndDropTargetComponent = new ComponentDeletionWatcher (dynamic_cast <Component*> (newTarget));
  537. newTarget->fileDragEnter (files, mx, my);
  538. }
  539. }
  540. }
  541. else
  542. {
  543. newTarget = lastTarget;
  544. }
  545. if (newTarget != 0)
  546. {
  547. Component* const targetComp = dynamic_cast <Component*> (newTarget);
  548. component->relativePositionToOtherComponent (targetComp, x, y);
  549. newTarget->fileDragMove (files, x, y);
  550. }
  551. }
  552. void ComponentPeer::handleFileDragExit (const StringArray& files)
  553. {
  554. handleFileDragMove (files, -1, -1);
  555. jassert (dragAndDropTargetComponent == 0);
  556. lastDragAndDropCompUnderMouse = 0;
  557. }
  558. void ComponentPeer::handleFileDragDrop (const StringArray& files, int x, int y)
  559. {
  560. handleFileDragMove (files, x, y);
  561. if (dragAndDropTargetComponent != 0 && ! dragAndDropTargetComponent->hasBeenDeleted())
  562. {
  563. FileDragAndDropTarget* const target = const_cast <FileDragAndDropTarget*> (dynamic_cast <const FileDragAndDropTarget*> (dragAndDropTargetComponent->getComponent()));
  564. dragAndDropTargetComponent = 0;
  565. lastDragAndDropCompUnderMouse = 0;
  566. if (target != 0)
  567. {
  568. Component* const targetComp = dynamic_cast <Component*> (target);
  569. if (targetComp->isCurrentlyBlockedByAnotherModalComponent())
  570. {
  571. targetComp->internalModalInputAttempt();
  572. if (targetComp->isCurrentlyBlockedByAnotherModalComponent())
  573. return;
  574. }
  575. component->relativePositionToOtherComponent (targetComp, x, y);
  576. target->filesDropped (files, x, y);
  577. }
  578. }
  579. }
  580. //==============================================================================
  581. void ComponentPeer::handleUserClosingWindow()
  582. {
  583. updateCurrentModifiers();
  584. component->userTriedToCloseWindow();
  585. }
  586. //==============================================================================
  587. void ComponentPeer::bringModalComponentToFront()
  588. {
  589. Component::bringModalComponentToFront();
  590. }
  591. //==============================================================================
  592. void ComponentPeer::clearMaskedRegion() throw()
  593. {
  594. maskedRegion.clear();
  595. }
  596. void ComponentPeer::addMaskedRegion (int x, int y, int w, int h) throw()
  597. {
  598. maskedRegion.add (x, y, w, h);
  599. }
  600. //==============================================================================
  601. const StringArray ComponentPeer::getAvailableRenderingEngines() throw()
  602. {
  603. StringArray s;
  604. s.add ("Software Renderer");
  605. return s;
  606. }
  607. int ComponentPeer::getCurrentRenderingEngine() throw()
  608. {
  609. return 0;
  610. }
  611. void ComponentPeer::setCurrentRenderingEngine (int /*index*/) throw()
  612. {
  613. }
  614. END_JUCE_NAMESPACE