Commit aa7c3ff4 authored by 's avatar

Added Cut(Move) support for principia objects.

parent a605fb5a
"""Copy interface"""
__version__='$Revision: 1.11 $'[11:-2]
__version__='$Revision: 1.12 $'[11:-2]
import Globals, Moniker, rPickle, tempfile
from cPickle import loads, dumps
......@@ -23,10 +23,21 @@ class CopyContainer:
# Return true if clipboard data is valid.
try: moniker=rPickle.loads(unquote(self.REQUEST['clip_data']))
except: return 0
# Check for old versions of cookie so users dont need to
# restart browser after upgrading - just expire the old
# cookie.
if not hasattr(moniker, 'op'):
self.REQUEST['RESPONSE'].setCookie('clip_data', 'deleted',
path='%s' % self.REQUEST['SCRIPT_NAME'],
expires='Wed, 31-Dec-97 23:59:59 GMT')
self.REQUEST['validClipData']=0
return 0
v=self.REQUEST['validClipData']=moniker.assert()
return v
def pasteFromClipboard(self,clip_id='',clip_data='',REQUEST=None):
def pasteFromClipboard(self, clip_id='', clip_data='', REQUEST=None):
""" """
if not clip_data: return eNoData
......@@ -39,22 +50,44 @@ class CopyContainer:
try: self._checkId(clip_id)
except: return self.pasteDialog(self,REQUEST,bad=1,moniker=(moniker,))
return self.manage_paste(moniker, clip_id, REQUEST)
def manage_paste(self, moniker, clip_id, REQUEST=None):
""" """
try: obj=moniker.bind()
except: return eNotFound
obj=obj._getCopy(self)
return self.manage_paste(clip_id, obj, REQUEST)
if moniker.op == 0:
# Copy operation
obj=obj._getCopy(self)
obj._setId(clip_id)
self._setObject(clip_id, obj)
obj._postCopy(self)
if REQUEST is not None:
return self.manage_main(self, REQUEST, update_menu=1)
return ''
if moniker.op==1:
# Move operation
prev_id=Moniker.absattr(obj.id)
obj.aq_parent._delObject(prev_id)
while hasattr(obj, 'aq_self'):
obj=obj.aq_self
obj=obj.__of__(self)
self._setObject(clip_id, obj)
if REQUEST is not None:
# Remove cookie after a move
REQUEST['RESPONSE'].setCookie('clip_data', 'deleted',
path='%s' % REQUEST['SCRIPT_NAME'],
expires='Wed, 31-Dec-97 23:59:59 GMT')
return self.manage_main(self, REQUEST, update_menu=1,
validClipData=0)
return ''
def manage_paste(self,clip_id,obj,REQUEST=None):
""" """
obj=obj._getCopy(self)
obj._setId(clip_id)
self._setObject(clip_id, obj)
obj._postCopy(self)
if REQUEST is not None:
return self.manage_main(self, REQUEST, update_menu=1)
return ''
Globals.default__class_init__(CopyContainer)
......@@ -86,10 +119,21 @@ class CopySource:
def copyToClipboard(self, REQUEST):
""" """
# Set a cookie containing pickled moniker
try: moniker=self._getMoniker()
try: m=self._getMoniker()
except: return eNotSupported
m.op=0
REQUEST['RESPONSE'].setCookie('clip_data',
quote(dumps(m, 1)),
path='%s' % REQUEST['SCRIPT_NAME'])
def cutToClipboard(self, REQUEST):
""" """
# Set a cookie containing pickled moniker
try: m=self._getMoniker()
except: return eNotSupported
m.op=1
REQUEST['RESPONSE'].setCookie('clip_data',
quote(dumps(moniker,1)),
quote(dumps(m, 1)),
path='%s' % REQUEST['SCRIPT_NAME'])
......
......@@ -8,13 +8,13 @@ Object monikers
"""
__version__='$Revision: 1.2 $'[11:-2]
__version__='$Revision: 1.3 $'[11:-2]
import Globals
class Moniker:
class OldMoniker:
""" """
def __init__(self, obj=None, p=1):
if obj is None: return
......@@ -44,6 +44,58 @@ class Moniker:
return obj
class Moniker:
""" """
def __init__(self, obj=None, op=0):
if obj is None: return
pd=[]
ob=obj
while 1:
if not hasattr(ob, '_p_oid'):
break
pd.append(ob._p_oid)
if not hasattr(ob, 'aq_parent'):
break
ob=ob.aq_parent
pd.reverse()
self.pd=pd
self.jr=obj._p_jar.name
self.op=op
def id(self):
return absattr(self.bind().id)
def mtype(self):
return absattr(self.bind().meta_type)
def assert(self):
# Return true if the named object exists
if self.jr is None: jar=Globals.Bobobase._jar
else: jar=Globals.SessionBase[self.jr].jar
for n in self.pd:
if not jar.has_key(n):
return 0
return 1
def bind(self):
# Return the real object named by this moniker
if self.jr is None: jar=Globals.Bobobase._jar
else: jar=Globals.SessionBase[self.jr].jar
ob=None
for n in self.pd:
o=jar[n]
if ob is not None:
o=o.__of__(ob)
ob=o
return ob
def exact(self, other):
# Check against another moniker to see if it
# refers to the exact same object in the exact
# same acquisition context.
return self.jr==other.jr and self.pd==other.pd
def absattr(attr):
......
__doc__="""Object Manager
$Id: ObjectManager.py,v 1.40 1998/04/15 14:58:11 jim Exp $"""
$Id: ObjectManager.py,v 1.41 1998/04/24 16:11:09 brian Exp $"""
__version__='$Revision: 1.40 $'[11:-2]
__version__='$Revision: 1.41 $'[11:-2]
import Persistence, App.Management, Acquisition, App.Undo, Globals
from Globals import HTMLFile, HTMLFile
......@@ -299,6 +299,17 @@ class ObjectManager(
'Paste' uses the parameters 'clip_id' and 'clip_data' to paste.
'Delete' removes the objects specified in 'ids'.
"""
if submit=='Cut':
c=len(ids)
if (c <= 0) or (c > 1):
return MessageDialog(
title='Invalid Selection',
message='Please select one and only one item to move',
action ='./manage_main',)
obj=getattr(self, ids[0])
err=obj.cutToClipboard(REQUEST)
return err or self.manage_main(self, REQUEST, validClipData=1)
if submit=='Copy':
c=len(ids)
if (c <= 0) or (c > 1):
......@@ -313,6 +324,7 @@ class ObjectManager(
if submit=='Paste':
return self.pasteFromClipboard(clip_id,clip_data,REQUEST)
if submit=='Delete':
if not ids:
return MessageDialog(title='No items specified',
......@@ -537,6 +549,9 @@ class ObjectManager(
##############################################################################
#
# $Log: ObjectManager.py,v $
# Revision 1.41 1998/04/24 16:11:09 brian
# Added Cut(Move) support for principia objects.
#
# Revision 1.40 1998/04/15 14:58:11 jim
# Don't show confirmation after add or delete.
#
......
......@@ -46,6 +46,7 @@
<TD></TD>
<TD COLSPAN="2">
<INPUT TYPE="SUBMIT" NAME="submit" VALUE="Cut">
<INPUT TYPE="SUBMIT" NAME="submit" VALUE="Copy">
<!--#if validClipData-->
<INPUT TYPE="SUBMIT" NAME="submit" VALUE="Paste">
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment