From 85197c91b1cafd5c3ae69dd0fcf4ab0040249a9e Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Thu, 26 May 2016 23:14:58 -0700 Subject: [PATCH] a couple more overview updates, tweak the logo image --- .../images/sphinxdocs/phoenix_main.png | Bin 27938 -> 30482 bytes .../overviews/events_overview.rst | 367 +++++++++++------- .../overviews/filesystem_overview.rst | 83 ++-- 3 files changed, 294 insertions(+), 156 deletions(-) diff --git a/docs/sphinx/_static/images/sphinxdocs/phoenix_main.png b/docs/sphinx/_static/images/sphinxdocs/phoenix_main.png index a16468ba50c0cd75fb099c88d60f9907e4f6fccb..4cf96bb2167e055ac1ee8bd8aecf220b05fb904b 100644 GIT binary patch literal 30482 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 literal 27938 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. +But in all cases wxPython represents these events in a uniform way and +allows you to handle them in the same way wherever they originate +from. And while the events are normally generated by wxPython itself, +you can also do this, which is especially useful when using custom +events (see :ref:`Custom Event Summary `). To be more precise, each event is described by: -- `Event type`: this is simply a value of type `EventType` which uniquely identifies the type of the event. - For example, clicking on a button, selecting an item from a list box and pressing a key on the keyboard all - generate events with different event types. -- `Event class` carried by the event: each event has some information associated with it and this data is represented - by an object of a class derived from :ref:`Event`. Events of different types can use the same event class, for - example both button click and listbox selection events use :ref:`CommandEvent` class (as do all the other simple - control events), but the key press event uses :ref:`KeyEvent` as the information associated with it is different. -- `Event source`: :ref:`Event` stores the object which generated the event and, for windows, its identifier (see - :ref:`Window Identifiers `). As it is common to have more than one object generating events of - the same type (e.g. a typical window contains several buttons, all generating the same button click event), checking - the event source object or its id allows to distinguish between them. +- **Event type**: this is simply a value of type `EventType` which + uniquely identifies the type of the event. For example, clicking on + a button, selecting an item from a list box and pressing a key on + the keyboard all generate events with different event types. + +- **Event class**: carried by the event: each event has some information + associated with it and this data is represented by an object of a + class derived from :ref:`wx.Event`. Events of different types can + use the same event class, for example both button click and listbox + selection events use :ref:`wx.CommandEvent` class (as do all the + other simple control events), but the key press event uses + :ref:`wx.KeyEvent` as the information associated with it is + different. + +- **Event source**: :ref:`wx.Event` stores the object which generated the + event and, for windows, its identifier (see :ref:`Window Identifiers + `). As it is common to have more than one object + generating events of the same type (e.g. a typical window contains + several buttons, all generating the same button click event), + checking the event source object or its id allows to distinguish + between them. @@ -40,13 +57,14 @@ To be more precise, each event is described by: Event Handling -------------- -There is one principal way to handle events in wxPython, which uses :meth:`EvtHandler.Bind` () call and can be used -to bind and unbind the handlers dynamically, i.e. during run-time depending on some conditions. It also allows the direct -binding of events to: +There is one principal way to handle events in wxPython, which uses +the :meth:`wx.EvtHandler.Bind` call and can be used to bind and unbind +the handlers dynamically, i.e. during run-time depending on some +conditions. It also allows the direct binding of events to: -- A handler method in another object. +- A handler method in the same or another object. - An ordinary function like a static method or a global function. -- An arbitrary function. +- An arbitrary callable object. @@ -55,50 +73,53 @@ binding of events to: Dynamic Event Handling ---------------------- -Let us start by looking at the syntax: in any place in your code, but usually in the code of the class defining the handler -itself, call its `Bind()` method like this:: +Let us start by looking at the syntax: in any place in your code, but +usually in the code of the class defining the handler itself, call its +``Bind()`` method like this:: class MyFrame(wx.Frame): - def __init__(self, parent): - wx.Frame.__init__(self, parent) # Other initialization code... - + self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT) -Event handlers can be bound at any moment. For example, it's possible to do some initialization first and only bind the -handlers if and when it succeeds. This can avoid the need to test that the object was properly initialized in the event -handlers themselves. With `Bind()` they simply won't be called if it wasn't correctly initialized. +Event handlers can be bound at any moment. For example, it's possible +to do some initialization first and only bind the handlers if and when +it succeeds. This can avoid the need to test that the object was +properly initialized in the event handlers themselves. With ``Bind()`` +they simply won't be called if it wasn't correctly initialized. -As a slight extension of the above, the handlers can also be unbound at any time with :meth:`EvtHandler.Unbind` () (and maybe rebound later). +As a slight extension of the above, the handlers can also be unbound +at any time with :meth:`wx.EvtHandler.Unbind` (and maybe rebound +later). -Almost last but very, very far from least is the flexibility which allows to bind an event to: +Almost last but very, very far from least is the flexibility which +allows to bind an event to: - A method in another object. - An ordinary function like a static method or a global function. - An arbitrary function. -Let us now look at more examples of how to use different event handlers using the two overloads of `Bind()` function: -first one for the object methods and the other one for arbitrary functors (callable objects, including simple functions). +Let us now look at more examples of how to use different event +handlers using the two overloads of ``Bind()`` function: first one for +the object methods and the other one for arbitrary functors (callable +objects, including simple functions). -In addition to using a method of the object generating the event itself, you can use a method from a completely different -object as an event handler:: +In addition to using a method of the object generating the event +itself, you can use a method from a completely different object as an +event handler:: def OnFrameExit(event): - # Do something useful. - pass - + pass class MyFrame(wx.Frame): - def __init__(self, parent): - wx.Frame.__init__(self, parent) # Other initialization code... @@ -107,7 +128,8 @@ object as an event handler:: -Note that `MyFrameHandler` doesn't need to derive from :ref:`EvtHandler`. +Note that `MyFrameHandler` doesn't need to derive from +:ref:`wx.EvtHandler`. @@ -116,36 +138,63 @@ Note that `MyFrameHandler` doesn't need to derive from :ref:`EvtHandler`. How Events are Processed ------------------------ -The previous sections explain how to define event handlers but don't address the question of how exactly -wxPython finds the handler to call for the given event. This section describes the algorithm used in detail. +The previous sections explain how to define event handlers but don't +address the question of how exactly wxPython finds the handler to call +for the given event. This section describes the algorithm used in +detail. -When an event is received from the windowing system, wxPython calls :meth:`EvtHandler.ProcessEvent` () on -the first event handler object belonging to the window generating the event. The normal order of event table -searching by `ProcessEvent()` is as follows, with the event processing stopping as soon as a handler is found -(unless the handler calls :meth:`Event.Skip` () in which case it doesn't count as having handled the event -and the search continues): +When an event is received from the windowing system, wxPython calls +:meth:`wx.EvtHandler.ProcessEvent` on the first event handler object +belonging to the window generating the event. The normal order of +event table searching by ``ProcessEvent`` is as follows, with the +event processing stopping as soon as a handler is found (unless the +handler calls :meth:`wx.Event.Skip` in which case it doesn't count as +having handled the event and the search continues): -1. Before anything else happens, :meth:`AppConsole.FilterEvent` () is called. If it returns anything but -1 (default), - the event handling stops immediately. -2. If this event handler is disabled via a call to :meth:`EvtHandler.SetEvtHandlerEnabled` () the next three - steps are skipped and the event handler resumes at step (5). -3. If the object is a :ref:`Window` and has an associated validator, :ref:`Validator` gets a chance to process the event. -4. The list of dynamically bound event handlers, i.e., those for which `Bind()` was called, is consulted. -5. The event table containing all the handlers defined using the event table macros in this class and its base classes - is examined. Notice that this means that any event handler defined in a base class will be executed at this step. -6. The event is passed to the next event handler, if any, in the event handler chain, i.e., the steps (1) to (4) are done - for it. Usually there is no next event handler so the control passes to the next step but see :ref:`Event Handlers Chain ` - for how the next handler may be defined. -7. If the object is a :ref:`Window` and the event is set to propagate (by default only :ref:`CommandEvent` -derived events are set to propagate), - then the processing restarts from the step (1) (and excluding the step (7)) for the parent window. If this object is not a window - but the next handler exists, the event is passed to its parent if it is a window. This ensures that in a common case of - (possibly several) non-window event handlers pushed on top of a window, the event eventually reaches the window parent. -8. Finally, i.e., if the event is still not processed, the :ref:`App` object itself (which derives from :ref:`EvtHandler`) - gets a last chance to process it. +1. Before anything else happens, :meth:`wx.AppConsole.FilterEvent` is + called. If it returns anything but -1 (default), the event handling + stops immediately. + +2. If this event handler is disabled via a call to + :meth:`wx.EvtHandler.SetEvtHandlerEnabled` the next three steps are + skipped and the event handler resumes at step (5). + +3. If the object is a :ref:`wx.Window` and has an associated validator, + :ref:`wx.Validator` gets a chance to process the event. + +4. The list of dynamically bound event handlers, i.e., those for which + ``Bind()`` was called, is consulted. + +5. The event table containing all the handlers defined using the event + table macros in this class and its base classes is examined. Notice + that this means that any event handler defined in a base class will + be executed at this step. + +6. The event is passed to the next event handler, if any, in the event + handler chain, i.e., the steps (1) to (4) are done for it. Usually + there is no next event handler so the control passes to the next + step but see :ref:`Event Handlers Chain ` for + how the next handler may be defined. + +7. If the object is a :ref:`wx.Window` and the event is set to + propagate (by default only event types derived from + :ref:`wx.CommandEvent` are set to propagate), then the processing + restarts from the step (1) (and excluding the step (7)) for the + parent window. If this object is not a window but the next handler + exists, the event is passed to its parent if it is a window. This + ensures that in a common case of (possibly several) non-window + event handlers pushed on top of a window, the event eventually + reaches the window parent. + +8. Finally, i.e., if the event is still not processed, the + :ref:`wx.App` object itself (which derives from + :ref:`wx.EvtHandler`) gets a last chance to process it. -**Please pay close attention to step 6!** People often overlook or get confused by this powerful feature of the wxPython -event processing system. The details of event propagation up the window hierarchy are described in the next section. +**Please pay close attention to step 6!** People often overlook or get +confused by this powerful feature of the wxPython event processing +system. The details of event propagation up the window hierarchy are +described in the next section. @@ -154,32 +203,49 @@ event processing system. The details of event propagation up the window hierarch How Events Propagate Upwards ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -As mentioned above, the events of the classes deriving from :ref:`CommandEvent` are propagated by default to the parent -window if they are not processed in this window itself. But although by default only the command events are propagated -like this, other events can be propagated as well because the event handling code uses :meth:`Event.ShouldPropagate` () -to check whether an event should be propagated. It is also possible to propagate the event only a limited number of times -and not until it is processed (or a top level parent window is reached). +As mentioned above, the events of the classes deriving from +:ref:`wx.CommandEvent` are propagated by default to the parent window if +they are not processed in this window itself. But although by default +only the command events are propagated like this, other events can be +propagated as well because the event handling code uses +:meth:`wx.Event.ShouldPropagate` to check whether an event should be +propagated. It is also possible to propagate the event only a limited +number of times and not until it is processed (or a top level parent +window is reached). -Finally, there is another additional complication (which, in fact, simplifies life of wxPython programmers significantly): -when propagating the command events up to the parent window, the event propagation stops when it reaches the parent dialog, -if any. This means that you don't risk getting unexpected events from the dialog controls (which might be left unprocessed -by the dialog itself because it doesn't care about them) when a modal dialog is popped up. The events do propagate beyond -the frames, however. The rationale for this choice is that there are only a few frames in a typical application and their -parent-child relation are well understood by the programmer while it may be difficult, if not impossible, to track down all -the dialogs that may be popped up in a complex program (remember that some are created automatically by wxPython). -If you need to specify a different behaviour for some reason, you can use :meth:`Window.SetExtraStyle` (``WS_EX_BLOCK_EVENTS``) -explicitly to prevent the events from being propagated beyond the given window or unset this flag for the dialogs that -have it on by default. +Finally, there is another additional complication (which, in fact, +simplifies life of wxPython programmers significantly): when +propagating the command events up to the parent window, the event +propagation stops when it reaches the parent dialog, if any. This +means that you don't risk getting unexpected events from the dialog +controls (which might be left unprocessed by the dialog itself because +it doesn't care about them) when a modal dialog is popped up. The +events do propagate beyond the frames, however. The rationale for this +choice is that there are only a few frames in a typical application +and their parent-child relation are well understood by the programmer +while it may be difficult, if not impossible, to track down all the +dialogs that may be popped up in a complex program (remember that some +are created automatically by wxPython). If you need to specify a +different behaviour for some reason, you can use +:meth:`wx.Window.SetExtraStyle` (``wx.WS_EX_BLOCK_EVENTS``) explicitly +to prevent the events from being propagated beyond the given window or +unset this flag for the dialogs that have it on by default. -Typically events that deal with a window as a window (size, motion, paint, mouse, keyboard, etc.) are sent only to the window. -Events that have a higher level of meaning or are generated by the window itself (button click, menu select, tree expand, etc.) -are command events and are sent up to the parent to see if it is interested in the event. More precisely, as said above, all -event classes not deriving from :ref:`CommandEvent` (see the :ref:`Event` inheritance diagram) do not propagate upward. +Typically events that deal with a window as a window (size, motion, +paint, mouse, keyboard, etc.) are sent only to the window. Events +that have a higher level of meaning or are generated by the window +itself (button click, menu select, tree expand, etc.) are command +events and are sent up to the parent to see if it is interested in the +event. More precisely, as said above, all event classes not deriving +from :ref:`wx.CommandEvent` (see the :ref:`wx.Event` inheritance +diagram) do not propagate upward. -In some cases, it might be desired by the programmer to get a certain number of system events in a parent window, for -example all key events sent to, but not used by, the native controls in a dialog. In this case, a special event handler -will have to be written that will override `ProcessEvent()` in order to pass all events (or any selection of them) to the -parent window. +In some cases, it might be desired by the programmer to get a certain +number of system events in a parent window, for example all key events +sent to, but not used by, the native controls in a dialog. In this +case, a special event handler will have to be written that will +override ``ProcessEvent()`` in order to pass all events (or any +selection of them) to the parent window. .. _event handlers chain: @@ -187,18 +253,21 @@ parent window. Event Handlers Chain ^^^^^^^^^^^^^^^^^^^^ -The step 4 of the event propagation algorithm checks for the next handler in the event handler chain. This chain can be formed -using :meth:`EvtHandler.SetNextHandler` (): +Step 4 of the event propagation algorithm checks for the next +handler in the event handler chain. This chain can be formed using +:meth:`wx.EvtHandler.SetNextHandler`: .. figure:: _static/images/overviews/overview_events_chain.png :align: center | -(referring to the image, if `A.ProcessEvent` is called and it doesn't handle the event, `B.ProcessEvent` will be called and so on...). +(Referring to the image, if ``A.ProcessEvent`` is called and it doesn't +handle the event, ``B.ProcessEvent`` will be called and so on...). -Additionally, in the case of :ref:`Window` you can build a stack (implemented using :ref:`EvtHandler` double-linked list) using -:meth:`Window.PushEventHandler` (): +Additionally, in the case of :ref:`wx.Window` you can build a stack +(implemented using :ref:`wx.EvtHandler` double-linked list) using +:meth:`wx.Window.PushEventHandler`: .. figure:: _static/images/overviews/overview_events_winstack.png :align: center @@ -207,9 +276,12 @@ Additionally, in the case of :ref:`Window` you can build a stack (implemented us -(referring to the image, if `W.ProcessEvent` is called, it immediately calls `A.ProcessEvent`; if nor A nor B handle the event, -then the :ref:`Window` itself is used -- i.e. the dynamically bind event handlers and static event table entries of :ref:`Window` -are looked as the last possibility, after all pushed event handlers were tested). +(Referring to the image, if ``W.ProcessEvent`` is called, it +immediately calls ``A.ProcessEvent``; if nor A nor B handle the event, +then the :ref:`wx.Window` itself is used -- i.e. the dynamically bind +event handlers and static event table entries of :ref:`wx.Window` are +looked as the last possibility, after all pushed event handlers were +tested). By default the chain is empty, i.e. there is no next handler. @@ -222,10 +294,13 @@ Custom Event Summary General approach ^^^^^^^^^^^^^^^^ -Custom event classes allow you to create more polished-seeming controls by allowing the control's user to process updates -without needing to sub-class the control. However, to effectively use events, you normally need to create custom event classes. +Custom event classes allow you to create more polished-seeming +controls by allowing the control's user to process updates without +needing to sub-class the control. However, to effectively use events, +you normally need to create custom event classes. -This recipe gives you some boilerplate code for creating your own custom event classes:: +This recipe gives you some boilerplate code for creating your own +custom event classes:: import wx import wx.lib.newevent @@ -240,7 +315,8 @@ You can bind the events normally via either binding syntax:: EVT_SOME_NEW_EVENT(self, self.handler) -You can also attach arbitrary data to the event during its creation, then post it to whatever window you choose:: +You can also attach arbitrary data to the event during its creation, +then post it to whatever window you choose:: # Create the event evt = SomeNewEvent(attr1="hello", attr2=654) @@ -248,8 +324,10 @@ You can also attach arbitrary data to the event during its creation, then post i wx.PostEvent(target, evt) -When handling events with such arbitrary data, you can fetch the data via attributes, named the same as the names -passed in during the event instance creation. That is, given the two keyword arguments passed to SomeNewEvent above:: +When handling events with such arbitrary data, you can fetch the data +via attributes, named the same as the names passed in during the event +instance creation. That is, given the two keyword arguments passed to +``SomeNewEvent`` above:: def handler(self, evt): @@ -269,22 +347,34 @@ Miscellaneous Notes User Generated Events vs Programmatically Generated Events ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -While generically a :ref:`Event` can be generated both by user actions (e.g., resize of a :ref:`Window`) and by calls to functions -(e.g., :meth:`Window.SetSize`), wxPython controls normally send :ref:`CommandEvent` -derived events only for the user-generated +While generically a :ref:`wx.Event` can be generated both by user actions +(e.g., resize of a :ref:`wx.Window`) and by calls to functions (e.g., +:meth:`wx.Window.SetSize`), wxPython controls normally send +:ref:`wx.CommandEvent` -derived events only for the user-generated events. The only exceptions to this rule are: -- :meth:`BookCtrlBase.AddPage` No event-free alternatives -- :meth:`BookCtrlBase.AdvanceSelection` No event-free alternatives -- :meth:`BookCtrlBase.DeletePage` No event-free alternatives -- :meth:`Notebook.SetSelection`: Use :meth:`Notebook.ChangeSelection` instead, as :meth:`Notebook.SetSelection` is deprecated -- :meth:`TreeCtrl.Delete`: No event-free alternatives -- :meth:`TreeCtrl.DeleteAllItems`: No event-free alternatives -- :meth:`TreeCtrl.EditLabel`: No event-free alternatives -- All :ref:`TextCtrl` methods +- :meth:`wx.BookCtrlBase.AddPage` No event-free alternatives + +- :meth:`wx.BookCtrlBase.AdvanceSelection` No event-free alternatives + +- :meth:`wx.BookCtrlBase.DeletePage` No event-free alternatives + +- :meth:`wx.Notebook.SetSelection`: Use :meth:`wx.Notebook.ChangeSelection` + instead, as :meth:`wx.Notebook.SetSelection` is deprecated + +- :meth:`wx.TreeCtrl.Delete`: No event-free alternatives + +- :meth:`wx.TreeCtrl.DeleteAllItems`: No event-free alternatives + +- :meth:`wx.TreeCtrl.EditLabel`: No event-free alternatives + +- All :ref:`wx.TextCtrl` methods -:meth:`TextEntry.ChangeValue` can be used instead of :meth:`TextEntry.SetValue` but the other functions, such as :meth:`TextEntry.Replace` -or :meth:`TextCtrl.WriteText` don't have event-free equivalents. +:meth:`wx.TextEntry.ChangeValue` can be used instead of +:meth:`wx.TextEntry.SetValue` but the other functions, such as +:meth:`wx.TextEntry.Replace` or :meth:`wx.TextCtrl.WriteText` don't +have event-free equivalents. @@ -293,20 +383,31 @@ or :meth:`TextCtrl.WriteText` don't have event-free equivalents. Window Identifiers ^^^^^^^^^^^^^^^^^^ -Window identifiers are integers, and are used to uniquely determine window identity in the event system (though you can use it -for other purposes). In fact, identifiers do not need to be unique across your entire application as long they are unique within -the particular context you're interested in, such as a frame and its children. You may use the ``ID_OK`` identifier, for example, -on any number of dialogs as long as you don't have several within the same dialog. +Window identifiers are integers, and are used to uniquely determine +window identity in the event system (though you can use it for other +purposes). In fact, identifiers do not need to be unique across your +entire application as long they are unique within the particular +context you're interested in, such as a frame and its children. You +may use the ``wx.ID_OK`` identifier, for example, on any number of +dialogs as long as you don't have several within the same dialog. -If you pass ``ID_ANY`` or -1 to a window constructor, an identifier will be generated for you automatically by wxPython. This is useful -when you don't care about the exact identifier either because you're not going to process the events from the control being created -or because you process the events from all controls in one place (in which case you should specify ``ID_ANY`` in the :meth:`EvtHandler.Bind` -call as well). The automatically generated identifiers are always negative and so will never conflict with the user-specified -identifiers which must be always positive. +If you pass ``wx.ID_ANY`` or -1 to a window constructor, an identifier +will be generated for you automatically by wxPython. This is useful +when you don't care about the exact identifier either because you're +not going to process the events from the control being created or +because you process the events from all controls in one place (in +which case you should specify ``wx.ID_ANY`` in the +:meth:`wx.EvtHandler.Bind` call as well). The automatically generated +identifiers are always negative and so will never conflict with the +user-specified identifiers which must be always positive. -.. seealso:: See :ref:`Standard event identifiers ` for the list of standard identifiers available. +.. seealso:: See :ref:`Standard event identifiers ` + for the list of standard identifiers available. -You can use ``ID_HIGHEST`` to determine the number above which it is safe to define your own identifiers. Or, you can use identifiers below ``ID_LOWEST``. -Finally, you can allocate identifiers dynamically using :func:`NewId` () function too. If you use :func:`NewId` () consistently in your -application, you can be sure that your identifiers don't conflict accidentally. +You can use ``wx.ID_HIGHEST`` to determine the number above which it is +safe to define your own identifiers. Or, you can use identifiers below +``wx.ID_LOWEST``. Finally, you can allocate identifiers dynamically +using :func:`wx.NewId` function too. If you use :func:`wx.NewId` +consistently in your application, you can be sure that your +identifiers don't conflict accidentally. diff --git a/docs/sphinx/rest_substitutions/overviews/filesystem_overview.rst b/docs/sphinx/rest_substitutions/overviews/filesystem_overview.rst index a8249ec9..f7b4a463 100644 --- a/docs/sphinx/rest_substitutions/overviews/filesystem_overview.rst +++ b/docs/sphinx/rest_substitutions/overviews/filesystem_overview.rst @@ -7,34 +7,59 @@ |phoenix_title| **FileSystem Overview** ======================================== -The wxHTML library uses a **virtual** file systems mechanism similar to the one used in Midnight Commander, Dos Navigator, FAR or almost any modern file manager. +The wxHTML library uses a **virtual** file systems mechanism similar +to the one used in Midnight Commander, Dos Navigator, FAR or almost +any modern file manager. -It allows the user to access data stored in archives as if they were ordinary files. On-the-fly generated files that exist only in memory are also supported. +It allows the user to access data stored in archives as if they were +ordinary files. On-the-fly generated files that exist only in memory +are also supported. Classes ------- -Three classes are used in order to provide virtual file systems mechanism: +Three classes are used in order to provide virtual file systems +mechanism: -* The :ref:`FSFile` class provides information about opened file (name, input stream, mime type and anchor). -* The :ref:`FileSystem` class is the interface. Its main methods are :meth:`FileSystem.ChangePathTo` and :meth:`FileSystem.OpenFile`. This class is most often used by the end user. -* The :ref:`FileSystemHandler` is the core of virtual file systems mechanism. You can derive your own handler and pass it to the VFS mechanism. You can derive your - own handler and pass it to the :meth:`FileSystem.AddHandler` method. In the new handler you only need to override the :meth:`FileSystemHandler.OpenFile` and - :meth:`FileSystemHandler.CanOpen` methods. +* The :ref:`wx.FSFile` class provides information about opened file + (name, input stream, mime type and anchor). + +* The :ref:`wx.FileSystem` class is the interface. Its main methods are + :meth:`wx.FileSystem.ChangePathTo` and + :meth:`wx.FileSystem.OpenFile`. This class is most often used by the + end user. + +* The :ref:`wx.FileSystemHandler` is the core of virtual file systems + mechanism. You can derive your own handler and pass it to the VFS + mechanism. You can derive your own handler and pass it to the + :meth:`wx.FileSystem.AddHandler` method. In the new handler you only + need to override the :meth:`wx.FileSystemHandler.OpenFile` and + :meth:`wx.FileSystemHandler.CanOpen` methods. Locations --------- -Locations (aka filenames aka addresses) are constructed from four parts: +Locations (aka filenames aka addresses) are constructed from four +parts: -* **protocol** - handler can recognize if it is able to open a file by checking its protocol. Examples are ``"http"``, ``"file"`` or ``"ftp"``. -* **right location** - is the name of file within the protocol. In ``"http://www.wxwidgets.org/index.html"`` the right location is ``"//www.wxwidgets.org/index.html"``. -* **anchor** - an anchor is optional and is usually not present. In ``"index.htm#chapter2"`` the anchor is ``"chapter2"``. -* **left location** - this is usually an empty string. It is used by 'local' protocols such as ZIP. See the :ref:`Combined Protocols ` paragraph for details. +* **protocol** - handler can recognize if it is able to open a file by + checking its protocol. Examples are ``"http"``, ``"file"`` or + ``"ftp"``. + +* **right location** - is the name of file within the protocol. In + ``"http://www.wxwidgets.org/index.html"`` the right location is + ``"//www.wxwidgets.org/index.html"``. + +* **anchor** - an anchor is optional and is usually not present. In + ``"index.htm#chapter2"`` the anchor is ``"chapter2"``. + +* **left location** - this is usually an empty string. It is used by + 'local' protocols such as ZIP. See the :ref:`Combined Protocols + ` paragraph for details. .. _combined protocols: @@ -44,11 +69,15 @@ Combined Protocols The left location precedes the protocol in the URL string. -It is not used by global protocols like HTTP but it becomes handy when nesting protocols - for example you may want to access files in a ZIP archive: +It is not used by global protocols like HTTP but it becomes handy when +nesting protocols - for example you may want to access files in a ZIP +archive: ``file:archives/cpp_doc.zip#zip:reference/fopen.htm#syntax`` -In this example, the protocol is ``"zip"``, right location is ``"reference/fopen.htm"``, anchor is ``"syntax"`` and left location is ``file:archives/cpp_doc.zip``. +In this example, the protocol is ``"zip"``, right location is +``"reference/fopen.htm"``, anchor is ``"syntax"`` and left location is +``file:archives/cpp_doc.zip``. There are two protocols used in this example: "zip" and "file". @@ -60,11 +89,20 @@ File Systems Included in wxHTML The following virtual file system handlers are part of wxPython so far: -* :ref:`ArchiveFSHandler`: A handler for archives such as zip and tar. URLs examples: ``"archive.zip#zip:filename"``, ``"archive.tar.gz#gzip:#tar:filename"``. -* :ref:`FilterFSHandler`: A handler for compression schemes such as gzip. URLs are in the form, e.g.: ``"document.ps.gz#gzip:"``. -* :ref:`InternetFSHandler`: A handler for accessing documents via HTTP or FTP protocols. -* :ref:`MemoryFSHandler`: This handler allows you to access data stored in memory (such as bitmaps) as if they were regular files. See :ref:`MemoryFSHandler` for details. - URL is prefixed with memory:, e.g. ``"memory:myfile.htm"``. +* :ref:`wx.ArchiveFSHandler`: A handler for archives such as zip and + tar. URLs examples: ``"archive.zip#zip:filename"``, + ``"archive.tar.gz#gzip:#tar:filename"``. + +* :ref:`wx.FilterFSHandler`: A handler for compression schemes such as + gzip. URLs are in the form, e.g.: ``"document.ps.gz#gzip:"``. + +* :ref:`wx.InternetFSHandler`: A handler for accessing documents via HTTP + or FTP protocols. + +* :ref:`wx.MemoryFSHandler`: This handler allows you to access data + stored in memory (such as bitmaps) as if they were regular + files. See :ref:`wx.MemoryFSHandler` for details. URL is prefixed with + memory:, e.g. ``"memory:myfile.htm"``. In addition, :ref:`FileSystem` itself can access local files. @@ -74,11 +112,10 @@ In addition, :ref:`FileSystem` itself can access local files. Initializing file system handlers --------------------------------- -Use :meth:`FileSystem.AddHandler` to initialize a handler, for example:: - +Use :meth:`wx.FileSystem.AddHandler` to initialize a handler, for +example:: def OnInit(self): - wx.FileSystem.AddHandler(wx.MemoryFSHandler())