# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
#
# This file is part of the Collabora Office project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#

from uitest.framework import UITestCase
from libreoffice.uno.propertyvalue import mkPropertyValues
from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file
from uitest.uihelper.calc import enter_text_to_cell

class navigator(UITestCase):

    def test_rename_sheet(self):
        with self.ui_test.load_file(get_url_for_data_file("navigator.ods")):
            xCalcDoc = self.xUITest.getTopFocusWindow()
            xGridWin = xCalcDoc.getChild("grid_window")

            self.xUITest.executeCommand(".uno:Sidebar")
            xGridWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "ScNavigatorPanel"}))

            xCalcDoc = self.xUITest.getTopFocusWindow()
            xNavigatorPanel = xCalcDoc.getChild("NavigatorPanel")
            xContentBox = xNavigatorPanel.getChild('contentbox')
            xSheets = xContentBox.getChild("0")
            self.assertEqual(get_state_as_dict(xSheets)['Text'], 'Sheets')
            self.assertEqual(len(xSheets.getChildren()), 2)
            self.assertEqual(get_state_as_dict(xSheets.getChild('0'))['Text'], 'Sheet1')
            self.assertEqual(get_state_as_dict(xSheets.getChild('1'))['Text'], 'S2')
            xRangeNames = xContentBox.getChild("1")
            self.assertEqual(get_state_as_dict(xRangeNames)['Text'], 'Range names')
            self.assertEqual(len(xRangeNames.getChildren()), 2)
            self.assertEqual(get_state_as_dict(xRangeNames.getChild('0'))['Text'], 'first (Sheet1)')
            self.assertEqual(get_state_as_dict(xRangeNames.getChild('1'))['Text'], 'second (Sheet1)')

            #The document has one comment too
            xComments = xContentBox.getChild("6")
            self.assertEqual(get_state_as_dict(xComments)['Text'], 'Comments')
            self.assertEqual(len(xComments.getChildren()), 1)
            self.assertEqual(get_state_as_dict(xComments.getChild('0'))['Text'], 'Test Comment')

            with self.ui_test.execute_dialog_through_command(".uno:RenameTable") as xDialog:
                xname_entry = xDialog.getChild("name_entry")
                xname_entry.executeAction("TYPE", mkPropertyValues({"TEXT": "S1"}))

            xCalcDoc = self.xUITest.getTopFocusWindow()
            xNavigatorPanel = xCalcDoc.getChild("NavigatorPanel")
            xContentBox = xNavigatorPanel.getChild('contentbox')
            xSheets = xContentBox.getChild("0")
            self.assertEqual(get_state_as_dict(xSheets)['Text'], 'Sheets')
            self.assertEqual(len(xSheets.getChildren()), 2)
            self.assertEqual(get_state_as_dict(xSheets.getChild('0'))['Text'], 'S1')
            self.assertEqual(get_state_as_dict(xSheets.getChild('1'))['Text'], 'S2')
            xRangeNames = xContentBox.getChild("1")
            self.assertEqual(get_state_as_dict(xRangeNames)['Text'], 'Range names')
            self.assertEqual(len(xRangeNames.getChildren()), 2)
            self.assertEqual(get_state_as_dict(xRangeNames.getChild('0'))['Text'], 'first (S1)')
            self.assertEqual(get_state_as_dict(xRangeNames.getChild('1'))['Text'], 'second (S1)')

            self.xUITest.executeCommand(".uno:Undo")

            xCalcDoc = self.xUITest.getTopFocusWindow()
            xNavigatorPanel = xCalcDoc.getChild("NavigatorPanel")
            xContentBox = xNavigatorPanel.getChild('contentbox')
            xSheets = xContentBox.getChild("0")
            self.assertEqual(get_state_as_dict(xSheets)['Text'], 'Sheets')
            self.assertEqual(len(xSheets.getChildren()), 2)
            self.assertEqual(get_state_as_dict(xSheets.getChild('0'))['Text'], 'Sheet1')
            self.assertEqual(get_state_as_dict(xSheets.getChild('1'))['Text'], 'S2')
            xRangeNames = xContentBox.getChild("1")
            self.assertEqual(get_state_as_dict(xRangeNames)['Text'], 'Range names')
            self.assertEqual(len(xRangeNames.getChildren()), 2)
            #FIXME: tdf#133082
            #self.assertEqual(get_state_as_dict(xRangeNames.getChild('0'))['Text'], 'first (Sheet1)')
            #self.assertEqual(get_state_as_dict(xRangeNames.getChild('1'))['Text'], 'second (Sheet1)')

            self.xUITest.executeCommand(".uno:Sidebar")

    def test_tdf98493(self):

        with self.ui_test.load_file(get_url_for_data_file("tdf98493.ods")):
            xCalcDoc = self.xUITest.getTopFocusWindow()
            xGridWin = xCalcDoc.getChild("grid_window")

            self.assertEqual(get_state_as_dict(xGridWin)["SelectedTable"], "2")

            self.xUITest.executeCommand(".uno:Sidebar")
            xGridWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "ScNavigatorPanel"}))

            xCalcDoc = self.xUITest.getTopFocusWindow()
            xNavigatorPanel = xCalcDoc.getChild("NavigatorPanel")
            xToolBar = xNavigatorPanel.getChild("toolbox2")
            xToolBar.executeAction("CLICK", mkPropertyValues({"POS": "0"})) # 'toggle' button

            xContentBox = xNavigatorPanel.getChild('contentbox')

            # tdf#133079, without the fix in place, it would be 8
            self.assertEqual(len(xContentBox.getChildren()), 1)

            xSheets = xContentBox.getChild('0')
            self.assertEqual(len(xSheets.getChildren()), 12)

            #key=item position, value=sheet ( there are hidden sheets )
            results = { '1': '0', '5': '4', '6': '4', '11': '10'}

            for k, v in results.items():
                xChild = xSheets.getChild(k)
                xChild.executeAction("DOUBLECLICK", tuple())

                self.assertEqual(get_state_as_dict(xGridWin)["SelectedTable"], v)

            self.xUITest.executeCommand(".uno:Sidebar")


    def test_tdf134390(self):
        with self.ui_test.create_doc_in_start_center("calc"):
            xCalcDoc = self.xUITest.getTopFocusWindow()
            xGridWin = xCalcDoc.getChild("grid_window")

            self.xUITest.executeCommand(".uno:Sidebar")
            xGridWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "ScNavigatorPanel"}))

            xCalcDoc = self.xUITest.getTopFocusWindow()
            xNavigatorPanel = xCalcDoc.getChild("NavigatorPanel")
            xToolBar = xNavigatorPanel.getChild("toolbox2")
            xToolBar.executeAction("CLICK", mkPropertyValues({"POS": "0"})) # 'toggle' button

            xRow = xNavigatorPanel.getChild('row')
            xColumn = xNavigatorPanel.getChild('column')

            self.assertEqual(get_state_as_dict(xColumn)['Value'], '1')
            self.assertEqual(get_state_as_dict(xRow)['Value'], '1')
            self.assertEqual(get_state_as_dict(xGridWin)["CurrentRow"], "0")
            self.assertEqual(get_state_as_dict(xGridWin)["CurrentColumn"], "0")

            xToolkit = self.xContext.ServiceManager.createInstance('com.sun.star.awt.Toolkit')

            xColumn.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
            xColumn.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
            xColumn.executeAction("TYPE", mkPropertyValues({"TEXT":"B"}))
            xColumn.executeAction("TYPE", mkPropertyValues({"KEYCODE":"RETURN"}))
            xToolkit.processEventsToIdle()
# disable flakey UITest
#            self.assertEqual(get_state_as_dict(xColumn)['Value'], '2')

            xRow.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
            xRow.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
            xRow.executeAction("TYPE", mkPropertyValues({"TEXT":"2"}))
            xRow.executeAction("TYPE", mkPropertyValues({"KEYCODE":"RETURN"}))
            xToolkit.processEventsToIdle()
            self.assertEqual(get_state_as_dict(xRow)['Value'], '2')

            # Without the fix in place, this test would have failed with
            # AssertionError: '0' != '1'
            self.assertEqual(get_state_as_dict(xGridWin)["CurrentRow"], "1")
# disable flaky test
#            self.assertEqual(get_state_as_dict(xGridWin)["CurrentColumn"], "1")

            self.xUITest.executeCommand(".uno:Sidebar")


    def test_tdf141973(self):
        with self.ui_test.load_file(get_url_for_data_file("tdf141973.ods")):
            xCalcDoc = self.xUITest.getTopFocusWindow()
            xGridWin = xCalcDoc.getChild("grid_window")

            self.xUITest.executeCommand(".uno:Sidebar")

            # Without the fix in place, this test would have crashed here
            xGridWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "ScNavigatorPanel"}))

            xCalcDoc = self.xUITest.getTopFocusWindow()
            xNavigatorPanel = xCalcDoc.getChild("NavigatorPanel")
            xContentBox = xNavigatorPanel.getChild('contentbox')
            xDrawings = xContentBox.getChild("7")
            self.assertEqual('Drawing objects', get_state_as_dict(xDrawings)['Text'])
            self.assertEqual(len(xDrawings.getChildren()), 1)
            self.assertEqual('withname', get_state_as_dict(xDrawings.getChild('0'))['Text'])

            self.xUITest.executeCommand(".uno:Sidebar")


    def test_tdf158652(self):
        with self.ui_test.create_doc_in_start_center("calc"):
            xToolkit = self.xContext.ServiceManager.createInstance('com.sun.star.awt.Toolkit')
            xCalcDoc = self.xUITest.getTopFocusWindow()
            xGridWin = xCalcDoc.getChild("grid_window")

            self.xUITest.executeCommand(".uno:Sidebar")

            xGridWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "ScNavigatorPanel"}))

            xCalcDoc = self.xUITest.getTopFocusWindow()
            xNavigatorPanel = xCalcDoc.getChild("NavigatorPanel")
            xContentBox = xNavigatorPanel.getChild('contentbox')
            enter_text_to_cell(xGridWin, "A1", "1")

            commentText = mkPropertyValues({"Text":"CommentText"})
            self.xUITest.executeCommandWithParameters(".uno:InsertAnnotation", commentText)
            xToolkit.waitUntilAllIdlesDispatched()
            xComments = xContentBox.getChild("6")
            self.assertEqual(len(xComments.getChildren()), 1)

            self.xUITest.executeCommand(".uno:DeleteNote")
            xToolkit.waitUntilAllIdlesDispatched()
            xComments = xContentBox.getChild("6")
            self.assertEqual(len(xComments.getChildren()), 0)

            self.xUITest.executeCommand(".uno:Sidebar")

# vim: set shiftwidth=4 softtabstop=4 expandtab:
