"""A module for editing files with a text editor."""
import wx.stc
from kvalikirstu2 import argument_parser
from kvalikirstu2 import paragraph_analyzer
from kvalikirstu2 import gui_utils
from kvalikirstu2.localization import _
[docs]class ParagraphErrorWindow(wx.Dialog):
""" Window for displaying paragraph errors.
"""
def __init__(self, model, message, parsing_exception: paragraph_analyzer.ParagraphParsingException):
super().__init__(None, title=_("Paragraph parsing error - %s") % parsing_exception.temp_path,
style=wx.DEFAULT_DIALOG_STYLE | wx.STAY_ON_TOP)
self.parsing_exception = parsing_exception
self.model = model
self.message = message
self.args = argument_parser.get_args()
self.edit_window = None
self._init_window()
def _init_window(self):
outer_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer = wx.BoxSizer(wx.HORIZONTAL)
static_icon = wx.StaticBitmap(self, bitmap=wx.ArtProvider.GetBitmap(wx.ART_ERROR), size=(32, 32))
main_sizer.Add(static_icon, flag=wx.ALL, border=10)
controls_sizer = wx.BoxSizer(wx.VERTICAL)
error_text = wx.StaticText(self, label=self.message)
error_text.Wrap(600)
error_text_sizer = wx.BoxSizer(wx.HORIZONTAL)
error_text_sizer.Add(error_text, flag=wx.TOP, border=15)
controls_sizer.Add(error_text_sizer, flag=wx.RIGHT, border=10)
outer_button_panel = wx.Panel(self)
outer_button_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
outer_button_panel.SetSizer(outer_button_panel_sizer)
self.open_button = wx.Button(outer_button_panel, label=_("Edit file..."))
outer_button_panel_sizer.Add(self.open_button, flag=wx.ALL, border=15)
self.abort_button = wx.Button(outer_button_panel, label=_("Abort"))
outer_button_panel_sizer.Add(self.abort_button, flag=wx.RIGHT | wx.TOP | wx.BOTTOM, border=15)
main_sizer.Add(controls_sizer)
outer_sizer.Add(main_sizer)
outer_sizer.Add(outer_button_panel, flag=wx.ALIGN_RIGHT)
self.SetSizerAndFit(outer_sizer)
self.CenterOnScreen()
self._bind_buttons()
def _open_pressed(self, _):
"""Pressed save button."""
self.edit_window = TmpEditWindow(self.model, self.parsing_exception, None,
style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX)
result = self.edit_window.ShowModal()
self.edit_window.Destroy()
self.EndModal(result)
def _abort_pressed(self, _):
"""Pressed cancel button."""
self.EndModal(wx.ID_OK)
def _exit(self, _):
self.EndModal(wx.ID_CANCEL)
def _bind_buttons(self):
"""Bind the window buttons."""
self.Bind(wx.EVT_BUTTON, self._open_pressed, self.open_button)
self.Bind(wx.EVT_BUTTON, self._abort_pressed, self.abort_button)
self.Bind(wx.EVT_CLOSE, self._exit)
[docs]class TmpEditWindow(wx.Dialog, gui_utils.HotkeyMixin): # Dialog instead of Frame to send EndModal ID to caller
"""The header editing window."""
def __init__(self, model, parsing_exception, *args, **kwargs):
"""Initializes the window."""
super().__init__(*args, **kwargs)
gui_utils.HotkeyMixin.__init__(self)
self.model = model
self.temp_file_path = parsing_exception.temp_path
self.row_min = parsing_exception.row_min
self.row_max = parsing_exception.row_max
self.args = argument_parser.get_args()
self.init_window()
def _highlight_rows(self):
self.styled_ctrl.MarkerDefine(0, wx.stc.STC_MARK_ARROW, "red")
for index in range(self.row_min, self.row_max):
self.styled_ctrl.MarkerAdd(index, 0)
def _scroll_window(self):
target = self.row_min - 1
if target > 0:
self.styled_ctrl.ScrollToLine(target)
[docs] def init_window(self):
"""Initializes the window."""
self.panel = wx.Panel(self)
self.sizer = wx.GridBagSizer(hgap=5, vgap=5)
self.styled_ctrl = wx.stc.StyledTextCtrl(self.panel, size=(900, 500))
self.styled_ctrl.SetReadOnly(False)
self.sizer.Add(self.styled_ctrl, pos=(0, 0), flag=wx.EXPAND | wx.ALL, span=(1, 3),
border=self.args.padding)
button_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.save_button = wx.Button(self.panel, label=_("Save"))
button_sizer.Add(self.save_button)
button_sizer.AddSpacer(self.args.padding)
self.cancel_button = wx.Button(self.panel, label=_("Cancel"))
button_sizer.Add(self.cancel_button)
self.sizer.Add(button_sizer, pos=(1, 2), flag=wx.ALIGN_RIGHT | wx.ALL,
border=self.args.padding)
self.sizer.AddGrowableCol(0)
self.sizer.AddGrowableRow(0)
self.SetTitle(_("Temporary file - %s") % self.temp_file_path)
self._bind_buttons()
self._load_tempfile_content()
gui_utils.add_border_and_fit(self.panel, self.sizer, self)
self.Center()
self._scroll_window()
def _load_tempfile_content(self):
text = self.model.get_tempfile_content(self.temp_file_path)
self.styled_ctrl.SetText(text)
self._highlight_rows()
def _save_pressed(self):
"""Pressed save button."""
text = self.styled_ctrl.GetText()
self.model.save_tempfile_content(self.temp_file_path, text)
wx.MessageBox(_("File saved successfully."), _("Info"))
self.EndModal(wx.ID_SAVE)
def _cancel_pressed(self, _tmp):
"""Pressed cancel button."""
self.EndModal(wx.ID_CANCEL)
def _bind_buttons(self):
"""Bind the window buttons."""
self.Bind(wx.EVT_BUTTON, lambda evt: self._save_pressed(), self.save_button)
self.Bind(wx.EVT_BUTTON, self._cancel_pressed, self.cancel_button)
self._add_hotkey(83, wx.MOD_CONTROL, self._save_pressed)
[docs]def open_temp_error(model, message, exception):
"""Open a temp file error window."""
window = ParagraphErrorWindow(model, message, exception)
return_val = window.ShowModal()
window.Destroy()
return return_val