class Renderer(Overlay): def __init__(self, win, parser='rst', writer='html4', style=''): super(Renderer, self).__init__() self.webview = WebView() self.webview.connect("mouse-target-changed", self.on_mouse) self.webview.connect("context-menu", self.on_context_menu) self.webview.connect("button-release-event", self.on_button_release) self.add(self.webview) controller = self.webview.get_find_controller() self.search_done = None controller.connect("found-text", self.on_found_text) controller.connect("failed-to-find-text", self.on_faild_to_find_text) self.label = Label() self.label.set_halign(Align.START) self.label.set_valign(Align.END) self.add_overlay(self.label) self.link_uri = None self.context_button = 3 # will be rewrite by real value self.set_writer(writer) self.set_parser(parser) self.style = style self.tab_width = 8 self.__win = win @property def position(self): self.__position = -1 self.webview.run_javascript(JS_POSITION, None, self.on_position_callback, None) while self.__position < 0: # this call at this place do problem, when Gdk.threads_init main_iteration() return self.__position def on_position_callback(self, webview, result, data): try: js_res = webview.run_javascript_finish(result) self.__position = js_res.get_js_value().to_double() except Error: self.__position = 0 def on_mouse(self, webview, hit_test_result, modifiers): self.link_uri = None if hit_test_result.context_is_link(): self.link_uri = hit_test_result.get_link_uri() text = "link: %s" % self.link_uri elif hit_test_result.context_is_image(): text = "image: %s" % hit_test_result.get_image_uri() elif hit_test_result.context_is_media(): text = "media: %s" % hit_test_result.get_media_uri() else: if self.label.is_visible(): self.label.hide() return self.label.set_markup(MARKUP % text.replace("&", "&")) self.label.show() def on_context_menu(self, webview, menu, event, hit_test_result): self.context_button = event.button.button return True # disable context menu for now def on_button_release(self, webview, event): """Catch release-button only when try to follow link. Context menu is catch by webview before this callback. """ if event.button == self.context_button: return True if self.link_uri: if self.link_uri.startswith("file://"): # try to open source self.find_and_opendocument(self.link_uri[7:].split('#')[0]) else: show_uri_on_window(None, self.link_uri, 0) return True def find_and_opendocument(self, file_path): ext = splitext(file_path)[1] if not ext: for EXT in LANGS.keys(): tmp = file_path + EXT if exists(tmp): file_path = tmp ext = EXT break if ext in LANGS: self.__win.open_document(file_path) elif exists(file_path): show_uri_on_window(None, "file://" + file_path, 0) else: dialog = FileNotFoundDialog(self.__win, file_path) dialog.run() dialog.destroy() def set_writer(self, writer): assert writer in WRITERS self.__writer = WRITERS[writer] klass = self.__writer['class'] self.writer_instance = klass() if klass is not None else None idle_add(self.do_render) def get_writer(self): return self.__writer['key'] def set_parser(self, parser): assert parser in PARSERS self.__parser = PARSERS[parser] klass = self.__parser['class'] self.parser_instance = klass() if klass is not None else None idle_add(self.do_render) def get_parser(self): return self.__parser['key'] def set_style(self, style): self.style = style idle_add(self.do_render) def get_style(self): return self.style def set_tab_width(self, width): self.tab_width = width def render_output(self): if getattr(self, 'src', None) is None: return False, "", "text/plain" try: if self.__parser['class'] is None: html = NOT_FOUND.format(**self.__parser) elif self.__writer['class'] is None: html = NOT_FOUND.format(**self.__writer) elif issubclass(self.__parser['class'], JSONPreview): try: json = loads(self.src) return (False, dumps(json, sort_keys=True, ensure_ascii=False, indent=4, separators=(',', ': ')), 'application/json') except ValueError as e: return False, DATA_ERROR % ('JSON', str(e)), "text/html" else: if not issubclass(self.__parser['class'], HtmlPreview): settings = { 'warning_stream': StringIO(), 'embed_stylesheet': True, 'tab_width': self.tab_width, 'file_name': self.file_name } if self.style: settings['stylesheet'] = self.style settings['stylesheet_path'] = [] kwargs = { 'source': self.src, 'parser': self.parser_instance, 'writer': self.writer_instance, 'writer_name': 'html', 'settings_overrides': settings } if self.__writer['key'] == 'pep': kwargs['reader_name'] = 'pep' kwargs.pop('parser') # pep is allways rst html = publish_string(**kwargs).decode('utf-8') return True, html, 'text/html' else: if version_info.major == 2: html = self.src.decode("utf-8") else: html = self.src # output to file or html preview return False, html, 'text/html' except DataError as e: return False, DATA_ERROR % ('Data', e), 'text/html' except NotImplementedError: exc_str = format_exc() return False, NOT_IMPLEMENTED_ERROR % exc_str, 'text/html' except BaseException: exc_str = format_exc() return False, EXCEPTION_ERROR % exc_str, 'text/html' def do_render(self): state, html, mime_type = self.render_output() if state: if self.pos > 1: # vim a, b = len(self.src[:self.pos]), len(self.src[self.pos:]) position = (float(a) / (a + b)) if a or b else 0 else: position = self.pos html += SCROLL % position if html and self.__win.runing: file_name = self.file_name or get_home_dir() self.webview.load_bytes(Bytes(html.encode("utf-8")), mime_type, "UTF-8", "file://" + file_name) def render(self, src, file_name, pos=0): self.src = src self.pos = pos self.file_name = file_name idle_add(self.do_render) def print_page(self): po = PrintOperation.new(self.webview) po.connect("failed", self.on_print_failed) po.run_dialog(self.__win) def on_print_failed(self, po, error): # FIXME: if dialog is used, application will lock :-( log_default_handler("Application", LogLevelFlags.LEVEL_WARNING, error.message) def do_next_match(self, text): controller = self.webview.get_find_controller() if controller.get_search_text() != text: self.search_done = None controller.search(text, FindOptions.WRAP_AROUND, MAXUINT) while self.search_done is None: main_iteration() elif self.search_done: controller.search_next() return self.search_done def do_previous_match(self, text): controller = self.webview.get_find_controller() if controller.get_search_text() != text: self.search_done = None controller.search(text, FindOptions.WRAP_AROUND | FindOptions.BACKWARDS, MAXUINT) while self.search_done is None: main_iteration() elif self.search_done: controller.search_previous() return self.search_done def stop_search(self): controller = self.webview.get_find_controller() controller.search_finish() def on_found_text(self, controller, count): self.search_done = True def on_faild_to_find_text(self, controller): self.search_done = False def scroll_to_position(self, position): if position is not None: self.pos = position if self.pos > 1: # vim a, b = len(self.src[:self.pos]), len(self.src[self.pos:]) position = (float(a) / (a + b)) if a or b else 0 else: position = self.pos self.webview.run_javascript(JS_SCROLL % position, None, None, None)
class Renderer(Overlay): def __init__(self, win, parser='rst', writer='html4', style=''): super(Renderer, self).__init__() scrolled = ScrolledWindow.new(None, None) scrolled.set_policy(PolicyType.AUTOMATIC, PolicyType.AUTOMATIC) self.sb = scrolled.get_vscrollbar() self.add(scrolled) self.webview = WebView() self.webview.connect("mouse-target-changed", self.on_mouse) scrolled.add(self.webview) self.label = Label() self.label.set_halign(Align.START) self.label.set_valign(Align.END) self.add_overlay(self.label) self.set_writer(writer) self.set_parser(parser) self.style = style self.tab_width = 8 self.__win = win def on_mouse(self, web_view, hit_test_result, modifiers): if hit_test_result.context_is_link(): text = "link: %s" % hit_test_result.get_link_uri() elif hit_test_result.context_is_image(): text = "image: %s" % hit_test_result.get_image_uri() elif hit_test_result.context_is_media(): text = "media: %s" % hit_test_result.get_media_uri() else: if self.label.is_visible(): self.label.hide() return self.label.set_markup(MARKUP % text) self.label.show() def set_writer(self, writer): assert writer in WRITERS self.__writer = WRITERS[writer] klass = self.__writer['class'] self.writer_instance = klass() if klass is not None else None idle_add(self.do_render) def get_writer(self): return self.__writer['key'] def set_parser(self, parser): assert parser in PARSERS self.__parser = PARSERS[parser] klass = self.__parser['class'] self.parser_instance = klass() if klass is not None else None idle_add(self.do_render) def get_parser(self): return self.__parser['key'] def set_style(self, style): self.style = style idle_add(self.do_render) def get_style(self): return self.style def set_tab_width(self, width): self.tab_width = width def render_output(self): if getattr(self, 'src', None) is None: return False, "", "text/plain" try: if self.__parser['class'] is None: html = NOT_FOUND.format(**self.__parser) elif self.__writer['class'] is None: html = NOT_FOUND.format(**self.__writer) elif issubclass(self.__parser['class'], JSONPreview): try: json = loads(self.src) return (False, dumps(json, sort_keys=True, ensure_ascii=False, indent=4, separators=(',', ': ')), 'application/json') except ValueError as e: return False, DATA_ERROR % ('JSON', str(e)), "text/html" else: if not issubclass(self.__parser['class'], HtmlPreview): settings = { 'warning_stream': StringIO(), 'embed_stylesheet': True, 'tab_width': self.tab_width } if self.style: settings['stylesheet'] = self.style settings['stylesheet_path'] = [] kwargs = {'source': self.src, 'parser': self.parser_instance, 'writer': self.writer_instance, 'writer_name': 'html', 'settings_overrides': settings} if self.__writer['key'] == 'pep': kwargs['reader_name'] = 'pep' kwargs.pop('parser') # pep is allways rst html = publish_string(**kwargs).decode('utf-8') return True, html, 'text/html' else: if version_info.major == 2: html = self.src.decode("utf-8") else: html = self.src # output to file or html preview return False, html, 'text/html' except DataError as e: return False, DATA_ERROR % ('Data', e), 'text/html' except BaseException: exc_str = format_exc() return False, EXCEPTION_ERROR % exc_str, 'text/html' def do_render(self): state, html, mime_type = self.render_output() if state: a, b = len(self.src[:self.pos]), len(self.src[self.pos:]) position = (float(a)/(a+b)) if a or b else 0 html += SCROLL % position if html and self.__win.runing: file_name = self.file_name or get_home_dir() self.webview.load_bytes(Bytes(html.encode("utf-8")), mime_type, "UTF-8", "file://"+file_name) def render(self, src, file_name, pos=0): self.src = src self.pos = pos self.file_name = file_name idle_add(self.do_render) def print_page(self): po = PrintOperation.new(self.webview) po.connect("failed", self.on_print_failed) po.run_dialog(self.__win) def on_print_failed(self, po, error): # FIXME: if dialog is used, application will lock :-( log_default_handler("Application", LogLevelFlags.LEVEL_WARNING, error.message)
class TabbedCanvas(Gtk.EventBox): basePath="" counter=0 saveAsFilename="" fileName="" data="" currentPageIndex="" hbox="" #property to hold <filename,notebook page> pair pageMap=dict() def __init__(self): Gtk.EventBox.__init__(self) #Adding HBox self.mainbox=Gtk.HPaned() #self.mainbox.orientation(gtk.Orientation.VERTICAL #gtk.HBox() self.elementBox=Gtk.VBox() scrolled_window = Gtk.VPaned()#gtk.ScrolledWindow() scrolled_window.set_border_width(5) scrolled_window.set_size_request(300, 300) scrolled_window.add(self.elementBox) self.treestore=Gtk.TreeStore(str) self.treestore.clear() self.exampleNode=self.treestore.append(None,[_("Examples")]) #self.newitem=self.treestore.append(self.exampleNode,["test1"]) self.programNode=self.treestore.append(None,[_("Your Programs")]) #adding treeview self.treeview=Gtk.TreeView() #adding treeviewcolumn self.tvcolumn=Gtk.TreeViewColumn(_("Explorer")) self.cell=Gtk.CellRendererText() self.tvcolumn.pack_start(self.cell,True) self.tvcolumn.add_attribute(self.cell,"text",0) self.treeview.append_column(self.tvcolumn) self.treeview.set_model(self.treestore) #add handler for row-activated signal self.treeview.connect('row-activated',self.openSelectedFile) #changed was causing different behavior as when treeview is refreshed, it calls openSelected, thus opening all files under this section #self.treeview.get_selection().connect("changed", self.openSelectedFile) #create a scrolled window for explorer self.explorerScrollWindow=Gtk.ScrolledWindow() self.explorerScrollWindow.set_policy(Gtk.PolicyType.NEVER,Gtk.PolicyType.AUTOMATIC); self.explorerScrollWindow.add(self.treeview) self.explorerScrollWindow.set_size_request(100,650) self.elementBox.pack_start(self.explorerScrollWindow,False,False,0) #self.elementBox.pack_start(self.btn2,False,False,0) #Adding Notebook self.notebook=Notebook() self.notebook.tab_curvature=100 self.notebook.set_scrollable(True) self.notebook.show() #Adding Notebook pages self.addPage(None,None) self.mainbox.add(scrolled_window) self.mainbox.add(self.notebook) self.add(self.mainbox) #method to add a page to Notebook def addPage(self,textBuffer,pageTitle): print "INSIDE_ADD_PAGE" caption=_("Untitled"+str(self.counter)) #add hbox self.hbox=Gtk.HBox(); self.hbox.show(); #create text_buffer self.sourceBuffer= GtkSource.Buffer() #add textview self.textview=GtkSource.View() self.textview.set_buffer(self.sourceBuffer) self.textview.set_show_line_numbers(True) self.textview.set_show_line_marks(True) self.textview.set_size_request(250,400) self.setLanguage(self.textview) #check for textBuffer passed as param if textBuffer!=None: #set the textbuffer data to editor start, end = textBuffer.get_bounds() self.sourceBuffer.set_text(textBuffer.get_text(start, end, True)) #add vpane self.vpane=Gtk.VPaned(); #add scroll to text view self.scroll=Gtk.ScrolledWindow(); self.scroll.set_policy(Gtk.PolicyType.NEVER,Gtk.PolicyType.AUTOMATIC); self.scroll.add_with_viewport(self.textview) self.scroll.set_size_request(250,400) self.scroll.show() self.vpane.add(self.scroll) #add scroll to text view self.opScroll= Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) #create Vte Terminal self.vteObject=Vte.Terminal() self.opScroll.pack_start(self.vteObject, True, True, 0) self.outsb = Gtk.Scrollbar(orientation=Gtk.Orientation.VERTICAL) self.outsb.set_adjustment(self.vteObject.get_vadjustment()) self.outsb.show() self.opScroll.pack_start(self.outsb, False, False, 0) self.vteObject.set_colors(Gdk.color_parse('#000000'),Gdk.color_parse('#E7E7E7'),[]) self.vteObject.set_size_request(200,200) self.vteObject.show() #self.opScroll.set_size_request(250,200) self.opScroll.show() print "VTE_KARTIK:",self.vteObject.get_vadjustment() self.vpane.add(self.opScroll) self.vpane.show() self.hbox.pack_start(self.vpane,True,True,0) self.textview.show() #attach text-change listener for buffer self.attachTextChangedListener(self.hbox) self.hbox.set_size_request(250, 300) #if pageTitle is none then give a Untitled caption if pageTitle==None: self.newlabel=Label(caption) else: self.newlabel=Label(pageTitle) #self.newlabel.set_size_request(75,30) self.resizeLabel(self.newlabel) self.newlabel.show() self.notebook.append_page(self.hbox,self.newlabel) #assigning notebook page for the filename #self.pageMap[self.newlabel.get_text()]=self.hbox self.addPageToPageMap(self.newlabel.get_text(),self.hbox) self.counter=self.counter+1 print "Curr :",self.pageMap self.selectFileNamePage(self.newlabel.get_text()) #method to add page to pageMap def addPageToPageMap(self,fileName,hbox): print "BEFORE_CURRENT_PAGE_MAP:",self.pageMap print "addPageToPageMap_called_for:",fileName try: #assigning notebook page for the filename self.pageMap[fileName]=hbox print "Page:",fileName," added to pageMap" except: print "Page already exist in pageMap" print "AFTER_CURRENT_PAGE_MAP:",self.pageMap #method to remove page from pageMap def removePageFromPageMap(self,fileName): try: print "looking for page:",fileName, " in pageMap for removal" del self.pageMap[fileName] print "Page:",fileName," removed from pageMap" except: print "Unable to remove page from pageMap" #method to resize the tab label to appropriate dimension def resizeLabel(self,label): label.set_size_request(label.get_width_chars(),40) #method to get label for tab def resizeSelectedTabLabel(self): label=self.getSelectedTabLabel() self.resizeLabel(label) #method to get hbox for selected tab def getSelectedTabHBox(self): currentPageIndex=self.notebook.get_current_page() print "current page number:",currentPageIndex hbox=self.notebook.get_nth_page(currentPageIndex) return hbox #method to get tab label for selected tab def getSelectedTabLabel(self): hbox=self.getSelectedTabHBox() label=self.notebook.get_tab_label(hbox) return label #method to get textview for selected tab( code editor) def getSelectedTabTextView(self): hbox=self.getSelectedTabHBox() children=hbox.get_children()#VPANED #ScrolledWindow #Viewport #textview textview=children[0].get_children()[0].get_children()[0].get_children()[0] return textview #method to get outputWindow text view for selected tab( output window) def getSelectedTabOutputWindowTextView(self): hbox=self.getSelectedTabHBox() children=hbox.get_children() #ScrolledWindow #Viewport #textview textview=children[0].get_children()[1].get_children()[0].get_children()[0] return textview #method to get text-buffer for selected tab( code editor) def getSelectedTabTextBuffer(self): hbox=self.getSelectedTabHBox() textview=self.getSelectedTabTextView() tvbuffer=textview.get_buffer() return tvbuffer #method to get text-buffer for selected tab( output window) def getSelectedTabOutputWindowBuffer(self): hbox=self.getSelectedTabHBox() textview=self.getSelectedTabOutputWindowTextView() tvbuffer=textview.get_buffer() return tvbuffer #method to get text-buffer for selected tab( output window) def getSelectedTabVte(self): hbox=self.getSelectedTabHBox() children=hbox.get_children() #ScrolledWindow #Viewport #vte vteObj=children[0].get_children()[1].get_children()[0]#.get_children()[0] return vteObj #method to remove the selected page def removePage(self): currentPageIndex=self.notebook.get_current_page() print "Removing page number:",currentPageIndex #remove page from pageMap first fileName_to_be_removed=self.getSelectedTabLabel() self.removePageFromPageMap(fileName_to_be_removed.get_text()) self.notebook.remove_page(currentPageIndex) #method to delete the selected page and file def deletePage(self): del_filename=self.getSelectedTabLabel().get_text() actualFileName=del_filename.replace('*','') self.showConfirmDeleteDialog(actualFileName,self.basePath) #method to confirm deletion operation def showConfirmDeleteDialog(self,fileName,basePath): print "show confirm delete dialog called" self.deleteDialog=Gtk.Dialog(_("Oopsy Alert on Delete !"),None,0,None) self.label = Gtk.Label(_("Are you sure you want to delete '"+fileName+"' ?")) self.deleteDialog.vbox.pack_start(self.label,True,True,0) #adding buttons btnOk=Gtk.Button(_("Ok")) btnOk.connect("clicked",self.hideConfirmDeleteDialogOnOK,fileName,basePath) btnCancel=Gtk.Button(_("Cancel")) btnCancel.connect("clicked",self.hideConfirmDeleteDialogOnCancel,basePath) self.deleteDialog.action_area.pack_start(btnCancel,True,True,0) self.deleteDialog.action_area.pack_start(btnOk, True, True, 0) self.deleteDialog.set_size_request(150,150) btnOk.show() btnCancel.show() self.label.show() self.deleteDialog.show() #method to hide confirm deletion operation and delete the file as user pressed OK def hideConfirmDeleteDialogOnOK(self,widget,fileName,basePath): print "hideConfirmDeleteDialogOnOK called" self.deleteDialog.hide() self.removePage() fh=FileHandler() fh.basePath=self.basePath fh.deleteFile(fileName) #refresh the explorer self.refreshExplorer(self.basePath) #method to hide confirm deletion operation as user pressed CANCEL def hideConfirmDeleteDialogOnCancel(self,widget,basePath): print "hideConfirmDeleteDialogOnCancel called" self.deleteDialog.hide() #method to apply text-changed callback to textview's text buffer def attachTextChangedListener(self,hbox): #HBOX #VPANED #SCROLL_WINDOW #ViewPort #TextView textview=self.hbox.get_children()[0].get_children()[0].get_children()[0].get_children()[0] print "L1:",self.hbox.get_children()[0] print "L2:",self.hbox.get_children()[0].get_children()[0] print "L3:",self.hbox.get_children()[0].get_children()[0].get_children()[0] print "attached text changed listener to :",textview tbuffer=textview.get_buffer() tbuffer.connect("changed",self.showUnsavedTab) print "\nAttached change listener" #method that detects text-change in text buffer and indicates on tab with a * mark def showUnsavedTab(self,widget): label=self.getSelectedTabLabel() oldTitle=label.get_text() oldTitle=oldTitle.replace('*','') oldTitle=oldTitle + '*' label.set_text(oldTitle) #method to set Language of sourceView with Language Manager def setLanguage(self,sourceView): self.lmgr=GtkSource.LanguageManager.get_default() self.language=self.lmgr.get_language('cpp') sourceView.get_buffer().set_language(self.language) #method to open the selected file from the explorer def openSelectedFile(self, widget, row, col): model=self.treeview.get_model() value = model[row][0] print "Open Selected File called for :",value filename=value page_in_pageMap=None #get page from pageMap and select already open tab for this file try: page_in_pageMap=self.pageMap[filename] print "PAGE_MAP:",page_in_pageMap," for :",filename self.selectFileNamePage(filename) except: print "NO_PAGE_IN_PAGE_MAP" #create fileHandler instance fh=FileHandler() fh.basePath=self.basePath fileData=fh.loadFileFromWorkspace(filename) print "FILE_DATA:",fileData text_buffer=Gtk.TextBuffer() text_buffer.set_text(fileData) if page_in_pageMap==None: print "since no page in pageMap thus creating page" self.addPage(text_buffer,filename) #method to select the tab with a filename def selectFileNamePage(self,filename): h_box=self.pageMap[filename] page_num=self.getPageNumberWithTabHBox(h_box) self.notebook.set_current_page(page_num) #method to get hbox for a hbox def getPageNumberWithTabHBox(self,hbox): page_number=self.notebook.page_num(hbox) return page_number #method to save the file on selected notebook page def saveFile(self,basePath): hbox=self.getSelectedTabHBox() textview_buffer=self.getSelectedTabTextBuffer() start, end = textview_buffer.get_bounds() self.data=textview_buffer.get_text(start, end, True) self.fileName=self.notebook.get_tab_label(hbox).get_text() #check if file exists on drive actualFilename=self.fileName.replace('*','') fh=FileHandler() fh.basePath=basePath if fh.checkFileExists(actualFilename): self.saveAsFilename=actualFilename self.saveToDisk(basePath) else: self.showSaveDialog(basePath) #print "HBOX has elements:",str(len(lst)) print "Got data:",self.data," with filename:",self.fileName #method to show save dialog on click of save button def showSaveDialog(self,basePath): print "save dialog called" self.dialog=Gtk.Dialog(_("Save Program"),None,0,None) self.label = Gtk.Label(_("Save your program as :")) self.entry=Gtk.Entry() self.dialog.vbox.pack_start(self.label,True,True,0) self.dialog.vbox.pack_start(self.entry,True,True,0) #adding buttons btnOk=Gtk.Button(_("Save")) btnOk.connect("clicked",self.hideSaveDialogOnSave,basePath) self.dialog.action_area.pack_start(btnOk, True, True, 0) self.dialog.set_size_request(150,150) btnOk.show() self.label.show() self.entry.show() self.dialog.show() #method to show alert dialog if file is unsaved and compile or executed is selected def showAlertDialog(self,basePath,message): print "show Alert dialog called" self.alertDialog=Gtk.Dialog(_("Oopsy Alert"),None,0,None) self.label = Gtk.Label(_(message)) self.alertDialog.vbox.pack_start(self.label,True,True,0) #adding buttons btnOk=Gtk.Button(_("Ok")) btnOk.connect("clicked",self.hideAlertDialog,basePath) self.alertDialog.action_area.pack_start(btnOk, True, True, 0) self.alertDialog.set_size_request(150,150) btnOk.show() self.label.show() self.alertDialog.show() #method to hide alert dialog def hideAlertDialog(self,widget,basePath): print "hide Alert Dialog called" self.alertDialog.hide() #method to hide save-dialog and invoke saveToDisk--for actual saving def hideSaveDialogOnSave(self,widget,basePath): print "hideSaveDialog called" self.saveAsFilename=self.entry.get_text() print "got save as filename:",self.saveAsFilename self.dialog.hide() #check if file is saved as .c or .cpp file isCFlag=self.saveAsFilename[-2:] isCppFlag=self.saveAsFilename[-4:] #if file is either of c or cpp file then proceed to save on disk if isCFlag=='.c'or isCppFlag=='.cpp': self.saveToDisk(basePath) else: self.showAlertDialog(basePath,"You must save your program as .c or .cpp file !") #method to save data from text-buffer to disk as a file def saveToDisk(self,basePath): fh=FileHandler() fh.basePath=basePath fh.saveFile(self.saveAsFilename,self.data) self.renameTabOnSave(self.saveAsFilename) #get selected Tab HBox hbox_obj=self.getSelectedTabHBox() self.addPageToPageMap(self.saveAsFilename,hbox_obj) #refresh the explorer self.refreshExplorer(basePath) #reselect file in explorer after explorer refresh self.selectFileInExplorer(self.saveAsFilename) #method to rename tab as save is clicked def renameTabOnSave(self,fileName): hbox=self.getSelectedTabHBox() self.notebook.set_tab_label_text(hbox, fileName) self.resizeSelectedTabLabel() print "Tab renamed" #method to compile selected file def compileSelectedFile(self,basePath): gc=GCCHandler() gc.basePath=basePath fn=self.getSelectedTabLabel().get_text() actualFilename=fn.replace('*','') #check if file is saved as .c or .cpp file isCFlag=actualFilename[-2:] isCppFlag=actualFilename[-4:] #if file is either of c or cpp file then proceed otherwise show alert dialog asking user to save the file first. if isCFlag=='.c'or isCppFlag=='.cpp': vteObj=self.getSelectedTabVte() compilationOutput=gc.compileFile(actualFilename,vteObj) else: self.showAlertDialog(basePath,"You must save the file before compiling or executing the program.") #method to run selected file def executeSelectedFile(self,basePath): gc=GCCHandler() gc.basePath=basePath fn=self.getSelectedTabLabel().get_text() actualFilename=fn.replace('*','') #check if file is saved as .c or .cpp file isCFlag=actualFilename[-2:] isCppFlag=actualFilename[-4:] #if file is either of c or cpp file then proceed otherwise show alert dialog asking user to save the file first. if isCFlag=='.c'or isCppFlag=='.cpp': vteObj=self.getSelectedTabVte() executionOutput=gc.execute(actualFilename,vteObj) else: self.showAlertDialog(basePath,"You must save the file before compiling or executing the program.") #clear the children under examples and your programs def clearFilesInTreeView(self): for row in self.treestore: print "ROW:",row," NAME:",row[0] rowIter=row.iterchildren() try: child=rowIter.next() except: print "No rows at all" try: while(child!=None): print "Removing CHILD:",child[0] self.treestore.remove(child.iter) child=rowIter.next() except: print "No more rows !" #method to select the row in TreeView def selectFileInExplorer(self,fileName): for row in self.treestore: print "ROW:",row," NAME:",row[0] rowIter=row.iterchildren() try: child=rowIter.next() except: print "No rows at all" try: while(child!=None): print "Checking CHILD:",child[0], " for selecting:",fileName if fileName==child[0]: self.treeSel=self.treeview.get_selection() self.treeSel.select_iter(child.iter) print "TREE_SEL:",self.treeSel break child=rowIter.next() except: print "No more rows !" #self.treeSel.select_path( #refresh explorer def refreshExplorer(self,basePath): print "flushing treestore" self.clearFilesInTreeView() self.loadExplorer(basePath) #method to load the explorer def loadExplorer(self,basePath): #flush all rows first #self.refreshExplorer() print "INSIDE_LOAD_EXPLORER" print "basePath_in_TabControl:",basePath ws=WorkspaceHandler(basePath) #add child nodes to exampleNode-which shows all examples print "ws.exampleList:",len(ws.exampleList) for item in ws.exampleList: print "adding item:",item," to examples:",self.exampleNode self.newitem=self.treestore.append(self.exampleNode,[item]) #add child nodes to programNode-which shows your programs print "ws.programList:",len(ws.programList) for item in ws.programList: print "adding item:",item," to programs:",self.programNode self.newitem=self.treestore.append(self.programNode,[item]) #now expand all nodes self.treeview.expand_all()