from GUI import TextEditor, Window, Menu, Font, StdFonts, application
from GUI.StdMenus import basic_menus
from testing import say

font_size = StdFonts.application_font.size
mono_font = Font("Courier", font_size)
sans_font = Font("Helvetica", font_size)

tab_text = \
"""X----X----X
A\tB\tC"""

test_text = \
"""There was a young man from Gossage,
Who was awfully fond of a sausage.
He ate them in bed
Between slices of bread
And lay wake all night trying to think of something to rhyme with 'sausage', but couldn't.
"""

menus = [
    Menu("Test", [
        ("Show Selection/1", 'show_selection_cmd'),
        ("Select 3 to 7/2", 'set_selection_cmd'),
        ("Show Text/3", 'show_text_cmd'),
        ("Set Text/4", 'set_text_cmd'),
        ("Monospaced Font/5", 'mono_cmd'),
        ("Sans-Serif Font/6", 'sans_cmd'),
        ("Show Tab Spacing/7", 'show_tab_spacing_cmd'),
    ]),
]

class TestWindow(Window):

    def setup_menus(self, m):
        Window.setup_menus(self, m)
        m.show_selection_cmd.enabled = True
        m.set_selection_cmd.enabled = True
        m.show_text_cmd.enabled = True
        m.set_text_cmd.enabled = True
        m.mono_cmd.enabled = True
        m.sans_cmd.enabled = True
        m.show_tab_spacing_cmd.enabled = True
        #m..enabled = True
    
    def show_selection_cmd(self):
        say(self.view.selection)
    
    def set_selection_cmd(self):
        self.view.selection = (3, 7)
    
    def show_text_cmd(self):
        say(repr(self.view.text))
    
    def set_text_cmd(self):
        self.view.text = test_text
    
    def mono_cmd(self):
        self.view.font = mono_font
        self.setup_tabs()
    
    def sans_cmd(self):
        self.view.font = sans_font
        self.setup_tabs()
    
    def show_tab_spacing_cmd(self):
        say("Tab spacing =", self.view.tab_spacing)
    
    def setup_tabs(self):
        self.view.tab_spacing = self.view.font.width("X----")

def make_window(x, scrolling, title):
    win = TestWindow(position = (x + 10, 50), size = (300, 400),
        auto_position = False, title = title)
    view = TextEditor(width = 300, height = 400, scrolling = scrolling,
        anchor = 'ltrb')
    win.view = view
    win.setup_tabs()
    view.text = tab_text
    win.add(view)
    view.become_target()
    win.show()

say("""
There should be three text editing areas, one with no scrolling, one with
vertical scrolling and with both horizontal and vertical scrolling.

The ones without horizontal scrolling should wrap text to the width of the
visible area. Text should re-wrap when the window is resized.

There should be tab stops set at the spacing of the X characters in the
top line, and the characters in the next line should line up with them.
""")

make_window(0, '', "No Scrolling")
make_window(310, 'v', "Vertical Scrolling")
make_window(620, 'hv', "Full Scrolling")

app = application()
app.menus = basic_menus() + menus
app.run()
