123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470 |
- #
- # This file is part of the LibreOffice 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/.
- #
- # This file incorporates work covered by the following license notice:
- #
- # Licensed to the Apache Software Foundation (ASF) under one or more
- # contributor license agreements. See the NOTICE file distributed
- # with this work for additional information regarding copyright
- # ownership. The ASF licenses this file to you under the Apache
- # License, Version 2.0 (the "License"); you may not use this file
- # except in compliance with the License. You may obtain a copy of
- # the License at http://www.apache.org/licenses/LICENSE-2.0 .
- #
- import uno
- import traceback
- from abc import ABCMeta, abstractmethod
- from .UnoDialog2 import UnoDialog2, Desktop, PropertyNames, UIConsts, \
- ItemListenerProcAdapter
- from ..common.HelpIds import HelpIds
- from ..common.FileAccess import FileAccess
- from com.sun.star.lang import NoSuchMethodException
- from com.sun.star.frame import TerminationVetoException
- from com.sun.star.awt.PushButtonType import HELP, STANDARD
- from com.sun.star.awt.FontWeight import BOLD
- import sys, os
- if sys.version_info < (3,4):
- import imp
- imp.load_source('strings', os.path.join(os.path.dirname(__file__), '../common/strings.hrc'))
- import strings
- elif sys.version_info < (3,7):
- # imp is deprecated since Python v.3.4
- from importlib.machinery import SourceFileLoader
- SourceFileLoader('strings', os.path.join(os.path.dirname(__file__), '../common/strings.hrc')).load_module()
- import strings
- else:
- # have to jump through hoops since 3.7, partly because python does not like loading modules that do have a .py extension
- import importlib
- import importlib.util
- import importlib.machinery
- module_name = 'strings'
- path = os.path.join(os.path.dirname(__file__), '../common/strings.hrc')
- spec = importlib.util.spec_from_loader(
- module_name,
- importlib.machinery.SourceFileLoader(module_name, path)
- )
- module = importlib.util.module_from_spec(spec)
- spec.loader.exec_module(module)
- sys.modules[module_name] = module
- strings = module
- class WizardDialog(UnoDialog2):
- __metaclass__ = ABCMeta
- __NEXT_ACTION_PERFORMED = "gotoNextAvailableStep"
- __BACK_ACTION_PERFORMED = "gotoPreviousAvailableStep"
- __FINISH_ACTION_PERFORMED = "finishWizard_1"
- __CANCEL_ACTION_PERFORMED = "cancelWizard_1"
- __HELP_ACTION_PERFORMED = None
- '''
- Creates a new instance of WizardDialog
- the hid is used as following :
- "HID:(hid)" - the dialog
- "HID:(hid+1) - the help button
- "HID:(hid+2)" - the back button
- "HID:(hid+3)" - the next button
- "HID:(hid+4)" - the create button
- "HID:(hid+5)" - the cancel button
- @param xMSF
- @param hid_
- '''
- def __init__(self, xMSF, hid_):
- super(WizardDialog,self).__init__(xMSF)
- self.__hid = hid_
- self.iButtonWidth = 50
- self.nNewStep = 1
- self.nOldStep = 1
- self.nMaxStep = 1
- self.bTerminateListenermustberemoved = True
- self.oRoadmap = None
- self.terminateListener = None
- def activate(self):
- try:
- self.xUnoDialog.toFront()
- except Exception:
- pass
- # do nothing;
- def itemStateChanged(self, itemEvent):
- try:
- self.nNewStep = itemEvent.ItemId
- self.nOldStep = int(self.xDialogModel.Step)
- if self.nNewStep != self.nOldStep:
- self.switchToStep()
- except Exception:
- traceback.print_exc()
- def setDialogProperties(self, closeable, height, moveable, position_x,
- position_Y, step, tabIndex, title, width):
- uno.invoke(self.xDialogModel, "setPropertyValues",
- ((PropertyNames.PROPERTY_CLOSEABLE,
- PropertyNames.PROPERTY_HEIGHT,
- PropertyNames.PROPERTY_MOVEABLE,
- PropertyNames.PROPERTY_POSITION_X,
- PropertyNames.PROPERTY_POSITION_Y,
- PropertyNames.PROPERTY_STEP,
- PropertyNames.PROPERTY_TABINDEX,
- PropertyNames.PROPERTY_TITLE,
- PropertyNames.PROPERTY_WIDTH),
- (closeable, height, moveable, position_x, position_Y, step,
- tabIndex, title, width)))
- def setRoadmapInteractive(self, _bInteractive):
- self.oRoadmap.Activated = _bInteractive
- def setRoadmapComplete(self, bComplete):
- self.oRoadmap.Complete = bComplete
- def isRoadmapComplete(self):
- try:
- return bool(self.oRoadmap.Complete)
- except Exception:
- traceback.print_exc()
- return False
- def setCurrentRoadmapItemID(self, ID):
- if self.oRoadmap is not None:
- nCurItemID = self.getCurrentRoadmapItemID()
- if nCurItemID != ID:
- self.oRoadmap.CurrentItemID = ID
- def getCurrentRoadmapItemID(self):
- try:
- return int(self.oRoadmap.CurrentItemID)
- except Exception:
- traceback.print_exc()
- return -1
- def initializePaths(self):
- xPropertySet = \
- self.xMSF.createInstance("com.sun.star.util.PathSettings")
- self.sUserTemplatePath = \
- xPropertySet.getPropertyValue("Template_writable")
- myFA = FileAccess(self.xMSF)
- aInternalPaths = xPropertySet.getPropertyValue("Template_internal")
- self.sTemplatePath = ""
- for path in aInternalPaths:
- if myFA.exists(path + "/wizard", False):
- self.sTemplatePath = path
- break
- if self.sTemplatePath == "":
- raise Exception("could not find wizard templates")
- def addRoadmap(self):
- try:
- iDialogHeight = self.xDialogModel.Height
- # the roadmap control has got no real TabIndex ever
- # that is not correct, but changing this would need time,
- # so it is used without TabIndex as before
- xRoadmapControl = self.insertControlModel(
- "com.sun.star.awt.UnoControlRoadmapModel",
- "rdmNavi",
- (PropertyNames.PROPERTY_HEIGHT,
- PropertyNames.PROPERTY_POSITION_X,
- PropertyNames.PROPERTY_POSITION_Y,
- PropertyNames.PROPERTY_STEP,
- PropertyNames.PROPERTY_TABINDEX, "Tabstop",
- PropertyNames.PROPERTY_WIDTH),
- ((iDialogHeight - 26), 0, 0, 0,
- 0, True, 85))
- self.oRoadmap = xRoadmapControl.Model
- method = getattr(self, "itemStateChanged")
- xRoadmapControl.addItemListener(
- ItemListenerProcAdapter(method))
- self.oRoadmap.Text = strings.RID_COMMON_START_16
- except NoSuchMethodException:
- from com.sun.star.awt.VclWindowPeerAttribute import OK
- from .SystemDialog import SystemDialog
- sError = "The files required could not be found.\n" + \
- "Please start the LibreOffice Setup and choose 'Repair'."
- SystemDialog.showMessageBox(super().xMSF, "ErrorBox", OK, sError)
- except Exception:
- traceback.print_exc()
- def getRoadmapItemByID(self, _ID):
- try:
- getByIndex = self.oRoadmap.getByIndex
- for i in list(range(self.oRoadmap.Count)):
- CurRoadmapItem = getByIndex(i)
- CurID = int(CurRoadmapItem.ID)
- if CurID == _ID:
- return CurRoadmapItem
- return None
- except Exception:
- traceback.print_exc()
- return None
- def switchToStep(self,_nOldStep=None, _nNewStep=None):
- if _nOldStep is not None and _nNewStep is not None:
- self.nOldStep = _nOldStep
- self.nNewStep = _nNewStep
- self.leaveStep(self.nOldStep, self.nNewStep)
- if self.nNewStep != self.nOldStep:
- if self.nNewStep == self.nMaxStep:
- self.xDialogModel.btnWizardNext.DefaultButton = False
- self.xDialogModel.btnWizardFinish.DefaultButton = True
- else:
- self.xDialogModel.btnWizardNext.DefaultButton = True
- self.xDialogModel.btnWizardFinish.DefaultButton = False
- self.changeToStep(self.nNewStep)
- self.enterStep(self.nOldStep, self.nNewStep)
- return True
- return False
- @abstractmethod
- def leaveStep(self, nOldStep, nNewStep):
- pass
- @abstractmethod
- def enterStep(self, nOldStep, nNewStep):
- pass
- def changeToStep(self, nNewStep):
- self.xDialogModel.Step = nNewStep
- self.setCurrentRoadmapItemID(nNewStep)
- self.enableNextButton(self.getNextAvailableStep() > 0)
- self.enableBackButton(nNewStep != 1)
- def drawNaviBar(self):
- try:
- curtabindex = UIConsts.SOFIRSTWIZARDNAVITABINDEX
- iButtonWidth = self.iButtonWidth
- iButtonHeight = 14
- iCurStep = 0
- iDialogHeight = self.xDialogModel.Height
- iDialogWidth = self.xDialogModel.Width
- iHelpPosX = 8
- iBtnPosY = iDialogHeight - iButtonHeight - 6
- iCancelPosX = iDialogWidth - self.iButtonWidth - 6
- iFinishPosX = iCancelPosX - 6 - self.iButtonWidth
- iNextPosX = iFinishPosX - 6 - self.iButtonWidth
- iBackPosX = iNextPosX - 3 - self.iButtonWidth
- self.insertControlModel(
- "com.sun.star.awt.UnoControlFixedLineModel",
- "lnNaviSep",
- (PropertyNames.PROPERTY_HEIGHT, "Orientation",
- PropertyNames.PROPERTY_POSITION_X,
- PropertyNames.PROPERTY_POSITION_Y,
- PropertyNames.PROPERTY_STEP,
- PropertyNames.PROPERTY_WIDTH),
- (1, 0, 0, iDialogHeight - 26, iCurStep, iDialogWidth))
- self.insertControlModel(
- "com.sun.star.awt.UnoControlFixedLineModel",
- "lnRoadSep",
- (PropertyNames.PROPERTY_HEIGHT,
- "Orientation",
- PropertyNames.PROPERTY_POSITION_X,
- PropertyNames.PROPERTY_POSITION_Y,
- PropertyNames.PROPERTY_STEP,
- PropertyNames.PROPERTY_WIDTH),
- (iBtnPosY - 6, 1, 85, 0, iCurStep, 1))
- propNames = (PropertyNames.PROPERTY_ENABLED,
- PropertyNames.PROPERTY_HEIGHT,
- PropertyNames.PROPERTY_HELPURL,
- PropertyNames.PROPERTY_LABEL,
- PropertyNames.PROPERTY_POSITION_X,
- PropertyNames.PROPERTY_POSITION_Y,
- "PushButtonType",
- PropertyNames.PROPERTY_STEP,
- PropertyNames.PROPERTY_TABINDEX,
- PropertyNames.PROPERTY_WIDTH)
- self.xDialogModel.HelpURL = HelpIds.getHelpIdString(self.__hid)
- self.insertButton("btnWizardHelp",
- WizardDialog.__HELP_ACTION_PERFORMED,
- (PropertyNames.PROPERTY_ENABLED,
- PropertyNames.PROPERTY_HEIGHT,
- PropertyNames.PROPERTY_LABEL,
- PropertyNames.PROPERTY_POSITION_X,
- PropertyNames.PROPERTY_POSITION_Y,
- "PushButtonType",
- PropertyNames.PROPERTY_STEP,
- PropertyNames.PROPERTY_TABINDEX,
- PropertyNames.PROPERTY_WIDTH),
- (True, iButtonHeight,
- strings.RID_COMMON_START_15,
- iHelpPosX, iBtnPosY,
- uno.Any("short",HELP), iCurStep,
- uno.Any("short",(curtabindex + 1)), iButtonWidth), self)
- self.insertButton("btnWizardBack",
- WizardDialog.__BACK_ACTION_PERFORMED, propNames,
- (False, iButtonHeight, HelpIds.getHelpIdString(self.__hid + 2),
- strings.RID_COMMON_START_13,
- iBackPosX, iBtnPosY, uno.Any("short",STANDARD), iCurStep,
- uno.Any("short",(curtabindex + 1)), iButtonWidth), self)
- self.insertButton("btnWizardNext",
- WizardDialog.__NEXT_ACTION_PERFORMED, propNames,
- (True, iButtonHeight, HelpIds.getHelpIdString(self.__hid + 3),
- strings.RID_COMMON_START_14,
- iNextPosX, iBtnPosY, uno.Any("short",STANDARD), iCurStep,
- uno.Any("short",(curtabindex + 1)), iButtonWidth), self)
- self.insertButton("btnWizardFinish",
- WizardDialog.__FINISH_ACTION_PERFORMED, propNames,
- (True, iButtonHeight, HelpIds.getHelpIdString(self.__hid + 4),
- strings.RID_COMMON_START_12,
- iFinishPosX, iBtnPosY, uno.Any("short",STANDARD),
- iCurStep,
- uno.Any("short",(curtabindex + 1)),
- iButtonWidth), self)
- self.insertButton("btnWizardCancel",
- WizardDialog.__CANCEL_ACTION_PERFORMED, propNames,
- (True, iButtonHeight, HelpIds.getHelpIdString(self.__hid + 5),
- strings.RID_COMMON_START_11,
- iCancelPosX, iBtnPosY, uno.Any("short",STANDARD), iCurStep,
- uno.Any("short",(curtabindex + 1)),
- iButtonWidth), self)
- self.xDialogModel.btnWizardNext.DefaultButton = True
- except Exception:
- traceback.print_exc()
- def insertRoadMapItems(self, items, enabled):
- for index, item in enumerate(items):
- try:
- oRoadmapItem = self.oRoadmap.createInstance()
- oRoadmapItem.Label = item
- oRoadmapItem.Enabled = enabled[index]
- oRoadmapItem.ID = index + 1
- self.oRoadmap.insertByIndex(index, oRoadmapItem)
- except Exception:
- traceback.print_exc()
- def enableBackButton(self, enabled):
- self.xDialogModel.btnWizardBack.Enabled = enabled
- def enableNextButton(self, enabled):
- self.xDialogModel.btnWizardNext.Enabled = enabled
- def enableFinishButton(self, enabled):
- self.xDialogModel.btnWizardFinish.Enabled = enabled
- def isStepEnabled(self, _nStep):
- try:
- xRoadmapItem = self.getRoadmapItemByID(_nStep)
- # Todo: In this case an exception should be thrown
- if xRoadmapItem is None:
- return False
- bIsEnabled = bool(xRoadmapItem.Enabled)
- return bIsEnabled
- except Exception:
- traceback.print_exc()
- return False
- def gotoPreviousAvailableStep(self):
- try:
- if self.nNewStep > 1:
- self.nOldStep = self.nNewStep
- self.nNewStep -= 1
- while self.nNewStep > 0:
- bIsEnabled = self.isStepEnabled(self.nNewStep)
- if bIsEnabled:
- break;
- self.nNewStep -= 1
- if (self.nNewStep == 0):
- self.nNewStep = self.nOldStep
- self.switchToStep()
- except Exception:
- traceback.print_exc()
- def getNextAvailableStep(self):
- if self.isRoadmapComplete():
- i = self.nNewStep + 1
- while i <= self.nMaxStep:
- if self.isStepEnabled(i):
- return i
- i += 1
- return -1
- def gotoNextAvailableStep(self):
- try:
- self.nOldStep = self.nNewStep
- self.nNewStep = self.getNextAvailableStep()
- if self.nNewStep > -1:
- self.switchToStep()
- except Exception:
- traceback.print_exc()
- @abstractmethod
- def finishWizard(self):
- pass
- def finishWizard_1(self):
- '''This function will call
- if the finish button is pressed on the UI'''
- try:
- self.enableFinishButton(False)
- success = False
- try:
- success = self.finishWizard()
- finally:
- if not success:
- self.enableFinishButton(True)
- if success:
- self.removeTerminateListener()
- except Exception:
- traceback.print_exc()
- def getCurrentStep(self):
- try:
- return int(self.xDialogModel.Step)
- except Exception:
- traceback.print_exc()
- return -1
- def cancelWizard(self):
- #can be overwritten by extending class
- self.xUnoDialog.endExecute()
- def removeTerminateListener(self):
- if self.bTerminateListenermustberemoved:
- Desktop.getDesktop(self.xMSF).removeTerminateListener(self.terminateListener)
- self.bTerminateListenermustberemoved = False
- '''
- called by the cancel button and
- by the window hidden event.
- if this method was not called before,
- perform a cancel.
- '''
- def cancelWizard_1(self):
- try:
- self.cancelWizard()
- self.removeTerminateListener()
- except Exception:
- traceback.print_exc()
- def windowHidden(self):
- self.cancelWizard_1()
- def queryTermination(self):
- self.activate()
- raise TerminationVetoException()
- def disposing(self, arg0):
- self.cancelWizard_1()
- def optCreateFromTemplateItemChanged(self):
- self.bEditTemplate = False
- def optMakeChangesItemChanged(self):
- self.bEditTemplate = True
|