gimp/plug-ins/imagemap/imap_object.c

1088 lines
25 KiB
C
Raw Normal View History

1999-09-07 08:03:20 +08:00
/*
* This is a plug-in for GIMP.
1999-09-07 08:03:20 +08:00
*
* Generates clickable image maps.
*
* Copyright (C) 1998-2005 Maurits Rijk m.rijk@chello.nl
1999-09-07 08:03:20 +08:00
*
* This program is free software: you can redistribute it and/or modify
1999-09-07 08:03:20 +08:00
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
1999-09-07 08:03:20 +08:00
* (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, see <https://www.gnu.org/licenses/>.
1999-09-07 08:03:20 +08:00
*
*/
app/gimpprogress.c app/nav_window.c app/ops_buttons.c app/undo_history.c 2001-12-29 Michael Natterer <mitch@gimp.org> * app/gimpprogress.c * app/nav_window.c * app/ops_buttons.c * app/undo_history.c * app/display/gimpdisplayshell.c * app/gui/about-dialog.c * app/gui/brush-editor.c * app/gui/channels-commands.c * app/gui/color-area.c * app/gui/color-notebook.c * app/gui/color-select.c * app/gui/colormap-dialog.c * app/gui/convert-dialog.c * app/gui/device-status-dialog.c * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradient-editor.c * app/gui/info-dialog.c * app/gui/layers-commands.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palette-editor.c * app/gui/palettes-commands.c * app/gui/paths-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/resolution-calibrate-dialog.c * app/gui/splash.c * app/gui/tips-dialog.c * app/gui/toolbox.c * app/gui/user-install-dialog.c * app/tools/gimpbrightnesscontrasttool.c * app/tools/gimpbycolorselecttool.c * app/tools/gimpcolorbalancetool.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpcurvestool.c * app/tools/gimphuesaturationtool.c * app/tools/gimpinktool.c * app/tools/gimplevelstool.c * app/tools/gimpposterizetool.c * app/tools/gimprotatetool.c * app/tools/gimpthresholdtool.c * app/tools/paint_options.c * app/tools/selection_options.c * app/widgets/gimpchannellistview.c * app/widgets/gimpcolorpanel.c * app/widgets/gimpcomponentlistitem.c * app/widgets/gimpconstrainedhwrapbox.c * app/widgets/gimpcontainergridview.c * app/widgets/gimpcontainerlistview.c * app/widgets/gimpcontainermenuimpl.c * app/widgets/gimpdialogfactory.c * app/widgets/gimpdnd.c * app/widgets/gimpdock.c * app/widgets/gimpdockbook.c * app/widgets/gimpdrawablelistitem.c * app/widgets/gimpdrawablelistview.c * app/widgets/gimpfontselection-dialog.c * app/widgets/gimphistogramview.c * app/widgets/gimpitemfactory.c * app/widgets/gimplayerlistitem.c * app/widgets/gimplistitem.[ch] * app/widgets/gimpmenuitem.c * app/widgets/gimppreview.[ch] * app/widgets/gtkhwrapbox.c * app/widgets/gtkvwrapbox.c * app/widgets/gtkwrapbox.c * libgimp/gimpbrushmenu.c * libgimp/gimpexport.c * libgimp/gimpgradientmenu.c * libgimp/gimpmenu.c * libgimp/gimppatternmenu.c * libgimpwidgets/gimpbutton.c * libgimpwidgets/gimpchainbutton.[ch] * libgimpwidgets/gimpcolorarea.h * libgimpwidgets/gimpcolorbutton.c * libgimpwidgets/gimpfileselection.c * libgimpwidgets/gimphelpui.c * libgimpwidgets/gimpoffsetarea.c * libgimpwidgets/gimppatheditor.c * libgimpwidgets/gimppixmap.h * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpstock.[ch] * libgimpwidgets/gimpwidgets.h * plug-ins/FractalExplorer/Dialogs.c * plug-ins/FractalExplorer/Events.c * plug-ins/FractalExplorer/FractalExplorer.c * plug-ins/Lighting/lighting_ui.c * plug-ins/MapObject/mapobject_ui.c * plug-ins/bmp/bmpwrite.c * plug-ins/dbbrowser/dbbrowser_utils.c * plug-ins/fits/fits.c * plug-ins/flame/flame.c * plug-ins/fp/fp_gtk.c * plug-ins/fp/fp_misc.c * plug-ins/gfig/gfig.c * plug-ins/gflare/gflare.c * plug-ins/gfli/gfli.c * plug-ins/gimpressionist/*.c * plug-ins/imagemap/*.[ch] * plug-ins/maze/maze_face.c * plug-ins/mosaic/mosaic.c * plug-ins/pagecurl/pagecurl.c * plug-ins/print/print_gimp.h * plug-ins/rcm/rcm_callback.c * plug-ins/rcm/rcm_dialog.c * plug-ins/rcm/rcm_misc.c * plug-ins/script-fu/script-fu-console.c * plug-ins/script-fu/script-fu-scripts.c * plug-ins/script-fu/script-fu-server.c * plug-ins/sel2path/sel2path.c * plug-ins/sel2path/sel2path_adv_dialog.c * plug-ins/sgi/sgi.c * plug-ins/webbrowser/webbrowser.c * plug-ins/xjt/xjt.c * plug-ins/common/[A-n]*.c: compile with GTK_DISABLE_DEPRECATED defined. Not everything is fully ported yet, had to #undef GTK_DISABLE_DEPRECATED in many places and added #warnings when doing so. * pixmaps/Makefile.am * pixmaps/chain.xpm: removed. * themes/Default/Makefile.am * themes/Default/images/Makefile.am * themes/Default/images/stock-button-hchain-broken.png * themes/Default/images/stock-button-hchain.png * themes/Default/images/stock-button-vchain-broken.png * themes/Default/images/stock-button-vchain.png: new stock icons.
2001-12-29 21:26:29 +08:00
#include "config.h"
#include <gtk/gtk.h>
#include "imap_commands.h"
1999-09-07 08:03:20 +08:00
#include "imap_default_dialog.h"
#include "imap_grid.h"
#include "imap_main.h"
#include "imap_object.h"
#include "imap_string.h"
typedef struct {
ObjectListCallbackFunc_t func;
gpointer data;
} ObjectListCB_t;
static ObjectList_t *_paste_buffer;
static gpointer
object_list_callback_add(ObjectListCallback_t *list,
2011-02-21 18:51:47 +08:00
ObjectListCallbackFunc_t func, gpointer data)
1999-09-07 08:03:20 +08:00
{
ObjectListCB_t *cb = g_new(ObjectListCB_t, 1);
cb->func = func;
cb->data = data;
list->list = g_list_append(list->list, cb);
return cb;
}
static void
object_list_callback_remove(ObjectListCallback_t *list, gpointer id)
{
list->list = g_list_remove(list->list, id);
}
static void
1999-09-07 08:03:20 +08:00
object_list_callback_call(ObjectListCallback_t *list, Object_t *obj)
{
GList *p;
for (p = list->list; p; p = p->next) {
ObjectListCB_t *cb = (ObjectListCB_t*) p->data;
cb->func(obj, cb->data);
}
}
gpointer
object_list_add_changed_cb(ObjectList_t *list, ObjectListCallbackFunc_t func,
2011-02-21 18:51:47 +08:00
gpointer data)
1999-09-07 08:03:20 +08:00
{
return object_list_callback_add(&list->changed_cb, func, data);
}
gpointer
object_list_add_update_cb(ObjectList_t *list, ObjectListCallbackFunc_t func,
2011-02-21 18:51:47 +08:00
gpointer data)
1999-09-07 08:03:20 +08:00
{
return object_list_callback_add(&list->update_cb, func, data);
}
gpointer
object_list_add_add_cb(ObjectList_t *list, ObjectListCallbackFunc_t func,
2011-02-21 18:51:47 +08:00
gpointer data)
1999-09-07 08:03:20 +08:00
{
return object_list_callback_add(&list->add_cb, func, data);
}
gpointer
object_list_add_remove_cb(ObjectList_t *list, ObjectListCallbackFunc_t func,
2011-02-21 18:51:47 +08:00
gpointer data)
1999-09-07 08:03:20 +08:00
{
return object_list_callback_add(&list->remove_cb, func, data);
}
gpointer
object_list_add_select_cb(ObjectList_t *list, ObjectListCallbackFunc_t func,
2011-02-21 18:51:47 +08:00
gpointer data)
1999-09-07 08:03:20 +08:00
{
return object_list_callback_add(&list->select_cb, func, data);
}
gpointer
object_list_add_move_cb(ObjectList_t *list, ObjectListCallbackFunc_t func,
2011-02-21 18:51:47 +08:00
gpointer data)
1999-09-07 08:03:20 +08:00
{
return object_list_callback_add(&list->move_cb, func, data);
}
gpointer
object_list_add_geometry_cb(ObjectList_t *list, ObjectListCallbackFunc_t func,
2011-02-21 18:51:47 +08:00
gpointer data)
1999-09-07 08:03:20 +08:00
{
return object_list_callback_add(&list->geometry_cb, func, data);
}
gpointer
paste_buffer_add_add_cb(ObjectListCallbackFunc_t func, gpointer data)
{
if (!_paste_buffer)
_paste_buffer = make_object_list();
return object_list_callback_add(&_paste_buffer->add_cb, func, data);
}
gpointer
paste_buffer_add_remove_cb(ObjectListCallbackFunc_t func, gpointer data)
{
if (!_paste_buffer)
_paste_buffer = make_object_list();
return object_list_callback_add(&_paste_buffer->remove_cb, func, data);
}
void
1999-09-07 08:03:20 +08:00
object_list_remove_add_cb(ObjectList_t *list, gpointer id)
{
object_list_callback_remove(&list->add_cb, id);
}
void
1999-09-07 08:03:20 +08:00
object_list_remove_select_cb(ObjectList_t *list, gpointer id)
{
object_list_callback_remove(&list->select_cb, id);
}
void
1999-09-07 08:03:20 +08:00
object_list_remove_remove_cb(ObjectList_t *list, gpointer id)
{
object_list_callback_remove(&list->remove_cb, id);
}
void
1999-09-07 08:03:20 +08:00
object_list_remove_move_cb(ObjectList_t *list, gpointer id)
{
object_list_callback_remove(&list->move_cb, id);
}
void
1999-10-25 04:57:17 +08:00
object_list_remove_geometry_cb(ObjectList_t *list, gpointer id)
{
object_list_callback_remove(&list->geometry_cb, id);
}
1999-09-07 08:03:20 +08:00
Object_t*
object_init(Object_t *obj, ObjectClass_t *class)
{
obj->class = class;
obj->refcount = 1;
obj->selected = FALSE;
obj->locked = FALSE;
obj->url = g_strdup ("");
obj->target = g_strdup ("");
obj->comment = g_strdup ("");
obj->accesskey = g_strdup ("");
obj->tabindex = g_strdup ("");
obj->mouse_over = g_strdup ("");
obj->mouse_out = g_strdup ("");
obj->focus = g_strdup ("");
obj->blur = g_strdup ("");
obj->click = g_strdup ("");
return obj;
1999-09-07 08:03:20 +08:00
}
static void
object_destruct(Object_t *obj)
{
if (obj->class->destruct)
obj->class->destruct(obj);
g_free (obj->url);
g_free (obj->target);
g_free (obj->comment);
g_free (obj->accesskey);
g_free (obj->tabindex);
g_free (obj->mouse_over);
g_free (obj->mouse_out);
g_free (obj->focus);
g_free (obj->blur);
g_free (obj->click);
g_free (obj);
1999-09-07 08:03:20 +08:00
}
Object_t*
object_ref(Object_t *obj)
{
obj->refcount++;
return obj;
}
void
1999-09-07 08:03:20 +08:00
object_unref(Object_t *obj)
{
if (!--obj->refcount)
object_destruct(obj);
}
Object_t*
object_clone (Object_t *obj)
{
Object_t *clone = obj->class->clone (obj);
clone->class = obj->class;
clone->refcount = 1;
clone->selected = obj->selected;
clone->locked = FALSE;
clone->url = g_strdup (obj->url);
clone->target = g_strdup (obj->target);
clone->comment = g_strdup (obj->comment);
clone->accesskey = g_strdup (obj->accesskey);
clone->tabindex = g_strdup (obj->tabindex);
clone->mouse_over = g_strdup (obj->mouse_over);
clone->mouse_out = g_strdup (obj->mouse_out);
clone->focus = g_strdup (obj->focus);
clone->blur = g_strdup (obj->blur);
clone->click = g_strdup (obj->click);
return clone;
1999-09-07 08:03:20 +08:00
}
1999-10-25 04:57:17 +08:00
static Object_t*
object_copy (Object_t *src, Object_t *des)
{
des->class = src->class;
des->selected = src->selected;
des->locked = FALSE;
g_strreplace (&des->url, src->url);
g_strreplace (&des->target, src->target);
g_strreplace (&des->comment, src->comment);
g_strreplace (&des->accesskey, src->accesskey);
g_strreplace (&des->tabindex, src->tabindex);
g_strreplace (&des->mouse_over, src->mouse_over);
g_strreplace (&des->mouse_out, src->mouse_out);
g_strreplace (&des->focus, src->focus);
g_strreplace (&des->blur, src->blur);
g_strreplace (&des->click, src->click);
return des;
1999-09-07 08:03:20 +08:00
}
Object_t*
object_assign(Object_t *obj, Object_t *des)
{
1999-10-25 04:57:17 +08:00
obj->class->assign(obj, des);
return object_copy(obj, des);
1999-09-07 08:03:20 +08:00
}
void
2011-02-21 22:45:26 +08:00
object_draw(Object_t *obj, cairo_t *cr)
1999-09-07 08:03:20 +08:00
{
PreferencesData_t *preferences = get_preferences();
2011-02-21 22:45:26 +08:00
ColorSelData_t *colors = &preferences->colors;
GdkRGBA *fg, *bg;
2011-02-21 22:45:26 +08:00
gdouble dash = 4.;
if (obj->selected & 4) {
fg = &colors->interactive_fg;
bg = &colors->interactive_bg;
obj->selected &= ~4;
} else if (obj->selected) {
fg = &colors->selected_fg;
bg = &colors->selected_bg;
} else {
fg = &colors->normal_fg;
bg = &colors->normal_bg;
}
2011-02-21 22:45:26 +08:00
cairo_save (cr);
gdk_cairo_set_source_rgba (cr, bg);
2011-02-21 22:45:26 +08:00
obj->class->draw(obj, cr);
gdk_cairo_set_source_rgba (cr, fg);
2011-02-21 22:45:26 +08:00
cairo_set_dash (cr, &dash, 1, 0.);
obj->class->draw(obj, cr);
1999-09-07 08:03:20 +08:00
if (obj->selected && preferences->show_area_handle)
2011-02-21 22:45:26 +08:00
obj->class->draw_sashes(obj, cr);
cairo_restore (cr);
1999-09-07 08:03:20 +08:00
}
void
1999-09-07 08:03:20 +08:00
object_edit(Object_t *obj, gboolean add)
{
if (!obj->class->info_dialog)
obj->class->info_dialog = create_edit_area_info_dialog(obj);
edit_area_info_dialog_show(obj->class->info_dialog, obj, add);
}
void
1999-09-07 08:03:20 +08:00
object_select(Object_t *obj)
{
obj->selected = TRUE;
object_list_callback_call(&obj->list->select_cb, obj);
object_emit_geometry_signal(obj);
1999-09-07 08:03:20 +08:00
}
void
1999-09-07 08:03:20 +08:00
object_unselect(Object_t *obj)
{
obj->selected = FALSE;
object_list_callback_call(&obj->list->select_cb, obj);
object_emit_geometry_signal(obj);
1999-09-07 08:03:20 +08:00
}
1999-10-25 04:57:17 +08:00
void
object_move(Object_t *obj, gint dx, gint dy)
{
obj->class->move(obj, dx, dy);
object_emit_geometry_signal(obj);
1999-10-25 04:57:17 +08:00
}
void
object_move_sash(Object_t *obj, gint dx, gint dy)
{
gint x, y, width, height;
MoveSashFunc_t sash_func;
obj->class->get_dimensions(obj, &x, &y, &width, &height);
if (dx == 0)
x += (width / 2);
else
x += width;
if (dy == 0)
y += (height / 2);
else
y += height;
sash_func = obj->class->near_sash(obj, x, y);
if (sash_func) {
sash_func(obj, dx, dy);
object_emit_geometry_signal(obj);
}
}
1999-09-07 08:03:20 +08:00
void
object_remove(Object_t *obj)
{
object_list_remove(obj->list, obj);
object_emit_geometry_signal(obj);
1999-09-07 08:03:20 +08:00
}
void
1999-09-07 08:03:20 +08:00
object_lock(Object_t *obj)
{
obj->locked = TRUE;
}
void
1999-09-07 08:03:20 +08:00
object_unlock(Object_t *obj)
{
obj->locked = FALSE;
}
void
1999-09-07 08:03:20 +08:00
object_set_url(Object_t *obj, const gchar *url)
{
g_strreplace (&obj->url, url);
1999-09-07 08:03:20 +08:00
}
void
1999-09-07 08:03:20 +08:00
object_set_target(Object_t *obj, const gchar *target)
{
g_strreplace (&obj->target, target);
1999-09-07 08:03:20 +08:00
}
void
1999-09-07 08:03:20 +08:00
object_set_comment(Object_t *obj, const gchar *comment)
{
g_strreplace (&obj->comment, comment);
}
void
object_set_accesskey (Object_t *obj,
const gchar *accesskey)
{
g_strreplace (&obj->accesskey, accesskey);
}
void
object_set_tabindex (Object_t *obj,
const gchar *tabindex)
{
g_strreplace (&obj->tabindex, tabindex);
1999-09-07 08:03:20 +08:00
}
void
object_set_mouse_over(Object_t *obj, const gchar *mouse_over)
{
g_strreplace (&obj->mouse_over, mouse_over);
1999-09-07 08:03:20 +08:00
}
void
object_set_mouse_out(Object_t *obj, const gchar *mouse_out)
{
g_strreplace (&obj->mouse_out, mouse_out);
1999-09-07 08:03:20 +08:00
}
void
object_set_focus(Object_t *obj, const gchar *focus)
{
g_strreplace (&obj->focus, focus);
1999-09-07 08:03:20 +08:00
}
void
object_set_blur (Object_t *obj,
const gchar *blur)
1999-09-07 08:03:20 +08:00
{
g_strreplace (&obj->blur, blur);
}
void
object_set_click (Object_t *obj,
const gchar *click)
{
g_strreplace (&obj->click, click);
1999-09-07 08:03:20 +08:00
}
gint
object_get_position_in_list(Object_t *obj)
{
return g_list_index(obj->list->list, (gpointer) obj);
}
void
1999-09-07 08:03:20 +08:00
object_emit_changed_signal(Object_t *obj)
{
object_list_callback_call(&obj->list->changed_cb, obj);
}
void
1999-10-25 04:57:17 +08:00
object_emit_geometry_signal(Object_t *obj)
{
object_list_callback_call(&obj->list->geometry_cb, obj);
}
void
1999-10-25 04:57:17 +08:00
object_emit_update_signal(Object_t *obj)
{
object_list_callback_call(&obj->list->update_cb, obj);
}
1999-09-07 08:03:20 +08:00
void
do_object_locked_dialog(void)
{
static DefaultDialog_t *dialog;
if (!dialog) {
dialog = make_default_dialog("Object locked");
default_dialog_hide_cancel_button(dialog);
default_dialog_hide_apply_button(dialog);
default_dialog_set_label(
2011-02-21 18:51:47 +08:00
dialog,
"\n You cannot delete the selected object \n"
"since it is currently being edited.\n");
1999-09-07 08:03:20 +08:00
}
default_dialog_show(dialog);
}
static Object_t*
1999-09-07 08:03:20 +08:00
object_factory_create_object(ObjectFactory_t *factory, gint x, gint y)
{
return factory->obj = factory->create_object(x, y);
}
static gboolean
button_motion(GtkWidget *widget, GdkEventMotion *event,
2011-02-21 18:51:47 +08:00
ObjectFactory_t *factory)
1999-09-07 08:03:20 +08:00
{
gint x = get_real_coord((gint) event->x);
gint y = get_real_coord((gint) event->y);
round_to_grid(&x, &y);
factory->set_xy(factory->obj, event->state, x, y);
2011-02-21 22:45:26 +08:00
preview_redraw ();
return FALSE;
1999-09-07 08:03:20 +08:00
}
gboolean
1999-09-07 08:03:20 +08:00
object_on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
static ObjectFactory_t *factory;
PreferencesData_t *preferences = get_preferences();
gint x = get_real_coord((gint) event->x);
gint y = get_real_coord((gint) event->y);
static Object_t *obj;
if (event->type == GDK_2BUTTON_PRESS)
return FALSE;
1999-09-07 08:03:20 +08:00
round_to_grid(&x, &y);
if (obj) {
if (event->button == 1) {
2011-02-21 18:51:47 +08:00
if (!factory->finish || factory->finish(obj, x, y)) {
g_signal_handlers_disconnect_by_func(widget,
button_motion,
app/gimpprogress.c app/nav_window.c app/ops_buttons.c app/undo_history.c 2001-12-29 Michael Natterer <mitch@gimp.org> * app/gimpprogress.c * app/nav_window.c * app/ops_buttons.c * app/undo_history.c * app/display/gimpdisplayshell.c * app/gui/about-dialog.c * app/gui/brush-editor.c * app/gui/channels-commands.c * app/gui/color-area.c * app/gui/color-notebook.c * app/gui/color-select.c * app/gui/colormap-dialog.c * app/gui/convert-dialog.c * app/gui/device-status-dialog.c * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradient-editor.c * app/gui/info-dialog.c * app/gui/layers-commands.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palette-editor.c * app/gui/palettes-commands.c * app/gui/paths-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/resolution-calibrate-dialog.c * app/gui/splash.c * app/gui/tips-dialog.c * app/gui/toolbox.c * app/gui/user-install-dialog.c * app/tools/gimpbrightnesscontrasttool.c * app/tools/gimpbycolorselecttool.c * app/tools/gimpcolorbalancetool.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpcurvestool.c * app/tools/gimphuesaturationtool.c * app/tools/gimpinktool.c * app/tools/gimplevelstool.c * app/tools/gimpposterizetool.c * app/tools/gimprotatetool.c * app/tools/gimpthresholdtool.c * app/tools/paint_options.c * app/tools/selection_options.c * app/widgets/gimpchannellistview.c * app/widgets/gimpcolorpanel.c * app/widgets/gimpcomponentlistitem.c * app/widgets/gimpconstrainedhwrapbox.c * app/widgets/gimpcontainergridview.c * app/widgets/gimpcontainerlistview.c * app/widgets/gimpcontainermenuimpl.c * app/widgets/gimpdialogfactory.c * app/widgets/gimpdnd.c * app/widgets/gimpdock.c * app/widgets/gimpdockbook.c * app/widgets/gimpdrawablelistitem.c * app/widgets/gimpdrawablelistview.c * app/widgets/gimpfontselection-dialog.c * app/widgets/gimphistogramview.c * app/widgets/gimpitemfactory.c * app/widgets/gimplayerlistitem.c * app/widgets/gimplistitem.[ch] * app/widgets/gimpmenuitem.c * app/widgets/gimppreview.[ch] * app/widgets/gtkhwrapbox.c * app/widgets/gtkvwrapbox.c * app/widgets/gtkwrapbox.c * libgimp/gimpbrushmenu.c * libgimp/gimpexport.c * libgimp/gimpgradientmenu.c * libgimp/gimpmenu.c * libgimp/gimppatternmenu.c * libgimpwidgets/gimpbutton.c * libgimpwidgets/gimpchainbutton.[ch] * libgimpwidgets/gimpcolorarea.h * libgimpwidgets/gimpcolorbutton.c * libgimpwidgets/gimpfileselection.c * libgimpwidgets/gimphelpui.c * libgimpwidgets/gimpoffsetarea.c * libgimpwidgets/gimppatheditor.c * libgimpwidgets/gimppixmap.h * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpstock.[ch] * libgimpwidgets/gimpwidgets.h * plug-ins/FractalExplorer/Dialogs.c * plug-ins/FractalExplorer/Events.c * plug-ins/FractalExplorer/FractalExplorer.c * plug-ins/Lighting/lighting_ui.c * plug-ins/MapObject/mapobject_ui.c * plug-ins/bmp/bmpwrite.c * plug-ins/dbbrowser/dbbrowser_utils.c * plug-ins/fits/fits.c * plug-ins/flame/flame.c * plug-ins/fp/fp_gtk.c * plug-ins/fp/fp_misc.c * plug-ins/gfig/gfig.c * plug-ins/gflare/gflare.c * plug-ins/gfli/gfli.c * plug-ins/gimpressionist/*.c * plug-ins/imagemap/*.[ch] * plug-ins/maze/maze_face.c * plug-ins/mosaic/mosaic.c * plug-ins/pagecurl/pagecurl.c * plug-ins/print/print_gimp.h * plug-ins/rcm/rcm_callback.c * plug-ins/rcm/rcm_dialog.c * plug-ins/rcm/rcm_misc.c * plug-ins/script-fu/script-fu-console.c * plug-ins/script-fu/script-fu-scripts.c * plug-ins/script-fu/script-fu-server.c * plug-ins/sel2path/sel2path.c * plug-ins/sel2path/sel2path_adv_dialog.c * plug-ins/sgi/sgi.c * plug-ins/webbrowser/webbrowser.c * plug-ins/xjt/xjt.c * plug-ins/common/[A-n]*.c: compile with GTK_DISABLE_DEPRECATED defined. Not everything is fully ported yet, had to #undef GTK_DISABLE_DEPRECATED in many places and added #warnings when doing so. * pixmaps/Makefile.am * pixmaps/chain.xpm: removed. * themes/Default/Makefile.am * themes/Default/images/Makefile.am * themes/Default/images/stock-button-hchain-broken.png * themes/Default/images/stock-button-hchain.png * themes/Default/images/stock-button-vchain-broken.png * themes/Default/images/stock-button-vchain.png: new stock icons.
2001-12-29 21:26:29 +08:00
factory);
2011-02-21 18:51:47 +08:00
if (object_is_valid(obj)) {
Command_t *command = create_command_new(get_shapes(), obj);
command_execute(command);
if (preferences->prompt_for_area_info)
object_edit(obj, FALSE);
} else {
2011-02-21 22:45:26 +08:00
object_unref(obj);
2011-02-21 18:51:47 +08:00
}
2011-02-21 22:45:26 +08:00
preview_unset_tmp_obj (obj);
preview_redraw ();
2011-02-21 18:51:47 +08:00
obj = NULL;
main_clear_dimension();
}
1999-09-07 08:03:20 +08:00
} else if (event->button == 3) {
2011-02-21 18:51:47 +08:00
if (!factory->cancel || factory->cancel(event, obj)) {
g_signal_handlers_disconnect_by_func(widget,
button_motion,
app/gimpprogress.c app/nav_window.c app/ops_buttons.c app/undo_history.c 2001-12-29 Michael Natterer <mitch@gimp.org> * app/gimpprogress.c * app/nav_window.c * app/ops_buttons.c * app/undo_history.c * app/display/gimpdisplayshell.c * app/gui/about-dialog.c * app/gui/brush-editor.c * app/gui/channels-commands.c * app/gui/color-area.c * app/gui/color-notebook.c * app/gui/color-select.c * app/gui/colormap-dialog.c * app/gui/convert-dialog.c * app/gui/device-status-dialog.c * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradient-editor.c * app/gui/info-dialog.c * app/gui/layers-commands.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palette-editor.c * app/gui/palettes-commands.c * app/gui/paths-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/resolution-calibrate-dialog.c * app/gui/splash.c * app/gui/tips-dialog.c * app/gui/toolbox.c * app/gui/user-install-dialog.c * app/tools/gimpbrightnesscontrasttool.c * app/tools/gimpbycolorselecttool.c * app/tools/gimpcolorbalancetool.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpcurvestool.c * app/tools/gimphuesaturationtool.c * app/tools/gimpinktool.c * app/tools/gimplevelstool.c * app/tools/gimpposterizetool.c * app/tools/gimprotatetool.c * app/tools/gimpthresholdtool.c * app/tools/paint_options.c * app/tools/selection_options.c * app/widgets/gimpchannellistview.c * app/widgets/gimpcolorpanel.c * app/widgets/gimpcomponentlistitem.c * app/widgets/gimpconstrainedhwrapbox.c * app/widgets/gimpcontainergridview.c * app/widgets/gimpcontainerlistview.c * app/widgets/gimpcontainermenuimpl.c * app/widgets/gimpdialogfactory.c * app/widgets/gimpdnd.c * app/widgets/gimpdock.c * app/widgets/gimpdockbook.c * app/widgets/gimpdrawablelistitem.c * app/widgets/gimpdrawablelistview.c * app/widgets/gimpfontselection-dialog.c * app/widgets/gimphistogramview.c * app/widgets/gimpitemfactory.c * app/widgets/gimplayerlistitem.c * app/widgets/gimplistitem.[ch] * app/widgets/gimpmenuitem.c * app/widgets/gimppreview.[ch] * app/widgets/gtkhwrapbox.c * app/widgets/gtkvwrapbox.c * app/widgets/gtkwrapbox.c * libgimp/gimpbrushmenu.c * libgimp/gimpexport.c * libgimp/gimpgradientmenu.c * libgimp/gimpmenu.c * libgimp/gimppatternmenu.c * libgimpwidgets/gimpbutton.c * libgimpwidgets/gimpchainbutton.[ch] * libgimpwidgets/gimpcolorarea.h * libgimpwidgets/gimpcolorbutton.c * libgimpwidgets/gimpfileselection.c * libgimpwidgets/gimphelpui.c * libgimpwidgets/gimpoffsetarea.c * libgimpwidgets/gimppatheditor.c * libgimpwidgets/gimppixmap.h * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpstock.[ch] * libgimpwidgets/gimpwidgets.h * plug-ins/FractalExplorer/Dialogs.c * plug-ins/FractalExplorer/Events.c * plug-ins/FractalExplorer/FractalExplorer.c * plug-ins/Lighting/lighting_ui.c * plug-ins/MapObject/mapobject_ui.c * plug-ins/bmp/bmpwrite.c * plug-ins/dbbrowser/dbbrowser_utils.c * plug-ins/fits/fits.c * plug-ins/flame/flame.c * plug-ins/fp/fp_gtk.c * plug-ins/fp/fp_misc.c * plug-ins/gfig/gfig.c * plug-ins/gflare/gflare.c * plug-ins/gfli/gfli.c * plug-ins/gimpressionist/*.c * plug-ins/imagemap/*.[ch] * plug-ins/maze/maze_face.c * plug-ins/mosaic/mosaic.c * plug-ins/pagecurl/pagecurl.c * plug-ins/print/print_gimp.h * plug-ins/rcm/rcm_callback.c * plug-ins/rcm/rcm_dialog.c * plug-ins/rcm/rcm_misc.c * plug-ins/script-fu/script-fu-console.c * plug-ins/script-fu/script-fu-scripts.c * plug-ins/script-fu/script-fu-server.c * plug-ins/sel2path/sel2path.c * plug-ins/sel2path/sel2path_adv_dialog.c * plug-ins/sgi/sgi.c * plug-ins/webbrowser/webbrowser.c * plug-ins/xjt/xjt.c * plug-ins/common/[A-n]*.c: compile with GTK_DISABLE_DEPRECATED defined. Not everything is fully ported yet, had to #undef GTK_DISABLE_DEPRECATED in many places and added #warnings when doing so. * pixmaps/Makefile.am * pixmaps/chain.xpm: removed. * themes/Default/Makefile.am * themes/Default/images/Makefile.am * themes/Default/images/stock-button-hchain-broken.png * themes/Default/images/stock-button-hchain.png * themes/Default/images/stock-button-vchain-broken.png * themes/Default/images/stock-button-vchain.png: new stock icons.
2001-12-29 21:26:29 +08:00
factory);
2011-02-21 18:51:47 +08:00
object_unref(obj);
2011-02-21 22:45:26 +08:00
preview_unset_tmp_obj (obj);
preview_redraw ();
2011-02-21 18:51:47 +08:00
obj = NULL;
main_clear_dimension();
}
2011-02-21 22:45:26 +08:00
return TRUE;
1999-09-07 08:03:20 +08:00
}
} else {
if (event->button == 1) {
2011-02-21 18:51:47 +08:00
factory = ((ObjectFactory_t*(*)(guint)) data)(event->state);
obj = object_factory_create_object(factory, x, y);
2011-02-21 22:45:26 +08:00
preview_set_tmp_obj (obj);
2011-02-21 18:51:47 +08:00
g_signal_connect(widget, "motion-notify-event",
G_CALLBACK(button_motion), factory);
1999-09-07 08:03:20 +08:00
}
}
return FALSE;
1999-09-07 08:03:20 +08:00
}
ObjectList_t*
make_object_list(void)
{
return g_new0 (ObjectList_t, 1);
1999-09-07 08:03:20 +08:00
}
void
object_list_destruct(ObjectList_t *list)
{
object_list_remove_all(list);
g_free(list->list);
}
ObjectList_t*
object_list_append_list(ObjectList_t *des, ObjectList_t *src)
{
GList *p;
if (!src)
return des;
1999-09-07 08:03:20 +08:00
for (p = src->list; p; p = p->next)
object_list_append(des, object_clone((Object_t*) p->data));
object_list_set_changed(des, TRUE);
1999-09-07 08:03:20 +08:00
return des;
}
ObjectList_t*
object_list_copy(ObjectList_t *des, ObjectList_t *src)
{
if (des)
object_list_remove_all(des);
else
des = make_object_list();
return object_list_append_list(des, src);
}
void
1999-09-07 08:03:20 +08:00
object_list_append(ObjectList_t *list, Object_t *object)
{
object->list = list;
list->list = g_list_append(list->list, (gpointer) object);
object_list_set_changed(list, TRUE);
object_list_callback_call(&list->add_cb, object);
}
void
1999-09-07 08:03:20 +08:00
object_list_prepend(ObjectList_t *list, Object_t *object)
{
object->list = list;
list->list = g_list_prepend(list->list, (gpointer) object);
object_list_set_changed(list, TRUE);
object_list_callback_call(&list->add_cb, object);
}
void
1999-09-07 08:03:20 +08:00
object_list_insert(ObjectList_t *list, gint position, Object_t *object)
{
object->list = list;
list->list = g_list_insert(list->list, (gpointer) object, position);
object_list_set_changed(list, TRUE);
object_list_callback_call(&list->add_cb, object);
}
void
1999-09-07 08:03:20 +08:00
object_list_remove(ObjectList_t *list, Object_t *object)
{
list->list = g_list_remove(list->list, (gpointer) object);
object_list_set_changed(list, TRUE);
object_list_callback_call(&list->remove_cb, object);
object_unref(object);
}
void
1999-09-07 08:03:20 +08:00
object_list_remove_link(ObjectList_t *list, GList *link)
{
list->list = g_list_remove_link(list->list, link);
object_list_set_changed(list, TRUE);
object_list_callback_call(&list->remove_cb, (Object_t*) link->data);
}
void
1999-09-07 08:03:20 +08:00
object_list_update(ObjectList_t *list, Object_t *object)
{
object_list_callback_call(&list->update_cb, object);
}
void
2011-02-21 22:45:26 +08:00
object_list_draw(ObjectList_t *list, cairo_t *cr)
1999-09-07 08:03:20 +08:00
{
GList *p;
for (p = list->list; p; p = p->next)
2011-02-21 22:45:26 +08:00
object_draw((Object_t*) p->data, cr);
1999-09-07 08:03:20 +08:00
}
1999-10-25 04:57:17 +08:00
void
2011-02-21 22:45:26 +08:00
object_list_draw_selected(ObjectList_t *list, cairo_t *cr)
1999-10-25 04:57:17 +08:00
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected)
2011-02-21 22:45:26 +08:00
object_draw(obj, cr);
1999-10-25 04:57:17 +08:00
}
}
1999-09-07 08:03:20 +08:00
Object_t*
object_list_find(ObjectList_t *list, gint x, gint y)
{
Object_t *found = NULL;
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->class->point_is_on(obj, x, y))
2011-02-21 18:51:47 +08:00
found = obj;
1999-09-07 08:03:20 +08:00
}
return found;
}
Object_t*
object_list_near_sash(ObjectList_t *list, gint x, gint y,
2011-02-21 18:51:47 +08:00
MoveSashFunc_t *sash_func)
1999-09-07 08:03:20 +08:00
{
Object_t *found = NULL;
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected) {
2011-02-21 18:51:47 +08:00
MoveSashFunc_t func = obj->class->near_sash(obj, x, y);
if (func) {
found = obj;
*sash_func = func;
}
1999-09-07 08:03:20 +08:00
}
}
return found;
}
void
object_list_remove_all(ObjectList_t *list)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
object_list_callback_call(&list->remove_cb, obj);
object_unref(obj);
}
g_list_free(list->list);
list->list = NULL;
object_list_set_changed(list, TRUE);
}
void
clear_paste_buffer(void)
{
if (_paste_buffer)
object_list_remove_all(_paste_buffer);
else
_paste_buffer = make_object_list();
}
ObjectList_t*
get_paste_buffer(void)
{
return _paste_buffer;
}
gint
object_list_cut(ObjectList_t *list)
{
GList *p, *q;
gint count = 0;
clear_paste_buffer();
for (p = list->list; p; p = q) {
Object_t *obj = (Object_t*) p->data;
q = p->next;
if (obj->selected) {
2011-02-21 18:51:47 +08:00
if (obj->locked) {
do_object_locked_dialog();
} else {
object_list_append(_paste_buffer, obj);
object_list_remove_link(list, p);
count++;
}
1999-09-07 08:03:20 +08:00
}
}
object_list_set_changed(list, (count) ? TRUE : FALSE);
return count;
}
void
1999-09-07 08:03:20 +08:00
object_list_copy_to_paste_buffer(ObjectList_t *list)
{
GList *p;
clear_paste_buffer();
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected)
2011-02-21 18:51:47 +08:00
object_list_append(_paste_buffer, object_clone(obj));
1999-09-07 08:03:20 +08:00
}
}
void
1999-09-07 08:03:20 +08:00
object_list_paste(ObjectList_t *list)
{
object_list_append_list(list, _paste_buffer);
}
void
object_list_delete_selected(ObjectList_t *list)
{
GList *p, *q;
for (p = list->list; p; p = q) {
Object_t *obj = (Object_t*) p->data;
q = p->next;
if (obj->selected) {
2011-02-21 18:51:47 +08:00
if (obj->locked) {
do_object_locked_dialog();
} else {
object_list_remove_link(list, p);
object_unref(obj);
}
1999-09-07 08:03:20 +08:00
}
}
}
void
1999-09-07 08:03:20 +08:00
object_list_edit_selected(ObjectList_t *list)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected) {
2011-02-21 18:51:47 +08:00
object_edit(obj, TRUE);
break;
1999-09-07 08:03:20 +08:00
}
}
}
gint
object_list_select_all(ObjectList_t *list)
{
GList *p;
gint count = 0;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (!obj->selected) {
2011-02-21 18:51:47 +08:00
object_select(obj);
count++;
1999-09-07 08:03:20 +08:00
}
}
return count;
}
void
1999-10-25 04:57:17 +08:00
object_list_select_next(ObjectList_t *list)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected) {
2011-02-21 18:51:47 +08:00
object_unselect(obj);
p = (p->next) ? p->next : list->list;
object_select((Object_t*) p->data);
for (p = p->next; p; p = p->next) {
obj = (Object_t*) p->data;
if (obj->selected)
object_unselect(obj);
}
break;
1999-10-25 04:57:17 +08:00
}
}
}
void object_list_select_prev(ObjectList_t *list)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected) {
2011-02-21 18:51:47 +08:00
GList *q = (p->prev) ? p->prev : g_list_last(list->list);
for (; p; p = p->next) {
obj = (Object_t*) p->data;
if (obj->selected)
object_unselect(obj);
}
object_select((Object_t*) q->data);
break;
1999-10-25 04:57:17 +08:00
}
}
}
gint
1999-09-07 08:03:20 +08:00
object_list_select_region(ObjectList_t *list, gint x, gint y, gint width,
2011-02-21 18:51:47 +08:00
gint height)
1999-09-07 08:03:20 +08:00
{
GList *p;
gint count = 0;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
gint obj_x, obj_y, obj_width, obj_height;
object_get_dimensions(obj, &obj_x, &obj_y, &obj_width, &obj_height);
if (obj_x >= x && obj_x + obj_width <= x + width &&
2011-02-21 18:51:47 +08:00
obj_y >= y && obj_y + obj_height <= y + height) {
object_select(obj);
count++;
1999-09-07 08:03:20 +08:00
}
}
return count;
}
gint
object_list_deselect_all(ObjectList_t *list, Object_t *exception)
{
GList *p;
gint count = 0;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected && obj != exception) {
2011-02-21 18:51:47 +08:00
object_unselect(obj);
count++;
1999-09-07 08:03:20 +08:00
}
}
return count;
}
gint
1999-09-07 08:03:20 +08:00
object_list_nr_selected(ObjectList_t *list)
{
GList *p;
gint count = 0;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected)
2011-02-21 18:51:47 +08:00
count++;
1999-09-07 08:03:20 +08:00
}
return count;
}
void
1999-09-07 08:03:20 +08:00
object_list_resize(ObjectList_t *list, gint percentage_x, gint percentage_y)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
object_resize(obj, percentage_x, percentage_y);
}
}
static void
object_list_swap_prev(ObjectList_t *list, GList *p)
{
gpointer swap = p->data;
p->data = p->prev->data;
p->prev->data = swap;
object_list_callback_call(&list->move_cb, (Object_t*) p->data);
object_list_callback_call(&list->move_cb, (Object_t*) p->prev->data);
}
static void
object_list_swap_next(ObjectList_t *list, GList *p)
{
gpointer swap = p->data;
p->data = p->next->data;
p->next->data = swap;
object_list_callback_call(&list->move_cb, (Object_t*) p->data);
object_list_callback_call(&list->move_cb, (Object_t*) p->next->data);
}
void
1999-10-25 04:57:17 +08:00
object_list_move_selected(ObjectList_t *list, gint dx, gint dy)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected)
2011-02-21 18:51:47 +08:00
object_move(obj, dx, dy);
1999-10-25 04:57:17 +08:00
}
}
void
1999-09-07 08:03:20 +08:00
object_list_move_up(ObjectList_t *list, Object_t *obj)
{
GList *p = g_list_find(list->list, (gpointer) obj);
object_list_swap_prev(list, p);
}
void
1999-09-07 08:03:20 +08:00
object_list_move_down(ObjectList_t *list, Object_t *obj)
{
GList *p = g_list_find(list->list, (gpointer) obj);
object_list_swap_next(list, p);
}
void
object_list_move_selected_up(ObjectList_t *list)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected && p->prev)
2011-02-21 18:51:47 +08:00
object_list_swap_prev(list, p);
1999-09-07 08:03:20 +08:00
}
}
void
object_list_move_selected_down(ObjectList_t *list)
{
GList *p;
for (p = g_list_last(list->list); p; p = p->prev) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected && p->next)
2011-02-21 18:51:47 +08:00
object_list_swap_next(list, p);
1999-09-07 08:03:20 +08:00
}
}
void
1999-09-07 08:03:20 +08:00
object_list_move_to_front(ObjectList_t *list)
{
GList *p, *q;
guint length = g_list_length(list->list);
for (p = list->list; length; p = q, length--) {
Object_t *obj = (Object_t*) p->data;
q = p->next;
if (obj->selected) {
2011-02-21 18:51:47 +08:00
object_list_remove_link(list, p);
object_list_append(list, obj);
1999-09-07 08:03:20 +08:00
}
}
}
void
1999-09-07 08:03:20 +08:00
object_list_send_to_back(ObjectList_t *list)
{
GList *p, *q;
guint length = g_list_length(list->list);
for (p = list->list; length; p = q, length--) {
Object_t *obj = (Object_t*) p->data;
q = p->next;
if (obj->selected) {
2011-02-21 18:51:47 +08:00
object_list_remove_link(list, p);
object_list_prepend(list, obj);
1999-09-07 08:03:20 +08:00
}
}
}
void
object_list_move_sash_selected(ObjectList_t *list, gint dx, gint dy)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (obj->selected)
2011-02-21 18:51:47 +08:00
object_move_sash(obj, dx, dy);
}
}
static void
write_xml_attrib(const gchar *attrib, const gchar *value,
2011-02-21 18:51:47 +08:00
const gchar *default_text, gpointer param,
OutputFunc_t output)
{
if (*value) {
gchar *escaped_value = g_markup_escape_text(value, -1);
output(param, " %s=\"%s\"", attrib, escaped_value);
g_free(escaped_value);
} else if (*default_text) {
output(param, " %s", default_text);
}
}
1999-09-07 08:03:20 +08:00
void
object_list_write_csim (ObjectList_t *list,
gpointer param,
OutputFunc_t output)
1999-09-07 08:03:20 +08:00
{
GList *p;
for (p = list->list; p; p = p->next)
{
1999-09-07 08:03:20 +08:00
Object_t *obj = (Object_t*) p->data;
output (param, "<area shape=");
obj->class->write_csim (obj, param, output);
write_xml_attrib ("alt", obj->comment, "", param, output);
write_xml_attrib ("target", obj->target, "", param, output);
write_xml_attrib ("accesskey", obj->accesskey, "", param, output);
write_xml_attrib ("tabindex", obj->tabindex, "", param, output);
write_xml_attrib ("onmouseover", obj->mouse_over, "", param, output);
write_xml_attrib ("onmouseout", obj->mouse_out, "", param, output);
write_xml_attrib ("onfocus", obj->focus, "", param, output);
write_xml_attrib ("onblur", obj->blur, "", param, output);
write_xml_attrib ("onclick", obj->click, "", param, output);
write_xml_attrib ("href", obj->url, " nohref=\"nohref\"", param, output);
output (param," />\n");
}
1999-09-07 08:03:20 +08:00
}
void
object_list_write_cern(ObjectList_t *list, gpointer param, OutputFunc_t output)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
obj->class->write_cern(obj, param, output);
output(param, " %s\n", obj->url);
}
}
void
object_list_write_ncsa(ObjectList_t *list, gpointer param, OutputFunc_t output)
{
GList *p;
for (p = list->list; p; p = p->next) {
Object_t *obj = (Object_t*) p->data;
if (*obj->comment)
2011-02-21 18:51:47 +08:00
output(param, "# %s\n", obj->comment);
1999-09-07 08:03:20 +08:00
obj->class->write_ncsa(obj, param, output);
output(param, "\n");
}
}