summaryrefslogtreecommitdiff
path: root/wizards
diff options
context:
space:
mode:
authorXisco Fauli <anistenis@gmail.com>2011-09-23 00:29:10 +0200
committerMichael Meeks <michael.meeks@suse.com>2011-12-05 20:53:22 +0000
commit21131ea640f158963d4b69b1269c0bc7e5215006 (patch)
treed9d3336fd307764a30f3366c19b6f2275ccac9dd /wizards
parent02d490ad83d31cb0dc342c6efb63837d820a8d88 (diff)
Set the python fax wizard as the default one
Diffstat (limited to 'wizards')
-rw-r--r--wizards/com/sun/star/wizards/agenda/AgendaTemplate.py1197
-rw-r--r--wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py293
-rw-r--r--wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py63
-rw-r--r--wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py463
-rw-r--r--wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py153
-rw-r--r--wizards/com/sun/star/wizards/agenda/CGAgenda.py27
-rw-r--r--wizards/com/sun/star/wizards/agenda/CGTopic.py45
-rw-r--r--wizards/com/sun/star/wizards/agenda/TopicsControl.py886
-rw-r--r--wizards/com/sun/star/wizards/common/ConfigGroup.py35
-rw-r--r--wizards/com/sun/star/wizards/common/ConfigSet.py184
-rw-r--r--wizards/com/sun/star/wizards/common/Configuration.py215
-rw-r--r--wizards/com/sun/star/wizards/common/Desktop.py230
-rw-r--r--wizards/com/sun/star/wizards/common/FileAccess.py676
-rw-r--r--wizards/com/sun/star/wizards/common/Helper.py160
-rw-r--r--wizards/com/sun/star/wizards/common/NumberFormatter.py232
-rw-r--r--wizards/com/sun/star/wizards/common/PropertySetHelper.py250
-rw-r--r--wizards/com/sun/star/wizards/common/Resource.py70
-rw-r--r--wizards/com/sun/star/wizards/common/SystemDialog.py230
-rw-r--r--wizards/com/sun/star/wizards/common/__init__.py0
-rw-r--r--wizards/com/sun/star/wizards/document/OfficeDocument.py280
-rw-r--r--wizards/com/sun/star/wizards/fax/CGFax.py31
-rw-r--r--wizards/com/sun/star/wizards/fax/CGFaxWizard.py10
-rw-r--r--wizards/com/sun/star/wizards/fax/CallWizard.py24
-rw-r--r--wizards/com/sun/star/wizards/fax/FaxDocument.py6
-rw-r--r--wizards/com/sun/star/wizards/fax/FaxWizardDialog.py7
-rw-r--r--wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py2
-rw-r--r--wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py23
-rw-r--r--wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py2
-rw-r--r--wizards/com/sun/star/wizards/fax/__init__.py0
-rw-r--r--wizards/com/sun/star/wizards/letter/CGLetter.py37
-rw-r--r--wizards/com/sun/star/wizards/letter/CGLetterWizard.py10
-rw-r--r--wizards/com/sun/star/wizards/letter/CGPaperElementLocation.py10
-rw-r--r--wizards/com/sun/star/wizards/letter/LetterDocument.py259
-rw-r--r--wizards/com/sun/star/wizards/letter/LetterWizardDialog.py1105
-rw-r--r--wizards/com/sun/star/wizards/letter/LetterWizardDialogImpl.py1196
-rw-r--r--wizards/com/sun/star/wizards/letter/LetterWizardDialogResources.py219
-rw-r--r--wizards/com/sun/star/wizards/letter/LocaleCodes.py154
-rw-r--r--wizards/com/sun/star/wizards/text/TextDocument.py262
-rw-r--r--wizards/com/sun/star/wizards/text/TextFieldHandler.py165
-rw-r--r--wizards/com/sun/star/wizards/text/TextSectionHandler.py123
-rw-r--r--wizards/com/sun/star/wizards/ui/ControlScroller.py230
-rw-r--r--wizards/com/sun/star/wizards/ui/DocumentPreview.py85
-rw-r--r--wizards/com/sun/star/wizards/ui/ImageList.py503
-rw-r--r--wizards/com/sun/star/wizards/ui/PathSelection.py121
-rw-r--r--wizards/com/sun/star/wizards/ui/PeerConfig.py62
-rw-r--r--wizards/com/sun/star/wizards/ui/UnoDialog.py411
-rw-r--r--wizards/com/sun/star/wizards/ui/UnoDialog2.py239
-rw-r--r--wizards/com/sun/star/wizards/ui/WizardDialog.py489
-rw-r--r--wizards/com/sun/star/wizards/ui/__init__.py0
-rw-r--r--wizards/com/sun/star/wizards/ui/event/DataAware.py114
-rw-r--r--wizards/com/sun/star/wizards/ui/event/ListModelBinder.py75
-rw-r--r--wizards/com/sun/star/wizards/ui/event/RadioDataAware.py37
-rw-r--r--wizards/com/sun/star/wizards/ui/event/UnoDataAware.py84
53 files changed, 11746 insertions, 38 deletions
diff --git a/wizards/com/sun/star/wizards/agenda/AgendaTemplate.py b/wizards/com/sun/star/wizards/agenda/AgendaTemplate.py
new file mode 100644
index 000000000000..d98536ec568c
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaTemplate.py
@@ -0,0 +1,1197 @@
+import uno
+from TemplateConsts import *
+from threading import RLock
+from wizards.text.TextDocument import *
+from wizards.common.FileAccess import FileAccess
+from wizards.text.TextSectionHandler import TextSectionHandler
+from TopicsControl import TopicsControl
+from datetime import date as dateTimeObject
+
+from com.sun.star.text.PlaceholderType import TEXT
+from com.sun.star.i18n.NumberFormatIndex import TIME_HHMM, DATE_SYSTEM_LONG
+
+def synchronized(lock):
+ ''' Synchronization decorator. '''
+ def wrap(f):
+ def newFunction(*args, **kw):
+ lock.acquire()
+ try:
+ return f(*args, **kw)
+ finally:
+ lock.release()
+ return newFunction
+ return wrap
+
+'''
+The classes here implement the whole document-functionality of the agenda wizard:
+the live-preview and the final "creation" of the document,
+when the user clicks "finish". <br/>
+<br/>
+<h2>Some terminology:<h2/>
+items are names or headings. we don't make any distinction.
+
+<br/>
+The Agenda Template is used as general "controller"
+of the whole document, whereas the two child-classes ItemsTable
+and TopicsTable control the item tables (note plural!) and the
+topics table (note singular).<br/>
+<br/>
+Other small classes are used to abstract the handling of cells and text and we
+try to use them as components.
+<br/><br/>
+We tried to keep the Agenda Template as flexible as possible, though there
+must be many limitations, because it is generated dynamically.<br/><br/>
+To keep the template flexible the following decisions were made:<br/>
+1. Item tables.<br/>
+1.a. there might be arbitrary number of Item tables.<br/>
+1.b. Item tables design (bordewr, background) is arbitrary.<br/>
+1.c. Items text styles are individual,
+and use stylelist styles with predefined names.<br/>
+As result the following limitations:<br/>
+Pairs of Name->value for each item.<br/>
+Tables contain *only* those pairs.<br/>
+2. Topics table.<br/>
+2.a. arbitrary structure.<br/>
+2.b. design is arbitrary.<br/>
+As result the following limitations:<br/>
+No column merge is allowed.<br/>
+One compolsary Heading row.<br/>
+<br/><br/>
+To let the template be flexible, we use a kind of "detection": we look where
+the items are read the design of each table, reaplying it after writing the
+table.AgendaTemplate.document
+<br/><br/>
+A note about threads:<br/>
+Many methods here are synchronized, in order to avoid colission made by
+events fired too often.
+@author rpiterman
+'''
+class AgendaTemplate(TextDocument):
+
+ writtenTopics = []
+ itemsCache = None
+ _allItems = []
+ items = []
+ itemsMap = {}
+ document = None
+ textSectionHandler = None
+ template = None
+ agenda = None
+ lock = RLock()
+
+ '''constructor. The document is *not* loaded here.
+ only some formal members are set.
+ @param AgendaTemplate.document_ service factory.
+ @param agenda_ the data model (CGAgenda)
+ @param resources_ resources.
+ '''
+
+ def __init__(self, xmsf_, agenda_, resources_, listener):
+ super(AgendaTemplate,self).__init__(xmsf_,listener, None,
+ "WIZARD_LIVE_PREVIEW")
+ AgendaTemplate.agenda = agenda_
+ self.resources = resources_
+
+ if AgendaTemplate.itemsCache is None:
+ self.initItemsCache()
+
+ AgendaTemplate._allItems = None
+
+ @synchronized(lock)
+ def load(self, templateURL, topics):
+ AgendaTemplate.template = self.calcTemplateName(templateURL)
+ AgendaTemplate.document = self.loadAsPreview(templateURL, False)
+ self.xFrame.ComponentWindow.Enable = False
+ self.xTextDocument.lockControllers()
+ self.initialize()
+ self.initializeData(topics)
+ self.xTextDocument.unlockControllers()
+
+ '''
+ The agenda templates are in format of aw-XXX.ott
+ the templates name is then XXX.ott.
+ This method calculates it.
+ @param url
+ @return the template name without the "aw-" at the beginning.
+ '''
+
+ def calcTemplateName(self, url):
+ return FileAccess.connectURLs(
+ FileAccess.getParentDir(url), FileAccess.getFilename(url)[3:])
+
+ '''synchronize the document to the model.<br/>
+ this method rewrites all titles, item tables , and the topics table-
+ thus synchronizing the document to the data model (CGAgenda).
+ @param topicsData since the model does not contain Topics
+ information (it is only actualized on save) the given list
+ supplies this information.
+ '''
+
+ def initializeData(self, topicsData):
+ for i in self.itemsTables:
+ try:
+ i.write("")
+ except Exception, ex:
+ traceback.print_exc()
+
+ self.redrawTitle("txtTitle")
+ self.redrawTitle("txtDate")
+ self.redrawTitle("txtTime")
+ self.redrawTitle("cbLocation")
+ if AgendaTemplate.agenda.cp_TemplateName is None:
+ AgendaTemplate.agenda.cp_TemplateName = ""
+ self.setTemplateTitle(AgendaTemplate.agenda.cp_TemplateName)
+
+ '''redraws/rewrites the table which contains the given item
+ This method is called when the user checks/unchecks an item.
+ The table is being found, in which the item is, and redrawn.
+ @param itemName
+ '''
+
+ @classmethod
+ @synchronized(lock)
+ def redraw(self, itemName):
+ AgendaTemplate.xTextDocument.lockControllers()
+ try:
+ # get the table in which the item is...
+ itemsTable = AgendaTemplate.itemsMap[itemName]
+ # rewrite the table.
+ itemsTable.write(None)
+ except Exception, e:
+ traceback.print_exc()
+ AgendaTemplate.xTextDocument.unlockControllers()
+
+ '''update the documents title property to the given title
+ @param newTitle title.
+ '''
+
+ @synchronized(lock)
+ def setTemplateTitle(self, newTitle):
+ self.m_xDocProps.Title = newTitle
+
+ '''checks the data model if the
+ item corresponding to the given string should be shown
+ @param itemName a string representing an Item (name or heading).
+ @return true if the model specifies that the item should be displayed.
+ '''
+
+ @classmethod
+ def isShowItem(self, itemName):
+ if itemName == FILLIN_MEETING_TYPE:
+ return AgendaTemplate.agenda.cp_ShowMeetingType
+ elif itemName == FILLIN_READ:
+ return AgendaTemplate.agenda.cp_ShowRead
+ elif itemName == FILLIN_BRING:
+ return AgendaTemplate.agenda.cp_ShowBring
+ elif itemName == FILLIN_NOTES:
+ return AgendaTemplate.agenda.cp_ShowNotes
+ elif itemName == FILLIN_FACILITATOR:
+ return AgendaTemplate.agenda.cp_ShowFacilitator
+ elif itemName == FILLIN_TIMEKEEPER:
+ return AgendaTemplate.agenda.cp_ShowTimekeeper
+ elif itemName == FILLIN_NOTETAKER:
+ return AgendaTemplate.agenda.cp_ShowNotetaker
+ elif itemName == FILLIN_PARTICIPANTS:
+ return AgendaTemplate.agenda.cp_ShowAttendees
+ elif itemName == FILLIN_CALLED_BY:
+ return AgendaTemplate.agenda.cp_ShowCalledBy
+ elif itemName == FILLIN_OBSERVERS:
+ return AgendaTemplate.agenda.cp_ShowObservers
+ elif itemName == FILLIN_RESOURCE_PERSONS:
+ return AgendaTemplate.agenda.cp_ShowResourcePersons
+ else:
+ raise ValueError("No such item")
+
+ '''itemsCache is a Map containing all agenda item. These are object which
+ "write themselfs" to the table, given a table cursor.
+ A cache is used in order to reuse the objects, instead of recreate them.
+ This method fills the cache will all items objects (names and headings).
+ '''
+
+ def initItemsCache(self):
+ AgendaTemplate.itemsCache = {}
+ # Headings
+ AgendaTemplate.itemsCache[FILLIN_MEETING_TYPE] = AgendaItem(
+ FILLIN_MEETING_TYPE,
+ TextElement (self.resources.itemMeetingType),
+ PlaceholderElement(
+ self.resources.reschkMeetingTitle_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_BRING] = AgendaItem(
+ FILLIN_BRING, TextElement (self.resources.itemBring),
+ PlaceholderElement (
+ self.resources.reschkBring_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_READ] = AgendaItem (
+ FILLIN_READ, TextElement (self.resources.itemRead),
+ PlaceholderElement (
+ self.resources.reschkRead_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_NOTES] = AgendaItem (
+ FILLIN_NOTES, TextElement (self.resources.itemNote),
+ PlaceholderElement (
+ self.resources.reschkNotes_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+
+ # Names
+ AgendaTemplate.itemsCache[FILLIN_CALLED_BY] = AgendaItem(
+ FILLIN_CALLED_BY,
+ TextElement (self.resources.itemCalledBy),
+ PlaceholderElement (
+ self.resources.reschkConvenedBy_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_FACILITATOR] = AgendaItem(
+ FILLIN_FACILITATOR,
+ TextElement (self.resources.itemFacilitator),
+ PlaceholderElement (
+ self.resources.reschkPresiding_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_PARTICIPANTS] = AgendaItem(
+ FILLIN_PARTICIPANTS,
+ TextElement (self.resources.itemAttendees),
+ PlaceholderElement(
+ self.resources.reschkAttendees_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_NOTETAKER] = AgendaItem(
+ FILLIN_NOTETAKER,
+ TextElement(self.resources.itemNotetaker),
+ PlaceholderElement(
+ self.resources.reschkNoteTaker_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_TIMEKEEPER] = AgendaItem(
+ FILLIN_TIMEKEEPER,
+ TextElement (self.resources.itemTimekeeper),
+ PlaceholderElement(
+ self.resources.reschkTimekeeper_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_OBSERVERS] = AgendaItem(
+ FILLIN_OBSERVERS,
+ TextElement(self.resources.itemObservers),
+ PlaceholderElement(
+ self.resources.reschkObservers_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_RESOURCE_PERSONS] = AgendaItem(
+ FILLIN_RESOURCE_PERSONS,
+ TextElement(self.resources.itemResource),
+ PlaceholderElement(
+ self.resources.reschkResourcePersons_value,
+ self.resources.resPlaceHolderHint, self.xMSF))
+
+ '''Initializes a template.<br/>
+ This method does the following tasks:<br/>
+ Get a Time and Date format for the document, and retrieve the null
+ date of the document (which is document-specific).<br/>
+ Initializes the Items Cache map.
+ Analyses the document:<br/>
+ -find all "fille-ins" (apear as &gt;xxx&lt; in the document).
+ -analyze all items sections (and the tables in them).
+ -locate the titles and actualize them
+ -analyze the topics table
+ '''
+
+ def initialize(self):
+ '''
+ Get the default locale of the document,
+ and create the date and time formatters.
+ '''
+ AgendaTemplate.dateUtils = Helper.DateUtils(
+ self.xMSF, AgendaTemplate.document)
+ AgendaTemplate.formatter = AgendaTemplate.dateUtils.formatter
+ AgendaTemplate.dateFormat = AgendaTemplate.dateUtils.getFormat(DATE_SYSTEM_LONG)
+ AgendaTemplate.timeFormat = AgendaTemplate.dateUtils.getFormat(TIME_HHMM)
+
+ '''
+ get the document properties object.
+ '''
+
+ self.m_xDocProps = AgendaTemplate.document.DocumentProperties
+ self.initItemsCache()
+ AgendaTemplate._allItems = self.searchFillInItems()
+ self.initializeTitles()
+ self.initializeItemsSections()
+ AgendaTemplate.textSectionHandler = TextSectionHandler(
+ AgendaTemplate.document, AgendaTemplate.document)
+ self.topics = Topics()
+ del AgendaTemplate._allItems[:]
+ AgendaTemplate._allItems = None
+
+ '''
+ locates the titles (name, location, date, time)
+ and saves a reference to thier Text ranges.
+ '''
+
+ def initializeTitles(self):
+ i = 0
+ while i < len(AgendaTemplate._allItems):
+ workwith = AgendaTemplate._allItems[i]
+ text = workwith.String.lstrip().lower()
+ if text == FILLIN_TITLE:
+ AgendaTemplate.teTitle = PlaceholderTextElement(
+ workwith, self.resources.resPlaceHolderTitle,
+ self.resources.resPlaceHolderHint,
+ AgendaTemplate.document)
+ AgendaTemplate.trTitle = workwith
+ del AgendaTemplate._allItems[i]
+ i -= 1
+ elif text == FILLIN_DATE:
+ AgendaTemplate.teDate = PlaceholderTextElement(
+ workwith, self.resources.resPlaceHolderDate,
+ self.resources.resPlaceHolderHint,
+ AgendaTemplate.document)
+ AgendaTemplate.trDate = workwith
+ del AgendaTemplate._allItems[i]
+ i -= 1
+ elif text == FILLIN_TIME:
+ AgendaTemplate.teTime = PlaceholderTextElement(
+ workwith, self.resources.resPlaceHolderTime,
+ self.resources.resPlaceHolderHint,
+ AgendaTemplate.document)
+ AgendaTemplate.trTime = workwith
+ del AgendaTemplate._allItems[i]
+ i -= 1
+ elif text == FILLIN_LOCATION:
+ AgendaTemplate.teLocation = PlaceholderTextElement(
+ workwith, self.resources.resPlaceHolderLocation,
+ self.resources.resPlaceHolderHint,
+ AgendaTemplate.document)
+ AgendaTemplate.trLocation = workwith
+ del AgendaTemplate._allItems[i]
+ i -= 1
+ i += 1
+
+ '''
+ searches the document for items in the format "&gt;*&lt;"
+ @return a vector containing the XTextRanges of the found items
+ '''
+
+ def searchFillInItems(self):
+ try:
+ sd = AgendaTemplate.document.createSearchDescriptor()
+ sd.setSearchString("<[^>]+>")
+ sd.setPropertyValue("SearchRegularExpression", True)
+ sd.setPropertyValue("SearchWords", True)
+ ia = AgendaTemplate.document.findAll(sd)
+ try:
+ l = [ia.getByIndex(i) for i in xrange(ia.Count)]
+ except Exception, ex:
+ print "Nonfatal Error in finding fillins."
+ return l
+ except Exception, ex:
+ traceback.print_exc()
+ raise AttributeError (
+ "Fatal Error: Loading template failed: searching fillins failed")
+
+ '''
+ analyze the item sections in the template.
+ delegates the analyze of each table to the ItemsTable class.
+ '''
+
+ def initializeItemsSections(self):
+ sections = self.getSections(AgendaTemplate.document, SECTION_ITEMS)
+ # for each section - there is a table...
+ self.itemsTables = []
+ for i in sections:
+ try:
+ self.itemsTables.append(
+ ItemsTable(self.getSection(i), self.getTable(i)))
+ except Exception, ex:
+ traceback.print_exc()
+ raise AttributeError (
+ "Fatal Error while initialilzing \
+ Template: items table in section " + i)
+
+
+ def getSections(self, document, s):
+ allSections = document.TextSections.ElementNames
+ return self.getNamesWhichStartWith(allSections, s)
+
+ @classmethod
+ def getSection(self, name):
+ return getattr(AgendaTemplate.document.TextSections, name)
+
+ @classmethod
+ def getTable(self, name):
+ return getattr(AgendaTemplate.document.TextTables, name)
+
+ @classmethod
+ @synchronized(lock)
+ def redrawTitle(self, controlName):
+ try:
+ if controlName == "txtTitle":
+ self.writeTitle(
+ AgendaTemplate.teTitle, AgendaTemplate.trTitle,
+ AgendaTemplate.agenda.cp_Title)
+ elif controlName == "txtDate":
+ self.writeTitle(
+ AgendaTemplate.teDate, AgendaTemplate.trDate,
+ self.getDateString(AgendaTemplate.agenda.cp_Date))
+ elif controlName == "txtTime":
+ self.writeTitle(
+ AgendaTemplate.teTime, AgendaTemplate.trTime,
+ self.getTimeString(AgendaTemplate.agenda.cp_Time))
+ elif controlName == "cbLocation":
+ self.writeTitle(
+ AgendaTemplate.teLocation, AgendaTemplate.trLocation,
+ AgendaTemplate.agenda.cp_Location)
+ else:
+ raise IllegalArgumentException ("No such title control...")
+ except Exception:
+ traceback.print_exc()
+
+ @classmethod
+ def writeTitle(self, te, tr, text):
+ if text is None:
+ te.text = ""
+ else:
+ te.text = text
+ te.write(tr)
+
+ @classmethod
+ def getDateString(self, d):
+ if d is None or d == "":
+ return ""
+ date = int(d)
+ year = date / 10000
+ month = (date % 10000) / 100
+ day = date % 100
+ dateObject = dateTimeObject(year, month, day)
+ return AgendaTemplate.dateUtils.format(
+ AgendaTemplate.dateFormat, dateObject)
+
+ @classmethod
+ def getTimeString(self, s):
+ if s is None or s == "":
+ return ""
+ time = int(s)
+ t = ((time / float(1000000)) / float(24)) \
+ + ((time % 1000000) / float(1000000)) / float(35)
+ return self.formatter.convertNumberToString(AgendaTemplate.timeFormat, t)
+
+ @synchronized(lock)
+ def finish(self, topics):
+ self.createMinutes(topics)
+ self.deleteHiddenSections()
+ AgendaTemplate.textSectionHandler.removeAllTextSections()
+
+ '''
+ hidden sections exist when an item's section is hidden because the
+ user specified not to display any items which it contains.
+ When finishing the wizard removes this sections entireley from the document.
+ '''
+
+ def deleteHiddenSections(self):
+ allSections = AgendaTemplate.document.TextSections.ElementNames
+ try:
+ for i in allSections:
+ self.section = self.getSection(i)
+ visible = bool(Helper.getUnoPropertyValue(
+ self.section, "IsVisible"))
+ if not visible:
+ self.section.Anchor.String = ""
+
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''
+ create the minutes for the given topics or remove the minutes
+ section from the document.
+ If no topics are supplied, or the user specified not to create minuts,
+ the minutes section will be removed,
+ @param topicsData supplies PropertyValue arrays containing
+ the values for the topics.
+ '''
+
+ @synchronized(lock)
+ def createMinutes(self, topicsData):
+ # if the minutes section should be removed (the
+ # user did not check "create minutes")
+ if not AgendaTemplate.agenda.cp_IncludeMinutes \
+ or len(topicsData) <= 1:
+ try:
+ minutesAllSection = self.getSection(SECTION_MINUTES_ALL)
+ minutesAllSection.Anchor.String = ""
+ except Exception, ex:
+ traceback.print_exc()
+
+ # the user checked "create minutes"
+ else:
+ try:
+ topicStartTime = int(AgendaTemplate.agenda.cp_Time)
+ #first I replace the minutes titles...
+ AgendaTemplate.items = self.searchFillInItems()
+ itemIndex = 0
+ for item in self.items:
+ itemText = item.String.lstrip().lower()
+ if itemText == FILLIN_MINUTES_TITLE:
+ self.fillMinutesItem(
+ item, AgendaTemplate.agenda.cp_Title,
+ self.resources.resPlaceHolderTitle)
+ elif itemText == FILLIN_MINUTES_LOCATION:
+ self.fillMinutesItem(
+ item, AgendaTemplate.agenda.cp_Location,
+ self.resources.resPlaceHolderLocation)
+ elif itemText == FILLIN_MINUTES_DATE:
+ self.fillMinutesItem(
+ item, getDateString(AgendaTemplate.agenda.cp_Date),
+ self.resources.resPlaceHolderDate)
+ elif itemText == FILLIN_MINUTES_TIME:
+ self.fillMinutesItem(
+ item, getTimeString(AgendaTemplate.agenda.cp_Time),
+ self.resources.resPlaceHolderTime)
+
+ self.items.clear()
+ '''
+ now add minutes for each topic.
+ The template contains *one* minutes section, so
+ we first use the one available, and then add a one...
+ topics data has *always* an empty topic at the end...
+ '''
+
+ for i in xrange(len(topicsData) - 1):
+ topic = topicsData[i]
+ AgendaTemplate.items = self.searchFillInItems()
+ itemIndex = 0
+ for item in self.items:
+ itemText = item.String.lstrip().lower()
+ if itemText == FILLIN_MINUTE_NUM:
+ fillMinutesItem(item, topic[0].Value, "")
+ elif itemText == FILLIN_MINUTE_TOPIC:
+ fillMinutesItem(item, topic[1].Value, "")
+ elif itemText == FILLIN_MINUTE_RESPONSIBLE:
+ fillMinutesItem(item, topic[2].Value, "")
+ elif itemText == FILLIN_MINUTE_TIME:
+ topicTime = 0
+ try:
+ topicTime = topic[3].Value
+ except Exception, ex:
+ pass
+
+ '''
+ if the topic has no time, we do not
+ display any time here.
+ '''
+ if topicTime == 0 or topicStartTime == 0:
+ time = topic[3].Value
+ else:
+ time = getTimeString(str(topicStartTime)) + " - "
+ topicStartTime += topicTime * 1000
+ time += getTimeString(str(topicStartTime))
+
+ fillMinutesItem(item, time, "")
+
+ AgendaTemplate.textSectionHandler.removeTextSectionbyName(
+ SECTION_MINUTES)
+ # after the last section we do not insert a one.
+ if i < len(topicsData) - 2:
+ AgendaTemplate.textSectionHandler.insertTextSection(
+ SECTION_MINUTES, AgendaTemplate.template, False)
+
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''given a text range and a text, fills the given
+ text range with the given text.
+ If the given text is empty, uses a placeholder with the giveb
+ placeholder text.
+ @param range text range to fill
+ @param text the text to fill to the text range object.
+ @param placeholder the placeholder text to use, if the
+ text argument is empty (null or "")
+ '''
+
+ def fillMinutesItem(self, Range, text, placeholder):
+ paraStyle = Helper.getUnoPropertyValue(Range, "ParaStyleName")
+ Range.setString(text)
+ Helper.setUnoPropertyValue(Range, "ParaStyleName", paraStyle)
+ if text == None or text == "":
+ if placeholder != None and not placeholder == "":
+ placeHolder = createPlaceHolder(
+ AgendaTemplate.document, placeholder,
+ self.resources.resPlaceHolderHint)
+ try:
+ Range.Start.Text.insertTextContent(
+ Range.Start, placeHolder, True)
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''creates a placeholder field with the given text and given hint.
+ @param AgendaTemplate.document service factory
+ @param ph place holder text
+ @param hint hint text
+ @return the place holder field.
+ '''
+
+ @classmethod
+ def createPlaceHolder(self, xmsf, ph, hint):
+ try:
+ placeHolder = xmsf.createInstance(
+ "com.sun.star.text.TextField.JumpEdit")
+ except Exception, ex:
+ traceback.print_exc()
+ return None
+
+ Helper.setUnoPropertyValue(placeHolder, "PlaceHolder", ph)
+ Helper.setUnoPropertyValue(placeHolder, "Hint", hint)
+ Helper.setUnoPropertyValue(
+ placeHolder, "PlaceHolderType", uno.Any("short",TEXT))
+ return placeHolder
+
+ def getNamesWhichStartWith(self, allNames, prefix):
+ v = []
+ for i in allNames:
+ if i.startswith(prefix):
+ v.append(i)
+ return v
+
+ '''Convenience method for inserting some cells into a table.
+ @param table
+ @param start
+ @param count
+ '''
+
+ @classmethod
+ def insertTableRows(self, table, start, count):
+ rows = table.Rows
+ rows.insertByIndex(start, count)
+
+ '''returns the row index for this cell name.
+ @param cellName
+ @return the row index for this cell name.
+ '''
+
+ @classmethod
+ def getRowIndex(self, cellName):
+ return int(cellName.RangeName[1:])
+
+ '''returns the rows count of this table, assuming
+ there is no vertical merged cells.
+ @param table
+ @return the rows count of the given table.
+ '''
+
+ @classmethod
+ def getRowCount(self, table):
+ cells = table.getCellNames()
+ return int(cells[len(cells) - 1][1:])
+
+class ItemsTable(object):
+ '''
+ the items in the table.
+ '''
+ items = []
+ table = None
+
+ def __init__(self, section_, table_):
+ ItemsTable.table = table_
+ self.section = section_
+ self.items = []
+ '''
+ go through all <*> items in the document
+ and each one if it is in this table.
+ If they are, register them to belong here, notice their order
+ and remove them from the list of all <*> items, so the next
+ search will be faster.
+ '''
+ i = 0
+ while i < len(AgendaTemplate._allItems):
+ workwith = AgendaTemplate._allItems[i]
+ t = Helper.getUnoPropertyValue(workwith, "TextTable")
+ if t == ItemsTable.table:
+ iText = workwith.String.lower().lstrip()
+ ai = AgendaTemplate.itemsCache[iText]
+ if ai is not None:
+ self.items.append(ai)
+ del AgendaTemplate._allItems[i]
+ AgendaTemplate.itemsMap[iText] = self
+ i -= 1
+ i += 1
+
+ '''
+ link the section to the template. this will restore the original table
+ with all the items.<br/>
+ then break the link, to make the section editable.<br/>
+ then, starting at cell one, write all items that should be visible.
+ then clear the rest and remove obsolete rows.
+ If no items are visible, hide the section.
+ @param dummy we need a param to make this an Implementation
+ of AgendaElement.
+ @throws Exception
+ '''
+
+ def write(self, dummy):
+ with AgendaTemplate.lock:
+ name = self.section.Name
+ # link and unlink the section to the template.
+ AgendaTemplate.textSectionHandler.linkSectiontoTemplate(
+ AgendaTemplate.template, name, self.section)
+ AgendaTemplate.textSectionHandler.breakLinkOfTextSection(
+ self.section)
+ # we need to get a instance after linking.
+ ItemsTable.table = AgendaTemplate.getTable(name)
+ self.section = AgendaTemplate.getSection(name)
+ cursor = ItemsTable.table.createCursorByCellName("A1")
+ # should this section be visible?
+ visible = False
+ # write items
+ # ===========
+ cellName = ""
+ '''
+ now go through all items that belong to this
+ table. Check each one agains the model. If it should
+ be display, call it's write method.
+ All items are of type AgendaItem which means they write
+ two cells to the table: a title (text) and a placeholder.
+ see AgendaItem class below.
+ '''
+ for i in self.items:
+ if AgendaTemplate.isShowItem(i.name):
+ visible = True
+ i.table = ItemsTable.table
+ i.write(cursor)
+ # I store the cell name which was last written...
+ cellName = cursor.RangeName
+ cursor.goRight(1, False)
+
+ if visible:
+ boolean = True
+ else:
+ boolean = False
+ Helper.setUnoPropertyValue(self.section, "IsVisible", boolean)
+ if not visible:
+ return
+ '''
+ remove obsolete rows
+ ====================
+ if the cell that was last written is the current cell,
+ it means this is the end of the table, so we end here.
+ (because after getting the cellName above,
+ I call the goRight method.
+ If it did not go right, it means its the last cell.
+ '''
+
+ if cellName == cursor.RangeName:
+ return
+ '''
+ if not, we continue and clear all cells until
+ we are at the end of the row.
+ '''
+
+ while not cellName == cursor.RangeName and \
+ not cursor.RangeName.startswith("A"):
+ cell = ItemsTable.table.getCellByName(cursor.RangeName)
+ cell.String = ""
+ cellName = cursor.RangeName
+ cursor.goRight(1, False)
+
+ '''
+ again: if we are at the end of the table, end here.
+ '''
+ if cellName == cursor.RangeName:
+ return
+
+ rowIndex = AgendaTemplate.getRowIndex(cursor)
+ rowsCount = AgendaTemplate.getRowCount(ItemsTable.table)
+ '''
+ now before deleteing i move the cursor up so it
+ does not disappear, because it will crash office.
+ '''
+ cursor.gotoStart(False)
+
+'''
+This class handles the preview of the topics table.
+You can call it the controller of the topics table.
+It differs from ItemsTable in that it has no data model -
+the update is done programttically.<br/>
+<br/>
+The decision to make this class a class by its own
+was done out of logic reasons and not design/functionality reasons,
+since there is anyway only one instance of this class at runtime
+it could have also be implemented in the AgendaTemplate class
+but for clarity and separation I decided to make a sub class for it.
+
+@author rp143992
+'''
+
+class Topics(object):
+ '''Analyze the structure of the Topics table.
+ The structure Must be as follows:<br>
+ -One Header Row. <br>
+ -arbitrary number of rows per topic <br>
+ -arbitrary content in the topics row <br>
+ -only soft formatting will be restored. <br>
+ -the topic rows must repeat three times. <br>
+ -in the topics rows, placeholders for number, topic, responsible,
+ and duration must be placed.<br><br>
+ A word about table format: to reconstruct the format of the table we hold
+ to the following formats: first row (header), topic, and last row.
+ We hold the format of the last row, because one might wish to give it
+ a special format, other than the one on the bottom of each topic.
+ The left and right borders of the whole table are, on the other side,
+ part of the topics rows format, and need not be preserved seperateley.
+ '''
+ table = None
+ lastRowFormat = []
+ numCell = -1
+ topicCell = -1
+ responsibleCell = -1
+ timeCell = -1
+ rowsPerTopic = None
+ topicCells = []
+
+ def __init__(self):
+ self.topicItems = {}
+ self.firstRowFormat = []
+ # This is the topics table. say hallo :-)
+ try:
+ Topics.table = AgendaTemplate.getTable(SECTION_TOPICS)
+ except Exception, ex:
+ traceback.print_exc()
+ raise AttributeError (
+ "Fatal error while loading template: table " + \
+ SECTION_TOPICS + " could not load.")
+
+ '''
+ first I store all <*> ranges
+ which are in the topics table.
+ I store each <*> range in this - the key
+ is the cell it is in. Later when analyzing the topic,
+ cell by cell, I check in this map to know
+ if a cell contains a <*> or not.
+ '''
+ items = {}
+ for i in AgendaTemplate._allItems:
+ t = Helper.getUnoPropertyValue(i, "TextTable")
+ if t == Topics.table:
+ cell = Helper.getUnoPropertyValue(i, "Cell")
+ iText = cell.CellName
+ items[iText] = i
+
+ '''
+ in the topics table, there are always one
+ title row and three topics defined.
+ So no mutter how many rows a topic takes - we
+ can restore its structure and format.
+ '''
+ rows = AgendaTemplate.getRowCount(Topics.table)
+ Topics.rowsPerTopic = (rows - 1) / 3
+ firstCell = "A" + str(1 + Topics.rowsPerTopic + 1)
+ afterLastCell = "A" + str(1 + (Topics.rowsPerTopic * 2) + 1)
+ # go to the first row of the 2. topic
+ cursor = Topics.table.createCursorByCellName(firstCell)
+ # analyze the structure of the topic rows.
+ while not cursor.RangeName == afterLastCell:
+ cell = Topics.table.getCellByName(cursor.RangeName)
+ # first I store the content and para style of the cell
+ ae = TextElement(cell)
+ # if the cell contains a relevant <...>
+ # i add the text element to the hash,
+ # so it's text can be updated later.
+ try:
+ if items[cell.CellName] is not None:
+ self.topicItems[cell.String.lower().lstrip()] = ae
+ except KeyError:
+ pass
+
+ Topics.topicCells.append(ae)
+ # goto next cell.
+ cursor.goRight(1, False)
+ '''
+ now - in which cell is every fillin?
+ '''
+
+ Topics.numCell = Topics.topicCells.index(
+ self.topicItems[FILLIN_TOPIC_NUMBER])
+ Topics.topicCell = Topics.topicCells.index(
+ self.topicItems[FILLIN_TOPIC_TOPIC])
+ Topics.responsibleCell = Topics.topicCells.index(
+ self.topicItems[FILLIN_TOPIC_RESPONSIBLE])
+ Topics.timeCell = Topics.topicCells.index(
+ self.topicItems[FILLIN_TOPIC_TIME])
+
+ '''@param topic the topic number to write
+ @param data the data of the topic.
+ @return the number of rows that have been added
+ to the table. 0 or a negative number: no rows added.
+ '''
+
+ @classmethod
+ def write2(self, topic, data):
+ if topic >= len(AgendaTemplate.writtenTopics):
+ size = topic - len(AgendaTemplate.writtenTopics)
+ AgendaTemplate.writtenTopics += [None] * size
+ AgendaTemplate.writtenTopics.insert(topic, "")
+ # make sure threr are enough rows for me...
+ rows = AgendaTemplate.getRowCount(Topics.table)
+ reqRows = 1 + (topic + 1) * Topics.rowsPerTopic
+ firstRow = reqRows - Topics.rowsPerTopic + 1
+ diff = reqRows - rows
+ if diff > 0:
+ AgendaTemplate.insertTableRows(Topics.table, rows, diff)
+ # set the item's text...
+
+ self.setItemText(Topics.numCell, data[0].Value)
+ self.setItemText(Topics.topicCell, data[1].Value)
+ self.setItemText(Topics.responsibleCell, data[2].Value)
+ self.setItemText(Topics.timeCell, data[3].Value)
+ # now write !
+ cursor = Topics.table.createCursorByCellName("A" + str(firstRow))
+ for i in Topics.topicCells:
+ i.write(Topics.table.getCellByName(cursor.RangeName))
+ cursor.goRight(1, False)
+ # now format !
+ cursor.gotoCellByName("A" + str(firstRow), False)
+ return diff
+
+ '''check if the topic with the given index is written to the table.
+ @param topic the topic number (0 base)
+ @return true if the topic is already written to the table. False if not.
+ (false would mean rows must be added to the table in order to
+ be able to write this topic).
+ '''
+
+ def isWritten(self, topic):
+ return (len(AgendaTemplate.writtenTopics) > topic \
+ and AgendaTemplate.writtenTopics[topic] is not None)
+
+ '''rewrites a single cell containing.
+ This is used in order to refresh the topic/responsible/duration data
+ in the preview document, in response to a change in the gui (by the user)
+ Since the structure of the topics table is flexible,
+ we don't reference a cell number. Rather, we use "what" argument to
+ specify which cell should be redrawn.
+ The Topics object, which analyzed the structure of the topics table appon
+ initialization, refreshes the approperiate cell.
+ @param topic index of the topic (0 based).
+ @param what 0 for num, 1 for topic, 2 for responsible, 3 for duration
+ @param data the row's data.
+ @throws Exception if something goes wrong (thow nothing should)
+ '''
+
+ def writeCell(self, topic, what, data):
+ # if the whole row should be written...
+ if not self.isWritten(topic):
+ self.write(topic, data)
+ # write only the "what" cell.
+ else:
+ # calculate the table row.
+ firstRow = 1 + (topic * Topics.rowsPerTopic) + 1
+ # go to the first cell of this topic.
+ cursor = Topics.table.createCursorByCellName("A" + str(firstRow))
+ te = None
+ cursorMoves = 0
+ if what == 0:
+ te = self.setItemText(Topics.numCell, data[0].Value)
+ cursorMoves = Topics.numCell
+ elif what == 1:
+ te = self.setItemText(Topics.topicCell, data[1].Value)
+ cursorMoves = Topics.topicCell
+ elif what == 2:
+ te = self.setItemText(Topics.responsibleCell, data[2].Value)
+ cursorMoves = Topics.responsibleCell
+ elif what == 3:
+ te = self.setItemText(Topics.timeCell, data[3].Value)
+ cursorMoves = Topics.timeCell
+
+ # move the cursor to the needed cell...
+ cursor.goRight(cursorMoves, False)
+ xc = Topics.table.getCellByName(cursor.RangeName)
+ # and write it !
+ te.write(xc)
+
+ '''writes the given topic.
+ if the first topic was involved, reformat the
+ first row.
+ If any rows were added to the table, reformat
+ the last row.
+ @param topic the index of the topic to write.
+ @param data the topic's data. (see TopicsControl
+ for explanation about the topics data model)
+ @throws Exception if something goes wrong (though nothing should).
+ '''
+
+ def write(self, topic, data):
+ diff = self.write2(topic, data)
+ '''if the first topic has been written,
+ one needs to reformat the first row.
+ '''
+ if topic == 0:
+ self.formatFirstRow()
+ '''
+ if any rows were added, one needs to format
+ the whole table again.
+ '''
+
+ if diff > 0:
+ self.formatLastRow()
+
+ '''removes obsolete rows, reducing the
+ topics table to the given number of topics.
+ Note this method does only reducing - if
+ the number of topics given is greater than the
+ number of actuall topics it does *not* add
+ rows !
+ Note also that the first topic will never be removed.
+ If the table contains no topics, the whole section will
+ be removed uppon finishing.
+ The reason for that is a "table-design" one: the first topic is
+ maintained in order to be able to add rows with a design of this topic,
+ and not of the header row.
+ @param topics the number of topics the table should contain.
+ @throws Exception
+ '''
+
+ def reduceDocumentTo(self, topics):
+ # we never remove the first topic...
+ if topics <= 0:
+ topics = 1
+
+ tableRows = Topics.table.Rows
+ targetNumOfRows = topics * Topics.rowsPerTopic + 1
+ '''if tableRows.Count > targetNumOfRows:
+ tableRows.removeByIndex(
+ targetNumOfRows, tableRows.Count - targetNumOfRows)'''
+
+ self.formatLastRow()
+ while len(AgendaTemplate.writtenTopics) > topics:
+ del AgendaTemplate.writtenTopics[topics]
+
+ '''reapply the format of the first (header) row.
+ '''
+
+ def formatFirstRow(self):
+ cursor = Topics.table.createCursorByCellName("A1")
+ self.formatTable(cursor, self.firstRowFormat, False)
+
+ '''reaply the format of the last row.
+ '''
+ @classmethod
+ def formatLastRow(self):
+ cursor = Topics.table.createCursorByCellName("A1")
+ cursor.gotoEnd(False)
+ self.formatTable(cursor, Topics.lastRowFormat, True)
+
+ '''returns a text element for the given cell,
+ which will write the given text.
+ @param cell the topics cell number.
+ @param value the value to write.
+ @return a TextElement object which will write the given value
+ to the given cell.
+ '''
+
+ @classmethod
+ def setItemText(self, cell, value):
+ if cell >= 0:
+ te = Topics.topicCells[cell]
+ if te is not None:
+ te.text = str(value)
+ return te
+
+ return None
+
+ '''formats a series of cells from the given one,
+ using the given List of TableCellFormatter objects,
+ in the given order.
+ This method is used to format the first (header) and the last
+ rows of the table.
+ @param cursor a table cursor, pointing to the start cell to format
+ @param formats a List containing TableCellFormatter objects.
+ Each will format one cell in the direction specified.
+ @param reverse if true the cursor will move left,
+ formatting in reverse order (used for the last row).
+ '''
+ @classmethod
+ def formatTable(self, cursor, formats, reverse):
+ for i in formats:
+ i.format(Topics.table.getCellByName(cursor.RangeName))
+ if reverse:
+ cursor.goLeft(1, False)
+ else:
+ cursor.goRight(1, False)
+
+'''
+A basic implementation of AgendaElement:
+writes a String to the given XText/XTextRange, and applies
+a ParaStyle to it (using the parent class).
+@author rp143992
+'''
+class TextElement(object):
+
+ def __init__(self, text_):
+ self.text = text_
+
+ def write(self, textRange):
+ textRange.String = self.text
+
+'''
+A Text element which, if the text to write is empty (null or "")
+inserts a placeholder instead.
+@author rp143992
+'''
+
+class PlaceholderTextElement(TextElement):
+
+ def __init__(self, textRange, placeHolderText_, hint_, xmsf_):
+ super(PlaceholderTextElement,self).__init__(textRange)
+
+ self.placeHolderText = placeHolderText_
+ self.hint = hint_
+ self.xmsf = xmsf_
+
+ def write(self, textRange):
+ textRange.String = self.text
+ if self.text is None or self.text == "":
+ try:
+ xTextContent = AgendaTemplate.createPlaceHolder(
+ self.xmsf, self.placeHolderText, self.hint)
+ textRange.Text.insertTextContent(
+ textRange.Start, xTextContent, True)
+ except Exception, ex:
+ traceback.print_exc()
+
+'''
+An Agenda element which writes no text, but inserts a placeholder, and formats
+it using a ParaStyleName.
+@author rp143992
+'''
+
+class PlaceholderElement(object):
+
+ def __init__(self, placeHolderText_, hint_, xmsf_):
+ self.placeHolderText = placeHolderText_
+ self.hint = hint_
+ self.xmsf = xmsf_
+
+ def write(self, textRange):
+ try:
+ xTextContent = AgendaTemplate.createPlaceHolder(
+ AgendaTemplate.document, self.placeHolderText, self.hint)
+ textRange.Text.insertTextContent(
+ textRange.Start, xTextContent, True)
+ except Exception, ex:
+ traceback.print_exc()
+
+'''
+An implementation of AgendaElement which
+gets as a parameter a table cursor, and writes
+a text to the cell marked by this table cursor, and
+a place holder to the next cell.
+@author rp143992
+'''
+
+class AgendaItem(object):
+
+ def __init__(self, name_, te, f):
+ self.name = name_
+ self.field = f
+ self.textElement = te
+
+ def write(self, tableCursor):
+ cellname = tableCursor.RangeName
+ cell = ItemsTable.table.getCellByName(cellname)
+ self.textElement.write(cell)
+ tableCursor.goRight(1, False)
+ #second field is actually always null...
+ # this is a preparation for adding placeholders.
+ if self.field is not None:
+ self.field.write(ItemsTable.table.getCellByName(
+ tableCursor.RangeName))
diff --git a/wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py
new file mode 100644
index 000000000000..3555a2d6244a
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py
@@ -0,0 +1,293 @@
+from wizards.ui.WizardDialog import *
+from AgendaWizardDialogConst import *
+from AgendaWizardDialogResources import AgendaWizardDialogResources
+
+from com.sun.star.awt.FontUnderline import SINGLE
+
+class AgendaWizardDialog(WizardDialog):
+
+ def __init__(self, xmsf):
+ super(AgendaWizardDialog,self).__init__(xmsf, HID )
+ #Load Resources
+ self.resources = AgendaWizardDialogResources(xmsf)
+ #set dialog properties...
+ Helper.setUnoPropertyValues(
+ self.xDialogModel, ("Closeable",
+ PropertyNames.PROPERTY_HEIGHT,
+ "Moveable",
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Title",
+ PropertyNames.PROPERTY_WIDTH),
+ (True, 210, True, 200, 52, 1, 1,
+ self.resources.resAgendaWizardDialog_title,310))
+
+ self.IMGHELP1_HID = ""
+ self.PROPS_LIST = ("Dropdown",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ self.PROPS_LABEL_B = ("FontDescriptor",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ self.PROPS_CHECK = (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ self.PROPS_BUTTON = (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ self.PROPS_X = (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ self.PROPS_TEXTAREA = (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ self.PROPS_TEXT = (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ self.PROPS_IMAGE = ("Border",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_IMAGEURL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "ScaleImage",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ self.fontDescriptor1 = \
+ uno.createUnoStruct('com.sun.star.awt.FontDescriptor')
+ self.fontDescriptor2 = \
+ uno.createUnoStruct('com.sun.star.awt.FontDescriptor')
+ self.fontDescriptor4 = \
+ uno.createUnoStruct('com.sun.star.awt.FontDescriptor')
+ #Set member- FontDescriptors...
+ self.fontDescriptor1.Weight = 150
+ self.fontDescriptor1.Underline = SINGLE
+ self.fontDescriptor2.Weight = 100
+ self.fontDescriptor4.Weight = 150
+
+ '''
+ build components
+ '''
+ def buildStep1(self):
+ self.insertLabel("lblTitle1", self.PROPS_LABEL_B, (self.fontDescriptor4,
+ 16, self.resources.reslblTitle1_value, True, 91, 8, 1, 100,212))
+ self.insertLabel("lblPageDesign", self.PROPS_TEXT,
+ (8, self.resources.reslblPageDesign_value, 97, 32, 1, 101, 66))
+ self.listPageDesign = self.insertListBox("listPageDesign",
+ None, LISTPAGEDESIGN_ACTION_PERFORMED, self.PROPS_LIST,
+ (True, 12, LISTPAGEDESIGN_HID, 166, 30, 1, 102, 70), self)
+ self.chkMinutes = self.insertCheckBox("chkMinutes", None,
+ self.PROPS_CHECK, (9, CHKMINUTES_HID,
+ self.resources.reschkMinutes_value, 97, 50, 0, 1, 103, 203), self)
+ self.insertImage("imgHelp1", self.PROPS_IMAGE,
+ (0, 10, self.IMGHELP1_HID,
+ INFO_IMAGE_URL, 92,
+ 145, False, 1, 104, 10))
+ self.insertLabel("lblHelp1", self.PROPS_TEXTAREA,
+ (39, self.resources.reslblHelp1_value, True,104,145, 1, 105,199))
+
+ def buildStep2(self):
+ self.insertLabel("lblTitle2", self.PROPS_LABEL_B,
+ (self.fontDescriptor4, 16,
+ self.resources.reslblTitle2_value, True,91, 8, 2, 200,212))
+ self.insertLabel("lblDate", self.PROPS_TEXT,
+ (8, self.resources.reslblDate_value, 97, 32, 2, 201,66))
+ self.txtDate = self.insertDateField(
+ "txtDate", TXTDATE_TEXT_CHANGED, self.PROPS_LIST,
+ (True, 12, TXTDATE_HID,166,30, 2, 202,70), self)
+ self.insertLabel("lblTime", self.PROPS_TEXT,
+ (8, self.resources.reslblTime_value, 97, 50, 2, 203, 66))
+ self.txtTime = self.insertTimeField("txtTime", TXTTIME_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ "StrictFormat",
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (12, TXTTIME_HID, 166, 48, 2, True, 204,70), self)
+ self.insertLabel("lblTitle", self.PROPS_TEXT,
+ (8, self.resources.reslblTitle_value, 97, 68, 2, 205,66))
+ self.txtTitle = self.insertTextField(
+ "txtTitle", TXTTITLE_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (26, TXTTITLE_HID, True, 166, 66, 2, 206, 138), self)
+ self.insertLabel("lblLocation", self.PROPS_TEXT,
+ (8, self.resources.reslblLocation_value, 97, 100, 2, 207, 66))
+ self.cbLocation = self.insertTextField(
+ "cbLocation", TXTLOCATION_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (34, CBLOCATION_HID, True, 166,98, 2, 208, 138), self)
+ self.insertImage("imgHelp2", self.PROPS_IMAGE,
+ (0, 10, self.IMGHELP1_HID,
+ INFO_IMAGE_URL,
+ 92, 145, False, 2, 209, 10))
+ self.insertLabel("lblHelp2", self.PROPS_TEXTAREA,
+ (39, self.resources.reslblHelp2_value, True, 104, 145, 2, 210, 199))
+
+ def buildStep3(self):
+ self.insertLabel("lblTitle3", self.PROPS_LABEL_B,
+ (self.fontDescriptor4, 16, self.resources.reslblTitle3_value,
+ True, 91, 8, 3, 300,212))
+ self.chkMeetingTitle = self.insertCheckBox("chkMeetingTitle",
+ CHKUSEMEETINGTYPE_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKMEETINGTITLE_HID, self.resources.reschkMeetingTitle_value,
+ 97, 32, 1, 3, 301, 69), self)
+ self.chkRead = self.insertCheckBox("chkRead",
+ CHKUSEREAD_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKREAD_HID, self.resources.reschkRead_value,
+ 97, 46, 0, 3, 302, 162), self)
+ self.chkBring = self.insertCheckBox("chkBring",
+ CHKUSEBRING_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKBRING_HID, self.resources.reschkBring_value,
+ 97, 60, 0, 3, 303, 162), self)
+ self.chkNotes = self.insertCheckBox("chkNotes",
+ CHKUSENOTES_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKNOTES_HID, self.resources.reschkNotes_value,
+ 97, 74, 1, 3, 304, 160), self)
+ self.insertImage("imgHelp3", self.PROPS_IMAGE, (0, 10,
+ self.IMGHELP1_HID, INFO_IMAGE_URL,
+ 92, 145, False, 3, 305, 10))
+ self.insertLabel("lblHelp3", self.PROPS_TEXTAREA,
+ (39, self.resources.reslblHelp3_value, True,104, 145, 3, 306, 199))
+
+ def buildStep4(self):
+ self.insertLabel("lblTitle5", self.PROPS_LABEL_B,
+ (self.fontDescriptor4, 16, self.resources.reslblTitle5_value,
+ True, 91, 8, 4, 400, 212))
+ self.chkConvenedBy = self.insertCheckBox("chkConvenedBy",
+ CHKUSECALLEDBYNAME_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKCONVENEDBY_HID, self.resources.reschkConvenedBy_value,
+ 97, 32, 1, 4, 401, 150), self)
+ self.chkPresiding = self.insertCheckBox("chkPresiding",
+ CHKUSEFACILITATOR_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKPRESIDING_HID, self.resources.reschkPresiding_value,
+ 97, 46, 0, 4, 402, 150), self)
+ self.chkNoteTaker = self.insertCheckBox("chkNoteTaker",
+ CHKUSENOTETAKER_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKNOTETAKER_HID, self.resources.reschkNoteTaker_value,
+ 97, 60, 0, 4, 403, 150), self)
+ self.chkTimekeeper = self.insertCheckBox("chkTimekeeper",
+ CHKUSETIMEKEEPER_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKTIMEKEEPER_HID, self.resources.reschkTimekeeper_value,
+ 97, 74, 0, 4, 404, 150), self)
+ self.chkAttendees = self.insertCheckBox("chkAttendees",
+ CHKUSEATTENDEES_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKATTENDEES_HID, self.resources.reschkAttendees_value,
+ 97, 88, 1, 4, 405, 150), self)
+ self.chkObservers = self.insertCheckBox("chkObservers",
+ CHKUSEOBSERVERS_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKOBSERVERS_HID, self.resources.reschkObservers_value,
+ 97, 102, 0, 4, 406, 150), self)
+ self.chkResourcePersons = self.insertCheckBox("chkResourcePersons",
+ CHKUSERESOURCEPERSONS_ITEM_CHANGED, self.PROPS_CHECK,
+ (8, CHKRESOURCEPERSONS_HID, self.resources.reschkResourcePersons_value,
+ 97, 116, 0, 4, 407, 150), self)
+ self.insertImage("imgHelp4", self.PROPS_IMAGE,
+ (0, 10, self.IMGHELP1_HID, INFO_IMAGE_URL,
+ 92, 145, False, 4, 408, 10))
+ self.insertLabel("lblHelp4", self.PROPS_TEXTAREA,
+ (39, self.resources.reslblHelp4_value, True, 104, 145, 4, 409, 199))
+
+ def buildStep5(self):
+ self.insertLabel("lblTitle4", self.PROPS_LABEL_B,
+ (self.fontDescriptor4, 16, self.resources.reslblTitle4_value,
+ True, 91, 8, 5, 500, 212))
+ self.insertLabel("lblTopic", self.PROPS_TEXT,
+ (8, self.resources.reslblTopic_value, 107, 28, 5, 71, 501))
+ self.insertLabel("lblResponsible", self.PROPS_TEXT,
+ (8, self.resources.reslblResponsible_value, 195, 28, 5, 72, 502))
+ self.insertLabel("lblDuration", self.PROPS_TEXT,
+ (8, self.resources.reslblDuration_value, 267, 28, 5, 73, 503))
+ self.btnInsert = self.insertButton("btnInsert", BTNINSERT_ACTION_PERFORMED,
+ self.PROPS_BUTTON, (14, BTNINSERT_HID,
+ self.resources.resButtonInsert, 92, 136, 5, 580, 40), self)
+ self.btnRemove = self.insertButton("btnRemove", BTNREMOVE_ACTION_PERFORMED,
+ self.PROPS_BUTTON, (14, BTNREMOVE_HID,
+ self.resources.resButtonRemove, 134, 136, 5, 581, 40), self)
+ self.btnUp = self.insertButton("btnUp", BTNUP_ACTION_PERFORMED,
+ self.PROPS_BUTTON, (14, BTNUP_HID,
+ self.resources.resButtonUp, 222, 136, 5, 582, 40), self)
+ self.btnDown = self.insertButton("btnDown", BTNDOWN_ACTION_PERFORMED,
+ self.PROPS_BUTTON, (14, BTNDOWN_HID,
+ self.resources.resButtonDown, 264, 136, 5, 583, 40), self)
+
+ def buildStep6(self):
+ self.insertLabel("lblTitle6", self.PROPS_LABEL_B,
+ (self.fontDescriptor4, 16, self.resources.reslblTitle6_value,
+ True, 91, 8, 6, 600, 212))
+ self.insertLabel("lblHelpPg6", self.PROPS_TEXTAREA,
+ (24, self.resources.reslblHelpPg6_value, True,
+ 97, 32, 6, 601,204))
+ self.insertLabel("lblTemplateName", self.PROPS_TEXT,
+ (8, self.resources.reslblTemplateName_value,
+ 97, 62, 6, 602, 101))
+ self.txtTemplateName = self.insertTextField("txtTemplateName",
+ TXTTEMPLATENAME_TEXT_CHANGED, self.PROPS_X,
+ (12, TXTTEMPLATENAME_HID, 202, 60, 6, 603, 100), self)
+ self.insertLabel("lblProceed", self.PROPS_TEXT,
+ (8, self.resources.reslblProceed_value, 97, 101, 6, 607,204))
+ self.optCreateAgenda = self.insertRadioButton("optCreateAgenda", None,
+ self.PROPS_CHECK, (8, OPTCREATEAGENDA_HID,
+ self.resources.resoptCreateAgenda_value,
+ 103, 113, 1, 6, 608, 198), self)
+ self.optMakeChanges = self.insertRadioButton("optMakeChanges", None,
+ self.PROPS_BUTTON, (8, OPTMAKECHANGES_HID,
+ self.resources.resoptMakeChanges_value, 103, 125, 6, 609, 198), self)
+ self.insertImage("imgHelp6", self.PROPS_IMAGE, (0, 10, self.IMGHELP1_HID,
+ INFO_IMAGE_URL, 92, 145, False, 6, 610, 10))
+ self.insertLabel("lblHelp6", self.PROPS_TEXTAREA,
+ (39, self.resources.reslblHelp6_value, True, 104, 145, 6, 611, 199))
diff --git a/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py
new file mode 100644
index 000000000000..2e26a350cd8b
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py
@@ -0,0 +1,63 @@
+from wizards.common.HelpIds import HelpIds
+
+TXTTITLE_TEXT_CHANGED = "txtTitleTextChanged"
+TXTDATE_TEXT_CHANGED = "txtDateTextChanged"
+TXTTIME_TEXT_CHANGED = "txtTimeTextChanged"
+TXTLOCATION_TEXT_CHANGED = "txtLocationTextChanged"
+CHKMINUTES_ITEM_CHANGED = "chkMinutesItemChanged"
+CHKUSEMEETINGTYPE_ITEM_CHANGED = "chkUseMeetingTypeItemChanged"
+CHKUSEREAD_ITEM_CHANGED = "chkUseReadItemChanged"
+CHKUSEBRING_ITEM_CHANGED = "chkUseBringItemChanged"
+CHKUSENOTES_ITEM_CHANGED = "chkUseNotesItemChanged"
+CHKUSECALLEDBYNAME_ITEM_CHANGED = "chkUseCalledByItemChanged"
+CHKUSEFACILITATOR_ITEM_CHANGED = "chkUseFacilitatorItemChanged"
+CHKUSENOTETAKER_ITEM_CHANGED = "chkUseNoteTakerItemChanged"
+CHKUSETIMEKEEPER_ITEM_CHANGED = "chkUseTimeKeeperItemChanged"
+CHKUSEATTENDEES_ITEM_CHANGED = "chkUseAttendeesItemChanged"
+CHKUSEOBSERVERS_ITEM_CHANGED = "chkUseObserversItemChanged"
+CHKUSERESOURCEPERSONS_ITEM_CHANGED = "chkUseResourcePersonsItemChanged"
+LISTPAGEDESIGN_ACTION_PERFORMED = "pageDesignChanged"
+TXTTEMPLATENAME_TEXT_CHANGED = "templateTitleChanged"
+BTNTEMPLATEPATH_ACTION_PERFORMED = "saveAs"
+BTNINSERT_ACTION_PERFORMED = "insertRow"
+BTNREMOVE_ACTION_PERFORMED = "removeRow"
+BTNUP_ACTION_PERFORMED = "rowUp"
+BTNDOWN_ACTION_PERFORMED = "rowDown"
+
+INFO_IMAGE_URL = "private:resource/dbu/image/19205"
+
+HID = 41051
+
+LISTPAGEDESIGN_HID = HelpIds.getHelpIdString(HID + 6)
+CHKMINUTES_HID = HelpIds.getHelpIdString(HID + 7)
+TXTTIME_HID = HelpIds.getHelpIdString(HID + 8)
+TXTDATE_HID = HelpIds.getHelpIdString(HID + 9)
+TXTTITLE_HID = HelpIds.getHelpIdString(HID + 10)
+CBLOCATION_HID = HelpIds.getHelpIdString(HID + 11)
+
+CHKMEETINGTITLE_HID = HelpIds.getHelpIdString(HID + 12)
+CHKREAD_HID = HelpIds.getHelpIdString(HID + 13)
+CHKBRING_HID = HelpIds.getHelpIdString(HID + 14)
+CHKNOTES_HID = HelpIds.getHelpIdString(HID + 15)
+
+CHKCONVENEDBY_HID = HelpIds.getHelpIdString(HID + 16)
+CHKPRESIDING_HID = HelpIds.getHelpIdString(HID + 17)
+CHKNOTETAKER_HID = HelpIds.getHelpIdString(HID + 18)
+CHKTIMEKEEPER_HID = HelpIds.getHelpIdString(HID + 19)
+CHKATTENDEES_HID = HelpIds.getHelpIdString(HID + 20)
+CHKOBSERVERS_HID = HelpIds.getHelpIdString(HID + 21)
+CHKRESOURCEPERSONS_HID = HelpIds.getHelpIdString(HID + 22)
+
+TXTTEMPLATENAME_HID = HelpIds.getHelpIdString(HID + 23)
+TXTTEMPLATEPATH_HID = HelpIds.getHelpIdString(HID + 24)
+BTNTEMPLATEPATH_HID = HelpIds.getHelpIdString(HID + 25)
+
+OPTCREATEAGENDA_HID = HelpIds.getHelpIdString(HID + 26)
+OPTMAKECHANGES_HID = HelpIds.getHelpIdString(HID + 27)
+
+BTNINSERT_HID = HelpIds.getHelpIdString(HID + 28)
+BTNREMOVE_HID = HelpIds.getHelpIdString(HID + 29)
+BTNUP_HID = HelpIds.getHelpIdString(HID + 30)
+BTNDOWN_HID = HelpIds.getHelpIdString(HID + 31)
+
+LAST_HID = HID + 32
diff --git a/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py
new file mode 100644
index 000000000000..68e39f29b72c
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py
@@ -0,0 +1,463 @@
+from AgendaWizardDialog import *
+from AgendaTemplate import *
+from CGAgenda import CGAgenda
+from wizards.ui.PathSelection import PathSelection
+from wizards.ui.event.UnoDataAware import UnoDataAware
+from wizards.ui.event.RadioDataAware import RadioDataAware
+from wizards.common.NoValidPathException import NoValidPathException
+from wizards.common.SystemDialog import SystemDialog
+
+from com.sun.star.view.DocumentZoomType import OPTIMAL
+from com.sun.star.awt.VclWindowPeerAttribute import YES_NO, DEF_NO
+from com.sun.star.awt.VclWindowPeerAttribute import OK
+
+class AgendaWizardDialogImpl(AgendaWizardDialog):
+
+ fileAccess1 = None
+ pageDesign = None
+
+ def __init__(self, xmsf):
+ super(AgendaWizardDialogImpl, self).__init__(xmsf)
+ self.filenameChanged = False
+
+ def enterStep(self, OldStep, NewStep):
+ pass
+
+ def leaveStep(self, OldStep, NewStep):
+ pass
+
+ '''
+ used in developement to start the wizard
+ '''
+
+ @classmethod
+ def main(self, args):
+ ConnectStr = \
+ "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext"
+ try:
+ xLocMSF = Desktop.connect(ConnectStr)
+ wizard = AgendaWizardDialogImpl(xLocMSF)
+ wizard.startWizard()
+ except Exception, exception:
+ traceback.print_exc()
+
+ '''
+ read the configuration data, open the specified template,
+ initialize the template controller (AgendaTemplate) and
+ set the status of the displayed template to the one
+ read from the configuration.
+ build the dialog.
+ Synchronize the dialog to the same status (read from
+ the configuration).
+ show the dialog.
+ '''
+
+ def startWizard(self):
+ self.running = True
+ try:
+ #Number of steps on WizardDialog
+ self.nMaxStep = 6
+
+ # initialize the agenda template
+ self.agenda = CGAgenda()
+ self.agendaTemplate = AgendaTemplate(
+ self.xMSF, self.agenda, self.resources, self)
+
+ # build the dialog.
+ self.drawNaviBar()
+
+ self.buildStep1()
+ self.buildStep2()
+ self.buildStep3()
+ self.buildStep4()
+ self.buildStep5()
+ self.buildStep6()
+
+ self.topicsControl = TopicsControl(self, self.xMSF, self.agenda)
+
+ self.initializePaths()
+ #special Control for setting the save Path:
+ self.insertPathSelectionControl()
+
+ self.initializeTemplates()
+
+ # synchronize GUI and CGAgenda object.
+ self.initConfiguration()
+
+ if self.myPathSelection.xSaveTextBox.Text.lower() == "":
+ self.myPathSelection.initializePath()
+
+ # create the peer
+ xContainerWindow = self.agendaTemplate.xFrame.ContainerWindow
+ self.createWindowPeer(xContainerWindow)
+
+ # initialize roadmap
+ self.insertRoadmap()
+
+ self.pageDesignChanged()
+
+ self.executeDialogFromComponent(self.agendaTemplate.xFrame)
+ self.removeTerminateListener()
+ self.closeDocument()
+ self.running = False
+ except Exception, ex:
+ self.removeTerminateListener()
+ traceback.print_exc()
+ self.running = False
+ return
+
+ def insertPathSelectionControl(self):
+ self.myPathSelection = PathSelection(
+ self.xMSF, self, PathSelection.TransferMode.SAVE,
+ PathSelection.DialogTypes.FILE)
+ self.myPathSelection.insert(6, 97, 70, 205, 45,
+ self.resources.reslblTemplatePath_value, True,
+ HelpIds.getHelpIdString(HID + 24),
+ HelpIds.getHelpIdString(HID + 25))
+ self.myPathSelection.sDefaultDirectory = self.sUserTemplatePath
+ self.myPathSelection.sDefaultName = "myAgendaTemplate.ott"
+ self.myPathSelection.sDefaultFilter = "writer8_template"
+ self.myPathSelection.addSelectionListener(
+ self.myPathSelectionListener())
+
+ def initializePaths(self):
+ try:
+ self.sTemplatePath = FileAccess.getOfficePath2(
+ self.xMSF, "Template", "share", "/wizard")
+ self.sUserTemplatePath = FileAccess.getOfficePath2(
+ self.xMSF, "Template", "user", "")
+ self.sBitmapPath = FileAccess.combinePaths(
+ self.xMSF, self.sTemplatePath, "/../wizard/bitmap")
+ except NoValidPathException:
+ traceback.print_exc()
+
+ def checkSavePath(self):
+ if self.agenda.cp_TemplatePath is None \
+ or self.agenda.cp_TemplatePath == "" \
+ or not self.getFileAccess().exists(
+ FileAccess.getParentDir(self.agenda.cp_TemplatePath), False) \
+ or not self.getFileAccess().isDirectory(
+ FileAccess.getParentDir(self.agenda.cp_TemplatePath)):
+ try:
+ self.agenda.cp_TemplatePath = FileAccess.connectURLs(
+ FileAccess.getOfficePath2(self.xMSF, "Work", "", ""),
+ self.resources.resDefaultFilename)
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''
+ bind controls to the agenda member (DataAware model)
+ '''
+
+ def initConfiguration(self):
+ # read configuration data.
+ root = Configuration.getConfigurationRoot(
+ self.xMSF, "/org.openoffice.Office.Writer/Wizards/Agenda", False)
+ self.agenda.readConfiguration(root, "cp_")
+
+ self.setControlProperty(
+ "listPageDesign", "StringItemList", tuple(self.agendaTemplates[0]))
+ self.checkSavePath()
+ UnoDataAware.attachListBox(
+ self.agenda, "cp_AgendaType", self.listPageDesign, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_IncludeMinutes", self.chkMinutes, True).updateUI()
+ UnoDataAware.attachEditControl(
+ self.agenda, "cp_Title", self.txtTitle, True).updateUI()
+ UnoDataAware.attachDateControl(
+ self.agenda, "cp_Date", self.txtDate, True).updateUI()
+ UnoDataAware.attachTimeControl(
+ self.agenda, "cp_Time", self.txtTime, True).updateUI()
+ UnoDataAware.attachEditControl(
+ self.agenda, "cp_Location", self.cbLocation, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowMeetingType", self.chkMeetingTitle,
+ True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowRead", self.chkRead, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowBring", self.chkBring, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowNotes", self.chkNotes, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowCalledBy", self.chkConvenedBy,
+ True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowFacilitator", self.chkPresiding,
+ True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowNotetaker", self.chkNoteTaker,
+ True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowTimekeeper", self.chkTimekeeper,
+ True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowAttendees", self.chkAttendees,
+ True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowObservers", self.chkObservers,
+ True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.agenda, "cp_ShowResourcePersons",self.chkResourcePersons,
+ True).updateUI()
+ UnoDataAware.attachEditControl(
+ self.agenda, "cp_TemplateName", self.txtTemplateName,
+ True).updateUI()
+ RadioDataAware.attachRadioButtons(
+ self.agenda, "cp_ProceedMethod",
+ (self.optCreateAgenda, self.optMakeChanges), True).updateUI()
+
+ def saveConfiguration(self):
+ root = Configuration.getConfigurationRoot(
+ self.xMSF, "/org.openoffice.Office.Writer/Wizards/Agenda", True)
+ self.agenda.writeConfiguration(root, "cp_")
+ root.commitChanges()
+
+ def insertRoadmap(self):
+ self.addRoadmap()
+
+ self.insertRoadMapItems(
+ [True, True, True, True, True, True],
+ [self.resources.resStep1, self.resources.resStep2,
+ self.resources.resStep3, self.resources.resStep4,
+ self.resources.resStep5, self.resources.resStep6])
+
+ self.setRoadmapInteractive(True)
+ self.setRoadmapComplete(True)
+ self.setCurrentRoadmapItemID(1)
+
+ '''
+ read the available agenda wizard templates.
+ '''
+
+ def initializeTemplates(self):
+ try:
+ self.sTemplatePath = FileAccess.getOfficePath2(
+ self.xMSF, "Template", "share", "/wizard")
+ sAgendaPath = FileAccess.combinePaths(
+ self.xMSF, self.sTemplatePath, "/wizard/agenda")
+ self.agendaTemplates = FileAccess.getFolderTitles(
+ self.xMSF, "aw", sAgendaPath)
+ return True
+ except NoValidPathException:
+ traceback.print_exc()
+ return False
+
+ '''
+ first page, page design listbox changed.
+ '''
+
+ def pageDesignChanged(self):
+ try:
+ SelectedItemPos = self.listPageDesign.SelectedItemPos
+ #avoid to load the same item again
+ if AgendaWizardDialogImpl.pageDesign is not SelectedItemPos:
+ AgendaWizardDialogImpl.pageDesign = SelectedItemPos
+ self.agendaTemplate.load(
+ self.agendaTemplates[1][SelectedItemPos],
+ self.topicsControl.scrollfields)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ last page, template title changed...
+ '''
+
+ def templateTitleChanged(self):
+ title = Helper.getUnoPropertyValue(getModel(txtTemplateName), "Text")
+ self.agendaTemplate.setTemplateTitle(title)
+
+ #textFields listeners
+ def txtTitleTextChanged(self):
+ AgendaTemplate.redrawTitle("txtTitle")
+
+ def txtDateTextChanged(self):
+ AgendaTemplate.redrawTitle("txtDate")
+
+ def txtTimeTextChanged(self):
+ AgendaTemplate.redrawTitle("txtTime")
+
+ def txtLocationTextChanged(self):
+ AgendaTemplate.redrawTitle("cbLocation")
+
+ #checkbox listeners
+ def chkUseMeetingTypeItemChanged(self):
+ AgendaTemplate.agenda.cp_IncludeMinutes = bool(self.chkMinutes.State)
+
+ def chkUseMeetingTypeItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_MEETING_TYPE)
+
+ def chkUseReadItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_READ)
+
+ def chkUseBringItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_BRING)
+
+ def chkUseNotesItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_NOTES)
+
+ def chkUseCalledByItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_CALLED_BY)
+
+ def chkUseFacilitatorItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_FACILITATOR)
+
+ def chkUseNoteTakerItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_NOTETAKER)
+
+ def chkUseTimeKeeperItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_TIMEKEEPER)
+
+ def chkUseAttendeesItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_PARTICIPANTS)
+
+ def chkUseObserversItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_OBSERVERS)
+
+ def chkUseResourcePersonsItemChanged(self):
+ AgendaTemplate.redraw(FILLIN_RESOURCE_PERSONS)
+
+ '''
+ convenience method.
+ instead of creating a FileAccess object every time
+ it is needed, I have a FileAccess object memeber.
+ the first time it is needed it will be created, and
+ then be reused...
+ @return the FileAccess memeber object.
+ '''
+
+ def getFileAccess(self):
+ if AgendaWizardDialogImpl.fileAccess1 is None:
+ try:
+ AgendaWizardDialogImpl.fileAccess1 = FileAccess(self.xMSF)
+ except Exception, e:
+ traceback.print_exc()
+ return AgendaWizardDialogImpl.fileAccess1
+
+ '''
+ last page, "browse" ("...") button was clicked...
+ '''
+
+ def saveAs(self):
+ try:
+ checkSavePath()
+ saveAs = SystemDialog.createStoreDialog(xMSF)
+ saveAs.addFilterToDialog("ott", "writer8_template", True)
+ # call the saveAs dialog.
+ url = saveAs.callStoreDialog(
+ FileAccess.getParentDir(self.agenda.cp_TemplatePath),
+ FileAccess.getFilename(self.agenda.cp_TemplatePath))
+ if url != None:
+ self.agenda.cp_TemplatePath = url
+ setFilename(url)
+ self.filenameChanged = True
+
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''
+ is called when the user
+ changes the path through the "save as" dialog.
+ The path displayed is a translated, user-friendly, platform dependant path.
+ @param url the new save url.
+ '''
+
+ def setFilename(self, url):
+ try:
+ path = getFileAccess().getPath(url, "")
+ Helper.setUnoPropertyValue(
+ getModel(self.myPathSelection.xSaveTextBox), "Text", path)
+ except Exception, ex:
+ traceback.print_exc()
+
+ def insertRow(self):
+ self.topicsControl.insertRow()
+
+ def removeRow(self):
+ self.topicsControl.removeRow()
+
+ def rowUp(self):
+ self.topicsControl.rowUp()
+
+ def rowDown(self):
+ self.topicsControl.rowDown()
+
+ def cancelWizard(self):
+ self.xUnoDialog.endExecute()
+ self.running = False
+
+ def finishWizard(self):
+ self.switchToStep(self.getCurrentStep(), self.nMaxStep)
+ bSaveSuccess = False
+ endWizard = True
+ try:
+ fileAccess = FileAccess(self.xMSF)
+ self.sPath = self.myPathSelection.getSelectedPath()
+ if self.sPath == "":
+ self.myPathSelection.triggerPathPicker()
+ self.sPath = self.myPathSelection.getSelectedPath()
+
+ self.sPath = fileAccess.getURL(self.sPath)
+ #first, if the filename was not changed, thus
+ #it is coming from a saved session, check if the
+ # file exists and warn the user.
+ if not self.filenameChanged:
+ if fileAccess.exists(self.sPath, True):
+ answer = SystemDialog.showMessageBox(
+ self.xMSF, "MessBox", YES_NO + DEF_NO,
+ self.resources.resFileExists,
+ self.xUnoDialog.Peer)
+ if answer == 3:
+ # user said: no, do not overwrite
+ endWizard = False
+ return False
+
+ xTextDocument = self.agendaTemplate.document
+ bSaveSuccess = OfficeDocument.store(
+ self.xMSF, AgendaTemplate.xTextDocument, self.sPath,
+ "writer8_template")
+
+ if bSaveSuccess:
+ self.saveConfiguration()
+
+ self.agendaTemplate.finish(self.topicsControl.scrollfields)
+
+ loadValues = range(2)
+ loadValues[0] = uno.createUnoStruct( \
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[0].Name = "AsTemplate"
+ if self.agenda.cp_ProceedMethod == 1:
+ loadValues[0].Value = True
+ else:
+ loadValues[0].Value = False
+
+ loadValues[1] = uno.createUnoStruct( \
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[1].Name = "InteractionHandler"
+
+ xIH = self.xMSF.createInstance(
+ "com.sun.star.comp.uui.UUIInteractionHandler")
+ loadValues[1].Value = xIH
+
+ oDoc = OfficeDocument.load(
+ Desktop.getDesktop(self.xMSF),
+ self.sPath, "_default", loadValues)
+ myViewHandler = ViewHandler(self.xMSF, oDoc)
+ myViewHandler.setViewSetting("ZoomType", OPTIMAL)
+ else:
+ pass
+
+ except Exception, e:
+ traceback.print_exc()
+ finally:
+ if endWizard:
+ self.xUnoDialog.endExecute()
+ self.running = False
+ return True
+
+ def closeDocument(self):
+ try:
+ xCloseable = self.agendaTemplate.xFrame
+ xCloseable.close(False)
+ except CloseVetoException, e:
+ traceback.print_exc()
diff --git a/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py
new file mode 100644
index 000000000000..332c342d9d54
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py
@@ -0,0 +1,153 @@
+from wizards.common.Resource import Resource
+
+class AgendaWizardDialogResources(Resource):
+ MODULE_NAME = "dbw"
+ RID_AGENDAWIZARDDIALOG_START = 5000
+ RID_COMMON_START = 500
+
+ def __init__(self, xmsf):
+ super(AgendaWizardDialogResources,self).__init__(xmsf,
+ AgendaWizardDialogResources.MODULE_NAME)
+ #Delete the String, uncomment the getResText method
+ self.resAgendaWizardDialog_title = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 1)
+ self.resoptMakeChanges_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 2)
+ self.reslblTemplateName_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 3)
+ self.reslblTemplatePath_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 4)
+ self.reslblProceed_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 5)
+ self.reslblTitle1_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 6)
+ self.reslblTitle3_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 7)
+ self.reslblTitle2_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 8)
+ self.reslblTitle4_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 9)
+ self.reslblTitle5_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 10)
+ self.reslblTitle6_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 11)
+ self.reschkMinutes_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 12)
+ self.reslblHelp1_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 13)
+ self.reslblTime_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 14)
+ self.reslblTitle_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 15)
+ self.reslblLocation_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 16)
+ self.reslblHelp2_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 17)
+ self.resbtnTemplatePath_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 18)
+ self.resoptCreateAgenda_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 19)
+ self.reslblHelp6_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 20)
+ self.reslblTopic_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 21)
+ self.reslblResponsible_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 22)
+ self.reslblDuration_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 23)
+ self.reschkConvenedBy_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 24)
+ self.reschkPresiding_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 25)
+ self.reschkNoteTaker_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 26)
+ self.reschkTimekeeper_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 27)
+ self.reschkAttendees_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 28)
+ self.reschkObservers_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 29)
+ self.reschkResourcePersons_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 30)
+ self.reslblHelp4_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 31)
+ self.reschkMeetingTitle_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 32)
+ self.reschkRead_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 33)
+ self.reschkBring_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 34)
+ self.reschkNotes_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 35)
+ self.reslblHelp3_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 36)
+ self.reslblDate_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 38)
+ self.reslblHelpPg6_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 39)
+ self.reslblPageDesign_value = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 40)
+ self.resDefaultFilename = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 41)
+ self.resDefaultFilename = self.resDefaultFilename[:-4] + ".ott"
+ self.resDefaultTitle = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 42)
+ self.resErrSaveTemplate = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 43)
+ self.resPlaceHolderTitle = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 44)
+ self.resPlaceHolderDate = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 45)
+ self.resPlaceHolderTime = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 46)
+ self.resPlaceHolderLocation = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 47)
+ self.resPlaceHolderHint = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 48)
+ self.resStep1 = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 50)
+ self.resStep2 = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 51)
+ self.resStep3 = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 52)
+ self.resStep4 = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 53)
+ self.resStep5 = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 54)
+ self.resStep6 = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 55)
+ self.resErrOpenTemplate = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 56)
+ self.itemMeetingType = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 57)
+ self.itemBring = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 58)
+ self.itemRead = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 59)
+ self.itemNote = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 60)
+ self.itemCalledBy = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 61)
+ self.itemFacilitator = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 62)
+ self.itemAttendees = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 63)
+ self.itemNotetaker = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 64)
+ self.itemTimekeeper = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 65)
+ self.itemObservers = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 66)
+ self.itemResource = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 67)
+ self.resButtonInsert = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 68)
+ self.resButtonRemove = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 69)
+ self.resButtonUp = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 70)
+ self.resButtonDown = self.getResText(
+ AgendaWizardDialogResources.RID_AGENDAWIZARDDIALOG_START + 71)
+
+ self.resFileExists = self.getResText(
+ AgendaWizardDialogResources.RID_COMMON_START + 19)
diff --git a/wizards/com/sun/star/wizards/agenda/CGAgenda.py b/wizards/com/sun/star/wizards/agenda/CGAgenda.py
new file mode 100644
index 000000000000..a1261de90f1a
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/CGAgenda.py
@@ -0,0 +1,27 @@
+from wizards.common.ConfigGroup import ConfigGroup
+from wizards.common.ConfigSet import ConfigSet
+from CGTopic import CGTopic
+
+class CGAgenda(ConfigGroup):
+ cp_AgendaType = int()
+ cp_IncludeMinutes = bool()
+ cp_Title = ""
+ cp_Date = str()
+ cp_Time = str()
+ cp_Location = ""
+ cp_ShowMeetingType = bool()
+ cp_ShowRead = bool()
+ cp_ShowBring = bool()
+ cp_ShowNotes = bool()
+ cp_ShowCalledBy = bool()
+ cp_ShowFacilitator = bool()
+ cp_ShowNotetaker = bool()
+ cp_ShowTimekeeper = bool()
+ cp_ShowAttendees = bool()
+ cp_ShowObservers = bool()
+ cp_ShowResourcePersons = bool()
+ cp_TemplateName = str()
+ cp_TemplatePath = str()
+ cp_ProceedMethod = int()
+
+ cp_Topics = ConfigSet(CGTopic())
diff --git a/wizards/com/sun/star/wizards/agenda/CGTopic.py b/wizards/com/sun/star/wizards/agenda/CGTopic.py
new file mode 100644
index 000000000000..e9d57ec72cb4
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/CGTopic.py
@@ -0,0 +1,45 @@
+from wizards.common.ConfigGroup import *
+
+'''
+CGTopic means: Configuration Group Topic.
+This object encapsulates a configuration group with topic information.
+Since the topics gui conftrol uses its own data model, there is
+also code here to convert from the data model to CGTopic object (the constructor)
+and vice versa (setDataToRow method - used when loading the last session...)
+'''
+
+class CGTopic(ConfigGroup):
+
+ cp_Index = int()
+ cp_Topic = str()
+ cp_Responsible = str()
+ cp_Time = str()
+
+ '''
+ create a new CGTopic object with data from the given row.
+ the row object is a PropertyValue array, as used
+ by the TopicsControl's data model.
+ @param row PropertyValue array as used by the TopicsControl data model.
+ '''
+
+ def __init__(self, row=None):
+ if row is None:
+ return
+ num = row[0].Value
+ CGTopic.cp_Index = int(row[0].Value[:-1])
+ CGTopic.cp_Topic = row[1].Value
+ CGTopic.cp_Responsible = row[2].Value
+ CGTopic.cp_Time = row[3].Value
+
+ '''
+ copies the data in this CGTopic object
+ to the given row.
+ @param row the row object (PropertyValue array) to
+ copy the data to.
+ '''
+
+ def setDataToRow(self, row):
+ row[0].Value = "" + str(CGTopic.cp_Index) + "."
+ row[1].Value = CGTopic.cp_Topic
+ row[2].Value = CGTopic.cp_Responsible
+ row[3].Value = CGTopic.cp_Time
diff --git a/wizards/com/sun/star/wizards/agenda/TopicsControl.py b/wizards/com/sun/star/wizards/agenda/TopicsControl.py
new file mode 100644
index 000000000000..1ec37b293fd2
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/TopicsControl.py
@@ -0,0 +1,886 @@
+from threading import RLock
+from CGTopic import CGTopic
+from wizards.ui.ControlScroller import *
+from AgendaWizardDialogConst import LAST_HID
+from wizards.common.Properties import Properties
+from wizards.ui.event.CommonListener import FocusListenerProcAdapter, KeyListenerProcAdapter
+
+from com.sun.star.awt.Key import DOWN, UP, TAB
+from com.sun.star.awt.KeyModifier import SHIFT, MOD1
+
+'''
+@author rpiterman
+This class implements the UI functionality of the topics scroller control.
+<br/>
+During developement, there has been a few changes which were not *fully* done
+mainly in converting the topics and time boxes
+from combobox and time box to normal textboxes,
+so in the code they might be referenced as combobox or timebox. This should be
+rather understood as topicstextbox and timetextbox.<br/><br/>
+Important behaiviour of this control is that there is always a
+blank row at the end, in which the user can enter data.<br/>
+Once the row is not blank (thus, the user entered data...),
+a new blank row is added.<br/>
+Once the user removes the last *unempty* row, binsertRowy deleteing its data, it becomes
+the *last empty row* and the one after is being automatically removed.<br/><br/>
+The contorl shows 5 rows at a time.<br/>
+If, for example, only 2 rows exist (from which the 2ed one is empty...)
+then the other three rows, which do not exist in the data model, are disabled.
+<br/>
+The following other functionality is implemented:
+<br/>
+0. synchroniting data between controls, data model and live preview.
+1. Tab scrolling.<br/>
+2. Keyboard scrolling.<br/>
+3. Removing rows and adding new rows.<br/>
+4. Moving rows up and down. <br/>
+<br/>
+This control relays on the ControlScroller control which uses the following
+Data model:<br/>
+1. It uses a vector, whos members are arrays of PropertyValue.<br/>
+2. Each array represents a row.<br/>
+(Note: the Name and Value memebrs of the PropertyValue object are being used)
+3. Each property Value represents a value
+for a single control with the following rules:<br/>
+3. a. the Value of the property is used for as value
+of the controls (usually text).<br/>
+3. b. the Name of the property is used to map values
+to UI controls in the following manner:<br/>
+3. b. 1. only the Name of the first X Rows is regarded,
+where X is the number of visible rows (in the ainsertRowgenda wizard this would be 5,
+since 5 topic rows are visible on the dialog).<br/>
+3. b. 2. The Names of the first X (or 5...) rows are the names
+of the UI Controls to hold values. When the control scroller scrolls,
+it looks at the first 5 rows and uses the names specified there to map the
+current values to the specified controls. <br/>
+This data model makes the following limitations on the implementation:
+When moving rows, only the values should be moved. The Rows objects,
+which contain also the Names of the controls should not be switched. <br/>
+also when deleting or inserting rows, attention should be paid that no rows
+should be removed or inserted. Instead, only the Values should rotate. <br/><br/>
+To save the topics in the registry a ConfigSet of objects of type CGTopic is
+being used.
+This one is not synchronized "live", since it is unnecessary... instead, it is
+synchronized on call, before the settings should be saved.
+'''
+
+def synchronized(lock):
+ ''' Synchronization decorator. '''
+ def wrap(f):
+ def newFunction(*args, **kw):
+ lock.acquire()
+ try:
+ return f(*args, **kw)
+ finally:
+ lock.release()
+ return newFunction
+ return wrap
+
+class TopicsControl(ControlScroller):
+
+ lock = RLock()
+ LABEL = "lblTopicCnt_"
+ TOPIC = "txtTopicTopic_"
+ RESP = "cbTopicResp_"
+ TIME = "txtTopicTime_"
+ nscrollvalue = 0
+ LABEL_PROPS = (PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ TEXT_PROPS = (PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH)
+ lastFocusRow = 0
+ lastFocusControl = None
+
+ def __init__(self, dialog, xmsf, agenda):
+ try:
+ super(TopicsControl, self).__init__(
+ dialog, xmsf, 5, 92, 38, 212, 5, 18, LAST_HID)
+ self.initializeScrollFields(agenda)
+ # set some focus listeners for TAB scroll down and up...
+ # prepare scroll down on tab press...
+ self.lastTime = \
+ self.ControlGroupVector[self.nblockincrement - 1].timebox
+
+ self.lastTime.addKeyListener(KeyListenerProcAdapter(
+ self.lastControlKeyPressed))
+ #prepare scroll up on tab press...
+ self.firstTopic = self.ControlGroupVector[0].textbox
+ self.firstTopic.addKeyListener(KeyListenerProcAdapter(
+ self.firstControlKeyPressed))
+ self.enableButtons()
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ initializes the data of the control.
+ @param agenda
+ '''
+
+ def initializeScrollFields(self, agenda):
+ # create a row for each topic with the given values....
+ for i in xrange(agenda.cp_Topics.getSize()):
+ row = self.newRow(i)
+ agenda.cp_Topics.getElementAt(i).setDataToRow(row)
+ # a parent class method
+ self.registerControlGroup(row, i)
+ self.updateDocumentRow(i)
+ # inserts a blank row at the end...
+ self.insertRowAtEnd()
+
+ '''
+ Insert a blank (empty) row
+ as last row of the control.
+ The control has always a blank row at the
+ end, which enables the user to enter data...
+ '''
+
+ @classmethod
+ def insertRowAtEnd(self):
+ l = len(ControlScroller.scrollfields)
+ self.registerControlGroup(self.newRow(l), l)
+ self.setTotalFieldCount(l + 1)
+ # if the new row is visible, it must have been disabled
+ # so it should be now enabled...
+ if l - ControlScroller.nscrollvalue < self.nblockincrement:
+ self.ControlGroupVector[l - ControlScroller.nscrollvalue].\
+ setEnabled(True)
+
+ '''
+ remove the last row
+ '''
+
+ @classmethod
+ def removeLastRow(self):
+ l = len(ControlScroller.scrollfields)
+ # if we should scroll up...
+ if (l - ControlScroller.nscrollvalue) >= 1 \
+ and (l - ControlScroller.nscrollvalue) <= self.nblockincrement \
+ and ControlScroller.nscrollvalue > 0:
+ while (l - ControlScroller.nscrollvalue >= 1) \
+ and l - ControlScroller.nscrollvalue <= self.nblockincrement \
+ and ControlScroller.nscrollvalue > 0:
+ self.setScrollValue(ControlScroller.nscrollvalue - 1)
+ # if we should disable a row...
+ elif ControlScroller.nscrollvalue == 0 and l - 1 < self.nblockincrement:
+ self.ControlGroupVector[l - 1].setEnabled(False)
+
+ self.unregisterControlGroup(l - 1)
+ self.setTotalFieldCount(l - 1)
+
+ '''
+ in order to use the "move up", "down" "insert" and "remove" buttons,
+ we track the last control the gained focus, in order to know which
+ row should be handled.
+ @param fe
+ '''
+
+ @classmethod
+ def focusGained(self, fe):
+ xc = fe.Source
+ self.focusGained2(xc)
+
+ '''
+ Sometimes I set the focus programatically to a control
+ (for example when moving a row up or down, the focus should move
+ with it).
+ In such cases, no VCL event is being triggered so it must
+ be called programtically.
+ This is done by this method.
+ @param control
+ '''
+
+ @classmethod
+ def focusGained2(self, control):
+ try:
+ #calculate in which row we are...
+ name = Helper.getUnoPropertyValue(
+ control.Model, PropertyNames.PROPERTY_NAME)
+ num = name[name.index("_") + 1:]
+ TopicsControl.lastFocusRow = int(num) + ControlScroller.nscrollvalue
+ TopicsControl.lastFocusControl = control
+ # enable/disable the buttons...
+ self.enableButtons()
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ enable or disable the buttons according to the
+ current row we are in.
+ '''
+
+ @classmethod
+ def enableButtons(self):
+ UnoDialog.setEnabled(
+ ControlScroller.CurUnoDialog.btnInsert,
+ TopicsControl.lastFocusRow < len(ControlScroller.scrollfields))
+ UnoDialog.setEnabled(
+ ControlScroller.CurUnoDialog.btnRemove,
+ TopicsControl.lastFocusRow < len(ControlScroller.scrollfields) - 1)
+ if TopicsControl.lastFocusControl is not None:
+ UnoDialog.setEnabled(
+ ControlScroller.CurUnoDialog.btnUp, TopicsControl.lastFocusRow > 0)
+ UnoDialog.setEnabled(
+ ControlScroller.CurUnoDialog.btnDown,
+ TopicsControl.lastFocusRow < len(ControlScroller.scrollfields) - 1)
+ else:
+ UnoDialog.setEnabled(
+ ControlScroller.CurUnoDialog.btnUp, False)
+ UnoDialog.setEnabled(
+ ControlScroller.CurUnoDialog.btnDown, False)
+
+ '''
+ Removes the current row.
+ See general class documentation explanation about the
+ data model used and the limitations which explain the implementation here.
+ '''
+
+ def removeRow(self):
+ try:
+ for i in xrange(TopicsControl.lastFocusRow,
+ len(ControlScroller.scrollfields) - 1):
+ pv1 = ControlScroller.scrollfields[i]
+ pv2 = ControlScroller.scrollfields[i + 1]
+ pv1[1].Value = pv2[1].Value
+ pv1[2].Value = pv2[2].Value
+ pv1[3].Value = pv2[3].Value
+ self.updateDocumentRow(i)
+ if i - ControlScroller.nscrollvalue < self.nblockincrement:
+ self.fillupControl(i - ControlScroller.nscrollvalue)
+
+ self.removeLastRow()
+ # update the live preview background document
+ self.reduceDocumentToTopics()
+ self.enableButtons()
+ if TopicsControl.lastFocusControl is not None:
+ # the focus should return to the edit control
+ self.focus(TopicsControl.lastFocusControl)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ Inserts a row before the current row.
+ See general class documentation explanation about the
+ data model used and the limitations which explain the implementation here.
+ '''
+
+ def insertRow(self):
+ try:
+ self.insertRowAtEnd()
+ for i in xrange(len(ControlScroller.scrollfields) - 2,
+ TopicsControl.lastFocusRow, -1):
+ pv1 = ControlScroller.scrollfields[i]
+ pv2 = ControlScroller.scrollfields[i - 1]
+ pv1[1].Value = pv2[1].Value
+ pv1[2].Value = pv2[2].Value
+ pv1[3].Value = pv2[3].Value
+ self.updateDocumentRow(i)
+ if i - ControlScroller.nscrollvalue < self.nblockincrement:
+ self.fillupControl(i - ControlScroller.nscrollvalue)
+
+ # after rotating all the properties from this row on,
+ # we clear the row, so it is practically a new one...
+ pv1 = ControlScroller.scrollfields[TopicsControl.lastFocusRow]
+ pv1[1].Value = ""
+ pv1[2].Value = ""
+ pv1[3].Value = ""
+ # update the preview document.
+ self.updateDocumentRow(TopicsControl.lastFocusRow)
+ self.fillupControl(
+ TopicsControl.lastFocusRow - ControlScroller.nscrollvalue)
+ self.enableButtons()
+
+ if TopicsControl.lastFocusControl is not None:
+ self.focus(TopicsControl.lastFocusControl)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ create a new row with the given index.
+ The index is important because it is used in the
+ Name member of the PropertyValue objects.
+ To know why see general class documentation above (data model explanation)
+ @param i the index of the new row
+ @return
+ '''
+
+ @classmethod
+ def newRow(self, i):
+ pv = [None] * 4
+ pv[0] = Properties.createProperty(
+ TopicsControl.LABEL + str(i), "" + str(i + 1) + ".")
+ pv[1] = Properties.createProperty(TopicsControl.TOPIC + str(i), "")
+ pv[2] = Properties.createProperty(TopicsControl.RESP + str(i), "")
+ pv[3] = Properties.createProperty(TopicsControl.TIME + str(i), "")
+ return pv
+
+ '''
+ Implementation of ControlScroller
+ This is a UI method which inserts a new row to the control.
+ It uses the child-class ControlRow. (see below).
+ @param _index
+ @param npos
+ @see ControlRow
+ '''
+
+ def insertControlGroup(self, _index, npos):
+ oControlRow = ControlRow(
+ ControlScroller.CurUnoDialog, self.iCompPosX, npos, _index,
+ ControlRow.tabIndex)
+ self.ControlGroupVector.append(oControlRow)
+ ControlRow.tabIndex += 4
+
+ '''
+ Checks if a row is empty.
+ This is used when the last row is changed.
+ If it is empty, the next row (which is always blank) is removed.
+ If it is not empty, a next row must exist.
+ @param row the index number of the row to check.
+ @return true if empty. false if not.
+ '''
+
+ @classmethod
+ def isRowEmpty(self, row):
+ data = self.getTopicData(row)
+ # now - is this row empty?
+ return data[1].Value and data[2].Value and data[3].Value
+
+ '''
+ update the preview document and
+ remove/insert rows if needed.
+ @param guiRow
+ @param column
+ '''
+ oldData = []
+
+ @classmethod
+ def fieldChanged(self, guiRow, column):
+ with TopicsControl.lock:
+ try:
+ # First, I update the document
+ data = self.getTopicData(guiRow + ControlScroller.nscrollvalue)
+ if data is None:
+ return
+
+ dataValue = [i.Value for i in data]
+ if dataValue == TopicsControl.oldData:
+ return
+ else:
+ TopicsControl.oldData = dataValue
+
+ self.updateDocumentCell(
+ guiRow + ControlScroller.nscrollvalue, column, data)
+ if self.isRowEmpty(guiRow + ControlScroller.nscrollvalue):
+ '''
+ if this is the row before the last one
+ (the last row is always empty)
+ delete the last row...
+ '''
+ if (guiRow + ControlScroller.nscrollvalue) \
+ == len(ControlScroller.scrollfields) - 2:
+ self.removeLastRow()
+ '''now consequentially check the last two rows,
+ and remove the last one if they are both empty.
+ (actually I check always the "before last" row,
+ because the last one is always empty...
+ '''
+ while len(ControlScroller.scrollfields) > 1 \
+ and self.isRowEmpty(len(ControlScroller.scrollfields) - 2):
+ removeLastRow()
+ cr = self.ControlGroupVector[
+ ControlScroller.scrollfields.size - ControlScroller.nscrollvalue - 1]
+ # if a remove was performed, set focus
+ #to the last row with some data in it...
+ self.focus(getControl(cr, column))
+ # update the preview document.
+ self.reduceDocumentToTopics()
+
+ else:
+ # row contains data
+ # is this the last row?
+ if (guiRow + ControlScroller.nscrollvalue + 1) \
+ == len(ControlScroller.scrollfields):
+ self.insertRowAtEnd()
+
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ return the corresponding row data for the given index.
+ @param topic index of the topic to get.
+ @return a PropertyValue array with the data for the given topic.
+ '''
+
+ @classmethod
+ def getTopicData(self, topic):
+ if topic < len(ControlScroller.scrollfields):
+ return ControlScroller.scrollfields[topic]
+ else:
+ return None
+
+ '''
+ If the user presses tab on the last control, and
+ there *are* more rows in the model, scroll down.
+ @param event
+ '''
+
+ def lastControlKeyPressed(self, event):
+ # if tab without shift was pressed...
+ try:
+ if event.KeyCode == TAB and event.Modifiers == 0:
+ # if there is another row...
+ if (self.nblockincrement + ControlScroller.nscrollvalue) \
+ < len(ControlScroller.scrollfields):
+ self.setScrollValue(ControlScroller.nscrollvalue + 1)
+ self.focus(self.getControlByIndex(self.ControlGroupVector[4], 1))
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ If the user presses shift-tab on the first control, and
+ there *are* more rows in the model, scroll up.
+ @param event
+ '''
+
+ def firstControlKeyPressed(self, event):
+ # if tab with shift was pressed...
+ if (event.KeyCode == TAB) and \
+ (event.Modifiers == SHIFT):
+ if ControlScroller.nscrollvalue > 0:
+ setScrollValue(ControlScroller.nscrollvalue - 1)
+ focus(self.lastTime)
+
+ '''
+ sets focus to the given control.
+ @param textControl
+ '''
+
+ @classmethod
+ def focus(self, textControl):
+ textControl.setFocus()
+ text = textControl.Text
+ textControl.Selection = uno.createUnoStruct( \
+ 'com.sun.star.awt.Selection', 0, len(text))
+ self.focusGained2(textControl)
+
+ '''
+ moves the given row one row down.
+ @param guiRow the gui index of the row to move.
+ @param control the control to gain focus after moving.
+ '''
+
+ @synchronized(lock)
+ def rowDown(self, guiRow=None, control=None):
+ try:
+ if guiRow is None and control is None:
+ guiRow = TopicsControl.lastFocusRow - ControlScroller.nscrollvalue
+ control = TopicsControl.lastFocusControl
+ # only perform if this is not the last row.
+ actuallRow = guiRow + ControlScroller.nscrollvalue
+ if actuallRow + 1 < len(ControlScroller.scrollfields):
+ # get the current selection
+ selection = control.Selection
+ # the last row should scroll...
+ scroll = (guiRow == self.nblockincrement - 1)
+ if scroll:
+ self.setScrollValue(ControlScroller.nscrollvalue + 1)
+
+ scroll1 = ControlScroller.nscrollvalue
+ if scroll:
+ aux = -1
+ else:
+ aux = 1
+ self.switchRows(guiRow, guiRow + aux)
+ if ControlScroller.nscrollvalue != scroll1:
+ guiRow += (ControlScroller.nscrollvalue - scroll1)
+
+ self.setSelection(guiRow + (not scroll), control, selection)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ move the current row up
+ '''
+
+ @synchronized(lock)
+ def rowUp(self, guiRow=None, control=None):
+ try:
+ if guiRow is None and control is None:
+ guiRow = TopicsControl.lastFocusRow - ControlScroller.nscrollvalue
+ control = TopicsControl.lastFocusControl
+ # only perform if this is not the first row
+ actuallRow = guiRow + ControlScroller.nscrollvalue
+ if actuallRow > 0:
+ # get the current selection
+ selection = control.Selection
+ # the last row should scroll...
+ scroll = (guiRow == 0)
+ if scroll:
+ self.setScrollValue(ControlScroller.nscrollvalue - 1)
+ if scroll:
+ aux = 1
+ else:
+ aux = -1
+ self.switchRows(guiRow, guiRow + aux)
+ self.setSelection(guiRow - (not scroll), control, selection)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ moves the cursor up.
+ @param guiRow
+ @param control
+ '''
+
+ @classmethod
+ @synchronized(lock)
+ def cursorUp(self, guiRow, control):
+ # is this the last full row ?
+ actuallRow = guiRow + ControlScroller.nscrollvalue
+ #if this is the first row
+ if actuallRow == 0:
+ return
+ # the first row should scroll...
+
+ scroll = (guiRow == 0)
+ if scroll:
+ self.setScrollValue(ControlScroller.nscrollvalue - 1)
+ upperRow = self.ControlGroupVector[guiRow]
+ else:
+ upperRow = self.ControlGroupVector[guiRow - 1]
+
+ self.focus(self.getControl(upperRow, control))
+
+ '''
+ moves the cursor down
+ @param guiRow
+ @param control
+ '''
+
+ @classmethod
+ @synchronized(lock)
+ def cursorDown(self, guiRow, control):
+ # is this the last full row ?
+ actuallRow = guiRow + ControlScroller.nscrollvalue
+ #if this is the last row, exit
+ if actuallRow == len(ControlScroller.scrollfields) - 1:
+ return
+ # the first row should scroll...
+
+ scroll = (guiRow == self.nblockincrement - 1)
+ if scroll:
+ self.setScrollValue(ControlScroller.nscrollvalue + 1)
+ lowerRow = self.ControlGroupVector[guiRow]
+ else:
+ # if we scrolled we are done...
+ #otherwise..
+ lowerRow = self.ControlGroupVector[guiRow + 1]
+
+ self.focus(self.getControl(lowerRow, control))
+
+ '''
+ changes the values of the given rows with eachother
+ @param row1 one can figure out what this parameter is...
+ @param row2 one can figure out what this parameter is...
+ '''
+
+ def switchRows(self, row1, row2):
+ o1 = ControlScroller.scrollfields[row1 + ControlScroller.nscrollvalue]
+ o2 = ControlScroller.scrollfields[row2 + ControlScroller.nscrollvalue]
+ temp = None
+ for i in xrange(1, len(o1)):
+ temp = o1[i].Value
+ o1[i].Value = o2[i].Value
+ o2[i].Value = temp
+ self.fillupControl(row1)
+ self.fillupControl(row2)
+ self.updateDocumentRow(row1 + ControlScroller.nscrollvalue, o1)
+ self.updateDocumentRow(row2 + ControlScroller.nscrollvalue, o2)
+
+ '''
+ if we changed the last row, add another one...
+ '''
+ if (row1 + ControlScroller.nscrollvalue + 1 == \
+ len(ControlScroller.scrollfields)) \
+ or (row2 + ControlScroller.nscrollvalue + 1 == \
+ len(ControlScroller.scrollfields)):
+
+ self.insertRowAtEnd()
+ '''
+ if we did not change the last row but
+ we did change the one before - check if we
+ have two empty rows at the end.
+ If so, delete the last one...
+ '''
+ elif (row1 + ControlScroller.nscrollvalue) + \
+ (row2 + ControlScroller.nscrollvalue) \
+ == (len(ControlScroller.scrollfields) * 2 - 5):
+ if self.isRowEmpty(len(ControlScroller.scrollfields) - 2) \
+ and self.isRowEmpty(len(ControlScroller.scrollfields) - 1):
+ self.removeLastRow()
+ self.reduceDocumentToTopics()
+
+ '''
+ sets a text selection to a given control.
+ This is used when one moves a row up or down.
+ After moving row X to X+/-1, the selection (or cursor position) of the
+ last focused control should be restored.
+ The control's row is the given guiRow.
+ The control's column is detecte4d according to the given event.
+ This method is called as subsequent to different events,
+ thus it is comfortable to use the event here to detect the column,
+ rather than in the different event methods.
+ @param guiRow the row of the control to set the selection to.
+ @param eventSource helps to detect
+ the control's column to set the selection to.
+ @param s the selection object to set.
+ '''
+
+ def setSelection(self, guiRow, eventSource, s):
+ cr = self.ControlGroupVector[guiRow]
+ control = self.getControl(cr, eventSource)
+ control.setFocus()
+ control.setSelection(s)
+
+ '''
+ returns a control out of the given row, according to a column number.
+ @param cr control row object.
+ @param column the column number.
+ @return the control...
+ '''
+
+ @classmethod
+ def getControlByIndex(self, cr, column):
+ tmp_switch_var1 = column
+ if tmp_switch_var1 == 0:
+ return cr.label
+ elif tmp_switch_var1 == 1:
+ return cr.textbox
+ elif tmp_switch_var1 == 2:
+ return cr.combobox
+ elif tmp_switch_var1 == 3:
+ return cr.timebox
+ else:
+ raise IllegalArgumentException ("No such column");
+
+ '''getControl
+ returns a control out of the given row, which is
+ in the same column as the given control.
+ @param cr control row object
+ @param control a control indicating a column.
+ @return
+ '''
+
+ @classmethod
+ def getControl(self, cr, control):
+ column = self.getColumn(control)
+ return self.getControlByIndex(cr, column)
+
+ '''
+ returns the column number of the given control.
+ @param control
+ @return
+ '''
+
+ @classmethod
+ def getColumn(self, control):
+ name = Helper.getUnoPropertyValue(
+ control.Model, PropertyNames.PROPERTY_NAME)
+ if name.startswith(TopicsControl.TOPIC):
+ return 1
+ if name.startswith(TopicsControl.RESP):
+ return 2
+ if name.startswith(TopicsControl.TIME):
+ return 3
+ if name.startswith(TopicsControl.LABEL):
+ return 0
+ return -1
+
+ '''
+ update the given row in the preview document with the given data.
+ @param row
+ @param data
+ '''
+
+ def updateDocumentRow(self, row, data=None):
+ if data is None:
+ data = ControlScroller.scrollfields[row]
+ try:
+ ControlScroller.CurUnoDialog.agendaTemplate.topics.write(
+ row, data)
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''
+ updates a single cell in the preview document.
+ Is called when a single value is changed, since we really
+ don't have to update the whole row for one small changhe...
+ @param row the data row to update (topic number).
+ @param column the column to update (a gui column, not a document column).
+ @param data the data of the entire row.
+ '''
+
+ @classmethod
+ def updateDocumentCell(self, row, column, data):
+ try:
+ ControlScroller.CurUnoDialog.agendaTemplate.topics.writeCell(
+ row, column, data)
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''
+ when removeing rows, this method updates
+ the preview document to show the number of rows
+ according to the data model.
+ '''
+
+ def reduceDocumentToTopics(self):
+ try:
+ ControlScroller.CurUnoDialog.agendaTemplate.topics.reduceDocumentTo(
+ len(ControlScroller.scrollfields) - 1)
+ except Exception, ex:
+ traceback.print_exc()
+
+'''
+@author rp143992
+A class represting a single GUI row.
+Note that the instance methods of this class
+are being called and handle controls of
+a single row.
+'''
+
+class ControlRow(object):
+
+ tabIndex = 520
+ '''
+ constructor. Create the row in the given dialog given cordinates,
+ with the given offset (row number) and tabindex.
+ Note that since I use this specifically for the agenda wizard,
+ the step and all control coordinates inside the
+ row are constant (5).
+ @param dialog the agenda dialog
+ @param x x coordinates
+ @param y y coordinates
+ @param i the gui row index
+ @param tabindex first tab index for this row.
+ '''
+
+ def __init__(self, dialog, x, y, i, tabindex):
+ self.offset = i
+ self.dialog = dialog
+ self.label = self.dialog.insertLabel(
+ TopicsControl.LABEL + str(i),
+ TopicsControl.LABEL_PROPS,
+ (8, "" + str(i + 1) + ".",
+ x + 4, y + 2, ControlScroller.iStep, tabindex, 10))
+ self.textbox = self.dialog.insertTextField(
+ TopicsControl.TOPIC + str(i), "topicTextChanged",
+ TopicsControl.TEXT_PROPS,
+ (12, HelpIds.getHelpIdString(ControlScroller.curHelpIndex + i * 3 + 1),
+ x + 15, y, ControlScroller.iStep, tabindex + 1, 84), self)
+ self.combobox = self.dialog.insertTextField(
+ TopicsControl.RESP + str(i), "responsibleTextChanged",
+ TopicsControl.TEXT_PROPS,
+ (12, HelpIds.getHelpIdString(ControlScroller.curHelpIndex + i * 3 + 2),
+ x + 103, y, ControlScroller.iStep, tabindex + 2, 68), self)
+ self.timebox = self.dialog.insertTextField(
+ TopicsControl.TIME + str(i), "timeTextChanged",
+ TopicsControl.TEXT_PROPS,
+ (12, HelpIds.getHelpIdString(ControlScroller.curHelpIndex + i * 3 + 3),
+ x + 175, y, ControlScroller.iStep, tabindex + 3, 20), self)
+ self.setEnabled(False)
+ self.textbox.addKeyListener(KeyListenerProcAdapter(self.keyPressed))
+ self.combobox.addKeyListener(KeyListenerProcAdapter(self.keyPressed))
+ self.timebox.addKeyListener(KeyListenerProcAdapter(self.keyPressed))
+ self.textbox.addFocusListener(FocusListenerProcAdapter(
+ TopicsControl.focusGained))
+ self.combobox.addFocusListener(FocusListenerProcAdapter(
+ TopicsControl.focusGained))
+ self.timebox.addFocusListener(FocusListenerProcAdapter(
+ TopicsControl.focusGained))
+
+ def topicTextChanged(self):
+ try:
+ # update the data model
+ ControlScroller.fieldInfo(self.offset, 1)
+ # update the preview document
+ TopicsControl.fieldChanged(self.offset, 1)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ called through an event listener when the
+ responsible text is changed by the user.
+ updates the data model and the preview document.
+ '''
+
+ def responsibleTextChanged(self):
+ try:
+ # update the data model
+ ControlScroller.fieldInfo(self.offset, 2)
+ # update the preview document
+ TopicsControl.fieldChanged(self.offset, 2)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ called through an event listener when the
+ time text is changed by the user.
+ updates the data model and the preview document.
+ '''
+
+ def timeTextChanged(self):
+ try:
+ # update the data model
+ ControlScroller.fieldInfo(self.offset, 3)
+ # update the preview document
+ TopicsControl.fieldChanged(self.offset, 3)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ enables/disables the row.
+ @param enabled true for enable, false for disable.
+ '''
+
+ def setEnabled(self, enabled):
+ self.dialog.setEnabled(self.label, enabled)
+ self.dialog.setEnabled(self.textbox, enabled)
+ self.dialog.setEnabled(self.combobox, enabled)
+ self.dialog.setEnabled(self.timebox, enabled)
+
+ '''
+ Impelementation of XKeyListener.
+ Optionally performs the one of the following:
+ cursor up, or down, row up or down
+ '''
+
+ def keyPressed(self, event):
+ try:
+ if self.isMoveDown(event):
+ TopicsControl.rowDown(self.offset, event.Source)
+ elif self.isMoveUp(event):
+ TopicsControl.rowUp(self.offset, event.Source)
+ elif self.isDown(event):
+ TopicsControl.cursorDown(self.offset, event.Source)
+ elif self.isUp(event):
+ TopicsControl.cursorUp(self.offset, event.Source)
+
+ TopicsControl.enableButtons()
+ except Exception:
+ traceback.print_exc()
+
+ def isMoveDown(self, e):
+ return (e.KeyCode == DOWN) and (e.Modifiers == MOD1)
+
+ def isMoveUp(self, e):
+ return (e.KeyCode == UP) and (e.Modifiers == MOD1)
+
+ def isDown(self, e):
+ return (e.KeyCode == DOWN) and (e.Modifiers == 0)
+
+ def isUp(self, e):
+ return (e.KeyCode == UP) and (e.Modifiers == 0)
diff --git a/wizards/com/sun/star/wizards/common/ConfigGroup.py b/wizards/com/sun/star/wizards/common/ConfigGroup.py
new file mode 100644
index 000000000000..b9fba2b23afd
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/ConfigGroup.py
@@ -0,0 +1,35 @@
+import traceback
+import inspect
+from wizards.common.ConfigNode import *
+from wizards.common.Configuration import Configuration
+
+class ConfigGroup(ConfigNode):
+
+ def writeConfiguration(self, configurationView, param):
+ for name,data in inspect.getmembers(self):
+ if name.startswith(param):
+ self.writeField( name, configurationView, param)
+
+ def writeField(self, field, configView, prefix):
+ propertyName = field[len(prefix):]
+ child = getattr(self, field)
+ if isinstance(child, ConfigNode):
+ child.writeConfiguration(configView.getByName(propertyName),
+ prefix)
+ else:
+ setattr(configView,propertyName,getattr(self,field))
+
+ def readConfiguration(self, configurationView, param):
+ for name,data in inspect.getmembers(self):
+ if name.startswith(param):
+ self.readField( name, configurationView, param)
+
+ def readField(self, field, configView, prefix):
+ propertyName = field[len(prefix):]
+ child = getattr(self, field)
+ if isinstance(child, ConfigNode):
+ child.root = self.root
+ child.readConfiguration(configView.getByName(propertyName),
+ prefix)
+ else:
+ setattr(self,field,configView.getByName(propertyName))
diff --git a/wizards/com/sun/star/wizards/common/ConfigSet.py b/wizards/com/sun/star/wizards/common/ConfigSet.py
new file mode 100644
index 000000000000..bcdf56b8f3ab
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/ConfigSet.py
@@ -0,0 +1,184 @@
+import traceback
+from wizards.common.ConfigNode import *
+from wizards.common.Configuration import Configuration
+
+class ConfigSet(ConfigNode):
+ '''
+ After reading the configuration set items,
+ the ConfigSet checks this field.
+ If it is true, it will remove any nulls from
+ the vector.
+ subclasses can change this field in the constructor
+ to avoid this "deletion" of nulls.
+ '''
+
+ def __init__(self, childType):
+ self.childClass = childType
+ self.childrenMap = {}
+ self.childrenList = []
+ self.noNulls = False
+
+ def add(self, name, o):
+ self.childrenMap[name] = o
+ if isinstance(name, int):
+ i = name
+ self.childrenList.insert(i, o)
+ else:
+ try:
+ i = o.cp_Index
+ oldSize = self.getSize()
+ if oldSize <= i:
+ newSize = i - oldSize
+ self.childrenList += [None] * newSize
+ self.noNulls = True
+ else:
+ self.noNulls = False
+ self.childrenList.insert(i, o);
+ if oldSize > i:
+ oldSize = i
+ except Exception:
+ self.childrenList.append(o)
+
+ def writeConfiguration(self, configView, param):
+ names = self.childrenMap.keys()
+ if isinstance(self.childClass, ConfigNode):
+ #first I remove all the children from the configuration.
+ children = configView.ElementNames
+ if children:
+ for i in children:
+ try:
+ Configuration.removeNode(configView, i)
+ except Exception:
+ traceback.print_exc()
+
+ # and add them new.
+ for i in names:
+ try:
+ child = self.getElement(i)
+ childView = configView.getByName(i)
+ child.writeConfiguration(childView, param)
+ except Exception:
+ traceback.print_exc()
+ else:
+ raise AttributeError (
+ "Unable to write primitive sets to configuration (not implemented)")
+
+ def readConfiguration(self, configurationView, param):
+ names = configurationView.ElementNames
+ if isinstance(self.childClass, ConfigNode):
+ if names:
+ for i in names:
+ try:
+ child = type(self.childClass)()
+ child.root = self.root
+ child.readConfiguration(
+ configurationView.getByName(i), param)
+ self.add(i, child)
+ except Exception, ex:
+ traceback.print_exc()
+ #remove any nulls from the list
+ if self.noNulls:
+ i = 0
+ while i < len(self.childrenList):
+ if self.childrenList[i] is None:
+ del self.childrenList[i]
+ i -= 1
+ i += 1
+
+ else:
+ for i in names:
+ try:
+ child = configurationView.getByName(i)
+ self.add(i, child)
+ except Exception, ex:
+ traceback.print_exc()
+
+ def remove(self, obj):
+ key = getKey(obj)
+ self.childrenMap.remove(key)
+ i = self.childrenList.indexOf(obj)
+ self.childrenList.remove(obj)
+ fireListDataListenerIntervalRemoved(i, i)
+
+ def remove(self, i):
+ o = getElementAt(i)
+ remove(o)
+
+ def clear(self):
+ self.childrenMap.clear()
+ del self.childrenList[:]
+
+ def createDOM(self, parent):
+ items = items()
+ i = 0
+ while i < items.length:
+ item = items[i]
+ if item.instanceof.XMLProvider:
+ item.createDOM(parent)
+
+ i += 1
+ return parent
+
+ def getKey(self, _object):
+ for k,v in self.childrenMap.items():
+ if v == _object:
+ return k
+
+ return None
+
+ def getElementAt(self, i):
+ return self.childrenList[i]
+
+ def getElement(self, o):
+ return self.childrenMap[o]
+
+ def getSize(self):
+ return len(self.childrenList)
+
+ def getIndexOf(self, item):
+ return self.childrenList.index(item)
+
+ '''
+ Set members might include a property
+ which orders them.
+ This method reindexes the given member to be
+ the index number 0
+ Do not forget to call commit() after calling this method.
+ @param confView
+ @param memebrName
+ '''
+
+ def reindexSet(self, confView, memberName, indexPropertyName):
+ '''
+ First I read all memebrs of the set,
+ except the one that should be number 0
+ to a vector, ordered by there index property
+ '''
+ names = Configuration.getChildrenNames(confView)
+ v = Vector.Vector_unknown(names.length)
+ member = None
+ index = 0
+ i = 0
+ while i < names.length:
+ if not names[i].equals(memberName):
+ member = Configuration.getConfigurationNode(names[i], confView)
+ index = Configuration.getInt(indexPropertyName, member)
+ while index >= v.size():
+ v.add(None)
+ v.setElementAt(member, index)
+ '''
+ Now I reindex them
+ '''
+
+ i += 1
+ index = 1
+ i = 0
+ while i < v.size():
+ member = v.get(i)
+ if member != None:
+ Configuration.set((index + 1), indexPropertyName, member)
+
+ i += 1
+
+ def sort(self, comparator):
+ self.childrenList.sort(comparator)
diff --git a/wizards/com/sun/star/wizards/common/Configuration.py b/wizards/com/sun/star/wizards/common/Configuration.py
new file mode 100644
index 000000000000..665442f9cbc1
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/Configuration.py
@@ -0,0 +1,215 @@
+import uno
+import traceback
+from wizards.common.PropertyNames import PropertyNames
+from wizards.common.Helper import *
+
+'''
+This class gives access to the OO configuration api.
+It contains 4 get and 4 set convenience methods for getting and settings
+properties in the configuration. <br/>
+For the get methods, two parameters must be given: name and parent, where
+name is the name of the property, parent is a HierarchyElement
+(::com::sun::star::configuration::HierarchyElement)<br/>
+The get and set methods support hieryrchical property names like
+"options/gridX". <br/>
+NOTE: not yet supported, but sometime later,
+If you will ommit the "parent" parameter, then the "name" parameter must be
+in hierarchy form from the root of the registry.
+'''
+
+class Configuration(object):
+
+ @classmethod
+ def getConfigurationRoot(self, xmsf, sPath, updateable):
+ oConfigProvider = xmsf.createInstance(
+ "com.sun.star.configuration.ConfigurationProvider")
+ args = []
+
+ aPathArgument = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ aPathArgument.Name = "nodepath"
+ aPathArgument.Value = sPath
+
+ args.append(aPathArgument)
+ if updateable:
+ sView = "com.sun.star.configuration.ConfigurationUpdateAccess"
+ aModeArgument = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ aModeArgument.Name = "lazywrite"
+ aModeArgument.Value = False
+ args.append(aModeArgument)
+ else:
+ sView = "com.sun.star.configuration.ConfigurationAccess"
+
+ return oConfigProvider.createInstanceWithArguments(sView, tuple(args))
+
+ @classmethod
+ def getProductName(self, xMSF):
+ try:
+ oProdNameAccess = self.getConfigurationRoot(xMSF,
+ "org.openoffice.Setup/Product", False)
+ ProductName = Helper.getUnoObjectbyName(oProdNameAccess, "ooName")
+ return ProductName
+ except Exception:
+ traceback.print_exc()
+ return None
+
+ @classmethod
+ def getOfficeLocaleString(self, xMSF):
+ sLocale = ""
+ try:
+ aLocLocale = Locale.Locale()
+ oMasterKey = self.getConfigurationRoot(xMSF,
+ "org.openoffice.Setup/L10N/", False)
+ sLocale = (String)
+ Helper.getUnoObjectbyName(oMasterKey, "ooLocale")
+ except Exception, exception:
+ traceback.print_exc()
+
+ return sLocale
+
+ @classmethod
+ def getOfficeLocale(self, xMSF):
+ aLocLocale = Locale.Locale()
+ sLocale = getOfficeLocaleString(xMSF)
+ sLocaleList = JavaTools.ArrayoutofString(sLocale, "-")
+ aLocLocale.Language = sLocaleList[0]
+ if sLocaleList.length > 1:
+ aLocLocale.Country = sLocaleList[1]
+
+ return aLocLocale
+
+ @classmethod
+ def getOfficeLinguistic(self, xMSF):
+ try:
+ oMasterKey = self.getConfigurationRoot(xMSF,
+ "org.openoffice.Setup/L10N/", False)
+ sLinguistic = Helper.getUnoObjectbyName(oMasterKey, "ooLocale")
+ return sLinguistic
+ except Exception, exception:
+ traceback.print_exc()
+ return None
+
+ @classmethod
+ def removeNode(self, configView, name, xmsf=None):
+ commitChanges = False
+ if xmsf is not None:
+ configView = self.getConfigurationRoot(xmsf, path, True)
+ commit = True
+
+ if configView.hasByName(name):
+ configView.removeByName(name)
+
+ if commitChanges:
+ configView.commitChanges()
+
+ @classmethod
+ def updateConfiguration(self, xmsf, path, name, node, param):
+ view = self.getConfigurationRoot(xmsf, path, True)
+ addConfigNode(path, name)
+ node.writeConfiguration(view, param)
+ view.commitChanges()
+
+ @classmethod
+ def getNodeDisplayNames(self, _xNameAccessNode):
+ snames = None
+ return getNodeChildNames(_xNameAccessNode,
+ PropertyNames.PROPERTY_NAME)
+
+ @classmethod
+ def getNodeChildNames(self, xNameAccessNode, _schildname):
+ snames = None
+ try:
+ snames = xNameAccessNode.getElementNames()
+ sdisplaynames = range(snames.length)
+ i = 0
+ while i < snames.length:
+ oContent = Helper.getUnoPropertyValue(
+ xNameAccessNode.getByName(snames[i]), _schildname)
+ if not AnyConverter.isVoid(oContent):
+ sdisplaynames[i] = (String)
+ Helper.getUnoPropertyValue(xNameAccessNode.getByName(
+ snames[i]), _schildname)
+ else:
+ sdisplaynames[i] = snames[i]
+
+ i += 1
+ return sdisplaynames
+ except Exception, e:
+ traceback.print_exc()
+ return snames
+
+ @classmethod
+ def getChildNodebyIndex(self, _xNameAccess, _index):
+ try:
+ snames = _xNameAccess.getElementNames()
+ oNode = _xNameAccess.getByName(snames[_index])
+ return oNode
+ except Exception, e:
+ traceback.print_exc()
+ return None
+
+ @classmethod
+ def getChildNodebyName(self, _xNameAccessNode, _SubNodeName):
+ try:
+ if _xNameAccessNode.hasByName(_SubNodeName):
+ return _xNameAccessNode.getByName(_SubNodeName)
+
+ except Exception, e:
+ traceback.print_exc()
+
+ return None
+
+ @classmethod
+ def getChildNodebyDisplayName(self, _xNameAccessNode, _displayname):
+ snames = None
+ return getChildNodebyDisplayName(_xNameAccessNode, _displayname,
+ PropertyNames.PROPERTY_NAME)
+
+ @classmethod
+ def getChildNodebyDisplayName(self, _xNameAccessNode, _displayname,
+ _nodename):
+
+ snames = None
+ try:
+ snames = _xNameAccessNode.getElementNames()
+ sdisplaynames = range(snames.length)
+ i = 0
+ while i < snames.length:
+ curdisplayname = Helper.getUnoPropertyValue(
+ _xNameAccessNode.getByName(snames[i]), _nodename)
+ if curdisplayname.equals(_displayname):
+ return _xNameAccessNode.getByName(snames[i])
+
+ i += 1
+ except Exception, e:
+ traceback.print_exc()
+
+ return None
+
+ @classmethod
+ def getChildNodebyDisplayName(self, _xMSF, _aLocale, _xNameAccessNode,
+ _displayname, _nodename, _nmaxcharcount):
+
+ snames = None
+ try:
+ snames = _xNameAccessNode.getElementNames()
+ sdisplaynames = range(snames.length)
+ i = 0
+ while i < snames.length:
+ curdisplayname = Helper.getUnoPropertyValue(
+ _xNameAccessNode.getByName(snames[i]), _nodename)
+ if (_nmaxcharcount > 0) and (_nmaxcharcount < \
+ curdisplayname.length()):
+ curdisplayname = curdisplayname.substring(0,
+ _nmaxcharcount)
+
+ curdisplayname = Desktop.removeSpecialCharacters(_xMSF,
+ _aLocale, curdisplayname)
+ if curdisplayname.equals(_displayname):
+ return _xNameAccessNode.getByName(snames[i])
+
+ i += 1
+ except Exception, e:
+ traceback.print_exc()
+ return None
diff --git a/wizards/com/sun/star/wizards/common/Desktop.py b/wizards/com/sun/star/wizards/common/Desktop.py
new file mode 100644
index 000000000000..99c908986a68
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/Desktop.py
@@ -0,0 +1,230 @@
+import uno
+import traceback
+from wizards.common.NoValidPathException import *
+
+from com.sun.star.frame.FrameSearchFlag import ALL, PARENT
+from com.sun.star.util import URL
+from com.sun.star.i18n.KParseTokens import ANY_LETTER_OR_NUMBER, ASC_UNDERSCORE
+
+
+class Desktop(object):
+
+ @classmethod
+ def getDesktop(self, xMSF):
+ xDesktop = None
+ if xMSF is not None:
+ try:
+ xDesktop = xMSF.createInstance( "com.sun.star.frame.Desktop")
+ except Exception, exception:
+ traceback.print_exc()
+ else:
+ print "Can't create a desktop. null pointer !"
+
+ return xDesktop
+
+ @classmethod
+ def getActiveFrame(self, xMSF):
+ xDesktop = self.getDesktop(xMSF)
+ return xDesktop.getActiveFrame()
+
+ @classmethod
+ def getActiveComponent(self, _xMSF):
+ xFrame = self.getActiveFrame(_xMSF)
+ return xFrame.getController().getModel()
+
+ @classmethod
+ def getActiveTextDocument(self, _xMSF):
+ xComponent = getActiveComponent(_xMSF)
+ return xComponent #Text
+
+ @classmethod
+ def getActiveSpreadsheetDocument(self, _xMSF):
+ xComponent = getActiveComponent(_xMSF)
+ return xComponent
+
+ @classmethod
+ def getDispatcher(self, xMSF, xFrame, _stargetframe, oURL):
+ try:
+ oURLArray = range(1)
+ oURLArray[0] = oURL
+ xDispatch = xFrame.queryDispatch(oURLArray[0], _stargetframe, ALL)
+ return xDispatch
+ except Exception, e:
+ e.printStackTrace(System.out)
+
+ return None
+
+ @classmethod
+ def connect(self, connectStr):
+ localContext = uno.getComponentContext()
+ resolver = localContext.ServiceManager.createInstanceWithContext(
+ "com.sun.star.bridge.UnoUrlResolver", localContext)
+ ctx = resolver.resolve( connectStr )
+ orb = ctx.ServiceManager
+ return orb
+
+ @classmethod
+ def getIncrementSuffix(self, xElementContainer, sElementName):
+ bElementexists = True
+ i = 1
+ sIncSuffix = ""
+ BaseName = sElementName
+ while bElementexists:
+ try:
+ bElementexists = xElementContainer.hasByName(sElementName)
+ except:
+ bElementexists = xElementContainer.hasByHierarchicalName(
+ sElementName)
+ if bElementexists:
+ i += 1
+ sElementName = BaseName + str(i)
+
+ if i > 1:
+ sIncSuffix = str(i)
+
+ return sIncSuffix
+
+ @classmethod
+ def checkforfirstSpecialCharacter(self, _xMSF, _sString, _aLocale):
+ try:
+ nStartFlags = ANY_LETTER_OR_NUMBER + ASC_UNDERSCORE
+ ocharservice = _xMSF.createInstance(
+ "com.sun.star.i18n.CharacterClassification")
+ aResult = ocharservice.parsePredefinedToken(KParseType.IDENTNAME,
+ _sString, 0, _aLocale, nStartFlags, "", nStartFlags, " ")
+ return aResult.EndPos
+ except Exception, e:
+ e.printStackTrace(System.out)
+ return -1
+
+ @classmethod
+ def removeSpecialCharacters(self, _xMSF, _aLocale, _sname):
+ snewname = _sname
+ i = 0
+ while i < snewname.length():
+ i = Desktop.checkforfirstSpecialCharacter(_xMSF, snewname,
+ _aLocale)
+ if i < snewname.length():
+ sspecialchar = snewname.substring(i, i + 1)
+ snewname = JavaTools.replaceSubString(snewname, "",
+ sspecialchar)
+
+ return snewname
+
+ '''
+ Checks if the passed Element Name already exists in the ElementContainer.
+ If yes it appends a suffix to make it unique
+ @param xElementContainer
+ @param sElementName
+ @return a unique Name ready to be added to the container.
+ '''
+
+ @classmethod
+ def getUniqueName(self, xElementContainer, sElementName):
+ sIncSuffix = self.getIncrementSuffix(xElementContainer, sElementName)
+ return sElementName + sIncSuffix
+
+class OfficePathRetriever:
+
+ def OfficePathRetriever(self, xMSF):
+ try:
+ TemplatePath = FileAccess.getOfficePath(xMSF,
+ "Template", "share", "/wizard")
+ UserTemplatePath = FileAccess.getOfficePath(xMSF,
+ "Template", "user", "")
+ BitmapPath = FileAccess.combinePaths(xMSF, TemplatePath,
+ "/../wizard/bitmap")
+ WorkPath = FileAccess.getOfficePath(xMSF,
+ "Work", "", "")
+ except NoValidPathException, nopathexception:
+ pass
+
+ @classmethod
+ def getTemplatePath(self, _xMSF):
+ sTemplatePath = ""
+ try:
+ sTemplatePath = FileAccess.getOfficePath(_xMSF,
+ "Template", "share", "/wizard")
+ except NoValidPathException, nopathexception:
+ pass
+ return sTemplatePath
+
+ @classmethod
+ def getUserTemplatePath(self, _xMSF):
+ sUserTemplatePath = ""
+ try:
+ sUserTemplatePath = FileAccess.getOfficePath(_xMSF,
+ "Template", "user", "")
+ except NoValidPathException, nopathexception:
+ pass
+ return sUserTemplatePath
+
+ @classmethod
+ def getBitmapPath(self, _xMSF):
+ sBitmapPath = ""
+ try:
+ sBitmapPath = FileAccess.combinePaths(_xMSF,
+ getTemplatePath(_xMSF), "/../wizard/bitmap")
+ except NoValidPathException, nopathexception:
+ pass
+
+ return sBitmapPath
+
+ @classmethod
+ def getWorkPath(self, _xMSF):
+ sWorkPath = ""
+ try:
+ sWorkPath = FileAccess.getOfficePath(_xMSF, "Work", "", "")
+
+ except NoValidPathException, nopathexception:
+ pass
+
+ return sWorkPath
+
+ @classmethod
+ def createStringSubstitution(self, xMSF):
+ xPathSubst = None
+ try:
+ xPathSubst = xMSF.createInstance(
+ "com.sun.star.util.PathSubstitution")
+ except com.sun.star.uno.Exception, e:
+ e.printStackTrace()
+
+ if xPathSubst != None:
+ return xPathSubst
+ else:
+ return None
+
+ '''This method searches (and hopefully finds...) a frame
+ with a componentWindow.
+ It does it in three phases:
+ 1. Check if the given desktop argument has a componentWindow.
+ If it is null, the myFrame argument is taken.
+ 2. Go up the tree of frames and search a frame with a component window.
+ 3. Get from the desktop all the components, and give the first one
+ which has a frame.
+ @param xMSF
+ @param myFrame
+ @param desktop
+ @return
+ @throws NoSuchElementException
+ @throws WrappedTargetException
+ '''
+
+ @classmethod
+ def findAFrame(self, xMSF, myFrame, desktop):
+ if desktop == None:
+ desktop = myFrame
+ #we go up in the tree...
+
+ while desktop != None and desktop.getComponentWindow() == None:
+ desktop = desktop.findFrame("_parent", FrameSearchFlag.PARENT)
+ if desktop == None:
+ e = Desktop.getDesktop(xMSF).getComponents().createEnumeration()
+ while e.hasMoreElements():
+ xModel = (e.nextElement()).getObject()
+ xFrame = xModel.getCurrentController().getFrame()
+ if xFrame != None and xFrame.getComponentWindow() != None:
+ return xFrame
+
+ return desktop
diff --git a/wizards/com/sun/star/wizards/common/FileAccess.py b/wizards/com/sun/star/wizards/common/FileAccess.py
new file mode 100644
index 000000000000..e76c49a67704
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/FileAccess.py
@@ -0,0 +1,676 @@
+import traceback
+import types
+from os import path as osPath
+from wizards.common.NoValidPathException import *
+
+from com.sun.star.ucb import CommandAbortedException
+from com.sun.star.awt.VclWindowPeerAttribute import OK, YES_NO
+
+'''
+This class delivers static convenience methods
+to use with ucb SimpleFileAccess service.
+You can also instanciate the class, to encapsulate
+some functionality of SimpleFileAccess. The instance
+keeps a reference to an XSimpleFileAccess and an
+XFileIdentifierConverter, saves the permanent
+overhead of quering for those interfaces, and delivers
+conveneince methods for using them.
+These Convenince methods include mainly Exception-handling.
+'''
+
+class FileAccess(object):
+ '''
+ @param xMSF
+ @param sPath
+ @param sAddPath
+ '''
+
+ @classmethod
+ def addOfficePath(self, xMSF, sPath, sAddPath):
+ xSimpleFileAccess = None
+ ResultPath = getOfficePath(xMSF, sPath, xSimpleFileAccess)
+ '''
+ As there are several conventions about the look of Url
+ (e.g. with " " or with "%20") you cannot make a
+ simple String comparison to find out, if a path
+ is already in "ResultPath
+ '''
+ PathList = JavaTools.ArrayoutofString(ResultPath, ";")
+ MaxIndex = PathList.length - 1
+ CompAddPath = JavaTools.replaceSubString(sAddPath, "", "/")
+ i = 0
+ while i <= MaxIndex:
+ CurPath = JavaTools.convertfromURLNotation(PathList[i])
+ CompCurPath = JavaTools.replaceSubString(CurPath, "", "/")
+ if CompCurPath.equals(CompAddPath):
+ return
+
+ i += 1
+ ResultPath += ";" + sAddPath
+ return
+
+ @classmethod
+ def deleteLastSlashfromUrl(self, _sPath):
+ if _sPath.endswith("/"):
+ return _sPath[:-1]
+ else:
+ return _sPath
+
+ '''
+ Further information on arguments value see in OO Developer Guide,
+ chapter 6.2.7
+ @param xMSF
+ @param sPath
+ @param xSimpleFileAccess
+ @return the respective path of the office application.
+ A probable following "/" at the end is trimmed.
+ '''
+
+ @classmethod
+ def getOfficePath(self, xMSF, sPath, xSimpleFileAccess):
+ try:
+ ResultPath = ""
+ xInterface = xMSF.createInstance("com.sun.star.util.PathSettings")
+ ResultPath = str(Helper.getUnoPropertyValue(xInterface, sPath))
+ ResultPath = self.deleteLastSlashfromUrl(ResultPath)
+ return ResultPath
+ except Exception, exception:
+ traceback.print_exc()
+ return ""
+
+ '''
+ Further information on arguments value see in OO Developer Guide,
+ chapter 6.2.7
+ @param xMSF
+ @param sPath
+ @param sType use "share" or "user". Set to ""
+ f not needed eg for the WorkPath;
+ In the return Officepath a possible slash at the end is cut off
+ @param sSearchDir
+ @return
+ @throws NoValidPathException
+ '''
+
+ @classmethod
+ def getOfficePath2(self, xMSF, sPath, sType, sSearchDir):
+ #This method currently only works with sPath="Template"
+ bexists = False
+ try:
+ xPathInterface = xMSF.createInstance(
+ "com.sun.star.util.PathSettings")
+ ResultPath = ""
+ ReadPaths = ()
+ xUcbInterface = xMSF.createInstance(
+ "com.sun.star.ucb.SimpleFileAccess")
+ Template_writable = xPathInterface.getPropertyValue(
+ sPath + "_writable")
+ Template_internal = xPathInterface.getPropertyValue(
+ sPath + "_internal")
+ Template_user = xPathInterface.getPropertyValue(
+ sPath + "_user")
+ if type(Template_internal) is not types.InstanceType:
+ ReadPaths = ReadPaths + Template_internal
+ if type(Template_user) is not types.InstanceType:
+ ReadPaths = ReadPaths + Template_user
+ ReadPaths = ReadPaths + (Template_writable,)
+ if sType.lower() == "user":
+ ResultPath = Template_writable
+ bexists = True
+ else:
+ #find right path using the search sub path
+ for i in ReadPaths:
+ tmpPath = i + sSearchDir
+ if xUcbInterface.exists(tmpPath):
+ ResultPath = i
+ bexists = True
+ break
+
+ ResultPath = self.deleteLastSlashfromUrl(ResultPath)
+ except Exception, exception:
+ traceback.print_exc()
+ ResultPath = ""
+
+ if not bexists:
+ raise NoValidPathException (xMSF, "");
+
+ return ResultPath
+
+ @classmethod
+ def getOfficePaths(self, xMSF, _sPath, sType, sSearchDir):
+ #This method currently only works with sPath="Template"
+ aPathList = []
+ Template_writable = ""
+ try:
+ xPathInterface = xMSF.createInstance(
+ "com.sun.star.util.PathSettings")
+ Template_writable = xPathInterface.getPropertyValue(
+ _sPath + "_writable")
+ Template_internal = xPathInterface.getPropertyValue(
+ _sPath + "_internal")
+ Template_user = xPathInterface.getPropertyValue(_sPath + "_user")
+ i = 0
+ for i in Template_internal:
+ if i.startsWith("vnd."):
+ # if there exists a language in the directory,
+ # we try to add the right language
+ sPathToExpand = sPath.substring(len("vnd.sun.star.Expand:"))
+ xExpander = Helper.getMacroExpander(xMSF)
+ sPath = xExpander.expandMacros(sPathToExpand)
+
+ sPath = checkIfLanguagePathExists(xMSF, sPath)
+ aPathList.add(sPath)
+ i += 1
+ i = 0
+ while i < Template_user.length:
+ aPathList.add(Template_user[i])
+ i += 1
+ aPathList.add(Template_writable)
+
+ except Exception, exception:
+ traceback.print_exc()
+ return aPathList
+
+ @classmethod
+ def checkIfLanguagePathExists(self, _xMSF, _sPath):
+ try:
+ defaults = _xMSF.createInstance("com.sun.star.text.Defaults")
+ aLocale = Helper.getUnoStructValue(defaults, "CharLocale")
+ if aLocale == None:
+ java.util.Locale.getDefault()
+ aLocale = com.sun.star.lang.Locale.Locale()
+ aLocale.Country = java.util.Locale.getDefault().getCountry()
+ aLocale.Language = java.util.Locale.getDefault().getLanguage()
+ aLocale.Variant = java.util.Locale.getDefault().getVariant()
+
+ sLanguage = aLocale.Language
+ sCountry = aLocale.Country
+ sVariant = aLocale.Variant
+ # de-DE-Bayrisch
+ aLocaleAll = StringBuffer.StringBuffer()
+ aLocaleAll.append(sLanguage).append('-').append(sCountry).append('-').append(sVariant)
+ sPath = _sPath + "/" + aLocaleAll.toString()
+ xInterface = _xMSF.createInstance(
+ "com.sun.star.ucb.SimpleFileAccess")
+ if xInterface.exists(sPath):
+ # de-DE
+ return sPath
+
+ aLocaleLang_Country = StringBuffer.StringBuffer()
+ aLocaleLang_Country.append(sLanguage).append('-').append(sCountry)
+ sPath = _sPath + "/" + aLocaleLang_Country.toString()
+ if xInterface.exists(sPath):
+ # de
+ return sPath
+
+ aLocaleLang = StringBuffer.StringBuffer()
+ aLocaleLang.append(sLanguage)
+ sPath = _sPath + "/" + aLocaleLang.toString()
+ if xInterface.exists(sPath):
+ # the absolute default is en-US or en
+ return sPath
+
+ sPath = _sPath + "/en-US"
+ if xInterface.exists(sPath):
+ return sPath
+
+ sPath = _sPath + "/en"
+ if xInterface.exists(sPath):
+ return sPath
+
+ except com.sun.star.uno.Exception, e:
+ pass
+
+ return _sPath
+
+ @classmethod
+ def combinePaths2(self, xMSF, _aFirstPath, _sSecondPath):
+ i = 0
+ while i < _aFirstPath.size():
+ sOnePath = _aFirstPath.get(i)
+ sOnePath = addPath(sOnePath, _sSecondPath)
+ if isPathValid(xMSF, sOnePath):
+ _aFirstPath.add(i, sOnePath)
+ _aFirstPath.remove(i + 1)
+ else:
+ _aFirstPath.remove(i)
+ i -= 1
+
+ i += 1
+
+ @classmethod
+ def isPathValid(self, xMSF, _sPath):
+ bExists = False
+ try:
+ xUcbInterface = xMSF.createInstance(
+ "com.sun.star.ucb.SimpleFileAccess")
+ bExists = xUcbInterface.exists(_sPath)
+ except Exception, exception:
+ traceback.print_exc()
+
+ return bExists
+
+ @classmethod
+ def combinePaths(self, xMSF, _sFirstPath, _sSecondPath):
+ bexists = False
+ ReturnPath = ""
+ try:
+ xUcbInterface = xMSF.createInstance(
+ "com.sun.star.ucb.SimpleFileAccess")
+ ReturnPath = _sFirstPath + _sSecondPath
+ bexists = xUcbInterface.exists(ReturnPath)
+ except Exception, exception:
+ traceback.print_exc()
+ return ""
+
+ if not bexists:
+ raise NoValidPathException (xMSF, "");
+
+ return ReturnPath
+
+ @classmethod
+ def createSubDirectory(self, xMSF, xSimpleFileAccess, Path):
+ sNoDirCreation = ""
+ try:
+ oResource = Resource.Resource_unknown(xMSF, "ImportWizard", "imp")
+ if oResource != None:
+ sNoDirCreation = oResource.getResText(1050)
+ sMsgDirNotThere = oResource.getResText(1051)
+ sQueryForNewCreation = oResource.getResText(1052)
+ OSPath = JavaTools.convertfromURLNotation(Path)
+ sQueryMessage = JavaTools.replaceSubString(sMsgDirNotThere,
+ OSPath, "%1")
+ sQueryMessage = sQueryMessage + (char)
+ 13 + sQueryForNewCreation
+ icreate = SystemDialog.showMessageBox(xMSF, "QueryBox",
+ YES_NO, sQueryMessage)
+ if icreate == 2:
+ xSimpleFileAccess.createFolder(Path)
+ return True
+
+ return False
+ except Exception:
+ sMsgNoDir = JavaTools.replaceSubString(sNoDirCreation, Path, "%1")
+ SystemDialog.showMessageBox(xMSF, "ErrorBox", OK, sMsgNoDir)
+ return False
+
+ @classmethod
+ def getFolderTitles(self, xMSF, FilterName, FolderName):
+ LocLayoutFiles = [[2],[]]
+ try:
+ xDocInterface = xMSF.createInstance(
+ "com.sun.star.document.DocumentProperties")
+ xInterface = xMSF.createInstance(
+ "com.sun.star.ucb.SimpleFileAccess")
+ nameList = xInterface.getFolderContents(FolderName, False)
+ TitleVector = []
+ NameVector = []
+ if FilterName is None or FilterName == "":
+ FilterName = None
+ else:
+ FilterName = FilterName + "-"
+ fileName = ""
+ NameVectorAppend = NameVector.append
+ TitleVectorAppend = TitleVector.append
+ for i in nameList:
+ fileName = self.getFilename(i)
+ if FilterName is None or fileName.startswith(FilterName):
+ xDocInterface.loadFromMedium(i, tuple())
+ NameVectorAppend(i)
+ TitleVectorAppend(xDocInterface.Title)
+
+ LocLayoutFiles[1] = NameVector
+ LocLayoutFiles[0] = TitleVector
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ return self.__bubblesortList(LocLayoutFiles)
+
+ '''
+ This function bubble sorts an array of with 2 dimensions.
+ The default sorting order is the first dimension
+ Only if sort2ndValue is True the second dimension is
+ the relevant for the sorting order
+ '''
+
+ @classmethod
+ def __bubblesortList(self, SortList):
+ SortCount = len(SortList[0])
+ DimCount = len(SortList)
+ for i in xrange(SortCount):
+ for t in xrange(SortCount - i - 1):
+ if SortList[0][t] > SortList[0][t + 1]:
+ for k in xrange(DimCount):
+ DisplayDummy = SortList[k][t];
+ SortList[k][t] = SortList[k][t + 1];
+ SortList[k][t + 1] = DisplayDummy
+ return SortList
+ '''
+ We search in all given path for a given file
+ @param _sPath
+ @param _sPath2
+ @return
+ '''
+
+ @classmethod
+ def addPath(self, _sPath, _sPath2):
+ if not _sPath.endsWith("/"):
+ _sPath += "/"
+
+ if _sPath2.startsWith("/"):
+ _sPath2 = _sPath2.substring(1)
+
+ sNewPath = _sPath + _sPath2
+ return sNewPath
+
+ @classmethod
+ def getPathFromList(self, xMSF, _aList, _sFile):
+ sFoundFile = ""
+ try:
+ xInterface = xMSF.createInstance(
+ "com.sun.star.ucb.SimpleFileAccess")
+ i = 0
+ while i < _aList.size():
+ sPath = _aList.get(i)
+ sPath = addPath(sPath, _sFile)
+ if xInterface.exists(sPath):
+ sFoundFile = sPath
+
+ i += 1
+ except Exception, e:
+ pass
+
+ return sFoundFile
+
+ @classmethod
+ def getTitle(self, xMSF, _sFile):
+ sTitle = ""
+ try:
+ xDocInterface = xMSF.createInstance(
+ "com.sun.star.document.DocumentProperties")
+ noArgs = []
+ xDocInterface.loadFromMedium(_sFile, noArgs)
+ sTitle = xDocInterface.getTitle()
+ except Exception, e:
+ traceback.print_exc()
+
+ return sTitle
+
+ def __init__(self, xmsf):
+ #get a simple file access...
+ self.fileAccess = xmsf.createInstance(
+ "com.sun.star.ucb.SimpleFileAccess")
+ #get the file identifier converter
+ self.filenameConverter = xmsf.createInstance(
+ "com.sun.star.ucb.FileContentProvider")
+
+ def getURL(self, path, childPath=None):
+ try:
+ f = open(path, 'w')
+
+ r = self.filenameConverter.getFileURLFromSystemPath(path,
+ osPath.abspath(path))
+ return r
+ except Exception:
+ traceback.print_exc()
+ return None
+
+ def getPath(self, parentURL, childURL):
+ string = ""
+ if childURL is not None and childURL is not "":
+ string = "/" + childURL
+ return self.filenameConverter.getSystemPathFromFileURL(
+ parentURL + string)
+
+ '''
+ @author rpiterman
+ @param filename
+ @return the extension of the given filename.
+ '''
+
+ @classmethod
+ def getExtension(self, filename):
+ p = filename.indexOf(".")
+ if p == -1:
+ return ""
+ else:
+ while p > -1:
+ filename = filename.substring(p + 1)
+ p = filename.indexOf(".")
+
+ return filename
+
+ '''
+ @author rpiterman
+ @param s
+ @return
+ '''
+
+ def mkdir(self, s):
+ try:
+ self.fileAccess.createFolder(s)
+ return True
+ except Exception:
+ traceback.print_exc()
+
+ return False
+
+ '''
+ @author rpiterman
+ @param filename
+ @param def what to return in case of an exception
+ @return true if the given file exists or not.
+ if an exception accures, returns the def value.
+ '''
+
+ def exists(self, filename, defe):
+ try:
+ return self.fileAccess.exists(filename)
+ except Exception:
+ traceback.print_exc()
+
+ return defe
+
+ '''
+ @author rpiterman
+ @param filename
+ @return
+ '''
+
+ def isDirectory(self, filename):
+ try:
+ return self.fileAccess.isFolder(filename)
+ except Exception:
+ traceback.print_exc()
+
+ return False
+
+ '''
+ lists the files in a given directory
+ @author rpiterman
+ @param dir
+ @param includeFolders
+ @return
+ '''
+
+ def listFiles(self, dir, includeFolders):
+ try:
+ return self.fileAccess.getFolderContents(dir, includeFolders)
+ except Exception:
+ traceback.print_exc()
+
+ return range(0)
+
+ '''
+ @author rpiterman
+ @param file
+ @return
+ '''
+
+ def delete(self, file):
+ try:
+ self.fileAccess.kill(file)
+ return True
+ except Exception:
+ traceback.print_exc()
+
+ return False
+
+
+ '''
+ return the filename out of a system-dependent path
+ @param path
+ @return
+ '''
+
+ @classmethod
+ def getPathFilename(self, path):
+ return self.getFilename(path, File.separator)
+
+ '''
+ @author rpiterman
+ @param path
+ @param pathSeparator
+ @return
+ '''
+
+ @classmethod
+ def getFilename(self, path, pathSeparator = "/"):
+ return path.split(pathSeparator)[-1]
+
+ @classmethod
+ def getBasename(self, path, pathSeparator):
+ filename = self.getFilename(path, pathSeparator)
+ sExtension = getExtension(filename)
+ basename = filename.substring(0, filename.length() - \
+ (sExtension.length() + 1))
+ return basename
+
+ '''
+ @author rpiterman
+ @param source
+ @param target
+ @return
+ '''
+
+ def copy(self, source, target):
+ try:
+ self.fileAccess.copy(source, target)
+ return True
+ except Exception:
+ traceback.print_exc()
+
+ return False
+
+ def getLastModified(self, url):
+ try:
+ return self.fileAccess.getDateTimeModified(url)
+ except Exception:
+ traceback.print_exc()
+
+ return None
+
+ '''
+ @param url
+ @return the parent dir of the given url.
+ if the path points to file, gives the directory in which the file is.
+ '''
+
+ @classmethod
+ def getParentDir(self, url):
+ while url[-1] == "/":
+ url = hello[:-1]
+ return url[:url.rfind("/")]
+
+ def createNewDir(self, parentDir, name):
+ s = self.getNewFile(parentDir, name, "")
+ if self.mkdir(s):
+ return s
+ else:
+ return None
+
+ def getNewFile(self, parentDir, name, extension):
+ i = 0
+ temp = True
+ while temp:
+ filename = self.filename(name, extension, i)
+ url = parentDir + "/" + filename
+ temp = self.exists(url, True)
+ i += 1
+ return url
+
+ @classmethod
+ def filename(self, name, ext, i):
+ stringI = ""
+ stringExt = ""
+ if i != 0:
+ stringI = str(i)
+ if ext != "":
+ stringExt = "." + ext
+
+ return name + stringI + stringExt
+
+ def getSize(self, url):
+ try:
+ return self.fileAccess.getSize(url)
+ except Exception, ex:
+ return -1
+
+ @classmethod
+ def connectURLs(self, urlFolder, urlFilename):
+ stringFolder = ""
+ stringFileName = urlFilename
+ if not urlFolder.endswith("/"):
+ stringFolder = "/"
+ if urlFilename.startswith("/"):
+ stringFileName = urlFilename[1:]
+ return urlFolder + stringFolder + stringFileName
+
+ @classmethod
+ def getDataFromTextFile(self, _xMSF, _filepath):
+ sFileData = None
+ try:
+ oDataVector = []
+ oSimpleFileAccess = _xMSF.createInstance(
+ "com.sun.star.ucb.SimpleFileAccess")
+ if oSimpleFileAccess.exists(_filepath):
+ xInputStream = oSimpleFileAccess.openFileRead(_filepath)
+ oTextInputStream = _xMSF.createInstance(
+ "com.sun.star.io.TextInputStream")
+ oTextInputStream.setInputStream(xInputStream)
+ while not oTextInputStream.isEOF():
+ oDataVector.addElement(oTextInputStream.readLine())
+ oTextInputStream.closeInput()
+ sFileData = [oDataVector.size()]
+ oDataVector.toArray(sFileData)
+
+ except Exception, e:
+ traceback.print_exc()
+
+ return sFileData
+
+ '''
+ shortens a filename to a user displayable representation.
+ @param path
+ @param maxLength
+ @return
+ '''
+
+ @classmethod
+ def getShortFilename(self, path, maxLength):
+ firstPart = 0
+ if path.length() > maxLength:
+ if path.startsWith("/"):
+ # unix
+ nextSlash = path.indexOf("/", 1) + 1
+ firstPart = Math.min(nextSlash, (maxLength - 3) / 2)
+ else:
+ #windows
+ firstPart = Math.min(10, (maxLength - 3) / 2)
+
+ s1 = path.substring(0, firstPart)
+ s2 = path.substring(path.length() - (maxLength - (3 + firstPart)))
+ return s1 + "..." + s2
+ else:
+ return path
+
diff --git a/wizards/com/sun/star/wizards/common/Helper.py b/wizards/com/sun/star/wizards/common/Helper.py
new file mode 100644
index 000000000000..9ec970f72e0d
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/Helper.py
@@ -0,0 +1,160 @@
+import uno
+import traceback
+from datetime import date as DateTime
+from wizards.common.NumberFormatter import NumberFormatter
+
+from com.sun.star.uno import RuntimeException
+
+class Helper(object):
+
+ @classmethod
+ def setUnoPropertyValue(self, xPSet, PropertyName, PropertyValue):
+ try:
+ if PropertyValue is not None:
+ setattr(xPSet, PropertyName, PropertyValue)
+
+ except AttributeError:
+ raise AttributeError, "No Such Property: '%s'" % PropertyName
+ except Exception:
+ traceback.print_exc()
+
+ @classmethod
+ def getUnoObjectbyName(self, xName, ElementName):
+ try:
+ if xName.hasByName(ElementName):
+ return xName.getByName(ElementName)
+ else:
+ raise RuntimeException()
+
+ except Exception, exception:
+ traceback.print_exc()
+ return None
+
+ @classmethod
+ def getPropertyValue(self, CurPropertyValue, PropertyName):
+ for i in CurPropertyValue:
+ if i is not None:
+ if i.Name == PropertyName:
+ return i.Value
+
+ raise RuntimeException()
+
+ @classmethod
+ def getUnoPropertyValue(self, xPSet, PropertyName):
+ try:
+ if xPSet is not None:
+ oObject = xPSet.getPropertyValue(PropertyName)
+ return oObject
+ return None
+
+ except Exception, exception:
+ traceback.print_exc()
+ return None
+
+ @classmethod
+ def getUnoArrayPropertyValue(self, xPSet, PropertyName):
+ try:
+ if xPSet is not None:
+ oObject = xPSet.getPropertyValue(PropertyName)
+ if isinstance(oObject,list):
+ return getArrayValue(oObject)
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ return None
+
+ @classmethod
+ def getUnoStructValue(self, xPSet, PropertyName):
+ try:
+ if xPSet is not None:
+ if xPSet.getPropertySetInfo().hasPropertyByName(PropertyName):
+ oObject = xPSet.getPropertyValue(PropertyName)
+ return oObject
+
+ return None
+ except Exception, exception:
+ traceback.print_exc()
+ return None
+
+ @classmethod
+ def setUnoPropertyValues(self, xMultiPSetLst, PropertyNames,
+ PropertyValues):
+ try:
+ if xMultiPSetLst is not None:
+ uno.invoke(xMultiPSetLst, "setPropertyValues",
+ (PropertyNames, PropertyValues))
+ else:
+ for index, workwith in enumerate(PropertyNames):
+ self.setUnoPropertyValue(
+ xMultiPSetLst, PropertyNames[index], workwith)
+
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ checks if the value of an object that represents an array is null.
+ check beforehand if the Object is really an array with
+ "AnyConverter.IsArray(oObject)
+ @param oValue the paramter that has to represent an object
+ @return a null reference if the array is empty
+ '''
+
+ @classmethod
+ def getArrayValue(self, oValue):
+ try:
+ #VetoableChangeSupport Object
+ oPropList = list(oValue)
+ nlen = len(oPropList)
+ if nlen == 0:
+ return None
+ else:
+ return oPropList
+
+ except Exception, exception:
+ traceback.print_exc()
+ return None
+
+ def getComponentContext(_xMSF):
+ #Get the path to the extension and
+ #try to add the path to the class loader
+ aHelper = PropertySetHelper(_xMSF);
+ aDefaultContext = aHelper.getPropertyValueAsObject("DefaultContext")
+ return aDefaultContext;
+
+ def getMacroExpander(_xMSF):
+ xComponentContext = self.getComponentContext(_xMSF);
+ aSingleton = xComponentContext.getValueByName(
+ "/singletons/com.sun.star.util.theMacroExpander")
+ return aSingleton;
+
+ class DateUtils(object):
+
+ def __init__(self, xmsf, document):
+ defaults = xmsf.createInstance("com.sun.star.text.Defaults")
+ l = Helper.getUnoStructValue(defaults, "CharLocale")
+ self.formatSupplier = document
+ formatSettings = self.formatSupplier.getNumberFormatSettings()
+ date = Helper.getUnoPropertyValue(formatSettings, "NullDate")
+ self.calendar = DateTime(date.Year, date.Month, date.Day)
+ self.formatter = NumberFormatter.createNumberFormatter(xmsf,
+ self.formatSupplier)
+
+ '''
+ @param format a constant of the enumeration NumberFormatIndex
+ @return
+ '''
+
+ def getFormat(self, format):
+ return NumberFormatter.getNumberFormatterKey(
+ self.formatSupplier, format)
+
+ '''
+ @param date a VCL date in form of 20041231
+ @return a document relative date
+ '''
+
+ def format(self, formatIndex, date):
+ difference = date - self.calendar
+ return self.formatter.convertNumberToString(formatIndex,
+ difference.days)
diff --git a/wizards/com/sun/star/wizards/common/NumberFormatter.py b/wizards/com/sun/star/wizards/common/NumberFormatter.py
new file mode 100644
index 000000000000..d2737f05c66a
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/NumberFormatter.py
@@ -0,0 +1,232 @@
+import traceback
+
+from com.sun.star.lang import Locale
+from com.sun.star.util.NumberFormat import DATE, LOGICAL, DATETIME, TEXT, NUMBER
+
+class NumberFormatter(object):
+
+ def __init__(self, _xNumberFormatsSupplier, _aLocale, _xMSF=None):
+ self.iDateFormatKey = -1
+ self.iDateTimeFormatKey = -1
+ self.iNumberFormatKey = -1
+ self.iTextFormatKey = -1
+ self.iTimeFormatKey = -1
+ self.iLogicalFormatKey = -1
+ self.bNullDateCorrectionIsDefined = False
+ self.aLocale = _aLocale
+ if _xMSF is not None:
+ self.xNumberFormatter = _xMSF.createInstance(
+ "com.sun.star.util.NumberFormatter")
+ self.xNumberFormats = _xNumberFormatsSupplier.NumberFormats
+ self.xNumberFormatSettings = \
+ _xNumberFormatsSupplier.NumberFormatSettings
+ self.xNumberFormatter.attachNumberFormatsSupplier(
+ _xNumberFormatsSupplier)
+
+ '''
+ @param _xMSF
+ @param _xNumberFormatsSupplier
+ @return
+ @throws Exception
+ @deprecated
+ '''
+
+ @classmethod
+ def createNumberFormatter(self, _xMSF, _xNumberFormatsSupplier):
+ oNumberFormatter = _xMSF.createInstance(
+ "com.sun.star.util.NumberFormatter")
+ oNumberFormatter.attachNumberFormatsSupplier(_xNumberFormatsSupplier)
+ return oNumberFormatter
+
+ '''
+ gives a key to pass to a NumberFormat object. <br/>
+ example: <br/>
+ <pre>
+ XNumberFormatsSupplier nsf =
+ (XNumberFormatsSupplier)UnoRuntime.queryInterface(...,document)
+ int key = Desktop.getNumberFormatterKey(
+ nsf, ...star.i18n.NumberFormatIndex.DATE...)
+ XNumberFormatter nf = Desktop.createNumberFormatter(xmsf, nsf);
+ nf.convertNumberToString( key, 1972 );
+ </pre>
+ @param numberFormatsSupplier
+ @param type - a constant out of i18n.NumberFormatIndex enumeration.
+ @return a key to use with a util.NumberFormat instance.
+ '''
+
+ @classmethod
+ def getNumberFormatterKey(self, numberFormatsSupplier, Type):
+ return numberFormatsSupplier.NumberFormats.getFormatIndex(
+ Type, Locale())
+
+ def convertNumberToString(self, _nkey, _dblValue, _xNumberFormatter=None):
+ if _xNumberFormatter is None:
+ return self.xNumberFormatter.convertNumberToString(
+ _nkey, _dblValue)
+ else:
+ return _xNumberFormatter.convertNumberToString(_nkey, _dblValue)
+
+ def convertStringToNumber(self, _nkey, _sString):
+ return self.xNumberFormatter.convertStringToNumber(_nkey, _sString)
+
+ '''
+ @param dateCorrection The lDateCorrection to set.
+ '''
+
+ def setNullDateCorrection(self, dateCorrection):
+ self.lDateCorrection = dateCorrection
+
+ def defineNumberFormat(self, _FormatString):
+ try:
+ NewFormatKey = self.xNumberFormats.queryKey(
+ _FormatString, self.aLocale, True)
+ if NewFormatKey is -1:
+ NewFormatKey = self.xNumberFormats.addNew(
+ _FormatString, self.aLocale)
+
+ return NewFormatKey
+ except Exception, e:
+ traceback.print_exc()
+ return -1
+
+ '''
+ returns a numberformat for a FormatString.
+ @param _FormatString
+ @param _aLocale
+ @return
+ '''
+
+ def defineNumberFormat(self, _FormatString, _aLocale):
+ try:
+ NewFormatKey = self.xNumberFormats.queryKey(
+ _FormatString, _aLocale, True)
+ if NewFormatKey == -1:
+ NewFormatKey = self.xNumberFormats.addNew(
+ _FormatString, _aLocale)
+
+ return NewFormatKey
+ except Exception, e:
+ traceback.print_exc()
+ return -1
+
+ def setNumberFormat(self, _xFormatObject, _FormatKey, _oNumberFormatter):
+ try:
+ xNumberFormat = _oNumberFormatter.xNumberFormats.getByKey(
+ _FormatKey)
+ FormatString = str(Helper.getUnoPropertyValue(
+ xNumberFormat, "FormatString"))
+ oLocale = Helper.getUnoPropertyValue(xNumberFormat, "Locale")
+ NewFormatKey = defineNumberFormat(FormatString, oLocale)
+ _xFormatObject.setPropertyValue(
+ "FormatsSupplier",
+ _oNumberFormatter.xNumberFormatter.getNumberFormatsSupplier())
+ if _xFormatObject.getPropertySetInfo().hasPropertyByName(
+ "NumberFormat"):
+ _xFormatObject.setPropertyValue("NumberFormat", NewFormatKey)
+ elif _xFormatObject.getPropertySetInfo().hasPropertyByName(
+ "FormatKey"):
+ _xFormatObject.setPropertyValue("FormatKey", NewFormatKey)
+ else:
+ # TODO: throws a exception in a try catch environment, very helpful?
+ raise Exception
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ def getNullDateCorrection(self):
+ if not self.bNullDateCorrectionIsDefined:
+ dNullDate = Helper.getUnoStructValue(
+ self.xNumberFormatSettings, "NullDate")
+ lNullDate = Helper.convertUnoDatetoInteger(dNullDate)
+ oCal = java.util.Calendar.getInstance()
+ oCal.set(1900, 1, 1)
+ dTime = oCal.getTime()
+ lTime = dTime.getTime()
+ lDBNullDate = lTime / (3600 * 24000)
+ self.lDateCorrection = lDBNullDate - lNullDate
+ return self.lDateCorrection
+ else:
+ return self.lDateCorrection
+
+ def setBooleanReportDisplayNumberFormat(self):
+ FormatString = "[=1]" + str(9745) + ";[=0]" + str(58480) + ";0"
+ self.iLogicalFormatKey = self.xNumberFormats.queryKey(
+ FormatString, self.aLocale, True)
+ try:
+ if self.iLogicalFormatKey == -1:
+ self.iLogicalFormatKey = self.xNumberFormats.addNew(
+ FormatString, self.aLocale)
+
+ except Exception, e:
+ #MalformedNumberFormat
+ traceback.print_exc()
+ self.iLogicalFormatKey = self.xNumberFormats.getStandardFormat(
+ NumberFormat.LOGICAL, self.aLocale)
+
+ return self.iLogicalFormatKey
+
+ '''
+ @return Returns the iDateFormatKey.
+ '''
+
+ def getDateFormatKey(self):
+ if self.iDateFormatKey == -1:
+ self.iDateFormatKey = self.xNumberFormats.getStandardFormat(
+ NumberFormat.DATE, self.aLocale)
+
+ return self.iDateFormatKey
+
+ '''
+ @return Returns the iDateTimeFormatKey.
+ '''
+
+ def getDateTimeFormatKey(self):
+ if self.iDateTimeFormatKey == -1:
+ self.iDateTimeFormatKey = self.xNumberFormats.getStandardFormat(
+ NumberFormat.DATETIME, self.aLocale)
+
+ return self.iDateTimeFormatKey
+
+ '''
+ @return Returns the iLogicalFormatKey.
+ '''
+
+ def getLogicalFormatKey(self):
+ if self.iLogicalFormatKey == -1:
+ self.iLogicalFormatKey = self.xNumberFormats.getStandardFormat(
+ NumberFormat.LOGICAL, self.aLocale)
+
+ return self.iLogicalFormatKey
+
+ '''
+ @return Returns the iNumberFormatKey.
+ '''
+
+ def getNumberFormatKey(self):
+ if self.iNumberFormatKey == -1:
+ self.iNumberFormatKey = self.xNumberFormats.getStandardFormat(
+ NumberFormat.NUMBER, self.aLocale)
+
+ return self.iNumberFormatKey
+
+ '''
+ @return Returns the iTextFormatKey.
+ '''
+
+ def getTextFormatKey(self):
+ if self.iTextFormatKey == -1:
+ self.iTextFormatKey = self.xNumberFormats.getStandardFormat(
+ NumberFormat.TEXT, self.aLocale)
+
+ return self.iTextFormatKey
+
+ '''
+ @return Returns the iTimeFormatKey.
+ '''
+
+ def getTimeFormatKey(self):
+ if self.iTimeFormatKey == -1:
+ self.iTimeFormatKey = self.xNumberFormats.getStandardFormat(
+ NumberFormat.TIME, self.aLocale)
+
+ return self.iTimeFormatKey
diff --git a/wizards/com/sun/star/wizards/common/PropertySetHelper.py b/wizards/com/sun/star/wizards/common/PropertySetHelper.py
new file mode 100644
index 000000000000..fbb31d8f4ec8
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/PropertySetHelper.py
@@ -0,0 +1,250 @@
+from wizards.common.DebugHelper import *
+
+class PropertySetHelper(object):
+
+ @classmethod
+ def __init__(self, _aObj):
+ if not _aObj:
+ return
+
+ self.m_xPropertySet = _aObj
+
+ def getHashMap(self):
+ if self.m_aHashMap == None:
+ self.m_aHashMap = HashMap < String, Object >.Object()
+
+ return self.m_aHashMap
+
+ '''
+ set a property, don't throw any exceptions,
+ they will only write down as a hint in the helper debug output
+ @param _sName name of the property to set
+ @param _aValue property value as object
+ '''
+
+ def setPropertyValueDontThrow(self, _sName, _aValue):
+ try:
+ setPropertyValue(_sName, _aValue)
+ except Exception, e:
+ DebugHelper.writeInfo(
+ "Don't throw the exception with property name(" \
+ + _sName + " ) : " + e.getMessage())
+
+ '''
+ set a property,
+ @param _sName name of the property to set
+ @param _aValue property value as object
+ @throws java.lang.Exception
+ '''
+
+ def setPropertyValue(self, _sName, _aValue):
+ if self.m_xPropertySet != None:
+ try:
+ self.m_xPropertySet.setPropertyValue(_sName, _aValue)
+ except com.sun.star.beans.UnknownPropertyException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ DebugHelper.exception(e)
+ except com.sun.star.beans.PropertyVetoException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ DebugHelper.exception(e)
+ except ValueError, e:
+ DebugHelper.writeInfo(e.getMessage())
+ DebugHelper.exception(e)
+ except com.sun.star.lang.WrappedTargetException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ DebugHelper.exception(e)
+
+ else:
+ getHashMap().put(_sName, _aValue)
+
+ '''
+ get a property and convert it to a int value
+ @param _sName the string name of the property
+ @param _nDefault if an error occur, return this value
+ @return the int value of the property
+ '''
+
+ def getPropertyValueAsInteger(self, _sName, _nDefault):
+ aObject = None
+ nValue = _nDefault
+ if self.m_xPropertySet != None:
+ try:
+ aObject = self.m_xPropertySet.getPropertyValue(_sName)
+ except com.sun.star.beans.UnknownPropertyException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ except com.sun.star.lang.WrappedTargetException, e:
+ DebugHelper.writeInfo(e.getMessage())
+
+ if aObject != None:
+ try:
+ nValue = NumericalHelper.toInt(aObject)
+ except ValueError, e:
+ DebugHelper.writeInfo(
+ "can't convert a object to integer.")
+
+ return nValue
+
+ '''
+ get a property and convert it to a short value
+ @param _sName the string name of the property
+ @param _nDefault if an error occur, return this value
+ @return the int value of the property
+ '''
+
+ def getPropertyValueAsShort(self, _sName, _nDefault):
+ aObject = None
+ nValue = _nDefault
+ if self.m_xPropertySet != None:
+ try:
+ aObject = self.m_xPropertySet.getPropertyValue(_sName)
+ except com.sun.star.beans.UnknownPropertyException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ except com.sun.star.lang.WrappedTargetException, e:
+ DebugHelper.writeInfo(e.getMessage())
+
+ if aObject != None:
+ try:
+ nValue = NumericalHelper.toShort(aObject)
+ except ValueError, e:
+ DebugHelper.writeInfo("can't convert a object to short.")
+
+ return nValue
+
+ '''
+ get a property and convert it to a double value
+ @param _sName the string name of the property
+ @param _nDefault if an error occur, return this value
+ @return the int value of the property
+ '''
+
+ def getPropertyValueAsDouble(self, _sName, _nDefault):
+ aObject = None
+ nValue = _nDefault
+ if self.m_xPropertySet != None:
+ try:
+ aObject = self.m_xPropertySet.getPropertyValue(_sName)
+ except com.sun.star.beans.UnknownPropertyException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ except com.sun.star.lang.WrappedTargetException, e:
+ DebugHelper.writeInfo(e.getMessage())
+
+ if aObject == None:
+ if getHashMap().containsKey(_sName):
+ aObject = getHashMap().get(_sName)
+
+ if aObject != None:
+ try:
+ nValue = NumericalHelper.toDouble(aObject)
+ except ValueError, e:
+ DebugHelper.writeInfo("can't convert a object to integer.")
+
+ return nValue
+
+ '''
+ get a property and convert it to a boolean value
+ @param _sName the string name of the property
+ @param _bDefault if an error occur, return this value
+ @return the boolean value of the property
+ '''
+
+ def getPropertyValueAsBoolean(self, _sName, _bDefault):
+ aObject = None
+ bValue = _bDefault
+ if self.m_xPropertySet != None:
+ try:
+ aObject = self.m_xPropertySet.getPropertyValue(_sName)
+ except com.sun.star.beans.UnknownPropertyException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ DebugHelper.writeInfo(
+ "UnknownPropertyException caught: Name:=" + _sName)
+ except com.sun.star.lang.WrappedTargetException, e:
+ DebugHelper.writeInfo(e.getMessage())
+
+ if aObject != None:
+ try:
+ bValue = NumericalHelper.toBoolean(aObject)
+ except ValueError, e:
+ DebugHelper.writeInfo("can't convert a object to boolean.")
+
+ return bValue
+
+ '''
+ get a property and convert it to a string value
+ @param _sName the string name of the property
+ @param _sDefault if an error occur, return this value
+ @return the string value of the property
+ '''
+
+ def getPropertyValueAsString(self, _sName, _sDefault):
+ aObject = None
+ sValue = _sDefault
+ if self.m_xPropertySet != None:
+ try:
+ aObject = self.m_xPropertySet.getPropertyValue(_sName)
+ except com.sun.star.beans.UnknownPropertyException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ except com.sun.star.lang.WrappedTargetException, e:
+ DebugHelper.writeInfo(e.getMessage())
+
+ if aObject != None:
+ try:
+ sValue = AnyConverter.toString(aObject)
+ except ValueError, e:
+ DebugHelper.writeInfo("can't convert a object to string.")
+
+ return sValue
+
+ '''
+ get a property and don't convert it
+ @param _sName the string name of the property
+ @return the object value of the property without any conversion
+ '''
+
+ def getPropertyValueAsObject(self, _sName):
+ aObject = None
+ if self.m_xPropertySet != None:
+ try:
+ aObject = self.m_xPropertySet.getPropertyValue(_sName)
+ except com.sun.star.beans.UnknownPropertyException, e:
+ DebugHelper.writeInfo(e.getMessage())
+ except com.sun.star.lang.WrappedTargetException, e:
+ DebugHelper.writeInfo(e.getMessage())
+
+ return aObject
+
+ '''
+ Debug helper, to show all properties
+ which are available in the given object.
+ @param _xObj the object of which the properties should shown
+ '''
+
+ @classmethod
+ def showProperties(self, _xObj):
+ aHelper = PropertySetHelper.PropertySetHelper_unknown(_xObj)
+ aHelper.showProperties()
+
+ '''
+ Debug helper, to show all properties which are available
+ in the current object.
+ '''
+
+ def showProperties(self):
+ sName = ""
+ if self.m_xPropertySet != None:
+ XServiceInfo xServiceInfo = (XServiceInfo)
+ UnoRuntime.queryInterface(XServiceInfo.class, self.m_xPropertySet)
+ if xServiceInfo != None:
+ sName = xServiceInfo.getImplementationName()
+
+ xInfo = self.m_xPropertySet.getPropertySetInfo()
+ aAllProperties = xInfo.getProperties()
+ DebugHelper.writeInfo(
+ "Show all properties of Implementation of :'" + sName + "'")
+ i = 0
+ while i < aAllProperties.length:
+ DebugHelper.writeInfo(" - " + aAllProperties[i].Name)
+ i += 1
+ else:
+ DebugHelper.writeInfo(
+ "The given object don't support XPropertySet interface.")
+
diff --git a/wizards/com/sun/star/wizards/common/Resource.py b/wizards/com/sun/star/wizards/common/Resource.py
new file mode 100644
index 000000000000..d7d524ff4b80
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/Resource.py
@@ -0,0 +1,70 @@
+import traceback
+from wizards.common.Configuration import Configuration
+from wizards.common.SystemDialog import SystemDialog
+
+from com.sun.star.awt.VclWindowPeerAttribute import OK
+
+class Resource(object):
+ '''
+ Creates a new instance of Resource
+ @param _xMSF
+ @param _Unit
+ @param _Module
+ '''
+
+ @classmethod
+ def __init__(self, _xMSF, _Module):
+ self.xMSF = _xMSF
+ self.Module = _Module
+ try:
+ xResource = self.xMSF.createInstanceWithArguments(
+ "org.libreoffice.resource.ResourceIndexAccess", (self.Module,))
+ if xResource is None:
+ raise Exception ("could not initialize ResourceIndexAccess")
+
+ self.xStringIndexAccess = xResource.getByName("String")
+ self.xStringListIndexAccess = xResource.getByName("StringList")
+ if self.xStringListIndexAccess is None:
+ raise Exception ("could not initialize xStringListIndexAccess")
+
+ if self.xStringIndexAccess is None:
+ raise Exception ("could not initialize xStringIndexAccess")
+
+ except Exception, exception:
+ traceback.print_exc()
+ self.showCommonResourceError(self.xMSF)
+
+ def getResText(self, nID):
+ try:
+ return self.xStringIndexAccess.getByIndex(nID)
+ except Exception, exception:
+ traceback.print_exc()
+ raise ValueError("Resource with ID not " + str(nID) + " not found")
+
+ def getStringList(self, nID):
+ try:
+ return self.xStringListIndexAccess.getByIndex(nID)
+ except Exception, exception:
+ traceback.print_exc()
+ raise ValueError("Resource with ID not " + str(nID) + " not found")
+
+ def getResArray(self, nID, iCount):
+ try:
+ ResArray = range(iCount)
+ i = 0
+ while i < iCount:
+ ResArray[i] = getResText(nID + i)
+ i += 1
+ return ResArray
+ except Exception, exception:
+ traceback.print_exc()
+ raise ValueError("Resource with ID not" + str(nID) + " not found")
+
+ @classmethod
+ def showCommonResourceError(self, xMSF):
+ ProductName = Configuration.getProductName(xMSF)
+ sError = "The files required could not be found.\n" + \
+ "Please start the %PRODUCTNAME Setup and choose 'Repair'."
+ sError = sError.replace("%PRODUCTNAME", ProductName)
+ SystemDialog.showMessageBox(xMSF, "ErrorBox", OK, sError)
+
diff --git a/wizards/com/sun/star/wizards/common/SystemDialog.py b/wizards/com/sun/star/wizards/common/SystemDialog.py
new file mode 100644
index 000000000000..33661aa9d156
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/SystemDialog.py
@@ -0,0 +1,230 @@
+import uno
+import traceback
+from wizards.common.Configuration import Configuration
+from wizards.common.Desktop import Desktop
+from wizards.common.Helper import Helper
+
+from com.sun.star.ui.dialogs.TemplateDescription import FILESAVE_AUTOEXTENSION, FILEOPEN_SIMPLE
+from com.sun.star.ui.dialogs.ExtendedFilePickerElementIds import CHECKBOX_AUTOEXTENSION
+from com.sun.star.awt import WindowDescriptor
+from com.sun.star.awt.WindowClass import MODALTOP
+from com.sun.star.lang import IllegalArgumentException
+from com.sun.star.awt.VclWindowPeerAttribute import OK
+
+class SystemDialog(object):
+
+ '''
+ @param xMSF
+ @param ServiceName
+ @param type according to com.sun.star.ui.dialogs.TemplateDescription
+ '''
+
+ def __init__(self, xMSF, ServiceName, Type):
+ try:
+ self.xMSF = xMSF
+ self.systemDialog = xMSF.createInstance(ServiceName)
+ self.xStringSubstitution = self.createStringSubstitution(xMSF)
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ @classmethod
+ def createStoreDialog(self, xmsf):
+ return SystemDialog(
+ xmsf, "com.sun.star.ui.dialogs.FilePicker",FILESAVE_AUTOEXTENSION)
+
+ @classmethod
+ def createOpenDialog(self, xmsf):
+ return SystemDialog(
+ xmsf, "com.sun.star.ui.dialogs.FilePicker", FILEOPEN_SIMPLE)
+
+ @classmethod
+ def createFolderDialog(self, xmsf):
+ return SystemDialog(
+ xmsf, "com.sun.star.ui.dialogs.FolderPicker", 0)
+
+ @classmethod
+ def createOfficeFolderDialog(self, xmsf):
+ return SystemDialog(
+ xmsf, "com.sun.star.ui.dialogs.OfficeFolderPicker", 0)
+
+ def subst(self, path):
+ try:
+ s = self.xStringSubstitution.substituteVariables(path, False)
+ return s
+ except Exception, ex:
+ traceback.print_exc()
+ return path
+
+ '''
+ @param displayDir
+ @param defaultName
+ given url to a local path.
+ @return
+ '''
+
+ def callStoreDialog(self, displayDir, defaultName, sDocuType=None):
+ if sDocuType is not None:
+ self.addFilterToDialog(defaultName[-3:], sDocuType, True)
+
+ self.sStorePath = None
+ try:
+ self.systemDialog.setValue(CHECKBOX_AUTOEXTENSION, 0, True)
+ self.systemDialog.setDefaultName(defaultName)
+ self.systemDialog.setDisplayDirectory(self.subst(displayDir))
+ if self.execute(self.systemDialog):
+ sPathList = self.systemDialog.getFiles()
+ self.sStorePath = sPathList[0]
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ return self.sStorePath
+
+ def callFolderDialog(self, title, description, displayDir):
+ try:
+ self.systemDialog.setDisplayDirectoryxPropertyValue(
+ subst(displayDir))
+ except IllegalArgumentException, iae:
+ traceback.print_exc()
+ raise AttributeError(iae.getMessage());
+
+ self.systemDialog.setTitle(title)
+ self.systemDialog.setDescription(description)
+ if self.execute(self.systemDialog):
+ return self.systemDialog.getDirectory()
+ else:
+ return None
+
+ def execute(self, execDialog):
+ return execDialog.execute() == 1
+
+ def callOpenDialog(self, multiSelect, displayDirectory):
+ try:
+ self.systemDialog.setMultiSelectionMode(multiSelect)
+ self.systemDialog.setDisplayDirectory(self.subst(displayDirectory))
+ if self.execute(self.systemDialog):
+ return self.systemDialog.getFiles()
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ return None
+
+ def addFilterToDialog(self, sExtension, filterName, setToDefault):
+ try:
+ #get the localized filtername
+ uiName = self.getFilterUIName(filterName)
+ pattern = "*." + sExtension
+ #add the filter
+ self.addFilter(uiName, pattern, setToDefault)
+ except Exception, exception:
+ traceback.print_exc()
+
+ def addFilter(self, uiName, pattern, setToDefault):
+ try:
+ self.systemDialog.appendFilter(uiName, pattern)
+ if setToDefault:
+ self.systemDialog.setCurrentFilter(uiName)
+
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''
+ converts the name returned from getFilterUIName_(...) so the
+ product name is correct.
+ @param filterName
+ @return
+ '''
+
+ def getFilterUIName(self, filterName):
+ prodName = Configuration.getProductName(self.xMSF)
+ s = [[self.getFilterUIName_(filterName)]]
+ s[0][0] = s[0][0].replace("%productname%", prodName)
+ return s[0][0]
+
+ '''
+ note the result should go through conversion of the product name.
+ @param filterName
+ @return the UI localized name of the given filter name.
+ '''
+
+ def getFilterUIName_(self, filterName):
+ try:
+ oFactory = self.xMSF.createInstance(
+ "com.sun.star.document.FilterFactory")
+ oObject = Helper.getUnoObjectbyName(oFactory, filterName)
+ xPropertyValue = list(oObject)
+ for i in xPropertyValue:
+ if i is not None and i.Name == "UIName":
+ return str(i.Value)
+
+ raise NullPointerException(
+ "UIName property not found for Filter " + filterName);
+ except Exception, exception:
+ traceback.print_exc()
+ return None
+
+ @classmethod
+ def showErrorBox(self, xMSF, ResName, ResPrefix,
+ ResID, AddTag=None, AddString=None):
+ ProductName = Configuration.getProductName(xMSF)
+ oResource = Resource(xMSF, ResPrefix)
+ sErrorMessage = oResource.getResText(ResID)
+ sErrorMessage = sErrorMessage.replace( ProductName, "%PRODUCTNAME")
+ sErrorMessage = sErrorMessage.replace(str(13), "<BR>")
+ if AddTag and AddString:
+ sErrorMessage = sErrorMessage.replace( AddString, AddTag)
+ return self.showMessageBox(xMSF, "ErrorBox", OK, sErrorMessage)
+
+ '''
+ example:
+ (xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, "message")
+
+ @param windowServiceName one of the following strings:
+ "ErrorBox", "WarningBox", "MessBox", "InfoBox", "QueryBox".
+ There are other values possible, look
+ under src/toolkit/source/awt/vcltoolkit.cxx
+ @param windowAttribute see com.sun.star.awt.VclWindowPeerAttribute
+ @return 0 = cancel, 1 = ok, 2 = yes, 3 = no(I'm not sure here)
+ other values check for yourself ;-)
+ '''
+ @classmethod
+ def showMessageBox(self, xMSF, windowServiceName, windowAttribute,
+ MessageText, peer=None):
+
+ if MessageText is None:
+ return 0
+
+ iMessage = 0
+ try:
+ # If the peer is null we try to get one from the desktop...
+ if peer is None:
+ xFrame = Desktop.getActiveFrame(xMSF)
+ peer = xFrame.getComponentWindow()
+
+ xToolkit = xMSF.createInstance("com.sun.star.awt.Toolkit")
+ oDescriptor = WindowDescriptor()
+ oDescriptor.WindowServiceName = windowServiceName
+ oDescriptor.Parent = peer
+ oDescriptor.Type = MODALTOP
+ oDescriptor.WindowAttributes = windowAttribute
+ xMsgPeer = xToolkit.createWindow(oDescriptor)
+ xMsgPeer.MessageText = MessageText
+ iMessage = xMsgPeer.execute()
+ xMsgPeer.dispose()
+ except Exception:
+ traceback.print_exc()
+
+ return iMessage
+
+ @classmethod
+ def createStringSubstitution(self, xMSF):
+ xPathSubst = None
+ try:
+ xPathSubst = xMSF.createInstance(
+ "com.sun.star.util.PathSubstitution")
+ return xPathSubst
+ except Exception, e:
+ traceback.print_exc()
+ return None
diff --git a/wizards/com/sun/star/wizards/common/__init__.py b/wizards/com/sun/star/wizards/common/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/wizards/com/sun/star/wizards/common/__init__.py
diff --git a/wizards/com/sun/star/wizards/document/OfficeDocument.py b/wizards/com/sun/star/wizards/document/OfficeDocument.py
new file mode 100644
index 000000000000..d44c01fbf854
--- /dev/null
+++ b/wizards/com/sun/star/wizards/document/OfficeDocument.py
@@ -0,0 +1,280 @@
+import uno
+import traceback
+import unohelper
+from wizards.ui.event.CommonListener import TerminateListenerProcAdapter
+from wizards.common.Desktop import Desktop
+
+from com.sun.star.awt import WindowDescriptor
+from com.sun.star.awt import Rectangle
+from com.sun.star.awt.WindowClass import TOP
+from com.sun.star.task import ErrorCodeIOException
+
+#Window Constants
+com_sun_star_awt_WindowAttribute_BORDER \
+ = uno.getConstantByName( "com.sun.star.awt.WindowAttribute.BORDER" )
+com_sun_star_awt_WindowAttribute_SIZEABLE \
+ = uno.getConstantByName( "com.sun.star.awt.WindowAttribute.SIZEABLE" )
+com_sun_star_awt_WindowAttribute_MOVEABLE \
+ = uno.getConstantByName( "com.sun.star.awt.WindowAttribute.MOVEABLE" )
+com_sun_star_awt_VclWindowPeerAttribute_CLIPCHILDREN \
+ = uno.getConstantByName(
+ "com.sun.star.awt.VclWindowPeerAttribute.CLIPCHILDREN" )
+
+class OfficeDocument(object):
+ '''Creates a new instance of OfficeDocument '''
+
+ def __init__(self, _xMSF):
+ self.xMSF = _xMSF
+
+ @classmethod
+ def attachEventCall(self, xComponent, EventName, EventType, EventURL):
+ try:
+ oEventProperties = range(2)
+ oEventProperties[0] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ oEventProperties[0].Name = "EventType"
+ oEventProperties[0].Value = EventType
+ # "Service", "StarBasic"
+ oEventProperties[1] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ oEventProperties[1].Name = "Script" #"URL";
+ oEventProperties[1].Value = EventURL
+ uno.invoke(xComponent.Events, "replaceByName",
+ (EventName, uno.Any("[]com.sun.star.beans.PropertyValue",
+ tuple(oEventProperties))))
+ except Exception, exception:
+ traceback.print_exc()
+
+ def dispose(self, xMSF, xComponent):
+ try:
+ if xComponent != None:
+ xFrame = xComponent.CurrentController.Frame
+ if xComponent.isModified():
+ xComponent.setModified(False)
+
+ Desktop.dispatchURL(xMSF, ".uno:CloseDoc", xFrame)
+
+ except PropertyVetoException, exception:
+ traceback.print_exc()
+
+ '''
+ Create a new office document, attached to the given frame.
+ @param desktop
+ @param frame
+ @param sDocumentType e.g. swriter, scalc, ( simpress, scalc : not tested)
+ @return the document Component
+ (implements XComponent) object ( XTextDocument, or XSpreadsheedDocument )
+ '''
+
+ @classmethod
+ def createNewDocument(self, frame, sDocumentType, preview, readonly):
+ loadValues = range(2)
+ loadValues[0] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[0].Name = "ReadOnly"
+ if readonly:
+ loadValues[0].Value = True
+ else:
+ loadValues[0].Value = False
+
+ loadValues[1] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[1].Name = "Preview"
+ if preview:
+ loadValues[1].Value = True
+ else:
+ loadValues[1].Value = False
+ sURL = "private:factory/" + sDocumentType
+ xComponent = None
+ try:
+ xComponent = frame.loadComponentFromURL(
+ sURL, "_self", 0, tuple(loadValues))
+
+ except Exception:
+ traceback.print_exc()
+
+ return xComponent
+
+ @classmethod
+ def createNewFrame(self, xMSF, listener, FrameName="_blank"):
+ xFrame = None
+ if FrameName.lower() == "WIZARD_LIVE_PREVIEW".lower():
+ xFrame = self.createNewPreviewFrame(xMSF, listener)
+ else:
+ xF = Desktop.getDesktop(xMSF)
+ xFrame = xF.findFrame(FrameName, 0)
+ if listener is not None:
+ xFF = xF.getFrames()
+ xFF.remove(xFrame)
+ xF.addTerminateListener(TerminateListenerProcAdapter(listener))
+
+ return xFrame
+
+ @classmethod
+ def createNewPreviewFrame(self, xMSF, listener):
+ xToolkit = None
+ try:
+ xToolkit = xMSF.createInstance("com.sun.star.awt.Toolkit")
+ except Exception, e:
+ # TODO Auto-generated catch block
+ traceback.print_exc()
+
+ #describe the window and its properties
+ aDescriptor = WindowDescriptor()
+ aDescriptor.Type = TOP
+ aDescriptor.WindowServiceName = "window"
+ aDescriptor.ParentIndex = -1
+ aDescriptor.Parent = None
+ aDescriptor.Bounds = Rectangle(10, 10, 640, 480)
+
+ #Set Window Attributes
+ gnDefaultWindowAttributes = \
+ com_sun_star_awt_WindowAttribute_BORDER + \
+ com_sun_star_awt_WindowAttribute_MOVEABLE + \
+ com_sun_star_awt_WindowAttribute_SIZEABLE + \
+ com_sun_star_awt_VclWindowPeerAttribute_CLIPCHILDREN
+
+ aDescriptor.WindowAttributes = gnDefaultWindowAttributes
+ #create a new blank container window
+ xPeer = None
+ try:
+ xPeer = xToolkit.createWindow(aDescriptor)
+ except IllegalArgumentException, e:
+ # TODO Auto-generated catch block
+ traceback.print_exc()
+
+ #define some further properties of the frame window
+ #if it's needed .-)
+ #xPeer->setBackground(...);
+ #create new empty frame and set window on it
+ xFrame = None
+ try:
+ xFrame = xMSF.createInstance("com.sun.star.frame.Frame")
+ except Exception, e:
+ # TODO Auto-generated catch block
+ traceback.print_exc()
+
+ xFrame.initialize(xPeer)
+ #from now this frame is useable ...
+ #and not part of the desktop tree.
+ #You are alone with him .-)
+ if listener is not None:
+ Desktop.getDesktop(xMSF).addTerminateListener(
+ TerminateListenerProcAdapter(listener))
+
+ return xFrame
+
+ @classmethod
+ def load(self, xInterface, sURL, sFrame, xValues):
+ xComponent = None
+ try:
+ xComponent = xInterface.loadComponentFromURL(
+ sURL, sFrame, 0, tuple(xValues))
+ except Exception, exception:
+ traceback.print_exc()
+
+ return xComponent
+
+ @classmethod
+ def store(self, xMSF, xComponent, StorePath, FilterName):
+ try:
+ if len(FilterName):
+ oStoreProperties = range(2)
+ oStoreProperties[0] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ oStoreProperties[0].Name = "FilterName"
+ oStoreProperties[0].Value = FilterName
+ oStoreProperties[1] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ oStoreProperties[1].Name = "InteractionHandler"
+ oStoreProperties[1].Value = xMSF.createInstance(
+ "com.sun.star.comp.uui.UUIInteractionHandler")
+ else:
+ oStoreProperties = range(0)
+
+ if StorePath.startswith("file://"):
+ #Unix
+ StorePath = StorePath[7:]
+
+ sPath = StorePath[:(StorePath.rfind("/") + 1)]
+ sFile = StorePath[(StorePath.rfind("/") + 1):]
+ xComponent.storeToURL(
+ unohelper.absolutize(
+ unohelper.systemPathToFileUrl(sPath),
+ unohelper.systemPathToFileUrl(sFile)),
+ tuple(oStoreProperties))
+ return True
+ except ErrorCodeIOException:
+ return True
+ #There's a bug here, fix later
+ pass
+ except Exception, exception:
+ traceback.print_exc()
+ return False
+
+ def close(self, xComponent):
+ bState = False
+ if xComponent != None:
+ try:
+ xComponent.close(True)
+ bState = True
+ except com.sun.star.util.CloseVetoException, exCloseVeto:
+ print "could not close doc"
+ bState = False
+
+ else:
+ xComponent.dispose()
+ bState = True
+
+ return bState
+
+ def ArraytoCellRange(self, datalist, oTable, xpos, ypos):
+ try:
+ rowcount = datalist.length
+ if rowcount > 0:
+ colcount = datalist[0].length
+ if colcount > 0:
+ xNewRange = oTable.getCellRangeByPosition(
+ xpos, ypos, (colcount + xpos) - 1,
+ (rowcount + ypos) - 1)
+ xNewRange.setDataArray(datalist)
+
+ except Exception, e:
+ traceback.print_exc()
+
+ @classmethod
+ def getFileMediaDecriptor(self, xmsf, url):
+ typeDetect = xmsf.createInstance(
+ "com.sun.star.document.TypeDetection")
+ mediaDescr = range(1)
+ mediaDescr[0] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ mediaDescr[0].Name = "URL"
+ mediaDescr[0].Value = url
+ Type = typeDetect.queryTypeByDescriptor(tuple(mediaDescr), True)[0]
+ if Type == "":
+ return None
+ else:
+ return typeDetect.getByName(Type)
+
+ @classmethod
+ def getTypeMediaDescriptor(self, xmsf, type):
+ typeDetect = xmsf.createInstance(
+ "com.sun.star.document.TypeDetection")
+ return typeDetect.getByName(type)
+
+ '''
+ returns the count of slides in a presentation,
+ or the count of pages in a draw document.
+ @param model a presentation or a draw document
+ @return the number of slides/pages in the given document.
+ '''
+
+ def getSlideCount(self, model):
+ return model.getDrawPages().getCount()
+
+ def showMessageBox(
+ self, xMSF, windowServiceName, windowAttribute, MessageText):
+
+ return SystemDialog.showMessageBox(
+ xMSF, windowServiceName, windowAttribute, MessageText)
diff --git a/wizards/com/sun/star/wizards/fax/CGFax.py b/wizards/com/sun/star/wizards/fax/CGFax.py
new file mode 100644
index 000000000000..cb0ce1716305
--- /dev/null
+++ b/wizards/com/sun/star/wizards/fax/CGFax.py
@@ -0,0 +1,31 @@
+from wizards.common.ConfigGroup import *
+
+class CGFax(ConfigGroup):
+
+ def __init__(self):
+
+ self.cp_Style = int()
+ self.cp_PrintCompanyLogo = bool()
+ self.cp_PrintDate = bool()
+ self.cp_PrintSubjectLine = bool()
+ self.cp_PrintSalutation = bool()
+ self.cp_PrintCommunicationType = bool()
+ self.cp_PrintGreeting = bool()
+ self.cp_PrintFooter = bool()
+ self.cp_CommunicationType = str()
+ self.cp_Salutation = str()
+ self.cp_Greeting = str()
+ self.cp_SenderAddressType = int()
+ self.cp_SenderCompanyName = str()
+ self.cp_SenderStreet = str()
+ self.cp_SenderPostCode = str()
+ self.cp_SenderState = str()
+ self.cp_SenderCity = str()
+ self.cp_SenderFax = str()
+ self.cp_ReceiverAddressType = int()
+ self.cp_Footer = str()
+ self.cp_FooterOnlySecondPage = bool()
+ self.cp_FooterPageNumbers = bool()
+ self.cp_CreationType = int()
+ self.cp_TemplateName = str()
+ self.cp_TemplatePath = str()
diff --git a/wizards/com/sun/star/wizards/fax/CGFaxWizard.py b/wizards/com/sun/star/wizards/fax/CGFaxWizard.py
new file mode 100644
index 000000000000..d1b14f06814c
--- /dev/null
+++ b/wizards/com/sun/star/wizards/fax/CGFaxWizard.py
@@ -0,0 +1,10 @@
+from wizards.common.ConfigGroup import *
+from wizards.fax.CGFax import CGFax
+
+class CGFaxWizard(ConfigGroup):
+
+ def __init__(self):
+ self.cp_FaxType = int()
+ self.cp_BusinessFax = CGFax()
+ self.cp_PrivateFax = CGFax()
+
diff --git a/wizards/com/sun/star/wizards/fax/CallWizard.py b/wizards/com/sun/star/wizards/fax/CallWizard.py
index 33385a251a31..5aae1b75140f 100644
--- a/wizards/com/sun/star/wizards/fax/CallWizard.py
+++ b/wizards/com/sun/star/wizards/fax/CallWizard.py
@@ -4,38 +4,24 @@ import uno
import unohelper
from com.sun.star.task import XJobExecutor
+from wizards.fax.FaxWizardDialogImpl import FaxWizardDialogImpl
# implement a UNO component by deriving from the standard unohelper.Base class
# and from the interface(s) you want to implement.
-class HelloWorldJob(unohelper.Base, XJobExecutor):
+class CallWizard(unohelper.Base, XJobExecutor):
def __init__(self, ctx):
# store the component context for later use
self.ctx = ctx
def trigger(self, args):
- # note: args[0] == "HelloWorld", see below config settings
-
- # retrieve the desktop object
- desktop = self.ctx.ServiceManager.createInstanceWithContext(
- "com.sun.star.frame.Desktop", self.ctx)
-
- # get current document model
- model = desktop.getCurrentComponent()
-
- # access the document's text property
- text = model.Text
-
- # create a cursor
- cursor = text.createTextCursor()
-
- # insert the text into the document
- text.insertString(cursor, "Hello World", 0)
+ fw = FaxWizardDialogImpl(self.ctx.ServiceManager)
+ fx.startWizard()
# pythonloader looks for a static g_ImplementationHelper variable
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation( \
- HelloWorldJob, # UNO object class
+ CallWizard, # UNO object class
"com.sun.star.wizards.fax.CallWizard", # implemenation name
("com.sun.star.task.Job",),) # list of implemented services
# (the only service)
diff --git a/wizards/com/sun/star/wizards/fax/FaxDocument.py b/wizards/com/sun/star/wizards/fax/FaxDocument.py
index b5fee838796b..3f1575729184 100644
--- a/wizards/com/sun/star/wizards/fax/FaxDocument.py
+++ b/wizards/com/sun/star/wizards/fax/FaxDocument.py
@@ -1,6 +1,6 @@
-from text.TextDocument import *
-from text.TextSectionHandler import TextSectionHandler
-from common.PropertyNames import PropertyNames
+from wizards.text.TextDocument import *
+from wizards.text.TextSectionHandler import TextSectionHandler
+from wizards.common.PropertyNames import PropertyNames
from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK
from com.sun.star.style.ParagraphAdjust import CENTER
diff --git a/wizards/com/sun/star/wizards/fax/FaxWizardDialog.py b/wizards/com/sun/star/wizards/fax/FaxWizardDialog.py
index 644f08a228db..c465d88952e8 100644
--- a/wizards/com/sun/star/wizards/fax/FaxWizardDialog.py
+++ b/wizards/com/sun/star/wizards/fax/FaxWizardDialog.py
@@ -1,6 +1,7 @@
-from ui.WizardDialog import *
-from FaxWizardDialogResources import FaxWizardDialogResources
-from FaxWizardDialogConst import *
+from wizards.ui.WizardDialog import *
+from wizards.fax.FaxWizardDialogResources import FaxWizardDialogResources
+from wizards.fax.FaxWizardDialogConst import *
+
from com.sun.star.awt.FontUnderline import SINGLE
class FaxWizardDialog(WizardDialog):
diff --git a/wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py b/wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py
index e5a72e195033..a8f8946fa834 100644
--- a/wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py
+++ b/wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py
@@ -1,4 +1,4 @@
-from common.HelpIds import HelpIds
+from wizards.common.HelpIds import HelpIds
OPTBUSINESSFAX_ITEM_CHANGED = "optBusinessFaxItemChanged"
diff --git a/wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py b/wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py
index 92749ee15396..c6b1a089389f 100644
--- a/wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py
+++ b/wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py
@@ -1,13 +1,13 @@
-from FaxWizardDialog import *
-from CGFaxWizard import *
-from FaxDocument import *
-from ui.PathSelection import PathSelection
-from common.FileAccess import FileAccess
-from ui.event.UnoDataAware import UnoDataAware
-from ui.event.RadioDataAware import RadioDataAware
-from text.TextFieldHandler import TextFieldHandler
-from common.SystemDialog import SystemDialog
-from common.NoValidPathException import NoValidPathException
+from wizards.fax.FaxWizardDialog import *
+from wizards.fax.CGFaxWizard import *
+from wizards.fax.FaxDocument import *
+from wizards.ui.PathSelection import PathSelection
+from wizards.common.FileAccess import FileAccess
+from wizards.ui.event.UnoDataAware import UnoDataAware
+from wizards.ui.event.RadioDataAware import RadioDataAware
+from wizards.text.TextFieldHandler import TextFieldHandler
+from wizards.common.SystemDialog import SystemDialog
+from wizards.common.NoValidPathException import NoValidPathException
from com.sun.star.awt.VclWindowPeerAttribute import YES_NO, DEF_NO
from com.sun.star.uno import RuntimeException
@@ -56,9 +56,10 @@ class FaxWizardDialogImpl(FaxWizardDialog):
# TODO Auto-generated catch blocksetMaxStep
traceback.print_exc()
- def startWizard(self, xMSF, CurPropertyValue):
+ def startWizard(self, xMSF):
self.running = True
try:
+ print "entra"
#Number of steps on WizardDialog
self.nMaxStep = 5
diff --git a/wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py b/wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py
index bbf6921d381f..9badb1868761 100644
--- a/wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py
+++ b/wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py
@@ -1,4 +1,4 @@
-from common.Resource import Resource
+from wizards.common.Resource import Resource
class FaxWizardDialogResources(Resource):
MODULE_NAME = "dbw"
diff --git a/wizards/com/sun/star/wizards/fax/__init__.py b/wizards/com/sun/star/wizards/fax/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/wizards/com/sun/star/wizards/fax/__init__.py
diff --git a/wizards/com/sun/star/wizards/letter/CGLetter.py b/wizards/com/sun/star/wizards/letter/CGLetter.py
new file mode 100644
index 000000000000..474861297414
--- /dev/null
+++ b/wizards/com/sun/star/wizards/letter/CGLetter.py
@@ -0,0 +1,37 @@
+from wizards.common.ConfigGroup import *
+from CGPaperElementLocation import CGPaperElementLocation
+
+class CGLetter(ConfigGroup):
+
+ def __init__(self):
+ self.cp_Style = int()
+ self.cp_BusinessPaper = bool()
+ self.cp_CompanyLogo = CGPaperElementLocation()
+ self.cp_CompanyAddress = CGPaperElementLocation()
+ self.cp_PaperCompanyAddressReceiverField = bool()
+ self.cp_PaperFooter = bool()
+ self.cp_PaperFooterHeight = float()
+ self.cp_Norm = int()
+ self.cp_PrintCompanyLogo = bool()
+ self.cp_PrintCompanyAddressReceiverField = bool()
+ self.cp_PrintLetterSigns = bool()
+ self.cp_PrintSubjectLine = bool()
+ self.cp_PrintSalutation = bool()
+ self.cp_PrintBendMarks = bool()
+ self.cp_PrintGreeting = bool()
+ self.cp_PrintFooter = bool()
+ self.cp_Salutation = str()
+ self.cp_Greeting = str()
+ self.cp_SenderAddressType = int()
+ self.cp_SenderCompanyName = str()
+ self.cp_SenderStreet = str()
+ self.cp_SenderPostCode = str()
+ self.cp_SenderState = str()
+ self.cp_SenderCity = str()
+ self.cp_ReceiverAddressType = int()
+ self.cp_Footer = str()
+ self.cp_FooterOnlySecondPage = bool()
+ self.cp_FooterPageNumbers = bool()
+ self.cp_CreationType = int()
+ self.cp_TemplateName = str()
+ self.cp_TemplatePath = str()
diff --git a/wizards/com/sun/star/wizards/letter/CGLetterWizard.py b/wizards/com/sun/star/wizards/letter/CGLetterWizard.py
new file mode 100644
index 000000000000..11505bf8ee34
--- /dev/null
+++ b/wizards/com/sun/star/wizards/letter/CGLetterWizard.py
@@ -0,0 +1,10 @@
+from wizards.common.ConfigGroup import *
+from CGLetter import CGLetter
+
+class CGLetterWizard (ConfigGroup):
+
+ def __init__(self):
+ self.cp_LetterType = int()
+ self.cp_BusinessLetter = CGLetter()
+ self.cp_PrivateOfficialLetter = CGLetter()
+ self.cp_PrivateLetter = CGLetter()
diff --git a/wizards/com/sun/star/wizards/letter/CGPaperElementLocation.py b/wizards/com/sun/star/wizards/letter/CGPaperElementLocation.py
new file mode 100644
index 000000000000..3e6cc1f393f8
--- /dev/null
+++ b/wizards/com/sun/star/wizards/letter/CGPaperElementLocation.py
@@ -0,0 +1,10 @@
+from wizards.common.ConfigGroup import *
+
+class CGPaperElementLocation(ConfigGroup):
+
+ def __init__(self):
+ self.cp_Display = bool()
+ self.cp_Width = float()
+ self.cp_Height = float()
+ self.cp_X = float()
+ self.cp_Y = float()
diff --git a/wizards/com/sun/star/wizards/letter/LetterDocument.py b/wizards/com/sun/star/wizards/letter/LetterDocument.py
new file mode 100644
index 000000000000..bc8b2fef42d1
--- /dev/null
+++ b/wizards/com/sun/star/wizards/letter/LetterDocument.py
@@ -0,0 +1,259 @@
+from wizards.text.TextDocument import *
+from wizards.text.TextSectionHandler import TextSectionHandler
+from wizards.common.PropertyNames import PropertyNames
+
+from com.sun.star.table import BorderLine
+from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK
+from com.sun.star.style.ParagraphAdjust import CENTER
+from com.sun.star.text.PageNumberType import CURRENT
+from com.sun.star.style.NumberingType import ARABIC
+from com.sun.star.text.HoriOrientation import NONE as NONEHORI
+from com.sun.star.text.VertOrientation import NONE as NONEVERT
+from com.sun.star.text.RelOrientation import PAGE_FRAME
+from com.sun.star.text.TextContentAnchorType import AT_PAGE
+from com.sun.star.text.SizeType import FIX
+from com.sun.star.text.WrapTextMode import THROUGHT
+from com.sun.star.awt.FontWeight import BOLD
+
+class LetterDocument(TextDocument):
+
+ TextDocument = None
+
+ def __init__(self, xMSF, listener):
+ super(LetterDocument,self).__init__(xMSF, listener, None,
+ "WIZARD_LIVE_PREVIEW")
+ self.keepLogoFrame = True
+ self.keepBendMarksFrame = True
+ self.keepLetterSignsFrame = True
+ self.keepSenderAddressRepeatedFrame = True
+ self.keepAddressFrame = True
+
+ def switchElement(self, sElement, bState):
+ try:
+ mySectionHandler = TextSectionHandler(
+ self.xMSF, TextDocument.xTextDocument)
+ oSection = \
+ mySectionHandler.xTextDocument.TextSections.getByName(sElement)
+ Helper.setUnoPropertyValue(oSection, "IsVisible", bState)
+ except Exception:
+ traceback.print_exc()
+
+ def updateDateFields(self):
+ FH = TextFieldHandler(
+ TextDocument.xTextDocument, TextDocument.xTextDocument)
+ FH.updateDateFields()
+
+ def switchFooter(self, sPageStyle, bState, bPageNumber, sText):
+ if TextDocument.xTextDocument != None:
+ try:
+ TextDocument.xTextDocument.lockControllers()
+ xNameAccess = TextDocument.xTextDocument.StyleFamilies
+ xPageStyleCollection = xNameAccess.getByName("PageStyles")
+ xPageStyle = xPageStyleCollection.getByName(sPageStyle)
+ if bState:
+ Helper.setUnoPropertyValue(xPageStyle, "FooterIsOn", True)
+ xFooterText = \
+ Helper.getUnoPropertyValue(xPageStyle, "FooterText")
+ xFooterText.String = sText
+ if bPageNumber:
+ #Adding the Page Number
+ myCursor = xFooterText.Text.createTextCursor()
+ myCursor.gotoEnd(False)
+ xFooterText.insertControlCharacter(myCursor,
+ PARAGRAPH_BREAK, False)
+ myCursor.setPropertyValue("ParaAdjust", CENTER )
+
+ xPageNumberField = \
+ TextDocument.xTextDocument.createInstance(
+ "com.sun.star.text.TextField.PageNumber")
+ xPageNumberField.setPropertyValue("SubType", CURRENT)
+ xPageNumberField.NumberingType = ARABIC
+ xFooterText.insertTextContent(xFooterText.End,
+ xPageNumberField, False)
+
+ else:
+ Helper.setUnoPropertyValue(
+ xPageStyle, "FooterIsOn", False)
+
+ TextDocument.xTextDocument.unlockControllers()
+ except Exception:
+ traceback.print_exc()
+
+ def hasElement(self, sElement):
+ if TextDocument.xTextDocument != None:
+ SH = TextSectionHandler(self.xMSF, TextDocument.xTextDocument)
+ return SH.hasTextSectionByName(sElement)
+ else:
+ return False
+
+ def switchUserField(self, sFieldName, sNewContent, bState):
+ myFieldHandler = TextFieldHandler(
+ self.xMSF, TextDocument.xTextDocument)
+ if bState:
+ myFieldHandler.changeUserFieldContent(sFieldName, sNewContent)
+ else:
+ myFieldHandler.changeUserFieldContent(sFieldName, "")
+
+ def fillSenderWithUserData(self):
+ try:
+ myFieldHandler = TextFieldHandler(
+ TextDocument.xTextDocument, TextDocument.xTextDocument)
+ oUserDataAccess = Configuration.getConfigurationRoot(
+ self.xMSF, "org.openoffice.UserProfile/Data", False)
+ myFieldHandler.changeUserFieldContent(
+ "Company", Helper.getUnoObjectbyName(oUserDataAccess, "o"))
+ myFieldHandler.changeUserFieldContent(
+ "Street", Helper.getUnoObjectbyName(oUserDataAccess, "street"))
+ myFieldHandler.changeUserFieldContent(
+ "PostCode",
+ Helper.getUnoObjectbyName(oUserDataAccess, "postalcode"))
+ myFieldHandler.changeUserFieldContent(
+ "City", Helper.getUnoObjectbyName(oUserDataAccess, "l"))
+ myFieldHandler.changeUserFieldContent(
+ PropertyNames.PROPERTY_STATE,
+ Helper.getUnoObjectbyName(oUserDataAccess, "st"))
+ except Exception:
+ traceback.print_exc()
+
+ def killEmptyUserFields(self):
+ myFieldHandler = TextFieldHandler(
+ self.xMSF, TextDocument.xTextDocument)
+ myFieldHandler.removeUserFieldByContent("")
+
+ def killEmptyFrames(self):
+ try:
+ if not self.keepLogoFrame:
+ xTF = self.getFrameByName(
+ "Company Logo", TextDocument.xTextDocument)
+ if xTF != None:
+ xTF.dispose()
+
+ if not self.keepBendMarksFrame:
+ xTF = self.getFrameByName(
+ "Bend Marks", TextDocument.xTextDocument)
+ if xTF != None:
+ xTF.dispose()
+
+ if not self.keepLetterSignsFrame:
+ xTF = self.getFrameByName(
+ "Letter Signs", TextDocument.xTextDocument)
+ if xTF != None:
+ xTF.dispose()
+
+ if not self.keepSenderAddressRepeatedFrame:
+ xTF = self.getFrameByName(
+ "Sender Address Repeated", TextDocument.xTextDocument)
+ if xTF != None:
+ xTF.dispose()
+
+ if not self.keepAddressFrame:
+ xTF = self.getFrameByName(
+ "Sender Address", TextDocument.xTextDocument)
+ if xTF != None:
+ xTF.dispose()
+
+ except Exception:
+ traceback.print_exc()
+
+class BusinessPaperObject(object):
+
+ def __init__(self, FrameText, Width, Height, XPos, YPos):
+ self.iWidth = Width
+ self.iHeight = Height
+ self.iXPos = XPos
+ self.iYPos = YPos
+ self.xFrame = None
+ try:
+ self.xFrame = \
+ TextDocument.xTextDocument.createInstance(
+ "com.sun.star.text.TextFrame")
+ self.setFramePosition()
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "AnchorType", AT_PAGE)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "SizeType", FIX)
+
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "TextWrap", THROUGHT)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "Opaque", True);
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "BackColor", 15790320)
+
+ myBorder = BorderLine()
+ myBorder.OuterLineWidth = 0
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "LeftBorder", myBorder)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "RightBorder", myBorder)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "TopBorder", myBorder)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "BottomBorder", myBorder)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "Print", False)
+ xTextCursor = \
+ TextDocument.xTextDocument.Text.createTextCursor()
+ xTextCursor.gotoEnd(True)
+ xText = TextDocument.xTextDocument.Text
+ xText.insertTextContent(
+ xTextCursor, self.xFrame,
+ False)
+
+ xFrameText = self.xFrame.Text
+ xFrameCursor = xFrameText.createTextCursor()
+ xFrameCursor.setPropertyValue("CharWeight", BOLD)
+ xFrameCursor.setPropertyValue("CharColor", 16777215)
+ xFrameCursor.setPropertyValue("CharFontName", "Albany")
+ xFrameCursor.setPropertyValue("CharHeight", 18)
+
+ xFrameText.insertString(xFrameCursor, FrameText, False)
+ except Exception:
+ traceback.print_exc()
+
+ def setFramePosition(self):
+ try:
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "HoriOrient", NONEHORI)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "VertOrient", NONEVERT)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ PropertyNames.PROPERTY_HEIGHT, self.iHeight)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ PropertyNames.PROPERTY_WIDTH, self.iWidth)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "HoriOrientPosition", self.iXPos)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "VertOrientPosition", self.iYPos)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "HoriOrientRelation", PAGE_FRAME)
+ Helper.setUnoPropertyValue(
+ self.xFrame,
+ "VertOrientRelation", PAGE_FRAME)
+ except Exception:
+ traceback.print_exc()
+
+ def removeFrame(self):
+ if self.xFrame is not None:
+ try:
+ TextDocument.xTextDocument.Text.removeTextContent(
+ self.xFrame)
+ except Exception:
+ traceback.print_exc()
diff --git a/wizards/com/sun/star/wizards/letter/LetterWizardDialog.py b/wizards/com/sun/star/wizards/letter/LetterWizardDialog.py
new file mode 100644
index 000000000000..f6cfb4ced636
--- /dev/null
+++ b/wizards/com/sun/star/wizards/letter/LetterWizardDialog.py
@@ -0,0 +1,1105 @@
+from wizards.ui.WizardDialog import *
+from LetterWizardDialogConst import *
+from LetterWizardDialogResources import LetterWizardDialogResources
+
+from com.sun.star.awt.FontUnderline import SINGLE
+
+class LetterWizardDialog(WizardDialog):
+
+ def __init__(self, xmsf):
+ super(LetterWizardDialog, self).__init__(xmsf, HIDMAIN )
+
+ self.resources = LetterWizardDialogResources(xmsf)
+ Helper.setUnoPropertyValues(
+ self.xDialogModel,
+ ("Closeable",
+ PropertyNames.PROPERTY_HEIGHT,
+ "Moveable",
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Title",
+ PropertyNames.PROPERTY_WIDTH),
+ (True, 210, True,
+ "LetterWizardDialog", 104, 52, 1, 1,
+ self.resources.resLetterWizardDialog_title, 310))
+ self.fontDescriptor1 = \
+ uno.createUnoStruct('com.sun.star.awt.FontDescriptor')
+ self.fontDescriptor2 = \
+ uno.createUnoStruct('com.sun.star.awt.FontDescriptor')
+ self.fontDescriptor5 = \
+ uno.createUnoStruct('com.sun.star.awt.FontDescriptor')
+ self.fontDescriptor6 = \
+ uno.createUnoStruct('com.sun.star.awt.FontDescriptor')
+ self.fontDescriptor1.Weight = 150
+ self.fontDescriptor1.Underline = SINGLE
+ self.fontDescriptor2.Weight = 100
+ self.fontDescriptor5.Weight = 100
+ self.fontDescriptor6.Weight = 150
+
+ def buildStep1(self):
+ self.optBusinessLetter = self.insertRadioButton(
+ "optBusinessLetter", OPTBUSINESSLETTER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 1),
+ self.resources.resoptBusinessLetter_value,
+ "optBusinessLetter", 97, 28, 1, 1, 184), self)
+ self.optPrivOfficialLetter = self.insertRadioButton(
+ "optPrivOfficialLetter", OPTPRIVOFFICIALLETTER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 2),
+ self.resources.resoptPrivOfficialLetter_value,
+ "optPrivOfficialLetter", 97, 74, 1, 2, 184), self)
+ self.optPrivateLetter = self.insertRadioButton(
+ "optPrivateLetter", OPTPRIVATELETTER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 3),
+ self.resources.resoptPrivateLetter_value,
+ "optPrivateLetter", 97, 106, 1, 3, 184), self)
+ self.lstBusinessStyle = self.insertListBox(
+ "lstBusinessStyle", LSTBUSINESSSTYLE_ACTION_PERFORMED,
+ LSTBUSINESSSTYLE_ITEM_CHANGED,
+ ("Dropdown",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (True, 12, HelpIds.getHelpIdString(HID + 4),
+ "lstBusinessStyle",
+ 180, 40, 1, 4, 74), self)
+ self.chkBusinessPaper = self.insertCheckBox(
+ "chkBusinessPaper", CHKBUSINESSPAPER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 5),
+ self.resources.reschkBusinessPaper_value,
+ "chkBusinessPaper", 110, 56, 0, 1, 5, 168), self)
+ self.lstPrivOfficialStyle = self.insertListBox(
+ "lstPrivOfficialStyle", LSTPRIVOFFICIALSTYLE_ACTION_PERFORMED,
+ LSTPRIVOFFICIALSTYLE_ITEM_CHANGED,
+ ("Dropdown",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (True, 12, HelpIds.getHelpIdString(HID + 6),
+ "lstPrivOfficialStyle", 180, 86, 1, 6, 74), self)
+ self.lstPrivateStyle = self.insertListBox(
+ "lstPrivateStyle", LSTPRIVATESTYLE_ACTION_PERFORMED,
+ LSTPRIVATESTYLE_ITEM_CHANGED,
+ ("Dropdown",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (True, 12, HelpIds.getHelpIdString(HID + 7),
+ "lstPrivateStyle", 180, 118, 1, 7, 74), self)
+ self.insertLabel("lblBusinessStyle",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblBusinessStyle_value,
+ "lblBusinessStyle", 110, 42, 1, 48, 60))
+ self.insertLabel("lblPrivOfficialStyle",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblPrivOfficialStyle_value,
+ "lblPrivOfficialStyle", 110, 88, 1, 49, 60))
+ self.insertLabel("lblTitle1",
+ ("FontDescriptor",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (self.fontDescriptor6, 16,
+ self.resources.reslblTitle1_value, True,
+ "lblTitle1", 91, 8, 1, 55, 212))
+ self.insertLabel("lblPrivateStyle",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblPrivateStyle_value,
+ "lblPrivateStyle", 110, 120, 1, 74, 60))
+ self.insertLabel("lblIntroduction",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (39, self.resources.reslblIntroduction_value,
+ True,
+ "lblIntroduction", 104, 145, 1, 80, 199))
+ self.ImageControl3 = self.insertInfoImage(92, 145, 1)
+
+ def buildStep2(self):
+ self.chkPaperCompanyLogo = self.insertCheckBox(
+ "chkPaperCompanyLogo",
+ CHKPAPERCOMPANYLOGO_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 8),
+ self.resources.reschkPaperCompanyLogo_value,
+ "chkPaperCompanyLogo", 97, 28, 0, 2, 8, 68), self)
+ self.numLogoHeight = self.insertNumericField(
+ "numLogoHeight",
+ NUMLOGOHEIGHT_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ "StrictFormat",
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 9),
+ "numLogoHeight", 138, 40, True, 2, True, 9, 3, 30), self)
+ self.numLogoX = self.insertNumericField(
+ "numLogoX", NUMLOGOX_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 10),
+ "numLogoX", 266, 40, True, 2, 10, 0, 30), self)
+ self.numLogoWidth = self.insertNumericField(
+ "numLogoWidth", NUMLOGOWIDTH_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 11),
+ "numLogoWidth", 138, 56, True, 2, 11, 3.8, 30), self)
+ self.numLogoY = self.insertNumericField(
+ "numLogoY", NUMLOGOY_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 12),
+ "numLogoY", 266, 56, True, 2, 12, -3.4, 30), self)
+ self.chkPaperCompanyAddress = self.insertCheckBox(
+ "chkPaperCompanyAddress", CHKPAPERCOMPANYADDRESS_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 13),
+ self.resources.reschkPaperCompanyAddress_value,
+ "chkPaperCompanyAddress", 98, 84, 0, 2, 13, 68), self)
+ self.numAddressHeight = self.insertNumericField(
+ "numAddressHeight", NUMADDRESSHEIGHT_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ "StrictFormat",
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 14),
+ "numAddressHeight", 138, 96, True, 2, True, 14, 3, 30), self)
+ self.numAddressX = self.insertNumericField(
+ "numAddressX", NUMADDRESSX_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 15),
+ "numAddressX", 266, 96, True, 2, 15, 3.8, 30), self)
+ self.numAddressWidth = self.insertNumericField(
+ "numAddressWidth", NUMADDRESSWIDTH_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 16),
+ "numAddressWidth", 138, 112, True, 2, 16, 13.8, 30), self)
+ self.numAddressY = self.insertNumericField(
+ "numAddressY", NUMADDRESSY_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 17),
+ "numAddressY", 266, 112, True, 2, 17, -3.4, 30), self)
+ self.chkCompanyReceiver = self.insertCheckBox(
+ "chkCompanyReceiver", CHKCOMPANYRECEIVER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 18),
+ self.resources.reschkCompanyReceiver_value,
+ "chkCompanyReceiver", 103, 131, 0, 2, 18, 185), self)
+ self.chkPaperFooter = self.insertCheckBox(
+ "chkPaperFooter", CHKPAPERFOOTER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 19),
+ self.resources.reschkPaperFooter_value,
+ "chkPaperFooter", 97, 158, 0, 2, 19, 68), self)
+ self.numFooterHeight = self.insertNumericField(
+ "numFooterHeight", NUMFOOTERHEIGHT_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "Spin",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Value",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 20),
+ "numFooterHeight", 236, 156, True, 2, 20, 5, 30), self)
+ self.insertLabel("lblLogoHeight",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblLogoHeight_value,
+ "lblLogoHeight", 103, 42, 2, 68, 32))
+ self.insertLabel("lblLogoWidth",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblLogoWidth_value,
+ "lblLogoWidth", 103, 58, 2, 69, 32))
+ self.insertFixedLine(
+ "FixedLine5",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (2,
+ "FixedLine5", 90, 78, 2, 70, 215))
+ self.insertFixedLine(
+ "FixedLine6",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (2,
+ "FixedLine6", 90, 150, 2, 71, 215))
+ self.insertLabel("lblFooterHeight",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblFooterHeight_value,
+ "lblFooterHeight", 200, 158, 2, 72, 32))
+ self.insertLabel("lblLogoX",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblLogoX_value,
+ "lblLogoX", 170, 42, 2, 84, 94))
+ self.insertLabel("lblLogoY",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblLogoY_value,
+ "lblLogoY", 170, 58, 2, 85, 94))
+ self.insertLabel("lblAddressHeight",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblAddressHeight_value,
+ "lblAddressHeight", 103, 98, 2, 86, 32))
+ self.insertLabel("lblAddressWidth",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblAddressWidth_value,
+ "lblAddressWidth", 103, 114, 2, 87, 32))
+ self.insertLabel("lblAddressX",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblAddressX_value,
+ "lblAddressX", 170, 98, 2, 88, 94))
+ self.insertLabel("lblAddressY",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblAddressY_value,
+ "lblAddressY", 170, 114, 2, 89, 94))
+ self.insertLabel("lblTitle2",
+ ("FontDescriptor",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (self.fontDescriptor6, 16,
+ self.resources.reslblTitle2_value, True,
+ "lblTitle2", 91, 8, 2, 91, 212))
+
+ def buildStep3(self):
+ self.lstLetterNorm = self.insertListBox(
+ "lstLetterNorm",
+ LSTLETTERNORM_ACTION_PERFORMED,
+ LSTLETTERNORM_ITEM_CHANGED,
+ ("Dropdown",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (True, 12, HelpIds.getHelpIdString(HID + 21),
+ "lstLetterNorm", 210, 34, 3, 21, 74), self)
+ self.chkUseLogo = self.insertCheckBox(
+ "chkUseLogo", CHKUSELOGO_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 22),
+ self.resources.reschkUseLogo_value,
+ "chkUseLogo", 97, 54, 0, 3, 22, 212), self)
+ self.chkUseAddressReceiver = self.insertCheckBox(
+ "chkUseAddressReceiver",
+ CHKUSEADDRESSRECEIVER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 23),
+ self.resources.reschkUseAddressReceiver_value,
+ "chkUseAddressReceiver", 97, 69, 0, 3, 23, 212), self)
+ self.chkUseSigns = self.insertCheckBox(
+ "chkUseSigns", CHKUSESIGNS_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 24),
+ self.resources.reschkUseSigns_value,
+ "chkUseSigns", 97, 82, 0, 3, 24, 212), self)
+ self.chkUseSubject = self.insertCheckBox(
+ "chkUseSubject", CHKUSESUBJECT_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 25),
+ self.resources.reschkUseSubject_value,
+ "chkUseSubject", 97, 98, 0, 3, 25, 212), self)
+ self.chkUseSalutation = self.insertCheckBox(
+ "chkUseSalutation", CHKUSESALUTATION_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 26),
+ self.resources.reschkUseSalutation_value,
+ "chkUseSalutation", 97, 113, 0, 3, 26, 66), self)
+ self.lstSalutation = self.insertComboBox(
+ "lstSalutation",
+ LSTSALUTATION_ACTION_PERFORMED,
+ LSTSALUTATION_ITEM_CHANGED,
+ LSTSALUTATION_TEXT_CHANGED,
+ ("Dropdown",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (True, 12, HelpIds.getHelpIdString(HID + 27),
+ "lstSalutation", 210, 110, 3, 27, 74), self)
+ self.chkUseBendMarks = self.insertCheckBox(
+ "chkUseBendMarks", CHKUSEBENDMARKS_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 28),
+ self.resources.reschkUseBendMarks_value,
+ "chkUseBendMarks", 97, 127, 0, 3, 28, 212), self)
+ self.chkUseGreeting = self.insertCheckBox(
+ "chkUseGreeting", CHKUSEGREETING_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 29),
+ self.resources.reschkUseGreeting_value,
+ "chkUseGreeting", 97, 142, 0, 3, 29, 66), self)
+ self.lstGreeting = self.insertComboBox(
+ "lstGreeting", LSTGREETING_ACTION_PERFORMED,
+ LSTGREETING_ITEM_CHANGED, LSTGREETING_TEXT_CHANGED,
+ ("Dropdown",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (True, 12, HelpIds.getHelpIdString(HID + 30),
+ "lstGreeting", 210, 141, 3, 30, 74), self)
+ self.chkUseFooter = self.insertCheckBox(
+ "chkUseFooter", CHKUSEFOOTER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 31),
+ self.resources.reschkUseFooter_value,
+ "chkUseFooter", 97, 158, 0, 3, 31, 212), self)
+ self.insertLabel("lblLetterNorm",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (16, self.resources.reslblLetterNorm_value, True,
+ "lblLetterNorm", 97, 28, 3, 50, 109))
+ self.insertLabel("lblTitle3",
+ (
+ "FontDescriptor", PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (self.fontDescriptor6, 16,
+ self.resources.reslblTitle3_value, True,
+ "lblTitle3", 91, 8, 3, 90, 212))
+
+ def buildStep4(self):
+ self.optSenderPlaceholder = self.insertRadioButton(
+ "optSenderPlaceholder", OPTSENDERPLACEHOLDER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 32),
+ self.resources.resoptSenderPlaceholder_value,
+ "optSenderPlaceholder", 104, 42, 4, 32, 149), self)
+ self.optSenderDefine = self.insertRadioButton(
+ "optSenderDefine", OPTSENDERDEFINE_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 33),
+ self.resources.resoptSenderDefine_value,
+ "optSenderDefine", 104, 54, 4, 33, 149), self)
+ self.txtSenderName = self.insertTextField(
+ "txtSenderName", TXTSENDERNAME_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 34),
+ "txtSenderName", 182, 67, 4, 34, 119), self)
+ self.txtSenderStreet = self.insertTextField(
+ "txtSenderStreet", TXTSENDERSTREET_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 35),
+ "txtSenderStreet", 182, 81, 4, 35, 119), self)
+ self.txtSenderPostCode = self.insertTextField(
+ "txtSenderPostCode", TXTSENDERPOSTCODE_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 36),
+ "txtSenderPostCode", 182, 95, 4, 36, 25), self)
+ self.txtSenderState = self.insertTextField(
+ "txtSenderState", TXTSENDERSTATE_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 37),
+ "txtSenderState", 211, 95, 4, 37, 21), self)
+ self.txtSenderCity = self.insertTextField(
+ "txtSenderCity", TXTSENDERCITY_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 38),
+ "txtSenderCity", 236, 95, 4, 38, 65), self)
+ self.optReceiverPlaceholder = self.insertRadioButton(
+ "optReceiverPlaceholder", OPTRECEIVERPLACEHOLDER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 39),
+ self.resources.resoptReceiverPlaceholder_value,
+ "optReceiverPlaceholder", 104, 145, 4, 39, 200), self)
+ self.optReceiverDatabase = self.insertRadioButton(
+ "optReceiverDatabase", OPTRECEIVERDATABASE_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 40),
+ self.resources.resoptReceiverDatabase_value,
+ "optReceiverDatabase", 104, 157, 4, 40, 200), self)
+ self.insertLabel("lblSenderAddress",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblSenderAddress_value,
+ "lblSenderAddress", 97, 28, 4, 64, 136))
+ self.insertFixedLine("FixedLine2",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (5,
+ "FixedLine2", 90, 126, 4, 75, 212))
+ self.insertLabel("lblReceiverAddress",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblReceiverAddress_value,
+ "lblReceiverAddress", 97, 134, 4, 76, 136))
+ self.insertLabel("lblSenderName",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblSenderName_value,
+ "lblSenderName", 113, 69, 4, 77, 68))
+ self.insertLabel("lblSenderStreet",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblSenderStreet_value,
+ "lblSenderStreet", 113, 82, 4, 78, 68))
+ self.insertLabel("lblPostCodeCity",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblPostCodeCity_value,
+ "lblPostCodeCity", 113, 97, 4, 79, 68))
+ self.insertLabel("lblTitle4",
+ ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (self.fontDescriptor6, 16,
+ self.resources.reslblTitle4_value, True,
+ "lblTitle4", 91, 8, 4, 92, 212))
+
+ def buildStep5(self):
+ self.txtFooter = self.insertTextField(
+ "txtFooter", TXTFOOTER_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (47, HelpIds.getHelpIdString(HID + 41), True,
+ "txtFooter", 97, 40, 5, 41, 203), self)
+ self.chkFooterNextPages = self.insertCheckBox(
+ "chkFooterNextPages", CHKFOOTERNEXTPAGES_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 42),
+ self.resources.reschkFooterNextPages_value,
+ "chkFooterNextPages", 97, 92, 0, 5, 42, 202), self)
+ self.chkFooterPageNumbers = self.insertCheckBox(
+ "chkFooterPageNumbers", CHKFOOTERPAGENUMBERS_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STATE,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 43),
+ self.resources.reschkFooterPageNumbers_value,
+ "chkFooterPageNumbers", 97, 106, 0, 5, 43, 201), self)
+ self.insertLabel("lblFooter",
+ ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (self.fontDescriptor5, 8, self.resources.reslblFooter_value,
+ "lblFooter", 97, 28, 5, 52, 116))
+ self.insertLabel("lblTitle5",
+ ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (self.fontDescriptor6, 16,
+ self.resources.reslblTitle5_value, True,
+ "lblTitle5", 91, 8, 5, 93, 212))
+
+ def buildStep6(self):
+ self.txtTemplateName = self.insertTextField(
+ "txtTemplateName", TXTTEMPLATENAME_TEXT_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ "Text",
+ PropertyNames.PROPERTY_WIDTH),
+ (12, HelpIds.getHelpIdString(HID + 44),
+ "txtTemplateName", 202, 56, 6, 44,
+ self.resources.restxtTemplateName_value, 100), self)
+ self.optCreateLetter = self.insertRadioButton(
+ "optCreateLetter", OPTCREATELETTER_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 45),
+ self.resources.resoptCreateLetter_value,
+ "optCreateLetter", 104, 111, 6, 50, 198), self)
+ self.optMakeChanges = self.insertRadioButton(
+ "optMakeChanges", OPTMAKECHANGES_ITEM_CHANGED,
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, HelpIds.getHelpIdString(HID + 46),
+ self.resources.resoptMakeChanges_value,
+ "optMakeChanges", 104, 123, 6, 51, 198), self)
+ self.insertLabel("lblFinalExplanation1",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (26, self.resources.reslblFinalExplanation1_value, True,
+ "lblFinalExplanation1", 97, 28, 6, 52, 205))
+ self.insertLabel("lblProceed",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblProceed_value,
+ "lblProceed", 97, 100, 6, 53, 204))
+ self.insertLabel("lblFinalExplanation2",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (33, self.resources.reslblFinalExplanation2_value, True,
+ "lblFinalExplanation2", 104, 145, 6, 54, 199))
+ self.insertImage(
+ "ImageControl2",
+ ("Border", PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_IMAGEURL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ "ScaleImage",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (0, 10,
+ "private:resource/dbu/image/19205",
+ "ImageControl2", 92, 145, False, 6, 66, 10))
+ self.insertLabel("lblTemplateName",
+ (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (8, self.resources.reslblTemplateName_value,
+ "lblTemplateName", 97, 58, 6, 82, 101))
+ self.insertLabel("lblTitle6",
+ ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_NAME,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (self.fontDescriptor6, 16,
+ self.resources.reslblTitle6_value, True,
+ "lblTitle6", 91, 8, 6, 94, 212))
diff --git a/wizards/com/sun/star/wizards/letter/LetterWizardDialogImpl.py b/wizards/com/sun/star/wizards/letter/LetterWizardDialogImpl.py
new file mode 100644
index 000000000000..3ac564269af4
--- /dev/null
+++ b/wizards/com/sun/star/wizards/letter/LetterWizardDialogImpl.py
@@ -0,0 +1,1196 @@
+from LetterWizardDialog import *
+from LetterDocument import *
+from wizards.common.NoValidPathException import NoValidPathException
+from wizards.common.FileAccess import FileAccess
+from LocaleCodes import LocaleCodes
+from wizards.ui.PathSelection import PathSelection
+from wizards.common.Configuration import Configuration
+from CGLetterWizard import CGLetterWizard
+from wizards.ui.event.UnoDataAware import UnoDataAware
+from wizards.ui.event.RadioDataAware import RadioDataAware
+from wizards.text.TextFieldHandler import TextFieldHandler
+from wizards.common.SystemDialog import SystemDialog
+
+from com.sun.star.awt.VclWindowPeerAttribute import YES_NO, DEF_NO
+from com.sun.star.view.DocumentZoomType import OPTIMAL
+from com.sun.star.document.UpdateDocMode import FULL_UPDATE
+from com.sun.star.document.MacroExecMode import ALWAYS_EXECUTE
+
+class LetterWizardDialogImpl(LetterWizardDialog):
+
+ RM_TYPESTYLE = 1
+ RM_BUSINESSPAPER = 2
+ RM_ELEMENTS = 3
+ RM_SENDERRECEIVER = 4
+ RM_FOOTER = 5
+ RM_FINALSETTINGS = 6
+
+ lstBusinessStylePos = None
+ lstPrivateStylePos = None
+ lstPrivOfficialStylePos = None
+
+ def enterStep(self, OldStep, NewStep):
+ pass
+
+ def leaveStep(self, OldStep, NewStep):
+ pass
+
+ def __init__(self, xmsf):
+ super(LetterWizardDialogImpl, self).__init__(xmsf)
+ self.xmsf = xmsf
+ self.bSaveSuccess = False
+ self.filenameChanged = False
+ self.BusCompanyLogo = None
+ self.BusCompanyAddress = None
+ self.BusCompanyAddressReceiver = None
+ self.BusFooter = None
+ self.Norms = []
+ self.NormPaths = []
+
+ @classmethod
+ def main(self, args):
+ ConnectStr = \
+ "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext"
+ xLocMSF = None
+ try:
+ xLocMSF = Desktop.connect(ConnectStr)
+ except Exception, e:
+ traceback.print_exc()
+
+ lw = LetterWizardDialogImpl(xLocMSF)
+ lw.startWizard(xLocMSF, None)
+
+ def startWizard(self, xMSF, CurPropertyValue):
+ self.running = True
+ try:
+ #Number of steps on WizardDialog
+ self.nMaxStep = 6
+
+ #instatiate The Document Frame for the Preview
+ self.myLetterDoc = LetterDocument(xMSF, self)
+
+ #create the dialog
+ self.drawNaviBar()
+ self.buildStep1()
+ self.buildStep2()
+ self.buildStep3()
+ self.buildStep4()
+ self.buildStep5()
+ self.buildStep6()
+ self.__initializePaths()
+ self.initializeNorms()
+ self.initializeSalutation()
+ self.initializeGreeting()
+
+ #special Control fFrameor setting the save Path:
+ self.insertPathSelectionControl()
+
+ self.myConfig = CGLetterWizard()
+
+ oL = self.getOfficeLinguistic()
+ self.myConfig.cp_BusinessLetter.cp_Norm = oL
+ self.myConfig.cp_PrivateOfficialLetter.cp_Norm = oL
+ self.myConfig.cp_PrivateLetter.cp_Norm = oL
+ self.initializeTemplates(xMSF)
+
+ #load the last used settings
+ #from the registry and apply listeners to the controls:
+ self.initConfiguration()
+
+ if self.myConfig.cp_BusinessLetter.cp_Greeting == "":
+ self.myConfig.cp_BusinessLetter.cp_Greeting = \
+ self.resources.GreetingLabels[0]
+
+ if self.myConfig.cp_BusinessLetter.cp_Salutation == "":
+ self.myConfig.cp_BusinessLetter.cp_Salutation = \
+ self.resources.SalutationLabels[0]
+
+ if self.myConfig.cp_PrivateOfficialLetter.cp_Greeting == "":
+ self.myConfig.cp_PrivateOfficialLetter.cp_Greeting = \
+ self.resources.GreetingLabels[1]
+
+ if self.myConfig.cp_PrivateOfficialLetter.cp_Salutation == "":
+ self.myConfig.cp_PrivateOfficialLetter.cp_Salutation = \
+ self.resources.SalutationLabels[1]
+
+ if self.myConfig.cp_PrivateLetter.cp_Greeting == "":
+ self.myConfig.cp_PrivateLetter.cp_Greeting = \
+ self.resources.GreetingLabels[2]
+
+ if self.myConfig.cp_PrivateLetter.cp_Salutation == "":
+ self.myConfig.cp_PrivateLetter.cp_Salutation = \
+ self.resources.SalutationLabels[2]
+
+ if self.myPathSelection.xSaveTextBox.Text.lower() == "":
+ self.myPathSelection.initializePath()
+
+ xContainerWindow = self.myLetterDoc.xFrame.ContainerWindow
+ self.createWindowPeer(xContainerWindow)
+ self.insertRoadmap()
+ self.setConfiguration()
+ self.setDefaultForGreetingAndSalutation()
+ self.initializeElements()
+ self.myLetterDoc.xFrame.ComponentWindow.Enable = False
+ self.executeDialogFromComponent(self.myLetterDoc.xFrame)
+ self.removeTerminateListener()
+ self.closeDocument()
+ self.running = False
+ except Exception, exception:
+ self.removeTerminateListener()
+ traceback.print_exc()
+ self.running = False
+ return
+
+ def cancelWizard(self):
+ self.xUnoDialog.endExecute()
+ self.running = False
+
+ def finishWizard(self):
+ self.switchToStep(self.getCurrentStep(), self.nMaxStep)
+ endWizard = True
+ try:
+ fileAccess = FileAccess(self.xMSF)
+ self.sPath = self.myPathSelection.getSelectedPath()
+ if self.sPath == "":
+ self.myPathSelection.triggerPathPicker()
+ self.sPath = self.myPathSelection.getSelectedPath()
+
+ self.sPath = fileAccess.getURL(self.sPath)
+ if not self.filenameChanged:
+ if fileAccess.exists(self.sPath, True):
+ answer = SystemDialog.showMessageBox(
+ self.xMSF, "MessBox", YES_NO + DEF_NO,
+ self.resources.resOverwriteWarning,
+ self.xUnoDialog.Peer)
+ if answer == 3:
+ # user said: no, do not overwrite...
+ endWizard = False
+ return False
+
+ self.myLetterDoc.setWizardTemplateDocInfo(
+ self.resources.resLetterWizardDialog_title,
+ self.resources.resTemplateDescription)
+ self.myLetterDoc.killEmptyUserFields()
+ self.myLetterDoc.keepLogoFrame = self.chkUseLogo.State != 0
+ if self.chkBusinessPaper.State != 0 \
+ and self.chkPaperCompanyLogo.State != 0:
+ self.myLetterDoc.keepLogoFrame = False
+
+ self.myLetterDoc.keepBendMarksFrame = \
+ self.chkUseBendMarks.State != 0
+ self.myLetterDoc.keepLetterSignsFrame = \
+ self.chkUseSigns.State != 0
+ self.myLetterDoc.keepSenderAddressRepeatedFrame = \
+ self.chkUseAddressReceiver.State != 0
+ if self.optBusinessLetter.State:
+ if self.chkBusinessPaper.State != 0 \
+ and self.chkCompanyReceiver.State != 0:
+ self.myLetterDoc.keepSenderAddressRepeatedFrame = False
+
+ if self.chkBusinessPaper.State != 0 \
+ and self.chkPaperCompanyAddress.State != 0:
+ self.myLetterDoc.keepAddressFrame = False
+
+ self.myLetterDoc.killEmptyFrames()
+ self.bSaveSuccess = \
+ OfficeDocument.store(
+ self.xMSF, TextDocument.xTextDocument,
+ self.sPath, "writer8_template")
+ if self.bSaveSuccess:
+ self.saveConfiguration()
+ xIH = self.xMSF.createInstance(
+ "com.sun.star.comp.uui.UUIInteractionHandler")
+ loadValues = range(4)
+ loadValues[0] = uno.createUnoStruct( \
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[0].Name = "AsTemplate"
+ loadValues[1] = uno.createUnoStruct( \
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[1].Name = "MacroExecutionMode"
+ loadValues[1].Value = ALWAYS_EXECUTE
+ loadValues[2] = uno.createUnoStruct( \
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[2].Name = "UpdateDocMode"
+ loadValues[2].Value = FULL_UPDATE
+ loadValues[3] = uno.createUnoStruct( \
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[3].Name = "InteractionHandler"
+ loadValues[3].Value = xIH
+ if self.bEditTemplate:
+ loadValues[0].Value = False
+ else:
+ loadValues[0].Value = True
+
+ oDoc = OfficeDocument.load(
+ Desktop.getDesktop(self.xMSF),
+ self.sPath, "_default", loadValues)
+ myViewHandler = ViewHandler(self.xMSF, oDoc)
+ myViewHandler.setViewSetting("ZoomType", OPTIMAL)
+ else:
+ pass
+
+ except Exception, e:
+ traceback.print_exc()
+ finally:
+ if endWizard:
+ self.xUnoDialog.endExecute()
+ self.running = False
+
+ return True;
+
+ def closeDocument(self):
+ try:
+ xCloseable = self.myLetterDoc.xFrame
+ xCloseable.close(False)
+ except CloseVetoException, e:
+ traceback.print_exc()
+
+ def optBusinessLetterItemChanged(self):
+ LetterWizardDialogImpl.lstPrivateStylePos = None
+ LetterWizardDialogImpl.lstPrivOfficialStylePos = None
+ self.setControlProperty(
+ "lblBusinessStyle", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lstBusinessStyle", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "chkBusinessPaper", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblPrivOfficialStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lstPrivOfficialStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblPrivateStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lstPrivateStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.lstBusinessStyleItemChanged()
+ self.enableSenderReceiver()
+ self.setPossibleFooter(True)
+ if self.myPathSelection.xSaveTextBox.Text.lower() == "":
+ self.myPathSelection.initializePath()
+
+ def optPrivOfficialLetterItemChanged(self):
+ LetterWizardDialogImpl.lstBusinessStylePos = None
+ LetterWizardDialogImpl.lstPrivateStylePos = None
+ self.setControlProperty(
+ "lblBusinessStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lstBusinessStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "chkBusinessPaper", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblPrivOfficialStyle", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lstPrivOfficialStyle", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblPrivateStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lstPrivateStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.lstPrivOfficialStyleItemChanged()
+ self.disableBusinessPaper()
+ self.enableSenderReceiver()
+ self.setPossibleFooter(True)
+ if self.myPathSelection.xSaveTextBox.Text.lower() == "":
+ self.myPathSelection.initializePath()
+
+ def optPrivateLetterItemChanged(self):
+ LetterWizardDialogImpl.lstBusinessStylePos = None
+ LetterWizardDialogImpl.lstPrivOfficialStylePos = None
+ self.setControlProperty(
+ "lblBusinessStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lstBusinessStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "chkBusinessPaper", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblPrivOfficialStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lstPrivOfficialStyle", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblPrivateStyle", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lstPrivateStyle", PropertyNames.PROPERTY_ENABLED, True)
+ self.lstPrivateStyleItemChanged()
+ self.disableBusinessPaper()
+ self.disableSenderReceiver()
+ self.setPossibleFooter(False)
+ if self.myPathSelection.xSaveTextBox.Text.lower() == "":
+ self.myPathSelection.initializePath()
+
+ def optSenderPlaceholderItemChanged(self):
+ self.setControlProperty(
+ "lblSenderName", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblSenderStreet", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblPostCodeCity", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "txtSenderName", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "txtSenderStreet", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "txtSenderPostCode", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "txtSenderState", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "txtSenderCity", PropertyNames.PROPERTY_ENABLED, False)
+ self.myLetterDoc.fillSenderWithUserData()
+
+ def optSenderDefineItemChanged(self):
+ self.setControlProperty(
+ "lblSenderName", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblSenderStreet", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblPostCodeCity", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "txtSenderName", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "txtSenderStreet", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "txtSenderPostCode", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "txtSenderState", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "txtSenderCity", PropertyNames.PROPERTY_ENABLED, True)
+ self.txtSenderNameTextChanged()
+ self.txtSenderStreetTextChanged()
+ self.txtSenderPostCodeTextChanged()
+ self.txtSenderStateTextChanged()
+ self.txtSenderCityTextChanged()
+
+ def lstBusinessStyleItemChanged(self):
+ selectedItemPos = self.lstBusinessStyle.SelectedItemPos
+ if LetterWizardDialogImpl.lstBusinessStylePos is not selectedItemPos:
+ LetterWizardDialogImpl.lstBusinessStylePos = selectedItemPos
+ TextDocument.xTextDocument = \
+ self.myLetterDoc.loadAsPreview(
+ self.BusinessFiles[1][selectedItemPos],
+ False)
+ self.myLetterDoc.xTextDocument.lockControllers()
+ self.initializeElements()
+ self.chkBusinessPaperItemChanged()
+ self.setElements(False)
+ self.myLetterDoc.xTextDocument.unlockControllers()
+
+ def lstPrivOfficialStyleItemChanged(self):
+ selectedItemPos = self.lstPrivOfficialStyle.SelectedItemPos
+ if LetterWizardDialogImpl.lstPrivOfficialStylePos is not selectedItemPos:
+ LetterWizardDialogImpl.lstPrivOfficialStylePos = selectedItemPos
+ TextDocument.xTextDocument = \
+ self.myLetterDoc.loadAsPreview(
+ self.OfficialFiles[1][selectedItemPos],
+ False)
+ self.myLetterDoc.xTextDocument.lockControllers()
+ self.initializeElements()
+ self.setPossibleSenderData(True)
+ self.setElements(False)
+ self.myLetterDoc.xTextDocument.unlockControllers()
+
+ def lstPrivateStyleItemChanged(self):
+ selectedItemPos = self.lstPrivateStyle.SelectedItemPos
+ if LetterWizardDialogImpl.lstPrivateStylePos is not selectedItemPos:
+ LetterWizardDialogImpl.lstPrivateStylePos = selectedItemPos
+ TextDocument.xTextDocument = \
+ self.myLetterDoc.loadAsPreview(
+ self.PrivateFiles[1][selectedItemPos],
+ False)
+ self.myLetterDoc.xTextDocument.lockControllers()
+ self.initializeElements()
+ self.setElements(True)
+ self.myLetterDoc.xTextDocument.unlockControllers()
+
+ def numLogoHeightTextChanged(self):
+ self.BusCompanyLogo.iHeight = int(self.numLogoHeight.Value * 1000)
+ self.BusCompanyLogo.setFramePosition()
+
+ def numLogoWidthTextChanged(self):
+ self.BusCompanyLogo.iWidth = int(self.numLogoWidth.Value * 1000)
+ self.BusCompanyLogo.setFramePosition()
+
+ def numLogoXTextChanged(self):
+ self.BusCompanyLogo.iXPos = int(self.numLogoX.Value * 1000)
+ self.BusCompanyLogo.setFramePosition()
+
+ def numLogoYTextChanged(self):
+ self.BusCompanyLogo.iYPos = int(self.numLogoY.Value * 1000)
+ self.BusCompanyLogo.setFramePosition()
+
+ def numAddressWidthTextChanged(self):
+ self.BusCompanyAddress.iWidth = int(self.numAddressWidth.Value * 1000)
+ self.BusCompanyAddress.setFramePosition()
+
+ def numAddressXTextChanged(self):
+ self.BusCompanyAddress.iXPos = int(self.numAddressX.Value * 1000)
+ self.BusCompanyAddress.setFramePosition()
+
+ def numAddressYTextChanged(self):
+ self.BusCompanyAddress.iYPos = int(self.numAddressY.Value * 1000)
+ self.BusCompanyAddress.setFramePosition()
+
+ def numAddressHeightTextChanged(self):
+ self.BusCompanyAddress.iHeight = int(self.numAddressHeight.Value * 1000)
+ self.BusCompanyAddress.setFramePosition()
+
+ def numFooterHeightTextChanged(self):
+ self.BusFooter.iHeight = int(self.numFooterHeight.Value * 1000)
+ self.BusFooter.iYPos = \
+ self.myLetterDoc.DocSize.Height - self.BusFooter.iHeight
+ self.BusFooter.setFramePosition()
+
+ def chkPaperCompanyLogoItemChanged(self):
+ if self.chkPaperCompanyLogo.State != 0:
+ if self.numLogoWidth.Value == 0:
+ self.numLogoWidth.Value = 0.1
+
+ if self.numLogoHeight.Value == 0:
+ self.numLogoHeight.Value = 0.1
+ self.BusCompanyLogo = BusinessPaperObject(
+ "Company Logo", int(self.numLogoWidth.Value * 1000),
+ int(self.numLogoHeight.Value * 1000),
+ int(self.numLogoX.Value * 1000),
+ self.numLogoY.Value * 1000)
+ self.setControlProperty(
+ "numLogoHeight", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblCompanyLogoHeight", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "numLogoWidth", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblCompanyLogoWidth", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "numLogoX", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblCompanyLogoX", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "numLogoY", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblCompanyLogoY", PropertyNames.PROPERTY_ENABLED, True)
+ self.setPossibleLogo(False)
+ else:
+ if self.BusCompanyLogo != None:
+ self.BusCompanyLogo.removeFrame()
+
+ self.setControlProperty(
+ "numLogoHeight", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblCompanyLogoHeight", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "numLogoWidth", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblCompanyLogoWidth", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "numLogoX", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblCompanyLogoX", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "numLogoY", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblCompanyLogoY", PropertyNames.PROPERTY_ENABLED, False)
+ self.setPossibleLogo(True)
+
+ def chkPaperCompanyAddressItemChanged(self):
+ if self.chkPaperCompanyAddress.State != 0:
+ if self.numAddressWidth.Value == 0:
+ self.numAddressWidth.Value = 0.1
+
+ if self.numAddressHeight.Value == 0:
+ self.numAddressHeight.Value = 0.1
+
+ self.BusCompanyAddress = BusinessPaperObject(
+ "Company Address", int(self.numAddressWidth.Value * 1000),
+ int(self.numAddressHeight.Value * 1000),
+ int(self.numAddressX.Value * 1000),
+ int(self.numAddressY.Value * 1000))
+ self.setControlProperty(
+ "numAddressHeight", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblCompanyAddressHeight", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "numAddressWidth", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblCompanyAddressWidth", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "numAddressX", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblCompanyAddressX", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "numAddressY", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblCompanyAddressY", PropertyNames.PROPERTY_ENABLED, True)
+ if self.myLetterDoc.hasElement("Sender Address"):
+ self.myLetterDoc.switchElement(
+ "Sender Address", False)
+
+ if self.chkCompanyReceiver.State != 0:
+ self.setPossibleSenderData(False)
+
+ else:
+ if self.BusCompanyAddress is not None:
+ self.BusCompanyAddress.removeFrame()
+ self.setControlProperty(
+ "numAddressHeight", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblCompanyAddressHeight", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "numAddressWidth", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblCompanyAddressWidth", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "numAddressX", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblCompanyAddressX", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "numAddressY", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblCompanyAddressY", PropertyNames.PROPERTY_ENABLED, False)
+ if self.myLetterDoc.hasElement("Sender Address"):
+ self.myLetterDoc.switchElement("Sender Address", True)
+
+ self.setPossibleSenderData(True)
+ if self.optSenderDefine.State:
+ self.optSenderDefineItemChanged()
+
+ if self.optSenderPlaceholder.State:
+ self.optSenderPlaceholderItemChanged()
+
+ def chkCompanyReceiverItemChanged(self):
+ xReceiverFrame = None
+ if self.chkCompanyReceiver.State != 0:
+ try:
+ xReceiverFrame = TextDocument.getFrameByName(
+ "Receiver Address", TextDocument.xTextDocument)
+ iFrameWidth = int(Helper.getUnoPropertyValue(
+ xReceiverFrame, PropertyNames.PROPERTY_WIDTH))
+ iFrameX = int(Helper.getUnoPropertyValue(
+ xReceiverFrame, "HoriOrientPosition"))
+ iFrameY = int(Helper.getUnoPropertyValue(
+ xReceiverFrame, "VertOrientPosition"))
+ iReceiverHeight = int(0.5 * 1000)
+ self.BusCompanyAddressReceiver = BusinessPaperObject(
+ " ", iFrameWidth, iReceiverHeight, iFrameX,
+ iFrameY - iReceiverHeight)
+ self.setPossibleAddressReceiver(False)
+ except NoSuchElementException:
+ traceback.print_exc()
+ except WrappedTargetException:
+ traceback.print_exc()
+
+ if self.chkPaperCompanyAddress.State != 0:
+ self.setPossibleSenderData(False)
+
+ else:
+ if self.BusCompanyAddressReceiver != None:
+ self.BusCompanyAddressReceiver.removeFrame()
+
+ self.setPossibleAddressReceiver(True)
+ self.setPossibleSenderData(True)
+ if self.optSenderDefine.State:
+ self.optSenderDefineItemChanged()
+
+ if self.optSenderPlaceholder.State:
+ self.optSenderPlaceholderItemChanged()
+
+ def chkPaperFooterItemChanged(self):
+ if self.chkPaperFooter.State != 0:
+ if self.numFooterHeight.Value == 0:
+ self.numFooterHeight.Value = 0.1
+
+ self.BusFooter = BusinessPaperObject(
+ "Footer", self.myLetterDoc.DocSize.Width,
+ int(self.numFooterHeight.Value * 1000), 0,
+ int(self.myLetterDoc.DocSize.Height - \
+ (self.numFooterHeight.Value * 1000)))
+ self.setControlProperty(
+ "numFooterHeight", PropertyNames.PROPERTY_ENABLED, True)
+ self.setControlProperty(
+ "lblFooterHeight", PropertyNames.PROPERTY_ENABLED, True)
+ self.setPossibleFooter(False)
+ else:
+ if self.BusFooter != None:
+ self.BusFooter.removeFrame()
+
+ self.setControlProperty(
+ "numFooterHeight", PropertyNames.PROPERTY_ENABLED, False)
+ self.setControlProperty(
+ "lblFooterHeight", PropertyNames.PROPERTY_ENABLED, False)
+ self.setPossibleFooter(True)
+
+ def chkUseLogoItemChanged(self):
+ try:
+ if self.myLetterDoc.hasElement("Company Logo"):
+ logostatus = \
+ bool(self.getControlProperty(
+ "chkUseLogo", PropertyNames.PROPERTY_ENABLED)) \
+ and (self.chkUseLogo.State != 0)
+ self.myLetterDoc.switchElement(
+ "Company Logo", logostatus)
+ except IllegalArgumentException, e:
+ traceback.print_exc()
+
+ def chkUseAddressReceiverItemChanged(self):
+ try:
+ if self.myLetterDoc.hasElement("Sender Address Repeated"):
+ rstatus = \
+ bool(self.getControlProperty(
+ "chkUseAddressReceiver",
+ PropertyNames.PROPERTY_ENABLED)) \
+ and (self.chkUseAddressReceiver.State != 0)
+ self.myLetterDoc.switchElement(
+ "Sender Address Repeated", rstatus)
+
+ except IllegalArgumentException, e:
+ traceback.print_exc()
+
+ def chkUseSignsItemChanged(self):
+ if self.myLetterDoc.hasElement("Letter Signs"):
+ self.myLetterDoc.switchElement(
+ "Letter Signs", self.chkUseSigns.State != 0)
+
+ def chkUseSubjectItemChanged(self):
+ if self.myLetterDoc.hasElement("Subject Line"):
+ self.myLetterDoc.switchElement(
+ "Subject Line", self.chkUseSubject.State != 0)
+
+ def chkUseBendMarksItemChanged(self):
+ if self.myLetterDoc.hasElement("Bend Marks"):
+ self.myLetterDoc.switchElement(
+ "Bend Marks", self.chkUseBendMarks.State != 0)
+
+ def chkUseFooterItemChanged(self):
+ try:
+ bFooterPossible = (self.chkUseFooter.State != 0) \
+ and bool(self.getControlProperty(
+ "chkUseFooter", PropertyNames.PROPERTY_ENABLED))
+ if self.chkFooterNextPages.State != 0:
+ self.myLetterDoc.switchFooter(
+ "First Page", False, self.chkFooterPageNumbers.State != 0,
+ txtFooter.Text)
+ self.myLetterDoc.switchFooter("Standard", bFooterPossible,
+ self.chkFooterPageNumbers.State != 0, self.txtFooter.Text)
+ else:
+ self.myLetterDoc.switchFooter(
+ "First Page", bFooterPossible,
+ self.chkFooterPageNumbers.State != 0, self.txtFooter.Text)
+ self.myLetterDoc.switchFooter(
+ "Standard", bFooterPossible,
+ self.chkFooterPageNumbers.State != 0, self.txtFooter.Text)
+
+ BPaperItem = \
+ self.getRoadmapItemByID(LetterWizardDialogImpl.RM_FOOTER)
+ Helper.setUnoPropertyValue(
+ BPaperItem, PropertyNames.PROPERTY_ENABLED, bFooterPossible)
+ except Exception, exception:
+ traceback.print_exc()
+
+ def chkFooterNextPagesItemChanged(self):
+ self.chkUseFooterItemChanged()
+
+ def chkFooterPageNumbersItemChanged(self):
+ self.chkUseFooterItemChanged()
+
+ def setPossibleFooter(self, bState):
+ self.setControlProperty(
+ "chkUseFooter", PropertyNames.PROPERTY_ENABLED, bState)
+ self.chkUseFooterItemChanged()
+
+ def setPossibleAddressReceiver(self, bState):
+ if self.myLetterDoc.hasElement("Sender Address Repeated"):
+ self.setControlProperty(
+ "chkUseAddressReceiver", PropertyNames.PROPERTY_ENABLED, bState)
+ self.chkUseAddressReceiverItemChanged()
+
+ def setPossibleLogo(self, bState):
+ if self.myLetterDoc.hasElement("Company Logo"):
+ self.setControlProperty(
+ "chkUseLogo", PropertyNames.PROPERTY_ENABLED, bState)
+ self.chkUseLogoItemChanged()
+
+ def txtFooterTextChanged(self):
+ self.chkUseFooterItemChanged()
+
+ def txtSenderNameTextChanged(self):
+ myFieldHandler = TextFieldHandler(
+ self.myLetterDoc.xMSF, TextDocument.xTextDocument)
+ myFieldHandler.changeUserFieldContent(
+ "Company", self.txtSenderName.Text)
+
+ def txtSenderStreetTextChanged(self):
+ myFieldHandler = TextFieldHandler(
+ self.myLetterDoc.xMSF, TextDocument.xTextDocument)
+ myFieldHandler.changeUserFieldContent(
+ "Street", self.txtSenderStreet.Text)
+
+ def txtSenderCityTextChanged(self):
+ myFieldHandler = TextFieldHandler(
+ self.myLetterDoc.xMSF, TextDocument.xTextDocument)
+ myFieldHandler.changeUserFieldContent(
+ "City", self.txtSenderCity.Text)
+
+ def txtSenderPostCodeTextChanged(self):
+ myFieldHandler = TextFieldHandler(
+ self.myLetterDoc.xMSF, TextDocument.xTextDocument)
+ myFieldHandler.changeUserFieldContent(
+ "PostCode", self.txtSenderPostCode.Text)
+
+ def txtSenderStateTextChanged(self):
+ myFieldHandler = TextFieldHandler(
+ self.myLetterDoc.xMSF, TextDocument.xTextDocument)
+ myFieldHandler.changeUserFieldContent(
+ PropertyNames.PROPERTY_STATE, self.txtSenderState.Text)
+
+ def txtTemplateNameTextChanged(self):
+ xDocProps = TextDocument.xTextDocument.DocumentProperties
+ TitleName = self.txtTemplateName.Text
+ xDocProps.Title = TitleName
+
+ def chkUseSalutationItemChanged(self):
+ self.myLetterDoc.switchUserField(
+ "Salutation", self.lstSalutation.Text,
+ self.chkUseSalutation.State != 0)
+ self.setControlProperty(
+ "lstSalutation", PropertyNames.PROPERTY_ENABLED,
+ self.chkUseSalutation.State != 0)
+
+ def lstSalutationItemChanged(self):
+ self.myLetterDoc.switchUserField(
+ "Salutation", self.lstSalutation.Text,
+ self.chkUseSalutation.State != 0)
+
+ def chkUseGreetingItemChanged(self):
+ self.myLetterDoc.switchUserField(
+ "Greeting", self.lstGreeting.Text, self.chkUseGreeting.State != 0)
+ self.setControlProperty(
+ "lstGreeting", PropertyNames.PROPERTY_ENABLED,
+ self.chkUseGreeting.State != 0)
+
+ def setDefaultForGreetingAndSalutation(self):
+ if self.lstSalutation.Text == "":
+ self.lstSalutation.Text = self.resources.SalutationLabels[0]
+
+ if self.lstGreeting.Text == "":
+ self.lstGreeting.Text = self.resources.GreetingLabels[0]
+
+ def lstGreetingItemChanged(self):
+ self.myLetterDoc.switchUserField(
+ "Greeting", self.lstGreeting.Text, self.chkUseGreeting.State != 0)
+
+ def chkBusinessPaperItemChanged(self):
+ if self.chkBusinessPaper.State != 0:
+ self.enableBusinessPaper()
+ else:
+ self.disableBusinessPaper()
+ self.setPossibleSenderData(True)
+
+ def getOfficeLinguistic(self):
+ oL = 0
+ found = False
+ OfficeLinguistic = Configuration.getOfficeLinguistic(self.xMSF)
+ i = 0
+ for index, workwith in enumerate(self.Norms):
+ if workwith.lower() == OfficeLinguistic.lower():
+ oL = index
+ found = True
+ break
+
+ if not found:
+ for index, workwith in enumerate(self.Norms):
+ if workwith.lower() == "en-US".lower():
+ oL = index
+ found = True
+ break
+ return oL
+
+ def setPossibleSenderData(self, bState):
+ self.setControlProperty(
+ "optSenderDefine", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "optSenderPlaceholder", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "lblSenderAddress", PropertyNames.PROPERTY_ENABLED, bState)
+ if not bState:
+ self.setControlProperty(
+ "txtSenderCity", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "txtSenderName", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "txtSenderPostCode", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "txtSenderStreet", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "txtSenderCity", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "txtSenderState", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "lblSenderName", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "lblSenderStreet", PropertyNames.PROPERTY_ENABLED, bState)
+ self.setControlProperty(
+ "lblPostCodeCity", PropertyNames.PROPERTY_ENABLED, bState)
+
+ def enableSenderReceiver(self):
+ BPaperItem = self.getRoadmapItemByID(
+ LetterWizardDialogImpl.RM_SENDERRECEIVER)
+ Helper.setUnoPropertyValue(
+ BPaperItem, PropertyNames.PROPERTY_ENABLED, True)
+
+ def disableSenderReceiver(self):
+ BPaperItem = self.getRoadmapItemByID(
+ LetterWizardDialogImpl.RM_SENDERRECEIVER)
+ Helper.setUnoPropertyValue(
+ BPaperItem, PropertyNames.PROPERTY_ENABLED, False)
+
+ def enableBusinessPaper(self):
+ try:
+ BPaperItem = self.getRoadmapItemByID(
+ LetterWizardDialogImpl.RM_BUSINESSPAPER)
+ Helper.setUnoPropertyValue(
+ BPaperItem, PropertyNames.PROPERTY_ENABLED, True)
+ self.chkPaperCompanyLogoItemChanged()
+ self.chkPaperCompanyAddressItemChanged()
+ self.chkPaperFooterItemChanged()
+ self.chkCompanyReceiverItemChanged()
+ except Exception:
+ traceback.print_exc()
+
+ def disableBusinessPaper(self):
+ try:
+ BPaperItem = self.getRoadmapItemByID(
+ LetterWizardDialogImpl.RM_BUSINESSPAPER)
+ Helper.setUnoPropertyValue(
+ BPaperItem, PropertyNames.PROPERTY_ENABLED, False)
+ if self.BusCompanyLogo != None:
+ self.BusCompanyLogo.removeFrame()
+
+ if self.BusCompanyAddress != None:
+ self.BusCompanyAddress.removeFrame()
+
+ if self.BusFooter != None:
+ self.BusFooter.removeFrame()
+
+ if self.BusCompanyAddressReceiver != None:
+ self.BusCompanyAddressReceiver.removeFrame()
+
+ self.setPossibleAddressReceiver(True)
+ self.setPossibleFooter(True)
+ self.setPossibleLogo(True)
+ if self.myLetterDoc.hasElement("Sender Address"):
+ self.myLetterDoc.switchElement(
+ "Sender Address", True)
+ except Exception:
+ traceback.print_exc()
+
+ def lstLetterNormItemChanged(self):
+ sCurrentNorm = self.Norms[getCurrentLetter().cp_Norm]
+ initializeTemplates(xMSF)
+ if self.optBusinessLetter.State:
+ self.lstBusinessStyleItemChanged()
+
+ elif optPrivOfficialLetter.State:
+ self.lstPrivOfficialStyleItemChanged()
+
+ elif optPrivateLetter.State:
+ self.lstPrivateStyleItemChanged()
+
+ def initializeSalutation(self):
+ self.setControlProperty(
+ "lstSalutation", "StringItemList",
+ self.resources.SalutationLabels)
+
+ def initializeGreeting(self):
+ self.setControlProperty(
+ "lstGreeting", "StringItemList", self.resources.GreetingLabels)
+
+ def initializeNorms(self):
+ lc = LocaleCodes(self.xmsf)
+ allLocales = lc.getIDs()
+ nameList = []
+ sLetterSubPath = "/wizard/letter/"
+ try:
+ self.sTemplatePath = \
+ FileAccess.deleteLastSlashfromUrl(self.sTemplatePath)
+ nuString = \
+ self.sTemplatePath[:self.sTemplatePath.rfind("/")] + "/"
+ sMainPath = FileAccess.deleteLastSlashfromUrl(nuString)
+ self.sLetterPath = sMainPath + sLetterSubPath
+ xInterface = \
+ self.xmsf.createInstance("com.sun.star.ucb.SimpleFileAccess")
+ nameList = xInterface.getFolderContents(self.sLetterPath, True)
+ except Exception, e:
+ traceback.print_exc()
+
+ found = False
+ cIsoCode = ""
+ MSID = ""
+ LanguageLabels = []
+
+ for i in nameList:
+ found = False
+ cIsoCode = FileAccess.getFilename(i)
+ for j in allLocales:
+ aLang = j.split(";")
+ if cIsoCode.lower() == aLang[1].lower():
+ MSID = aLang[2]
+ found = True
+ break
+
+ if not found:
+ for j in allLocales:
+ aLang = j.split(";")
+ if cIsoCode.lower() == aLang[1][:2]:
+ MSID = aLang[2]
+ found = True
+ break
+
+ if found:
+ self.Norms.append(cIsoCode)
+ self.NormPaths.append(i)
+ #LanguageLabels.append(lc.getLanguageString(MSID))
+
+ self.setControlProperty(
+ "lstLetterNorm", "StringItemList", tuple(LanguageLabels))
+
+ def getCurrentLetter(self):
+ if self.myConfig.cp_LetterType == 0:
+ return self.myConfig.cp_BusinessLetter
+ elif self.myConfig.cp_LetterType == 1:
+ return self.myConfig.cp_PrivateOfficialLetter
+ elif self.myConfig.cp_LetterType == 2:
+ return self.myConfig.cp_PrivateLetter
+ else:
+ return None
+
+ def __initializePaths(self):
+ try:
+ self.sTemplatePath = \
+ FileAccess.getOfficePath2(
+ self.xMSF, "Template", "share", "/wizard")
+ self.sUserTemplatePath = \
+ FileAccess.getOfficePath2(self.xMSF, "Template", "user", "")
+ self.sBitmapPath = \
+ FileAccess.combinePaths(
+ self.xMSF, self.sTemplatePath, "/../wizard/bitmap")
+ except NoValidPathException, e:
+ traceback.print_exc()
+
+ def initializeTemplates(self, xMSF):
+ self.sCurrentNorm = self.Norms[self.getCurrentLetter().cp_Norm]
+ sLetterPath = self.NormPaths[self.getCurrentLetter().cp_Norm]
+ self.BusinessFiles = \
+ FileAccess.getFolderTitles(xMSF, "bus", sLetterPath)
+ self.OfficialFiles = \
+ FileAccess.getFolderTitles(xMSF, "off", sLetterPath)
+ self.PrivateFiles = \
+ FileAccess.getFolderTitles(xMSF, "pri", sLetterPath)
+ self.setControlProperty(
+ "lstBusinessStyle", "StringItemList",
+ tuple(self.BusinessFiles[0]))
+ self.setControlProperty(
+ "lstPrivOfficialStyle", "StringItemList",
+ tuple(self.OfficialFiles[0]))
+ self.setControlProperty(
+ "lstPrivateStyle", "StringItemList",
+ tuple(self.PrivateFiles[0]))
+ self.setControlProperty(
+ "lstBusinessStyle", "SelectedItems", (0,))
+ self.setControlProperty(
+ "lstPrivOfficialStyle", "SelectedItems", (0,))
+ self.setControlProperty(
+ "lstPrivateStyle", "SelectedItems", (0,))
+ return True
+
+ def initializeElements(self):
+ self.setControlProperty(
+ "chkUseLogo", PropertyNames.PROPERTY_ENABLED,
+ self.myLetterDoc.hasElement("Company Logo"))
+ self.setControlProperty(
+ "chkUseBendMarks", PropertyNames.PROPERTY_ENABLED,
+ self.myLetterDoc.hasElement("Bend Marks"))
+ self.setControlProperty(
+ "chkUseAddressReceiver", PropertyNames.PROPERTY_ENABLED,
+ self.myLetterDoc.hasElement("Sender Address Repeated"))
+ self.setControlProperty(
+ "chkUseSubject", PropertyNames.PROPERTY_ENABLED,
+ self.myLetterDoc.hasElement("Subject Line"))
+ self.setControlProperty(
+ "chkUseSigns", PropertyNames.PROPERTY_ENABLED,
+ self.myLetterDoc.hasElement("Letter Signs"))
+ self.myLetterDoc.updateDateFields()
+
+ def setConfiguration(self):
+ if self.optBusinessLetter.State:
+ self.optBusinessLetterItemChanged()
+
+ elif self.optPrivOfficialLetter.State:
+ self.optPrivOfficialLetterItemChanged()
+
+ elif self.optPrivateLetter.State:
+ self.optPrivateLetterItemChanged()
+
+ def setElements(self, privLetter):
+ if self.optSenderDefine.State:
+ self.optSenderDefineItemChanged()
+
+ if self.optSenderPlaceholder.State:
+ self.optSenderPlaceholderItemChanged()
+
+ self.chkUseSignsItemChanged()
+ self.chkUseSubjectItemChanged()
+ self.chkUseSalutationItemChanged()
+ self.chkUseGreetingItemChanged()
+ self.chkUseBendMarksItemChanged()
+ self.chkUseAddressReceiverItemChanged()
+ self.txtTemplateNameTextChanged()
+ if self.optReceiverDatabase.State and not privLetter:
+ self.optReceiverDatabaseItemChanged()
+
+ if self.optReceiverPlaceholder.State and not privLetter:
+ self.optReceiverPlaceholderItemChanged()
+
+ if self.optCreateLetter.State:
+ self.optCreateFromTemplateItemChanged()
+
+ if self.optMakeChanges.State:
+ self.optMakeChangesItemChanged()
+
+ def insertRoadmap(self):
+ self.addRoadmap()
+
+ self.insertRoadMapItems(
+ [True, False, True, True, False, True],
+ self.resources.RoadmapLabels)
+
+ self.setRoadmapInteractive(True)
+ self.setRoadmapComplete(True)
+ self.setCurrentRoadmapItemID(1)
+
+ def insertPathSelectionControl(self):
+ self.myPathSelection = \
+ PathSelection(self.xMSF, self, PathSelection.TransferMode.SAVE,
+ PathSelection.DialogTypes.FILE)
+ self.myPathSelection.insert(
+ 6, 97, 70, 205, 45, self.resources.reslblTemplatePath_value,
+ True, HelpIds.getHelpIdString(HID + 47),
+ HelpIds.getHelpIdString(HID + 48))
+ self.myPathSelection.sDefaultDirectory = self.sUserTemplatePath
+ self.myPathSelection.sDefaultName = "myLetterTemplate.ott"
+ self.myPathSelection.sDefaultFilter = "writer8_template"
+ self.myPathSelection.addSelectionListener(
+ self.myPathSelectionListener())
+
+ def initConfiguration(self):
+ try:
+ root = Configuration.getConfigurationRoot(
+ self.xMSF, "/org.openoffice.Office.Writer/Wizards/Letter",
+ False)
+ self.myConfig.readConfiguration(root, "cp_")
+ RadioDataAware.attachRadioButtons(self.myConfig, "cp_LetterType",
+ (self.optBusinessLetter, self.optPrivOfficialLetter,
+ self.optPrivateLetter), True).updateUI()
+ UnoDataAware.attachListBox(
+ self.myConfig.cp_BusinessLetter, "cp_Style",
+ self.lstBusinessStyle, True).updateUI()
+ UnoDataAware.attachListBox(
+ self.myConfig.cp_PrivateOfficialLetter, "cp_Style",
+ self.lstPrivOfficialStyle, True).updateUI()
+ UnoDataAware.attachListBox(
+ self.myConfig.cp_PrivateLetter, "cp_Style",
+ self.lstPrivateStyle, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ self.myConfig.cp_BusinessLetter, "cp_BusinessPaper",
+ self.chkBusinessPaper, True).updateUI()
+ cgl = self.myConfig.cp_BusinessLetter
+ cgpl = self.myConfig.cp_BusinessLetter.cp_CompanyLogo
+ cgpa = self.myConfig.cp_BusinessLetter.cp_CompanyAddress
+ UnoDataAware.attachCheckBox(
+ cgpl, "cp_Display", self.chkPaperCompanyLogo, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgpl, "cp_Width", self.numLogoWidth, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgpl, "cp_Height", self.numLogoHeight, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgpl, "cp_X", self.numLogoX, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgpl, "cp_Y", self.numLogoY, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgpa, "cp_Display", self.chkPaperCompanyAddress, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgpa, "cp_Width", self.numAddressWidth, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgpa, "cp_Height", self.numAddressHeight, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgpa, "cp_X", self.numAddressX, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgpa, "cp_Y", self.numAddressY, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PaperCompanyAddressReceiverField",
+ self.chkCompanyReceiver, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PaperFooter", self.chkPaperFooter, True).updateUI()
+ UnoDataAware.attachNumericControl(
+ cgl, "cp_PaperFooterHeight", self.numFooterHeight, True).updateUI()
+ UnoDataAware.attachListBox(
+ cgl, "cp_Norm", self.lstLetterNorm, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PrintCompanyLogo", self.chkUseLogo, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PrintCompanyAddressReceiverField",
+ self.chkUseAddressReceiver, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PrintLetterSigns", self.chkUseSigns, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PrintSubjectLine", self.chkUseSubject, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PrintSalutation", self.chkUseSalutation, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PrintBendMarks", self.chkUseBendMarks, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PrintGreeting", self.chkUseGreeting, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_PrintFooter", self.chkUseFooter, True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_Salutation", self.lstSalutation, True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_Greeting", self.lstGreeting, True).updateUI()
+ RadioDataAware.attachRadioButtons(
+ cgl, "cp_SenderAddressType",
+ (self.optSenderDefine, self.optSenderPlaceholder), True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_SenderCompanyName", self.txtSenderName, True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_SenderStreet", self.txtSenderStreet, True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_SenderPostCode", self.txtSenderPostCode, True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_SenderState", self.txtSenderState, True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_SenderCity", self.txtSenderCity, True).updateUI()
+ RadioDataAware.attachRadioButtons(
+ cgl, "cp_ReceiverAddressType",
+ (self.optReceiverDatabase, self.optReceiverPlaceholder),
+ True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_Footer", self.txtFooter, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_FooterOnlySecondPage",
+ self.chkFooterNextPages, True).updateUI()
+ UnoDataAware.attachCheckBox(
+ cgl, "cp_FooterPageNumbers",
+ self.chkFooterPageNumbers, True).updateUI()
+ RadioDataAware.attachRadioButtons(
+ cgl, "cp_CreationType",
+ (self.optCreateLetter, self.optMakeChanges), True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_TemplateName", self.txtTemplateName, True).updateUI()
+ UnoDataAware.attachEditControl(
+ cgl, "cp_TemplatePath", self.myPathSelection.xSaveTextBox,
+ True).updateUI()
+ except Exception, exception:
+ traceback.print_exc()
+
+ def saveConfiguration(self):
+ try:
+ root = Configuration.getConfigurationRoot(self.xMSF, "/org.openoffice.Office.Writer/Wizards/Letter", True)
+ self.myConfig.writeConfiguration(root, "cp_")
+ root.commitChanges()
+ except Exception, e:
+ traceback.print_exc()
diff --git a/wizards/com/sun/star/wizards/letter/LetterWizardDialogResources.py b/wizards/com/sun/star/wizards/letter/LetterWizardDialogResources.py
new file mode 100644
index 000000000000..f6f41603b8b7
--- /dev/null
+++ b/wizards/com/sun/star/wizards/letter/LetterWizardDialogResources.py
@@ -0,0 +1,219 @@
+from wizards.common.Resource import Resource
+
+class LetterWizardDialogResources(Resource):
+
+ MODULE_NAME = "dbw"
+ RID_LETTERWIZARDDIALOG_START = 3000
+ RID_LETTERWIZARDGREETING_START = 3080
+ RID_LETTERWIZARDSALUTATION_START = 3090
+ RID_LETTERWIZARDROADMAP_START = 3100
+ RID_LETTERWIZARDLANGUAGE_START = 3110
+ RID_RID_COMMON_START = 500
+
+ def __init__(self, xmsf):
+ super(LetterWizardDialogResources,self).__init__(
+ xmsf, LetterWizardDialogResources.MODULE_NAME)
+
+ self.RoadmapLabels = ()
+ self.SalutationLabels = ()
+ self.GreetingLabels = ()
+ self.LanguageLabels = ()
+ self.resLetterWizardDialog_title = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 1)
+ self.resLabel9_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 2)
+ self.resoptBusinessLetter_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 3)
+ self.resoptPrivOfficialLetter_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 4)
+ self.resoptPrivateLetter_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 5)
+ self.reschkBusinessPaper_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 6)
+ self.reschkPaperCompanyLogo_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 7)
+ self.reschkPaperCompanyAddress_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 8)
+ self.reschkPaperFooter_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 9)
+ self.reschkCompanyReceiver_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 10)
+ self.reschkUseLogo_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 11)
+ self.reschkUseAddressReceiver_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 12)
+ self.reschkUseSigns_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 13)
+ self.reschkUseSubject_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 14)
+ self.reschkUseSalutation_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 15)
+ self.reschkUseBendMarks_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 16)
+ self.reschkUseGreeting_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 17)
+ self.reschkUseFooter_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 18)
+ self.resoptSenderPlaceholder_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 19)
+ self.resoptSenderDefine_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 20)
+ self.resoptReceiverPlaceholder_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 21)
+ self.resoptReceiverDatabase_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 22)
+ self.reschkFooterNextPages_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 23)
+ self.reschkFooterPageNumbers_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 24)
+ self.restxtTemplateName_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 25)
+ self.resoptCreateLetter_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 26)
+ self.resoptMakeChanges_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 27)
+ self.reslblBusinessStyle_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 28)
+ self.reslblPrivOfficialStyle_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 29)
+ self.reslblPrivateStyle_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 30)
+ self.reslblIntroduction_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 31)
+ self.reslblLogoHeight_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 32)
+ self.reslblLogoWidth_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 33)
+ self.reslblLogoX_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 34)
+ self.reslblLogoY_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 35)
+ self.reslblAddressHeight_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 36)
+ self.reslblAddressWidth_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 37)
+ self.reslblAddressX_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 38)
+ self.reslblAddressY_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 39)
+ self.reslblFooterHeight_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 40)
+ self.reslblLetterNorm_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 41)
+ self.reslblSenderAddress_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 42)
+ self.reslblSenderName_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 43)
+ self.reslblSenderStreet_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 44)
+ self.reslblPostCodeCity_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 45)
+ self.reslblReceiverAddress_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 46)
+ self.reslblFooter_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 47)
+ self.reslblFinalExplanation1_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 48)
+ self.reslblFinalExplanation2_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 49)
+ self.reslblTemplateName_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 50)
+ self.reslblTemplatePath_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 51)
+ self.reslblProceed_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 52)
+ self.reslblTitle1_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 53)
+ self.reslblTitle3_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 54)
+ self.reslblTitle2_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 55)
+ self.reslblTitle4_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 56)
+ self.reslblTitle5_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 57)
+ self.reslblTitle6_value = \
+ self.getResText(
+ LetterWizardDialogResources.RID_LETTERWIZARDDIALOG_START + 58)
+ self.loadRoadmapResources()
+ self.loadSalutationResources()
+ self.loadGreetingResources()
+ self.loadCommonResources()
+
+ def loadCommonResources(self):
+ self.resOverwriteWarning = \
+ self.getResText(
+ LetterWizardDialogResources.RID_RID_COMMON_START + 19)
+ self.resTemplateDescription = \
+ self.getResText(
+ LetterWizardDialogResources.RID_RID_COMMON_START + 20)
+
+ def loadRoadmapResources(self):
+ i = 1
+ for i in xrange(6):
+ self.RoadmapLabels = self.RoadmapLabels + (self.getResText(LetterWizardDialogResources.RID_LETTERWIZARDROADMAP_START + i + 1),)
+
+ def loadSalutationResources(self):
+ for i in xrange(3):
+ self.SalutationLabels = self.SalutationLabels + (self.getResText(LetterWizardDialogResources.RID_LETTERWIZARDSALUTATION_START + i + 1),)
+
+ def loadGreetingResources(self):
+ for i in xrange(3):
+ self.GreetingLabels = self.GreetingLabels + (self.getResText(LetterWizardDialogResources.RID_LETTERWIZARDGREETING_START + i + 1),)
diff --git a/wizards/com/sun/star/wizards/letter/LocaleCodes.py b/wizards/com/sun/star/wizards/letter/LocaleCodes.py
new file mode 100644
index 000000000000..5ca85d06559f
--- /dev/null
+++ b/wizards/com/sun/star/wizards/letter/LocaleCodes.py
@@ -0,0 +1,154 @@
+from wizards.common.Resource import Resource
+
+class LocaleCodes(Resource):
+ UNIT_NAME = "svtres",
+ MODULE_NAME = "svt",
+
+ def __init__(self, xmsf):
+ super(LocaleCodes, self).__init__(xmsf, LocaleCodes.MODULE_NAME)
+ #self.allLanguageStrings = self.getStringList(16633)
+
+ def getLanguageString(self, MSID):
+ LS = "unknown Language",
+ for i in self.allLanguageStrings:
+ if str(i.Value).lower() == MSID.lower():
+ LS = i.Name
+ return LS
+
+ def getIDs(self):
+ Ids = ("Afrikaans;af;1078",
+ "Albanian;sq;1052",
+ "Arabic - United Arab Emirates;ar-ae;14337",
+ "Arabic - Bahrain;ar-bh;15361",
+ "Arabic - Algeria;ar-dz;5121",
+ "Arabic - Egypt;ar-eg;3073",
+ "Arabic - Iraq;ar-iq;2049",
+ "Arabic - Jordan;ar-jo;11265",
+ "Arabic - Kuwait;ar-kw;13313",
+ "Arabic - Lebanon;ar-lb;12289",
+ "Arabic - Libya;ar-ly;4097",
+ "Arabic - Morocco;ar-ma;6145",
+ "Arabic - Oman;ar-om;8193",
+ "Arabic - Qatar;ar-qa;16385",
+ "Arabic - Saudi Arabia;ar-sa;1025",
+ "Arabic - Syria;ar-sy;10241",
+ "Arabic - Tunisia;ar-tn;7169",
+ "Arabic - Yemen;ar-ye;9217",
+ "Armenian;hy;1067",
+ "Azeri - Latin;az-az;1068",
+ "Azeri - Cyrillic;az-az;2092",
+ "Basque;eu;1069",
+ "Belarusian;be;1059",
+ "Bulgarian;bg;1026",
+ "Catalan;ca;1027",
+ "Chinese - China;zh-cn;2052",
+ "Chinese - Hong Kong SAR;zh-hk;3076",
+ "Chinese - Macau SAR;zh-mo;5124",
+ "Chinese - Singapore;zh-sg;4100",
+ "Chinese - Taiwan;zh-tw;1028",
+ "Croatian;hr;1050",
+ "Czech;cs;1029",
+ "Danish;da;1030",
+ "Dutch - The Netherlands;nl-nl;1043",
+ "Dutch - Belgium;nl-be;2067",
+ "English - Australia;en-au;3081",
+ "English - Belize;en-bz;10249",
+ "English - Canada;en-ca;4105",
+ "English - Caribbean;en-cb;9225",
+ "English - Ireland;en-ie;6153",
+ "English - Jamaica;en-jm;8201",
+ "English - New Zealand;en-nz;5129",
+ "English - Phillippines;en-ph;13321",
+ "English - South Africa;en-za;7177",
+ "English - Trinidad;en-tt;11273",
+ "English - United Kingdom;en-gb;2057",
+ "English - United States;en-us;1033",
+ "Estonian;et;1061",
+ "Farsi;fa;1065",
+ "Finnish;fi;1035",
+ "Faroese;fo;1080",
+ "French - France;fr-fr;1036",
+ "French - Belgium;fr-be;2060",
+ "French - Canada;fr-ca;3084",
+ "French - Luxembourg;fr-lu;5132",
+ "French - Switzerland;fr-ch;4108",
+ "Gaelic - Ireland;gd-ie;2108",
+ "Gaelic - Scotland;gd;1084",
+ "German - Germany;de-de;1031",
+ "German - Austria;de-at;3079",
+ "German - Liechtenstein;de-li;5127",
+ "German - Luxembourg;de-lu;4103",
+ "German - Switzerland;de-ch;2055",
+ "Greek;el;1032",
+ "Hebrew;he;1037",
+ "Hindi;hi;1081",
+ "Hungarian;hu;1038",
+ "Icelandic;is;1039",
+ "Indonesian;id;1057",
+ "Italian - Italy;it-it;1040",
+ "Italian - Switzerland;it-ch;2064",
+ "Japanese;ja;1041",
+ "Korean;ko;1042",
+ "Latvian;lv;1062",
+ "Lithuanian;lt;1063",
+ "FYRO Macedonian;mk;1071",
+ "Malay - Malaysia;ms-my;1086",
+ "Malay - Brunei;ms-bn;2110",
+ "Maltese;mt;1082",
+ "Marathi;mr;1102",
+ "Norwegian - Bokm?l;no-no;1044",
+ "Norwegian - Nynorsk;no-no;2068",
+ "Polish;pl;1045",
+ "Portuguese - Portugal;pt-pt;2070",
+ "Portuguese - Brazil;pt-br;1046",
+ "Raeto-Romance;rm;1047",
+ "Romanian - Romania;ro;1048",
+ "Romanian - Moldova;ro-mo;2072",
+ "Russian;ru;1049",
+ "Russian - Moldova;ru-mo;2073",
+ "Sanskrit;sa;1103",
+ "Serbian - Cyrillic;sr-sp;3098",
+ "Serbian - Latin;sr-sp;2074",
+ "Setsuana;tn;1074",
+ "Slovenian;sl;1060",
+ "Slovak;sk;1051",
+ "Sorbian;sb;1070",
+ "Spanish - Spain;es-es;3082",
+ "Spanish - Argentina;es-ar;11274",
+ "Spanish - Bolivia;es-bo;16394",
+ "Spanish - Chile;es-cl;13322",
+ "Spanish - Colombia;es-co;9226",
+ "Spanish - Costa Rica;es-cr;5130",
+ "Spanish - Dominican Republic;es-do;7178",
+ "Spanish - Ecuador;es-ec;12298",
+ "Spanish - Guatemala;es-gt;4106",
+ "Spanish - Honduras;es-hn;18442",
+ "Spanish - Mexico;es-mx;2058",
+ "Spanish - Nicaragua;es-ni;19466",
+ "Spanish - Panama;es-pa;6154",
+ "Spanish - Peru;es-pe;10250",
+ "Spanish - Puerto Rico;es-pr;20490",
+ "Spanish - Paraguay;es-py;15370",
+ "Spanish - El Salvador;es-sv;17418",
+ "Spanish - Uruguay;es-uy;14346",
+ "Spanish - Venezuela;es-ve;8202",
+ "Sutu;sx;1072",
+ "Swahili;sw;1089",
+ "Swedish - Sweden;sv-se;1053",
+ "Swedish - Finland;sv-fi;2077",
+ "Tamil;ta;1097",
+ "Tatar;tt;1092",
+ "Thai;th;1054",
+ "Turkish;tr;1055",
+ "Tsonga;ts;1073",
+ "Ukrainian;uk;1058",
+ "Urdu;ur;1056",
+ "Uzbek - Cyrillic;uz-uz;2115",
+ "Uzbek - Latin;uz-uz;1091",
+ "Vietnamese;vi;1066",
+ "Xhosa;xh;1076",
+ "Yiddish;yi;1085",
+ "Zulu;zu;1077",
+ "Khmer;km-kh;1107",
+ "Burmese;my-mm;1109")
+ return Ids
diff --git a/wizards/com/sun/star/wizards/text/TextDocument.py b/wizards/com/sun/star/wizards/text/TextDocument.py
new file mode 100644
index 000000000000..c661d064c431
--- /dev/null
+++ b/wizards/com/sun/star/wizards/text/TextDocument.py
@@ -0,0 +1,262 @@
+import uno
+import traceback
+import time
+from datetime import date as dateTimeObject
+from wizards.common.Desktop import Desktop
+from wizards.common.Helper import Helper
+from wizards.document.OfficeDocument import OfficeDocument
+from wizards.text.ViewHandler import ViewHandler
+from wizards.text.TextFieldHandler import TextFieldHandler
+from wizards.common.Configuration import Configuration
+
+from com.sun.star.container import NoSuchElementException
+from com.sun.star.lang import WrappedTargetException
+from com.sun.star.i18n.NumberFormatIndex import DATE_SYS_DDMMYY
+from com.sun.star.view.DocumentZoomType import ENTIRE_PAGE
+from com.sun.star.beans.PropertyState import DIRECT_VALUE
+
+class TextDocument(object):
+
+ xTextDocument = None
+
+ def __init__(self, xMSF,listener=None,bShowStatusIndicator=None,
+ FrameName=None,_sPreviewURL=None,_moduleIdentifier=None,
+ _textDocument=None, xArgs=None):
+
+ self.xMSF = xMSF
+
+ if listener is not None:
+ if FrameName is not None:
+ '''creates an instance of TextDocument
+ and creates a named frame.
+ No document is actually loaded into this frame.'''
+ self.xFrame = OfficeDocument.createNewFrame(
+ xMSF, listener, FrameName)
+ return
+
+ elif _sPreviewURL is not None:
+ '''creates an instance of TextDocument by
+ loading a given URL as preview'''
+ self.xFrame = OfficeDocument.createNewFrame(xMSF, listener)
+ TextDocument.xTextDocument = self.loadAsPreview(_sPreviewURL, True)
+
+ elif xArgs is not None:
+ '''creates an instance of TextDocument
+ and creates a frame and loads a document'''
+ self.xDesktop = Desktop.getDesktop(xMSF);
+ self.xFrame = OfficeDocument.createNewFrame(xMSF, listener)
+ TextDocument.xTextDocument = OfficeDocument.load(
+ xFrame, URL, "_self", xArgs);
+ self.xWindowPeer = xFrame.getComponentWindow()
+ self.m_xDocProps = TextDocument.xTextDocument.DocumentProperties
+ CharLocale = Helper.getUnoStructValue(
+ TextDocument.xTextDocument, "CharLocale");
+ return
+
+ else:
+ '''creates an instance of TextDocument from
+ the desktop's current frame'''
+ self.xDesktop = Desktop.getDesktop(xMSF);
+ self.xFrame = self.xDesktop.getActiveFrame()
+ TextDocument.xTextDocument = self.xFrame.getController().Model
+
+ elif _moduleIdentifier is not None:
+ try:
+ '''create the empty document, and set its module identifier'''
+ TextDocument.xTextDocument = xMSF.createInstance(
+ "com.sun.star.text.TextDocument")
+ TextDocument.xTextDocument.initNew()
+ TextDocument.xTextDocument.setIdentifier(
+ _moduleIdentifier.Identifier)
+ # load the document into a blank frame
+ xDesktop = Desktop.getDesktop(xMSF)
+ loadArgs = range(1)
+ loadArgs[0] = "Model"
+ loadArgs[0] = -1
+ loadArgs[0] = TextDocument.xTextDocument
+ loadArgs[0] = DIRECT_VALUE
+ xDesktop.loadComponentFromURL(
+ "private:object", "_blank", 0, loadArgs)
+ # remember some things for later usage
+ self.xFrame = TextDocument.xTextDocument.CurrentController.Frame
+ except Exception, e:
+ traceback.print_exc()
+
+ elif _textDocument is not None:
+ '''creates an instance of TextDocument
+ from a given XTextDocument'''
+ self.xFrame = _textDocument.CurrentController.Frame
+ TextDocument.xTextDocument = _textDocument
+ if bShowStatusIndicator:
+ self.showStatusIndicator()
+ self.init()
+
+ def init(self):
+ self.xWindowPeer = self.xFrame.getComponentWindow()
+ self.m_xDocProps = TextDocument.xTextDocument.DocumentProperties
+ self.CharLocale = Helper.getUnoStructValue(
+ TextDocument.xTextDocument, "CharLocale")
+ self.xText = TextDocument.xTextDocument.Text
+
+ def showStatusIndicator(self):
+ self.xProgressBar = self.xFrame.createStatusIndicator()
+ self.xProgressBar.start("", 100)
+ self.xProgressBar.setValue(5)
+
+ def loadAsPreview(self, sDefaultTemplate, asTemplate):
+ loadValues = range(3)
+ # open document in the Preview mode
+ loadValues[0] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[0].Name = "ReadOnly"
+ loadValues[0].Value = True
+ loadValues[1] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[1].Name = "AsTemplate"
+ if asTemplate:
+ loadValues[1].Value = True
+ else:
+ loadValues[1].Value = False
+
+ loadValues[2] = uno.createUnoStruct(
+ 'com.sun.star.beans.PropertyValue')
+ loadValues[2].Name = "Preview"
+ loadValues[2].Value = True
+ '''set the preview document to non-modified
+ mode in order to avoid the 'do u want to save' box'''
+ if TextDocument.xTextDocument is not None:
+ try:
+ TextDocument.xTextDocument.Modified = False
+ except PropertyVetoException, e1:
+ traceback.print_exc()
+
+ TextDocument.xTextDocument = OfficeDocument.load(
+ self.xFrame, sDefaultTemplate, "_self", loadValues)
+
+ self.DocSize = self.getPageSize()
+
+ myViewHandler = ViewHandler(TextDocument.xTextDocument, TextDocument.xTextDocument)
+ try:
+ myViewHandler.setViewSetting(
+ "ZoomType", ENTIRE_PAGE)
+ except Exception, e:
+ traceback.print_exc()
+ myFieldHandler = TextFieldHandler(self.xMSF, TextDocument.xTextDocument)
+ myFieldHandler.updateDocInfoFields()
+ return TextDocument.xTextDocument
+
+ def getPageSize(self):
+ try:
+ xNameAccess = TextDocument.xTextDocument.StyleFamilies
+ xPageStyleCollection = xNameAccess.getByName("PageStyles")
+ xPageStyle = xPageStyleCollection.getByName("First Page")
+ return Helper.getUnoPropertyValue(xPageStyle, "Size")
+ except Exception, exception:
+ traceback.print_exc()
+ return None
+
+ '''creates an instance of TextDocument and creates a
+ frame and loads a document'''
+
+ def createTextCursor(self, oCursorContainer):
+ xTextCursor = oCursorContainer.createTextCursor()
+ return xTextCursor
+
+ # Todo: This method is unsecure because the last index is not necessarily the last section
+ # Todo: This Routine should be modified, because I cannot rely on the last Table in the document to be the last in the TextTables sequence
+ # to make it really safe you must acquire the Tablenames before the insertion and after the insertion of the new Table. By comparing the
+ # two sequences of tablenames you can find out the tablename of the last inserted Table
+ # Todo: This method is unsecure because the last index is not necessarily the last section
+
+ def getCharWidth(self, ScaleString):
+ iScale = 200
+ TextDocument.xTextDocument.lockControllers()
+ iScaleLen = ScaleString.length()
+ xTextCursor = createTextCursor(TextDocument.xTextDocument.Text)
+ xTextCursor.gotoStart(False)
+ com.sun.star.wizards.common.Helper.setUnoPropertyValue(
+ xTextCursor, "PageDescName", "First Page")
+ xTextCursor.String = ScaleString
+ xViewCursor = TextDocument.xTextDocument.CurrentController
+ xTextViewCursor = xViewCursor.ViewCursor
+ xTextViewCursor.gotoStart(False)
+ iFirstPos = xTextViewCursor.Position.X
+ xTextViewCursor.gotoEnd(False)
+ iLastPos = xTextViewCursor.Position.X
+ iScale = (iLastPos - iFirstPos) / iScaleLen
+ xTextCursor.gotoStart(False)
+ xTextCursor.gotoEnd(True)
+ xTextCursor.String = ""
+ unlockallControllers()
+ return iScale
+
+ def unlockallControllers(self):
+ while TextDocument.xTextDocument.hasControllersLocked():
+ TextDocument.xTextDocument.unlockControllers()
+
+ def refresh(self):
+ TextDocument.xTextDocument.refresh()
+
+ '''
+ This method sets the Author of a Wizard-generated template correctly
+ and adds a explanatory sentence to the template description.
+ @param WizardName The name of the Wizard.
+ @param TemplateDescription The old Description which is being
+ appended with another sentence.
+ @return void.
+ '''
+
+ def setWizardTemplateDocInfo(self, WizardName, TemplateDescription):
+ try:
+ xNA = Configuration.getConfigurationRoot(
+ self.xMSF, "/org.openoffice.UserProfile/Data", False)
+ gn = xNA.getByName("givenname")
+ sn = xNA.getByName("sn")
+ fullname = str(gn) + " " + str(sn)
+ now = time.localtime(time.time())
+ year = time.strftime("%Y", now)
+ month = time.strftime("%m", now)
+ day = time.strftime("%d", now)
+
+ dateObject = dateTimeObject(int(year), int(month), int(day))
+ du = Helper.DateUtils(self.xMSF, TextDocument.xTextDocument)
+ ff = du.getFormat(DATE_SYS_DDMMYY)
+ myDate = du.format(ff, dateObject)
+ xDocProps2 = TextDocument.xTextDocument.DocumentProperties
+ xDocProps2.Author = fullname
+ xDocProps2.ModifiedBy = fullname
+ description = xDocProps2.Description
+ description = description + " " + TemplateDescription
+ description = description.replace("<wizard_name>", WizardName)
+ description = description.replace("<current_date>", myDate)
+ xDocProps2.Description = description
+ except NoSuchElementException, e:
+ # TODO Auto-generated catch block
+ traceback.print_exc()
+ except WrappedTargetException, e:
+ # TODO Auto-generated catch block
+ traceback.print_exc()
+ except Exception, e:
+ # TODO Auto-generated catch block
+ traceback.print_exc()
+
+ '''
+ Apparently there is no other way to get the
+ page count of a text document other than using a cursor and
+ making it jump to the last page...
+ @param model the document model.
+ @return the page count of the document.
+ '''
+
+ def getPageCount(self, model):
+ xController = model.getCurrentController()
+ xPC = xController.getViewCursor()
+ xPC.jumpToLastPage()
+ return xPC.getPage()
+
+ @classmethod
+ def getFrameByName(self, sFrameName, xTD):
+ if xTD.TextFrames.hasByName(sFrameName):
+ return xTD.TextFrames.getByName(sFrameName)
+
+ return None
diff --git a/wizards/com/sun/star/wizards/text/TextFieldHandler.py b/wizards/com/sun/star/wizards/text/TextFieldHandler.py
new file mode 100644
index 000000000000..126f61dcefd9
--- /dev/null
+++ b/wizards/com/sun/star/wizards/text/TextFieldHandler.py
@@ -0,0 +1,165 @@
+import traceback
+import time
+import unicodedata
+from wizards.common.PropertyNames import PropertyNames
+
+from com.sun.star.util import DateTime
+
+class TextFieldHandler(object):
+ '''
+ Creates a new instance of TextFieldHandler
+ @param xMSF
+ @param xTextDocument
+ '''
+
+ xTextFieldsSupplierAux = None
+ arrayTextFields = None
+ dictTextFields = None
+
+ def __init__(self, xMSF, xTextDocument):
+ self.xMSFDoc = xMSF
+ self.xTextFieldsSupplier = xTextDocument
+ if TextFieldHandler.xTextFieldsSupplierAux is not \
+ self.xTextFieldsSupplier:
+ self.__getTextFields()
+ TextFieldHandler.xTextFieldsSupplierAux = self.xTextFieldsSupplier
+
+ def refreshTextFields(self):
+ xUp = self.xTextFieldsSupplier.TextFields
+ xUp.refresh()
+
+ def getUserFieldContent(self, xTextCursor):
+ try:
+ xTextRange = xTextCursor.getEnd()
+ oTextField = Helper.getUnoPropertyValue(xTextRange, "TextField")
+ if com.sun.star.uno.AnyConverter.isVoid(oTextField):
+ return ""
+ else:
+ xMaster = oTextField.getTextFieldMaster()
+ UserFieldContent = xMaster.getPropertyValue("Content")
+ return UserFieldContent
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ return ""
+
+ def insertUserField(self, xTextCursor, FieldName, FieldTitle):
+ try:
+ xField = self.xMSFDoc.createInstance(
+ "com.sun.star.text.TextField.User")
+
+ if self.xTextFieldsSupplier.TextFieldMasters.hasByName(
+ "com.sun.star.text.FieldMaster.User." + FieldName):
+ oMaster = self.xTextFieldsSupplier.TextFieldMasters.getByName( \
+ "com.sun.star.text.FieldMaster.User." + FieldName)
+ oMaster.dispose()
+
+ xPSet = createUserField(FieldName, FieldTitle)
+ xField.attachTextFieldMaster(xPSet)
+ xTextCursor.getText().insertTextContent(
+ xTextCursor, xField, False)
+ except com.sun.star.uno.Exception, exception:
+ traceback.print_exc()
+
+ def createUserField(self, FieldName, FieldTitle):
+ xPSet = self.xMSFDoc.createInstance(
+ "com.sun.star.text.FieldMaster.User")
+ xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, FieldName)
+ xPSet.setPropertyValue("Content", FieldTitle)
+ return xPSet
+
+ def __getTextFields(self):
+ try:
+ if self.xTextFieldsSupplier.TextFields.hasElements():
+ TextFieldHandler.dictTextFields = {}
+ TextFieldHandler.arrayTextFields = []
+ xEnum = \
+ self.xTextFieldsSupplier.TextFields.createEnumeration()
+ while xEnum.hasMoreElements():
+ oTextField = xEnum.nextElement()
+ TextFieldHandler.arrayTextFields.append(oTextField)
+ xPropertySet = oTextField.TextFieldMaster
+ if xPropertySet.Name:
+ TextFieldHandler.dictTextFields[xPropertySet.Name] = \
+ oTextField
+ except Exception, e:
+ #TODO Auto-generated catch block
+ traceback.print_exc()
+
+ def __getTextFieldsByProperty(
+ self, _PropertyName, _aPropertyValue):
+ try:
+ xProperty = TextFieldHandler.dictTextFields[_aPropertyValue]
+ xPropertySet = xProperty.TextFieldMaster
+ if xPropertySet.PropertySetInfo.hasPropertyByName(
+ _PropertyName):
+ oValue = xPropertySet.getPropertyValue(_PropertyName)
+ sValue = unicodedata.normalize(
+ 'NFKD', oValue).encode('ascii','ignore')
+ if sValue == _aPropertyValue:
+ return xProperty
+ return None
+ except KeyError, e:
+ return None
+
+ def changeUserFieldContent(self, _FieldName, _FieldContent):
+ DependentTextFields = self.__getTextFieldsByProperty(
+ PropertyNames.PROPERTY_NAME, _FieldName)
+ if DependentTextFields is not None:
+ DependentTextFields.TextFieldMaster.setPropertyValue("Content", _FieldContent)
+ self.refreshTextFields()
+
+ def updateDocInfoFields(self):
+ try:
+ for i in TextFieldHandler.arrayTextFields:
+ if i.supportsService(
+ "com.sun.star.text.TextField.ExtendedUser"):
+ i.update()
+
+ if i.supportsService(
+ "com.sun.star.text.TextField.User"):
+ i.update()
+
+ except Exception, e:
+ traceback.print_exc()
+
+ def updateDateFields(self):
+ try:
+ now = time.localtime(time.time())
+ dt = DateTime()
+ dt.Day = time.strftime("%d", now)
+ dt.Year = time.strftime("%Y", now)
+ dt.Month = time.strftime("%m", now)
+ dt.Month += 1
+ for i in TextFieldHandler.arrayTextFields:
+ if i.supportsService(
+ "com.sun.star.text.TextField.DateTime"):
+ i.setPropertyValue("IsFixed", False)
+ i.setPropertyValue("DateTimeValue", dt)
+
+ except Exception, e:
+ traceback.print_exc()
+
+ def fixDateFields(self, _bSetFixed):
+ try:
+ for i in TextFieldHandler.arrayTextFields:
+ if i.supportsService(
+ "com.sun.star.text.TextField.DateTime"):
+ i.setPropertyValue("IsFixed", _bSetFixed)
+
+ except Exception, e:
+ traceback.print_exc()
+
+ def removeUserFieldByContent(self, _FieldContent):
+ try:
+ xDependentTextFields = self.__getTextFieldsByProperty(
+ "Content", _FieldContent)
+ if xDependentTextFields != None:
+ i = 0
+ while i < xDependentTextFields.length:
+ xDependentTextFields[i].dispose()
+ i += 1
+
+ except Exception, e:
+ traceback.print_exc()
diff --git a/wizards/com/sun/star/wizards/text/TextSectionHandler.py b/wizards/com/sun/star/wizards/text/TextSectionHandler.py
new file mode 100644
index 000000000000..fb628e4e5e01
--- /dev/null
+++ b/wizards/com/sun/star/wizards/text/TextSectionHandler.py
@@ -0,0 +1,123 @@
+import uno
+import traceback
+from wizards.common.Helper import Helper
+
+class TextSectionHandler(object):
+ '''Creates a new instance of TextSectionHandler'''
+ def __init__(self, xMSF, xTextDocument):
+ self.xMSFDoc = xMSF
+ self.xTextDocument = xTextDocument
+ self.xText = xTextDocument.Text
+
+ def removeTextSectionbyName(self, SectionName):
+ try:
+ xAllTextSections = self.xTextDocument.TextSections
+ if xAllTextSections.hasByName(SectionName):
+ oTextSection = self.xTextDocument.TextSections.getByName(
+ SectionName)
+ self.removeTextSection(oTextSection)
+
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ def hasTextSectionByName(self, SectionName):
+ xAllTextSections = self.xTextDocument.TextSections
+ return xAllTextSections.hasByName(SectionName)
+
+ def removeLastTextSection(self):
+ try:
+ xAllTextSections = self.xTextDocument.TextSections
+ oTextSection = xAllTextSections.getByIndex(
+ xAllTextSections.getCount() - 1)
+ self.removeTextSection(oTextSection)
+ except Exception, exception:
+ traceback.print_exc()
+
+ def removeTextSection(self, _oTextSection):
+ try:
+ self.xText.removeTextContent(_oTextSection)
+ except Exception, exception:
+ traceback.print_exc()
+
+ def removeInvisibleTextSections(self):
+ try:
+ xAllTextSections = self.xTextDocument.TextSections
+ TextSectionCount = xAllTextSections.getCount()
+ i = TextSectionCount - 1
+ while i >= 0:
+ xTextContentTextSection = xAllTextSections.getByIndex(i)
+ if not bool(xTextContentTextSection.getPropertyValue("IsVisible")):
+ self.xText.removeTextContent(xTextContentTextSection)
+
+ i -= 1
+ except Exception, exception:
+ traceback.print_exc()
+
+ def removeAllTextSections(self):
+ try:
+ TextSectionCount = self.xTextDocument.TextSections.Count
+ xAllTextSections = self.xTextDocument.TextSections
+ for i in xrange(TextSectionCount - 1, -1, -1):
+ xTextContentTextSection = xAllTextSections.getByIndex(i)
+ self.xText.removeTextContent(xTextContentTextSection)
+ except Exception, exception:
+ traceback.print_exc()
+
+ def breakLinkOfTextSection(self, oTextSection):
+ try:
+ oSectionLink = \
+ uno.createUnoStruct('com.sun.star.text.SectionFileLink')
+ oSectionLink.FileURL = ""
+ Helper.setUnoPropertyValues(
+ oTextSection, ("FileLink", "LinkRegion"),(oSectionLink, ""))
+ except Exception:
+ traceback.print_exc()
+
+ def linkSectiontoTemplate(
+ self, TemplateName, SectionName, oTextSection=None):
+ try:
+ if oTextSection is not None:
+ oTextSection = self.xTextDocument.TextSections.getByName(
+ SectionName)
+ oSectionLink = \
+ uno.createUnoStruct('com.sun.star.text.SectionFileLink')
+ oSectionLink.FileURL = TemplateName
+ Helper.setUnoPropertyValues(
+ oTextSection, ("FileLink", "LinkRegion"),
+ (oSectionLink, SectionName))
+ NewSectionName = oTextSection.Name
+ if NewSectionName is not SectionName:
+ oTextSection.Name = SectionName
+ except Exception:
+ traceback.print_exc()
+
+ def insertTextSection(self, GroupName, TemplateName, _bAddParagraph):
+ try:
+ if _bAddParagraph:
+ xTextCursor = self.xText.createTextCursor()
+ self.xText.insertControlCharacter(
+ xTextCursor, ControlCharacter.PARAGRAPH_BREAK, False)
+ xTextCursor.collapseToEnd()
+
+ xSecondTextCursor = self.xText.createTextCursor()
+ xSecondTextCursor.gotoEnd(False)
+ insertTextSection(GroupName, TemplateName, xSecondTextCursor)
+ except IllegalArgumentException, e:
+ traceback.print_exc()
+
+ def insertTextSection(self, sectionName, templateName, position):
+ try:
+ if self.xTextDocument.TextSections.hasByName(sectionName):
+ xTextSection = \
+ self.xTextDocument.TextSections.getByName(sectionName)
+ else:
+ xTextSection = self.xMSFDoc.createInstance(
+ "com.sun.star.text.TextSection")
+ position.getText().insertTextContent(
+ position, xTextSection, False)
+
+ linkSectiontoTemplate(xTextSection, templateName, sectionName)
+ except Exception, exception:
+ traceback.print_exc()
+
diff --git a/wizards/com/sun/star/wizards/ui/ControlScroller.py b/wizards/com/sun/star/wizards/ui/ControlScroller.py
new file mode 100644
index 000000000000..572ec85b87ad
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/ControlScroller.py
@@ -0,0 +1,230 @@
+import uno
+import traceback
+from wizards.common.Desktop import Desktop
+from wizards.common.PropertyNames import PropertyNames
+from wizards.common.HelpIds import HelpIds
+from wizards.common.Helper import Helper
+from wizards.ui.UnoDialog import UnoDialog
+
+from com.sun.star.awt.ScrollBarOrientation import HORIZONTAL, VERTICAL
+
+class ControlScroller(object):
+
+ SORELFIRSTPOSY = 3
+ iScrollBarWidth = 10
+ scrollfields = []
+ CurUnoDialog = None
+ iStep = None
+ curHelpIndex = None
+
+ # TODO add parameters for tabindices and helpindex
+ def __init__(self, _CurUnoDialog, _xMSF, _iStep, _iCompPosX, _iCompPosY,
+ _iCompWidth, _nblockincrement, _nlinedistance, _firsthelpindex):
+ self.xMSF = _xMSF
+ ControlScroller.nblockincrement = _nblockincrement
+ ControlScroller.CurUnoDialog = _CurUnoDialog
+ ControlScroller.iStep = _iStep
+ ControlScroller.curHelpIndex = _firsthelpindex
+ self.curtabindex = ControlScroller.iStep * 100
+ self.linedistance = _nlinedistance
+ self.iCompPosX = _iCompPosX
+ self.iCompPosY = _iCompPosY
+ self.iCompWidth = _iCompWidth
+ self.iCompHeight = 2 * ControlScroller.SORELFIRSTPOSY + \
+ ControlScroller.nblockincrement * self.linedistance
+ self.iStartPosY = self.iCompPosY + ControlScroller.SORELFIRSTPOSY
+ ScrollHeight = self.iCompHeight - 2
+ self.nlineincrement = 1
+ self.sincSuffix = Desktop.getIncrementSuffix(
+ ControlScroller.CurUnoDialog.xDialogModel, "imgBackground")
+ self.oImgControl = ControlScroller.CurUnoDialog.insertControlModel(
+ "com.sun.star.awt.UnoControlImageControlModel",
+ "imgBackground" + self.sincSuffix,
+ ("Border", PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_WIDTH),
+ (1, self.iCompHeight, self.iCompPosX,
+ self.iCompPosY, ControlScroller.iStep, self.iCompWidth))
+ self.oImgControl = ControlScroller.CurUnoDialog.xUnoDialog.getControl(
+ "imgBackground" + self.sincSuffix)
+ self.setComponentMouseTransparent()
+ ControlScroller.xScrollBar = ControlScroller.CurUnoDialog.insertScrollBar(
+ "TitleScrollBar" + self.sincSuffix,
+ ("Border", PropertyNames.PROPERTY_ENABLED,
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL, "Orientation",
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_WIDTH),
+ (0, True, ScrollHeight,
+ HelpIds.getHelpIdString(ControlScroller.curHelpIndex),
+ VERTICAL, self.iCompPosX + self.iCompWidth - \
+ ControlScroller.iScrollBarWidth - 1,
+ self.iCompPosY + 1, ControlScroller.iStep,
+ ControlScroller.iScrollBarWidth), 0, self)
+ ControlScroller.nscrollvalue = 0
+ ControlScroller.ControlGroupVector = []
+ ypos = self.iStartPosY + ControlScroller.SORELFIRSTPOSY
+ for i in xrange(ControlScroller.nblockincrement):
+ self.insertControlGroup(i, ypos)
+ ypos += self.linedistance
+
+ def setComponentMouseTransparent(self):
+ ControlScroller.CurUnoDialog.getPeerConfiguration().\
+ setPeerProperties(self.oImgControl, "MouseTransparent", True)
+
+ def setScrollBarOrientationHorizontal(self):
+ Helper.setUnoPropertyValue(
+ ControlScroller.xScrollBar, "Orientation", HORIZONTAL)
+
+ @classmethod
+ def fillupControls(self, binitialize):
+ for i in xrange(ControlScroller.nblockincrement):
+ if i < self.ncurfieldcount:
+ self.fillupControl(i)
+
+ if binitialize:
+ ControlScroller.CurUnoDialog.repaintDialogStep()
+
+ @classmethod
+ def fillupControl(self, guiRow):
+ nameProps = ControlScroller.scrollfields[guiRow]
+ valueProps = ControlScroller.scrollfields[guiRow + ControlScroller.nscrollvalue]
+ for index, item in enumerate(nameProps):
+ if ControlScroller.CurUnoDialog.xDialogModel.hasByName(item.Name):
+ self.setControlData(item.Name, valueProps[index].Value)
+ else:
+ raise AttributeError("No such control !")
+
+ @classmethod
+ def setScrollValue(self, _nscrollvalue, _ntotfieldcount=None):
+ if _ntotfieldcount is not None:
+ self.setTotalFieldCount(_ntotfieldcount)
+ if _nscrollvalue >= 0:
+ Helper.setUnoPropertyValue(
+ ControlScroller.xScrollBar.Model, "ScrollValue", _nscrollvalue)
+ self.scrollControls()
+
+ @classmethod
+ def setCurFieldCount(self):
+ if self.ntotfieldcount > ControlScroller.nblockincrement:
+ self.ncurfieldcount = ControlScroller.nblockincrement
+ else:
+ self.ncurfieldcount = self.ntotfieldcount
+
+ @classmethod
+ def setTotalFieldCount(self, _ntotfieldcount):
+ self.ntotfieldcount = _ntotfieldcount
+ self.setCurFieldCount()
+ if self.ntotfieldcount > ControlScroller.nblockincrement:
+ Helper.setUnoPropertyValues(
+ ControlScroller.xScrollBar.Model,
+ (PropertyNames.PROPERTY_ENABLED, "ScrollValueMax"),
+ (True, self.ntotfieldcount - ControlScroller.nblockincrement))
+ else:
+ Helper.setUnoPropertyValue(ControlScroller.xScrollBar.Model,
+ PropertyNames.PROPERTY_ENABLED, False)
+
+ def toggleComponent(self, _bdoenable):
+ bdoenable = _bdoenable and \
+ (self.ntotfieldcount > ControlScroller.nblockincrement)
+ ControlScroller.CurUnoDialog.setControlProperty(
+ "TitleScrollBar" + self.sincSuffix,
+ PropertyNames.PROPERTY_ENABLED, bdoenable)
+
+ def toggleControls(self, _bdoenable):
+ n = 0
+ while n < ControlScroller.scrollfields.size():
+ curproperties = ControlScroller.scrollfields.elementAt(n)
+ m = 0
+ while m < curproperties.length:
+ curproperty = curproperties[m]
+ ControlScroller.CurUnoDialog.setControlProperty(
+ curproperty.Name, PropertyNames.PROPERTY_ENABLED, _bdoenable)
+ m += 1
+ n += 1
+
+ @classmethod
+ def scrollControls(self):
+ try:
+ ControlScroller.nscrollvalue = int(Helper.getUnoPropertyValue(
+ ControlScroller.xScrollBar.Model, "ScrollValue"))
+ if ControlScroller.nscrollvalue + ControlScroller.nblockincrement \
+ >= self.ntotfieldcount:
+ ControlScroller.nscrollvalue = \
+ self.ntotfieldcount - ControlScroller.nblockincrement
+ self.fillupControls(False)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ updates the corresponding data to
+ the control in guiRow and column
+ @param guiRow 0 based row index
+ @param column 0 based column index
+ @return the propertyValue object corresponding to
+ this control.
+ '''
+
+ @classmethod
+ def fieldInfo(self, guiRow, column):
+ if guiRow + ControlScroller.nscrollvalue < len(ControlScroller.scrollfields):
+ valueProp = (ControlScroller.scrollfields[guiRow + ControlScroller.nscrollvalue])[column]
+ nameProp = (ControlScroller.scrollfields[guiRow])[column]
+ if ControlScroller.CurUnoDialog.xDialogModel.hasByName(nameProp.Name):
+ valueProp.Value = self.getControlData(nameProp.Name)
+ else:
+ valueProp.Value = nameProp.Value
+ return valueProp
+ else:
+ return None
+
+ @classmethod
+ def unregisterControlGroup(self, _index):
+ del ControlScroller.scrollfields[_index]
+
+ @classmethod
+ def registerControlGroup(self, _currowproperties, _i):
+ if _i == 0:
+ del ControlScroller.scrollfields[:]
+
+ if _i >= len(ControlScroller.scrollfields):
+ ControlScroller.scrollfields.append(_currowproperties)
+ else:
+ ControlScroller.scrollfields.insert(_currowproperties, _i)
+
+ @classmethod
+ def setControlData(self, controlname, newvalue):
+ oControlModel = ControlScroller.CurUnoDialog.xUnoDialog.getControl(
+ controlname).Model
+ propertyname = UnoDialog.getDisplayProperty(oControlModel)
+ if propertyname != "":
+ ControlScroller.CurUnoDialog.setControlProperty(
+ controlname, propertyname, newvalue)
+
+ @classmethod
+ def getControlData(self, controlname):
+ oControlModel = ControlScroller.CurUnoDialog.xUnoDialog.getControl(
+ controlname).Model
+ propertyname = UnoDialog.getDisplayProperty(oControlModel)
+ if propertyname != "":
+ return ControlScroller.CurUnoDialog.getControlProperty(
+ controlname, propertyname)
+ else:
+ return None
+
+ def getScrollFieldValues(self):
+ retproperties = [[ControlScroller.scrollfields.size()],[]]
+ try:
+ i = 0
+ while i < ControlScroller.scrollfields.size():
+ curproperties = ControlScroller.scrollfields.elementAt(i)
+ retproperties[i] = curproperties
+ i += 1
+ return retproperties
+ except java.lang.Exception, ex:
+ ex.printStackTrace(System.out)
+ return None
diff --git a/wizards/com/sun/star/wizards/ui/DocumentPreview.py b/wizards/com/sun/star/wizards/ui/DocumentPreview.py
new file mode 100644
index 000000000000..64339bb3fde2
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/DocumentPreview.py
@@ -0,0 +1,85 @@
+import traceback
+from wizards.common.Properties import Properties
+
+from com.sun.star.awt import WindowDescriptor
+from com.sun.star.awt import Rectangle
+from com.sun.star.awt.WindowClass import SIMPLE
+from com.sun.star.awt.VclWindowPeerAttribute import CLIPCHILDREN
+from com.sun.star.awt.WindowAttribute import SHOW
+
+'''
+@author rpiterman
+To change the template for this generated type comment go to
+Window>Preferences>Java>Code Generation>Code and Comments
+'''
+
+class DocumentPreview(object):
+ PREVIEW_MODE = 1
+
+ '''
+ create new frame with window inside
+ load a component as preview into this frame
+ '''
+
+ def __init__(self, xmsf, control):
+ self.xControl = control
+ self.createPreviewFrame(xmsf, self.xControl)
+
+ def setDocument(self, url_, propNames, propValues=None):
+ if propValues is None:
+ if propNames == DocumentPreview.PREVIEW_MODE:
+ self.setDocument(url_, ("Preview", "ReadOnly"), (True, True))
+ else:
+ self.loadArgs = propNames
+ self.xFrame.activate()
+ self.xComponent = self.xFrame.loadComponentFromURL(url_, "_self", 0, tuple(self.loadArgs))
+ return self.xComponent
+ else:
+ self.url = url_
+ ps = Properties()
+ for index,item in enumerate(propNames):
+ ps[item] = propValues[index]
+ return self.setDocument(self.url, ps.getProperties(ps))
+
+ def reload(self, xmsf):
+ self.closeFrame()
+ self.createPreviewFrame(xmsf, self.xControl)
+ self.setDocument(self.url, self.loadArgs)
+
+ def closeFrame(self):
+ if self.xFrame is not None:
+ self.xFrame.close(False)
+
+ '''
+ create a new frame with a new container window inside,
+ which isnt part of the global frame tree.
+
+ Attention:
+ a) This frame wont be destroyed by the office. It must be closed by you!
+ Do so - please call XCloseable::close().
+ b) The container window is part of the frame. Dont hold it alive - nor try to kill it.
+ It will be destroyed inside close().
+ '''
+
+ def createPreviewFrame(self, xmsf, xControl):
+ controlPeer = xControl.Peer
+ r = xControl.PosSize
+ toolkit = xmsf.createInstance("com.sun.star.awt.Toolkit")
+ aDescriptor = WindowDescriptor()
+ aDescriptor.Type = SIMPLE
+ aDescriptor.WindowServiceName = "window"
+ aDescriptor.ParentIndex = -1
+ aDescriptor.Parent = controlPeer
+ #xWindowPeer; #argument !
+ aDescriptor.Bounds = Rectangle(0, 0, r.Width, r.Height)
+ aDescriptor.WindowAttributes = CLIPCHILDREN | SHOW
+ self.xWindow = toolkit.createWindow(aDescriptor)
+ self.xFrame = xmsf.createInstance("com.sun.star.frame.Frame")
+ self.xFrame.initialize(self.xWindow)
+ self.xWindow.setVisible(True)
+
+ def dispose(self):
+ try:
+ self.closeFrame()
+ except Exception:
+ traceback.print_exc()
diff --git a/wizards/com/sun/star/wizards/ui/ImageList.py b/wizards/com/sun/star/wizards/ui/ImageList.py
new file mode 100644
index 000000000000..565f63eead6a
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/ImageList.py
@@ -0,0 +1,503 @@
+from threading import RLock
+from wizards.ui.PeerConfig import PeerConfig
+from wizards.common.PropertyNames import *
+from wizards.common.HelpIds import HelpIds
+from wizards.common.Helper import Helper
+
+from com.sun.star.awt import Size
+
+def synchronized(lock):
+ ''' Synchronization decorator. '''
+ def wrap(f):
+ def newFunction(*args, **kw):
+ lock.acquire()
+ try:
+ return f(*args, **kw)
+ finally:
+ lock.release()
+ return newFunction
+ return wrap
+
+class ImageList(object):
+ NO_BORDER = 0
+ BACKGROUND_COLOR = 16777216
+ HIDE_PAGE = 99
+ TRANSPARENT = -1
+ LINE_HEIGHT = 8
+ IMAGE_PROPS = ("Border", "BackgroundColor",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y, "ScaleImage",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX, "Tabstop",
+ PropertyNames.PROPERTY_WIDTH)
+ MOVE_SELECTION = (PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP)
+ lock = RLock()
+ listModel = []
+ btnNext = None
+ btnBack = None
+
+ def __init__(self):
+ self.benabled = True
+ self.gap = Size(4, 4)
+ self.cols = 4
+ self.rows = 3
+ self.imageSize = Size(20, 20)
+ self.selectionGap = Size(2, 2)
+ self.showButtons = True
+ self.refreshOverNull = True
+ self.imageTextLines = 1
+ self.rowSelect = False
+ self.scaleImages = True
+ self.name = "il"
+ self.selected = -1
+ self.pageStart = 0
+ self.helpURL = 0
+ self.counterRenderer = self.SimpleCounterRenderer()
+ self.MOVE_SELECTION_VALS = range(3)
+
+ def create(self, dialog):
+ self.oUnoDialog = dialog
+ self.dialogModel = dialog.xDialogModel
+ imageTextHeight = self.imageTextLines * ImageList.LINE_HEIGHT
+ opeerConfig = PeerConfig(dialog)
+ self.MOVE_SELECTION_VALS[2] = self.step
+ imgContainer = dialog.insertImage(
+ self.name + "lblContainer",
+ ("BackgroundColor", "Border",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_WIDTH),
+ (ImageList.BACKGROUND_COLOR, 1,
+ (self.imageSize.Height + self.gap.Height) \
+ * self.rows + self.gap.Height + imageTextHeight + 1,
+ self.pos.Width,self.pos.Height, self.step,
+ (self.imageSize.Width + self.gap.Width) \
+ * self.cols + self.gap.Width))
+ opeerConfig.setPeerProperties(imgContainer,"MouseTransparent", True)
+
+ if self.rowSelect:
+ selectionWidth = (self.imageSize.Width + self.gap.Width) \
+ * self.cols - self.gap.Width + (self.selectionGap.Width * 2)
+ else:
+ selectionWidth = self.imageSize.Width + (self.selectionGap.Width * 2)
+
+ self.grbxSelectedImage = dialog.insertLabel(
+ self.name + "_grbxSelected",
+ ("BackgroundColor", "Border",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP, "Tabstop",
+ PropertyNames.PROPERTY_WIDTH),
+ (ImageList.TRANSPARENT, 1,
+ self.imageSize.Height + (self.selectionGap.Height * 2),
+ 0, #height
+ 0, #posx
+ 0, #posy
+ self.step, True, selectionWidth))
+ xWindow = self.grbxSelectedImage
+ xWindow.addMouseListener(None)
+ pNames1 = (PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX, "Tabstop",
+ PropertyNames.PROPERTY_WIDTH)
+ self.lblImageText = dialog.insertLabel(
+ self.name + "_imageText", pNames1,
+ (imageTextHeight, "", self.pos.Width + 1,
+ self.pos.Height + (self.imageSize.Height + self.gap.Height) \
+ * self.rows + self.gap.Height, self.step, 0, False,
+ self.cols * (self.imageSize.Width + self.gap.Width) \
+ + self.gap.Width - 2))
+ if self.showButtons:
+ ImageList.btnBack = dialog.insertButton(
+ self.name + "_btnBack", "prevPage", pNames1,
+ (14, HelpIds.getHelpIdString((self.helpURL + 1)),
+ self.pos.Width, self.pos.Height + \
+ (self.imageSize.Height + self.gap.Height) * \
+ self.rows + self.gap.Height + imageTextHeight + 1,
+ self.step, self.tabIndex + 1, True, 14), self)
+ ImageList.btnNext = dialog.insertButton(
+ self.name + "_btnNext", "nextPage", pNames1,
+ (14, HelpIds.getHelpIdString((self.helpURL + 1)),
+ self.pos.Width + (self.imageSize.Width + self.gap.Width) * \
+ self.cols + self.gap.Width - 14 + 1,
+ self.pos.Height + (self.imageSize.Height + self.gap.Height) \
+ * self.rows + self.gap.Height + imageTextHeight + 1,
+ self.step, self.tabIndex + 2, True, 14), self)
+ self.lblCounter = dialog.insertLabel(
+ self.name + "_lblCounter", pNames1,
+ (ImageList.LINE_HEIGHT, "", self.pos.Width + 14 + 1,
+ self.pos.Height + (self.imageSize.Height + self.gap.Height) \
+ * self.rows + self.gap.Height + imageTextHeight + \
+ ((14 - ImageList.LINE_HEIGHT) / 2),
+ self.step, 0, False, self.cols * \
+ (self.imageSize.Width + self.gap.Width) + \
+ self.gap.Width - 2 * 14 - 1))
+ Helper.setUnoPropertyValue(self.lblCounter.Model, "Align", 1)
+ Helper.setUnoPropertyValue(ImageList.btnBack.Model,
+ PropertyNames.PROPERTY_LABEL, "<")
+ Helper.setUnoPropertyValue(ImageList.btnNext.Model,
+ PropertyNames.PROPERTY_LABEL, ">")
+
+ self.m_aImages = [None] * (self.rows * self.cols)
+
+ for r in xrange(self.rows):
+ for c in xrange(self.cols):
+ self.m_aImages[r * self.cols + c] = self.createImage(dialog, r, c)
+
+ self.refreshImages()
+ #COMMENTED
+ #ImageList.listModel.addListDataListener(None)
+
+ #used for optimization
+
+ def createImage(self, dialog, _row, _col):
+ imageName = self.name + "_image" + str(_row * self.cols + _col)
+ image = dialog.insertImage(
+ imageName, ImageList.IMAGE_PROPS,
+ (ImageList.NO_BORDER, ImageList.BACKGROUND_COLOR,
+ self.imageSize.Height,
+ HelpIds.getHelpIdString(self.helpURL + 1),
+ self.getImagePosX(_col), self.getImagePosY(_row),
+ self.scaleImages, self.step, self.tabIndex,
+ False, self.imageSize.Width))
+ #COMMENTED
+ image.addMouseListener(None)
+ image.addKeyListener(None)
+ return image
+
+ def getImagePosX(self, col):
+ return self.pos.Width + col * \
+ (self.imageSize.Width + self.gap.Width) + self.gap.Width
+
+ def getImagePosY(self, row):
+ return self.pos.Height + row * \
+ (self.imageSize.Height + self.gap.Height) + self.gap.Height
+
+ def refreshImages(self):
+ if self.showButtons:
+ self.refreshCounterText()
+
+ self.hideSelection()
+ if self.refreshOverNull:
+ i = 0
+ for i in self.m_aImages:
+ i.Visible = False
+
+ focusable = True
+ for index, item in enumerate(self.m_aImages):
+ #COMMENTED
+ oResources = None #self.renderer.getImageUrls(self.getObjectFor(index))
+ if oResources is not None:
+ if len(oResources) == 1:
+ Helper.setUnoPropertyValue(item.Model,
+ PropertyNames.PROPERTY_IMAGEURL, oResources[0])
+ elif len(oResources) == 2:
+ self.oUnoDialog.getPeerConfiguration().setImageUrl(
+ item.Model, oResources[0], oResources[1])
+
+ Helper.setUnoPropertyValue(
+ item.Model, "Tabstop", bool(focusable))
+ if self.refreshOverNull:
+ item.Visible = True
+
+ focusable = False
+
+ self.refreshSelection()
+
+ def refreshCounterText(self):
+ Helper.setUnoPropertyValue(
+ self.lblCounter.Model, PropertyNames.PROPERTY_LABEL,
+ self.counterRenderer.render(
+ self.Counter (self.pageStart + 1,
+ self.pageEnd, len(ImageList.listModel))))
+
+ def pageEnd(self):
+ i = self.pageStart + self.cols * self.rows
+ if i > ImageList.listModel.getSize() - 1:
+ return ImageList.listModel.getSize()
+ else:
+ return i
+
+ def refreshSelection(self):
+ if self.selected < self.pageStart or \
+ self.selected >= (self.pageStart + self.rows * self.cols):
+ self.hideSelection()
+ else:
+ self.moveSelection(self.getImageIndexFor(self.selected))
+
+ def hideSelection(self):
+ Helper.setUnoPropertyValue(self.grbxSelectedImage.Model,
+ PropertyNames.PROPERTY_STEP, ImageList.HIDE_PAGE)
+ self.grbxSelectedImage.Visible = False
+
+ '''
+ Utility field holding list of ItemListeners.
+ '''
+
+ def moveSelection(self, image):
+ self.grbxSelectedImage.Visible = False
+ row = image / self.cols
+ if self.rowSelect:
+ col = 0
+ else:
+ col = image - (row * self.cols)
+
+ self.MOVE_SELECTION_VALS[0] = \
+ (self.getImagePosX(col) - self.selectionGap.Width)
+ self.MOVE_SELECTION_VALS[1] = \
+ (self.getImagePosY(row) - self.selectionGap.Height)
+ Helper.setUnoPropertyValues(
+ self.grbxSelectedImage.Model, ImageList.MOVE_SELECTION,
+ self.MOVE_SELECTION_VALS)
+ if (Helper.getUnoPropertyValue(self.dialogModel,
+ PropertyNames.PROPERTY_STEP)) == self.step:
+ self.grbxSelectedImage.Visible = True
+ #now focus...
+
+ for index,item in enumerate(self.m_aImages):
+ if index != image:
+ self.defocus(index)
+ else:
+ Helper.setUnoPropertyValue(
+ self.m_aImages[image].Model, "Tabstop", True)
+
+ '''
+ @param i
+ @return the Object in the list model corresponding to the given image index
+ '''
+
+ def getObjectFor(self, i):
+ ii = self.getIndexFor(i)
+ if ImageList.listModel.getSize() <= ii:
+ return None
+ else:
+ return ImageList.listModel.getElementAt(ii)
+
+ '''
+ @param i
+ @return the index in the listModel for the given image index.
+ '''
+
+ def getIndexFor(self, i):
+ return self.pageStart + i
+
+ def getImageIndexFor(self, i):
+ return i - self.pageStart
+
+ def intervalAdded(self, event):
+ if event.getIndex0() <= self.selected:
+ if event.getIndex1() <= self.selected:
+ self.selected += event.getIndex1() - event.getIndex0() + 1
+
+ if event.getIndex0() < self.pageStart or \
+ event.getIndex1() < (self.pageStart + getRows() + getCols()):
+ refreshImages()
+
+ '''
+ Registers ItemListener to receive events.
+ @param listener The listener to register.
+ '''
+
+ @synchronized(lock)
+ def addItemListener(self, listener):
+ if self.itemListenerList == None:
+ self.itemListenerList = java.util.ArrayList.ArrayList()
+
+ self.itemListenerList.append(listener)
+
+ '''
+ Removes ItemListener from the list of listeners.
+ @param listener The listener to remove.
+ '''
+
+ @synchronized(lock)
+ def removeItemListener(self, listener):
+ if self.itemListenerList != None:
+ self.itemListenerList.remove(listener)
+
+ '''
+ Notifies all registered listeners about the event.
+ @param event The event to be fired
+ '''
+
+ def fireItemSelected(self):
+ with ImageList.lock:
+ if self.itemListenerList is None:
+ return
+
+ auxlist = self.itemListenerList.clone()
+
+ for i in auxlist:
+ i.itemStateChanged(None)
+
+ def setSelected(self, _object):
+ if not isinstance(_object, int):
+ _object = -1
+ if _object is not None:
+ for index, item in enumerate(ImageList.listModel):
+ if item == _object:
+ _object = index
+ return
+
+ if self.rowSelect and (_object >= 0):
+ _object = (_object / self.cols) * self.cols
+
+ if self.selected == _object:
+ return
+
+ self.selected = _object
+ self.refreshImageText()
+ self.refreshSelection()
+ #COMMENTED
+ #self.fireItemSelected()
+
+ def refreshImageText(self):
+ if self.selected >= 0:
+ #COMMENTED
+ item = None #ImageList.listModel.getElementAt(self.selected)
+ else:
+ item = None
+
+ Helper.setUnoPropertyValue(
+ self.lblImageText.Model, PropertyNames.PROPERTY_LABEL,
+ " " + self.renderer.render(item))
+
+
+ def nextPage(self):
+ if self.pageStart < listModel().getSize() - self.rows * self.cols:
+ setPageStart(self.pageStart + self.rows * self.cols)
+
+ def prevPage(self):
+ if self.pageStart == 0:
+ return
+
+ i = self.pageStart - self.rows * self.cols
+ if i < 0:
+ i = 0
+
+ setPageStart(i)
+
+ def enableButtons(self):
+ self.enable(
+ ImageList.btnNext,
+ bool(self.pageStart + self.rows * self.cols < len(ImageList.listModel)))
+ self.enable(ImageList.btnBack, bool(self.pageStart > 0))
+
+ def enable(self, control, enable):
+ Helper.setUnoPropertyValue(control.Model,
+ PropertyNames.PROPERTY_ENABLED, enable)
+
+ def setBorder(self, control, border):
+ Helper.setUnoPropertyValue(control.Model, "Border", border)
+
+ def getImageFromEvent(self, event):
+ image = (event).Source
+ controlName = Helper.getUnoPropertyValue(image.Model,
+ PropertyNames.PROPERTY_NAME)
+ return Integer.valueOf(controlName.substring(6 + self.name.length()))
+
+ def mousePressed(self, event):
+ image = getImageFromEvent(event)
+ index = getIndexFor(image)
+ if index < ImageList.listModel.getSize():
+ focus(image)
+ setSelected(index)
+
+ def getSelectedObjects(self):
+ return[listModel().getElementAt(self.selected)]
+
+ class SimpleCounterRenderer:
+
+ def render(self, counter):
+ return \
+ "" + (counter).start + ".." + (counter).end + "/" + (counter).max
+
+ class Counter(object):
+
+ def __init__(self, start_, end_, max_):
+ self.start = start_
+ self.end = end_
+ self.max = max_
+
+ def getSelectedObject(self):
+ if self.selected >= 0:
+ return listModel().getElementAt(self.selected)
+ return None
+
+ def showSelected(self):
+ oldPageStart = self.pageStart
+ if self.selected != -1:
+ self.pageStart = \
+ (self.selected / len(self.m_aImages)) * len(self.m_aImages)
+
+ if oldPageStart != self.pageStart:
+ #COMMENTED
+ #self.enableButtons()
+ self.refreshImages()
+
+ def keyPressed(self, ke):
+ image = getImageFromEvent(ke)
+ r = image / getCols()
+ c = image - (r * getCols())
+ d = getKeyMove(ke, r, c)
+ newImage = image + d
+ if newImage == image:
+ return
+
+ if isFocusable(newImage):
+ changeFocus(image, newImage)
+
+ def isFocusable(self, image):
+ return (image >= 0) and \
+ (getIndexFor(image) < ImageList.listModel.getSize())
+
+ def changeFocus(self, oldFocusImage, newFocusImage):
+ focus(newFocusImage)
+ defocus(oldFocusImage)
+
+ def select(self, ke):
+ setSelected(getIndexFor(getImageFromEvent(ke)))
+
+ def focus(self, image):
+ Helper.setUnoPropertyValue(
+ self.m_aImages[image].Model, "Tabstop", True)
+ xWindow = self.m_aImages[image]
+ xWindow.setFocus()
+
+ def defocus(self, image):
+ Helper.setUnoPropertyValue(
+ self.m_aImages[image].Model, "Tabstop", False)
+
+ '''jump to the given item (display the screen
+ that contains the given item).
+ @param i
+ '''
+
+ def display(self, i):
+ isAux = (getCols() * getRows())
+ ps = (ImageList.listModel.getSize() / isAux) * isAux
+ setPageStart(ps)
+
+ def setenabled(self, b):
+ i = 0
+ while i < self.m_aImages.length:
+ UnoDialog2.setEnabled(self.m_aImages[i], b)
+ i += 1
+ UnoDialog2.setEnabled(self.grbxSelectedImage, b)
+ UnoDialog2.setEnabled(self.lblImageText, b)
+ if self.showButtons:
+ UnoDialog2.setEnabled(ImageList.btnBack, b)
+ UnoDialog2.setEnabled(ImageList.btnNext, b)
+ UnoDialog2.setEnabled(self.lblCounter, b)
+
+ self.benabled = b
diff --git a/wizards/com/sun/star/wizards/ui/PathSelection.py b/wizards/com/sun/star/wizards/ui/PathSelection.py
new file mode 100644
index 000000000000..84ba2dfa5ca1
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/PathSelection.py
@@ -0,0 +1,121 @@
+import traceback
+from wizards.common.PropertyNames import *
+from wizards.common.FileAccess import *
+from wizards.common.SystemDialog import SystemDialog
+
+class PathSelection(object):
+
+ class DialogTypes(object):
+ FOLDER = 0
+ FILE = 1
+
+ class TransferMode(object):
+ SAVE = 0
+ LOAD = 1
+
+ def __init__(self, xMSF, CurUnoDialog, TransferMode, DialogType):
+ self.CurUnoDialog = CurUnoDialog
+ self.xMSF = xMSF
+ self.iDialogType = DialogType
+ self.iTransferMode = TransferMode
+ self.sDefaultDirectory = ""
+ self.sDefaultName = ""
+ self.sDefaultFilter = ""
+ self.usedPathPicker = False
+ self.CMDSELECTPATH = 1
+ self.TXTSAVEPATH = 1
+
+ def insert(
+ self, DialogStep, XPos, YPos, Width,
+ CurTabIndex, LabelText, Enabled, TxtHelpURL, BtnHelpURL):
+
+ self.CurUnoDialog.insertControlModel(
+ "com.sun.star.awt.UnoControlFixedTextModel", "lblSaveAs",
+ (PropertyNames.PROPERTY_ENABLED,
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (Enabled, 8, LabelText, XPos, YPos, DialogStep,
+ CurTabIndex, Width))
+ self.xSaveTextBox = self.CurUnoDialog.insertTextField(
+ "txtSavePath", "callXPathSelectionListener",
+ (PropertyNames.PROPERTY_ENABLED,
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (Enabled, 12, TxtHelpURL, XPos, YPos + 10, DialogStep,
+ (CurTabIndex + 1), Width - 26), self)
+
+ self.CurUnoDialog.setControlProperty("txtSavePath",
+ PropertyNames.PROPERTY_ENABLED, False )
+ self.CurUnoDialog.insertButton("cmdSelectPath", "triggerPathPicker",
+ (PropertyNames.PROPERTY_ENABLED,
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_HELPURL,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),
+ (Enabled, 14, BtnHelpURL, "...",XPos + Width - 16, YPos + 9,
+ DialogStep, (CurTabIndex + 2), 16), self)
+
+ def addSelectionListener(self, xAction):
+ self.xAction = xAction
+
+ def getSelectedPath(self):
+ return self.xSaveTextBox.Text
+
+ def initializePath(self):
+ try:
+ myFA = FileAccess(self.xMSF)
+ self.xSaveTextBox.setText(
+ myFA.getPath(self.sDefaultDirectory + \
+ "/" + \
+ self.sDefaultName, None))
+ except Exception, e:
+ traceback.print_exc()
+
+ def triggerPathPicker(self):
+ try:
+ if self.iTransferMode == self.TransferMode.SAVE:
+ if self.iDialogType == self.DialogTypes.FOLDER:
+ #TODO: write code for picking a folder for saving
+ return
+ elif self.iDialogType == self.DialogTypes.FILE:
+ self.usedPathPicker = True
+ myFilePickerDialog = \
+ SystemDialog.createStoreDialog(self.xMSF)
+ myFilePickerDialog.callStoreDialog(
+ self.sDefaultDirectory,
+ self.sDefaultName, self.sDefaultFilter)
+ sStorePath = myFilePickerDialog.sStorePath
+ if sStorePath is not None:
+ myFA = FileAccess(self.xMSF);
+ self.xSaveTextBox.Text = myFA.getPath(sStorePath, None)
+ self.sDefaultDirectory = \
+ FileAccess.getParentDir(sStorePath)
+ self.sDefaultName = myFA.getFilename(sStorePath)
+ return
+ elif iTransferMode == TransferMode.LOAD:
+ if iDialogType == DialogTypes.FOLDER:
+ #TODO: write code for picking a folder for loading
+ return
+ elif iDialogType == DialogTypes.FILE:
+ #TODO: write code for picking a file for loading
+ return
+ except Exception, e:
+ traceback.print_exc()
+
+ def callXPathSelectionListener(self):
+ if self.xAction != None:
+ self.xAction.validatePath()
diff --git a/wizards/com/sun/star/wizards/ui/PeerConfig.py b/wizards/com/sun/star/wizards/ui/PeerConfig.py
new file mode 100644
index 000000000000..ad873280e042
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/PeerConfig.py
@@ -0,0 +1,62 @@
+from wizards.ui.event.CommonListener import WindowListenerProcAdapter
+
+'''
+@author rpiterman
+To change the template for this generated type comment go to
+Window>Preferences>Java>Code Generation>Code and Comments
+'''
+
+class PeerConfig(object):
+
+ def __init__(self, _oUnoDialog):
+ self.oUnoDialog = _oUnoDialog
+ self.oUnoDialog.xUnoDialog.addWindowListener(
+ WindowListenerProcAdapter(self.windowShown))
+ self.m_aPeerTasks = []
+ self.aImageUrlTasks = []
+
+ class PeerTask(object):
+
+ def __init__(self, _xControl, _propNames, _propValues):
+ self.propnames = _propNames
+ self.propvalues = _propValues
+ self.xControl = _xControl
+
+ class ImageUrlTask(object):
+
+ def __init__(self, _oModel, _oResource, _oHCResource):
+ self.oModel = _oModel
+ self.oResource = _oResource
+ self.oHCResource = _oHCResource
+
+ def windowShown(self):
+ try:
+ for i in self.m_aPeerTasks:
+ xVclWindowPeer = i.xControl.Peer
+ xVclWindowPeer.setProperty(i.propnames, i.propvalues)
+
+ for i in self.aImageUrlTasks:
+ if isinstance(aImageUrlTask.oResource, int):
+ sImageUrl = oUnoDialog.getWizardImageUrl(aImageUrlTask.oResource, aImageUrlTask.oHCResource)
+ elif isinstance(aImageUrlTask.oResource, str):
+ sImageUrl = oUnoDialog.getImageUrl(aImageUrlTask.oResource, aImageUrlTask.oHCResource)
+ if sImageUrl != "":
+ Helper.setUnoPropertyValue(aImageUrlTask.oModel, PropertyNames.PROPERTY_IMAGEURL, sImageUrl)
+
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ @param oAPIControl an API control that the interface
+ XControl can be derived from
+ @param _propnames
+ @param _propvalues
+ '''
+
+ def setPeerProperties(self, _xControl, propnames, propvalues):
+ oPeerTask = self.PeerTask(_xControl, propnames, propvalues)
+ self.m_aPeerTasks.append(oPeerTask)
+
+ def setImageUrl(self, _ocontrolmodel, _oResource, _oHCResource):
+ oImageUrlTask = self.ImageUrlTask(_ocontrolmodel, _oResource, _oHCResource)
+ self.aImageUrlTasks.append(oImageUrlTask)
diff --git a/wizards/com/sun/star/wizards/ui/UnoDialog.py b/wizards/com/sun/star/wizards/ui/UnoDialog.py
new file mode 100644
index 000000000000..7c0aeb89cbad
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/UnoDialog.py
@@ -0,0 +1,411 @@
+import uno
+import traceback
+import wizards.ui.UIConsts
+from wizards.common.PropertyNames import PropertyNames
+from wizards.common.Helper import Helper
+from wizards.ui.PeerConfig import PeerConfig
+
+from com.sun.star.awt import Rectangle
+from com.sun.star.awt.PosSize import POS
+
+class UnoDialog(object):
+
+ createDict = False
+ dictProperties = None
+
+ def __init__(self, xMSF, PropertyNames, PropertyValues):
+ try:
+ self.xMSF = xMSF
+ self.ControlList = {}
+ self.xDialogModel = xMSF.createInstance(
+ "com.sun.star.awt.UnoControlDialogModel")
+ self.xDialogModel.setPropertyValues(PropertyNames, PropertyValues)
+ self.xUnoDialog = xMSF.createInstance(
+ "com.sun.star.awt.UnoControlDialog")
+ self.xUnoDialog.setModel(self.xDialogModel)
+ self.m_oPeerConfig = None
+ self.xWindowPeer = None
+ except Exception, e:
+ traceback.print_exc()
+
+ def getControlKey(self, EventObject, ControlList):
+ xControlModel = EventObject.getModel()
+ try:
+ sName = xControlModel.getPropertyValue(
+ PropertyNames.PROPERTY_NAME)
+ iKey = ControlList.get(sName).intValue()
+ except com.sun.star.uno.Exception, exception:
+ traceback.print_exc()
+ iKey = 2000
+
+ return iKey
+
+ def getPeerConfiguration(self):
+ if self.m_oPeerConfig is None:
+ self.m_oPeerConfig = PeerConfig(self)
+ return self.m_oPeerConfig
+
+ def setControlProperty(self, ControlName, PropertyName, PropertyValue):
+ try:
+ if PropertyValue is not None:
+ if not self.xDialogModel.hasByName(ControlName):
+ return
+ xPSet = self.xDialogModel.getByName(ControlName)
+ setattr(xPSet,PropertyName, PropertyValue)
+
+ except Exception, exception:
+ traceback.print_exc()
+
+ def setControlProperties(
+ self, ControlName, PropertyNames, PropertyValues):
+ self.setControlProperty(ControlName, PropertyNames, PropertyValues)
+
+ def getControlProperty(self, ControlName, PropertyName):
+ try:
+ xPSet = self.xDialogModel.getByName(ControlName)
+ return xPSet.getPropertyValue(PropertyName)
+ except Exception, exception:
+ traceback.print_exc()
+ return None
+
+
+ def printControlProperties(self, ControlName):
+ try:
+ xControlModel = self.xDialogModel().getByName(ControlName)
+ allProps = xControlModel.PropertySetInfo.Properties
+ i = 0
+ while i < allProps.length:
+ sName = allProps[i].Name
+ i += 1
+ except Exception, exception:
+ traceback.print_exc()
+
+ def getMAPConversionFactor(self, ControlName):
+ xControl2 = self.xUnoDialog.getControl(ControlName)
+ aSize = xControl2.Size
+ dblMAPWidth = Helper.getUnoPropertyValue(xControl2.Model,
+ int(PropertyNames.PROPERTY_WIDTH))
+ return (aSize.Width / dblMAPWidth)
+
+ def getpreferredLabelSize(self, LabelName, sLabel):
+ xControl2 = self.xUnoDialog.getControl(LabelName)
+ OldText = xControl2.Text
+ xControl2.setText(sLabel)
+ aSize = xControl2.PreferredSize
+ xControl2.setText(OldText)
+ return aSize
+
+ def removeSelectedItems(self, xListBox):
+ SelList = xListBox.SelectedItemsPos
+ Sellen = SelList.length
+ i = Sellen - 1
+ while i >= 0:
+ xListBox.removeItems(SelList[i], 1)
+ i -= 1
+
+ def getListBoxItemCount(self, _xListBox):
+ # This function may look ugly, but this is the only way to check
+ # the count of values in the model,which is always right.
+ # the control is only a view and could be right or not.
+ fieldnames = Helper.getUnoPropertyValue(getModel(_xListBox),
+ "StringItemList")
+ return fieldnames.length
+
+ def getSelectedItemPos(self, _xListBox):
+ ipos = Helper.getUnoPropertyValue(getModel(_xListBox),
+ "SelectedItems")
+ return ipos[0]
+
+ def isListBoxSelected(self, _xListBox):
+ ipos = Helper.getUnoPropertyValue(getModel(_xListBox),
+ "SelectedItems")
+ return ipos.length > 0
+
+ def addSingleItemtoListbox(self, xListBox, ListItem, iSelIndex):
+ xListBox.addItem(ListItem, xListBox.getItemCount())
+ if iSelIndex != -1:
+ xListBox.selectItemPos(iSelIndex, True)
+
+ '''
+ The problem with setting the visibility of controls is that
+ changing the current step of a dialog will automatically make
+ all controls visible. The PropertyNames.PROPERTY_STEP property
+ always wins against the property "visible".
+ Therfor a control meant to be invisible is placed on a step far far away.
+ Afterwards the step property of the dialog has to be set with
+ "repaintDialogStep". As the performance of that method is very bad it
+ should be used only once for all controls
+ @param controlname the name of the control
+ @param bIsVisible sets the control visible or invisible
+ '''
+
+ def setControlVisible(self, controlname, bIsVisible):
+ try:
+ iCurControlStep = int(getControlProperty(
+ controlname, PropertyNames.PROPERTY_STEP))
+ iCurDialogStep = int(Helper.getUnoPropertyValue(
+ self.xDialogModel, PropertyNames.PROPERTY_STEP))
+ if bIsVisible:
+ setControlProperty(
+ controlname, PropertyNames.PROPERTY_STEP, iCurDialogStep)
+ else:
+ setControlProperty(
+ controlname, PropertyNames.PROPERTY_STEP,
+ UIConsts.INVISIBLESTEP)
+
+ except com.sun.star.uno.Exception, exception:
+ traceback.print_exc()
+
+ # repaints the currentDialogStep
+
+ def repaintDialogStep(self):
+ try:
+ ncurstep = int(Helper.getUnoPropertyValue(
+ self.xDialogModel, PropertyNames.PROPERTY_STEP))
+ Helper.setUnoPropertyValue(
+ self.xDialogModel, PropertyNames.PROPERTY_STEP, 99)
+ Helper.setUnoPropertyValue(
+ self.xDialogModel, PropertyNames.PROPERTY_STEP, ncurstep)
+ except com.sun.star.uno.Exception, exception:
+ traceback.print_exc()
+
+ def insertControlModel(
+ self, serviceName, componentName, sPropNames, oPropValues):
+ try:
+ xControlModel = self.xDialogModel.createInstance(serviceName)
+ Helper.setUnoPropertyValues(
+ xControlModel, sPropNames, oPropValues)
+ self.xDialogModel.insertByName(componentName, xControlModel)
+ Helper.setUnoPropertyValue(xControlModel,
+ PropertyNames.PROPERTY_NAME, componentName)
+ except Exception, ex:
+ traceback.print_exc()
+
+ aObj = self.xUnoDialog.getControl(componentName)
+ return aObj
+
+ def setFocus(self, ControlName):
+ oFocusControl = self.xUnoDialog.getControl(ControlName)
+ oFocusControl.setFocus()
+
+ def combineListboxList(self, sFirstEntry, MainList):
+ try:
+ FirstList = [sFirstEntry]
+ ResultList = [MainList.length + 1]
+ System.arraycopy(FirstList, 0, ResultList, 0, 1)
+ System.arraycopy(MainList, 0, ResultList, 1, len(MainList))
+ return ResultList
+ except java.lang.Exception, jexception:
+ traceback.print_exc()
+ return None
+
+ def selectListBoxItem(self, xListBox, iFieldsSelIndex):
+ if iFieldsSelIndex > -1:
+ FieldCount = xListBox.getItemCount()
+ if FieldCount > 0:
+ if iFieldsSelIndex < FieldCount:
+ xListBox.selectItemPos(iFieldsSelIndex, True)
+ else:
+ xListBox.selectItemPos((short)(iFieldsSelIndex - 1), True)
+
+ # deselects a Listbox. MultipleMode is not supported
+
+ def deselectListBox(self, _xBasisListBox):
+ oListBoxModel = getModel(_xBasisListBox)
+ sList = Helper.getUnoPropertyValue(oListBoxModel, "StringItemList")
+ Helper.setUnoPropertyValue(oListBoxModel, "StringItemList", [[],[]])
+ Helper.setUnoPropertyValue(oListBoxModel, "StringItemList", sList)
+
+ def calculateDialogPosition(self, FramePosSize):
+ # Todo:check if it would be useful or possible to create a dialog peer
+ # that can be used for the messageboxes to
+ # maintain modality when they pop up.
+ CurPosSize = self.xUnoDialog.getPosSize()
+ WindowHeight = FramePosSize.Height
+ WindowWidth = FramePosSize.Width
+ DialogWidth = CurPosSize.Width
+ DialogHeight = CurPosSize.Height
+ iXPos = ((WindowWidth / 2) - (DialogWidth / 2))
+ iYPos = ((WindowHeight / 2) - (DialogHeight / 2))
+ self.xUnoDialog.setPosSize(
+ iXPos, iYPos, DialogWidth, DialogHeight, POS)
+
+ '''
+ @param FramePosSize
+ @return 0 for cancel, 1 for ok
+ @throws com.sun.star.uno.Exception
+ '''
+
+ def executeDialog(self, FramePosSize):
+ if self.xUnoDialog.getPeer() == None:
+ raise AttributeError(
+ "Please create a peer, using your own frame")
+
+ self.calculateDialogPosition(FramePosSize)
+
+ if self.xWindowPeer == None:
+ self.createWindowPeer()
+ return self.xUnoDialog.execute()
+
+ def setVisible(self, parent):
+ self.calculateDialogPosition(parent.xWindow.getPosSize())
+ if self.xWindowPeer == None:
+ self.createWindowPeer()
+
+ self.xUnoDialog.setVisible(True)
+
+ '''
+ @param parent
+ @return 0 for cancel, 1 for ok
+ @throws com.sun.star.uno.Exception
+ '''
+
+ def executeDialogFromParent(self, parent):
+ return self.executeDialog(parent.xUnoDialog.PosSize)
+
+ '''
+ @param XComponent
+ @return 0 for cancel, 1 for ok
+ @throws com.sun.star.uno.Exception
+ '''
+
+ def executeDialogFromComponent(self, xComponent):
+ if xComponent is not None:
+ w = xComponent.ComponentWindow
+ if w is not None:
+ return self.executeDialog(w.PosSize)
+
+ return self.executeDialog( Rectangle (0, 0, 640, 400))
+
+ def modifyFontWeight(self, ControlName, FontWeight):
+ oFontDesc = FontDescriptor.FontDescriptor()
+ oFontDesc.Weight = FontWeight
+ setControlProperty(ControlName, "FontDescriptor", oFontDesc)
+
+ '''
+ create a peer for this
+ dialog, using the given
+ peer as a parent.
+ @param parentPeer
+ @return
+ @throws java.lang.Exception
+ '''
+
+ def createWindowPeer(self, parentPeer=None):
+ self.xUnoDialog.setVisible(False)
+ xToolkit = self.xMSF.createInstance("com.sun.star.awt.Toolkit")
+ if parentPeer == None:
+ parentPeer = xToolkit.getDesktopWindow()
+
+ self.xUnoDialog.createPeer(xToolkit, parentPeer)
+ self.xWindowPeer = self.xUnoDialog.getPeer()
+ return self.xUnoDialog.getPeer()
+
+ # deletes the first entry when this is equal to "DelEntryName"
+ # returns true when a new item is selected
+
+ def deletefirstListboxEntry(self, ListBoxName, DelEntryName):
+ xListBox = self.xUnoDialog.getControl(ListBoxName)
+ FirstItem = xListBox.getItem(0)
+ if FirstItem.equals(DelEntryName):
+ SelPos = xListBox.getSelectedItemPos()
+ xListBox.removeItems(0, 1)
+ if SelPos > 0:
+ setControlProperty(ListBoxName, "SelectedItems", [SelPos])
+ xListBox.selectItemPos((short)(SelPos - 1), True)
+
+ @classmethod
+ def setEnabled(self, control, enabled):
+ Helper.setUnoPropertyValue(
+ control.Model, PropertyNames.PROPERTY_ENABLED, enabled)
+
+ @classmethod
+ def getControlModelType(self, xServiceInfo):
+ if xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlFixedTextModel"):
+ return UIConsts.CONTROLTYPE.FIXEDTEXT
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlButtonModel"):
+ return UIConsts.CONTROLTYPE.BUTTON
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlCurrencyFieldModel"):
+ return UIConsts.CONTROLTYPE.CURRENCYFIELD
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlDateFieldModel"):
+ return UIConsts.CONTROLTYPE.DATEFIELD
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlFixedLineModel"):
+ return UIConsts.CONTROLTYPE.FIXEDLINE
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlFormattedFieldModel"):
+ return UIConsts.CONTROLTYPE.FORMATTEDFIELD
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlRoadmapModel"):
+ return UIConsts.CONTROLTYPE.ROADMAP
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlNumericFieldModel"):
+ return UIConsts.CONTROLTYPE.NUMERICFIELD
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlPatternFieldModel"):
+ return UIConsts.CONTROLTYPE.PATTERNFIELD
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlHyperTextModel"):
+ return UIConsts.CONTROLTYPE.HYPERTEXT
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlProgressBarModel"):
+ return UIConsts.CONTROLTYPE.PROGRESSBAR
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlTimeFieldModel"):
+ return UIConsts.CONTROLTYPE.TIMEFIELD
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlImageControlModel"):
+ return UIConsts.CONTROLTYPE.IMAGECONTROL
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlRadioButtonModel"):
+ return UIConsts.CONTROLTYPE.RADIOBUTTON
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlCheckBoxModel"):
+ return UIConsts.CONTROLTYPE.CHECKBOX
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlEditModel"):
+ return UIConsts.CONTROLTYPE.EDITCONTROL
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlComboBoxModel"):
+ return UIConsts.CONTROLTYPE.COMBOBOX
+ elif xServiceInfo.supportsService(
+ "com.sun.star.awt.UnoControlListBoxModel"):
+ return UIConsts.CONTROLTYPE.LISTBOX
+ else:
+ return UIConsts.CONTROLTYPE.UNKNOWN
+
+ @classmethod
+ def getDisplayProperty(self, oControlModel):
+ itype = self.getControlModelType(oControlModel)
+ if not UnoDialog.createDict:
+ UnoDialog.createDict = True
+ UnoDialog.dictProperties = {
+ UIConsts.CONTROLTYPE.FIXEDTEXT:PropertyNames.PROPERTY_LABEL,
+ UIConsts.CONTROLTYPE.BUTTON:PropertyNames.PROPERTY_LABEL,
+ UIConsts.CONTROLTYPE.FIXEDLINE:PropertyNames.PROPERTY_LABEL,
+ UIConsts.CONTROLTYPE.NUMERICFIELD:"Value",
+ UIConsts.CONTROLTYPE.CURRENCYFIELD:"Value",
+ UIConsts.CONTROLTYPE.FORMATTEDFIELD:"EffectiveValue",
+ UIConsts.CONTROLTYPE.DATEFIELD:"Date",
+ UIConsts.CONTROLTYPE.TIMEFIELD:"Time",
+ UIConsts.CONTROLTYPE.SCROLLBAR:"ScrollValue",
+ UIConsts.CONTROLTYPE.PROGRESSBAR:"ProgressValue",
+ UIConsts.CONTROLTYPE.IMAGECONTROL:PropertyNames.PROPERTY_IMAGEURL,
+ UIConsts.CONTROLTYPE.RADIOBUTTON:PropertyNames.PROPERTY_STATE,
+ UIConsts.CONTROLTYPE.CHECKBOX:PropertyNames.PROPERTY_STATE,
+ UIConsts.CONTROLTYPE.EDITCONTROL:"Text",
+ UIConsts.CONTROLTYPE.COMBOBOX:"Text",
+ UIConsts.CONTROLTYPE.PATTERNFIELD:"Text",
+ UIConsts.CONTROLTYPE.LISTBOX:"SelectedItems"
+ }
+ try:
+ return UnoDialog.dictProperties[itype]
+ except KeyError:
+ return ""
+
+ def addResourceHandler(self, _Unit, _Module):
+ self.m_oResource = Resource(self.xMSF, _Unit, _Module)
diff --git a/wizards/com/sun/star/wizards/ui/UnoDialog2.py b/wizards/com/sun/star/wizards/ui/UnoDialog2.py
new file mode 100644
index 000000000000..58b448c92afa
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/UnoDialog2.py
@@ -0,0 +1,239 @@
+from wizards.ui.UnoDialog import *
+from wizards.ui.event.CommonListener import *
+from wizards.common.Desktop import Desktop
+
+'''
+This class contains convenience methods for inserting components to a dialog.
+It was created for use with the automatic conversion of Basic XML Dialog
+description files to a Java class which builds
+the same dialog through the UNO API.<br/>
+It uses an Event-Listener method, which calls a method through reflection
+wenn an event on a component is trigered.
+see the classes CommonListener for details
+'''
+
+class UnoDialog2(UnoDialog):
+
+ '''
+ Override this method to return another listener.
+ @return
+ '''
+
+ def __init__(self, xmsf):
+ super(UnoDialog2,self).__init__(xmsf,(), ())
+ ControlList = {}
+
+ def insertButton(
+ self, sName, actionPerformed, sPropNames, oPropValues, listener):
+ xButton = self.insertControlModel(
+ "com.sun.star.awt.UnoControlButtonModel",
+ sName, sPropNames, oPropValues)
+ if actionPerformed is not None:
+ actionPerformed = getattr(listener, actionPerformed)
+ xButton.addActionListener(
+ ActionListenerProcAdapter(actionPerformed))
+
+ return xButton
+
+ def insertImageButton(
+ self, sName, actionPerformed, sPropNames, oPropValues, listener):
+ xButton = self.insertControlModel(
+ "com.sun.star.awt.UnoControlButtonModel",
+ sName, sPropNames, oPropValues)
+ if actionPerformed is not None:
+ actionPerformed = getattr(listener, actionPerformed)
+ xButton.addActionListener(
+ ActionListenerProcAdapter(actionPerformed))
+
+ return xButton
+
+ def insertCheckBox(
+ self, sName, itemChanged, sPropNames, oPropValues, listener):
+ xCheckBox = self.insertControlModel(
+ "com.sun.star.awt.UnoControlCheckBoxModel",
+ sName, sPropNames, oPropValues)
+ if itemChanged is not None:
+ itemChanged = getattr(listener, itemChanged)
+ xCheckBox.addItemListener(ItemListenerProcAdapter(itemChanged))
+
+ return xCheckBox
+
+ def insertComboBox(
+ self, sName, actionPerformed, itemChanged,
+ textChanged, sPropNames, oPropValues, listener):
+ xComboBox = self.insertControlModel(
+ "com.sun.star.awt.UnoControlComboBoxModel",
+ sName, sPropNames, oPropValues)
+ if actionPerformed is not None:
+ actionPerformed = getattr(listener, actionPerformed)
+ xComboBox.addActionListener(
+ ActionListenerProcAdapter(actionPerformed))
+
+ if itemChanged is not None:
+ itemChanged = getattr(listener, itemChanged)
+ xComboBox.addItemListener(ItemListenerProcAdapter(itemChanged))
+
+ if textChanged is not None:
+ textChanged = getattr(listener, textChanged)
+ xComboBox.addTextListener(TextListenerProcAdapter(textChanged))
+
+ return xComboBox
+
+ def insertListBox(
+ self, sName, actionPerformed, itemChanged,
+ sPropNames, oPropValues, listener):
+ xListBox = self.insertControlModel(
+ "com.sun.star.awt.UnoControlListBoxModel",
+ sName, sPropNames, oPropValues)
+
+ if itemChanged is not None:
+ itemChanged = getattr(listener, itemChanged)
+ xListBox.addItemListener(ItemListenerProcAdapter(itemChanged))
+
+ return xListBox
+
+ def insertRadioButton(
+ self, sName, itemChanged, sPropNames, oPropValues, listener):
+ xRadioButton = self.insertControlModel(
+ "com.sun.star.awt.UnoControlRadioButtonModel",
+ sName, sPropNames, oPropValues)
+ if itemChanged is not None:
+ itemChanged = getattr(listener, itemChanged)
+ xRadioButton.addItemListener(
+ ItemListenerProcAdapter(itemChanged))
+
+ return xRadioButton
+
+ def insertTitledBox(self, sName, sPropNames, oPropValues):
+ oTitledBox = self.insertControlModel(
+ "com.sun.star.awt.UnoControlGroupBoxModel",
+ sName, sPropNames, oPropValues)
+ return oTitledBox
+
+ def insertTextField(
+ self, sName, sTextChanged, sPropNames, oPropValues, listener):
+ return self.insertEditField(
+ sName, sTextChanged, "com.sun.star.awt.UnoControlEditModel",
+ sPropNames, oPropValues, listener)
+
+ def insertImage(self, sName, sPropNames, oPropValues):
+ return self.insertControlModel(
+ "com.sun.star.awt.UnoControlImageControlModel",
+ sName, sPropNames, oPropValues)
+
+ def insertInfoImage(self, _posx, _posy, _iStep):
+ xImgControl = self.insertImage(
+ Desktop.getUniqueName(self.xDialogModel, "imgHint"),
+ ("Border",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_IMAGEURL,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y, "ScaleImage",
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_WIDTH),
+ (0, 10, UIConsts.INFOIMAGEURL, _posx, _posy, False, _iStep, 10))
+ return xImgControl
+
+ '''
+ This method is used for creating Edit, Currency, Date, Formatted,
+ Pattern, File and Time edit components.
+ '''
+
+ def insertEditField(
+ self, sName, sTextChanged, sModelClass,
+ sPropNames, oPropValues, listener):
+ xField = self.insertControlModel(sModelClass,
+ sName, sPropNames, oPropValues)
+ if sTextChanged is not None:
+ sTextChanged = getattr(listener, sTextChanged)
+ xField.addTextListener(TextListenerProcAdapter(sTextChanged))
+ return xField
+
+ def insertFileControl(
+ self, sName, sTextChanged, sPropNames, oPropValues, listener):
+ return self.insertEditField(sName, sTextChanged,
+ "com.sun.star.awt.UnoControlFileControlModel",
+ sPropNames, oPropValues, listener)
+
+ def insertCurrencyField(
+ self, sName, sTextChanged, sPropNames, oPropValues, listener):
+ return self.insertEditField(
+ sName, sTextChanged,
+ "com.sun.star.awt.UnoControlCurrencyFieldModel",
+ sPropNames, oPropValues, listener)
+
+ def insertDateField(
+ self, sName, sTextChanged, sPropNames, oPropValues, listener):
+ return self.insertEditField(
+ sName, sTextChanged,
+ "com.sun.star.awt.UnoControlDateFieldModel",
+ sPropNames, oPropValues, listener)
+
+ def insertNumericField(
+ self, sName, sTextChanged, sPropNames, oPropValues, listener):
+ return self.insertEditField(
+ sName, sTextChanged,
+ "com.sun.star.awt.UnoControlNumericFieldModel",
+ sPropNames, oPropValues, listener)
+
+ def insertTimeField(
+ self, sName, sTextChanged, sPropNames, oPropValues, listener):
+ return self.insertEditField(
+ sName, sTextChanged,
+ "com.sun.star.awt.UnoControlTimeFieldModel",
+ sPropNames, oPropValues, listener)
+
+ def insertPatternField(
+ self, sName, sTextChanged, oPropValues, listener):
+ return self.insertEditField(sName, sTextChanged,
+ "com.sun.star.awt.UnoControlPatternFieldModel",
+ sPropNames, oPropValues, listener)
+
+ def insertFormattedField(
+ self, sName, sTextChanged, sPropNames, oPropValues, listener):
+ return self.insertEditField(
+ sName, sTextChanged,
+ "com.sun.star.awt.UnoControlFormattedFieldModel",
+ sPropNames, oPropValues, listener)
+
+ def insertFixedLine(self, sName, sPropNames, oPropValues):
+ oLine = self.insertControlModel(
+ "com.sun.star.awt.UnoControlFixedLineModel",
+ sName, sPropNames, oPropValues)
+ return oLine
+
+ def insertLabel(self, sName, sPropNames, oPropValues):
+ oFixedText = self.insertControlModel(
+ "com.sun.star.awt.UnoControlFixedTextModel",
+ sName, sPropNames, oPropValues)
+ return oFixedText
+
+ def insertScrollBar(self, sName, sPropNames, oPropValues,
+ iControlKey, listener):
+ oScrollBar = self.insertControlModel(
+ "com.sun.star.awt.UnoControlScrollBarModel",
+ sName, sPropNames, oPropValues)
+ if listener is not None:
+ method = getattr(listener, "scrollControls")
+ oScrollBar.addAdjustmentListener(
+ AdjustmentListenerProcAdapter(method))
+ if self.ControlList is not None:
+ self.ControlList[sName] = iControlKey
+ return oScrollBar
+
+ def insertProgressBar(self, sName, sPropNames, oPropValues):
+ oProgressBar = self.insertControlModel(
+ "com.sun.star.awt.UnoControlProgressBarModel",
+ sName, sPropNames, oPropValues)
+ return oProgressBar
+
+ def insertGroupBox(self, sName, sPropNames, oPropValues):
+ oGroupBox = self.insertControlModel(
+ "com.sun.star.awt.UnoControlGroupBoxModel",
+ sName, sPropNames, oPropValues)
+ return oGroupBox
+
+ def showMessageBox(self, windowServiceName, windowAttribute, MessageText):
+ return SystemDialog.showMessageBox(
+ xMSF, self.xControl.Peer,
+ windowServiceName, windowAttribute, MessageText)
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 000000000000..d73fb4f736b6
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/WizardDialog.py
@@ -0,0 +1,489 @@
+from wizards.ui.UnoDialog2 import *
+from abc import ABCMeta, abstractmethod
+from wizards.common.Resource import Resource
+from wizards.ui.XPathSelectionListener import XPathSelectionListener
+from wizards.common.HelpIds import *
+from wizards.document.OfficeDocument import OfficeDocument
+from wizards.text.TextDocument import TextDocument
+
+from com.sun.star.lang import NoSuchMethodException
+from com.sun.star.lang import IllegalArgumentException
+from com.sun.star.frame import TerminationVetoException
+from com.sun.star.awt.PushButtonType import HELP, STANDARD
+
+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.__oWizardResource = Resource(xMSF, "dbw")
+ self.sMsgEndAutopilot = self.__oWizardResource.getResText(
+ UIConsts.RID_DB_COMMON + 33)
+ self.oRoadmap = None
+
+ def itemStateChanged(self, itemEvent):
+ try:
+ self.nNewStep = itemEvent.ItemId
+ self.nOldStep = int(Helper.getUnoPropertyValue(
+ self.xDialogModel,
+ PropertyNames.PROPERTY_STEP))
+ if self.nNewStep != self.nOldStep:
+ self.switchToStep()
+
+ except IllegalArgumentException, exception:
+ traceback.print_exc()
+
+ def setRoadmapInteractive(self, _bInteractive):
+ Helper.setUnoPropertyValue(self.oRoadmap, "Activated", _bInteractive)
+
+ def setRoadmapComplete(self, bComplete):
+ Helper.setUnoPropertyValue(self.oRoadmap, "Complete", bComplete)
+
+ def isRoadmapComplete(self):
+ try:
+ return bool(Helper.getUnoPropertyValue(self.oRoadmap, "Complete"))
+ except IllegalArgumentException, exception:
+ traceback.print_exc()
+ return False
+
+ def setCurrentRoadmapItemID(self, ID):
+ if self.oRoadmap is not None:
+ nCurItemID = self.getCurrentRoadmapItemID()
+ if nCurItemID != ID:
+ Helper.setUnoPropertyValue(self.oRoadmap, "CurrentItemID",ID)
+
+ def getCurrentRoadmapItemID(self):
+ try:
+ return int(Helper.getUnoPropertyValue(
+ self.oRoadmap, "CurrentItemID"))
+ except Exception, exception:
+ traceback.print_exc()
+ return -1
+
+ def addRoadmap(self):
+ try:
+ iDialogHeight = Helper.getUnoPropertyValue(
+ self.xDialogModel,
+ PropertyNames.PROPERTY_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))
+
+ Helper.setUnoPropertyValue(
+ self.oRoadmap, "Text",
+ self.__oWizardResource.getResText(UIConsts.RID_COMMON + 16))
+ except NoSuchMethodException, ex:
+ Resource.showCommonResourceError(xMSF)
+ except Exception, jexception:
+ traceback.print_exc()
+
+ def setRMItemLabels(self, _oResource, StartResID):
+ self.sRMItemLabels = _oResource.getResArray(
+ StartResID, self.nMaxStep)
+
+ def insertRoadmapItem(self, Index, _bEnabled, _sLabel, _CurItemID):
+ try:
+ if isinstance(_sLabel, int):
+ _sLabel = self.sRMItemLabels(_sLabel)
+ oRoadmapItem = self.oRoadmap.createInstance()
+ Helper.setUnoPropertyValue(oRoadmapItem,
+ PropertyNames.PROPERTY_LABEL, _sLabel)
+ Helper.setUnoPropertyValue(oRoadmapItem,
+ PropertyNames.PROPERTY_ENABLED, _bEnabled)
+ Helper.setUnoPropertyValue(oRoadmapItem, "ID", _CurItemID)
+ self.oRoadmap.insertByIndex(Index, oRoadmapItem)
+ except Exception, exception:
+ traceback.print_exc()
+
+ def getRoadmapItemByID(self, _ID):
+ try:
+ getByIndex = self.oRoadmap.getByIndex
+ for i in xrange(self.oRoadmap.Count):
+ CurRoadmapItem = getByIndex(i)
+ CurID = int(Helper.getUnoPropertyValue(CurRoadmapItem, "ID"))
+ if CurID == _ID:
+ return CurRoadmapItem
+
+ return None
+ except Exception, 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.setControlProperty(
+ "btnWizardNext", "DefaultButton", False)
+ self.setControlProperty(
+ "btnWizardFinish", "DefaultButton", True)
+ else:
+ self.setControlProperty(
+ "btnWizardNext", "DefaultButton", True)
+ self.setControlProperty(
+ "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):
+ Helper.setUnoPropertyValue(self.xDialogModel,
+ PropertyNames.PROPERTY_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 = Helper.getUnoPropertyValue(self.xDialogModel,
+ PropertyNames.PROPERTY_HEIGHT)
+ iDialogWidth = Helper.getUnoPropertyValue(self.xDialogModel,
+ PropertyNames.PROPERTY_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)
+ Helper.setUnoPropertyValue(
+ self.xDialogModel, PropertyNames.PROPERTY_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,
+ self.__oWizardResource.getResText(UIConsts.RID_COMMON + 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),
+ self.__oWizardResource.getResText(UIConsts.RID_COMMON + 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),
+ self.__oWizardResource.getResText(UIConsts.RID_COMMON + 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),
+ self.__oWizardResource.getResText(UIConsts.RID_COMMON + 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),
+ self.__oWizardResource.getResText(UIConsts.RID_COMMON + 11),
+ iCancelPosX, iBtnPosY, uno.Any("short",STANDARD), iCurStep,
+ uno.Any("short",(curtabindex + 1)),
+ iButtonWidth), self)
+ self.setControlProperty("btnWizardNext", "DefaultButton", True)
+ except Exception, exception:
+ traceback.print_exc()
+
+ def insertRoadMapItems(self, enabled, items):
+ for index, item in enumerate(items):
+ self.insertRoadmapItem(index, enabled[index], item, index + 1)
+
+ def setStepEnabled(self, _nStep, bEnabled, enableNextButton=None):
+ xRoadmapItem = self.getRoadmapItemByID(_nStep)
+ if xRoadmapItem is not None:
+ Helper.setUnoPropertyValue(xRoadmapItem,
+ PropertyNames.PROPERTY_ENABLED, bEnabled)
+ if enableNextButton is not None:
+ if self.getNextAvailableStep() > 0:
+ self.enableNextButton(bEnabled)
+
+ def enableNavigationButtons(
+ self, _bEnableBack, _bEnableNext, _bEnableFinish):
+ self.enableBackButton(_bEnableBack)
+ self.enableNextButton(_bEnableNext)
+ self.enableFinishButton(_bEnableFinish)
+
+ def enableBackButton(self, enabled):
+ self.setControlProperty("btnWizardBack",
+ PropertyNames.PROPERTY_ENABLED, enabled)
+
+ def enableNextButton(self, enabled):
+ self.setControlProperty("btnWizardNext",
+ PropertyNames.PROPERTY_ENABLED, enabled)
+
+ def enableFinishButton(self, enabled):
+ self.setControlProperty("btnWizardFinish",
+ PropertyNames.PROPERTY_ENABLED, enabled)
+
+ def enablefromStep(self, _iStep, _bDoEnable):
+ if _iStep <= self.nMaxStep:
+ for i in xrange(_iStep, self.nMaxStep):
+ self.setStepEnabled(i, _bDoEnable)
+ enableFinishButton(_bDoEnable)
+ if not _bDoEnable:
+ enableNextButton(_iStep > getCurrentStep() + 1)
+ else:
+ enableNextButton(not (getCurrentStep() == self.nMaxStep))
+
+ 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(Helper.getUnoPropertyValue(xRoadmapItem,
+ PropertyNames.PROPERTY_ENABLED))
+ return bIsEnabled
+ except Exception, 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, e:
+ traceback.print_exc()
+
+ #TODO discuss with rp
+
+ 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, e:
+ 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, e:
+ traceback.print_exc()
+
+ def getMaximalStep(self):
+ return self.nMaxStep
+
+ def getCurrentStep(self):
+ try:
+ return int(Helper.getUnoPropertyValue(self.xDialogModel,
+ PropertyNames.PROPERTY_STEP))
+ except Exception, exception:
+ traceback.print_exc()
+ return -1
+
+ def setCurrentStep(self, _nNewstep):
+ self.nNewStep = _nNewstep
+ changeToStep(self.nNewStep)
+
+ def setRightPaneHeaders(self, _oResource, StartResID, _nMaxStep):
+ self.sRightPaneHeaders = _oResource.getResArray(StartResID, _nMaxStep)
+ setRightPaneHeaders(self.sRightPaneHeaders)
+
+ def setRightPaneHeaders(self, _sRightPaneHeaders):
+ self.nMaxStep = _sRightPaneHeaders.length
+ self.sRightPaneHeaders = _sRightPaneHeaders
+ oFontDesc = FontDescriptor.FontDescriptor()
+ oFontDesc.Weight = com.sun.star.awt.FontWeight.BOLD
+ i = 0
+ while i < self.sRightPaneHeaders.length:
+ insertLabel("lblQueryTitle" + String.valueOf(i),("FontDescriptor",
+ PropertyNames.PROPERTY_HEIGHT,
+ PropertyNames.PROPERTY_LABEL,
+ PropertyNames.PROPERTY_MULTILINE,
+ PropertyNames.PROPERTY_POSITION_X,
+ PropertyNames.PROPERTY_POSITION_Y,
+ PropertyNames.PROPERTY_STEP,
+ PropertyNames.PROPERTY_TABINDEX,
+ PropertyNames.PROPERTY_WIDTH),(
+ oFontDesc, 16, self.sRightPaneHeaders(i),
+ True, 91, 8, i + 1, 12, 212))
+ i += 1
+
+ def cancelWizard(self):
+ #can be overwritten by extending class
+ self.xUnoDialog.endExecute()
+
+ def removeTerminateListener(self):
+ if self.__bTerminateListenermustberemoved:
+ Desktop.getDesktop(self.xMSF).removeTerminateListener( \
+ TerminateListenerProcAdapter(self))
+ 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,e:
+ traceback.print_exc()
+
+ def queryTermination(self):
+ self.activate()
+ raise TerminationVetoException()
+
+ def optCreateFromTemplateItemChanged(self):
+ self.bEditTemplate = False
+
+ def optMakeChangesItemChanged(self):
+ self.bEditTemplate = True
+
+ def optReceiverPlaceholderItemChanged(self):
+ OfficeDocument.attachEventCall(
+ TextDocument.xTextDocument, "OnNew", "StarBasic",
+ "macro:///Template.Correspondence.Placeholder()")
+
+ def optReceiverDatabaseItemChanged(self):
+ OfficeDocument.attachEventCall(
+ TextDocument.xTextDocument, "OnNew", "StarBasic",
+ "macro:///Template.Correspondence.Database()")
+
+ class myPathSelectionListener(XPathSelectionListener):
+
+ def validatePath(self):
+ if self.myPathSelection.usedPathPicker:
+ self.filenameChanged = True
+
+ self.myPathSelection.usedPathPicker = False
diff --git a/wizards/com/sun/star/wizards/ui/__init__.py b/wizards/com/sun/star/wizards/ui/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/__init__.py
diff --git a/wizards/com/sun/star/wizards/ui/event/DataAware.py b/wizards/com/sun/star/wizards/ui/event/DataAware.py
new file mode 100644
index 000000000000..2a4f5cf6531d
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/event/DataAware.py
@@ -0,0 +1,114 @@
+import traceback
+from abc import ABCMeta, abstractmethod
+from wizards.common.PropertyNames import *
+from wizards.ui.event.CommonListener import *
+
+'''
+@author rpiterman
+DataAware objects are used to live-synchronize UI and DataModel/DataObject.
+It is used as listener on UI events, to keep the DataObject up to date.
+This class, as a base abstract class, sets a frame of functionality,
+delegating the data Object get/set methods to a Value object,
+and leaving the UI get/set methods abstract.
+Note that event listenning is *not* a part of this model.
+the updateData() or updateUI() methods should be porogramatically called.
+in child classes, the updateData() will be binded to UI event calls.
+<br><br>
+This class holds references to a Data Object and a Value object.
+The Value object "knows" how to get and set a value from the
+Data Object.
+'''
+
+class DataAware(object):
+ __metaclass__ = ABCMeta
+
+ '''
+ creates a DataAware object for the given data object and Value object.
+ @param dataObject_
+ @param value_
+ '''
+
+ def __init__(self, dataObject_, field_):
+ self._dataObject = dataObject_
+ self._field = field_
+
+ def enableControls(self, value):
+ pass
+
+ '''
+ sets the given value to the UI control
+ @param newValue the value to set to the ui control.
+ '''
+ @abstractmethod
+ def setToUI (self,newValue):
+ pass
+
+ '''
+ gets the current value from the UI control.
+ @return the current value from the UI control.
+ '''
+
+ @abstractmethod
+ def getFromUI (self):
+ pass
+
+ '''
+ updates the UI control according to the
+ current state of the data object.
+ '''
+
+ def updateUI(self):
+ data = getattr(self._dataObject, self._field)
+ ui = self.getFromUI()
+ if data is not ui:
+ try:
+ self.setToUI(data)
+ except Exception, ex:
+ traceback.print_exc()
+ #TODO tell user...
+ self.enableControls(data)
+
+ '''
+ sets a new data object. Optionally
+ update the UI.
+ @param obj the new data object.
+ @param updateUI if true updateUI() will be called.
+ '''
+
+ def setDataObject(self, obj, updateUI):
+ if obj is not None and not isinstance(obj, type(self._field)):
+ return
+
+ self._dataObject = obj
+
+ if updateUI:
+ self.updateUI()
+
+ '''
+ updates the DataObject according to
+ the current state of the UI control.
+ '''
+
+ def updateData(self):
+ try:
+ data = getattr(self._dataObject, self._field)
+ ui = self.getFromUI()
+ if data is not ui:
+ if isinstance(ui,tuple):
+ #Selected Element listbox
+ ui = ui[0]
+ setattr(self._dataObject, self._field, ui)
+ self.enableControls(ui)
+ except Exception:
+ traceback.print_exc()
+
+ '''
+ given a collection containing DataAware objects,
+ calls updateUI() on each memebr of the collection.
+ @param dataAwares a collection containing DataAware objects.
+ '''
+
+ @classmethod
+ def updateUIs(self, dataAwares):
+ for i in dataAwares:
+ i.updateUI()
diff --git a/wizards/com/sun/star/wizards/ui/event/ListModelBinder.py b/wizards/com/sun/star/wizards/ui/event/ListModelBinder.py
new file mode 100644
index 000000000000..1a8878f8b6cc
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/event/ListModelBinder.py
@@ -0,0 +1,75 @@
+from wizards.common.Helper import Helper
+
+class ListModelBinder(object):
+
+ def __init__(self, unoListBox, listModel_):
+ self.unoList = unoListBox
+ self.unoListModel = unoListBox.Model
+ #COMMENTED
+ #self.setListModel(listModel_)
+
+ def setListModel(self, newListModel):
+ if self.listModel is not None:
+ self.listModel.removeListDataListener(self)
+
+ self.listModel = newListModel
+ self.listModel.addListDataListener(this)
+
+ def contentsChanged(self, lde):
+ selected = getSelectedItems()
+ i = lde.getIndex0()
+ while i <= lde.getIndex1():
+ update(i)
+ i += 1
+ setSelectedItems(selected)
+
+ def update(self, i):
+ remove(i, i)
+ insert(i)
+
+ def remove(self, i1, i2):
+ self.unoList.removeItems(i1, i2 - i1 + 1)
+
+ def insert(self, i):
+ self.unoList.addItem(getItemString(i), i)
+
+ def getItemString(self, i):
+ return getItemString(self.listModel.getElementAt(i))
+
+ def getItemString(self, item):
+ return self.renderer.render(item)
+
+ def getSelectedItems(self):
+ return Helper.getUnoPropertyValue(self.unoListModel, "SelectedItems")
+
+ def setSelectedItems(self, selected):
+ Helper.setUnoPropertyValue(self.unoListModel, "SelectedItems", selected)
+
+ def intervalAdded(self, lde):
+ for i in xrange(lde.Index0, lde.Index1):
+ insert(i)
+
+ def intervalRemoved(self, lde):
+ remove(lde.Index0, lde.Index1)
+
+ @classmethod
+ def fillList(self, xlist, items, renderer):
+ Helper.setUnoPropertyValue(xlist.Model, "StringItemList", ())
+ for index,item in enumerate(items):
+ if item is not None:
+ if renderer is not None:
+ aux = renderer.render(index)
+ else:
+ aux = item.cp_Name
+ xlist.addItem(aux, index)
+
+ @classmethod
+ def fillComboBox(self, xComboBox, items, renderer):
+ Helper.setUnoPropertyValue(xComboBox.Model, "StringItemList", ())
+ for index,item in enumerate(items):
+ if item is not None:
+ if renderer is not None:
+ aux = renderer.render(index)
+ else:
+ aux = item.toString()
+ xComboBox.addItem(aux, index)
diff --git a/wizards/com/sun/star/wizards/ui/event/RadioDataAware.py b/wizards/com/sun/star/wizards/ui/event/RadioDataAware.py
new file mode 100644
index 000000000000..a2ef2940c54f
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/event/RadioDataAware.py
@@ -0,0 +1,37 @@
+from wizards.ui.event.DataAware import *
+from wizards.ui.event.UnoDataAware import *
+import time
+'''
+@author rpiterman
+To change the template for this generated type comment go to
+Window>Preferences>Java>Code Generation>Code and Comments
+'''
+
+class RadioDataAware(DataAware):
+
+ def __init__(self, data, value, radioButtons):
+ super(RadioDataAware,self).__init__(data, value)
+ self.radioButtons = radioButtons
+
+ def setToUI(self, value):
+ selected = int(value)
+ if selected == -1:
+ for i in self.radioButtons:
+ i.State = False
+ else:
+ self.radioButtons[selected].State = True
+
+ def getFromUI(self):
+ for index, workwith in enumerate(self.radioButtons):
+ if workwith.State:
+ return index
+
+ return -1
+
+ @classmethod
+ def attachRadioButtons(self, data, prop, buttons, field):
+ da = RadioDataAware(data, prop, buttons)
+ method = getattr(da,"updateData")
+ for i in da.radioButtons:
+ i.addItemListener(ItemListenerProcAdapter(method))
+ return da
diff --git a/wizards/com/sun/star/wizards/ui/event/UnoDataAware.py b/wizards/com/sun/star/wizards/ui/event/UnoDataAware.py
new file mode 100644
index 000000000000..3c7e77ff016d
--- /dev/null
+++ b/wizards/com/sun/star/wizards/ui/event/UnoDataAware.py
@@ -0,0 +1,84 @@
+from wizards.ui.event.DataAware import *
+from wizards.common.Helper import *
+
+'''
+@author rpiterman
+This class suppoprts imple cases where a UI control can
+be directly synchronized with a data property.
+Such controls are: the different text controls
+(synchronizing the "Text" , "Value", "Date", "Time" property),
+Checkbox controls, Dropdown listbox controls (synchronizing the
+SelectedItems[] property.
+For those controls, static convenience methods are offered, to simplify use.
+'''
+
+class UnoDataAware(DataAware):
+
+ disableObjects = []
+
+ def __init__(self, dataObject, field, unoObject_, unoPropName_, isShort=False):
+ super(UnoDataAware,self).__init__(dataObject, field)
+ self.unoControl = unoObject_
+ self.unoModel = self.unoControl.Model
+ self.unoPropName = unoPropName_
+ self.isShort = isShort
+
+ def enableControls(self, value):
+ for i in self.disableObjects:
+ Helper.setUnoPropertyValue(
+ i.Model, PropertyNames.PROPERTY_ENABLED, bool(value))
+
+ def setToUI(self, value):
+ if self.isShort:
+ value = uno.Any("[]short", (value,))
+ Helper.setUnoPropertyValue(self.unoModel, self.unoPropName, value)
+
+ def getFromUI(self):
+ return Helper.getUnoPropertyValue(self.unoModel, self.unoPropName)
+
+ @classmethod
+ def __attachTextControl(
+ self, data, prop, unoText, unoProperty, field, value):
+ uda = UnoDataAware(data, prop, unoText, unoProperty)
+ method = getattr(uda,"updateData")
+ unoText.addTextListener(TextListenerProcAdapter(method))
+ return uda
+
+ @classmethod
+ def attachEditControl(self, data, prop, unoControl, field):
+ return self.__attachTextControl(
+ data, prop, unoControl, "Text", field, "")
+
+ @classmethod
+ def attachDateControl(self, data, prop, unoControl, field):
+ return self.__attachTextControl(
+ data, prop, unoControl, "Date", field, 0)
+
+ @classmethod
+ def attachTimeControl(self, data, prop, unoControl, field):
+ return self.__attachTextControl(
+ data, prop, unoControl, "Time", field, 0)
+
+ @classmethod
+ def attachNumericControl(self, data, prop, unoControl, field):
+ return self.__attachTextControl(
+ data, prop, unoControl, "Value", field, float(0))
+
+ @classmethod
+ def attachCheckBox(
+ self, data, prop, checkBox, field):
+ uda = UnoDataAware(data, prop, checkBox, PropertyNames.PROPERTY_STATE)
+ method = getattr(uda,"updateData")
+ checkBox.addItemListener(ItemListenerProcAdapter(method))
+ return uda
+
+ @classmethod
+ def attachLabel(self, data, prop, label, field):
+ return UnoDataAware(data, prop, label, PropertyNames.PROPERTY_LABEL)
+
+ @classmethod
+ def attachListBox(self, data, prop, listBox, field):
+ uda = UnoDataAware(data, prop, listBox, "SelectedItems", True)
+ method = getattr(uda,"updateData")
+ listBox.addItemListener(ItemListenerProcAdapter(method))
+ return uda