Changeset 99

Show
Ignore:
Timestamp:
Sun Aug 14 11:47:56 2005
Author:
fredrikc
Message:

Added document change flag so we can ask what to do when closing. A lot of observer event changes.

Files:

Legend:

Unmodified
Added
Removed
Modified
  • trunk/transolution/xliffeditor/gtk_main.py

    r98 r99  
    34 34  
    35 35 from transolution.observer import Observer,Observable  
    36   from gtk_utils import askOk,messageDialog,aboutDialog,cb_get_active_text,entryDialog,create_tag_table,fileChooserDialog,dropDownDialog  
      36 from gtk_utils import askOk,askDialog,messageDialog,aboutDialog,cb_get_active_text,entryDialog,create_tag_table,fileChooserDialog,dropDownDialog  
    36 36 from general import EditorException  
    37 37  
    38 38 from gtk_search_replace_dialog import SearchReplaceDialog  
    39 39 from gtk_status_change_dialog import StatusChangeDialog  
    40   from gtk_documentviewpanel import DocumentViewPanel  
      40 from gtk_documentviewpanel import DocumentViewPanel,DOCUMENT_DIRTY_EVENT  
    40 40 from document.creators import createXliffDocumentModel,getDocumentFormatter  
    41 41 from undoredo import UndoException,RedoException  
     
    45 45 from xliffsegment import Model #TODO: Model name is to generic  
    46 46 from settings import settings  
    47   from gtk_documenteditor import GUI_UPDATE_EVENT  
      47 from gtk_documenteditor import UI_UPDATE_EVENT  
    47 47  
    48 48 # I18n support  
     
    145 145         self.mb_tm_active = g("tm_active")  
    146 146         self.cb_tm_automatic_lookup = g("cb_tm_automatic_lookup")  
      147         self.tb_save = g("tb_save")  
      148         self.menu_save = g("menu_save")  
      149  
    147 150  
    148 151         self.menu_skeleton = g("menu_skeleton")  
     
    157 160                                   ]  
    158 161         self.widgets_to_disable_when_tu_closed = [g(w) for w in disable_when_tu_closed]  
    159           self.widgets_to_disable_when_tu_open = [g("tu_nav_toolbar"),g("next_tu_menuitem"),g("previous_tu_menuitem")] #self.tu_closed_toolbar]  
      162         self.widgets_to_disable_when_tu_open = [g(w) for w in ("tu_nav_toolbar","next_tu_menuitem","previous_tu_menuitem")] #self.tu_closed_toolbar]  
    159 162  
    160           self.widgets_to_disable_if_no_file_open = [g(w) for w in ['edit_menu','view_menu','tu_menu','tags_menu','document_operations']]  
      163         self.widgets_to_disable_if_no_file_open = [g(w) for w in ('tb_close','menu_close','tb_save','menu_save','tb_save_as','menu_save_as','edit_menu','view_menu','tu_menu','tags_menu','document_operations')]  
    160 163  
    161 164         # setup combobox TU prev/next constraint  
     
    198 201         from document.segments import TuSegment  
    199 202         self.docpane.doc_model.setDirty(TuSegment)  
    200           self.docpane.doc_model.notifyObservers()  
      203         self.docpane.doc_model.notifyObservers(UI_UPDATE_EVENT)  
    200 203 ##        self.docpane.document_control.showInsertPoint()  
    201 204  
     
    240 243             from document.segments import External  
    241 244             self.docpane.doc_model.setDirty(External)  
    242               self.docpane.doc_model.notifyObservers(GUI_UPDATE_EVENT)  
      245             self.docpane.doc_model.notifyObservers(UI_UPDATE_EVENT)  
    242 245         else:  
    243 246             # no skeleton used before so we need to reparse using skeleton  
    244 247             self.docpane.document_control.buf.clear()  
    245 248             self.docpane.doc_model.parseXliff(use_skeleton=True)  
    246               self.docpane.doc_model.notifyObservers(GUI_UPDATE_EVENT)  
      249             self.docpane.doc_model.notifyObservers(UI_UPDATE_EVENT)  
    246 249             return True  
    247 250  
     
    257 260          
    258 261         self.docpane.doc_model.parseXliff(use_skeleton=False)  
    259           self.docpane.doc_model.notifyObservers(GUI_UPDATE_EVENT)  
      262         self.docpane.doc_model.notifyObservers(UI_UPDATE_EVENT)  
    259 262         return True  
    260 263  
     
    276 279         from document.segments import TuSegment  
    277 280         self.docpane.doc_model.setDirty(TuSegment)  
    278           self.docpane.doc_model.notifyObservers(GUI_UPDATE_EVENT)  
      281         self.docpane.doc_model.notifyObservers(UI_UPDATE_EVENT)  
    278 281         return True  
    279 282  
     
    285 288         from document.segments import TuSegment  
    286 289         self.docpane.doc_model.setDirty(TuSegment)  
    287           self.docpane.doc_model.notifyObservers(GUI_UPDATE_EVENT)  
      290         self.docpane.doc_model.notifyObservers(UI_UPDATE_EVENT)  
    287 290         return True  
    288 291          
     
    294 297  
    295 298     def _checkTargetLang(self,fname,xliff):  
    296           'Initialize target language of @xliff if there is none'  
      299         '''Initialize target language of @xliff if there is none  
      300            @returns True if language setting was changed  
      301         '''  
    297 302         if len(xliff.files):  
    298 303             f = xliff.files[0]  
     
    316 321                     for f in xliff.files:  
    317 322                         f.setTargetLang(target_lang)  
      323                     return True  
      324         return False  
    318 325  
    319 326     def openFile(self,xml):  
     
    321 328         doc = createXliffDocumentModel(xml, use_skeleton=True )  
    322 329         doc.setFormatter(getDocumentFormatter(self.doc_sub_formatters['Medium']))  
    323           self._checkTargetLang(xml,doc.xliff)  
      330         changed = self._checkTargetLang(xml,doc.xliff)  
    323 330          
    324 331  
     
    337 344  
    338 345         # update document view  
    339           doc.notifyObservers()  
      346         doc.notifyObservers(UI_UPDATE_EVENT)  
    339 346  
    340 347         # setup mode  
     
    347 354         notebook.set_current_page(notebook.get_n_pages()-1)  
    348 355         self._updateGui()  
    349           print "Done"  
    350 356  
    351            
      357         if changed:  
      358             # tell observers that we changed the document  
      359             docpanel.doc_model.notifyObservers(DOCUMENT_DIRTY_EVENT)  
      360  
    352 361     def _updateGui(self):  
    353 362         'update GUI to reflect the current document'  
     
    402 411         # automatic tm lookup  
    403 412         self.cb_tm_automatic_lookup.set_active(settings.tm.automatic_lookup.lower() == 'true')  
    404    
    405 413         # tag protection  
    406 414         model = self.docpane.target_control.getModel()  
     
    409 417 ##        model.protect_tags = self.tb_tagprotection.get_active()  
    410 418         self.onTuConstraintChanged()  
      419  
      420         # save icon  
      421         self.tb_save.set_sensitive(doc_model.changed)  
      422         self.menu_save.set_sensitive(doc_model.changed)  
    411 423          
    412 424         self.interactive = True  
     
    539 551     def onQuit(self,*args):  
    540 552         if self.notebook.get_n_pages() > 0:  
    541               if not askOk(self.window,'Quit','Are you sure?'):  
    542                   return True  
      553             changes = False  
      554             for i in range(self.notebook.get_n_pages()):  
      555                 docpane = self.notebook.get_nth_page(i)  
      556                 if docpane.doc_model.changed: changes = True  
      557             if changes:  
      558                 if not askOk(self.window,_('Quit'),_('There are unsaved changes.\nAre you sure you want to quit?')):  
      559                     return True  
    543 560         # save settings  
    544 561         settings.save()  
     
    550 567         n = self.notebook.get_current_page()  
    551 568         o = self.notebook.get_nth_page(n)  
      569         if o.doc_model.changed:  
      570             # ask what to do  
      571             SAVE,DISCARD,CANCEL = 1,2,gtk.RESPONSE_CANCEL  
      572             buttons = ((gtk.STOCK_YES, gtk.RESPONSE_YES),  
      573                        (gtk.STOCK_NO, gtk.RESPONSE_NO),  
      574                        (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))  
      575              
      576             res = askDialog(self.window,  
      577                             _('Close Document'),  
      578                             _('The document has changed\nDo you want to save?'),  
      579                             buttons)  
      580             if res == gtk.RESPONSE_YES:  
      581                 self.onFileSave()  
      582             elif res == gtk.RESPONSE_NO:  
      583                 pass  
      584             else: # Cancel  
      585                 return True  
      586  
    552 587         self.notebook.remove_page(n)  
    553 588         # Close (destroy) will remove the notebook page also so do this after we call remove_page.  
     
    556 591         o.destroy()  
    557 592         self._updateGui()  
      593         return True  
    558 594          
    559 595     def onFileOpen(self,*args):  
     
    570 606         print "Save!"  
    571 607         self.docpane.doc_model.xliff.save()  
    572    
      608         self.docpane.doc_model.changed = False  
      609         self._updateGui()  
      610          
    573 611     def onFileSaveAs(self,*args):  
    574 612         print "Save As!"  
     
    608 646             # upate notebook lable  
    609 647             self.notebook.set_tab_label_text(self.docpane,os.path.basename(fname))  
      648             docpane.doc_model.changed = False  
      649             self._updateGui()  
    610 650  
    611 651         dialog.destroy()  
     
    833 873         else: help = web_help  
    834 874         import webbrowser  
    835           webbrowser.open_new(help)  
      875         webbrowser.open(help)  
    835 875         return True  
    836 876  
  • trunk/transolution/xliffeditor/gtk_documenteditor.py

    r98 r99  
    2 2 import pango  
    3 3 from general import EditorException  
    4   from transolution.observer import Observer,Observable  
      4 from transolution.observer import Observer,Observable,Event  
    4 4 from gtk_basetextbuf import BaseTextBuffer  
    5   GUI_UPDATE_EVENT = 693  
      5 from document.segments import External,TuSegment,FileInfo,SELECT_SEG_EVENT  
      6 from document.tu import TU_UI_UPDATE_EVENT,TU_CHANGE_EVENT  
      7  
      8  
      9 class UI_UPDATE_EVENT(Event): pass  
    6 10  
    7 11 class DocumentBuffer(BaseTextBuffer,Observer):  
     
    18 22         self.model = model  
    19 23         # tell us to observer model for gui changes  
    20           self.subscribeToObservable(self.model,'xupdate',GUI_UPDATE_EVENT)  
    21            
    22       def xupdate(self,doc,event,msg):  
      24         self.subscribeToObservable(self.model,'cbUpdateUI',events=(TU_UI_UPDATE_EVENT,UI_UPDATE_EVENT))#,SELECT_SEG_EVENT))  
      25  
      26     def cbUpdateUI(self,doc,event,msg):  
    23 27         '''  
    24 28         observe/notify interface.  
     
    74 78  
    75 79 ##        wxEndBusyCursor()  
    76   from document.segments import External,TuSegment,FileInfo  
    77 80  
    78 81 class DocumentEdit(gtk.TextView,Observable):  
     
    182 185         buf.place_cursor(iter_start)  
    183 186  
    184           # notify obervers that we have changed  
    185           self.notifyObservers(msg=seg)  
    186 187         self.showInsertPoint()  
    187 188 ##        self.buf.emit_stop_by_name("mark-set")  
      189         # notify obervers that we have changed  
      190         self.notifyObservers(event=SELECT_SEG_EVENT, msg=seg)  
      191  
    188 192          
    189 193         # set interactive flag  
  • trunk/transolution/xliffeditor/gtk_documentviewpanel.py

    r98 r99  
    8 8 ##import gobject  
    9 9  
    10   from gtk_documenteditor import DocumentEdit,DocumentBuffer,GUI_UPDATE_EVENT  
      10 from gtk_documenteditor import DocumentEdit,DocumentBuffer,UI_UPDATE_EVENT  
    10 10 from gtk_tagedit import TagEdit,TagBuffer  
    11 11  
    12   from gtk_utils import askOk,askDialog,entryDialog  
      12 from gtk_utils import askOk,askDialog,entryDialog,messageDialog  
    12 12  
    13 13 from transolution.observer import Observer,Observable  
     
    17 17  
    18 18 from transolution.xmlutils import getNodeAttr,setNodeAttr  
    19   from document import Search  
      19 from document import Search,DOCUMENT_DIRTY_EVENT  
    19 19  
    20 20 from formatters import FullFormatterTagId,FullFormatter,MinimalFormatter  
    21 21  
    22   from document.segments import External,TuSegment,FileInfo,TU_CHANGE_EVENT  
      22 from document.segments import External,TuSegment,FileInfo,SELECT_SEG_EVENT  
    22 22  
    23   from document.tu import TuException  
      23 from document.tu import TuException,TU_CHANGE_EVENT,TU_UI_UPDATE_EVENT  
    23 23  
    24 24 from subseg import AtRootSegException,SubSeg  
     
    115 115  
    116 116         # Observe document text widget for segment changes  
    117           self.subscribeToObservable(self.document_control,'cbSelectedSegmentChanged')  
      117         self.subscribeToObservable(self.document_control,'cbSelectedSegmentChanged',events=(SELECT_SEG_EVENT,))  
    117 117  
    118 118          
     
    195 195     def setupModels(self,doc_model,source_seg_model,target_seg_model):  
    196 196         'set and connect models and viewers'  
      197         if self.doc_model:  
      198             self.unsubscribeToObservable(self.doc_model)  
    197 199         self.doc_model = doc_model  
      200         self.subscribeToObservable(self.doc_model,'cbDocumentDirty',DOCUMENT_DIRTY_EVENT)  
    198 201          
    199 202         self.source_seg_model = source_seg_model  
     
    211 214         self.target_control.get_buffer().setModel(self.target_seg_model)  
    212 215  
      216     def cbDocumentDirty(self,observable, event, seg):  
      217         self.doc_model.changed = True  
      218         self.main_app._updateGui()  
      219  
    213 220     def cbSelectedSegmentChanged(self,observable, event, seg):  
    214 221         'called by document_control when selected segment changes'  
     
    336 343         tu.approved = 'yes'  
    337 344         tu.notifyObservers(TU_CHANGE_EVENT)  
      345         tu.notifyObservers(TU_UI_UPDATE_EVENT)  
    338 346  
    339 347  
     
    343 351         # update gui  
    344 352         self.tu_info_panel.tu.notifyObservers(TU_CHANGE_EVENT)  
      353         self.tu_info_panel.tu.notifyObservers(TU_UI_UPDATE_EVENT)  
      354  
    345 355 ##        self._segClose(commit=False)  
    346 356  
     
    713 723  
    714 724         if s['replace_all']:  
    715               self.replaceAll(s,search_dlg)  
      725             replaced = self.replaceAll(s,search_dlg)  
      726             messageDialog(search_dlg,'replaced:%d'%(replaced,))  
      727  
    716 728             return  
    717 729  
     
    747 759         print "Create new search object"  
    748 760         self._initSearch(s,reset_offset=True)  
    749    
      761         replaced = 0  
    749 761         for f in self.findgen:  
    750 762             try:  
    751 763                 # Replace  
    752 764                 f.replace(s['replace_phrase'])  
      765                 replaced += 1  
    753 766             except XliffError,e:  
    754 767                 print e  
     
    760 773         self.target_seg_model.notifyObservers()  
    761 774  
    762           self.doc_model.notifyObservers(GUI_UPDATE_EVENT)  
    763    
      775         self.doc_model.notifyObservers(UI_UPDATE_EVENT)  
      776         if replaced: self.doc_model.notifyObservers(DOCUMENT_DIRTY_EVENT)  
      777          
    764 778         search_dlg.grab_focus()  
      779         return  replaced  
    765 780  
    766 781     def onChangeStatus(self,s,dlg):  
     
    804 819                 changed = False  
    805 820                 seg.dirty = True  
    806           self.doc_model.notifyObservers(GUI_UPDATE_EVENT)  
      821         self.doc_model.notifyObservers(UI_UPDATE_EVENT)  
      822         if changes:  
      823             print "CHANGED!"  
      824             self.doc_model.notifyObservers(DOCUMENT_DIRTY_EVENT)  
    807 825         return changes  
  • trunk/transolution/xliffeditor/settings.py

    r95 r99  
    110 110  
    111 111 class fonts(XMLObject):  
    112       document_font= TextNode(default="")  
    113       editor_font= TextNode(default="")  
      112     document_font= TextNode(default="10")  
      113     editor_font= TextNode(default="10")  
    114 114  
    115 115 class site(XMLObject):  
  • trunk/transolution/xliffeditor/gtk_tustatus.py

    r98 r99  
    10 10 from document.tu.state_maps import getTuStates,getTuStatesQualifiers  
    11 11 import transolution  
    12   from document.segments import TU_CHANGE_EVENT  
      12 from document.tu import TU_CHANGE_EVENT,TU_UI_UPDATE_EVENT  
    12 12  
    13 13 # get the relevant states  
     
    102 102          
    103 103     def cbTuChanged(self,tu,event,msg):  
      104         'TU Observer callback'  
      105         assert self.tu is tu,'Recived notification from wrong TU'  
      106         self.update()  
      107  
      108     def update(self):  
      109         'update the windgets with the tu status'  
      110         tu = self.tu  
    104 111         org = self.interactive  
    105 112         self.interactive = False # disable interactive event checks  
     
    157 164  
    158 165         self.subscribeToObservable(tu, "cbTuChanged")  
    159   ##        tu.notifyObservers(TU_CHANGE_EVENT)  
    160           self.cbTuChanged(tu,None,None)  
    161 166         self.tu = tu  
      167         self.update()  
    162 168  
    163 169     def onAlttransExpanderActivate(self,*args):  
    164           print "Alttrans EXPAND"  
    165           self.tu.notifyObservers()  
      170         self.update()  
      171         return True  
      172          
    166 173     def onContextExpanderActivate(self,*args):  
    167           print "Context EXPAND"  
    168           self.tu.notifyObservers()  
      174         self.update()  
      175         return True  
    169 176  
    170 177     def onCbTranslateToggled(self,*args):  
     
    178 185             self.tu.approved = widget.get_active()  
    179 186             self.tu.notifyObservers(TU_CHANGE_EVENT)  
      187             self.tu.notifyObservers(TU_UI_UPDATE_EVENT)  
      188  
    180 189         return True  
    181 190  
     
    192 201             del self.tu.state  
    193 202         self.tu.notifyObservers(TU_CHANGE_EVENT)  
      203         self.tu.notifyObservers(TU_UI_UPDATE_EVENT)  
      204  
    194 205         return True  
    195 206  
     
    200 211         else: del self.tu.state_qualifier  
    201 212         self.tu.notifyObservers(TU_CHANGE_EVENT)  
      213         self.tu.notifyObservers(TU_UI_UPDATE_EVENT)  
      214  
    202 215         return True  
    203 216          
  • trunk/transolution/xliffeditor/webdict.py

    r94 r99  
    13 13             self.encoding = encoding  
    14 14  
    15       def lookup(self,term):  
      15     def lookup(self,term,newwin=False):  
    15 15         assert self.post_url, 'No posting URL set'  
    16 16         term = urllib.quote_plus(term.encode(self.encoding))  
    17 17         url = self.post_url%term  
    18           webbrowser.open(url,self.first)  
      18         webbrowser.open(url,newwin)  
    18 18         self.first = False  
  • trunk/transolution/xliffeditor/glade/xliffeditor.glade

    r94 r99  
    51 51  
    52 52                   <child>  
    53                       <widget class="GtkImageMenuItem" id="spara1">  
      53                     <widget class="GtkImageMenuItem" id="menu_save">  
    53 53                       <property name="visible">True</property>  
    54 54                       <property name="label">gtk-save</property>  
     
    60 60  
    61 61                   <child>  
    62                       <widget class="GtkImageMenuItem" id="spara_som1">  
      62                     <widget class="GtkImageMenuItem" id="menu_save_as">  
    62 62                       <property name="visible">True</property>  
    63 63                       <property name="label">gtk-save-as</property>  
     
    69 69  
    70 70                   <child>  
    71                       <widget class="GtkImageMenuItem" id="close1">  
      71                     <widget class="GtkImageMenuItem" id="menu_close">  
    71 71                       <property name="visible">True</property>  
    72 72                       <property name="label">gtk-close</property>  
     
    216 216                       <property name="label" translatable="yes">Source</property>  
    217 217                       <property name="use_underline">True</property>  
    218                         <property name="active">False</property>  
      218                       <property name="active">True</property>  
    218 218                       <signal name="activate" handler="onShowSource" last_modification_time="Wed, 18 May 2005 08:42:02 GMT"/>  
    219 219                     </widget>  
     
    226 226                       <property name="label" translatable="yes">Target</property>  
    227 227                       <property name="use_underline">True</property>  
    228                         <property name="active">False</property>  
      228                       <property name="active">True</property>  
    228 228                       <property name="group">mb_show_source</property>  
    229 229                       <signal name="activate" handler="onShowTarget" last_modification_time="Wed, 18 May 2005 08:42:02 GMT"/>  
     
    272 272                                       <property name="label" translatable="yes">Full+tagid</property>  
    273 273                                       <property name="use_underline">True</property>  
    274                                         <property name="active">False</property>  
      274                                       <property name="active">True</property>  
    274 274                                       <signal name="activate" handler="onEditorFormatterFull" last_modification_time="Sat, 05 Feb 2005 00:51:06 GMT"/>  
    275 275                                       <accelerator key="F1" modifiers="GDK_CONTROL_MASK" signal="activate"/>  
     
    283 283                                       <property name="label" translatable="yes">Full</property>  
    284 284                                       <property name="use_underline">True</property>  
    285                                         <property name="active">False</property>  
      285                                       <property name="active">True</property>  
    285 285                                       <property name="group">mb_editor_formatter_full</property>  
    286 286                                       <signal name="activate" handler="onEditorFormatterMedium" last_modification_time="Sat, 05 Feb 2005 00:51:06 GMT"/>  
     
    343 343                                       <property name="label" translatable="yes">Full</property>  
    344 344                                       <property name="use_underline">True</property>  
    345                                         <property name="active">False</property>  
      345                                       <property name="active">True</property>  
    345 345                                       <signal name="activate" handler="onSkeletonFull" last_modification_time="Tue, 17 May 2005 21:21:08 GMT"/>  
    346 346                                     </widget>  
     
    353 353                                       <property name="label" translatable="yes">Minimal</property>  
    354 354                                       <property name="use_underline">True</property>  
    355                                         <property name="active">False</property>  
      355                                       <property name="active">True</property>  
    355 355                                       <property name="group">mb_skeleton_full</property>  
    356 356                                       <signal name="activate" handler="onSkeletonMinimal" last_modification_time="Tue, 17 May 2005 21:21:08 GMT"/>  
     
    388 388                                       <property name="label" translatable="yes">Full</property>  
    389 389                                       <property name="use_underline">True</property>  
    390                                         <property name="active">False</property>  
      390                                       <property name="active">True</property>  
    390 390                                       <signal name="activate" handler="onDocumentFormatterFull" last_modification_time="Sat, 05 Feb 2005 00:51:06 GMT"/>  
    391 391                                       <accelerator key="F5" modifiers="GDK_CONTROL_MASK" signal="activate"/>  
     
    399 399                                       <property name="label" translatable="yes">Medium</property>  
    400 400                                       <property name="use_underline">True</property>  
    401                                         <property name="active">False</property>  
      401                                       <property name="active">True</property>  
    401 401                                       <property name="group">mb_formatter_full</property>  
    402 402                                       <signal name="activate" handler="onDocumentFormatterMedium" last_modification_time="Sat, 05 Feb 2005 00:51:06 GMT"/>  
     
    495 495  
    496 496                       <child internal-child="image">  
    497                           <widget class="GtkImage" id="image82">  
      497                         <widget class="GtkImage" id="image83">  
    497 497                           <property name="visible">True</property>  
    498 498                           <property name="stock">gtk-media-forward</property>  
     
    517 517  
    518 518                       <child internal-child="image">  
    519                           <widget class="GtkImage" id="image83">  
      519                         <widget class="GtkImage" id="image84">  
    519 519                           <property name="visible">True</property>  
    520 520                           <property name="stock">gtk-go-back</property>  
     
    1027 1027  
    1028 1028           <child>  
    1029               <widget class="GtkToolButton" id="toolbutton8">  
      1029             <widget class="GtkToolButton" id="tb_close">  
    1029 1029               <property name="visible">True</property>  
    1030 1030               <property name="tooltip" translatable="yes">Close file</property>  
  • trunk/transolution/xliffeditor/document/document.py

    r98 r99  
    1 1 __doc__ = 'main document model'  
    2 2  
    3   from transolution.observer import Observable,Observer  
      3 from transolution.observer import Observable,Observer,Event  
    3 3 from transolution.xliffeditor.general import EditorException  
    4 4 from segments import External,TuSegment,FileInfo,TuInfo  
    5 5 from tree import IndexTree  
    6 6  
      7 from tu import TU_UI_UPDATE_EVENT,TU_CHANGE_EVENT  
      8  
      9 class DOCUMENT_DIRTY_EVENT(Event): pass  
      10  
    7 11 class DocumentIndexException(EditorException):pass  
    8 12  
     
    28 32         self.getTextSpanOfSeg = self.tree.getBounds  
    29 33         self._initTree = True  
      34         self.changed = False  
    30 35          
    31 36     def initTree(self):  
     
    65 70         'Add a segment to docu