Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
TableTool.js 10.54 KiB
/* eslint-disable react/prop-types */

// import cx from 'classnames';
import React, { useState } from 'react';
// import ReactDOM from 'react-dom';
import styled from 'styled-components';

// import clamp from './clamp';
// import htmlElementToRect from './htmlElementToRect';
// import { fromHTMlElement, fromXY, isIntersected } from './rects';

// import './czi-table-grid-size-editor.css';

// export type TableGridSizeEditorValue = {
//   cols: number,
//   rows: number,
// };

const GUTTER_SIZE = 5;
const CELL_SIZE = 16;
const MAX_SIZE = 20;

// class GridCell extends React.PureComponent<any, any, any> {
//   render(): React.Element<any> {
//     const { x, y, selected } = this.props;
//     const style = {
//       left: x + 'px',
//       top: y + 'px',
//       width: CELL_SIZE + 'px',
//       height: CELL_SIZE + 'px',
//     };
//     const className = cx('czi-table-grid-size-editor-cell', {
//       selected,
//     });
//     return <div className={className} style={style} />;
//   }
// }

const StyledGridCell = styled.div`
  left: ${props => `${props.x}px`};
  top: ${props => `${props.y}px`};
  width: ${props => `${CELL_SIZE}px`};
  height: ${props => `${CELL_SIZE}px`};
`;

const GridCell = props => {
  const { className, x, y, selected } = props;

  // const className = cx('czi-table-grid-size-editor-cell', {
  //   selected,
  // });

  return <StyledGridCell x={x} y={y} className={className} />;
};

// class TableGridSizeEditor extends React.PureComponent<any, any, any> {
//   _ex = 0;
//   _ey = 0;
//   _mx = 0;
//   _my = 0;
//   _rafID = 0;
//   _ref = null;
//   _entered = false;

//   props: {
//     close: (val: TableGridSizeEditorValue) => void,
//   };

//   state: TableGridSizeEditorValue = {
//     rows: 1,
//     cols: 1,
//   };

//   componentWillUnmount(): void {
//     if (this._entered) {
//       document.removeEventListener('mousemove', this._onMouseMove, true);
//     }
//     this._rafID && cancelAnimationFrame(this._rafID);
//   }

//   render(): React.Element<any> {
//     const { rows, cols } = this.state;
//     let rr = Math.max(5, rows);
//     let cc = Math.max(5, cols);
//     if (rr === rows) {
//       rr = Math.min(MAX_SIZE, rr + 1);
//     }
//     if (cc === cols) {
//       cc = Math.min(MAX_SIZE, cc + 1);
//     }
//     const cells = [];
//     let ii = 0;
//     let y = 0;
//     let w = 0;
//     let h = 0;
//     while (ii < rr) {
//       y += GUTTER_SIZE;
//       let jj = 0;
//       let x = 0;
//       while (jj < cc) {
//         x += GUTTER_SIZE;
//         const selected = ii < rows && jj < cols;
//         cells.push(
//           <GridCell
//             key={`${String(ii)}-${String(jj)}`}
//             selected={selected}
//             x={x}
//             y={y}
//           />,
//         );
//         x += CELL_SIZE;
//         w = x + GUTTER_SIZE;
//         jj++;
//       }
//       y += CELL_SIZE;
//       h = y + GUTTER_SIZE;
//       ii++;
//     }
//     const bodyStyle = { width: w + 'px', height: h + 'px' };

//     return (
//       <div className="czi-table-grid-size-editor" ref={this._onRef}>
//         <div
//           className="czi-table-grid-size-editor-body"
//           onMouseDown={this._onMouseDown}
//           onMouseEnter={this._onMouseEnter}
//           style={bodyStyle}
//         >
//           {cells}
//         </div>
//         <div className="czi-table-grid-size-editor-footer">
//           {rows} X {cols}
//         </div>
//       </div>
//     );
//   }

//   _onRef = (ref: any): void => {
//     this._ref = ref;
//   };

//   _onMouseEnter = (e: MouseEvent): void => {
//     const node = e.currentTarget;
//     if (node instanceof HTMLElement) {
//       const rect = fromHTMlElement(node);
//       const mx = Math.round(e.clientX);
//       const my = Math.round(e.clientY);
//       this._ex = rect.x;
//       this._ey = rect.y;
//       this._mx = mx;
//       this._my = my;
//       if (!this._entered) {
//         this._entered = true;
//         document.addEventListener('mousemove', this._onMouseMove, true);
//       }
//     }
//   };

//   _onMouseMove = (e: MouseEvent): void => {
//     const el = this._ref && ReactDOM.findDOMNode(this._ref);
//     const elRect = el ? htmlElementToRect(el) : null;
//     const mouseRect = fromXY(e.screenX, e.screenY, 10);

//     if (elRect && mouseRect && isIntersected(elRect, mouseRect, 50)) {
//       // This prevents `PopUpManager` from collapsing the editor.
//       e.preventDefault();
//       e.stopImmediatePropagation();
//     }

//     const mx = Math.round(e.clientX);
//     const my = Math.round(e.clientY);
//     if (mx !== this._mx || my !== this._my) {
//       this._mx = mx;
//       this._my = my;
//       this._rafID && cancelAnimationFrame(this._rafID);
//       this._rafID = requestAnimationFrame(this._updateGridSize);
//     }
//   };

//   _updateGridSize = (): void => {
//     this._rafID = 0;
//     const mx = this._mx;
//     const my = this._my;
//     const x = mx - this._ex;
//     const y = my - this._ey;
//     const rr = clamp(1, Math.ceil(y / (CELL_SIZE + GUTTER_SIZE)), MAX_SIZE);
//     const cc = clamp(1, Math.ceil(x / (CELL_SIZE + GUTTER_SIZE)), MAX_SIZE);
//     const { rows, cols } = this.state;
//     if (rows !== rr || cols !== cc) {
//       this.setState({ rows: rr, cols: cc });
//     }
//   };

//   _onMouseDown = (e: SyntheticEvent): void => {
//     e.preventDefault();
//     this.props.close(this.state);
//   };
// }

const TableGridSizeEditor = props => {
  const [rows, setRows] = useState(1);
  const [columns, setColumns] = useState(1);

  let rr = Math.max(5, rows);
  let cc = Math.max(5, columns);
  if (rr === rows) {
    rr = Math.min(MAX_SIZE, rr + 1);
  }
  if (cc === columns) {
    cc = Math.min(MAX_SIZE, cc + 1);
  }
  const cells = [];
  let ii = 0;
  let y = 0;
  let w = 0;
  let h = 0;
  while (ii < rr) {
    y += GUTTER_SIZE;
    let jj = 0;
    let x = 0;
    while (jj < cc) {
      x += GUTTER_SIZE;
      const selected = ii < rows && jj < columns;
      cells.push(
        <GridCell
          key={`${String(ii)}-${String(jj)}`}
          selected={selected}
          x={x}
          y={y}
        />,
      );
      x += CELL_SIZE;
      w = x + GUTTER_SIZE;
      jj++;
    }
    y += CELL_SIZE;
    h = y + GUTTER_SIZE;
    ii++;
  }
  const bodyStyle = { width: w + 'px', height: h + 'px' };

  return (
    <div
    // className="czi-table-grid-size-editor"
    // ref={this._onRef}
    >
      <div
      // className="czi-table-grid-size-editor-body"
      // onMouseDown={this._onMouseDown}
      // onMouseEnter={this._onMouseEnter}
      // style={bodyStyle}
      >
        {cells}
      </div>
      <div className="czi-table-grid-size-editor-footer">
        {rows} X {columns}
      </div>
    </div>
  );

  // _ex = 0;
  // _ey = 0;
  // _mx = 0;
  // _my = 0;
  // _rafID = 0;
  // _ref = null;
  // _entered = false;

  // props: {
  //   close: (val: TableGridSizeEditorValue) => void,
  // };

  // componentWillUnmount(): void {
  //   if (this._entered) {
  //     document.removeEventListener('mousemove', this._onMouseMove, true);
  //   }
  //   this._rafID && cancelAnimationFrame(this._rafID);
  // }

  // render(): React.Element<any> {
  //   const { rows, cols } = this.state;
  //   let rr = Math.max(5, rows);
  //   let cc = Math.max(5, cols);
  //   if (rr === rows) {
  //     rr = Math.min(MAX_SIZE, rr + 1);
  //   }
  //   if (cc === cols) {
  //     cc = Math.min(MAX_SIZE, cc + 1);
  //   }
  //   const cells = [];
  //   let ii = 0;
  //   let y = 0;
  //   let w = 0;
  //   let h = 0;
  //   while (ii < rr) {
  //     y += GUTTER_SIZE;
  //     let jj = 0;
  //     let x = 0;
  //     while (jj < cc) {
  //       x += GUTTER_SIZE;
  //       const selected = ii < rows && jj < cols;
  //       cells.push(
  //         <GridCell
  //           key={`${String(ii)}-${String(jj)}`}
  //           selected={selected}
  //           x={x}
  //           y={y}
  //         />,
  //       );
  //       x += CELL_SIZE;
  //       w = x + GUTTER_SIZE;
  //       jj++;
  //     }
  //     y += CELL_SIZE;
  //     h = y + GUTTER_SIZE;
  //     ii++;
  //   }
  //   const bodyStyle = { width: w + 'px', height: h + 'px' };

  //   return (
  //     <div className="czi-table-grid-size-editor" ref={this._onRef}>
  //       <div
  //         className="czi-table-grid-size-editor-body"
  //         onMouseDown={this._onMouseDown}
  //         onMouseEnter={this._onMouseEnter}
  //         style={bodyStyle}
  //       >
  //         {cells}
  //       </div>
  //       <div className="czi-table-grid-size-editor-footer">
  //         {rows} X {cols}
  //       </div>
  //     </div>
  //   );
  // }

  // _onRef = (ref: any): void => {
  //   this._ref = ref;
  // };

  // _onMouseEnter = (e: MouseEvent): void => {
  //   const node = e.currentTarget;
  //   if (node instanceof HTMLElement) {
  //     const rect = fromHTMlElement(node);
  //     const mx = Math.round(e.clientX);
  //     const my = Math.round(e.clientY);
  //     this._ex = rect.x;
  //     this._ey = rect.y;
  //     this._mx = mx;
  //     this._my = my;
  //     if (!this._entered) {
  //       this._entered = true;
  //       document.addEventListener('mousemove', this._onMouseMove, true);
  //     }
  //   }
  // };

  // _onMouseMove = (e: MouseEvent): void => {
  //   const el = this._ref && ReactDOM.findDOMNode(this._ref);
  //   const elRect = el ? htmlElementToRect(el) : null;
  //   const mouseRect = fromXY(e.screenX, e.screenY, 10);

  //   if (elRect && mouseRect && isIntersected(elRect, mouseRect, 50)) {
  //     // This prevents `PopUpManager` from collapsing the editor.
  //     e.preventDefault();
  //     e.stopImmediatePropagation();
  //   }

  //   const mx = Math.round(e.clientX);
  //   const my = Math.round(e.clientY);
  //   if (mx !== this._mx || my !== this._my) {
  //     this._mx = mx;
  //     this._my = my;
  //     this._rafID && cancelAnimationFrame(this._rafID);
  //     this._rafID = requestAnimationFrame(this._updateGridSize);
  //   }
  // };

  // _updateGridSize = (): void => {
  //   this._rafID = 0;
  //   const mx = this._mx;
  //   const my = this._my;
  //   const x = mx - this._ex;
  //   const y = my - this._ey;
  //   const rr = clamp(1, Math.ceil(y / (CELL_SIZE + GUTTER_SIZE)), MAX_SIZE);
  //   const cc = clamp(1, Math.ceil(x / (CELL_SIZE + GUTTER_SIZE)), MAX_SIZE);
  //   const { rows, cols } = this.state;
  //   if (rows !== rr || cols !== cc) {
  //     this.setState({ rows: rr, cols: cc });
  //   }
  // };

  // _onMouseDown = (e: SyntheticEvent): void => {
  //   e.preventDefault();
  //   this.props.close(this.state);
  // };
};

export default TableGridSizeEditor;