rimmed pushed a commit to branch master.

http://git.enlightenment.org/tools/eflete.git/commit/?id=b96b6c0429c337136f22aee02bc6217917dd759a

commit b96b6c0429c337136f22aee02bc6217917dd759a
Author: Vyacheslav Reutskiy <v.reuts...@samsung.com>
Date:   Mon Nov 23 16:20:34 2015 +0200

    groupedit: improve table calculation
    
    Change-Id: Icfbc8a42582f53b23665f7aefce5e682dca9ccd9
---
 data/themes/default/widgets/layout.edc   |   2 -
 src/bin/ui/workspace/groupedit_calc.c    | 345 ++++++++++++-------------------
 src/bin/ui/workspace/groupedit_private.h |   2 +
 3 files changed, 133 insertions(+), 216 deletions(-)

diff --git a/data/themes/default/widgets/layout.edc 
b/data/themes/default/widgets/layout.edc
index 12329ed..8c317b5 100644
--- a/data/themes/default/widgets/layout.edc
+++ b/data/themes/default/widgets/layout.edc
@@ -3447,7 +3447,6 @@ group { name: "elm/layout/groupview/default";
          image: "bg_group.png" COMP;
          image: "bg_table.png" COMP;
          image: "bg_box.png" COMP;
-         image: "bg_part_item.png" COMP;
       }
       part { name: "bg";
          type: IMAGE;
@@ -3471,7 +3470,6 @@ group { name: "elm/layout/groupview/default";
          BG(group,      bg_group.png)
          BG(table,      bg_table.png)
          BG(box,        bg_box.png)
-         BG(part_item,  bg_part_item.png)
 #undef BG
       }
       part { name: "border";
diff --git a/src/bin/ui/workspace/groupedit_calc.c 
b/src/bin/ui/workspace/groupedit_calc.c
index 36559f6..0cdd56a 100644
--- a/src/bin/ui/workspace/groupedit_calc.c
+++ b/src/bin/ui/workspace/groupedit_calc.c
@@ -537,6 +537,114 @@ _part_select(void *data,
                                   (void *)gp->part);
 }
 
+static void
+_part_table_add(Ws_Groupedit_Smart_Data *sd, Groupedit_Part *gp)
+{
+
+   Eina_List *l;
+   Eina_Stringshare *str;
+   int span_c, span_r, col, row, i, j;
+   const Evas_Object *table;
+
+   assert(gp->container == NULL);
+
+   gp->container = evas_object_table_add(sd->e);
+   elm_box_pack_end(gp->draw, gp->container);
+   evas_object_show(gp->container);
+
+   table = edje_object_part_object_get(sd->group->edit_object, gp->part->name);
+   evas_object_table_col_row_size_get(table, &col, &row);
+   fprintf(stdout, "%5d %5d\n", col, row);
+   gp->items_draw = (Eina_Stringshare ***)mem_calloc(1, 
sizeof(Eina_Stringshare **) * col);
+   for (i = 0; i < col; i++)
+     gp->items_draw[i] = (Eina_Stringshare **)mem_calloc(1, 
sizeof(Eina_Stringshare *) * row);
+   fprintf(stdout, "groupedit %p\n", gp->part->items);
+   EINA_LIST_FOREACH(gp->part->items, l, str)
+     {
+        col = edje_edit_part_item_position_col_get(sd->group->edit_object, 
gp->part->name, str);
+        row = edje_edit_part_item_position_row_get(sd->group->edit_object, 
gp->part->name, str);
+        span_c = edje_edit_part_item_span_col_get(sd->group->edit_object, 
gp->part->name, str);
+        span_r = edje_edit_part_item_span_row_get(sd->group->edit_object, 
gp->part->name, str);
+
+        for (i = col; i < (col + span_c); i++)
+          {
+             for (j = row; j < (row + span_r); j++)
+               gp->items_draw[i][j] = (Eina_Stringshare *) -1;
+          }
+        gp->items_draw[col][row] = eina_stringshare_add(str);
+     }
+}
+
+static void
+_part_table_items_add(Ws_Groupedit_Smart_Data *sd, Groupedit_Part *gp)
+{
+   const Evas_Object *table;
+   Evas_Object *cell;
+   Eina_Stringshare *item_name, *item_source;
+   int w, h; /* Geometry values */
+   int min_w, max_w, min_h, max_h; /* Hints values */
+   int i, k, col, row;
+   unsigned char span_col, span_row;
+
+   assert(gp->container != NULL);
+
+   table = edje_object_part_object_get(sd->group->edit_object, gp->part->name);
+   evas_object_table_col_row_size_get(table, &col, &row);
+   evas_object_table_clear(gp->container, true);
+
+   for (i = 0; i < col; i++)
+     {
+        for (k = 0; k < row; k++)
+          {
+             if (gp->items_draw[i][k] == (Eina_Stringshare *) -1) continue;
+
+             span_col = 1;
+             span_row = 1;
+
+             if (gp->items_draw[i][k] != NULL)
+               {
+                  item_name = gp->items_draw[i][k];
+                  span_col = 
edje_edit_part_item_span_col_get(sd->group->edit_object, gp->part->name, 
item_name);
+                  span_row = 
edje_edit_part_item_span_row_get(sd->group->edit_object, gp->part->name, 
item_name);
+
+                  cell = edje_object_add(sd->e);
+                  item_source = 
edje_edit_part_item_source_get(sd->group->edit_object, gp->part->name, 
item_name);
+                  edje_object_file_set(cell, ap.project->dev, item_source);
+                  /* hide this object, it need only for calculate cell size */
+                  evas_object_hide(cell);
+
+                  min_w = 
edje_edit_part_item_min_w_get(sd->group->edit_object, gp->part->name, 
item_name);
+                  min_h = 
edje_edit_part_item_min_h_get(sd->group->edit_object, gp->part->name, 
item_name);
+
+                  // Calculation according to box/table item implementation in 
efl 1.13 at edje_load.c
+                  if ((min_w <= 0) && (min_h <= 0))
+                    {
+                       edje_object_size_min_get(cell, &w, &h);
+                       if ((w <= 0) && (h <= 0))
+                         edje_object_size_min_calc(cell, &w, &h);
+                    }
+                  if (((min_w <= 0) && (min_h <= 0)) && ((w > 0) || (h > 0)))
+                    evas_object_size_hint_min_set(cell, w, h);
+                  else
+                    evas_object_size_hint_min_set(cell, min_w, min_h);
+
+                  max_w = 
edje_edit_part_item_max_w_get(sd->group->edit_object, gp->part->name, 
item_name);
+                  max_h = 
edje_edit_part_item_max_h_get(sd->group->edit_object, gp->part->name, 
item_name);
+                  evas_object_size_hint_max_set(cell, max_w, max_h);
+                  evas_object_table_pack(gp->container, cell, i, k, span_col, 
span_row);
+               }
+             cell = elm_layout_add(sd->parent);
+             evas_object_size_hint_align_set(cell, EVAS_HINT_FILL, 
EVAS_HINT_FILL);
+
+             elm_layout_theme_set(cell, "layout", "groupview", "default");
+             evas_object_show(cell);
+             elm_object_signal_emit(cell, "border,part_item", "eflete");
+
+             evas_object_table_pack(gp->container, cell, i, k, span_col, 
span_row);
+          }
+     }
+}
+
 #define GP_GEOMETRY_SET \
    if (gp->bg) \
      { \
@@ -619,6 +727,10 @@ _part_recalc_apply(Ws_Groupedit_Smart_Data *sd,
    evas_object_size_hint_min_set(gp->layout, w, h);
    evas_object_size_hint_max_set(gp->layout, w, h);
 
+   evas_object_resize(gp->container, w, h);
+   evas_object_move(gp->container, (x * sd->zoom_factor + xe + offset_x),
+                                   (y * sd->zoom_factor + ye + offset_y));
+
    /* set the proxy part size */
    ro = edje_object_part_object_get(sd->group->edit_object, gp->part->name);
    evas_object_geometry_get(ro, NULL, NULL, &ro_w, &ro_h);
@@ -774,6 +886,7 @@ _parts_recalc(Ws_Groupedit_Smart_Data *sd)
               break;
            case EDJE_PART_TYPE_TABLE:
               _table_param_update(sd, gp);
+              _common_param_update(gp, sd->group->edit_object);
               _part_recalc_apply(sd, gp, offset_x, offset_y);
               break;
            case EDJE_PART_TYPE_BOX:
@@ -821,7 +934,6 @@ _part_draw_add(Ws_Groupedit_Smart_Data *sd, Part_ *part)
 
    gp = mem_calloc(1, sizeof(Groupedit_Part));
    gp->part = part;
-   //gp->border = NULL;
    gp->item = NULL;
 
 
@@ -839,10 +951,9 @@ _part_draw_add(Ws_Groupedit_Smart_Data *sd, Part_ *part)
 
 #define PART_VIEW_PROXY_SET() \
    gp->proxy_part = evas_object_image_filled_add(sd->e); \
-   elm_box_pack_start(gp->draw, gp->proxy_part); \
+   elm_box_pack_end(gp->draw, gp->proxy_part); \
    evas_object_show(gp->proxy_part); \
 
-
    switch (part->type)
      {
       case EDJE_PART_TYPE_RECTANGLE:
@@ -879,8 +990,11 @@ _part_draw_add(Ws_Groupedit_Smart_Data *sd, Part_ *part)
          elm_object_signal_emit(gp->layout, "border,group", "eflete");
          break;
       case EDJE_PART_TYPE_TABLE:
-         IMAGE_ADD_NEW(sd->obj, gp->bg, "bg", "table")
-         gp->draw = _part_container_add(sd, part, &(gp->items));
+         PART_VIEW_ADD()
+         PART_VIEW_PROXY_SET()
+         elm_object_signal_emit(gp->layout, "border,table", "eflete");
+         _part_table_add(sd, gp);
+         _part_table_items_add(sd, gp);
          break;
       case EDJE_PART_TYPE_BOX:
          IMAGE_ADD_NEW(sd->obj, gp->bg, "bg", "box")
@@ -1258,223 +1372,26 @@ _common_param_update(Groupedit_Part *gp, Evas_Object 
*edit_obj)
 static void
 _table_param_update(Ws_Groupedit_Smart_Data *sd, Groupedit_Part *gp)
 {
-   Groupedit_Item *ge_item = NULL, *spread_item = NULL;
-   Eina_List *l_items, *l_n_items;
-   Eina_Stringshare *part = gp->part->name;
-   Eina_Stringshare *item_source = NULL;
-
-   Evas_Object *child = NULL;
-   int w, h; /* Geometry values */
-   int min_w, max_w, prefer_w, min_h, max_h, prefer_h; /* Hints values */
-   int spread_col, spread_row; /* Position values */
-
-   short unsigned int pos_col = 0, pos_row = 0;
-   unsigned char span_col = 0, span_row = 0, homogeneous = 0;
-   Evas_Aspect_Control aspect = EVAS_ASPECT_CONTROL_NONE;
-   int aspect_x, aspect_y;
-   double align_x = 0, align_y = 0, weight_x = 0, weight_y = 0; /* Align 
object in cell */
-   int pad_l = 0, pad_r = 0, pad_t = 0, pad_b = 0;
-   int old_spread_row = 0, spread_pos_col = 0, spread_pos_row = 0;
-   int r = 0, g = 0, b = 0, a = 0;
-
-   /* fake_init - how much fake items, already created.
-    * fake_count - how much fake items needed for filling empty cells.
-    * fake_diff - deifference beetween fake_count and fake_init
-    */
-   int fake_init = 0, fake_count = 0, fake_diff = 0;
-   Eina_List *fake_l;
-   int i, k, col, row; /* counters for filling empty cells with fake items*/
+   double align_x = 0, align_y = 0;
+   int pad_x, pad_y;
+   unsigned char homogeneous;
 
    assert(sd != NULL);
    assert(gp != NULL);
 
-   TODO("get TABLE attributes from edje object, after implementing functions"
-        "in edje_edit libs. Until that time will be used default values.")
-   PART_STATE_GET(sd->group->edit_object, part)
-   homogeneous = edje_edit_state_table_homogeneous_get(sd->group->edit_object, 
part, state, value);
-   evas_object_table_homogeneous_set(gp->draw, homogeneous);
+   PART_STATE_GET(sd->group->edit_object, gp->part->name)
+   homogeneous = edje_edit_state_table_homogeneous_get(sd->group->edit_object, 
gp->part->name, state, value);
+   evas_object_table_homogeneous_set(gp->container, homogeneous);
 
-   align_x = edje_edit_state_container_align_x_get(sd->group->edit_object, 
part, state, value);
-   align_y = edje_edit_state_container_align_y_get(sd->group->edit_object, 
part, state, value);
-   evas_object_table_align_set(gp->draw, align_x, align_y);
+   align_x = edje_edit_state_container_align_x_get(sd->group->edit_object, 
gp->part->name, state, value);
+   align_y = edje_edit_state_container_align_y_get(sd->group->edit_object, 
gp->part->name, state, value);
+   evas_object_table_align_set(gp->container, align_x, align_y);
 
-   pad_l = edje_edit_state_container_padding_x_get(sd->group->edit_object, 
part, state, value);
-   pad_r = edje_edit_state_container_padding_y_get(sd->group->edit_object, 
part, state, value);
-   evas_object_table_padding_set(gp->draw, pad_l, pad_r);
+   pad_x = edje_edit_state_container_padding_x_get(sd->group->edit_object, 
gp->part->name, state, value);
+   pad_y = edje_edit_state_container_padding_y_get(sd->group->edit_object, 
gp->part->name, state, value);
+   evas_object_table_padding_set(gp->container, pad_x, pad_y);
 
-   _colors_get(gp, sd->group->edit_object, state, value, &r, &g, &b, &a, NULL, 
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
    PART_STATE_FREE
-
-   /* Unpack all fake items, before pack real */
-   fake_init = eina_list_count(gp->fake_items);
-   EINA_LIST_FOREACH(gp->fake_items, fake_l, ge_item)
-     {
-        evas_object_table_unpack(gp->draw, ge_item->border);
-        evas_object_table_unpack(gp->draw, ge_item->highlight);
-     }
-
-   EINA_LIST_FOREACH_SAFE(gp->items, l_items, l_n_items, ge_item)
-     {
-        item_source = edje_edit_part_item_source_get(sd->group->edit_object, 
part, ge_item->name);
-        edje_object_file_set(ge_item->draw, ap.project->dev, item_source);
-
-        pos_col = edje_edit_part_item_position_col_get(sd->group->edit_object, 
part, ge_item->name);
-        pos_row = edje_edit_part_item_position_row_get(sd->group->edit_object, 
part, ge_item->name);
-        span_col = edje_edit_part_item_span_col_get(sd->group->edit_object, 
part, ge_item->name);
-        span_row = edje_edit_part_item_span_row_get(sd->group->edit_object, 
part, ge_item->name);
-
-        min_w = edje_edit_part_item_min_w_get(sd->group->edit_object, part, 
ge_item->name);
-        min_h = edje_edit_part_item_min_h_get(sd->group->edit_object, part, 
ge_item->name);
-
-/* Calculation according to box/table item implementation in efl 1.13 at 
edje_load.c */
-        if ((min_w <= 0) && (min_h <= 0))
-          {
-             edje_object_size_min_get(ge_item->draw, &w, &h);
-             if ((w <= 0) && (h <= 0))
-               edje_object_size_min_calc(ge_item->draw, &w, &h);
-          }
-        if (((min_w <= 0) && (min_h <= 0)) && ((w > 0) || (h > 0)))
-          evas_object_size_hint_min_set(ge_item->draw, w, h);
-        else
-          {
-             w = min_w;
-             h = min_h;
-             evas_object_size_hint_min_set(ge_item->draw, min_w, min_h);
-          }
-        max_w = edje_edit_part_item_max_w_get(sd->group->edit_object, part, 
ge_item->name);
-        max_h = edje_edit_part_item_max_h_get(sd->group->edit_object, part, 
ge_item->name);
-        evas_object_size_hint_max_set(ge_item->draw, max_w, max_h);
-        prefer_w = edje_edit_part_item_prefer_w_get(sd->group->edit_object, 
part, ge_item->name);
-        prefer_h = edje_edit_part_item_prefer_h_get(sd->group->edit_object, 
part, ge_item->name);
-        evas_object_size_hint_request_set(ge_item->draw, prefer_w, prefer_h);
-        edje_edit_part_item_padding_get(sd->group->edit_object, part, 
ge_item->name, &pad_l, &pad_r, &pad_t, &pad_b);
-        evas_object_size_hint_padding_set(ge_item->draw, pad_l, pad_r, pad_t, 
pad_b);
-        align_x = edje_edit_part_item_align_x_get(sd->group->edit_object, 
part, ge_item->name);
-        align_y = edje_edit_part_item_align_y_get(sd->group->edit_object, 
part, ge_item->name);
-        evas_object_size_hint_align_set(ge_item->draw, align_x, align_y);
-        weight_x = edje_edit_part_item_weight_x_get(sd->group->edit_object, 
part, ge_item->name);
-        weight_y = edje_edit_part_item_weight_y_get(sd->group->edit_object, 
part, ge_item->name);
-        evas_object_size_hint_weight_set(ge_item->draw, weight_x, weight_y);
-        switch(edje_edit_part_item_aspect_mode_get(sd->group->edit_object, 
part, ge_item->name))
-          {
-           case EDJE_ASPECT_CONTROL_NONE: aspect = EVAS_ASPECT_CONTROL_NONE; 
break;
-           case EDJE_ASPECT_CONTROL_NEITHER: aspect = 
EVAS_ASPECT_CONTROL_NEITHER; break;
-           case EDJE_ASPECT_CONTROL_HORIZONTAL: aspect = 
EVAS_ASPECT_CONTROL_HORIZONTAL; break;
-           case EDJE_ASPECT_CONTROL_VERTICAL: aspect = 
EVAS_ASPECT_CONTROL_VERTICAL; break;
-           case EDJE_ASPECT_CONTROL_BOTH: aspect = EVAS_ASPECT_CONTROL_BOTH; 
break;
-          }
-        aspect_x = edje_edit_part_item_aspect_w_get(sd->group->edit_object, 
part, ge_item->name);
-        aspect_y = edje_edit_part_item_aspect_h_get(sd->group->edit_object, 
part, ge_item->name);
-        evas_object_size_hint_aspect_set(ge_item->draw, aspect, aspect_x, 
aspect_y);
-        evas_object_color_set(ge_item->draw, r, g, b, a);
-
-        evas_object_table_pack(gp->draw, ge_item->border, pos_col,
-                               pos_row, span_col, span_row);
-        evas_object_table_pack(gp->draw, ge_item->draw, pos_col, pos_row, 
span_col, span_row);
-        evas_object_table_pack(gp->draw, ge_item->highlight, pos_col,
-                               pos_row, span_col, span_row);
-
-        spread_col = edje_edit_part_item_spread_w_get(sd->group->edit_object, 
part, ge_item->name);
-        spread_row = edje_edit_part_item_spread_h_get(sd->group->edit_object, 
part, ge_item->name);
-
-        EINA_LIST_FREE(ge_item->spread, spread_item)
-          {
-             evas_object_table_unpack(gp->draw, spread_item->draw);
-             evas_object_smart_member_del(spread_item->border);
-             evas_object_smart_member_del(spread_item->draw);
-             evas_object_smart_member_del(spread_item->highlight);
-             evas_object_del(spread_item->border);
-             evas_object_del(spread_item->draw);
-             evas_object_del(spread_item->highlight);
-             free(spread_item);
-          }
-
-        old_spread_row = spread_row;
-
-        while((spread_col > 1) || (spread_row > 1))
-          {
-             spread_pos_col = pos_col + spread_col - 1 ;
-             spread_pos_row = pos_row + spread_row - 1;
-
-             spread_item = (Groupedit_Item *)mem_calloc(1, 
sizeof(Groupedit_Item));
-
-             spread_item->draw = edje_object_add(sd->e);
-             edje_object_file_set(spread_item->draw, ap.project->dev, 
item_source);
-             ge_item->spread = eina_list_append(ge_item->spread, spread_item);
-             evas_object_size_hint_max_set(spread_item->draw, max_w, max_h);
-             evas_object_size_hint_request_set(spread_item->draw, prefer_w, 
prefer_h);
-             evas_object_size_hint_min_set(spread_item->draw, min_w, min_h);
-             evas_object_size_hint_padding_set(spread_item->draw, pad_l, 
pad_r, pad_t, pad_b);
-             evas_object_size_hint_align_set(spread_item->draw, align_x, 
align_y);
-             evas_object_size_hint_weight_set(spread_item->draw, weight_x, 
weight_y);
-             evas_object_size_hint_aspect_set(spread_item->draw, aspect, 
aspect_x, aspect_y);
-
-             evas_object_table_pack(gp->draw, spread_item->draw, 
spread_pos_col,
-                                    spread_pos_row, span_col, span_row);
-
-
-             evas_object_show(spread_item->draw);
-             evas_object_smart_member_add(spread_item->draw, gp->draw);
-             if (spread_row > 1) spread_row--;
-             else if (spread_col > 1) {spread_col--; spread_row = 
old_spread_row; }
-             evas_object_color_set(spread_item->draw, r, g, b, a);
-          }
-
-        evas_object_smart_member_add(ge_item->border, gp->draw);
-        evas_object_smart_member_add(ge_item->draw, gp->draw);
-        evas_object_smart_member_add(ge_item->highlight, gp->draw);
-     }
-
-   /* Fill empty cells with fake items */
-   evas_object_table_col_row_size_get(gp->draw, &col, &row);
-   Eina_List *fake_queue = gp->fake_items;
-   Groupedit_Item *fake = NULL;
-   for (i = 0; i < col; i++)
-     {
-        for (k = 0; k < row; k++)
-          {
-             child = evas_object_table_child_get(gp->draw, i, k);
-             if (!child)
-               {
-                  fake = eina_list_data_get(fake_queue);
-                  fake_queue = eina_list_next(fake_queue);
-                  if (!fake)
-                    {
-                       /* If there are no already created fakes items, then 
create new */
-                       fake = (Groupedit_Item *)mem_calloc(1, 
sizeof(Groupedit_Item));
-                       IMAGE_ADD_NEW(sd->obj, fake->border, "bg", "part_item")
-                       evas_object_show(fake->border);
-                       evas_object_size_hint_min_set(fake->border, 
EVAS_HINT_FILL, EVAS_HINT_FILL);
-                       evas_object_size_hint_align_set(fake->border, 
EVAS_HINT_FILL, EVAS_HINT_FILL);
-                       evas_object_size_hint_weight_set(fake->border, 
EVAS_HINT_FILL, EVAS_HINT_FILL);
-                       IMAGE_ADD_NEW(sd->obj, fake->highlight, "border", 
"1px");
-                       evas_object_size_hint_min_set(fake->highlight, 
EVAS_HINT_FILL, EVAS_HINT_FILL);
-                       evas_object_size_hint_align_set(fake->highlight, 
EVAS_HINT_FILL, EVAS_HINT_FILL);
-                       evas_object_size_hint_weight_set(fake->highlight, 
EVAS_HINT_FILL, EVAS_HINT_FILL);
-                       evas_object_color_set(fake->highlight, 49, 140, 141, 
255);
-                       evas_object_show(fake->highlight);
-                       gp->fake_items = eina_list_append(gp->fake_items, fake);
-                    }
-                  evas_object_table_pack(gp->draw, fake->border, i, k, 1, 1);
-                  evas_object_table_pack(gp->draw, fake->highlight, i, k, 1, 
1);
-                  fake_count++;
-               }
-          }
-     }
-   fake_diff = fake_count - fake_init;
-   EINA_LIST_REVERSE_FOREACH(gp->fake_items, fake_l, fake)
-     {
-        if (fake_diff < 0)
-          {
-             evas_object_del(fake->border);
-             evas_object_del(fake->highlight);
-             free(fake);
-             gp->fake_items = eina_list_remove_list(gp->fake_items, fake_l);
-             fake_diff++;
-          }
-        else break;
-     }
-   evas_object_smart_calculate(gp->draw);
 }
 
 static Evas_Object_Box_Layout
diff --git a/src/bin/ui/workspace/groupedit_private.h 
b/src/bin/ui/workspace/groupedit_private.h
index be91e69..a194329 100644
--- a/src/bin/ui/workspace/groupedit_private.h
+++ b/src/bin/ui/workspace/groupedit_private.h
@@ -143,6 +143,8 @@ struct _Groupedit_Part
                                    text and textblock.*/
    Evas_Object *proxy_part;
    Evas_Object *layout;
+   Evas_Object *container;    /**< Used for box/table parts */
+   Eina_Stringshare ***items_draw;
    Evas_Object *item;         /**< The object border in the separete mode */
    Eina_List *items;          /**< The items, for TABLE, BOX part types */
    Eina_List *fake_items;          /**< The items, for TABLE, BOX part types */

-- 


Reply via email to