[z3-checkins] r5736 - in z3/Flon: . trunk trunk/Extensions trunk/skins trunk/skins/flon trunk/tests trunk/tools

dreamcatcher at codespeak.net dreamcatcher at codespeak.net
Tue Jul 27 22:39:35 MEST 2004


Author: dreamcatcher
Date: Tue Jul 27 22:39:35 2004
New Revision: 5736

Added:
   z3/Flon/
   z3/Flon/trunk/
   z3/Flon/trunk/COPYRIGHT
   z3/Flon/trunk/Extensions/
   z3/Flon/trunk/Extensions/Install.py   (contents, props changed)
   z3/Flon/trunk/Extensions/__init__.py   (contents, props changed)
   z3/Flon/trunk/INSTALL
   z3/Flon/trunk/LICENSE
   z3/Flon/trunk/README
   z3/Flon/trunk/__init__.py   (contents, props changed)
   z3/Flon/trunk/config.py   (contents, props changed)
   z3/Flon/trunk/configure.zcml
   z3/Flon/trunk/makefile.in
   z3/Flon/trunk/skins/
   z3/Flon/trunk/skins/flon/
   z3/Flon/trunk/skins/flon/edit_marker.cpy
   z3/Flon/trunk/skins/flon/edit_marker.cpy.metadata
   z3/Flon/trunk/skins/flon/edit_marker_form.cpt
   z3/Flon/trunk/skins/flon/edit_marker_form.cpt.metadata
   z3/Flon/trunk/skins/flon/marker_icon.gif   (contents, props changed)
   z3/Flon/trunk/skins/flon/validate_edit_marker.vpy
   z3/Flon/trunk/tests/
   z3/Flon/trunk/tests/framework.py   (contents, props changed)
   z3/Flon/trunk/tests/runalltests.py   (contents, props changed)
   z3/Flon/trunk/tests/test_tool.py   (contents, props changed)
   z3/Flon/trunk/tests/zopeconf.py   (contents, props changed)
   z3/Flon/trunk/tool.gif   (contents, props changed)
   z3/Flon/trunk/tools/
   z3/Flon/trunk/tools/__init__.py   (contents, props changed)
   z3/Flon/trunk/tools/interface.py   (contents, props changed)
   z3/Flon/trunk/version.txt   (contents, props changed)
Log:
Initial import of Flon, Five for Plone


Added: z3/Flon/trunk/COPYRIGHT
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/COPYRIGHT	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,16 @@
+Flon is a package for enabling hand picked Five features in Plone
+Copyright (C) 2004 Enfold Systems, LLC
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Added: z3/Flon/trunk/Extensions/Install.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/Extensions/Install.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,64 @@
+# Flon is a package for enabling hand picked Five features in Plone
+# Copyright (C) 2004 Enfold Systems, LLC
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+$Id: __init__.py,v 1.2 2004/07/14 22:23:16 dreamcatcher Exp $
+"""
+
+from cStringIO import StringIO
+from Products.CMFCore.utils import getToolByName
+from Products.Flon.tools.interface import InterfaceTool
+tool_id = InterfaceTool.id
+meta_type = InterfaceTool.meta_type
+
+
+def install_tool(self, out):
+    tool = getToolByName(self, tool_id, None)
+    if tool is not None:
+        if tool.meta_type == meta_type:
+            out.write('Interface Tool was already installed.\n')
+            return
+    self.manage_delObjects(ids=[tool_id])
+    self.manage_addProduct['Flon'].manage_addTool(meta_type)
+    out.write('Interface Tool installed sucessfully.\n')
+
+def install_actions(self, out):
+    at = getToolByName(self, 'portal_actions')
+    if 'marker' not in [action.getId() for action in at.listActions()]:
+        at.addAction('marker',
+                     'Change the marker interfaces for this object',
+                     'string:$object_url/edit_marker_form',
+                     '',
+                     'Manage portal',
+                     'document_actions')
+        out.write('Added action for marker action icon.\n')
+    else:
+        out.write('Marker action was already installed.\n')
+    ai = getToolByName(self, 'portal_actionicons')
+    if ai.queryActionIcon('plone', 'marker', None) is None:
+        ai.addActionIcon('plone', 'marker',
+                         'marker_icon.gif', 'Marker Interfaces')
+        out.write('Added action icon for marker action.\n')
+    else:
+        out.write('Marker action icon was already installed.\n')
+
+def install(self, out=None):
+    if out is None:
+        out = StringIO()
+    install_tool(self, out)
+    install_actions(self, out)
+    return out.getvalue()

Added: z3/Flon/trunk/Extensions/__init__.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/Extensions/__init__.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,20 @@
+# Flon is a package for enabling hand picked Five features in Plone
+# Copyright (C) 2004 Enfold Systems, LLC
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+$Id: __init__.py,v 1.2 2004/07/14 22:23:16 dreamcatcher Exp $
+"""

Added: z3/Flon/trunk/INSTALL
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/INSTALL	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,5 @@
+Installation Instructions
+=========================
+
+- Use the QuickInstaller tool or Plone's Control Panel 'Add/Remove
+  Products' feature to install Flon

Added: z3/Flon/trunk/LICENSE
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/LICENSE	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,278 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.

Added: z3/Flon/trunk/README
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/README	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,54 @@
+Flon, Five for Plone
+====================
+
+Features
+--------
+
+- A replacement for portal_interface that exposes part of the
+  IIntrospector interface from Zope3
+- A action icon pointing to a form where you can add/remove marker
+  interfaces from objects.
+
+Copyright
+---------
+
+- This code is copyrighted by Enfold Systems, LLC.
+  You can find more information at http://www.enfoldsystems.com/
+
+License
+-------
+
+- GPL, a LICENSE file should have accompanied this module.  If not
+  please contact the package maintainer.
+
+Mantainer
+---------
+
+- Enfold Systems
+
+Acknowledgements
+----------------
+
+- The workers: Sidnei da Silva
+
+  o Sidnei da Silva - Designer, Test Champion and Master of Laziness
+
+  o Alan Runyan - Cheerleading.
+
+- Zope Corporation for providing such a wonderful application server.
+
+- Python Developers for making things so damn easy.
+
+Requirements
+------------
+
+- Python 2.3.4 or greater
+
+- Zope 2.7.2 or greater
+
+- CMF 1.4.3 or greater
+
+- Plone 2.0.4 or greater
+
+- Five 0.1 or greater
+

Added: z3/Flon/trunk/__init__.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/__init__.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,39 @@
+# Flon is a package for enabling hand picked Five features in Plone
+# Copyright (C) 2004 Enfold Systems, LLC
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+$Id: __init__.py,v 1.2 2004/07/14 22:23:16 dreamcatcher Exp $
+"""
+
+from Products.CMFCore.DirectoryView import registerDirectory
+from Products.Flon.config import GLOBALS
+
+# kickstart Install to make sure it imports
+from Products.Flon.Extensions import Install
+del Install
+
+# Make the skins available as DirectoryViews.
+registerDirectory('skins', GLOBALS)
+
+def initialize(context):
+
+    from Products.CMFPlone.PloneUtilities import ToolInit
+    from tools.interface import InterfaceTool
+
+    ToolInit('Flon Tool', tools=(InterfaceTool,),
+             product_name='Flon', icon='tool.gif',
+             ).initialize( context )

Added: z3/Flon/trunk/config.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/config.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,21 @@
+# Flon is a package for enabling hand picked Five features in Plone
+# Copyright (C) 2004 Enfold Systems, LLC
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+$Id: __init__.py,v 1.2 2004/07/14 22:23:16 dreamcatcher Exp $
+"""
+GLOBALS = globals()

Added: z3/Flon/trunk/configure.zcml
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/configure.zcml	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,10 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <adapter
+      for='*'
+      factory="zope.app.introspector.Introspector"
+      permission="zope2.View"
+      provides="zope.app.introspector.interfaces.IIntrospector"
+      />
+
+</configure>

Added: z3/Flon/trunk/makefile.in
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/makefile.in	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,67 @@
+NAME=Flon
+MAJOR_VERSION=0.1
+MINOR_VERSION=0
+RELEASE_TAG=
+PACKAGE_NAME=${NAME}-${MAJOR_VERSION}.${MINOR_VERSION}${RELEASE_TAG}
+
+PYTHON="/usr/bin/python"
+TMPDIR=~/tmp
+
+CURDIR=~/src/projects/Flon
+BASE_DIR=${CURDIR}/..
+SOFTWARE_HOME=~/src/zope/2_7/lib/python
+INSTANCE_HOME=~/src/instance/shellex
+PACKAGES=Flon
+
+
+RM=rm -f
+RMRF=rm -rf
+FIND=find
+XARGS=xargs
+CD=cd
+LN=ln -sfn
+CP=cp
+TAR=tar
+MKDIR=mkdir -p
+
+.PHONY : clean test reindent reindent_clean sdist
+.PHONY : default
+
+# default:     The default step (invoked when make is called without a target)
+default: clean test
+
+clean :
+	find . \( -name '*~' -o -name '*.py[co]' -o -name '*.bak' \) -exec rm {} \; -print
+
+reindent :
+	~/src/reindent.py -r -v .
+
+test :
+	export INSTANCE_HOME=${INSTANCE_HOME}; \
+	export SOFTWARE_HOME=${SOFTWARE_HOME}; \
+	cd ${CURDIR}/tests && ${PYTHON} runalltests.py
+
+
+# sdist:       Create a source distribution file (implies clean).
+#
+sdist: reindent clean sdist_tgz
+
+# sdist_tgz:   Create a tgz archive file as a source distribution.
+#
+sdist_tgz:
+	echo -n "${MAJOR_VERSION}.${MINOR_VERSION}${RELEASE_TAG}" >\
+          ${CURDIR}/version.txt
+	${MKDIR} ${TMPDIR}/${PACKAGE_NAME}
+	${CD} ${TMPDIR}/${PACKAGE_NAME} && \
+          for package in ${PACKAGES}; do ${LN} ${BASE_DIR}/$$package .; done && \
+          ${CD} ${TMPDIR} && ${TAR} czfh ${BASE_DIR}/${PACKAGE_NAME}.tgz ${PACKAGE_NAME} \
+           --exclude=${PACKAGE_NAME}.tgz\
+           --exclude=CVS \
+           --exclude=.cvsignore \
+           --exclude=makefile \
+           --exclude=Makefile \
+           --exclude=*.pyc \
+           --exclude=TAGS \
+           --exclude=*~ \
+           --exclude=.#*
+	${RMRF} ${TMPDIR}/${PACKAGE_NAME}

Added: z3/Flon/trunk/skins/flon/edit_marker.cpy
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/skins/flon/edit_marker.cpy	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,16 @@
+## Controller Python Script "edit_marker"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind state=state
+##bind subpath=traverse_subpath
+##parameters=add=(), remove=()
+##title=Change the marker interfaces for a piece of content
+
+from Products.CMFCore.utils import getToolByName
+iface_tool = getToolByName(context, 'portal_interface')
+iface_tool.update(context, add, remove)
+
+return state.set(context=context,
+                 portal_status_message='Marker interfaces changed.')

Added: z3/Flon/trunk/skins/flon/edit_marker.cpy.metadata
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/skins/flon/edit_marker.cpy.metadata	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,6 @@
+[validators]
+validators=validate_edit_marker
+
+[actions]
+action.failure=traverse_to:string:edit_marker_form
+action.success=redirect_to:string:edit_marker_form

Added: z3/Flon/trunk/skins/flon/edit_marker_form.cpt
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/skins/flon/edit_marker_form.cpt	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,138 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en"
+      metal:use-macro="context/main_template/macros/master"
+      i18n:domain="plone">
+
+  <head><title></title></head>
+  <body>
+    <div metal:fill-slot="main"
+         tal:define="errors options/state/getErrors">
+
+      <h1 i18n:translate="heading_edit_marker">
+        Edit Marker Interfaces
+      </h1>
+
+      <p i18n:translate="description_edit_marker">
+        A marker interface is used to identify an instance of a piece of content.
+        When in conjunction with Five, this allows you to enable and disable
+        views based on marker interfaces for example.
+      </p>
+
+      <form name="edit_form"
+            action="."
+            method="post"
+            enctype="multipart/form-data"
+            tal:attributes="action string:${context/getId}/${template/getId}"
+            tal:define="iface_tool iface_tool|portal/portal_interface|nothing"
+            tal:condition="iface_tool">
+
+        <fieldset tal:define="provided python:iface_tool.getDirectlyProvidedNames(context);
+                              available python:iface_tool.getMarkerInterfaceNames(context)">
+
+          <legend i18n:translate="legend_edit_marker">Marker Interfaces</legend>
+
+          <div tal:define="error errors/error|nothing"
+               tal:condition="error"
+               class="field error"
+               tal:content="error">Validation error output</div>
+
+          <div class="field"
+               tal:condition="provided"
+               tal:define="error errors/add | nothing;
+                           remove python:request.get('remove', ());"
+               tal:attributes="class python:test(error, 'field error', 'field')">
+
+            <label for="id" i18n:translate="label_marker_provided">Remove Interfaces</label>
+
+            <div class="formHelp" i18n:translate="help_marker_provided">
+              If you want, you can remove some interfaces from
+              the list of interfaces directly provided by your object.
+            </div>
+
+            <div tal:content="error">Validation error output</div>
+
+
+            <tal:block tal:repeat="iface provided">
+
+              <input type="checkbox"
+                     id="iface-name"
+                     name="remove:list"
+                     value=""
+                     size="40"
+                     tabindex=""
+                     tal:attributes="value iface;
+                                     id iface;
+                                     tabindex tabindex/next;
+                                     checked python:iface in remove and 'checked'"
+                     />
+
+              <label for=""
+                     i18n:translate=""
+                     tal:attributes="for iface"
+                     tal:content="iface"
+                     />
+
+              <br />
+
+            </tal:block>
+          </div>
+
+          <div class="field"
+               tal:define="error errors/add | nothing;
+                           add python:request.get('add', ());"
+               tal:attributes="class python:test(error, 'field error', 'field')">
+
+
+            <label for="id" i18n:translate="label_marker_add">Add Interfaces</label>
+
+            <div class="formHelp" i18n:translate="help_marker_add">
+              You can choose one or more interfaces to be added to
+              the list of provided interfaces for this object.
+            </div>
+
+            <div tal:content="error">Validation error output</div>
+
+
+            <tal:block tal:repeat="iface available">
+
+              <input type="checkbox"
+                     id="iface-name"
+                     name="add:list"
+                     value=""
+                     size="40"
+                     tabindex=""
+                     tal:attributes="value iface;
+                                     id iface;
+                                     tabindex tabindex/next;
+                                     checked python:iface in add and 'checked'"
+                     />
+
+              <label for=""
+                     i18n:translate=""
+                     tal:attributes="for iface"
+                     tal:content="iface"
+                     />
+
+              <br />
+
+            </tal:block>
+          </div>
+
+          <div class="formControls">
+            <input class="context"
+                   tabindex=""
+                   type="submit"
+                   name="form.button.Save"
+                   value="Save"
+                   i18n:attributes="value"
+                   tal:attributes="tabindex tabindex/next;"
+                   />
+          </div>
+
+          <input type="hidden" name="form.submitted" value="1" />
+
+        </fieldset>
+      </form>
+    </div>
+  </body>
+</html>
\ No newline at end of file

Added: z3/Flon/trunk/skins/flon/edit_marker_form.cpt.metadata
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/skins/flon/edit_marker_form.cpt.metadata	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,14 @@
+[default]
+title=Choose marker interfaces
+
+[security]
+View=0:Authenticated
+
+[validators]
+validators..Save=validate_edit_marker
+validators..Cancel=
+
+[actions]
+action.success..Save=traverse_to:string:edit_marker
+action.success..Cancel=redirect_to_action:string:view
+action.failure=traverse_to:string:edit_marker_form

Added: z3/Flon/trunk/skins/flon/marker_icon.gif
==============================================================================
Binary file. No diff available.

Added: z3/Flon/trunk/skins/flon/validate_edit_marker.vpy
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/skins/flon/validate_edit_marker.vpy	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,19 @@
+## Controlled Python Script "validate_edit_marker"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind state=state
+##bind subpath=traverse_subpath
+##parameters=add=None, remove=None
+##title=Validate changing marker interfaces
+##
+
+if add is None and remove is None:
+    state.setError('error', 'Must choose at least an interface for adding or removing.', 'input_required')
+
+if state.getErrors():
+    return state.set(status='failure', portal_status_message='Please correct the indicated errors.')
+else:
+    return state
+

Added: z3/Flon/trunk/tests/framework.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/tests/framework.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,109 @@
+##############################################################################
+#
+# ZopeTestCase
+#
+# COPY THIS FILE TO YOUR 'tests' DIRECTORY.
+#
+# This version of framework.py will use the SOFTWARE_HOME
+# environment variable to locate Zope and the Testing package.
+#
+# If the tests are run in an INSTANCE_HOME installation of Zope,
+# Products.__path__ and sys.path with be adjusted to include the
+# instance's Products and lib/python directories respectively.
+#
+# If you explicitly set INSTANCE_HOME prior to running the tests,
+# auto-detection is disabled and the specified path will be used
+# instead.
+#
+# If the 'tests' directory contains a custom_zodb.py file, INSTANCE_HOME
+# will be adjusted to use it.
+#
+# If you set the ZEO_INSTANCE_HOME environment variable a ZEO setup
+# is assumed, and you can attach to a running ZEO server (via the
+# instance's custom_zodb.py).
+#
+##############################################################################
+#
+# The following code should be at the top of every test module:
+#
+# import os, sys
+# if __name__ == '__main__':
+#     execfile(os.path.join(sys.path[0], 'framework.py'))
+#
+# ...and the following at the bottom:
+#
+# if __name__ == '__main__':
+#     framework()
+#
+##############################################################################
+
+__version__ = '0.2.3'
+
+# Save start state
+#
+__SOFTWARE_HOME = os.environ.get('SOFTWARE_HOME', '')
+__INSTANCE_HOME = os.environ.get('INSTANCE_HOME', '')
+
+if __SOFTWARE_HOME.endswith(os.sep):
+    __SOFTWARE_HOME = os.path.dirname(__SOFTWARE_HOME)
+
+if __INSTANCE_HOME.endswith(os.sep):
+    __INSTANCE_HOME = os.path.dirname(__INSTANCE_HOME)
+
+# Find and import the Testing package
+#
+if not sys.modules.has_key('Testing'):
+    p0 = sys.path[0]
+    if p0 and __name__ == '__main__':
+        os.chdir(p0)
+        p0 = ''
+    s = __SOFTWARE_HOME
+    p = d = s and s or os.getcwd()
+    while d:
+        if os.path.isdir(os.path.join(p, 'Testing')):
+            zope_home = os.path.dirname(os.path.dirname(p))
+            sys.path[:1] = [p0, p, zope_home]
+            break
+        p, d = s and ('','') or os.path.split(p)
+    else:
+        print 'Unable to locate Testing package.',
+        print 'You might need to set SOFTWARE_HOME.'
+        sys.exit(1)
+
+import Testing, unittest
+execfile(os.path.join(os.path.dirname(Testing.__file__), 'common.py'))
+
+# Include ZopeTestCase support
+#
+if 1:   # Create a new scope
+
+    p = os.path.join(os.path.dirname(Testing.__file__), 'ZopeTestCase')
+
+    if not os.path.isdir(p):
+        print 'Unable to locate ZopeTestCase package.',
+        print 'You might need to install ZopeTestCase.'
+        sys.exit(1)
+
+    ztc_common = 'ztc_common.py'
+    ztc_common_global = os.path.join(p, ztc_common)
+
+    f = 0
+    if os.path.exists(ztc_common_global):
+        execfile(ztc_common_global)
+        f = 1
+    if os.path.exists(ztc_common):
+        execfile(ztc_common)
+        f = 1
+
+    if not f:
+        print 'Unable to locate %s.' % ztc_common
+        sys.exit(1)
+
+    import zopeconf; zopeconf.process()
+
+
+# Debug
+#
+print 'SOFTWARE_HOME: %s' % os.environ.get('SOFTWARE_HOME', 'Not set')
+print 'INSTANCE_HOME: %s' % os.environ.get('INSTANCE_HOME', 'Not set')
+sys.stdout.flush()

Added: z3/Flon/trunk/tests/runalltests.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/tests/runalltests.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,28 @@
+#
+# Runs all tests in the current directory
+#
+# Execute like:
+#   python runalltests.py
+#
+# Alternatively use the testrunner:
+#   python /path/to/Zope/utilities/testrunner.py -qa
+#
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+import unittest
+TestRunner = unittest.TextTestRunner
+suite = unittest.TestSuite()
+
+tests = os.listdir(os.curdir)
+tests = [n[:-3] for n in tests if n.startswith('test') and n.endswith('.py')]
+
+for test in tests:
+    m = __import__(test)
+    if hasattr(m, 'test_suite'):
+        suite.addTest(m.test_suite())
+
+if __name__ == '__main__':
+    TestRunner().run(suite)

Added: z3/Flon/trunk/tests/test_tool.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/tests/test_tool.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,133 @@
+# Flon is a package for enabling hand picked Five features in Plone
+# Copyright (C) 2004 Enfold Systems, LLC
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+$Id: __init__.py,v 1.2 2004/07/14 22:23:16 dreamcatcher Exp $
+"""
+
+import os, sys
+
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+# Load fixture
+from Testing import ZopeTestCase
+from Products.CMFPlone.tests import PloneTestCase
+
+# Install our product
+ZopeTestCase.installProduct('Flon')
+ZopeTestCase.installProduct('Five')
+
+from Products.CMFCore.utils import getToolByName
+from zope.interface import implements, Interface
+from zope.app.component.interface import provideInterface
+
+class IDummy(Interface):
+    """A dummy interface
+    """
+    def foo():
+        """ """
+
+class IAdvancedDummy(IDummy):
+    """A marker interface for advanced dummy
+    """
+
+class ISpecialDummy(IDummy):
+    """A marker interface for special dummy
+    """
+
+class IExtraSpecialDummy(ISpecialDummy):
+    """A marker interface for special dummy
+    """
+
+class INonMarkerDummy(IDummy):
+    """A non-marker interface for dummy
+    """
+    def bar():
+        """ """
+
+class Dummy:
+    implements(IDummy)
+    def foo(self): pass
+
+class InterfaceToolTest(PloneTestCase.PloneTestCase):
+
+    def afterSetUp(self):
+        self.qi = getToolByName(self.portal, 'portal_quickinstaller')
+        self.qi.installProduct('Flon')
+        self.it = getToolByName(self.portal, 'portal_interface')
+        provideInterface('test_tool.IAdvancedDummy', IAdvancedDummy)
+        provideInterface('test_tool.IExtraSpecialDummy', IExtraSpecialDummy)
+        provideInterface('test_tool.ISpecialDummy', ISpecialDummy)
+        provideInterface('test_tool.INonMarkerDummy', INonMarkerDummy)
+        provideInterface('test_tool.IDummy', IDummy)
+
+    def test_marker_names(self):
+        foo = Dummy()
+        iface_names = self.it.getMarkerInterfaceNames(foo)
+        self.failUnless('test_tool.IAdvancedDummy' in iface_names)
+        self.failUnless('test_tool.ISpecialDummy' in iface_names)
+        self.failUnless('test_tool.IExtraSpecialDummy' in iface_names)
+        self.failIf('test_tool.INonMarkerDummy' in iface_names)
+
+    def test_provided_names(self):
+        foo = Dummy()
+        provided = self.it.getDirectlyProvidedNames(foo)
+        self.failIf('test_tool.IDummy' in provided)
+        self.failIf('test_tool.ISpecialDummy' in provided)
+        self.failIf('test_tool.IAdvancedDummy' in provided)
+        self.failIf('test_tool.IExtraSpecialDummy' in provided)
+
+    def test_add_markers(self):
+        foo = Dummy()
+
+        provided = self.it.getDirectlyProvidedNames(foo)
+        self.failIf('test_tool.ISpecialDummy' in provided)
+        self.it.update(foo, add=['test_tool.ISpecialDummy'])
+        provided = self.it.getDirectlyProvidedNames(foo)
+        self.failUnless('test_tool.ISpecialDummy' in provided)
+
+        self.it.update(foo, add=['test_tool.IAdvancedDummy'])
+        provided = self.it.getDirectlyProvidedNames(foo)
+        self.failUnless('test_tool.IAdvancedDummy' in provided)
+        self.failUnless('test_tool.ISpecialDummy' in provided)
+
+    def test_remove_markers(self):
+        foo = Dummy()
+        iface_names = self.it.getMarkerInterfaceNames(foo)
+        self.it.update(foo, add=iface_names)
+
+        provided = self.it.getDirectlyProvidedNames(foo)
+        self.failUnless('test_tool.ISpecialDummy' in provided)
+        self.it.update(foo, remove=['test_tool.ISpecialDummy'])
+        provided = self.it.getDirectlyProvidedNames(foo)
+        self.failIf('test_tool.ISpecialDummy' in provided)
+
+        self.failUnless('test_tool.IAdvancedDummy' in provided)
+        self.it.update(foo, remove=['test_tool.IAdvancedDummy'])
+        provided = self.it.getDirectlyProvidedNames(foo)
+        self.failIf('test_tool.IAdvancedDummy' in provided)
+
+
+def test_suite():
+    import unittest
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(InterfaceToolTest))
+    return suite
+
+if __name__ == '__main__':
+    framework(descriptions=1, verbosity=1)

Added: z3/Flon/trunk/tests/zopeconf.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/tests/zopeconf.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,23 @@
+import os
+from os.path import join, abspath, dirname, split
+
+
+def process():
+    """Read in zope.conf configuration file.
+
+    This is a hack but there doesn't seem to be a better way.
+    """
+    _prefix = os.environ.get('INSTANCE_HOME')
+    if not _prefix:
+        try:
+            __file__
+        except NameError:
+            # Test was called directly, so no __file__ global exists.
+            _prefix = abspath(os.curdir)
+        else:
+            # Test was called by another test.
+            _prefix = abspath(dirname(__file__))
+        _prefix = join(_prefix, '..', '..', '..')
+
+    from Zope.Startup.run import configure
+    configure(join(_prefix, 'etc', 'zope.conf'))

Added: z3/Flon/trunk/tool.gif
==============================================================================
Binary file. No diff available.

Added: z3/Flon/trunk/tools/__init__.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/tools/__init__.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,21 @@
+# Flon is a package for enabling hand picked Five features in Plone
+# Copyright (C) 2004 Enfold Systems, LLC
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+$Id: __init__.py,v 1.2 2004/07/14 22:23:16 dreamcatcher Exp $
+"""
+

Added: z3/Flon/trunk/tools/interface.py
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/tools/interface.py	Tue Jul 27 22:39:35 2004
@@ -0,0 +1,65 @@
+# Flon is a package for enabling hand picked Five features in Plone
+# Copyright (C) 2004 Enfold Systems, LLC
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+$Id: __init__.py,v 1.2 2004/07/14 22:23:16 dreamcatcher Exp $
+"""
+
+from Products.CMFPlone.InterfaceTool import InterfaceTool as BaseTool
+from zope.interface import directlyProvides, directlyProvidedBy
+from zope.app.introspector.interfaces import IIntrospector
+from zope.app.component.interface import getInterface
+
+class InterfaceTool(BaseTool):
+    """An improved interface tool, with support for
+    introspecting both Zope2 and Zope3 interfaces.
+
+    Also allows setting marker interfaces directly on objects.
+    """
+
+    meta_type = 'Flon Interface Tool'
+
+    def getDirectlyProvided(self, context):
+        """See IIntrospector"""
+        return IIntrospector(context).getDirectlyProvided()
+
+    def getDirectlyProvidedNames(self, context):
+        """See IIntrospector"""
+        return IIntrospector(context).getDirectlyProvidedNames()
+
+    def getMarkerInterfaces(self, context):
+        """See IIntrospector"""
+        return IIntrospector(context).getMarkerInterfaces()
+
+    def getMarkerInterfaceNames(self, context):
+        """See IIntrospector"""
+        return IIntrospector(context).getMarkerInterfaceNames()
+
+    def update(self, context, add=None, remove=None):
+        ob = context
+
+        if add is not None:
+            for interface in self.getMarkerInterfaceNames(context):
+                if interface in add:
+                    interface = getInterface(context, interface)
+                    directlyProvides(ob, directlyProvidedBy(ob), interface)
+
+        if remove is not None:
+            for interface in self.getDirectlyProvidedNames(context):
+                if interface in remove:
+                    interface = getInterface(context, interface)
+                    directlyProvides(ob, directlyProvidedBy(ob)-interface)

Added: z3/Flon/trunk/version.txt
==============================================================================
--- (empty file)
+++ z3/Flon/trunk/version.txt	Tue Jul 27 22:39:35 2004
@@ -0,0 +1 @@
+0.1.2
\ No newline at end of file


More information about the z3-checkins mailing list