diff options
author | Xisco Fauli <anistenis@gmail.com> | 2011-09-23 00:29:10 +0200 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2011-12-05 20:53:22 +0000 |
commit | 21131ea640f158963d4b69b1269c0bc7e5215006 (patch) | |
tree | d9d3336fd307764a30f3366c19b6f2275ccac9dd /wizards | |
parent | 02d490ad83d31cb0dc342c6efb63837d820a8d88 (diff) |
Set the python fax wizard as the default one
Diffstat (limited to 'wizards')
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 >xxx< 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 ">*<" + @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 |