aboutsummaryrefslogtreecommitdiff
path: root/generic/Tabular.c
diff options
context:
space:
mode:
authorlecoanet2000-01-12 15:49:33 +0000
committerlecoanet2000-01-12 15:49:33 +0000
commit792ccd4dcce0c63456f2aceabe15ae8f9ce50d0c (patch)
treeecc343e1184249df152d5c496f6b851245c3043d /generic/Tabular.c
parent7d1e2a9f479f792df7589862b01f8e95af172480 (diff)
downloadtkzinc-792ccd4dcce0c63456f2aceabe15ae8f9ce50d0c.zip
tkzinc-792ccd4dcce0c63456f2aceabe15ae8f9ce50d0c.tar.gz
tkzinc-792ccd4dcce0c63456f2aceabe15ae8f9ce50d0c.tar.bz2
tkzinc-792ccd4dcce0c63456f2aceabe15ae8f9ce50d0c.tar.xz
Adaptation des ent�tes.
Le d�faut pour composerotation et composescale est 'vrai'. Si le nombre de champs n'�tait pas pr�cis�, ce n'�tait pas d�tect�. Corrig�. Am�nagement de la m�thode Coords.
Diffstat (limited to 'generic/Tabular.c')
-rw-r--r--generic/Tabular.c524
1 files changed, 524 insertions, 0 deletions
diff --git a/generic/Tabular.c b/generic/Tabular.c
new file mode 100644
index 0000000..9f71c56
--- /dev/null
+++ b/generic/Tabular.c
@@ -0,0 +1,524 @@
+/*
+ * Tabular.c -- Implementation of Tabular item.
+ *
+ * Authors : Patrick Lecoanet.
+ * Creation date :
+ *
+ * $Id$
+ */
+
+/*
+ * Copyright (c) 1993 - 1999 CENA, Patrick Lecoanet --
+ *
+ * This code is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This code 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this code; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+
+#include "Types.h"
+#include "WidgetInfo.h"
+#include "Item.h"
+#include "Geo.h"
+
+
+static const char rcsid[] = "$Id$";
+static const char compile_id[]="$Compile: " __FILE__ " " __DATE__ " " __TIME__ " $";
+
+
+/*
+ **********************************************************************************
+ *
+ * Specific Tabular item record
+ *
+ **********************************************************************************
+ */
+typedef struct _TabularItemStruct {
+ ItemStruct header;
+
+ /* Public data */
+ RadarPoint pos;
+ RadarAnchor anchor;
+ RadarAnchor connection_anchor;
+
+ /* Private data */
+ FieldSetStruct field_set;
+} TabularItemStruct, *TabularItem;
+
+
+static RadarAttrConfig tabular_attrs[] = {
+ { RADAR_CONFIG_ANCHOR, "-anchor", NULL,
+ Tk_Offset(TabularItemStruct, anchor), 0, RADAR_COORDS_FLAG, False },
+ { RADAR_CONFIG_BOOL, "-composerotation", NULL,
+ Tk_Offset(TabularItemStruct, header.flags), COMPOSE_ROTATION_BIT,
+ RADAR_COORDS_FLAG, False },
+ { RADAR_CONFIG_BOOL, "-composescale", NULL,
+ Tk_Offset(TabularItemStruct, header.flags), COMPOSE_SCALE_BIT,
+ RADAR_COORDS_FLAG, False },
+ { RADAR_CONFIG_ITEM, "-connecteditem", NULL,
+ Tk_Offset(TabularItemStruct, header.connected_item), 0,
+ RADAR_COORDS_FLAG|RADAR_ITEM_FLAG, False },
+ { RADAR_CONFIG_ANCHOR, "-connectionanchor", NULL,
+ Tk_Offset(TabularItemStruct, connection_anchor), 0, RADAR_COORDS_FLAG, False },
+ { RADAR_CONFIG_LABEL_FORMAT, "-labelformat", NULL,
+ Tk_Offset(TabularItemStruct, field_set.label_format), 0,
+ RADAR_COORDS_FLAG|RADAR_CLFC_FLAG, False },
+ { RADAR_CONFIG_UINT, "-numfields", NULL,
+ Tk_Offset(TabularItemStruct, field_set.num_fields), 0, 0, True },
+ { RADAR_CONFIG_POINT, "-position", NULL,
+ Tk_Offset(TabularItemStruct, pos), 0, RADAR_COORDS_FLAG, False},
+ { RADAR_CONFIG_PRI, "-priority", NULL,
+ Tk_Offset(TabularItemStruct, header.priority), 0,
+ RADAR_DRAW_FLAG|RADAR_REPICK_FLAG, False },
+ { RADAR_CONFIG_BOOL, "-sensitive", NULL,
+ Tk_Offset(TabularItemStruct, header.flags), SENSITIVE_BIT,
+ RADAR_REPICK_FLAG, False },
+ { RADAR_CONFIG_TAGS, "-tags", NULL,
+ Tk_Offset(TabularItemStruct, header.tags), 0, 0, False },
+ { RADAR_CONFIG_BOOL, "-visible", NULL,
+ Tk_Offset(TabularItemStruct, header.flags), VISIBLE_BIT,
+ RADAR_DRAW_FLAG|RADAR_REPICK_FLAG|RADAR_VIS_FLAG, False },
+
+ { RADAR_CONFIG_END, NULL, NULL, 0, 0, 0 }
+};
+
+
+/*
+ **********************************************************************************
+ *
+ * Init --
+ *
+ **********************************************************************************
+ */
+static int
+Init(Item item,
+ int *argc,
+ Arg **args)
+{
+ WidgetInfo *wi = item->wi;
+ TabularItem tab = (TabularItem) item;
+ FieldSet field_set = &tab->field_set;
+
+ item->priority = DEFAULT_TABULAR_PRIORITY;
+
+ SET(item->flags, VISIBLE_BIT);
+ SET(item->flags, SENSITIVE_BIT);
+ SET(item->flags, COMPOSE_SCALE_BIT);
+ SET(item->flags, COMPOSE_ROTATION_BIT);
+
+ tab->anchor = RadarAnchorNW;
+ tab->connection_anchor = RadarAnchorSW;
+ tab->pos.x = tab->pos.y = 0.0;
+
+ field_set->wi = wi;
+ field_set->label_format = NULL;
+
+ /*
+ * Then try to see if some fields are needed.
+ */
+ if ((*argc > 0) && (LangString((*args)[0])[0] != '-') &&
+ (Tcl_GetInt(wi->interp, (args[0])[0], &field_set->num_fields) != RADAR_ERROR)) {
+ *args += 1;
+ *argc -= 1;
+ ITEM_P.InitFields(field_set);
+ }
+ else {
+ Tcl_AppendResult(wi->interp, " number of fields expected", NULL);
+ return RADAR_ERROR;
+ }
+
+ item->part_sensitive = 0;
+
+ return RADAR_OK;
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * Clone --
+ *
+ **********************************************************************************
+ */
+static void
+Clone(Item item)
+{
+ ITEM_P.CloneFields(&((TabularItem) item)->field_set);
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * Destroy --
+ *
+ **********************************************************************************
+ */
+static void
+Destroy(Item item)
+{
+ ITEM_P.FreeFields(&((TabularItem) item)->field_set);
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * Configure --
+ *
+ **********************************************************************************
+ */
+static int
+Configure(Item item,
+ int argc,
+ RadarAttrList argv,
+ int *flags)
+{
+ Item old_connected;
+
+ old_connected = item->connected_item;
+ if (ITEM_P.ConfigureAttributes((char *) item, -1, argc, argv, flags) == RADAR_ERROR) {
+ return RADAR_ERROR;
+ }
+ if (ISSET(*flags, RADAR_ITEM_FLAG)) {
+ /*
+ * If the new connected item is not appropriate back up
+ * to the old one.
+ */
+ if ((item->connected_item == RADAR_NO_ITEM) ||
+ (item->connected_item->class->has_anchors &&
+ (item->parent == item->connected_item->parent))) {
+ ITEM.UpdateItemDependency(item, old_connected);
+ }
+ else {
+ item->connected_item = old_connected;
+ }
+ }
+
+ return RADAR_OK;
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * Query --
+ *
+ **********************************************************************************
+ */
+static int
+Query(Item item,
+ int argc,
+ RadarAttrList argv)
+{
+ if (ITEM_P.QueryAttribute((char *) item, -1, argv[0]) == RADAR_ERROR) {
+ return RADAR_ERROR;
+ }
+
+ return RADAR_OK;
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * ComputeCoordinates --
+ *
+ **********************************************************************************
+ */
+static void
+ComputeCoordinates(Item item,
+ RadarBool force)
+{
+ TabularItem tab = (TabularItem) item;
+ WidgetInfo *wi = item->wi;
+ FieldSet field_set = &tab->field_set;
+ RadarDim width, height;
+
+ ResetBBox(&item->item_bounding_box);
+ if (field_set->label_format) {
+ ITEM_P.GetLabelBBox(field_set, &width, &height);
+
+ /*
+ * The connected item support anchors, this is checked by
+ * configure.
+ */
+ if (item->connected_item != RADAR_NO_ITEM) {
+ item->connected_item->class->GetAnchor(item->connected_item,
+ tab->connection_anchor,
+ &field_set->label_pos);
+ }
+ else {
+ RadarTransformPoint(wi->current_transfo, &tab->pos,
+ &field_set->label_pos);
+ }
+
+ Anchor2Origin(&field_set->label_pos, width, height, tab->anchor,
+ &field_set->label_pos);
+
+ /*
+ * Setup the item bounding box.
+ */
+ item->item_bounding_box.orig = field_set->label_pos;
+ item->item_bounding_box.corner.x = field_set->label_pos.x + width;
+ item->item_bounding_box.corner.y = field_set->label_pos.y + height;
+
+ /*
+ * Update connected items.
+ */
+ SET(item->flags, UPDATE_DEPENDENT_BIT);
+ }
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * ToArea --
+ * Tell if the object is entirely outside (-1),
+ * entirely inside (1) or in between (0).
+ *
+ **********************************************************************************
+ */
+static int
+ToArea(Item item,
+ RadarBBox *area,
+ Tk_Uid tag_uid,
+ int enclosed,
+ RadarBool report)
+{
+ return ITEM_P.FieldsToArea(&((TabularItem) item)->field_set, area);
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * Draw --
+ *
+ **********************************************************************************
+ */
+static void
+Draw(Item item)
+{
+ ITEM_P.DrawFields(&((TabularItem) item)->field_set);
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * IsSensitive --
+ *
+ **********************************************************************************
+ */
+static RadarBool
+IsSensitive(Item item,
+ int item_part)
+{
+ if (ISCLEAR(item->flags, SENSITIVE_BIT) ||
+ !item->parent->class->IsSensitive(item->parent, RADAR_NO_PART)) {
+ return False;
+ }
+ return ITEM_P.IsFieldSensitive(&((TabularItem) item)->field_set, item_part);
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * Pick --
+ * We tell what our label tells.
+ *
+ **********************************************************************************
+ */
+static double
+Pick(Item item,
+ RadarPoint *p,
+ Item start_item,
+ int aperture,
+ Item *a_item,
+ int *part)
+{
+ int best_part;
+ double dist;
+
+ dist = ITEM_P.FieldsPick(&((TabularItem) item)->field_set, p, &best_part);
+ /* printf("tabular %d reporting part %d, distance %lf\n",
+ item->id, best_part, dist); */
+
+ *part = best_part;
+ return dist;
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * PostScript --
+ *
+ **********************************************************************************
+ */
+static void
+PostScript(Item item,
+ PostScriptInfo ps_info)
+{
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * GetFieldSet --
+ *
+ **********************************************************************************
+ */
+static FieldSet
+GetFieldSet(Item item)
+{
+ return &((TabularItem) item)->field_set;
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * GetAnchor --
+ *
+ **********************************************************************************
+ */
+static void
+GetAnchor(Item item,
+ RadarAnchor anchor,
+ RadarPoint *p)
+{
+ FieldSet field_set = &((TabularItem) item)->field_set;
+ RadarDim width, height;
+
+ if (field_set->label_format) {
+ ITEM_P.GetLabelBBox(field_set, &width, &height);
+ Origin2Anchor(&field_set->label_pos, width, height, anchor, p);
+ }
+ else {
+ p->x = p->y = 0.0;
+ }
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * GetClipVertices --
+ * Get the clipping shape.
+ *
+ **********************************************************************************
+ */
+static RadarBool
+GetClipVertices(Item item,
+ RadarPoint **points,
+ int *num_points)
+{
+ FieldSet field_set = &((TabularItem) item)->field_set;
+ RadarDim width, height;
+
+ *points = NULL;
+ *num_points = 0;
+
+ if (field_set->label_format) {
+ ITEM_P.GetLabelBBox(field_set, &width, &height);
+ RadarListAssertSize(item->wi->work_pts, 2);
+ *points = (RadarPoint *) RadarListArray(item->wi->work_pts);
+ *num_points = 2;
+ (*points)[0] = field_set->label_pos;
+ (*points)[1].x = field_set->label_pos.x + width;
+ (*points)[1].y = field_set->label_pos.y + height;
+ }
+
+ return True;
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * Coords --
+ * Return or edit the item origin. This doesn't take care of
+ * the possible attachment. The change will be effective at the
+ * end of the attachment.
+ *
+ **********************************************************************************
+ */
+static int
+Coords(Item item,
+ int index,
+ int cmd,
+ RadarPoint **pts,
+ int *num_pts)
+{
+ TabularItem tabular = (TabularItem) item;
+
+ if ((cmd == COORDS_ADD) || (cmd == COORDS_ADD_LAST) || (cmd == COORDS_REMOVE)) {
+ Tcl_AppendResult(item->wi->interp,
+ " tabulars can't add or remove vertices", NULL);
+ return RADAR_ERROR;
+ }
+ else if ((cmd == COORDS_REPLACE) || (cmd == COORDS_REPLACE_ALL)) {
+ if (*num_pts == 0) {
+ Tcl_AppendResult(item->wi->interp,
+ " coords command need 1 point on tabulars", NULL);
+ return RADAR_ERROR;
+ }
+ tabular->pos = (*pts)[0];
+ ITEM.Invalidate(item, RADAR_COORDS_FLAG);
+ }
+ else if ((cmd == COORDS_READ) || (cmd == COORDS_READ_ALL)) {
+ *num_pts = 1;
+ *pts = &tabular->pos;
+ }
+ return RADAR_OK;
+}
+
+
+/*
+ **********************************************************************************
+ *
+ * Exported functions structs --
+ *
+ **********************************************************************************
+ */
+static ItemClassStruct TABULAR_ITEM_CLASS = {
+ sizeof(TabularItemStruct),
+ True,
+ False,
+ True,
+ "tabular",
+ tabular_attrs,
+ Init,
+ Clone,
+ Destroy,
+ Configure,
+ Query,
+ GetFieldSet,
+ GetAnchor,
+ GetClipVertices,
+ Coords,
+ ComputeCoordinates,
+ ToArea,
+ Draw,
+ IsSensitive,
+ Pick,
+ PostScript
+};
+
+RadarItemClassId RadarTabular = (RadarItemClassId) &TABULAR_ITEM_CLASS;