diff options
Diffstat (limited to 'wizards/com/sun/star/wizards/ui/WizardDialog.py')
-rw-r--r-- | wizards/com/sun/star/wizards/ui/WizardDialog.py | 470 |
1 files changed, 470 insertions, 0 deletions
diff --git a/wizards/com/sun/star/wizards/ui/WizardDialog.py b/wizards/com/sun/star/wizards/ui/WizardDialog.py new file mode 100644 index 000000000..e59705351 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/WizardDialog.py @@ -0,0 +1,470 @@ +# +# 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 |