[Libreoffice-commits] .: Branch 'feature/gsoc2011_wizards' - wizards/com
Xisco Fauli
xfauli at kemper.freedesktop.org
Thu Jul 21 10:27:19 PDT 2011
wizards/com/sun/star/wizards/RemoteAgendaWizard | 6
wizards/com/sun/star/wizards/agenda/AgendaTemplate.py | 1191 ++++++++++
wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py | 280 ++
wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py | 47
wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py | 386 +++
wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py | 154 +
wizards/com/sun/star/wizards/agenda/CGAgenda.py | 27
wizards/com/sun/star/wizards/agenda/CGTopic.py | 45
wizards/com/sun/star/wizards/agenda/TemplateConsts.py | 110
wizards/com/sun/star/wizards/agenda/TopicsControl.py | 909 +++++++
wizards/com/sun/star/wizards/common/ConfigSet.py | 227 +
wizards/com/sun/star/wizards/common/Desktop.py | 100
wizards/com/sun/star/wizards/common/FileAccess.py | 5
wizards/com/sun/star/wizards/common/SystemDialog.py | 13
wizards/com/sun/star/wizards/text/TextDocument.py | 2
wizards/com/sun/star/wizards/text/TextSectionHandler.py | 33
wizards/com/sun/star/wizards/ui/ControlScroller.py | 293 ++
wizards/com/sun/star/wizards/ui/UnoDialog.py | 101
wizards/com/sun/star/wizards/ui/UnoDialog2.py | 13
wizards/com/sun/star/wizards/ui/WizardDialog.py | 6
wizards/com/sun/star/wizards/ui/event/RadioDataAware.py | 6
wizards/com/sun/star/wizards/ui/event/UnoDataAware.py | 1
22 files changed, 3832 insertions(+), 123 deletions(-)
New commits:
commit e070214c12e6fc03ab25e3a61b1c30eec92c7261
Author: Xisco Fauli <anistenis at gmail.com>
Date: Thu Jul 21 19:24:50 2011 +0200
First attempt to create the Agenda Wizard
the Document preview and the wizard are already shown
diff --git a/wizards/com/sun/star/wizards/RemoteAgendaWizard b/wizards/com/sun/star/wizards/RemoteAgendaWizard
new file mode 100755
index 0000000..996ad35
--- /dev/null
+++ b/wizards/com/sun/star/wizards/RemoteAgendaWizard
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+from agenda.AgendaWizardDialogImpl import AgendaWizardDialogImpl
+import sys
+
+if __name__ == "__main__":
+ AgendaWizardDialogImpl.main(sys.argv)
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 0000000..274da3e
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaTemplate.py
@@ -0,0 +1,1191 @@
+from text.TextDocument import *
+from uno import Any
+from TemplateConsts import *
+from common.FileAccess import FileAccess
+from common.Helper import Helper
+from com.sun.star.i18n.NumberFormatIndex import TIME_HHMM, DATE_SYSTEM_LONG
+from text.TextSectionHandler import TextSectionHandler
+from com.sun.star.text.PlaceholderType import TEXT
+from TopicsControl import TopicsControl
+from threading import RLock
+
+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.
+ at author rpiterman
+'''
+class AgendaTemplate(TextDocument):
+
+ DAY_IN_MILLIS = (24 * 60 * 60 * 1000)
+ 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")
+ Topics.writeAll(topicsData)
+ 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
+ '''
+
+ @synchronized(lock)
+ def redraw(self, itemName):
+ try:
+ # get the table in which the item is...
+ itemsTable = AgendaTemplate.itemsMap.get(itemName)
+ # rewrite the table.
+ itemsTable.write(None)
+ except Exception, e:
+ traceback.print_exc()
+
+ '''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, STYLE_MEETING_TYPE), PlaceholderElement(STYLE_MEETING_TYPE_TEXT, self.resources.reschkMeetingTitle_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_BRING] = AgendaItem(FILLIN_BRING, TextElement (self.resources.itemBring, STYLE_BRING), PlaceholderElement (STYLE_BRING_TEXT, self.resources.reschkBring_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_READ] = AgendaItem (FILLIN_READ, TextElement (self.resources.itemRead, STYLE_READ), PlaceholderElement (STYLE_READ_TEXT, self.resources.reschkRead_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_NOTES] = AgendaItem (FILLIN_NOTES, TextElement (self.resources.itemNote, STYLE_NOTES), PlaceholderElement (STYLE_NOTES_TEXT, self.resources.reschkNotes_value, self.resources.resPlaceHolderHint, self.xMSF))
+ # Names
+ AgendaTemplate.itemsCache[FILLIN_CALLED_BY] = AgendaItem (FILLIN_CALLED_BY, TextElement (self.resources.itemCalledBy, STYLE_CALLED_BY), PlaceholderElement (STYLE_CALLED_BY_TEXT, self.resources.reschkConvenedBy_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_FACILITATOR] =AgendaItem (FILLIN_FACILITATOR, TextElement (self.resources.itemFacilitator, STYLE_FACILITATOR), PlaceholderElement (STYLE_FACILITATOR_TEXT, self.resources.reschkPresiding_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_PARTICIPANTS] = AgendaItem (FILLIN_PARTICIPANTS, TextElement (self.resources.itemAttendees, STYLE_PARTICIPANTS), PlaceholderElement (STYLE_PARTICIPANTS_TEXT, self.resources.reschkAttendees_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_NOTETAKER] = AgendaItem (FILLIN_NOTETAKER, TextElement (self.resources.itemNotetaker, STYLE_NOTETAKER), PlaceholderElement (STYLE_NOTETAKER_TEXT, self.resources.reschkNoteTaker_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_TIMEKEEPER] = AgendaItem (FILLIN_TIMEKEEPER, TextElement (self.resources.itemTimekeeper, STYLE_TIMEKEEPER), PlaceholderElement (STYLE_TIMEKEEPER_TEXT, self.resources.reschkTimekeeper_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_OBSERVERS] = AgendaItem (FILLIN_OBSERVERS, TextElement (self.resources.itemObservers, STYLE_OBSERVERS), PlaceholderElement (STYLE_OBSERVERS_TEXT, self.resources.reschkObservers_value, self.resources.resPlaceHolderHint, self.xMSF))
+ AgendaTemplate.itemsCache[FILLIN_RESOURCE_PERSONS] = AgendaItem (FILLIN_RESOURCE_PERSONS, TextElement (self.resources.itemResource, STYLE_RESOURCE_PERSONS), PlaceholderElement (STYLE_RESOURCE_PERSONS_TEXT, 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.
+ '''
+ dateUtils = Helper.DateUtils(self.xMSF, AgendaTemplate.document)
+ self.formatter = dateUtils.formatter
+ self.dateFormat = dateUtils.getFormat(DATE_SYSTEM_LONG)
+ self.timeFormat = 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:
+ self.teTitle = PlaceholderTextElement(workwith, self.resources.resPlaceHolderTitle, self.resources.resPlaceHolderHint, AgendaTemplate.document)
+ self.trTitle = workwith
+ del AgendaTemplate._allItems[i]
+ i -= 1
+ elif text == FILLIN_DATE:
+ self.teDate = PlaceholderTextElement(workwith, self.resources.resPlaceHolderDate, self.resources.resPlaceHolderHint, AgendaTemplate.document)
+ self.trDate = workwith
+ del AgendaTemplate._allItems[i]
+ i -= 1
+ elif text == FILLIN_TIME:
+ self.teTime = PlaceholderTextElement(workwith, self.resources.resPlaceHolderTime, self.resources.resPlaceHolderHint, AgendaTemplate.document)
+ self.trTime = workwith
+ del AgendaTemplate._allItems[i]
+ i -= 1
+ elif text == FILLIN_LOCATION:
+ self.teLocation = PlaceholderTextElement(workwith, self.resources.resPlaceHolderLocation, self.resources.resPlaceHolderHint, AgendaTemplate.document)
+ self.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 xrange(len(sections)):
+ try:
+ self.itemsTables.append(ItemsTable(self.getSection(sections[i]), self.getTable(sections[i])))
+ except Exception, ex:
+ traceback.print_exc()
+ raise IllegalArgumentException ("Fatal Error while initialilzing Template: items table in section " + sections[i]);
+
+
+ def getSections(self, document, s):
+ allSections = document.TextSections.ElementNames
+ return self.getNamesWhichStartWith(allSections, s)
+
+ @classmethod
+ def getSection(self, name):
+ return AgendaTemplate.document.TextSections.getByName(name)
+
+ @classmethod
+ def getTable(self, name):
+ return AgendaTemplate.document.TextTables.getByName(name)
+
+ '''
+ implementation of DataAware.Listener, is
+ called when title/date/time or location are
+ changed.
+ '''
+
+ @synchronized(lock)
+ def eventPerformed(self, param):
+ controlName = Helper.getUnoPropertyValue(UnoDialog2.getModel(param.Source), PropertyNames.PROPERTY_NAME)
+ self.redrawTitle(controlName)
+
+ @synchronized(lock)
+ def redrawTitle(self, controlName):
+ if controlName == "txtTitle":
+ self.writeTitle(self.teTitle, self.trTitle, AgendaTemplate.agenda.cp_Title)
+ elif controlName == "txtDate":
+ self.writeTitle(self.teDate, self.trDate, self.getDateString(AgendaTemplate.agenda.cp_Date))
+ elif controlName == "txtTime":
+ self.writeTitle(self.teTime, self.trTime, self.getTimeString(AgendaTemplate.agenda.cp_Time))
+ elif controlName == "cbLocation":
+ self.writeTitle(self.teLocation, self.trLocation, AgendaTemplate.agenda.cp_Location)
+ else:
+ raise IllegalArgumentException ("No such title control...");
+
+ def writeTitle(self, te, tr, text):
+ if text is None:
+ te.text = ""
+ else:
+ te.text = text
+ te.write(tr)
+
+ def getDateString(self, d):
+ if d is None or d == "":
+ return ""
+
+ date = Integer(d).intValue.intValue()
+ self.calendar.clear()
+ self.calendar.set(date / 10000, (date % 10000) / 100 - 1, date % 100)
+ date1 = JavaTools.getTimeInMillis(self.calendar)
+ '''
+ docNullTime and date1 are in millis, but
+ I need a day...
+ '''
+ daysDiff = (date1 - self.docNullTime) / self.__class__.DAY_IN_MILLIS + 1
+ return self.formatter.convertNumberToString(self.dateFormat, daysDiff)
+
+ def getTimeString(self, s):
+ if s == None or s == "":
+ return ""
+
+ time = Integer(s).intValue.intValue()
+ t = ((double)(time / 1000000) / 24) + ((double)((time % 1000000) / 1000) / (24 * 60))
+ return self.formatter.convertNumberToString(self.timeFormat, t)
+
+ @synchronized(lock)
+ def finish(self, topics):
+ createMinutes(topics)
+ 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 = 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 (topicsData.size() <= 1):
+ try:
+ minutesAllSection = getSection(SECTION_MINUTES_ALL)
+ minutesAllSection.Anchor.String = ""
+ except Exception, ex:
+ traceback.print_exc()
+
+ # the user checked "create minutes"
+ else:
+ try:
+ topicStartTime = 0
+ try:
+ topicStartTime = Integer(AgendaTemplate.agenda.cp_Time).intValue.intValue()
+ except Exception, ex:
+ pass
+ #first I replace the minutes titles...
+ AgendaTemplate.items = searchFillInItems()
+ itemIndex = 0
+ while itemIndex < self.items.size():
+ item = (XTextRange)
+ self.items.get(itemIndex)
+ itemText = item.getString().trim().toLowerCase()
+ if itemText == FILLIN_MINUTES_TITLE:
+ fillMinutesItem(item, AgendaTemplate.agenda.cp_Title, self.resources.resPlaceHolderTitle)
+ elif itemText == FILLIN_MINUTES_LOCATION:
+ fillMinutesItem(item, AgendaTemplate.agenda.cp_Location, self.resources.resPlaceHolderLocation)
+ elif itemText == FILLIN_MINUTES_DATE:
+ fillMinutesItem(item, getDateString(AgendaTemplate.agenda.cp_Date), self.resources.resPlaceHolderDate)
+ elif itemText == FILLIN_MINUTES_TIME:
+ fillMinutesItem(item, getTimeString(AgendaTemplate.agenda.cp_Time), self.resources.resPlaceHolderTime)
+
+ itemIndex += 1
+ 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...
+ '''
+
+ i = 0
+ while i < topicsData.size() - 1:
+ topic = topicsData.get(i)
+ AgendaTemplate.items = searchFillInItems()
+ itemIndex = 0
+ while itemIndex < self.items.size():
+ item = (XTextRange)
+ self.items.get(itemIndex)
+ itemText = item.getString().trim().toLowerCase()
+ 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 = (String)
+ topic[3].Value
+ else:
+ time = getTimeString(String.valueOf(topicStartTime)) + " - "
+ topicStartTime += topicTime * 1000
+ time += getTimeString(String.valueOf(topicStartTime))
+
+ fillMinutesItem(item, time, "")
+
+ itemIndex += 1
+ AgendaTemplate.textSectionHandler.removeTextSectionbyName(SECTION_MINUTES)
+ # after the last section we do not insert a one.
+ if i < topicsData.size() - 2:
+ AgendaTemplate.textSectionHandler.insertTextSection(SECTION_MINUTES, AgendaTemplate.template, False)
+
+ i += 1
+ 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.getStart().getText().insertTextContent(range.getStart(), 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", 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 removing a number of cells from a table.
+ @param table
+ @param start
+ @param count
+ '''
+
+ @classmethod
+ def removeTableRows(self, table, start, count):
+ rows = table.Rows
+ rows.removeByIndex(start, count)
+
+ '''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.
+ '''
+
+ def __init__(self, section_, table_):
+ Topics.table = table_
+ self.section = section_
+ '''
+ 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 == Topics.table:
+ iText = workwith.String.lower().lstrip()
+ ai = AgendaTemplate.itemsCache.get(iText)
+ if ai is not None:
+ AgendaTemplate.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(self.section, AgendaTemplate.template, name)
+ AgendaTemplate.textSectionHandler.breakLinkOfTextSection(self.section)
+ # we need to get a instance after linking.
+ Topics.table = AgendaTemplate.getTable(name)
+ self.section = AgendaTemplate.getSection(name)
+ cursor = Topics.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 AgendaTemplate.items:
+ if AgendaTemplate.isShowItem(i.name):
+ visible = True
+ i.table = Topics.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 = xTextTable.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(Topics.table)
+ '''
+ now before deleteing i move the cursor up so it
+ does not disappear, because it will crash office.
+ '''
+ cursor.gotoStart(False)
+ if rowsCount >= rowIndex:
+ pass
+ #COMMENTED
+ #removeTableRows(Topics.table, rowIndex - 1, (rowsCount - rowIndex) + 1)
+
+'''
+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.
+
+ at 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
+
+ def __init__(self):
+ self.topicItems = {}
+ self.topicCells = []
+ self.topicCellFormats = []
+ 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.String
+ 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)
+ self.rowsPerTopic = (rows - 1) / 3
+ firstCell = "A" + str(1 + self.rowsPerTopic + 1)
+ afterLastCell = "A" + str(1 + (self.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.
+ if items[cell.String] is not None:
+ self.topicItems[cell.String.lower().lstrip()] = ae
+
+ self.topicCells.append(ae)
+ # and store the format of the cell.
+ self.topicCellFormats.append( TableCellFormatter(Topics.table.getCellByName(cursor.RangeName)))
+ # goto next cell.
+ cursor.goRight(1, False)
+ '''
+ now - in which cell is every fillin?
+ '''
+ Topics.numCell = self.topicCells.index(self.topicItems[FILLIN_TOPIC_NUMBER])
+ Topics.topicCell = self.topicCells.index(self.topicItems[FILLIN_TOPIC_TOPIC])
+ Topics.responsibleCell = self.topicCells.index(self.topicItems[FILLIN_TOPIC_RESPONSIBLE])
+ Topics.timeCell = self.topicCells.index(self.topicItems[FILLIN_TOPIC_TIME])
+ '''now that we know how the topics look like,
+ we get the format of the first and last rows.
+ '''
+ # format of first row
+ cursor.gotoStart(False)
+ tmp_do_var1 = True
+ while tmp_do_var1:
+ self.firstRowFormat.append(TableCellFormatter (Topics.table.getCellByName(cursor.RangeName)))
+ cursor.goRight(1, False)
+ tmp_do_var1 = not cursor.RangeName.startswith("A")
+ # format of the last row
+ cursor.gotoEnd(False)
+ while not cursor.RangeName.startswith("A"):
+ Topics.lastRowFormat.append(TableCellFormatter (Topics.table.getCellByName(cursor.RangeName)))
+ cursor.goLeft(1, False)
+ # we missed the A cell - so we have to add it also..
+ Topics.lastRowFormat.append(TableCellFormatter (Topics.table.getCellByName(cursor.RangeName)))
+ #COMMENTED
+ #AgendaTemplate.removeTableRows(Topics.table, 1 + self.rowsPerTopic, rows - self.rowsPerTopic - 1)
+
+ '''@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.
+ '''
+
+ 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) * self.rowsPerTopic
+ firstRow = reqRows - self.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 self.topicCells:
+ i.write(Topics.table.getCellByName(cursor.RangeName))
+ cursor.goRight(1, False)
+ # now format !
+ cursor.gotoCellByName("A" + str(firstRow), False)
+ self.formatTable(cursor, self.topicCellFormats, 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 (AgendaTemplate.writtenTopics.size() > topic and AgendaTemplate.writtenTopics.get(topic) != 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 isWritten(topic):
+ write(topic, data)
+ # write only the "what" cell.
+ else:
+ # calculate the table row.
+ firstRow = 1 + (topic * self.rowsPerTopic) + 1
+ # go to the first cell of this topic.
+ cursor = Topics.table.createCursorByCellName("A" + firstRow)
+ te = None
+ cursorMoves = 0
+ tmp_switch_var1 = what
+ if tmp_switch_var1 == 0:
+ te = setItemText(Topics.numCell, data[0].Value)
+ cursorMoves = Topics.numCell
+ elif tmp_switch_var1 == 1:
+ te = setItemText(Topics.topicCell, data[1].Value)
+ cursorMoves = Topics.topicCell
+ elif tmp_switch_var1 == 2:
+ te = setItemText(Topics.responsibleCell, data[2].Value)
+ cursorMoves = Topics.responsibleCell
+ elif tmp_switch_var1 == 3:
+ te = 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)
+ (self.topicCellFormats.get(cursorMoves)).format(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()
+
+ '''Writes all the topics to thetopics table.
+ @param topicsData a List containing all Topic's Data.
+ '''
+
+ @classmethod
+ def writeAll(self, topicsData):
+ try:
+ i = 0
+ while i < (len(topicsData) - 1):
+ self.write2(i, topicsData[i])
+ i += 1
+ self.formatLastRow()
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''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.getRows()
+ targetNumOfRows = topics * self.rowsPerTopic + 1
+ if tableRows.getCount() > targetNumOfRows:
+ tableRows.removeByIndex(targetNumOfRows, tableRows.getCount() - targetNumOfRows)
+
+ formatLastRow()
+ while AgendaTemplate.writtenTopics.size() > topics:
+ AgendaTemplate.writtenTopics.remove(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.
+ '''
+
+ def setItemText(self, cell, value):
+ if cell >= 0:
+ te = self.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)
+
+'''
+TODO To change the template for this generated type comment go to
+Window - Preferences - Java - Code Style - Code Templates
+'''
+class ParaStyled(object):
+
+ paraStyle = ""
+
+ def __init__(self, paraStyle_):
+ ParaStyled.paraStyle = paraStyle_
+
+ def format(self, textRange):
+ if textRange is None:
+ textRange = textRange.Text
+ cursor = textRange.createTextCursorByRange(textRange)
+ Helper.setUnoPropertyValue(cursor, "ParaStyleName", ParaStyled.paraStyle)
+
+ def write(self, textRange):
+ self.format(textRange)
+
+'''
+A basic implementation of AgendaElement:
+writes a String to the given XText/XTextRange, and applies
+a ParaStyle to it (using the parent class).
+ at author rp143992
+'''
+class TextElement(ParaStyled):
+
+ def __init__(self, text_, paraStyle_=None):
+ if paraStyle_ is None:
+ self.text = text_.String
+ paraStyle_ = Helper.getUnoPropertyValue(text_.Start, "ParaStyleName")
+ else:
+ self.text = text_
+
+ super(TextElement,self).__init__(paraStyle_)
+
+ def write(self, textRange):
+ textRange.String = self.text
+ if not self.text == "":
+ super(TextElement,self).write(textRange)
+
+'''
+A Text element which, if the text to write is empty (null or "")
+inserts a placeholder instead.
+ at author rp143992
+
+TODO To change the template for this generated type comment go to
+Window - Preferences - Java - Code Style - Code Templates
+'''
+
+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):
+ super(PlaceholderTextElement,self).write(textRange)
+ 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.
+ at author rp143992
+'''
+
+class PlaceholderElement(ParaStyled):
+
+ def __init__(self, paraStyle, placeHolderText_, hint_, xmsf_):
+ super(PlaceholderElement,self).__init__(paraStyle)
+ 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)
+ super(PlaceholderElement,self).write(textRange)
+ 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.
+ at author rp143992
+
+TODO To change the template for this generated type comment go to
+Window - Preferences - Java - Code Style - Code Templates
+'''
+
+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 = Topics.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(cell)
+
+
+'''
+reads/write a table cell format from/to a table cell or a group of cells.
+'''
+class TableCellFormatter(object):
+ properties = ("BackColor", "BackTransparent", "BorderDistance",
+ "BottomBorderDistance", "LeftBorder",
+ "LeftBorderDistance", "RightBorder", "RightBorderDistance",
+ "TopBorder", "TopBorderDistance")
+
+ def __init__(self, tableCell):
+ self.values = []
+ for i in TableCellFormatter.properties:
+ pass
+ #COMMENTED
+ #self.values.append( Helper.getUnoPropertyValue(tableCell, i) )
+
+
+ def format(self, tableCell):
+ pass
+ #COMMENTED
+ #Helper.setUnoPropertyValues(
+ # tableCell, TableCellFormatter.properties, tuple(self.values))
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 0000000..ec8a2b0
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py
@@ -0,0 +1,280 @@
+from ui.WizardDialog import *
+from com.sun.star.awt.FontUnderline import SINGLE
+from AgendaWizardDialogConst import *
+from AgendaWizardDialogResources import *
+
+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", None, 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", None,
+ (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", None,
+ (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", None,
+ (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", None,
+ self.PROPS_CHECK,
+ (8, CHKMEETINGTITLE_HID, self.resources.reschkMeetingTitle_value,
+ 97, 32, 1, 3, 301, 69), self)
+ self.chkRead = self.insertCheckBox("chkRead", None, self.PROPS_CHECK,
+ (8, CHKREAD_HID, self.resources.reschkRead_value,
+ 97, 46, 0, 3, 302, 162), self)
+ self.chkBring = self.insertCheckBox("chkBring", None, self.PROPS_CHECK,
+ (8, CHKBRING_HID, self.resources.reschkBring_value,
+ 97, 60, 0, 3, 303, 162), self)
+ self.chkNotes = self.insertCheckBox("chkNotes", None, 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", None,
+ self.PROPS_CHECK, (8, CHKCONVENEDBY_HID,
+ self.resources.reschkConvenedBy_value, 97, 32, 1, 4, 401, 150), self)
+ self.chkPresiding = self.insertCheckBox("chkPresiding", None,
+ self.PROPS_CHECK, (8, CHKPRESIDING_HID,
+ self.resources.reschkPresiding_value, 97, 46, 0, 4, 402, 150), self)
+ self.chkNoteTaker = self.insertCheckBox("chkNoteTaker", None,
+ self.PROPS_CHECK, (8, CHKNOTETAKER_HID,
+ self.resources.reschkNoteTaker_value, 97, 60, 0, 4, 403, 150), self)
+ self.chkTimekeeper = self.insertCheckBox("chkTimekeeper", None,
+ self.PROPS_CHECK, (8, CHKTIMEKEEPER_HID,
+ self.resources.reschkTimekeeper_value, 97, 74, 0, 4, 404, 150), self)
+ self.chkAttendees = self.insertCheckBox("chkAttendees", None,
+ self.PROPS_CHECK, (8, CHKATTENDEES_HID,
+ self.resources.reschkAttendees_value, 97, 88, 1, 4, 405, 150), self)
+ self.chkObservers = self.insertCheckBox("chkObservers", None,
+ self.PROPS_CHECK, (8, CHKOBSERVERS_HID,
+ self.resources.reschkObservers_value, 97, 102, 0, 4, 406, 150), self)
+ self.chkResourcePersons = self.insertCheckBox("chkResourcePersons", None,
+ 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 0000000..dadd842
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py
@@ -0,0 +1,47 @@
+from common.HelpIds import HelpIds
+
+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 0000000..a29ea3c
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py
@@ -0,0 +1,386 @@
+from AgendaWizardDialog import *
+from common.Configuration import *
+from CGAgenda import CGAgenda
+from AgendaTemplate import *
+from common.NoValidPathException import *
+from common.FileAccess import *
+from ui.PathSelection import *
+from ui.event.UnoDataAware import *
+from ui.event.RadioDataAware import *
+
+from com.sun.star.awt.VclWindowPeerAttribute import OK
+from common.NoValidPathException import *
+
+class AgendaWizardDialogImpl(AgendaWizardDialog):
+
+ fileAccess1 = 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:
+ # read configuration data.
+ self.agenda = CGAgenda()
+ root = Configuration.getConfigurationRoot(
+ self.xMSF, "/org.openoffice.Office.Writer/Wizards/Agenda",
+ False)
+ self.agenda.readConfiguration(root, "cp_")
+ # initialize the agenda temself.myPathSelectionListener()plate
+ self.agendaTemplate = AgendaTemplate(
+ self.xMSF, self.agenda, self.resources, self)
+ self.initializeTemplates()
+ self.agendaTemplate.load(self.agendaTemplates[1][0], [])
+ # build the dialog.
+ self.buildStep1()
+ self.buildStep2()
+ self.buildStep3()
+ self.buildStep4()
+ self.buildStep5()
+ self.topicsControl = TopicsControl(self, self.xMSF, self.agenda)
+ self.buildStep6()
+ self.drawNaviBar()
+ self.initializePaths()
+ #special Control for setting the save Path:
+ self.insertPathSelectionControl()
+ # create the peer
+ xw = self.agendaTemplate.xFrame.getContainerWindow()
+ self.createWindowPeer(xw)
+ # initialize roadmap
+ self.addRoadmap()
+ self.insertRoadMapItems(
+ [self.resources.resStep1, self.resources.resStep2,
+ self.resources.resStep3, self.resources.resStep4,
+ self.resources.resStep5, self.resources.resStep6],
+ [1, 2, 3, 4, 5, 6],[True, True, True, True, True, True])
+ self.nMaxStep = 6
+ self.setCurrentRoadmapItemID(1)
+ # synchronize GUI and CGAgenda object.
+ self.makeDA()
+ if self.myPathSelection.xSaveTextBox.Text.lower() == "":
+ self.myPathSelection.initializePath()
+
+ 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.getOfficePath(xMSF, "Work", "", ""),
+ resources.resDefaultFilename)
+ except Exception, ex:
+ traceback.print_exc()
+
+ '''
+ bind controls to the agenda member (DataAware model)
+ '''
+
+ def makeDA(self):
+ self.setControlProperty(
+ "listPageDesign", "StringItemList", tuple(self.agendaTemplates[0]))
+ self.checkSavePath()
+ #setFilename(agenda.cp_TemplatePath);
+ 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)
+ 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()
+
+ '''
+ 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, item):
+ try:
+ self.agendaTemplate.load(
+ self.agendaTemplates[1][item.Selected],
+ self.topicsControl.scrollfields)
+ except Exception:
+ SystemDialog.showMessageBox(
+ self.xMSF, "ErrBox", OK, self.resources.resErrOpenTemplate)
+ traceback.print_exc()
+
+ '''
+ last page, template title changed...
+ '''
+
+ def templateTitleChanged(self):
+ title = Helper.getUnoPropertyValue(getModel(txtTemplateName), "Text")
+ self.agendaTemplate.setTemplateTitle(title)
+
+ '''
+ 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):
+ bSaveSuccess = False
+ # pesimistic :(
+ try:
+ fileAccess = FileAccess.FileAccess_unknown(xMSF)
+ self.sPath = self.myPathSelection.getSelectedPath()
+ if self.sPath.equals(""):
+ 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(
+ xMSF, xControl.Peer, "MessBox",
+ VclWindowPeerAttribute.YES_NO + \
+ VclWindowPeerAttribute.DEF_NO,
+ resources.resFileExists)
+ if (answer == 3):
+ # user said: no, do not overwrite....
+ return False
+
+ self.agendaTemplate.xTextDocument.lockControllers()
+ xTextDocument = self.agendaTemplate.document
+ bSaveSuccess = OfficeDocument.store(
+ xMSF, xTextDocument, self.sPath, "writer8_template", False)
+ except Exception, e:
+ SystemDialog.showMessageBox(
+ xMSF, xControl.Peer, "ErrBox", VclWindowPeerAttribute.OK,
+ resources.resErrSaveTemplate)
+
+ if bSaveSuccess:
+ try:
+ self.topicsControl.saveTopics(self.agenda)
+ root = Configuration.getConfigurationRoot(
+ xMSF, "/org.openoffice.Office.Writer/Wizards/Agenda", True)
+ self.agenda.writeConfiguration(root, "cp_")
+ Configuration.commit(root)
+
+ self.agendaTemplate.finish(self.topicsControl.getTopicsData())
+ xStoreable = self.agendaTemplate.document
+ xStoreable.store()
+
+ self.agendaTemplate.xTextDocument.unlockControllers()
+ loadValues = range(2)
+ loadValues[0] = PropertyValue.PropertyValue()
+ loadValues[0].Name = "AsTemplate"
+ if self.agenda.cp_ProceedMethod == 1:
+ loadValues[0].Value = Boolean.TRUE
+ else:
+ loadValues[0].Value = Boolean.FALSE
+
+ loadValues[1] = PropertyValue.PropertyValue()
+ loadValues[1].Name = "InteractionHandler"
+
+ xIH = 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)
+ except Exception, ex:
+ traceback.print_exc()
+
+ else:
+ self.agendaTemplate.xTextDocument.unlockControllers()
+ return False
+
+ 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 0000000..c49901a
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py
@@ -0,0 +1,154 @@
+from 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 0000000..2e699d9
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/CGAgenda.py
@@ -0,0 +1,27 @@
+from common.ConfigGroup import *
+from 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 0000000..ae6fb51
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/CGTopic.py
@@ -0,0 +1,45 @@
+from 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/TemplateConsts.py b/wizards/com/sun/star/wizards/agenda/TemplateConsts.py
new file mode 100644
index 0000000..364d3d8
--- /dev/null
+++ b/wizards/com/sun/star/wizards/agenda/TemplateConsts.py
@@ -0,0 +1,110 @@
+FILLIN_TITLE = "<title>"
+FILLIN_DATE = "<date>"
+FILLIN_TIME = "<time>"
+FILLIN_LOCATION = "<location>"
+'''
+section name <b>prefix</b> for sections that contain items.
+this is also used as table name prefix, since each items section
+must contain a table whos name is identical name to the section's name.
+'''
+SECTION_ITEMS = "AGENDA_ITEMS"
+'''
+the name of the section which contains the topics.
+'''
+SECTION_TOPICS = "AGENDA_TOPICS"
+'''
+the name of the parent minutes section.
+'''
+SECTION_MINUTES_ALL = "MINUTES_ALL"
+'''
+the name of the child nimutes section.
+This section will be duplicated for each topic.
+'''
+SECTION_MINUTES = "MINUTES"
+'''
+taged headings and names.
+These will be searched in item tables (in the template) and will be
+replaced with resource strings.
+
+headings...
+'''
+FILLIN_MEETING_TYPE = "<meeting-type>"
+FILLIN_BRING = "<bring>"
+FILLIN_READ = "<read>"
+FILLIN_NOTES = "<notes>"
+'''
+names...
+'''
+FILLIN_CALLED_BY = "<called-by>"
+FILLIN_FACILITATOR = "<facilitator>"
+FILLIN_PARTICIPANTS = "<attendees>"
+FILLIN_NOTETAKER = "<notetaker>"
+FILLIN_TIMEKEEPER = "<timekeeper>"
+FILLIN_OBSERVERS = "<observers>"
+FILLIN_RESOURCE_PERSONS = "<resource-persons>"
+'''
+Styles (paragraph styles) used for agenda items.
+headings styles
+
+'''
+STYLE_MEETING_TYPE = "MeetingType"
+STYLE_BRING = "Bring"
+STYLE_READ = "Read"
+STYLE_NOTES = "Notes"
+'''
+names styles
+'''
+STYLE_CALLED_BY = "CalledBy"
+STYLE_FACILITATOR = "Facilitator"
+STYLE_PARTICIPANTS = "Attendees"
+STYLE_NOTETAKER = "Notetaker"
+STYLE_TIMEKEEPER = "Timekeeper"
+STYLE_OBSERVERS = "Observers"
+STYLE_RESOURCE_PERSONS = "ResourcePersons"
+'''
+Styles (paragraph styles) used for the <b>text</b> of agenda items
+The agenda wizard creates fill-in fields with the given styles...)
+
+headings fields styles
+'''
+STYLE_MEETING_TYPE_TEXT = "MeetingTypeText"
+STYLE_BRING_TEXT = "BringText"
+STYLE_READ_TEXT = "ReadText"
+STYLE_NOTES_TEXT = "NotesText"
+'''
+names field styles
+'''
+STYLE_CALLED_BY_TEXT = "CalledByText"
+STYLE_FACILITATOR_TEXT = "FacilitatorText"
+STYLE_PARTICIPANTS_TEXT = "AttendeesText"
+STYLE_NOTETAKER_TEXT = "NotetakerText"
+STYLE_TIMEKEEPER_TEXT = "TimekeeperText"
+STYLE_OBSERVERS_TEXT = "ObserversText"
+STYLE_RESOURCE_PERSONS_TEXT = "ResourcePersonsText"
+'''
+Fillins for the topic table.
+These strings will be searched inside the topic table as
+part of detecting its structure.
+'''
+FILLIN_TOPIC_NUMBER = "<num>"
+FILLIN_TOPIC_TOPIC = "<topic>"
+FILLIN_TOPIC_RESPONSIBLE = "<responsible>"
+FILLIN_TOPIC_TIME = "<topic-time>"
+'''
+fillins for minutes.
+These will be searched in the minutes section and will be replaced
+with the appropriate data.
+'''
+FILLIN_MINUTES_TITLE = "<minutes-title>"
+FILLIN_MINUTES_LOCATION = "<minutes-location>"
+FILLIN_MINUTES_DATE = "<minutes-date>"
+FILLIN_MINUTES_TIME = "<minutes-time>"
+'''
+Minutes-topic fillins
+These will be searched in the minutes-child-section, and
+will be replaced with topic data.
+'''
+FILLIN_MINUTE_NUM = "<mnum>"
+FILLIN_MINUTE_TOPIC = "<mtopic>"
+FILLIN_MINUTE_RESPONSIBLE = "<mresponsible>"
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list