# SPDX-License-Identifier: LGPL-2.1-or-later

# ***************************************************************************
# *   Copyright (c) 2009 Yorik van Havre <yorik@uncreated.net>              *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU Lesser General Public License (LGPL)    *
# *   as published by the Free Software Foundation; either version 2 of     *
# *   the License, or (at your option) any later version.                   *
# *   for detail see the LICENCE text file.                                 *
# *                                                                         *
# *   This program is distributed in the hope that it will be useful,       *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU Library General Public License for more details.                  *
# *                                                                         *
# *   You should have received a copy of the GNU Library General Public     *
# *   License along with this program; if not, write to the Free Software   *
# *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
# *   USA                                                                   *
# *                                                                         *
# ***************************************************************************
"""Initialization of the Draft workbench (graphical interface)."""

import os

import FreeCAD
import FreeCADGui

__title__ = "FreeCAD Draft Workbench - Init file"
__author__ = "Yorik van Havre <yorik@uncreated.net>"
__url__ = "https://www.freecad.org"


class DraftWorkbench(FreeCADGui.Workbench):
    """The Draft Workbench definition."""

    def __init__(self):
        def QT_TRANSLATE_NOOP(context, text):
            return text

        __dirname__ = os.path.join(FreeCAD.getResourceDir(), "Mod", "Draft")
        _tooltip = "The Draft workbench is used for 2D drafting on a grid"
        self.__class__.Icon = os.path.join(__dirname__, "Resources", "icons", "DraftWorkbench.svg")
        self.__class__.MenuText = QT_TRANSLATE_NOOP("draft", "Draft")
        self.__class__.ToolTip = QT_TRANSLATE_NOOP("draft", _tooltip)

    def Initialize(self):
        """When the workbench is first loaded."""

        def QT_TRANSLATE_NOOP(context, text):
            return text

        # Run self-tests
        dependencies_OK = False
        try:
            from pivy import coin

            if FreeCADGui.getSoDBVersion() != coin.SoDB.getVersion():
                raise AssertionError(
                    "FreeCAD and Pivy use different versions "
                    "of Coin. "
                    "This will lead to unexpected behaviour."
                )
        except AssertionError:
            FreeCAD.Console.PrintWarning(
                "Error: FreeCAD and Pivy "
                "use different versions of Coin. "
                "This will lead to unexpected "
                "behaviour.\n"
            )
        except ImportError:
            FreeCAD.Console.PrintWarning(
                "Error: Pivy not found, " "Draft Workbench will be disabled.\n"
            )
        except Exception:
            FreeCAD.Console.PrintWarning("Error: Unknown error " "while trying to load Pivy.\n")
        else:
            dependencies_OK = True

        if not dependencies_OK:
            return

        # Import Draft tools, icons
        try:
            import Draft_rc
            import DraftTools
            import DraftGui

            FreeCADGui.addLanguagePath(":/translations")
            FreeCADGui.addIconPath(":/icons")
        except Exception as exc:
            FreeCAD.Console.PrintError(exc)
            FreeCAD.Console.PrintError(
                "Error: Initializing one or more "
                "of the Draft modules failed, "
                "Draft will not work as expected.\n"
            )

        # Set up command lists
        import draftutils.init_tools as it

        self.drawing_commands = it.get_draft_drawing_commands()
        self.annotation_commands = it.get_draft_annotation_commands()
        self.modification_commands = it.get_draft_modification_commands()
        self.utility_commands_menu = it.get_draft_utility_commands_menu()
        self.utility_commands_toolbar = it.get_draft_utility_commands_toolbar()
        self.context_commands = it.get_draft_context_commands()

        # Set up toolbars
        it.init_toolbar(
            self, QT_TRANSLATE_NOOP("Workbench", "Draft Creation"), self.drawing_commands
        )
        it.init_toolbar(
            self, QT_TRANSLATE_NOOP("Workbench", "Draft Annotation"), self.annotation_commands
        )
        it.init_toolbar(
            self, QT_TRANSLATE_NOOP("Workbench", "Draft Modification"), self.modification_commands
        )
        it.init_toolbar(
            self, QT_TRANSLATE_NOOP("Workbench", "Draft Utility"), self.utility_commands_toolbar
        )
        it.init_toolbar(
            self, QT_TRANSLATE_NOOP("Workbench", "Draft Snap"), it.get_draft_snap_commands()
        )

        # Set up menus
        it.init_menu(self, [QT_TRANSLATE_NOOP("Workbench", "&Drafting")], self.drawing_commands)
        it.init_menu(
            self, [QT_TRANSLATE_NOOP("Workbench", "&Annotation")], self.annotation_commands
        )
        it.init_menu(
            self, [QT_TRANSLATE_NOOP("Workbench", "&Modification")], self.modification_commands
        )
        it.init_menu(
            self, [QT_TRANSLATE_NOOP("Workbench", "&Utilities")], self.utility_commands_menu
        )

        # Set up preferences pages
        if hasattr(FreeCADGui, "draftToolBar"):
            if not hasattr(FreeCADGui.draftToolBar, "loadedPreferences"):
                from draftutils import params

                params._param_observer_start()
                FreeCADGui.addPreferencePage(
                    ":/ui/preferences-draft.ui", QT_TRANSLATE_NOOP("QObject", "Draft")
                )
                FreeCADGui.addPreferencePage(
                    ":/ui/preferences-draftinterface.ui", QT_TRANSLATE_NOOP("QObject", "Draft")
                )
                FreeCADGui.addPreferencePage(
                    ":/ui/preferences-draftsnap.ui", QT_TRANSLATE_NOOP("QObject", "Draft")
                )
                FreeCADGui.addPreferencePage(
                    ":/ui/preferences-draftvisual.ui", QT_TRANSLATE_NOOP("QObject", "Draft")
                )
                FreeCADGui.addPreferencePage(
                    ":/ui/preferences-drafttexts.ui", QT_TRANSLATE_NOOP("QObject", "Draft")
                )
                FreeCADGui.draftToolBar.loadedPreferences = True

        FreeCADGui.getMainWindow().mainWindowClosed.connect(self.Deactivated)

        FreeCAD.Console.PrintLog("Loading Draft workbench, done.\n")

    def Activated(self):
        """When entering the workbench."""
        if hasattr(FreeCADGui, "draftToolBar"):
            FreeCADGui.draftToolBar.Activated()
        if hasattr(FreeCADGui, "Snapper"):
            FreeCADGui.Snapper.show()
            from draftutils import init_draft_statusbar

            init_draft_statusbar.show_draft_statusbar()
        import WorkingPlane

        WorkingPlane._view_observer_start()  # Updates the draftToolBar when switching views.
        from draftutils import grid_observer

        grid_observer._view_observer_setup()
        FreeCAD.Console.PrintLog("Draft workbench activated.\n")

    def Deactivated(self):
        """When quitting the workbench."""
        if hasattr(FreeCADGui, "draftToolBar"):
            FreeCADGui.draftToolBar.Deactivated()
        if hasattr(FreeCADGui, "Snapper"):
            FreeCADGui.Snapper.hide()
            from draftutils import init_draft_statusbar

            init_draft_statusbar.hide_draft_statusbar()
        import WorkingPlane

        WorkingPlane._view_observer_stop()
        from draftutils import grid_observer

        grid_observer._view_observer_setup()
        FreeCAD.Console.PrintLog("Draft workbench deactivated.\n")

    def ContextMenu(self, recipient):
        """Define an optional custom context menu."""
        has_text = False
        for o in FreeCADGui.Selection.getCompleteSelection():
            if hasattr(o.Object, "Text"):
                has_text = True
                break

        if has_text:
            import sys
            from draftguitools import gui_hyperlink

            hyperlinks_search = gui_hyperlink.Draft_Hyperlink()
            if hyperlinks_search.has_hyperlinks() and sys.platform in [
                "win32",
                "cygwin",
                "darwin",
                "linux",
            ]:
                self.appendContextMenu("", ["Draft_Hyperlink"])

        self.appendContextMenu("Utilities", self.context_commands)

    def GetClassName(self):
        """Type of workbench."""
        return "Gui::PythonWorkbench"


FreeCADGui.addWorkbench(DraftWorkbench)

# Preference pages for importing and exporting various file formats
# are independent of the loading of the workbench and can be loaded at startup
import Draft_rc
from PySide.QtCore import QT_TRANSLATE_NOOP

FreeCADGui.addPreferencePage(
    ":/ui/preferences-dxf.ui", QT_TRANSLATE_NOOP("QObject", "Import-Export")
)
FreeCADGui.addPreferencePage(
    ":/ui/preferences-dwg.ui", QT_TRANSLATE_NOOP("QObject", "Import-Export")
)
FreeCADGui.addPreferencePage(
    ":/ui/preferences-svg.ui", QT_TRANSLATE_NOOP("QObject", "Import-Export")
)
FreeCADGui.addPreferencePage(
    ":/ui/preferences-oca.ui", QT_TRANSLATE_NOOP("QObject", "Import-Export")
)

FreeCAD.__unit_test__ += ["TestDraftGui"]
