Initial commit

This commit is contained in:
2026-09-11 12:47:00 +02:00
parent a25c7b46f5
commit d108f863e0
24 changed files with 2498 additions and 15 deletions

View File

@@ -0,0 +1,241 @@
# -*- 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()