// -*- C++ -*- /* * GChemPaint library * arrow.cc * * Copyright (C) 2002-2004 Jean Bréfort * * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #include "gchempaint-config.h" #include "widgetdata.h" #include "view.h" #include "settings.h" #include "libgcpcanvas/gcp-canvas-line.h" #include "libgcpcanvas/gprintable.h" #include "arrow.h" #include "document.h" #include gcpArrow::gcpArrow(TypeId Type): Object(Type) { } gcpArrow::~gcpArrow() { } bool gcpArrow::Save(xmlDocPtr xml, xmlNodePtr node) { xmlNodePtr child; gchar buf[16]; if (!node) return false; SaveId(node); child = xmlNewDocNode(xml, NULL, (xmlChar*)"start", NULL); if (child) xmlAddChild(node, child); else return false; g_snprintf(buf, sizeof(buf), "%g", m_x); xmlNewProp(child, (xmlChar*)"x", (xmlChar*)buf); g_snprintf(buf, sizeof(buf), "%g", m_y); xmlNewProp(child, (xmlChar*)"y", (xmlChar*)buf); child = xmlNewDocNode(xml, NULL, (xmlChar*)"end", NULL); if (child) xmlAddChild(node, child); else return false; g_snprintf(buf, sizeof(buf), "%g", m_x + m_width); xmlNewProp(child, (xmlChar*)"x", (xmlChar*)buf); g_snprintf(buf, sizeof(buf), "%g", m_y + m_height); xmlNewProp(child, (xmlChar*)"y", (xmlChar*)buf); return true; } bool gcpArrow::Load (xmlNodePtr node) { char* tmp, *endptr; bool result; xmlNodePtr child; tmp = (char*) xmlGetProp (node, (xmlChar*) "id"); if (tmp) { SetId (tmp); xmlFree (tmp); } child = GetNodeByName (node, (char*) "start"); if (!child) return false; tmp = (char*) xmlGetProp (child, (xmlChar*) "x"); if (!tmp) return false; m_x = strtod (tmp, &endptr); result = *endptr; xmlFree (tmp); if (result) return false; tmp = (char*) xmlGetProp (child, (xmlChar*) "y"); if (!tmp) return false; m_y = strtod (tmp, &endptr); result = *endptr; xmlFree (tmp); if (result) return false; child = GetNodeByName (node, (char*) "end"); if (!child) return false; tmp = (char*) xmlGetProp (child, (xmlChar*) "x"); if (!tmp) return false; m_width = strtod (tmp, &endptr) - m_x; result = *endptr; xmlFree (tmp); if (result) return false; tmp = (char*) xmlGetProp (child, (xmlChar*) "y"); if (!tmp) return false; m_height = strtod (tmp, &endptr) - m_y; result = *endptr; xmlFree (tmp); if (result) return false; return true; } void gcpArrow::SetSelected(GtkWidget* w, int state) { gcpWidgetData* pData = (gcpWidgetData*)g_object_get_data(G_OBJECT(w), "data"); GnomeCanvasGroup* group = pData->Items[this]; gchar* color; switch (state) { case SelStateUnselected: color = Color; break; case SelStateSelected: color = SelectColor; break; case SelStateUpdating: color = AddColor; break; case SelStateErasing: color = DeleteColor; break; default: color = Color; break; } GList* il = group->item_list; while (il) { g_object_set(G_OBJECT(il->data), "fill_color", color, NULL); il = il->next; } } void gcpArrow::SetCoords(double xstart, double ystart, double xend, double yend) { m_x = xstart; m_y = ystart; m_width = xend - xstart; m_height = yend - ystart; } bool gcpArrow::GetCoords(double* xstart, double* ystart, double* xend, double* yend) { *xstart = m_x; *ystart = m_y; *xend = m_x + m_width; *yend = m_y + m_height; return true; } void gcpArrow::Move(double x, double y, double) { m_x += x; m_y += y; } void gcpArrow::Transform2D(Matrix2D& m, double x, double y) { m_x -= x; m_y -= y; m.Transform (m_x, m_y); m_x += x; m_y += y; m.Transform (m_width, m_height); } double gcpArrow::GetYAlign () { return m_y + m_height / 2.; }