-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcalcullm.py
More file actions
158 lines (121 loc) · 4.48 KB
/
calcullm.py
File metadata and controls
158 lines (121 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
"""
CalcuLLM - AI Assistant for LibreOffice Calc
Supports multiple AI providers: Claude (Anthropic), Venice.ai
"""
import sys
import os
# Logging to file for debugging
LOG_FILE = os.path.expanduser("~/calcullm-debug.log")
def log(msg):
try:
with open(LOG_FILE, "a") as f:
f.write(f"{msg}\n")
except:
pass
log("=" * 50)
log("CalcuLLM Extension Loading")
log(f"Python version: {sys.version}")
log(f"__file__: {__file__}")
# Add pythonpath to sys.path for imports
extension_path = os.path.dirname(__file__)
pythonpath = os.path.join(extension_path, "pythonpath")
if pythonpath not in sys.path:
sys.path.insert(0, pythonpath)
log(f"Added to path: {pythonpath}")
import unohelper
from com.sun.star.ui import XUIElementFactory, XUIElement
from com.sun.star.lang import XComponent
log("Imports successful")
def get_property_value(args, name, default=None):
"""Extract a property value from UNO args tuple."""
for arg in args:
if hasattr(arg, 'Name') and arg.Name == name:
return arg.Value
return default
class ToolPanelUIElement(unohelper.Base, XUIElement, XComponent):
"""
Wrapper that implements XUIElement around an XToolPanel.
This is what createUIElement must return.
"""
def __init__(self, resource_url, frame, tool_panel):
log("ToolPanelUIElement.__init__")
self.resource_url = resource_url
self.frame = frame
self.tool_panel = tool_panel
self.listeners = []
# XUIElement interface
def getFrame(self):
log("ToolPanelUIElement.getFrame called")
return self.frame
def getResourceURL(self):
log("ToolPanelUIElement.getResourceURL called")
return self.resource_url
def getType(self):
log("ToolPanelUIElement.getType called")
# UIElementType.TOOLPANEL = 7
return 7
def getRealInterface(self):
log("ToolPanelUIElement.getRealInterface called")
return self.tool_panel
# XComponent interface
def dispose(self):
log("ToolPanelUIElement.dispose called")
for listener in self.listeners:
try:
listener.disposing(self)
except:
pass
self.listeners = []
def addEventListener(self, listener):
self.listeners.append(listener)
def removeEventListener(self, listener):
if listener in self.listeners:
self.listeners.remove(listener)
class PanelFactory(unohelper.Base, XUIElementFactory):
"""Factory that creates AI sidebar panels."""
def __init__(self, ctx):
log("PanelFactory.__init__ called")
self.ctx = ctx
def createUIElement(self, resource_url, args):
"""Create a new panel instance."""
log(f"createUIElement called with URL: {resource_url}")
log(f"Args count: {len(args) if args else 0}")
for i, arg in enumerate(args):
if hasattr(arg, 'Name'):
log(f" Arg {i}: {arg.Name} = {type(arg.Value)}")
if "CalcuLLMPanel" not in resource_url:
log("URL doesn't contain CalcuLLMPanel, returning None")
return None
frame = get_property_value(args, "Frame")
parent_window = get_property_value(args, "ParentWindow")
log(f"Frame: {frame}")
log(f"ParentWindow: {parent_window}")
if parent_window is None:
log("ParentWindow is None, returning None")
return None
try:
log("Attempting to import AIToolPanel...")
from calcullm.panel import AIToolPanel
log("Import successful, creating panel...")
tool_panel = AIToolPanel(self.ctx, frame, parent_window)
log(f"ToolPanel created: {tool_panel}")
log(f"ToolPanel.getWindow(): {tool_panel.getWindow()}")
# Wrap in XUIElement
log("Creating ToolPanelUIElement wrapper...")
ui_element = ToolPanelUIElement(resource_url, frame, tool_panel)
log(f"UIElement created: {ui_element}")
return ui_element
except Exception as e:
log(f"ERROR creating panel: {e}")
import traceback
log(traceback.format_exc())
return None
log("Registering PanelFactory...")
# Register the implementation with LibreOffice
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(
PanelFactory,
"org.calcullm.PanelFactory",
("com.sun.star.ui.UIElementFactory",)
)
log("Registration complete")