1 #----------------------------------------------------------------------------
3 # Purpose: Basic Reusable Service View for wx.lib.pydocview
9 # Copyright: (c) 2004-2005 ActiveGrid, Inc.
10 # License: wxWindows License
11 #----------------------------------------------------------------------------
15 import wx
.lib
.pydocview
19 FLOATING_MINIFRAME
= -1
22 class ServiceView(wx
.EvtHandler
):
23 """ Basic Service View.
27 #----------------------------------------------------------------------------
29 #----------------------------------------------------------------------------
31 def __init__(self
, service
):
32 wx
.EvtHandler
.__init
__(self
)
33 self
._viewFrame
= None
34 self
._service
= service
36 self
._embeddedWindow
= None
40 wx
.EvtHandler
.Destroy(self
)
44 return self
._viewFrame
47 def SetFrame(self
, frame
):
48 self
._viewFrame
= frame
51 def _CreateControl(self
, parent
, id):
59 def SetControl(self
, control
):
60 self
._control
= control
63 def OnCreate(self
, doc
, flags
):
64 config
= wx
.ConfigBase_Get()
65 windowLoc
= self
._service
.GetEmbeddedWindowLocation()
66 if windowLoc
== FLOATING_MINIFRAME
:
67 pos
= config
.ReadInt(self
._service
.GetServiceName() + "FrameXLoc", -1), config
.ReadInt(self
._service
.GetServiceName() + "FrameYLoc", -1)
68 # make sure frame is visible
69 screenWidth
= wx
.SystemSettings
.GetMetric(wx
.SYS_SCREEN_X
)
70 screenHeight
= wx
.SystemSettings
.GetMetric(wx
.SYS_SCREEN_Y
)
71 if pos
[0] < 0 or pos
[0] >= screenWidth
or pos
[1] < 0 or pos
[1] >= screenHeight
:
72 pos
= wx
.DefaultPosition
74 size
= wx
.Size(config
.ReadInt(self
._service
.GetServiceName() + "FrameXSize", -1), config
.ReadInt(self
._service
.GetServiceName() + "FrameYSize", -1))
75 title
= _(self
._service
.GetServiceName())
76 if wx
.GetApp().GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
and wx
.GetApp().GetAppName():
77 title
= title
+ " - " + wx
.GetApp().GetAppName()
78 frame
= wx
.MiniFrame(wx
.GetApp().GetTopWindow(), -1, title
, pos
= pos
, size
= size
, style
= wx
.CLOSE_BOX|wx
.CAPTION|wx
.SYSTEM_MENU
)
79 wx
.EVT_CLOSE(frame
, self
.OnCloseWindow
)
80 elif wx
.GetApp().IsMDI():
81 self
._embeddedWindow
= wx
.GetApp().GetTopWindow().GetEmbeddedWindow(windowLoc
)
82 frame
= self
._embeddedWindow
84 pos
= config
.ReadInt(self
._service
.GetServiceName() + "FrameXLoc", -1), config
.ReadInt(self
._service
.GetServiceName() + "FrameYLoc", -1)
85 # make sure frame is visible
86 screenWidth
= wx
.SystemSettings
.GetMetric(wx
.SYS_SCREEN_X
)
87 screenHeight
= wx
.SystemSettings
.GetMetric(wx
.SYS_SCREEN_Y
)
88 if pos
[0] < 0 or pos
[0] >= screenWidth
or pos
[1] < 0 or pos
[1] >= screenHeight
:
89 pos
= wx
.DefaultPosition
91 size
= wx
.Size(config
.ReadInt(self
._service
.GetServiceName() + "FrameXSize", -1), config
.ReadInt(self
._service
.GetServiceName() + "FrameYSize", -1))
92 title
= _(self
._service
.GetServiceName())
93 if wx
.GetApp().GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
and wx
.GetApp().GetAppName():
94 title
= title
+ " - " + wx
.GetApp().GetAppName()
95 frame
= wx
.GetApp().CreateDocumentFrame(self
, doc
, flags
, pos
= pos
, size
= size
)
97 if config
.ReadInt(self
._service
.GetServiceName() + "FrameMaximized", False):
99 wx
.EVT_CLOSE(frame
, self
.OnCloseWindow
)
102 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
104 windowLoc
= self
._service
.GetEmbeddedWindowLocation()
105 if self
._embeddedWindow
or windowLoc
== FLOATING_MINIFRAME
:
106 if (self
._service
.GetEmbeddedWindowLocation() == wx
.lib
.pydocview
.EMBEDDED_WINDOW_BOTTOM
):
107 if ServiceView
.bottomTab
== None:
108 ServiceView
.bottomTab
= wx
.Notebook(frame
, wx
.NewId(), (0,0), (100,100), wx
.LB_DEFAULT
, "Bottom Tab")
109 sizer
.Add(ServiceView
.bottomTab
, 1, wx
.TOP|wx
.EXPAND
, 4)
110 def OnFrameResize(event
):
111 ServiceView
.bottomTab
.SetSize(ServiceView
.bottomTab
.GetParent().GetSize())
112 frame
.Bind(wx
.EVT_SIZE
, OnFrameResize
)
114 self
._control
= self
._CreateControl
(ServiceView
.bottomTab
, wx
.NewId())
115 if self
._control
!= None:
116 ServiceView
.bottomTab
.AddPage(self
._control
, self
._service
.GetServiceName())
117 ServiceView
.bottomTab
.Layout()
120 self
._control
= self
._CreateControl
(frame
, wx
.NewId())
121 sizer
.Add(self
._control
)
124 self
._control
= self
._CreateControl
(frame
, wx
.NewId())
125 sizer
.Add(self
._control
, 1, wx
.EXPAND
, 0)
126 frame
.SetSizer(sizer
)
132 def OnCloseWindow(self
, event
):
133 frame
= self
.GetFrame()
134 config
= wx
.ConfigBase_Get()
135 if frame
and not self
._embeddedWindow
:
136 if not frame
.IsMaximized():
137 config
.WriteInt(self
._service
.GetServiceName() + "FrameXLoc", frame
.GetPositionTuple()[0])
138 config
.WriteInt(self
._service
.GetServiceName() + "FrameYLoc", frame
.GetPositionTuple()[1])
139 config
.WriteInt(self
._service
.GetServiceName() + "FrameXSize", frame
.GetSizeTuple()[0])
140 config
.WriteInt(self
._service
.GetServiceName() + "FrameYSize", frame
.GetSizeTuple()[1])
141 config
.WriteInt(self
._service
.GetServiceName() + "FrameMaximized", frame
.IsMaximized())
143 if not self
._embeddedWindow
:
144 windowLoc
= self
._service
.GetEmbeddedWindowLocation()
145 if windowLoc
== FLOATING_MINIFRAME
:
146 # don't destroy it, just hide it
149 # Call the original OnCloseWindow, could have subclassed SDIDocFrame and MDIDocFrame but this is easier since it will work for both SDI and MDI frames without subclassing both
150 frame
.OnCloseWindow(event
)
153 def Activate(self
, activate
= True):
154 """ Dummy function for SDI mode """
158 def Close(self
, deleteWindow
= True):
160 Closes the view by calling OnClose. If deleteWindow is true, this
161 function should delete the window associated with the view.
169 #----------------------------------------------------------------------------
171 #----------------------------------------------------------------------------
173 def SetCallback(self
, callback
):
174 """ Sets in the event table for a doubleclick to invoke the given callback.
175 Additional calls to this method overwrites the previous entry and only the last set callback will be invoked.
177 wx
.stc
.EVT_STC_DOUBLECLICK(self
.GetControl(), self
.GetControl().GetId(), callback
)
180 #----------------------------------------------------------------------------
182 #----------------------------------------------------------------------------
185 if not self
.GetFrame():
187 return self
.GetFrame().IsShown()
194 def Show(self
, show
= True):
195 self
.GetFrame().Show(show
)
196 if self
._embeddedWindow
:
197 mdiParentFrame
= wx
.GetApp().GetTopWindow()
198 mdiParentFrame
.ShowEmbeddedWindow(self
.GetFrame(), show
)
201 class Service(wx
.lib
.pydocview
.DocService
):
204 #----------------------------------------------------------------------------
206 #----------------------------------------------------------------------------
207 SHOW_WINDOW
= wx
.NewId() # keep this line for each subclass, need unique ID for each Service
210 def __init__(self
, serviceName
, embeddedWindowLocation
= wx
.lib
.pydocview
.EMBEDDED_WINDOW_LEFT
):
211 self
._serviceName
= serviceName
212 self
._embeddedWindowLocation
= embeddedWindowLocation
216 def GetEmbeddedWindowLocation(self
):
217 return self
._embeddedWindowLocation
220 def SetEmbeddedWindowLocation(self
, embeddedWindowLocation
):
221 self
._embeddedWindowLocation
= embeddedWindowLocation
224 def InstallControls(self
, frame
, menuBar
= None, toolBar
= None, statusBar
= None, document
= None):
225 viewMenu
= menuBar
.GetMenu(menuBar
.FindMenu(_("&View")))
226 menuItemPos
= self
.GetMenuItemPos(viewMenu
, viewMenu
.FindItem(_("&Status Bar"))) + 1
228 viewMenu
.InsertCheckItem(menuItemPos
, self
.SHOW_WINDOW
, self
.GetMenuString(), self
.GetMenuDescr())
229 wx
.EVT_MENU(frame
, self
.SHOW_WINDOW
, frame
.ProcessEvent
)
230 wx
.EVT_UPDATE_UI(frame
, self
.SHOW_WINDOW
, frame
.ProcessUpdateUIEvent
)
235 def GetServiceName(self
):
236 """ String used to save out Service View configuration information """
237 return self
._serviceName
240 def GetMenuString(self
):
241 """ Need to override this method to provide menu item for showing Service View """
242 return _(self
.GetServiceName())
245 def GetMenuDescr(self
):
246 """ Need to override this method to provide menu item for showing Service View """
247 return _("Show or hides the %s window") % self
.GetMenuString()
250 #----------------------------------------------------------------------------
251 # Event Processing Methods
252 #----------------------------------------------------------------------------
254 def ProcessEvent(self
, event
):
256 if id == self
.SHOW_WINDOW
:
257 self
.ToggleWindow(event
)
263 def ProcessUpdateUIEvent(self
, event
):
265 if id == self
.SHOW_WINDOW
:
266 event
.Check(self
._view
!= None and self
._view
.IsShown())
273 #----------------------------------------------------------------------------
275 #----------------------------------------------------------------------------
277 def _CreateView(self
):
278 """ This method needs to be overridden with corresponding ServiceView """
279 return ServiceView(self
)
283 # Window Menu Service Method
287 def SetView(self
, view
):
291 def ShowWindow(self
, show
= True):
294 if not self
._view
.IsShown():
297 view
= self
._CreateView
()
298 view
.OnCreate(None, flags
= 0)
302 if self
._view
.IsShown():
306 def HideWindow(self
):
307 self
.ShowWindow(False)
310 def ToggleWindow(self
, event
):
311 show
= event
.IsChecked()
312 wx
.ConfigBase_Get().WriteInt(self
.GetServiceName()+"Shown", show
)
313 self
.ShowWindow(show
)
316 def OnCloseFrame(self
, event
):
320 if wx
.GetApp().IsMDI():
321 self
._view
.OnCloseWindow(event
)
322 # This is called when any SDI frame is closed, so need to check if message window is closing or some other window
323 elif self
._view
== event
.GetEventObject().GetView():