105 lines
3.5 KiB
Python
105 lines
3.5 KiB
Python
#------------------------------------------------------------------------------
|
|
#
|
|
# Python GUI - Text Editor - Cocoa
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
|
|
from AppKit import NSTextView, NSScrollView, NSViewWidthSizable, \
|
|
NSMutableParagraphStyle
|
|
from GUI import export
|
|
from GUI import StdFonts
|
|
from GUI.Utils import NSMultiClass, PyGUI_NS_EventHandler
|
|
from GUI.GTextEditors import TextEditor as GTextEditor
|
|
|
|
NUM_TAB_STOPS = 32
|
|
|
|
class TextEditor(GTextEditor):
|
|
|
|
_ns_handle_mouse = True
|
|
|
|
def __init__(self, scrolling = 'hv', **kwds):
|
|
width = 100
|
|
height = 100
|
|
frame = ((0, 0), (width, height))
|
|
ns_outer = NSScrollView.alloc().initWithFrame_(frame)
|
|
ns_outer.setHasHorizontalScroller_('h' in scrolling)
|
|
ns_outer.setHasVerticalScroller_('v' in scrolling)
|
|
if 'h' in scrolling:
|
|
cwidth = 2000
|
|
else:
|
|
cwidth = ns_outer.contentSize()[0]
|
|
frame = ((0, 0), (cwidth, height))
|
|
ns_inner = PyGUI_NSTextView.alloc().initWithFrame_(frame)
|
|
ns_inner.pygui_component = self
|
|
ps = NSMutableParagraphStyle.alloc().init()
|
|
ps.setDefaultTabInterval_(ps.tabStops()[0].location())
|
|
ps.setTabStops_([])
|
|
ns_inner.setDefaultParagraphStyle_(ps)
|
|
ns_inner.setAllowsUndo_(True)
|
|
ns_outer.setDocumentView_(ns_inner)
|
|
if 'h' not in scrolling:
|
|
ns_inner.setAutoresizingMask_(NSViewWidthSizable)
|
|
if 'font' not in kwds:
|
|
kwds['font'] = StdFonts.application_font
|
|
GTextEditor.__init__(self, ns_outer,
|
|
_ns_inner_view = ns_inner, **kwds)
|
|
|
|
def get_text(self):
|
|
return self._ns_inner_view.string()
|
|
|
|
def set_text(self, value):
|
|
self._ns_inner_view.setString_(value)
|
|
self._ns_apply_style()
|
|
|
|
def get_text_length(self):
|
|
return self._ns_inner_view.textStorage().length()
|
|
|
|
def get_selection(self):
|
|
start, length = self._ns_inner_view.selectedRanges()[0].rangeValue()
|
|
return (start, start + length)
|
|
|
|
def set_selection(self, value):
|
|
start, stop = value
|
|
self._ns_inner_view.setSelectedRange_((start, stop - start))
|
|
|
|
def get_font(self):
|
|
return self._font
|
|
|
|
def set_font(self, font):
|
|
self._font = font
|
|
self._ns_inner_view.setFont_(font._ns_font)
|
|
|
|
def get_tab_spacing(self):
|
|
#ns_storage = self._ns_inner_view.textStorage()
|
|
#ps, _ = ns_storage.attribute_atIndex_effectiveRange_("NSParagraphStyle", 0)
|
|
ps = self._ns_inner_view.defaultParagraphStyle()
|
|
return ps.defaultTabInterval()
|
|
|
|
def set_tab_spacing(self, x):
|
|
ps = NSMutableParagraphStyle.alloc().init()
|
|
ps.setTabStops_([])
|
|
ps.setDefaultTabInterval_(x)
|
|
self._ns_inner_view.setDefaultParagraphStyle_(ps)
|
|
self._ns_apply_style()
|
|
|
|
def paste_cmd(self):
|
|
GTextEditor.paste_cmd(self)
|
|
self._ns_apply_style()
|
|
|
|
def _ns_apply_style(self):
|
|
ns_textview = self._ns_inner_view
|
|
ps = ns_textview.defaultParagraphStyle()
|
|
font = ns_textview.font()
|
|
ns_storage = self._ns_inner_view.textStorage()
|
|
ns_storage.setAttributes_range_(
|
|
{"NSParagraphStyle": ps, "NSFont": font},
|
|
(0, self.text_length))
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
class PyGUI_NSTextView(NSTextView, PyGUI_NS_EventHandler):
|
|
__metaclass__ = NSMultiClass
|
|
__slots__ = ['pygui_component']
|
|
|
|
export(TextEditor)
|