# -*- coding: utf-8 -*- """Optionsdialoge, programmatisch ueber com.sun.star.awt aufgebaut.""" import sys import uno from synopse.builder import Options from synopse.i18n import t def message(ctx, text, title=None): if title is None: title = t("doc.title") try: toolkit = ctx.ServiceManager.createInstanceWithContext( "com.sun.star.awt.Toolkit", ctx) box = toolkit.createMessageBox( None, uno.Enum("com.sun.star.awt.MessageBoxType", "INFOBOX"), 1, # BUTTONS_OK title, text) box.execute() box.dispose() except Exception: # Ohne Dialogfenster bleibt nur die Konsole sys.stderr.write("%s: %s\n" % (title, text)) def _add(model, kind, name, props): ctrl = model.createInstance("com.sun.star.awt.UnoControl%sModel" % kind) for key, value in props.items(): setattr(ctrl, key, value) model.insertByName(name, ctrl) return ctrl def _dialog(ctx, model): dlg = ctx.ServiceManager.createInstanceWithContext( "com.sun.star.awt.UnoControlDialog", ctx) dlg.setModel(model) toolkit = ctx.ServiceManager.createInstanceWithContext( "com.sun.star.awt.Toolkit", ctx) dlg.createPeer(toolkit, None) return dlg def _buttons(model, y): _add(model, "Button", "btnOk", dict(PositionX=128, PositionY=y, Width=54, Height=16, Label=t("dlg.ok"), PushButtonType=1, DefaultButton=True)) _add(model, "Button", "btnCancel", dict(PositionX=186, PositionY=y, Width=54, Height=16, Label=t("dlg.cancel"), PushButtonType=2)) def show_options(ctx, edit_authors, note_authors): """Optionen fuer die Synopse aus der Aenderungsverfolgung.""" people = sorted(edit_authors | note_authors) count = len(people) names = ", ".join(people) or t("dlg.people.none") if len(names) > 52: names = names[:49] + "\u2026" model = ctx.ServiceManager.createInstanceWithContext( "com.sun.star.awt.UnoControlDialogModel", ctx) model.setPropertyValues( ("PositionX", "PositionY", "Width", "Height", "Title"), (120, 120, 248, 264, t("dlg.title"))) _add(model, "FixedText", "lblPeople", dict(PositionX=8, PositionY=6, Width=232, Height=10, Label=t("dlg.people", count, names))) _add(model, "FixedLine", "sep0", dict(PositionX=8, PositionY=18, Width=232, Height=6, Label=t("dlg.group.mode"))) _add(model, "RadioButton", "optCum", dict(PositionX=14, PositionY=30, Width=226, Height=12, State=1, Label=t("dlg.mode.cumulative"))) _add(model, "RadioButton", "optStack", dict(PositionX=14, PositionY=43, Width=226, Height=12, Label=t("dlg.mode.stacked"))) _add(model, "RadioButton", "optAuthor", dict(PositionX=14, PositionY=56, Width=226, Height=12, Label=t("dlg.mode.separate", count))) _add(model, "FixedText", "hint", dict(PositionX=26, PositionY=69, Width=214, Height=18, MultiLine=True, Label=t("dlg.mode.hint"))) _add(model, "FixedLine", "sep1", dict(PositionX=8, PositionY=92, Width=232, Height=6, Label=t("dlg.group.content"))) _add(model, "CheckBox", "chkDel", dict(PositionX=8, PositionY=104, Width=232, Height=12, State=1, Label=t("dlg.opt.deletions"))) _add(model, "CheckBox", "chkElide", dict(PositionX=8, PositionY=118, Width=232, Height=12, State=1, Label=t("dlg.opt.elide"))) _add(model, "CheckBox", "chkFinal", dict(PositionX=8, PositionY=132, Width=232, Height=12, State=1, Label=t("dlg.opt.final"))) _add(model, "CheckBox", "chkNotes", dict(PositionX=8, PositionY=146, Width=232, Height=12, State=1, Label=t("dlg.opt.notes"))) _add(model, "CheckBox", "chkQuote", dict(PositionX=20, PositionY=160, Width=220, Height=12, State=1, Label=t("dlg.opt.quote"))) _add(model, "CheckBox", "chkOnly", dict(PositionX=8, PositionY=178, Width=232, Height=12, State=0, Label=t("dlg.opt.onlychanged"))) _add(model, "FixedLine", "sep2", dict(PositionX=8, PositionY=194, Width=232, Height=6, Label=t("dlg.group.target"))) _add(model, "CheckBox", "chkNum", dict(PositionX=8, PositionY=206, Width=110, Height=12, State=1, Label=t("dlg.opt.numbering"))) _add(model, "CheckBox", "chkLand", dict(PositionX=124, PositionY=206, Width=116, Height=12, State=1, Label=t("dlg.opt.landscape"))) _buttons(model, 238) dlg = _dialog(ctx, model) try: if dlg.execute() != 1: return None opts = Options() if model.getByName("optAuthor").State: opts.mode = "per_author" elif model.getByName("optStack").State: opts.mode = "stacked" else: opts.mode = "cumulative" opts.show_deletions = bool(model.getByName("chkDel").State) opts.elide = bool(model.getByName("chkElide").State) opts.show_final = bool(model.getByName("chkFinal").State) opts.show_notes = bool(model.getByName("chkNotes").State) opts.show_quotes = bool(model.getByName("chkQuote").State) opts.only_changed = bool(model.getByName("chkOnly").State) opts.numbering = bool(model.getByName("chkNum").State) opts.landscape = bool(model.getByName("chkLand").State) return opts finally: dlg.dispose() def show_compare_options(ctx, docs, current=None): """Auswahl der beiden Dokumente. Liefert (quelle, ziel, options).""" from synopse.compare import CompareOptions, document_title titles = [document_title(d) for d in docs] # Vorauswahl: aktuelles Dokument als Endfassung, das andere als Quelle target_idx = docs.index(current) if current in docs else len(docs) - 1 source_idx = 0 if target_idx != 0 else 1 model = ctx.ServiceManager.createInstanceWithContext( "com.sun.star.awt.UnoControlDialogModel", ctx) model.setPropertyValues( ("PositionX", "PositionY", "Width", "Height", "Title"), (120, 120, 248, 258, t("cmp.title"))) _add(model, "FixedLine", "sep0", dict(PositionX=8, PositionY=6, Width=232, Height=6, Label=t("cmp.group.docs"))) _add(model, "FixedText", "lblSrc", dict(PositionX=8, PositionY=18, Width=232, Height=10, Label=t("cmp.source"))) _add(model, "ListBox", "lstSrc", dict(PositionX=8, PositionY=29, Width=232, Height=12, Dropdown=True, StringItemList=tuple(titles), SelectedItems=(source_idx,))) _add(model, "FixedText", "lblTgt", dict(PositionX=8, PositionY=46, Width=232, Height=10, Label=t("cmp.target"))) _add(model, "ListBox", "lstTgt", dict(PositionX=8, PositionY=57, Width=232, Height=12, Dropdown=True, StringItemList=tuple(titles), SelectedItems=(target_idx,))) _add(model, "FixedLine", "sep1", dict(PositionX=8, PositionY=76, Width=232, Height=6, Label=t("cmp.group.comments"))) _add(model, "RadioButton", "optCol", dict(PositionX=14, PositionY=88, Width=226, Height=12, State=1, Label=t("cmp.comments.column"))) _add(model, "RadioButton", "optInline", dict(PositionX=14, PositionY=101, Width=226, Height=12, Label=t("cmp.comments.inline"))) _add(model, "RadioButton", "optNone", dict(PositionX=14, PositionY=114, Width=226, Height=12, Label=t("cmp.comments.none"))) _add(model, "FixedText", "hint", dict(PositionX=26, PositionY=127, Width=214, Height=18, MultiLine=True, Label=t("cmp.comments.hint"))) _add(model, "FixedLine", "sep2", dict(PositionX=8, PositionY=150, Width=232, Height=6, Label=t("cmp.group.display"))) _add(model, "CheckBox", "chkHi", dict(PositionX=8, PositionY=162, Width=232, Height=12, State=1, Label=t("cmp.opt.highlight"))) _add(model, "CheckBox", "chkQuote", dict(PositionX=8, PositionY=176, Width=232, Height=12, State=1, Label=t("cmp.opt.quote"))) _add(model, "CheckBox", "chkOnly", dict(PositionX=8, PositionY=190, Width=232, Height=12, State=0, Label=t("cmp.opt.onlychanged"))) _add(model, "CheckBox", "chkNum", dict(PositionX=8, PositionY=204, Width=110, Height=12, State=1, Label=t("dlg.opt.numbering"))) _add(model, "CheckBox", "chkLand", dict(PositionX=124, PositionY=204, Width=116, Height=12, State=1, Label=t("dlg.opt.landscape"))) _buttons(model, 232) dlg = _dialog(ctx, model) try: if dlg.execute() != 1: return None src = model.getByName("lstSrc").SelectedItems tgt = model.getByName("lstTgt").SelectedItems if not src or not tgt or src[0] == tgt[0]: message(ctx, t("msg.different")) return None opts = CompareOptions() if model.getByName("optInline").State: opts.comments = "inline" elif model.getByName("optNone").State: opts.comments = "none" else: opts.comments = "column" opts.highlight = bool(model.getByName("chkHi").State) opts.show_quotes = bool(model.getByName("chkQuote").State) opts.only_changed = bool(model.getByName("chkOnly").State) opts.numbering = bool(model.getByName("chkNum").State) opts.landscape = bool(model.getByName("chkLand").State) return docs[src[0]], docs[tgt[0]], opts finally: dlg.dispose()