Exemple #1
0
/**
 * Checks if the given marker is used in the shape, and if so, it
 * releases it by calling sp_marker_hide.  Also detaches signals
 * and unrefs the marker from the shape.
 */
static void
sp_shape_marker_release (SPObject *marker, SPShape *shape)
{
    SPItem *item = dynamic_cast<SPItem *>(shape);
    g_return_if_fail(item != NULL);

    for (int i = 0; i < SP_MARKER_LOC_QTY; i++) {
        if (marker == shape->_marker[i]) {
            SPItemView *v;
            /* Hide marker */
            for (v = item->display; v != NULL; v = v->next) {
                sp_marker_hide(shape->_marker[i], v->arenaitem->key() + i);
            }
            /* Detach marker */
            shape->_release_connect[i].disconnect();
            shape->_modified_connect[i].disconnect();
            shape->_marker[i] = static_cast<SPMarker *>(sp_object_hunref(shape->_marker[i], item));
        }
    }
}
Exemple #2
0
void URIReference::_setObject(SPObject *obj)
{
    if ( obj && !_acceptObject(obj) ) {
        obj = NULL;
    }

    if ( obj == _obj ) return;

    SPObject *old_obj=_obj;
    _obj = obj;

    _release_connection.disconnect();
    if (_obj) {
        sp_object_href(_obj, _owner);
        _release_connection = _obj->connectRelease(sigc::mem_fun(*this, &URIReference::_release));
    }
    _changed_signal.emit(old_obj, _obj);
    if (old_obj) {
        /* release the old object _after_ the signal emission */
        sp_object_hunref(old_obj, _owner);
    }
}
Exemple #3
0
/**
 * Removes, releases and unrefs all children of object
 *
 * This is the inverse of sp_shape_build().  It must be invoked as soon
 * as the shape is removed from the tree, even if it is still referenced
 * by other objects.  This routine also disconnects/unrefs markers and
 * curves attached to it.
 *
 * \see SPObject::release()
 */
void SPShape::release() {
    for (int i = 0; i < SP_MARKER_LOC_QTY; i++) {
        if (this->_marker[i]) {

            for (SPItemView *v = this->display; v != NULL; v = v->next) {
                sp_marker_hide(_marker[i], v->arenaitem->key() + i);
            }

            this->_release_connect[i].disconnect();
            this->_modified_connect[i].disconnect();
            _marker[i] = static_cast<SPMarker *>(sp_object_hunref(_marker[i], this));
        }
    }
    
    if (this->_curve) {
        this->_curve = this->_curve->unref();
    }
    
    if (this->_curve_before_lpe) {
        this->_curve_before_lpe = this->_curve_before_lpe->unref();
    }

    SPLPEItem::release();
}
Exemple #4
0
/**
 * Adds a new marker to shape object at the location indicated by key.  value
 * must be a valid URI reference resolvable from the shape object (i.e., present
 * in the document <defs>).  If the shape object already has a marker
 * registered at the given position, it is removed first.  Then the
 * new marker is hrefed and its signals connected.
 */
void
sp_shape_set_marker (SPObject *object, unsigned int key, const gchar *value)
{
    SPShape *shape = dynamic_cast<SPShape *>(object);
    g_return_if_fail(shape != NULL);

    if (key > SP_MARKER_LOC_END) {
        return;
    }

    SPObject *mrk = sp_css_uri_reference_resolve(object->document, value);
    SPMarker *marker = dynamic_cast<SPMarker *>(mrk);
    if (marker != shape->_marker[key]) {
        if (shape->_marker[key]) {
            SPItemView *v;

            /* Detach marker */
            shape->_release_connect[key].disconnect();
            shape->_modified_connect[key].disconnect();

            /* Hide marker */
            for (v = shape->display; v != NULL; v = v->next) {
                sp_marker_hide(shape->_marker[key],
                               v->arenaitem->key() + key);
            }

            /* Unref marker */
            shape->_marker[key] = static_cast<SPMarker *>(sp_object_hunref(shape->_marker[key], object));
        }
        if (marker) {
            shape->_marker[key] = static_cast<SPMarker *>(sp_object_href(marker, object));
            shape->_release_connect[key] = marker->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_shape_marker_release), shape));
            shape->_modified_connect[key] = marker->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_shape_marker_modified), shape));
        }
    }
}