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
|
#-------------------------------------------------------------------------------
#
# Defines an adapter from an codetools.contexts.api.IContext
# to an ITemplateDataContext.
#
# Written by: David C. Morrill
# Modified by: Robert Kern
#
# Date: 11/16/2007
#
# (c) Copyright 2007 by Enthought, Inc.
#
#-------------------------------------------------------------------------------
""" Defines an adapter from an codetools.contexts.api.IContext to an
ITemplateDataContext.
"""
#-------------------------------------------------------------------------------
# Imports:
#-------------------------------------------------------------------------------
from traits.api \
import Adapter, Str, List, adapts
from traits.protocols.api \
import AdaptationError, adapt
from codetools.contexts.api \
import IContext
from apptools.template.itemplate_data_context \
import ITemplateDataContext, ITemplateDataContextError
from helper \
import path_for
#-------------------------------------------------------------------------------
# 'IContextAdapter' class:
#-------------------------------------------------------------------------------
class IContextAdapter ( Adapter ):
""" Defines an adapter from an codetools.contexts.api.IContext
to an ITemplateDataContext.
"""
adapts( IContext, ITemplateDataContext )
#-- ITemplateDataContext Interface Implementation --------------------------
# The path to this data context (does not include the 'data_context_name'):
data_context_path = Str
# The name of the data context:
data_context_name = Str
# A list of the names of the data values in this context:
data_context_values = List( Str )
# The list of the names of the sub-contexts of this context:
data_contexts = List( Str )
def get_data_context_value ( self, name ):
""" Returns the data value with the specified *name*. Raises a
**ITemplateDataContextError** if *name* is not defined as a data
value in the context.
Parameters
----------
name : A string specifying the name of the context data value to
be returned.
Returns
-------
The data value associated with *name* in the context. The type of
the data is application dependent.
Raises **ITemplateDataContextError** if *name* is not associated
with a data value in the context.
"""
try:
if name in self.data_context_values:
return self.adaptee[ name ]
raise ITemplateDataContextError(
"No value named '%s' found." % name )
except Exception, excp:
raise ITemplateDataContextError( str( excp ) )
def get_data_context ( self, name ):
""" Returns the **ITemplateDataContext** value associated with the
specified *name*. Raises **ITemplateDataContextError** if *name* is
not defined as a data context in the context.
Parameters
----------
name : A string specifying the name of the data context to be
returned.
Returns
-------
The **ITemplateDataContext** associated with *name* in the context.
Raises **ITemplateDataContextError** if *name* is not associated
with a data context in the context.
"""
try:
if name in self.data_contexts:
bdca = IContextAdapter( self.adaptee[ name ] )
bdca.data_context_path = path_for( self.data_context_path,
self.data_context_name )
return bdca
raise ITemplateDataContextError(
"No context named '%s' found." % name )
except Exception, excp:
raise ITemplateDataContextError( str( excp ) )
#-- Traits Event Handlers --------------------------------------------------
def _adaptee_changed ( self, context ):
""" Handles being bound to a IContext object.
"""
self.data_context_name = context.name
values = []
contexts = []
for name in context.keys():
value = context[ name ]
try:
adapt( value, IContext )
except AdaptationError:
# Is not a subcontext.
values.append( name )
else:
# Is a subcontext.
contexts.append( name )
self.data_context_values = values
self.data_contexts = contexts
|