Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. import React from 'react';
  2. import { editor } from 'monaco-editor';
  3. import IMouseTarget = editor.IMouseTarget;
  4. import IStandaloneCodeEditor = editor.IStandaloneCodeEditor;
  5. import IContentWidget = editor.IContentWidget;
  6.  
  7. const { ContentWidgetPositionPreference } = editor;
  8.  
  9. export type TDropHandler = (e: React.DragEvent, target: IMouseTarget, instance: IStandaloneCodeEditor) => void;
  10. export type TInstanceGetter = () => IStandaloneCodeEditor;
  11.  
  12. export class MonacoDragNDropProvider {
  13. onDrop = (e: React.DragEvent<HTMLDivElement>) => {
  14. this.onDropHandler && this.onDropHandler(e, this.dragTarget, this.getInstance());
  15. this.removeMouseDownWidget();
  16. };
  17.  
  18. onDragOver = (e: React.DragEvent<HTMLDivElement>) => {
  19. const instance = this.getInstance();
  20. instance && this.displayMouseDropPosition(instance, instance.getTargetAtClientPoint(e.clientX, e.clientY));
  21. e.preventDefault();
  22. };
  23.  
  24. removeMouseDownWidget = () => {
  25. const instance = this.getInstance();
  26. if (instance && this.mouseDropWidget && this.domNode) {
  27. instance.removeContentWidget(this.mouseDropWidget);
  28. this.mouseDropWidget = null;
  29. }
  30. };
  31.  
  32. props: React.HTMLAttributes<HTMLDivElement> = {
  33. onDragOver: this.onDragOver,
  34. onDropCapture: this.onDrop,
  35. onDragLeaveCapture: this.removeMouseDownWidget
  36. };
  37.  
  38. domNode: HTMLDivElement = null;
  39. mouseDropWidget: IContentWidget = null;
  40. dragTarget: IMouseTarget;
  41.  
  42. buildMouseDropWidget = () => {
  43. if (!this.domNode) {
  44. this.domNode = document.createElement('div');
  45. this.domNode.className = this.dropClassName;
  46. this.domNode.style.pointerEvents = 'none';
  47. this.domNode.style.borderLeft = '2px solid #ccc';
  48. this.domNode.innerHTML = '&nbsp;';
  49. }
  50. return {
  51. getId: () => 'drag',
  52. getDomNode: () => this.domNode,
  53. getPosition: () => ({
  54. position: this.dragTarget.position,
  55. preference: [ContentWidgetPositionPreference.EXACT, ContentWidgetPositionPreference.EXACT]
  56. })
  57. };
  58. };
  59.  
  60. displayMouseDropPosition = (instance: IStandaloneCodeEditor, target: IMouseTarget) => {
  61. this.dragTarget = target;
  62. if (this.mouseDropWidget) {
  63. instance.layoutContentWidget(this.mouseDropWidget);
  64. } else {
  65. this.mouseDropWidget = this.buildMouseDropWidget();
  66. instance.addContentWidget(this.mouseDropWidget);
  67. }
  68. };
  69.  
  70. getInstance: TInstanceGetter;
  71. dropClassName: string;
  72. onDropHandler: TDropHandler;
  73. constructor(onDrop: TDropHandler, getInstance: TInstanceGetter, dropClassName: string = 'drop') {
  74. this.dropClassName = dropClassName;
  75. this.onDropHandler = onDrop;
  76. this.getInstance = getInstance;
  77. }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement