/*! \brief Complete the text edit * * \par Function Description * This function completes the text edit by setting all the selected text * objects to the desired values. * * \param [in] w_current The topleval gschem struct. * \param [in] string The text to set the selected text objects to. If this * string is NULL or has zero length, then this function * leaves the text unchanged. * \param [in] color The color to set the selected text to. If the color * is less than zero, then this function leaves the color * unchanged. * \param [in] align The text alignment to set the selected text to. If * the alignment is less than zero, this function leaves * the alignment unchanged. * \param [in] rotate The rotation angle to set the selected text to. If * the rotation angle is less than zero, this function * leaves the rotation angle unchanged. * \param [in] size The size to set all the selected text to. If the * size is less than or equal to zero, this function * leaves the size unchanged. */ void o_text_edit_end(GschemToplevel *w_current, char *string, int color, int align, int rotate, int size) { GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); TOPLEVEL *toplevel = gschem_page_view_get_toplevel (page_view); PAGE *page = gschem_page_view_get_page (page_view); OBJECT *object; GList *s_current; char *textstr = string; g_return_if_fail (toplevel != NULL); g_return_if_fail (page != NULL); if ((textstr != NULL) && (g_utf8_strlen(textstr, -1) == 0)) { textstr = NULL; } /* skip over head */ s_current = geda_list_get_glist (page->selection_list); while(s_current != NULL) { object = (OBJECT *) s_current->data; if (object) { if (object->type == OBJ_TEXT) { if (size > 0) { object->text->size = size; } if (align >= 0) { object->text->alignment = align; } if (color >= 0) { object->color = color; } if (rotate >= 0) { object->text->angle = rotate; } if (textstr != NULL) { o_text_set_string (toplevel, object, textstr); /* handle slot= attribute, it's a special case */ if (object->attached_to != NULL && g_ascii_strncasecmp (textstr, "slot=", 5) == 0) { o_slot_end (w_current, object->attached_to, textstr); } } o_text_recreate(toplevel, object); } } s_current = g_list_next(s_current); } gschem_toplevel_page_content_changed (w_current, page); o_undo_savestate(w_current, page, UNDO_ALL); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * * \note * The object passed in should be the REAL object, NOT any copy in any * selection list */ void o_text_change(GschemToplevel *w_current, OBJECT *object, char *string, int visibility, int show) { GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); TOPLEVEL *toplevel = gschem_page_view_get_toplevel (page_view); PAGE *page = gschem_page_view_get_page (page_view); g_return_if_fail (toplevel != NULL); g_return_if_fail (page != NULL); if (object == NULL) { return; } if (object->type != OBJ_TEXT) { return; } o_text_set_string (toplevel, object, string); o_set_visibility (toplevel, object, visibility); object->show_name_value = show; o_text_recreate(toplevel, object); /* handle slot= attribute, it's a special case */ if (object->attached_to != NULL && g_ascii_strncasecmp (string, "slot=", 5) == 0) { o_slot_end (w_current, object->attached_to, string); } gschem_toplevel_page_content_changed (w_current, page); }
/** @brief Removes the number from the element. * * This function updates the text content of the \a o_current object. * * @param autotext Pointer to the state structure * @param o_current Pointer to the object from which to remove the number * */ void autonumber_remove_number(AUTONUMBER_TEXT * autotext, OBJECT *o_current) { OBJECT *o_parent, *o_slot; gchar *slot_str; gchar *str = NULL; /* replace old text */ str = g_strdup_printf("%s?", autotext->current_searchtext); o_text_set_string (autotext->w_current->toplevel, o_current, str); g_free (str); /* remove the slot attribute if slotting is active */ if (autotext->slotting) { /* get the slot attribute */ o_parent = o_current->attached_to; if (o_parent != NULL) { slot_str = s_slot_search_slot (o_parent, &o_slot); g_free (slot_str); /* Only attempt to remove non-inherited slot attributes */ if (o_slot != NULL && !o_attrib_is_inherited (o_slot)) { /* delete the slot attribute */ o_delete (autotext->w_current, o_slot); } } } gschem_toplevel_page_content_changed (autotext->w_current, autotext->w_current->toplevel->page_current); }
/*! \brief Changes the number <B>OBJECT</B> element. Changes the slot attribute. * \par Function Description * This function updates the text content of the <B>o_current</B> object. * If the <B>slot</B> value is not zero. It updates the slot attribut of the * complex element that is also the parent object of the o_current element. */ void autonumber_apply_new_text(AUTONUMBER_TEXT * autotext, OBJECT *o_current, gint number, gint slot) { char *str; if (slot != 0) { /* update the slot on the owning object */ str = g_strdup_printf ("slot=%d", slot); o_slot_end (autotext->w_current, o_current->attached_to, str); g_free (str); } /* replace old text */ str = g_strdup_printf("%s%d", autotext->current_searchtext, number); o_text_set_string (autotext->w_current->toplevel, o_current, str); g_free (str); gschem_toplevel_page_content_changed (autotext->w_current, autotext->w_current->toplevel->page_current); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_slot_end(GSCHEM_TOPLEVEL *w_current, const char *string, int len) { TOPLEVEL *toplevel = w_current->toplevel; OBJECT *new_obj; OBJECT *object; OBJECT *temp; char *slot_value; char *numslots_value; OBJECT *slot_text_object; char *value = NULL; int numslots; int new_slot_number; int status; status = o_attrib_get_name_value(string, NULL, &value); if (!status) { s_log_message(_("Slot attribute malformed\n")); return; } object = o_select_return_first_object(w_current); /* get the parent object if the selection is only a text object */ if (object != NULL && object->type == OBJ_TEXT) { if (object->attached_to != NULL) { object = object->attached_to; } } /* now find the slot attribute on the outside first */ if (object != NULL) { numslots_value = o_attrib_search_numslots(object, NULL); if (!numslots_value) { s_log_message(_("numslots attribute missing\n")); s_log_message( _("Slotting not allowed for this component\n")); g_free(value); return; } numslots = atoi(numslots_value); g_free(numslots_value); new_slot_number = atoi(value); #if DEBUG printf("numslots = %d\n", numslots); #endif if (new_slot_number > numslots || new_slot_number <=0 ) { s_log_message(_("New slot number out of range\n")); g_free(value); return; } /* first see if slot attribute already exists outside * complex */ slot_value = o_attrib_search_slot(object, &slot_text_object); if (slot_value) { o_text_set_string (toplevel, slot_text_object, string); temp = slot_text_object; if (temp->visibility == VISIBLE || (temp->visibility == INVISIBLE && toplevel->show_hidden_text)) { o_invalidate (w_current,temp); } o_text_recreate(toplevel, temp); /* this doesn't deal with the selection list * item */ if (temp->visibility == VISIBLE || (temp->visibility == INVISIBLE && toplevel->show_hidden_text)) { o_invalidate (w_current,temp); } g_free(slot_value); } else { /* here you need to do the add the slot attribute since it doesn't exist */ new_obj = o_text_new (toplevel, OBJ_TEXT, ATTRIBUTE_COLOR, object->complex->x, object->complex->y, LOWER_LEFT, 0, /* zero is angle */ string, 10, INVISIBLE, SHOW_NAME_VALUE); s_page_append (toplevel->page_current, new_obj); /* manually attach attribute */ o_attrib_attach (toplevel, new_obj, object, FALSE); slot_text_object = new_obj; } o_invalidate (w_current, object); o_attrib_slot_update(toplevel, object); o_invalidate (w_current,object); toplevel->page_current->CHANGED = 1; g_free(value); } else { fprintf(stderr, _("uggg! you tried to slot edit something that doesn't exist!\n")); g_free(value); exit(-1); } }
/*! \brief Update all slot attributes in an object. * \par Function Description * Update pinnumber attributes in a graphic object. * The interesting case is where the object is an * instantiation of a slotted part. This means that * s_slot_update_object iterates through all pins * found on object and sets the pinnumber= attrib * on each. This doesn't matter for non-slotted * parts, but on slotted parts, this is what sets the * pinnumber= attribute on slots 2, 3, 4.... * * \param [in] toplevel The TOPLEVEL object. * \param [in,out] object The OBJECT to update. */ void s_slot_update_object (TOPLEVEL *toplevel, OBJECT *object) { OBJECT *o_pin_object; OBJECT *o_pinnum_attrib; GList *attributes; char *string; char *slotdef; char *pinseq; int slot; int slot_string; int pin_counter; /* Internal pin counter private to this fcn. */ char* current_pin; /* text from slotdef= to be made into pinnumber= */ char* cptr; /* char pointer pointing to pinnumbers in slotdef=#:#,#,# string */ /* For this particular graphic object (component instantiation) */ /* get the slot number as a string */ string = o_attrib_search_object_attribs_by_name (object, "slot", 0); if (string == NULL) { /* Did not find slot= attribute. * This happens if there is no attached slot attribute, and * there is no default slot= attribute inside the symbol. * Assume slot=1. */ slot = 1; slot_string = 0; } else { slot_string = 1; slot = atoi (string); g_free (string); } /* OK, now that we have the slot number, use it to get the */ /* corresponding slotdef=#:#,#,# string. */ slotdef = s_slot_search_slotdef (object, slot); if (slotdef == NULL) { if (slot_string) /* only an error if there's a slot string */ s_log_message (_("Did not find slotdef=#:#,#,#... attribute\n")); return; } if (!strstr (slotdef, ":")) { /* Didn't find proper slotdef=#:... put warning into log */ s_log_message (_("Improper slotdef syntax: missing \":\".\n")); g_free (slotdef); return; } /* skip over slotdef number */ /* slotdef is in the form #:#,#,# */ /* this code skips first #: */ cptr = slotdef; while (*cptr != '\0' && *cptr != ':') { cptr++; } cptr++; /* skip colon */ if (*cptr == '\0') { s_log_message (_("Did not find proper slotdef=#:#,#,#... attribute\n")); g_free (slotdef); return; } /* loop on all pins found in slotdef= attribute */ pin_counter = 1; /* internal pin_counter */ /* get current pinnumber= from slotdef= attrib */ current_pin = strtok (cptr, DELIMITERS); while (current_pin != NULL) { /* get pin on this component with pinseq == pin_counter */ pinseq = g_strdup_printf ("%d", pin_counter); o_pin_object = o_complex_find_pin_by_attribute (object, "pinseq", pinseq); g_free (pinseq); if (o_pin_object != NULL) { /* Now rename pinnumber= attrib on this part with value found */ /* in slotdef attribute */ attributes = o_attrib_return_attribs (o_pin_object); o_pinnum_attrib = o_attrib_find_attrib_by_name (attributes, "pinnumber", 0); g_list_free (attributes); if (o_pinnum_attrib != NULL) { o_text_set_string (toplevel, o_pinnum_attrib, g_strdup_printf ("pinnumber=%s", current_pin)); } pin_counter++; } else { s_log_message (_("component missing pinseq= attribute\n")); } current_pin = strtok (NULL, DELIMITERS); } g_free (slotdef); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_slot_end(GSCHEM_TOPLEVEL *w_current, OBJECT *object, const char *string) { TOPLEVEL *toplevel = w_current->toplevel; OBJECT *new_obj; char *slot_value; char *numslots_value; OBJECT *o_slot; char *value = NULL; int numslots; int new_slot_number; int status; g_return_if_fail (object != NULL); status = o_attrib_string_get_name_value (string, NULL, &value); if (!status) { s_log_message (_("Slot attribute malformed\n")); return; } numslots_value = o_attrib_search_object_attribs_by_name (object, "numslots", 0); if (!numslots_value) { s_log_message (_("numslots attribute missing\n")); s_log_message (_("Slotting not allowed for this component\n")); g_free (value); return; } numslots = atoi (numslots_value); g_free (numslots_value); new_slot_number = atoi (value); #if DEBUG printf ("numslots = %d\n", numslots); #endif if (new_slot_number > numslots || new_slot_number <=0 ) { s_log_message (_("New slot number out of range\n")); g_free (value); return; } /* first see if slot attribute already exists outside * complex */ slot_value = s_slot_search_slot (object, &o_slot); g_free (slot_value); if (o_slot != NULL && !o_attrib_is_inherited (o_slot)) { o_text_set_string (toplevel, o_slot, string); } else { /* here you need to do the add the slot attribute since it doesn't exist */ new_obj = o_text_new (toplevel, OBJ_TEXT, ATTRIBUTE_COLOR, object->complex->x, object->complex->y, LOWER_LEFT, 0, /* zero is angle */ string, 10, INVISIBLE, SHOW_NAME_VALUE); s_page_append (toplevel, toplevel->page_current, new_obj); /* manually attach attribute */ o_attrib_attach (toplevel, new_obj, object, FALSE); } s_slot_update_object (toplevel, object); toplevel->page_current->CHANGED = 1; g_free (value); }