xmonader / helloed (http://programming-fr34ks.net/)

simple, modern text editor written python/gtk

Clone this repository (size: 1.2 MB): HTTPS / SSH
$ hg clone http://bitbucket.org/xmonader/helloed/

Changed (Δ5.5 KB):

raw changeset »

helloed6/src/widgets.py (192 lines added, 0 lines removed)

Up to file-list helloed6/src/widgets.py:

@@ -422,6 +422,188 @@ class LeftSidePane(gtk.Notebook):
422
422
        self.sourceviewer=SourceCodeTreeView()
423
423
        scrolled.add(self.sourceviewer)
424
424
        self.append_page(scrolled, gtk.Label("SourceViewer"))
425
426
427
428
class Paste(object):
429
    def __init__(self, author="", title="", code="", lang=""):
430
        self.author=author
431
        self.title=title
432
        self.lang=lang
433
        self.code=code
434
435
class HPaste(object):
436
    PASTE_URL="http://hpaste.org/fastcgi/hpaste.fcgi/save"
437
    
438
    @staticmethod
439
    def create_data_dict(title, name, content, syntax):
440
        return dict(
441
            content=content,
442
            author=name,
443
            title=title,
444
            save='save',      
445
            language=syntax,
446
            channel='none',
447
        )
448
        
449
    @staticmethod
450
    def create_data_from_paste(paste):
451
        return dict(
452
            content=paste.code,
453
            author=paste.author,
454
            title=paste.title,
455
            save='save',      
456
            language=paste.lang,
457
            channel='none',
458
        )
459
    
460
    @classmethod
461
    def get_syntax_items(cls):
462
        return [
463
            ("apacheconf","ApacheConf"),
464
            ("BBCode", "bbcode"),
465
            ("Bash", "bash"),
466
            ("C", "c"),
467
            ("C#", "csharp"),
468
            ("C++", "cpp"),
469
            ("CSS", "css"),
470
            ("Clojure", "clojure"),
471
            ("Common Lisp", "common-lisp"),
472
            ("D", "d"),
473
            ("HTML", "html"),
474
            ("Haskell", "haskell"),
475
            ("INI", "ini"),
476
            ("Io", "io"),
477
            ("Java", "java"),
478
            ("JavaScript", "js"),
479
            ("Lighttpd configuration file", "lighty"),
480
            ("Lua", "lua"),
481
            ("Makefile", "make"),
482
            ("Objective-C", "objective-c"),
483
            ("PHP", "php"),
484
            ("Perl", "perl"),
485
            ("Python", "python"),
486
            ("Python 3", "python3"),
487
            ("Python 3.0 Traceback", "py3tb"),
488
            ("Python Traceback", "pytb"),
489
            ("Python console session", "pycon"),
490
            ("Raw token data","raw"),
491
            ("Ruby", "rb"),
492
            ("SQL", "sql"),
493
            ("Scala", "scala"),
494
            ("Text only", "text"),
495
            ("VimL", "vim"),
496
            ("XML", "xml"),
497
            ("YAML", "yaml"),
498
            ("reStructuredText", "rst"),
499
            ("sqlite3con", "sqlite3"),
500
        ]
501
502
503
from urllib import urlencode
504
from urllib2 import urlopen, Request
505
def fetch_url(url, data={}, auth=None):
506
    """
507
    fetch a URL.
508
509
    It takes these arguments:
510
511
        ``url``: the url to fetch
512
        ``data`` (optional): Additional POST data
513
        ``auth`` (optional): A tuple in the format (username, password) that's
514
                             used for http authentication
515
516
    """
517
    req = Request(url)
518
519
    if auth:
520
        base64string = base64.encodestring('%s:%s' % auth)[:-1]
521
        req.add_header("Authorization", "Basic %s" % base64string)
522
523
    if data:
524
        urlargs = (req, urlencode(data))
525
    else:
526
        urlargs = (req,)
527
528
    def _fetcher():
529
        try:
530
            f = urlopen(*urlargs)
531
            content = f.read()
532
            url = f.url
533
        except Exception, e:
534
            content = str(e)
535
            url = None
536
        return url, content
537
    return _fetcher()
538
        
539
class Paster(object):
540
        
541
    def __init__(self):
542
        self.pastedlinks=[]
543
        
544
    def supported_services(self):
545
        return ("HPaste")
546
        
547
    def paste(self, paste):
548
        d=HPaste.create_data_from_paste(paste)
549
        link=fetch_url(HPaste.PASTE_URL, d)[0]
550
        self.pastedlinks.append(link)
551
        return link
552
        #print "pasted..: ", link
553
        
554
                
555
class PasterWidget(gtk.VBox):
556
    
557
    def __init__(self, *args):
558
        super(PasterWidget, self).__init__(*args)
559
        self._init_comps()
560
        self.paster=Paster()
561
        
562
    def _init_comps(self):
563
        self.tbl=gtk.Table(6, 2)
564
        self.tbl.set_row_spacings(10)
565
        self.tbl.set_col_spacings(4)
566
        self.tbl.attach(gtk.Label("Author: "),0, 1, 0, 1)
567
        self.authorentry=gtk.Entry()
568
        self.tbl.attach(self.authorentry, 1, 2, 0, 1)
569
        
570
        self.tbl.attach(gtk.Label("Title: "), 0, 1, 1, 2)
571
        self.titleentry=gtk.Entry()
572
        self.tbl.attach(self.titleentry, 1, 2, 1, 2)
573
        
574
        self.tbl.attach(gtk.Label("Code: "),0, 1, 2, 3)
575
        self.txtview=gtk.TextView()
576
        scrolled=gtk.ScrolledWindow()
577
        scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
578
        scrolled.add(self.txtview)
579
        self.tbl.attach(scrolled, 1, 2, 2, 3)
580
        
581
        self.tbl.attach(gtk.Label("Language: "), 0, 1, 3, 4)
582
        self.langentry=gtk.Entry()
583
        self.tbl.attach(self.langentry, 1, 2, 3, 4)
584
        
585
        self.tbl.attach(gtk.Label("Link: "), 0, 1, 4, 5)
586
        self.linkentry=gtk.Entry()
587
        self.tbl.attach(self.linkentry, 1, 2, 4, 5)
588
        
589
        self.btn_paste=gtk.Button("Paste!")
590
        self.btn_paste.connect("clicked", self._on_paste)
591
        self.tbl.attach(self.btn_paste, 1, 2, 5, 6)
592
        
593
        self.add(self.tbl)
594
        
595
    def _on_paste(self, widget):
596
        author=self.authorentry.get_text()
597
        title=self.titleentry.get_text()
598
        buf=self.txtview.get_buffer()
599
        code=buf.get_text(buf.get_start_iter(), buf.get_end_iter())
600
        lang=self.langentry.get_text()
601
        
602
        paste=Paste(author=author, title=title, code=code, lang=lang)
603
        link=self.paster.paste(paste)
604
        if link:
605
            self.linkentry.set_text(link)
606
        
425
607
        
426
608
class TabWidget(gtk.Notebook):
427
609
    
@@ -431,6 +613,7 @@ class TabWidget(gtk.Notebook):
431
613
        self.add_terminal()
432
614
        self.add_python_console()
433
615
        self.add_scribble()
616
        self.add_paster()
434
617
        
435
618
    def add_terminal(self):
436
619
        self.gterminal=GeditTerminal()
@@ -447,6 +630,15 @@ class TabWidget(gtk.Notebook):
447
630
        self.scribble_scrolled_window.add(self.scribble_tv)
448
631
        self.append_page(self.scribble_scrolled_window, gtk.Label("Scribble"))
449
632
        
633
    
634
    def add_paster(self):
635
        #FIXME
636
        scrolled=gtk.ScrolledWindow()
637
        scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
638
        self.paster=PasterWidget()
639
        scrolled.add(self.paster)
640
        self.append_page(scrolled, gtk.Label("Paster"))
641
        
450
642
    #def add_simple_label(self):
451
643
        #self.append_page(gtk.Label("Hi"), gtk.Label("simple label"))
452
644