public void mousePressed(MouseEvent e) {
   if (m_positionMotionListener == null) return;
   m_draggedFrom = getSquareForEvent(e);
   if (m_positionMotionListener.allowDrag(m_position, m_draggedFrom)) {
     m_draggedStone = m_position.getStone(m_draggedFrom);
     m_draggedX = e.getX();
     m_draggedY = e.getY();
     m_draggedPartnerSqi = m_positionMotionListener.getPartnerSqi(m_position, m_draggedFrom);
     // TODO mark m_draggedPartnerSqi
     repaint();
   } else {
     m_positionMotionListener.squareClicked(m_position, m_draggedFrom, e);
     m_draggedFrom = Chess.NO_SQUARE;
   }
 }
 public void mouseReleased(MouseEvent e) {
   if (m_positionMotionListener == null) return;
   if (m_draggedFrom != Chess.NO_SQUARE) {
     int draggedTo = getSquareForEvent(e);
     if (draggedTo != Chess.NO_SQUARE) {
       if (m_draggedFrom == draggedTo) {
         if (m_draggedPartnerSqi != Chess.NO_SQUARE) {
           m_positionMotionListener.dragged(m_position, m_draggedFrom, m_draggedPartnerSqi, e);
         } else {
           m_positionMotionListener.squareClicked(m_position, m_draggedFrom, e);
         }
       } else {
         m_positionMotionListener.dragged(m_position, m_draggedFrom, draggedTo, e);
       }
     }
     m_draggedFrom = Chess.NO_SQUARE;
     m_draggedStone = Chess.NO_STONE;
     // TODO unmark m_draggedPartnerSqi
     repaint();
   }
 }