DocumentServer/OfficeWeb/sdk/Common/Drawings/DrawingObjectsHandlers.js
2015-04-28 17:59:00 +03:00

529 lines
26 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2015
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
function CheckCoordsNeedPage(x, y, pageIndex, needPageIndex, drawingDocument) {
if (pageIndex === needPageIndex) {
return {
x: x,
y: y
};
} else {
var t = drawingDocument.ConvertCoordsToAnotherPage(x, y, pageIndex, needPageIndex);
return {
x: t.X,
y: t.Y
};
}
}
function handleSelectedObjects(drawingObjectsController, e, x, y, group, pageIndex, bWord) {
var selected_objects = group ? group.selectedObjects : drawingObjectsController.getSelectedObjects();
var tx, ty, t;
if (selected_objects.length === 1) {
if (bWord && pageIndex !== selected_objects[0].selectStartPage) {
t = drawingObjectsController.drawingDocument.ConvertCoordsToAnotherPage(x, y, pageIndex, selected_objects[0].selectStartPage);
tx = t.X;
ty = t.Y;
} else {
tx = x;
ty = y;
}
var hit_to_adj = selected_objects[0].hitToAdjustment(tx, ty);
if (hit_to_adj.hit) {
return drawingObjectsController.handleAdjustmentHit(hit_to_adj, selected_objects[0], group, pageIndex);
}
}
for (var i = selected_objects.length - 1; i > -1; --i) {
if (bWord && pageIndex !== selected_objects[i].selectStartPage) {
t = drawingObjectsController.drawingDocument.ConvertCoordsToAnotherPage(x, y, pageIndex, selected_objects[i].selectStartPage);
tx = t.X;
ty = t.Y;
} else {
tx = x;
ty = y;
}
var hit_to_handles = selected_objects[i].hitToHandles(tx, ty);
if (hit_to_handles > -1) {
return drawingObjectsController.handleHandleHit(hit_to_handles, selected_objects[i], group);
}
}
for (i = selected_objects.length - 1; i > -1; --i) {
if (bWord && pageIndex !== selected_objects[i].selectStartPage) {
t = drawingObjectsController.drawingDocument.ConvertCoordsToAnotherPage(x, y, pageIndex, selected_objects[i].selectStartPage);
tx = t.X;
ty = t.Y;
} else {
tx = x;
ty = y;
}
if (selected_objects[i].hitInBoundingRect(x, y) && (!selected_objects[i].hitInTextRect || !selected_objects[i].hitInTextRect(x, y))) {
if (bWord && selected_objects[i].parent && selected_objects[i].parent.Is_Inline()) {
return handleInlineHitNoText(selected_objects[i], drawingObjectsController, e, x, y, pageIndex);
} else {
return drawingObjectsController.handleMoveHit(selected_objects[i], e, x, y, group, true, selected_objects[i].selectStartPage, true);
}
}
}
return false;
}
function handleFloatObjects(drawingObjectsController, drawingArr, e, x, y, group, pageIndex, bWord) {
var ret = null,
drawing;
for (var i = drawingArr.length - 1; i > -1; --i) {
drawing = drawingArr[i];
switch (drawing.getObjectType()) {
case historyitem_type_Shape:
case historyitem_type_ImageShape:
ret = handleShapeImage(drawing, drawingObjectsController, e, x, y, group, pageIndex, bWord);
if (ret) {
return ret;
}
break;
case historyitem_type_ChartSpace:
ret = handleChart(drawing, drawingObjectsController, e, x, y, group, pageIndex, bWord);
if (ret) {
return ret;
}
break;
case historyitem_type_GroupShape:
ret = handleGroup(drawing, drawingObjectsController, e, x, y, group, pageIndex, bWord);
if (ret) {
return ret;
}
break;
case historyitem_type_GraphicFrame:
ret = handleFloatTable(drawing, drawingObjectsController, e, x, y, group, pageIndex);
if (ret) {
return ret;
}
break;
}
}
return ret;
}
function handleShapeImage(drawing, drawingObjectsController, e, x, y, group, pageIndex, bWord) {
var hit_in_inner_area = drawing.hitInInnerArea(x, y);
var hit_in_path = drawing.hitInPath(x, y);
var hit_in_text_rect = drawing.hitInTextRect(x, y);
if (!hit_in_text_rect && (hit_in_inner_area || hit_in_path)) {
return drawingObjectsController.handleMoveHit(drawing, e, x, y, group, false, pageIndex, bWord);
} else {
if (hit_in_text_rect) {
if (bWord) {
var all_drawings = drawing.getDocContent().Get_AllDrawingObjects();
var drawings2 = [];
for (var i = 0; i < all_drawings.length; ++i) {
drawings2.push(all_drawings[i].GraphicObj);
}
var ret = handleInlineObjects(drawingObjectsController, drawings2, e, x, y, pageIndex, bWord);
if (ret) {
return ret;
}
}
return drawingObjectsController.handleTextHit(drawing, e, x, y, group, pageIndex, bWord);
}
}
return false;
}
function handleShapeImageInGroup(drawingObjectsController, drawing, shape, e, x, y, pageIndex, bWord) {
var hit_in_inner_area = shape.hitInInnerArea && shape.hitInInnerArea(x, y);
var hit_in_path = shape.hitInPath && shape.hitInPath(x, y);
var hit_in_text_rect = shape.hitInTextRect && shape.hitInTextRect(x, y);
var ret;
if (!hit_in_text_rect && (hit_in_inner_area || hit_in_path)) {
return drawingObjectsController.handleMoveHit(drawing, e, x, y, null, false, pageIndex, true);
} else {
if (hit_in_text_rect) {
var all_drawings = shape.getDocContent().Get_AllDrawingObjects();
var drawings2 = [];
for (var i = 0; i < all_drawings.length; ++i) {
drawings2.push(all_drawings[i].GraphicObj);
}
ret = handleInlineObjects(drawingObjectsController, drawings2, e, x, y, pageIndex, true);
if (ret) {
return ret;
}
return drawingObjectsController.handleTextHit(shape, e, x, y, drawing, pageIndex, bWord);
}
}
}
function handleGroup(drawing, drawingObjectsController, e, x, y, group, pageIndex, bWord) {
var grouped_objects = drawing.getArrGraphicObjects();
var ret;
for (var j = grouped_objects.length - 1; j > -1; --j) {
var cur_grouped_object = grouped_objects[j];
switch (cur_grouped_object.getObjectType()) {
case historyitem_type_Shape:
case historyitem_type_ImageShape:
ret = handleShapeImageInGroup(drawingObjectsController, drawing, cur_grouped_object, e, x, y, pageIndex, bWord);
if (ret) {
return ret;
}
break;
case historyitem_type_ChartSpace:
var ret, i, title;
if (cur_grouped_object.hit(x, y)) {
var chart_titles = cur_grouped_object.getAllTitles();
for (i = 0; i < chart_titles.length; ++i) {
title = chart_titles[i];
var hit_in_inner_area = title.hitInInnerArea(x, y);
var hit_in_path = title.hitInPath(x, y);
var hit_in_text_rect = title.hitInTextRect(x, y);
if (hit_in_inner_area && !hit_in_text_rect || hit_in_path) {
if (drawingObjectsController.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
drawingObjectsController.checkChartTextSelection();
drawingObjectsController.resetSelection();
drawingObjectsController.selectObject(drawing, pageIndex);
drawingObjectsController.selection.groupSelection = drawing;
drawing.selectObject(cur_grouped_object, pageIndex);
drawing.chartSelection = cur_grouped_object;
drawing.selection.title = title;
cur_grouped_object.selectTitle(title, pageIndex);
drawingObjectsController.updateSelectionState();
return true;
} else {
return {
objectId: drawing.Get_Id(),
cursorType: "move",
bMarker: false
};
}
} else {
if (hit_in_text_rect) {
if (drawingObjectsController.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
drawingObjectsController.checkChartTextSelection();
drawingObjectsController.resetSelection();
drawingObjectsController.selectObject(drawing, pageIndex);
drawingObjectsController.selection.groupSelection = drawing;
drawing.selectObject(cur_grouped_object, pageIndex);
drawing.selection.chartSelection = cur_grouped_object;
cur_grouped_object.selectTitle(title, pageIndex);
cur_grouped_object.selection.textSelection = title;
title.selectionSetStart(e, x, y, pageIndex);
drawingObjectsController.changeCurrentState(new TextAddState(drawingObjectsController, title));
if (e.ClickCount <= 1) {
drawingObjectsController.updateSelectionState();
}
return true;
} else {
if (drawingObjectsController.document) {
var content = title.getDocContent();
var invert_transform_text = title.invertTransformText,
tx, ty;
if (content && invert_transform_text) {
tx = invert_transform_text.TransformPointX(x, y);
ty = invert_transform_text.TransformPointY(x, y);
content.Update_CursorType(tx, ty, pageIndex);
}
}
return {
objectId: drawing.Get_Id(),
cursorType: "text"
};
}
}
}
}
}
ret = handleShapeImageInGroup(drawingObjectsController, drawing, cur_grouped_object, e, x, y, pageIndex, bWord);
if (ret) {
return ret;
}
break;
}
}
return false;
}
function handleChart(drawing, drawingObjectsController, e, x, y, group, pageIndex, bWord) {
var ret, i, title;
if (drawing.hit(x, y)) {
var chart_titles = drawing.getAllTitles();
var selector = group ? group : drawingObjectsController;
for (i = 0; i < chart_titles.length; ++i) {
title = chart_titles[i];
var hit_in_inner_area = title.hitInInnerArea(x, y);
var hit_in_path = title.hitInPath(x, y);
var hit_in_text_rect = title.hitInTextRect(x, y);
if (hit_in_inner_area && !hit_in_text_rect || hit_in_path) {
if (drawingObjectsController.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
var is_selected = drawing.selected;
drawingObjectsController.checkChartTextSelection();
selector.resetSelection();
selector.selectObject(drawing, pageIndex);
selector.selection.chartSelection = drawing;
drawing.selectTitle(title, pageIndex);
drawingObjectsController.updateSelectionState();
return true;
} else {
return {
objectId: drawing.Get_Id(),
cursorType: "move",
bMarker: false
};
}
} else {
if (hit_in_text_rect) {
if (drawingObjectsController.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
drawingObjectsController.checkChartTextSelection();
selector.resetSelection();
selector.selectObject(drawing, pageIndex);
selector.selection.chartSelection = drawing;
drawing.selectTitle(title, pageIndex);
drawing.selection.textSelection = title;
title.selectionSetStart(e, x, y, pageIndex);
drawingObjectsController.changeCurrentState(new TextAddState(drawingObjectsController, title));
if (e.ClickCount <= 1) {
drawingObjectsController.updateSelectionState();
}
return true;
} else {
if (drawingObjectsController.document) {
var content = title.getDocContent();
var invert_transform_text = title.invertTransformText,
tx, ty;
if (content && invert_transform_text) {
tx = invert_transform_text.TransformPointX(x, y);
ty = invert_transform_text.TransformPointY(x, y);
content.Update_CursorType(tx, ty, pageIndex);
}
}
return {
objectId: drawing.Get_Id(),
cursorType: "text",
title: title
};
}
}
}
}
}
ret = handleShapeImage(drawing, drawingObjectsController, e, x, y, group, pageIndex, bWord);
if (ret) {
return ret;
}
return false;
}
function handleInlineShapeImage(drawing, drawingObjectsController, e, x, y, pageIndex) {
var _hit = drawing.hit && drawing.hit(x, y);
var _hit_to_path = drawing.hitInPath && drawing.hitInPath(x, y);
var b_hit_to_text = drawing.hitInTextRect && drawing.hitInTextRect(x, y);
if ((_hit && !b_hit_to_text) || _hit_to_path) {
return handleInlineHitNoText(drawing, drawingObjectsController, e, x, y, pageIndex);
} else {
if (b_hit_to_text) {
var all_drawings = drawing.getDocContent().Get_AllDrawingObjects();
var drawings2 = [];
for (var i = 0; i < all_drawings.length; ++i) {
drawings2.push(all_drawings[i].GraphicObj);
}
var ret = handleInlineObjects(drawingObjectsController, drawings2, e, x, y, pageIndex, true);
if (ret) {
return ret;
}
return drawingObjectsController.handleTextHit(drawing, e, x, y, null, pageIndex, true);
}
}
}
function handleInlineChart(drawing, drawingObjectsController, e, x, y, pageIndex) {
if (drawing.hit(x, y)) {
var ret, i, title;
var chart_titles = drawing.getAllTitles();
for (i = 0; i < chart_titles.length; ++i) {
title = chart_titles[i];
var hit_in_inner_area = title.hitInInnerArea(x, y);
var hit_in_path = title.hitInPath(x, y);
var hit_in_text_rect = title.hitInTextRect(x, y);
if (hit_in_inner_area && !hit_in_text_rect || hit_in_path) {
if (drawingObjectsController.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
var is_selected = drawing.selected;
drawingObjectsController.checkChartTextSelection();
drawingObjectsController.resetSelection();
drawingObjectsController.selectObject(drawing, pageIndex);
drawingObjectsController.selection.chartSelection = drawing;
drawing.selectTitle(title, pageIndex);
drawingObjectsController.updateSelectionState();
return true;
} else {
return {
objectId: drawing.Get_Id(),
cursorType: "move",
bMarker: false
};
}
} else {
if (hit_in_text_rect) {
if (drawingObjectsController.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
drawingObjectsController.checkChartTextSelection();
drawingObjectsController.resetSelection();
drawingObjectsController.selectObject(drawing, pageIndex);
drawingObjectsController.selection.chartSelection = drawing;
drawing.selectTitle(title, pageIndex);
drawing.selection.textSelection = title;
title.selectionSetStart(e, x, y, pageIndex);
drawingObjectsController.changeCurrentState(new TextAddState(drawingObjectsController, title));
if (e.ClickCount <= 1) {
drawingObjectsController.updateSelectionState();
}
return true;
} else {
if (drawingObjectsController.document) {
var content = title.getDocContent();
var invert_transform_text = title.invertTransformText,
tx, ty;
if (content && invert_transform_text) {
tx = invert_transform_text.TransformPointX(x, y);
ty = invert_transform_text.TransformPointY(x, y);
content.Update_CursorType(tx, ty, pageIndex);
}
}
return {
objectId: drawing.Get_Id(),
cursorType: "text",
title: title
};
}
}
}
}
}
return handleInlineShapeImage(drawing, drawingObjectsController, e, x, y, pageIndex);
}
function handleInlineHitNoText(drawing, drawingObjects, e, x, y, pageIndex) {
var selected_objects = drawingObjects.selectedObjects;
if (! (e.CtrlKey || e.ShiftKey) || selected_objects.length === 0 || selected_objects.length === 1 && selected_objects[0] === drawing) {
if (drawingObjects.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
var bIsSelected = drawing.selected;
drawingObjects.checkChartTextSelection();
drawingObjects.resetSelection();
drawing.select(drawingObjects, pageIndex);
drawingObjects.changeCurrentState(new PreMoveInlineObject(drawingObjects, drawing, bIsSelected, true, pageIndex, x, y));
if (e.ClickCount > 1 && !e.ShiftKey && !e.CtrlKey && ((drawingObjects.selection.groupSelection && drawingObjects.selection.groupSelection.selectedObjects.length === 1) || drawingObjects.selectedObjects.length === 1) && drawing.getObjectType() === historyitem_type_ChartSpace && drawingObjects.handleChartDoubleClick) {
drawingObjects.handleChartDoubleClick(drawing.parent, drawing, e, x, y, pageIndex);
}
drawingObjects.updateOverlay();
return true;
} else {
return {
objectId: drawing.Get_Id(),
cursorType: "move"
};
}
}
if (drawingObjects.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
return {
objectId: drawing.Get_Id(),
cursorType: "move"
};
}
return false;
}
function handleInlineObjects(drawingObjectsController, drawingArr, e, x, y, pageIndex, bWord) {
var i;
var drawing, ret;
for (i = drawingArr.length - 1; i > -1; --i) {
drawing = drawingArr[i];
switch (drawing.getObjectType()) {
case historyitem_type_Shape:
case historyitem_type_ImageShape:
ret = handleInlineShapeImage(drawing, drawingObjectsController, e, x, y, pageIndex);
if (ret) {
return ret;
}
break;
case historyitem_type_ChartSpace:
ret = handleInlineChart(drawing, drawingObjectsController, e, x, y, pageIndex);
if (ret) {
return ret;
}
break;
case historyitem_type_GroupShape:
ret = handleGroup(drawing, drawingObjectsController, e, x, y, null, pageIndex, bWord);
if (ret) {
return ret;
}
break;
}
}
return false;
}
function handleMouseUpPreMoveState(drawingObjects, e, x, y, pageIndex, bWord) {
var state = drawingObjects.curState;
state.drawingObjects.clearPreTrackObjects();
state.drawingObjects.changeCurrentState(new NullState(state.drawingObjects));
if (!state.shift && !state.ctrl && state.bInside && state.majorObjectIsSelected && e.Button !== g_mouse_button_right) {
switch (state.majorObject.getObjectType()) {
case historyitem_type_GroupShape:
state.drawingObjects.checkChartTextSelection();
state.drawingObjects.resetSelection();
state.drawingObjects.selectObject(state.majorObject, pageIndex);
state.drawingObjects.selection.groupSelection = state.majorObject;
state.drawingObjects.OnMouseDown(e, x, y, pageIndex);
state.drawingObjects.OnMouseUp(e, x, y, pageIndex);
state.drawingObjects.drawingObjects && state.drawingObjects.drawingObjects.sendGraphicObjectProps && state.drawingObjects.drawingObjects.sendGraphicObjectProps();
state.drawingObjects.document && state.drawingObjects.document.Document_UpdateInterfaceState();
break;
case historyitem_type_ChartSpace:
break;
}
}
}
function handleFloatTable(drawing, drawingObjectsController, e, x, y, group, pageIndex) {
if (drawing.hitInBoundingRect(x, y)) {
return drawingObjectsController.handleMoveHit(drawing, e, x, y, group, false, pageIndex, false);
} else {
if (drawing.hitInInnerArea(x, y)) {
var content, invert_transform_text, tx, ty, hit_paragraph, par, check_hyperlink;
if (drawingObjectsController.handleEventMode === HANDLE_EVENT_MODE_HANDLE) {
drawingObjectsController.resetSelection(true);
(group ? group : drawingObjectsController).selectObject(drawing, pageIndex);
if (!group) {
drawingObjectsController.selection.textSelection = drawing;
drawing.selectionSetStart(e, x, y, pageIndex);
} else {
group.selection.textSelection = drawing;
drawing.selectionSetStart(e, x, y, pageIndex);
drawingObjectsController.selectObject(group, pageIndex);
drawingObjectsController.selection.groupSelection = group;
}
drawingObjectsController.changeCurrentState(new TextAddState(drawingObjectsController, drawing));
return true;
} else {
drawing.updateCursorType(x, y, e);
return {
objectId: drawing.Get_Id(),
cursorType: "text",
updated: true
};
}
}
}
return false;
}