1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the Qt Components project.
9 ** $QT_BEGIN_LICENSE:BSD$
10 ** You may use this file under the terms of the BSD license as follows:
12 ** "Redistribution and use in source and binary forms, with or without
13 ** modification, are permitted provided that the following conditions are
15 ** * Redistributions of source code must retain the above copyright
16 ** notice, this list of conditions and the following disclaimer.
17 ** * Redistributions in binary form must reproduce the above copyright
18 ** notice, this list of conditions and the following disclaimer in
19 ** the documentation and/or other materials provided with the
21 ** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
22 ** the names of its contributors may be used to endorse or promote
23 ** products derived from this software without specific prior written
26 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
39 ****************************************************************************/
42 import "AppManager.js" as AppManager
47 property Item editor: null
48 property bool copyEnabled: false
49 property bool cutEnabled: false
50 property bool platformInverted: false
53 // Show menu only if some of the options is available
54 if(root.copyEnabled || root.cutEnabled || editor.canPaste) {
55 parent = AppManager.rootObject();
65 function calculatePosition() {
66 if (editor && root.visible) {
67 var rectStart = editor.positionToRectangle(editor.selectionStart);
68 var rectEnd = editor.positionToRectangle(editor.selectionEnd);
70 var posStart = editor.mapToItem(parent, rectStart.x, rectStart.y);
71 var posEnd = editor.mapToItem(parent, rectEnd.x, rectEnd.y);
73 var selectionCenterX = (posEnd.x + posStart.x) / 2;
74 if (posStart.y != posEnd.y)
75 // we have multiline selection so center to the screen
76 selectionCenterX = parent.width / 2;
78 var contextMenuMargin = 10; // the space between the context menu and the line above/below
79 var contextMenuAdjustedRowHeight = row.height + contextMenuMargin;
80 var tempY = posStart.y - contextMenuAdjustedRowHeight;
81 var minVerticalPos = internal.textArea ? internal.textArea.mapToItem(parent, 0, 0).y - row.height : 0
83 if (tempY < minVerticalPos)
84 tempY = minVerticalPos
89 root.x = Math.max(0, Math.min(selectionCenterX - row.width / 2, parent.width - row.width));
96 internal.editorSceneXChanged.connect(internal.editorMoved)
97 internal.editorSceneYChanged.connect(internal.editorMoved)
99 internal.editorSceneXChanged.disconnect(internal.editorMoved)
100 internal.editorSceneYChanged.disconnect(internal.editorMoved)
107 Binding { target: internal; property: "editorSceneX"; value: AppManager.sceneX(root.editor); when: root.visible && (root.editor != null) }
108 Binding { target: internal; property: "editorSceneY"; value: AppManager.sceneY(root.editor); when: root.visible && (root.editor != null) }
113 property real editorSceneX
114 property real editorSceneY
115 property Item textArea: null
117 function editorMoved() {
118 root.calculatePosition()
121 Component.onCompleted: textArea = AppManager.findParent(editor, "errorHighlight")
127 function visibleButtonCount() {
129 if (copyButton.visible) ++count
130 if (cutButton.visible) ++count
131 if (pasteButton.visible) ++count
136 width: Math.round(privateStyle.buttonSize * 1.5) * visibleButtonCount()
138 onWidthChanged: calculatePosition()
139 onHeightChanged: calculatePosition()
143 iconSource: privateStyle.imagePath("qtg_toolbar_copy", root.platformInverted)
144 visible: root.copyEnabled
145 platformInverted: root.platformInverted
146 onClicked: editor.copy()
150 iconSource: privateStyle.imagePath("qtg_toolbar_cut", root.platformInverted)
151 visible: root.cutEnabled
152 platformInverted: root.platformInverted
160 iconSource: privateStyle.imagePath("qtg_toolbar_paste", root.platformInverted)
161 visible: editor.canPaste
162 platformInverted: root.platformInverted