Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2007-07-11 09:39:40 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2007-07-11 09:39:40 (GMT)
commitbb71cd61cff6a577e3ccd3179f38bbc71a567b0f (patch)
tree626f13a81d782e72b5887186d4e9931ccbe61a11
parentbbbea6167dbc5e34fb3cff4653e269fcc18ab937 (diff)
#1888 Fix opening items from the clipboard.
-rw-r--r--NEWS1
-rw-r--r--shell/view/clipboardmenu.py70
-rw-r--r--sugar/datastore/datastore.py34
3 files changed, 67 insertions, 38 deletions
diff --git a/NEWS b/NEWS
index beabf43..191795c 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,4 @@
+* #1888 Fix opening items from the clipboard. (tomeu)
* #1984 Fix removing items from the clipboard. (tomeu)
Snapshot b83a9ec27d
diff --git a/shell/view/clipboardmenu.py b/shell/view/clipboardmenu.py
index cd154d9..2eff3f0 100644
--- a/shell/view/clipboardmenu.py
+++ b/shell/view/clipboardmenu.py
@@ -27,8 +27,6 @@ from sugar.graphics.palette import Palette
from sugar.graphics.canvasicon import CanvasIcon
from sugar.graphics import color
from sugar.graphics import style
-from sugar.activity import activityfactory
-from sugar.activity.bundle import Bundle
from sugar.clipboard import clipboardservice
from sugar.datastore import datastore
from sugar.objects import mime
@@ -118,44 +116,43 @@ class ClipboardMenu(Palette):
if self._percent < 100:
return
- # Get the file path
- cb_service = clipboardservice.get_instance()
- obj = cb_service.get_object(self._object_id)
- formats = obj['FORMATS']
- if len(formats) == 0:
- logging.warning('ClipboardMenu._open_item_activate_cb: Object without data.')
- return
-
- if not self._activity and \
- not formats[0] == 'application/vnd.olpc-x-sugar':
- logging.warning('ClipboardMenu._open_item_activate_cb: Object without activity.')
- return
-
- uri = cb_service.get_object_data(self._object_id, formats[0])['DATA']
- if not uri.startswith('file://'):
- return
-
- (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(uri)
-
- # FIXME: would be better to check for format.onDisk
- try:
- path_exists = os.path.exists(path)
- except TypeError:
- path_exists = False
-
- if path_exists:
- if self._activity:
- activityfactory.create_with_uri(self._activity, uri)
- else:
- self._install_xo(path)
+ jobject = self._copy_to_journal()
+ # TODO: we cannot simply call resume() right now because we would lock
+ # the shell as we are sharing the same loop as the shell service.
+ #jobject.resume()
+
+ # TODO: take this out when we fix the mess that is the shell/shellservice.
+ from shell.model import bundleregistry
+ from sugar.activity.bundle import Bundle
+ from sugar.activity import activityfactory
+ if jobject.is_bundle():
+ bundle = Bundle(jobject.file_path)
+ if not bundle.is_installed():
+ bundle.install()
+
+ activityfactory.create(bundle.get_service_name())
else:
- logging.debug("Clipboard item file path %s didn't exist" % path)
+ service_name = None
+ if jobject.metadata.has_key('activity') and jobject.metadata['activity']:
+ service_name = self.metadata['activity']
+ elif jobject.metadata.has_key('mime_type') and jobject.metadata['mime_type']:
+ mime_type = jobject.metadata['mime_type']
+ for bundle in bundleregistry.get_registry():
+ if bundle.get_mime_types() and mime_type in bundle.get_mime_types():
+ service_name = bundle.get_service_name()
+ break
+ if service_name:
+ activityfactory.create_with_object_id(service_name,
+ jobject.object_id)
def _remove_item_activate_cb(self, menu_item):
cb_service = clipboardservice.get_instance()
cb_service.delete_object(self._object_id)
def _journal_item_activate_cb(self, menu_item):
+ self._copy_to_journal()
+
+ def _copy_to_journal(self):
cb_service = clipboardservice.get_instance()
obj = cb_service.get_object(self._object_id)
@@ -185,9 +182,6 @@ class ClipboardMenu(Palette):
jobject.metadata['mime_type'] = mime_type
jobject.file_path = file_path
datastore.write(jobject)
-
- def _install_xo(self, path):
- bundle = Bundle(path)
- if not bundle.is_installed():
- bundle.install()
+
+ return jobject
diff --git a/sugar/datastore/datastore.py b/sugar/datastore/datastore.py
index 26ea49e..45af947 100644
--- a/sugar/datastore/datastore.py
+++ b/sugar/datastore/datastore.py
@@ -20,6 +20,9 @@ import logging
import gobject
from sugar.datastore import dbus_helpers
+from sugar import activity
+from sugar.activity.bundle import Bundle
+from sugar.activity import activityfactory
class DSMetadata(gobject.GObject):
__gsignals__ = {
@@ -85,6 +88,37 @@ class DSObject:
file_path = property(get_file_path, set_file_path)
+ def get_activities(self):
+ activities = []
+
+ if self.metadata['activity']:
+ activity_info = activity.get_registry().get_activity(self.metadata['activity'])
+ activities.append(activity_info)
+
+ mime_type = self.metadata['mime_type']
+ if mime_type:
+ activities_info = activity.get_registry().get_activities_for_type(mime_type)
+ for activity_info in activities_info:
+ if activity_info.service_name != self.metadata['activity']:
+ activities.append(activity_info)
+
+ return activities
+
+ def is_bundle(self):
+ return self.metadata['mime_type'] == 'application/vnd.olpc-x-sugar'
+
+ def resume(self):
+ if self.is_bundle():
+ bundle = Bundle(self.file_path)
+ if not bundle.is_installed():
+ bundle.install()
+
+ activityfactory.create(bundle.get_service_name())
+ else:
+ activity_info = self.get_activities()[0]
+ activityfactory.create_with_object_id(activity_info.service_name,
+ self.object_id)
+
def get(object_id):
logging.debug('datastore.get')
metadata = dbus_helpers.get_properties(object_id)