style-subject.cpp revision 1c1a657fd782b0eb600b69d955d4d266a807df96
ec35142cad8ce4f534989cacd6cc98e276263548pjrm/*
ec35142cad8ce4f534989cacd6cc98e276263548pjrm * Copyright (C) 2007 MenTaLguY <mental@rydia.net>
09ba3247163582bf2e30e17c4c154aa259ce038acilix * Abhishek Sharma
ec35142cad8ce4f534989cacd6cc98e276263548pjrm *
ec35142cad8ce4f534989cacd6cc98e276263548pjrm * Released under GNU GPL. Read the file 'COPYING' for more information.
ec35142cad8ce4f534989cacd6cc98e276263548pjrm */
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrm#include "ui/widget/style-subject.h"
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrm#include "desktop.h"
ec35142cad8ce4f534989cacd6cc98e276263548pjrm#include "sp-object.h"
ec35142cad8ce4f534989cacd6cc98e276263548pjrm#include "xml/sp-css-attr.h"
ec35142cad8ce4f534989cacd6cc98e276263548pjrm#include "desktop-style.h"
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrm#include "selection.h"
ec35142cad8ce4f534989cacd6cc98e276263548pjrm#include "style.h"
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmnamespace Inkscape {
ec35142cad8ce4f534989cacd6cc98e276263548pjrmnamespace UI {
ec35142cad8ce4f534989cacd6cc98e276263548pjrmnamespace Widget {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmStyleSubject::StyleSubject() : _desktop(NULL) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
f99da7bacff9743bc2a62e8fa0391b6fb0dad4a1pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmStyleSubject::~StyleSubject() {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm setDesktop(NULL);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmvoid StyleSubject::setDesktop(SPDesktop *desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (desktop != _desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm GC::anchor(desktop);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (_desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm GC::release(_desktop);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _desktop = desktop;
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _afterDesktopSwitch(desktop);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _emitChanged();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmStyleSubject::Selection::Selection() {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmStyleSubject::Selection::~Selection() {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmInkscape::Selection *StyleSubject::Selection::_getSelection() const {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm SPDesktop *desktop = getDesktop();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return desktop->getSelection();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm } else {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return NULL;
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm/*
ec35142cad8ce4f534989cacd6cc98e276263548pjrmStyleSubject::iterator StyleSubject::Selection::begin() {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm Inkscape::Selection *selection = _getSelection();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (selection) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return iterator(selection->list());
ec35142cad8ce4f534989cacd6cc98e276263548pjrm } else {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return iterator(NULL);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}*/
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmGeom::OptRect StyleSubject::Selection::getBounds(SPItem::BBoxType type) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm Inkscape::Selection *selection = _getSelection();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (selection) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return selection->bounds(type);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm } else {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return Geom::OptRect();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmint StyleSubject::Selection::queryStyle(SPStyle *query, int property) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm SPDesktop *desktop = getDesktop();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return sp_desktop_query_style(desktop, query, property);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm } else {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return QUERY_STYLE_NOTHING;
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmvoid StyleSubject::Selection::_afterDesktopSwitch(SPDesktop *desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _sel_changed.disconnect();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _subsel_changed.disconnect();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _sel_modified.disconnect();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _subsel_changed = desktop->connectToolSubselectionChanged(sigc::hide(sigc::mem_fun(*this, &Selection::_emitChanged)));
ec35142cad8ce4f534989cacd6cc98e276263548pjrm Inkscape::Selection *selection = desktop->getSelection();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (selection) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _sel_changed = selection->connectChanged(sigc::hide(sigc::mem_fun(*this, &Selection::_emitChanged)));
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _sel_modified = selection->connectModified(sigc::hide(sigc::hide(sigc::mem_fun(*this, &Selection::_emitChanged))));
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmvoid StyleSubject::Selection::setCSS(SPCSSAttr *css) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm SPDesktop *desktop = getDesktop();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm sp_desktop_set_style(desktop, css);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmStyleSubject::CurrentLayer::CurrentLayer() {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _element = NULL;
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmStyleSubject::CurrentLayer::~CurrentLayer() {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmvoid StyleSubject::CurrentLayer::_setLayer(SPObject *layer) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _layer_release.disconnect();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _layer_modified.disconnect();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (_element) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm sp_object_unref(static_cast<SPObject *>(_element), NULL);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _element = layer;
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (layer) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm sp_object_ref(layer, NULL);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _layer_release = layer->connectRelease(sigc::hide(sigc::bind(sigc::mem_fun(*this, &CurrentLayer::_setLayer), (SPObject *)NULL)));
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _layer_modified = layer->connectModified(sigc::hide(sigc::hide(sigc::mem_fun(*this, &CurrentLayer::_emitChanged))));
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _emitChanged();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmSPObject *StyleSubject::CurrentLayer::_getLayer() const {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return static_cast<SPObject *>(_element);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmSPObject *StyleSubject::CurrentLayer::_getLayerSList() const {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return _element;
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm/*
ec35142cad8ce4f534989cacd6cc98e276263548pjrmStyleSubject::iterator StyleSubject::CurrentLayer::begin() {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return iterator(_getLayerSList());
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}*/
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmGeom::OptRect StyleSubject::CurrentLayer::getBounds(SPItem::BBoxType type) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm SPObject *layer = _getLayer();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (layer && SP_IS_ITEM(layer)) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return SP_ITEM(layer)->desktopBounds(type);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm } else {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return Geom::OptRect();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmint StyleSubject::CurrentLayer::queryStyle(SPStyle *query, int property) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm SelContainer list;
ec35142cad8ce4f534989cacd6cc98e276263548pjrm SPObject* i=_getLayerSList();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (i) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm list.push_back(i);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return sp_desktop_query_style_from_list(list, query, property);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm } else {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm return QUERY_STYLE_NOTHING;
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmvoid StyleSubject::CurrentLayer::setCSS(SPCSSAttr *css) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm SPObject *layer = _getLayer();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (layer) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm sp_desktop_apply_css_recursive(layer, css, true);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrmvoid StyleSubject::CurrentLayer::_afterDesktopSwitch(SPDesktop *desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _layer_switched.disconnect();
ec35142cad8ce4f534989cacd6cc98e276263548pjrm if (desktop) {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _layer_switched = desktop->connectCurrentLayerChanged(sigc::mem_fun(*this, &CurrentLayer::_setLayer));
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _setLayer(desktop->currentLayer());
ec35142cad8ce4f534989cacd6cc98e276263548pjrm } else {
ec35142cad8ce4f534989cacd6cc98e276263548pjrm _setLayer(NULL);
ec35142cad8ce4f534989cacd6cc98e276263548pjrm }
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm}
ec35142cad8ce4f534989cacd6cc98e276263548pjrm
ec35142cad8ce4f534989cacd6cc98e276263548pjrm/*
ec35142cad8ce4f534989cacd6cc98e276263548pjrm Local Variables:
ec35142cad8ce4f534989cacd6cc98e276263548pjrm mode:c++
ec35142cad8ce4f534989cacd6cc98e276263548pjrm c-file-style:"stroustrup"
ec35142cad8ce4f534989cacd6cc98e276263548pjrm c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
ec35142cad8ce4f534989cacd6cc98e276263548pjrm indent-tabs-mode:nil
ec35142cad8ce4f534989cacd6cc98e276263548pjrm fill-column:99
ec35142cad8ce4f534989cacd6cc98e276263548pjrm End:
ec35142cad8ce4f534989cacd6cc98e276263548pjrm*/
ec35142cad8ce4f534989cacd6cc98e276263548pjrm// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
ec35142cad8ce4f534989cacd6cc98e276263548pjrm