"""
@package psmap.toolbars

@brief wxPsMap toolbars classes

Classes:
 - toolbars::PsMapToolbar

(C) 2007-2011 by the GRASS Development Team

This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.

@author Anna Kratochvilova <kratochanna gmail.com>
"""

import sys

import wx

from core import globalvar
from core.utils import _
from gui_core.toolbars import BaseToolbar, BaseIcons
from icons.icon import MetaIcon


class PsMapToolbar(BaseToolbar):

    def __init__(self, parent, toolSwitcher):
        """Toolbar Cartographic Composer (psmap.py)

        :param parent: parent window
        """
        BaseToolbar.__init__(self, parent, toolSwitcher)

        # workaround for http://trac.wxwidgets.org/ticket/13888
        if sys.platform == 'darwin':
            parent.SetToolBar(self)

        self.InitToolbar(self._toolbarData())
        self._default = self.pointer

        for tool in (self.pointer, self.pan, self.zoomin, self.zoomout,
                     self.drawGraphics, self.addMap):
            self.toolSwitcher.AddToolToGroup(
                group='mouseUse', toolbar=self, tool=tool)

        # custom button for graphics mode selection
        # TODO: could this be somehow generalized?
        self.arrowButton = self.CreateSelectionButton()
        self.arrowButtonId = self.InsertControl(18, self.arrowButton)
        self.arrowButton.Bind(wx.EVT_BUTTON, self.OnDrawGraphicsMenu)

        self.drawGraphicsAction = None
        self.OnAddPoint(event=None)

        self.Realize()

        from psmap.frame import havePILImage
        if not havePILImage:
            self.EnableTool(self.preview, False)

    def _toolbarData(self):
        """Toolbar data
        """
        icons = {
            'scriptSave': MetaIcon(img='script-save',
                                   label=_('Generate text file with mapping instructions')),
            'scriptLoad': MetaIcon(img='script-load',
                                   label=_('Load text file with mapping instructions')),
            'psExport': MetaIcon(img='ps-export',
                                 label=_('Generate PostScript output')),
            'pdfExport': MetaIcon(img='pdf-export',
                                  label=_('Generate PDF output')),
            'pageSetup': MetaIcon(img='page-settings',
                                  label=_('Page setup'),
                                  desc=_('Specify paper size, margins and orientation')),
            'fullExtent': MetaIcon(img='zoom-extent',
                                   label=_("Full extent"),
                                   desc=_("Zoom to full extent")),
            'addMap': MetaIcon(img='layer-add',
                               label=_("Map frame"),
                               desc=_("Click and drag to place map frame")),
            'deleteObj': MetaIcon(img='layer-remove',
                                  label=_("Delete selected object")),
            'preview': MetaIcon(img='execute',
                                label=_("Show preview")),
            'quit': MetaIcon(img='quit',
                             label=_('Quit Cartographic Composer')),
            'addText': MetaIcon(img='text-add',
                                label=_('Text')),
            'addMapinfo': MetaIcon(img='map-info',
                                   label=_('Map info')),
            'addLegend': MetaIcon(img='legend-add',
                                  label=_('Legend')),
            'addScalebar': MetaIcon(img='scalebar-add',
                                    label=_('Scale bar')),
            'addImage': MetaIcon(img='image-add',
                                 label=_('Image')),
            'addNorthArrow': MetaIcon(img='north-arrow-add',
                                      label=_('North Arrow')),
            'pointAdd': MetaIcon(img='point-add',
                                 label=_('Point')),
            'lineAdd': MetaIcon(img='line-add',
                                label=_('Line')),
            'rectangleAdd': MetaIcon(img='rectangle-add',
                                     label=_('Rectangle')),
            'overlaysAdd': MetaIcon(img='layer-more',
                                    label=_("Add overlays")),
            'labelsAdd': MetaIcon(img='layer-label-add',
                                  label=_("Add labels"))
        }
        self.icons = icons

        return self._getToolbarData((('loadFile', icons['scriptLoad'],
                                      self.parent.OnLoadFile),
                                     ('instructionFile', icons['scriptSave'],
                                      self.parent.OnInstructionFile),
                                     (None, ),
                                     ('pagesetup', icons['pageSetup'],
                                      self.parent.OnPageSetup),
                                     (None, ),
                                     ("pointer", BaseIcons["pointer"],
                                      self.parent.OnPointer, wx.ITEM_CHECK),
                                     ('pan', BaseIcons['pan'],
                                      self.parent.OnPan, wx.ITEM_CHECK),
                                     ("zoomin", BaseIcons["zoomIn"],
                                      self.parent.OnZoomIn, wx.ITEM_CHECK),
                                     ("zoomout", BaseIcons["zoomOut"],
                                      self.parent.OnZoomOut, wx.ITEM_CHECK),
                                     ('zoomAll', icons['fullExtent'],
                                      self.parent.OnZoomAll),
                                     (None, ),
                                     ('addMap', icons['addMap'],
                                      self.parent.OnAddMap, wx.ITEM_CHECK),
                                     ('addRaster', BaseIcons['addRast'],
                                      self.parent.OnAddRaster),
                                     ('addVector', BaseIcons['addVect'],
                                      self.parent.OnAddVect),
                                     ('overlaysAdd', icons['overlaysAdd'],
                                      self.OnAddOverlays),
                                     ("delete", icons["deleteObj"],
                                      self.parent.OnDelete),
                                     ("dec", BaseIcons["overlay"],
                                      self.OnDecoration),
                                     ("drawGraphics", icons['pointAdd'],
                                      self.OnDrawGraphics, wx.ITEM_CHECK),
                                     (None, ),
                                     ("preview", icons["preview"],
                                      self.parent.OnPreview),
                                     ('generatePS', icons['psExport'],
                                      self.parent.OnPSFile),
                                     ('generatePDF', icons['pdfExport'],
                                      self.parent.OnPDFFile),
                                     (None, ),
                                     ("help", BaseIcons['help'],
                                      self.parent.OnHelp),
                                     ('quit', icons['quit'],
                                      self.parent.OnCloseWindow))
                                    )

    def OnDecoration(self, event):
        """Decorations overlay menu
        """
        self._onMenu(((self.icons["addLegend"], self.parent.OnAddLegend),
                      (self.icons["addMapinfo"], self.parent.OnAddMapinfo),
                      (self.icons["addScalebar"], self.parent.OnAddScalebar),
                      (self.icons["addText"], self.parent.OnAddText),
                      (self.icons["addImage"], self.parent.OnAddImage),
                      (self.icons["addNorthArrow"], self.parent.OnAddNorthArrow)))

    def OnAddOverlays(self, event):
        self._onMenu(((self.icons['labelsAdd'], self.parent.OnAddLabels), ))

    def OnDrawGraphics(self, event):
        """Graphics tool activated."""
        # we need the previous id
        if self.drawGraphicsAction == 'pointAdd':
            self.parent.OnAddPoint(event)
        elif self.drawGraphicsAction == 'lineAdd':
            self.parent.OnAddLine(event)
        elif self.drawGraphicsAction == 'rectangleAdd':
            self.parent.OnAddRectangle(event)

    def OnDrawGraphicsMenu(self, event):
        """Simple geometry features (point, line, rectangle) overlay menu
        """
        self._onMenu(((self.icons["pointAdd"], self.OnAddPoint),
                      (self.icons["lineAdd"], self.OnAddLine),
                      (self.icons["rectangleAdd"], self.OnAddRectangle),
                      ))

    def OnAddPoint(self, event):
        """Point mode selected.

        Graphics drawing tool is activated. Tooltip changed.
        """
        self.SetToolNormalBitmap(
            self.drawGraphics,
            self.icons["pointAdd"].GetBitmap())
        self.SetToolShortHelp(
            self.drawGraphics,
            _("Add simple graphics: points"))
        self.drawGraphicsAction = 'pointAdd'
        if event:
            self.ToggleTool(self.drawGraphics, True)
            self.parent.OnAddPoint(event)

    def OnAddLine(self, event):
        """Line mode selected.

        Graphics drawing tool is activated. Tooltip changed.
        """
        self.SetToolNormalBitmap(
            self.drawGraphics,
            self.icons["lineAdd"].GetBitmap())
        self.SetToolShortHelp(
            self.drawGraphics,
            _("Add simple graphics: lines"))
        self.ToggleTool(self.drawGraphics, True)
        if event:
            self.drawGraphicsAction = 'lineAdd'
            self.parent.OnAddLine(event)

    def OnAddRectangle(self, event):
        """Rectangle mode selected.

        Graphics drawing tool is activated. Tooltip changed.
        """
        self.SetToolNormalBitmap(
            self.drawGraphics,
            self.icons["rectangleAdd"].GetBitmap())
        self.SetToolShortHelp(
            self.drawGraphics,
            _("Add simple graphics: rectangles"))
        self.ToggleTool(self.drawGraphics, True)
        if event:
            self.drawGraphicsAction = 'rectangleAdd'
            self.parent.OnAddRectangle(event)
