Changeset 99
- Timestamp:
- Sun Aug 14 11:47:56 2005
- Files:
-
- trunk/transolution/xliffeditor/gtk_main.py (modified) (diff)
- trunk/transolution/xliffeditor/gtk_documenteditor.py (modified) (diff)
- trunk/transolution/xliffeditor/gtk_documentviewpanel.py (modified) (diff)
- trunk/transolution/xliffeditor/settings.py (modified) (diff)
- trunk/transolution/xliffeditor/gtk_tustatus.py (modified) (diff)
- trunk/transolution/xliffeditor/webdict.py (modified) (diff)
- trunk/transolution/xliffeditor/glade/xliffeditor.glade (modified) (diff)
- trunk/transolution/xliffeditor/document/document.py (modified) (diff)
- trunk/transolution/xliffeditor/document/__init__.py (modified) (diff)
- trunk/transolution/xliffeditor/document/tu/tu.py (modified) (diff)
- trunk/transolution/xliffeditor/document/tu/__init__.py (modified) (diff)
- trunk/transolution/xliffeditor/document/document_search.py (modified) (diff)
- trunk/transolution/xliffeditor/document/segments.py (modified) (diff)
- trunk/transolution/observer.py (modified) (diff)
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_EVENT47 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,FileInfo77 80 78 81 class DocumentEdit(gtk.TextView,Observable): … … 182 185 buf.place_cursor(iter_start) 183 186 184 # notify obervers that we have changed185 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_EVENT10 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_EVENT22 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_EVENT12 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="image8 2">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="image8 3">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="t oolbutton8">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
