improved dynamic layout of editor gadgets (continued)
[rocksndiamonds.git] / src / editor.c
index 81d189decd0a7b1ba08ddddd291c4441abac2e59..375b942b03c6fc36a20a4749499f1f98d91a47ba 100644 (file)
 
 #define ED_GADGET_DISTANCE             2
 #define ED_GADGET_TEXT_DISTANCE                (2 * ED_GADGET_DISTANCE)
+#define ED_GADGET_LINE_DISTANCE                (2 * ED_GADGET_DISTANCE)
 #define ED_DRAWINGAREA_TEXT_DISTANCE   (ED_GADGET_TEXT_DISTANCE +      \
                                         MINI_TILEX / 2)
 
 /* values for the settings windows */
-#define ED_LEVEL_SETTINGS_XSTART       (3 * MINI_TILEX / 2)
-#define ED_LEVEL_SETTINGS_YSTART       (7 * MINI_TILEY)
+#define ED_SETTINGS1_YPOS              MINI_TILEY
+
+#define ED_ELEMENT_SETTINGS_ELEM_XPOS  (2 * MINI_TILEX)
+#define ED_ELEMENT_SETTINGS_ELEM_YPOS  (4 * MINI_TILEY + MINI_TILEY / 2)
+
+/* values for checkbutton gadgets */
+#define ED_CHECKBUTTON_XSIZE        (graphic_info[IMG_EDITOR_CHECKBOX].width)
+#define ED_CHECKBUTTON_YSIZE        (graphic_info[IMG_EDITOR_CHECKBOX].height)
+
+#define ED_TABBUTTON_XSIZE          (graphic_info[IMG_EDITOR_TABBUTTON].width)
+#define ED_TABBUTTON_YSIZE          (graphic_info[IMG_EDITOR_TABBUTTON].height)
+
+#define ED_TAB_BAR_HEIGHT              ED_GADGET_DISTANCE
+
+#define ED_LEVEL_SETTINGS_BASE_XSTART  (3 * MINI_TILEX / 2)
+#define ED_LEVEL_SETTINGS_BASE_YSTART  (9 * MINI_TILEY / 2)
+#define ED_ELEMENT_SETTINGS_BASE_XSTART        (3 * MINI_TILEX / 2)
+#define ED_ELEMENT_SETTINGS_BASE_YSTART        (9 * MINI_TILEY)
+
+#define ED_LEVEL_SETTINGS_XSTART       (ED_LEVEL_SETTINGS_BASE_XSTART)
+#define ED_LEVEL_SETTINGS_YSTART       (ED_LEVEL_SETTINGS_BASE_YSTART + \
+                                        ED_TABBUTTON_YSIZE +            \
+                                        ED_TAB_BAR_HEIGHT +             \
+                                        ED_GADGET_DISTANCE +            \
+                                        getFontHeight(FONT_TEXT_1) +    \
+                                        ED_GADGET_DISTANCE)
+#define ED_ELEMENT_SETTINGS_XSTART     (ED_ELEMENT_SETTINGS_BASE_XSTART)
+#define ED_ELEMENT_SETTINGS_YSTART     (ED_ELEMENT_SETTINGS_BASE_YSTART + \
+                                        getFontHeight(FONT_INPUT_2) +     \
+                                        ED_GADGET_DISTANCE)
 
-#define ED_ELEMENT_SETTINGS_XSTART     (3 * MINI_TILEX / 2)
-#define ED_ELEMENT_SETTINGS_YSTART     (10 * MINI_TILEY)
+#define ED_SETTINGS_XOFFSET            (ED_CHECKBUTTON_XSIZE +         \
+                                        ED_GADGET_TEXT_DISTANCE)
+#define ED_SETTINGS_YOFFSET            (ED_CHECKBUTTON_YSIZE +         \
+                                        ED_GADGET_LINE_DISTANCE)
 
-#define ED_XOFFSET_CHECKBOX            (ED_CHECKBUTTON_XSIZE +         \
-                                        2 * ED_GADGET_DISTANCE)
+#define ED_POS_LEVEL_SETTINGS          (100)
+#define ED_POS_ELEMENT_SETTINGS                (200)
 
-#define ED_SETTINGS_XOFFSET            ED_XOFFSET_CHECKBOX
-#define ED_SETTINGS_YOFFSET            (3 * MINI_TILEY / 2)
-#define ED_SETTINGS_TAB_XOFFSET                124
+#define ED_LEVEL_SETTINGS_XPOS(n)      (ED_POS_LEVEL_SETTINGS + (n))
+#define ED_LEVEL_SETTINGS_YPOS(n)      (ED_POS_LEVEL_SETTINGS + (n))
 
-#define ED_LEVEL_SETTINGS_XPOS(n)      (ED_LEVEL_SETTINGS_XSTART +     \
-                                        (n) * ED_SETTINGS_XOFFSET)
-#define ED_LEVEL_SETTINGS_YPOS(n)      (ED_LEVEL_SETTINGS_YSTART +     \
+#define ED_ELEMENT_SETTINGS_XPOS(n)    (ED_POS_ELEMENT_SETTINGS + (n))
+#define ED_ELEMENT_SETTINGS_YPOS(n)    (ED_POS_ELEMENT_SETTINGS + (n))
+
+#define IS_POS_LEVEL_SETTINGS(n)       ((n) >= ED_POS_LEVEL_SETTINGS && \
+                                        (n) < ED_POS_LEVEL_SETTINGS + 100)
+#define IS_POS_ELEMENT_SETTINGS(n)     ((n) >= ED_POS_ELEMENT_SETTINGS && \
+                                        (n) < ED_POS_ELEMENT_SETTINGS + 100)
+
+#define ED_LEVEL_SETTINGS_LINE(n)      ((n) - ED_POS_LEVEL_SETTINGS)
+#define ED_ELEMENT_SETTINGS_LINE(n)    ((n) - ED_POS_ELEMENT_SETTINGS)
+
+#define ED_LEVEL_SETTINGS_X(n)         (ED_LEVEL_SETTINGS_XSTART +     \
+                                        (n) * ED_SETTINGS_XOFFSET)
+#define ED_LEVEL_SETTINGS_Y(n)         (ED_LEVEL_SETTINGS_YSTART +     \
                                         (n) * ED_SETTINGS_YOFFSET)
 
-#define ED_ELEMENT_SETTINGS_XPOS(n)    (ED_ELEMENT_SETTINGS_XSTART +   \
-                                        (n) * ED_SETTINGS_XOFFSET)
-#define ED_ELEMENT_SETTINGS_YPOS(n)    (ED_ELEMENT_SETTINGS_YSTART +   \
+#define ED_ELEMENT_SETTINGS_X(n)       (ED_ELEMENT_SETTINGS_XSTART +   \
+                                        (n) * ED_SETTINGS_XOFFSET)
+#define ED_ELEMENT_SETTINGS_Y(n)       (ED_ELEMENT_SETTINGS_YSTART +   \
                                         (n) * ED_SETTINGS_YOFFSET)
 
-#define ED_LEVEL_SETTINGS_TABS_XPOS(n) (ED_LEVEL_SETTINGS_XPOS(0) +    \
-                                       (n) * ED_SETTINGS_TAB_XOFFSET)
-#define ED_LEVEL_SETTINGS_TABS_YPOS(n) (ED_LEVEL_SETTINGS_YSTART -     \
-                                        3 * MINI_TILEY)
+#define ED_POS_TO_LEVEL_SETTINGS_X(n)  \
+  (ED_LEVEL_SETTINGS_X(ED_LEVEL_SETTINGS_LINE(n)))
+#define ED_POS_TO_LEVEL_SETTINGS_Y(n)  \
+  (ED_LEVEL_SETTINGS_Y(ED_LEVEL_SETTINGS_LINE(n)))
 
-#define ED_ELEMENT_SETTINGS_TABS_XPOS(n) (ED_ELEMENT_SETTINGS_XPOS(0) +        \
-                                        (n) * ED_SETTINGS_TAB_XOFFSET)
-#define ED_ELEMENT_SETTINGS_TABS_YPOS(n) (ED_ELEMENT_SETTINGS_YSTART - \
-                                        2 * MINI_TILEY)
+#define ED_POS_TO_ELEMENT_SETTINGS_X(n)        \
+  (ED_ELEMENT_SETTINGS_X(ED_ELEMENT_SETTINGS_LINE(n)))
+#define ED_POS_TO_ELEMENT_SETTINGS_Y(n)        \
+  (ED_ELEMENT_SETTINGS_Y(ED_ELEMENT_SETTINGS_LINE(n)))
 
-#define ED_SETTINGS1_YPOS              MINI_TILEY
-#define ED_SETTINGS2_XPOS              MINI_TILEX
-#define ED_SETTINGS2_YPOS              (ED_SETTINGS1_YPOS + 12 * TILEY - 2)
+#define ED_SETTINGS_X(n)               (IS_POS_LEVEL_SETTINGS(n) ?     \
+                                        ED_POS_TO_LEVEL_SETTINGS_X(n) : \
+                                        ED_POS_TO_ELEMENT_SETTINGS_X(n))
+#define ED_SETTINGS_Y(n)               (IS_POS_LEVEL_SETTINGS(n) ?     \
+                                        ED_POS_TO_LEVEL_SETTINGS_Y(n) : \
+                                        ED_POS_TO_ELEMENT_SETTINGS_Y(n))
 
-/* values for counter gadgets */
-#define ED_COUNTER_YSTART              (ED_SETTINGS1_YPOS + 2 * TILEY)
-#define ED_COUNTER_YDISTANCE           (3 * MINI_TILEY)
-#define ED_COUNTER_YPOS(n)             (ED_COUNTER_YSTART +            \
-                                        (n) * ED_COUNTER_YDISTANCE)
-#define ED_COUNTER2_YPOS(n)            (ED_COUNTER_YSTART +            \
-                                        (n) * ED_COUNTER_YDISTANCE - 2)
+#define ED_AREA_SETTINGS_X(i)          (ED_SETTINGS_X((i).x) + (i).xoffset)
+#define ED_AREA_SETTINGS_Y(i)          (ED_SETTINGS_Y((i).y) + (i).yoffset)
+
+#define ED_LEVEL_SETTINGS_TABS_XPOS    (ED_LEVEL_SETTINGS_BASE_XSTART)
+#define ED_LEVEL_SETTINGS_TABS_YPOS    (4 * MINI_TILEY)
+#define ED_ELEMENT_SETTINGS_TABS_XPOS  (ED_ELEMENT_SETTINGS_BASE_XSTART)
+#define ED_ELEMENT_SETTINGS_TABS_YPOS  (8 * MINI_TILEY)
 
 /* values for element content drawing areas */
-#define ED_AREA_1X1_SETTINGS_XPOS(n)   (ED_ELEMENT_SETTINGS_XPOS(n))
-#define ED_AREA_1X1_SETTINGS_YPOS(n)   (ED_ELEMENT_SETTINGS_YPOS(n) +  \
-                                        ED_GADGET_DISTANCE)
+#define ED_AREA_1X1_LSETTINGS_XPOS(n)  ED_LEVEL_SETTINGS_XPOS(n)
+#define ED_AREA_1X1_LSETTINGS_YPOS(n)  ED_LEVEL_SETTINGS_YPOS(n)
+#define ED_AREA_1X1_LSETTINGS_XOFF     (0)
+#define ED_AREA_1X1_LSETTINGS_YOFF     (ED_GADGET_DISTANCE)
+
+#define ED_AREA_1X1_SETTINGS_XPOS(n)   ED_ELEMENT_SETTINGS_XPOS(n)
+#define ED_AREA_1X1_SETTINGS_YPOS(n)   ED_ELEMENT_SETTINGS_YPOS(n)
+#define ED_AREA_1X1_SETTINGS_XOFF      (0)
+#define ED_AREA_1X1_SETTINGS_YOFF      (ED_GADGET_DISTANCE)
 
-#define ED_AREA_3X3_SETTINGS_XPOS(n)   (ED_ELEMENT_SETTINGS_XPOS(n))
-#define ED_AREA_3X3_SETTINGS_YPOS(n)   (ED_ELEMENT_SETTINGS_YPOS(n) +  \
-                                        ED_GADGET_DISTANCE - MINI_TILEY)
+#define ED_AREA_3X3_SETTINGS_XPOS(n)   ED_ELEMENT_SETTINGS_XPOS(n)
+#define ED_AREA_3X3_SETTINGS_YPOS(n)   ED_ELEMENT_SETTINGS_YPOS(n)
+#define ED_AREA_3X3_SETTINGS_XOFF      (0)
+#define ED_AREA_3X3_SETTINGS_YOFF      (ED_GADGET_DISTANCE - MINI_TILEY)
 
 /* yamyam content */
-#define ED_AREA_YAMYAM_CONTENT_XPOS(n) (2 * MINI_TILEX +               \
+#define ED_AREA_YAMYAM_CONTENT_XPOS    ED_ELEMENT_SETTINGS_XPOS(0)
+#define ED_AREA_YAMYAM_CONTENT_YPOS    ED_ELEMENT_SETTINGS_YPOS(0)
+#define ED_AREA_YAMYAM_CONTENT_XOFF(n) (MINI_TILEX / 2 +               \
                                         5 * ((n) % 4) * MINI_TILEX)
-#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (11 * ED_SETTINGS_YOFFSET +     \
+#define ED_AREA_YAMYAM_CONTENT_YOFF(n) (13 * MINI_TILEY / 2 +  \
                                         6 * ((n) / 4) * MINI_TILEY)
+#define ED_AREA_YAMYAM_CONTENT_X(n)    (ED_ELEMENT_SETTINGS_X(0) +     \
+                                        ED_AREA_YAMYAM_CONTENT_XOFF(n))
+#define ED_AREA_YAMYAM_CONTENT_Y(n)    (ED_ELEMENT_SETTINGS_Y(0) +     \
+                                        ED_AREA_YAMYAM_CONTENT_YOFF(n))
 
 /* magic ball content */
-#define ED_AREA_MAGIC_BALL_CONTENT_XPOS(n) (2 * MINI_TILEX +           \
+#define ED_AREA_MAGIC_BALL_CONTENT_XPOS        ED_ELEMENT_SETTINGS_XPOS(0)
+#define ED_AREA_MAGIC_BALL_CONTENT_YPOS        ED_ELEMENT_SETTINGS_YPOS(0)
+#define ED_AREA_MAGIC_BALL_CONTENT_XOFF(n) (MINI_TILEX / 2 +           \
                                            5 * ((n) % 4) * MINI_TILEX)
-#define ED_AREA_MAGIC_BALL_CONTENT_YPOS(n) (12 * ED_SETTINGS_YOFFSET + \
+#define ED_AREA_MAGIC_BALL_CONTENT_YOFF(n) (16 * MINI_TILEY / 2 +      \
                                            6 * ((n) / 4) * MINI_TILEY)
+#define ED_AREA_MAGIC_BALL_CONTENT_X(n)        (ED_ELEMENT_SETTINGS_X(0) +     \
+                                        ED_AREA_MAGIC_BALL_CONTENT_XOFF(n))
+#define ED_AREA_MAGIC_BALL_CONTENT_Y(n)        (ED_ELEMENT_SETTINGS_Y(0) +     \
+                                        ED_AREA_MAGIC_BALL_CONTENT_YOFF(n))
 
 /* values for scrolling gadgets for drawing area */
-#define ED_SCROLLBUTTON_XPOS           24
-#define ED_SCROLLBUTTON_YPOS           0
-#define ED_SCROLLBAR_XPOS              24
-#define ED_SCROLLBAR_YPOS              64
-
 #define ED_SCROLLBUTTON_XSIZE          16
 #define ED_SCROLLBUTTON_YSIZE          16
 
 #define ED_SCROLL_VERTICAL_YSIZE       (SYSIZE - 4 * ED_SCROLLBUTTON_YSIZE)
 
 /* values for scrolling gadgets for element list */
-#define ED_SCROLLBUTTON2_XPOS          50
-#define ED_SCROLLBUTTON2_YPOS          0
-#define ED_SCROLLBAR2_XPOS             50
-#define ED_SCROLLBAR2_YPOS             20
-
 #define ED_SCROLLBUTTON2_XSIZE         (graphic_info[IMG_EDITOR_PALETTE_SCROLL_UP].width)
 #define ED_SCROLLBUTTON2_YSIZE         (graphic_info[IMG_EDITOR_PALETTE_SCROLL_UP].height)
 
                                         ED_ELEMENTLIST_YSIZE -         \
                                         2 * ED_SCROLLBUTTON2_YSIZE)
 
-/* values for checkbutton gadgets */
-#define ED_CHECKBUTTON_XSIZE           ED_BUTTON_COUNT_XSIZE
-#define ED_CHECKBUTTON_YSIZE           ED_BUTTON_COUNT_YSIZE
-#define ED_CHECKBUTTON_UNCHECKED_XPOS  ED_BUTTON_MINUS_XPOS
-#define ED_CHECKBUTTON_CHECKED_XPOS    ED_BUTTON_PLUS_XPOS
-#define ED_CHECKBUTTON_YPOS            (ED_BUTTON_MINUS_YPOS + 22)
-#define ED_RADIOBUTTON_YPOS            (ED_BUTTON_MINUS_YPOS + 44)
-#define ED_STICKYBUTTON_YPOS           (ED_BUTTON_MINUS_YPOS + 66)
-
-/* values for some special graphic buttons */
-#define ED_COPY_CHANGE_PAGE_XPOS       25
-#define ED_COPY_CHANGE_PAGE_YPOS       50
-#define ED_PASTE_CHANGE_PAGE_XPOS      25
-#define ED_PASTE_CHANGE_PAGE_YPOS      70
-
-/* some values for text input, selectbox and counter gadgets */
-#define ED_BUTTON_COUNT_YPOS           60
-#define ED_BUTTON_COUNT_XSIZE          20
-#define ED_BUTTON_COUNT_YSIZE          20
-#define ED_WIN_COUNT_XPOS              (2 + ED_BUTTON_COUNT_XSIZE + 2)
-#define ED_WIN_COUNT_YPOS              ED_BUTTON_COUNT_YPOS
-#define ED_WIN_COUNT_XSIZE             52
-#define ED_WIN_COUNT_YSIZE             ED_BUTTON_COUNT_YSIZE
-
-#define ED_BUTTON_MINUS_XPOS           2
-#define ED_BUTTON_MINUS_YPOS           ED_BUTTON_COUNT_YPOS
-#define ED_BUTTON_MINUS_XSIZE          ED_BUTTON_COUNT_XSIZE
-#define ED_BUTTON_MINUS_YSIZE          ED_BUTTON_COUNT_YSIZE
-#define ED_BUTTON_PLUS_XPOS            (ED_WIN_COUNT_XPOS +            \
-                                        ED_WIN_COUNT_XSIZE + 2)
-#define ED_BUTTON_PLUS_YPOS            ED_BUTTON_COUNT_YPOS
-#define ED_BUTTON_PLUS_XSIZE           ED_BUTTON_COUNT_XSIZE
-#define ED_BUTTON_PLUS_YSIZE           ED_BUTTON_COUNT_YSIZE
-
-#define ED_SELECTBOX_XPOS              ED_WIN_COUNT_XPOS
-#define ED_SELECTBOX_YPOS              (ED_WIN_COUNT_YPOS +            \
-                                        2 + ED_WIN_COUNT_YSIZE)
-#define ED_SELECTBOX_XSIZE             ED_WIN_COUNT_XSIZE
-#define ED_SELECTBOX_YSIZE             ED_WIN_COUNT_YSIZE
-
-#define ED_SELECTBOX_BUTTON_XSIZE      14
-
-#define ED_TEXTBUTTON_XPOS             ED_WIN_COUNT_XPOS
-#define ED_TEXTBUTTON_YPOS             (ED_WIN_COUNT_YPOS +            \
-                                        4 * (2 + ED_WIN_COUNT_YSIZE))
-#define ED_TEXTBUTTON_INACTIVE_YPOS    ED_TEXTBUTTON_YPOS
-
-#define ED_TEXTBUTTON_TAB_XPOS         ED_WIN_COUNT_XPOS
-#define ED_TEXTBUTTON_TAB_YPOS         (ED_WIN_COUNT_YPOS +            \
-                                        2 * (2 + ED_WIN_COUNT_YSIZE))
-#define ED_TEXTBUTTON_TAB_INACTIVE_YPOS        (ED_WIN_COUNT_YPOS +            \
-                                        3 * (2 + ED_WIN_COUNT_YSIZE))
-
-#define ED_TEXTBUTTON_XSIZE            ED_WIN_COUNT_XSIZE
-#define ED_TEXTBUTTON_YSIZE            ED_WIN_COUNT_YSIZE
-
 /* values for ClearEditorGadgetInfoText() and HandleEditorGadgetInfoText() */
 #define INFOTEXT_XPOS                  SX
 #define INFOTEXT_YPOS                  (SY + SYSIZE - MINI_TILEX + 2)
@@ -1452,7 +1449,7 @@ static struct
     "Author:", "Author"
   },
   {
-    5 * MINI_TILEX - 2,                        5 * MINI_TILEY - ED_BORDER_SIZE + 1,
+    -1, -1,    /* these values are not constant, but can change at runtime */
     GADGET_ID_ELEMENT_NAME,
     MAX_ELEMENT_NAME_LEN - 2,          /* currently 2 chars less editable */
     custom_element.description,
@@ -2304,7 +2301,10 @@ static struct
     -1,
     options_move_leave_type,
     &custom_element.move_leave_type,
-    "can dig:    can", ":",            "leave behind or change element"
+    // left text with leading spaces to place gadget next to "can dig" gadget
+    // (needed because drawing area gadgets created after selectbox gadgets)
+    // "can dig:    can", ":",         "leave behind or change element"
+    "            can", ":",            "leave behind or change element"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(7),
@@ -2453,61 +2453,61 @@ static struct
 } textbutton_info[ED_NUM_TEXTBUTTONS] =
 {
   {
-    ED_LEVEL_SETTINGS_TABS_XPOS(0),    ED_LEVEL_SETTINGS_TABS_YPOS(0),
+    ED_LEVEL_SETTINGS_TABS_XPOS,       ED_LEVEL_SETTINGS_TABS_YPOS,
     GADGET_ID_LEVELINFO_LEVEL,         GADGET_ID_NONE,
     8,                                 "Level",                        
     NULL, NULL,                                "Configure level properties"
   },
   {
-    ED_LEVEL_SETTINGS_TABS_XPOS(1),    ED_LEVEL_SETTINGS_TABS_YPOS(0),
-    GADGET_ID_LEVELINFO_EDITOR,                GADGET_ID_NONE,
+    -1,                                        -1,
+    GADGET_ID_LEVELINFO_EDITOR,                GADGET_ID_LEVELINFO_LEVEL,
     8,                                 "Editor",                       
     NULL, NULL,                                "Configure editor properties"
   },
   {
-    ED_ELEMENT_SETTINGS_TABS_XPOS(0),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
+    ED_ELEMENT_SETTINGS_TABS_XPOS,     ED_ELEMENT_SETTINGS_TABS_YPOS,
     GADGET_ID_PROPERTIES_INFO,         GADGET_ID_NONE,
     8,                                 "Info",                 
     NULL, NULL,                                "Show information about element"
   },
   {
-    ED_ELEMENT_SETTINGS_TABS_XPOS(1),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
-    GADGET_ID_PROPERTIES_CONFIG,       GADGET_ID_NONE,
+    -1,                                        -1,
+    GADGET_ID_PROPERTIES_CONFIG,       GADGET_ID_PROPERTIES_INFO,
     8,                                 "Config",
     NULL, NULL,                                "Configure element properties"
   },
   {
-    ED_ELEMENT_SETTINGS_TABS_XPOS(1),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
-    GADGET_ID_PROPERTIES_CONFIG_1,     GADGET_ID_NONE,
+    -1,                                        -1,
+    GADGET_ID_PROPERTIES_CONFIG_1,     GADGET_ID_PROPERTIES_INFO,
     8,                                 "Config 1",
     NULL, NULL,                                "Configure element properties, part 1"
   },
   {
-    ED_ELEMENT_SETTINGS_TABS_XPOS(2),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
-    GADGET_ID_PROPERTIES_CONFIG_2,     GADGET_ID_NONE,
+    -1,                                        -1,
+    GADGET_ID_PROPERTIES_CONFIG_2,     GADGET_ID_PROPERTIES_CONFIG_1,
     8,                                 "Config 2",
     NULL, NULL,                                "Configure element properties, part 2"
   },
   {
-    ED_ELEMENT_SETTINGS_TABS_XPOS(3),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
-    GADGET_ID_PROPERTIES_CHANGE,       GADGET_ID_NONE,
+    -1,                                        -1,
+    GADGET_ID_PROPERTIES_CHANGE,       GADGET_ID_PROPERTIES_CONFIG_2,
     8,                                 "Change",
     NULL, NULL,                                "Configure custom element change pages"
   },
   {
-    -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
+    -1,                                        -1,
     GADGET_ID_SAVE_AS_TEMPLATE,                GADGET_ID_CUSTOM_USE_TEMPLATE,
     -1,                                        "Save",
     " ", "As Template",                        "Save current settings as new template"
   },
   {
-    -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
+    -1,                                        -1,
     GADGET_ID_ADD_CHANGE_PAGE,         GADGET_ID_PASTE_CHANGE_PAGE,
     -1,                                        "New",
     NULL, NULL,                                "Add new change page"
   },
   {
-    -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
+    -1,                                        -1,
     GADGET_ID_DEL_CHANGE_PAGE,         GADGET_ID_ADD_CHANGE_PAGE,
     -1,                                        "Delete",
     NULL, NULL,                                "Delete current change page"
@@ -2516,39 +2516,34 @@ static struct
 
 static struct
 {
-  int gd_x, gd_y;
+  int graphic;
   int x, y;
-  int width, height;
   int gadget_id;
   int gadget_id_align;
   char *text_left, *text_right, *infotext;
 } graphicbutton_info[ED_NUM_GRAPHICBUTTONS] =
 {
   {
-    ED_BUTTON_MINUS_XPOS,              ED_BUTTON_COUNT_YPOS,
+    IMG_EDITOR_COUNTER_DOWN,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(14),
-    ED_BUTTON_COUNT_XSIZE,             ED_BUTTON_COUNT_YSIZE,
     GADGET_ID_PREV_CHANGE_PAGE,                GADGET_ID_NONE,
     NULL, NULL,                                "select previous change page"
   },
   {
-    ED_BUTTON_PLUS_XPOS,               ED_BUTTON_COUNT_YPOS,
+    IMG_EDITOR_COUNTER_UP,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
-    ED_BUTTON_COUNT_XSIZE,             ED_BUTTON_COUNT_YSIZE,
     GADGET_ID_NEXT_CHANGE_PAGE,                GADGET_ID_SELECT_CHANGE_PAGE,
     NULL, "change page",               "select next change page"
   },
   {
-    ED_COPY_CHANGE_PAGE_XPOS,          ED_COPY_CHANGE_PAGE_YPOS,
+    IMG_EDITOR_BUTTON_GFX_CP_COPY,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
-    ED_BUTTON_COUNT_XSIZE,             ED_BUTTON_COUNT_YSIZE,
     GADGET_ID_COPY_CHANGE_PAGE,                GADGET_ID_NEXT_CHANGE_PAGE,
     " ", NULL,                         "copy settings from this change page"
   },
   {
-    ED_PASTE_CHANGE_PAGE_XPOS,         ED_PASTE_CHANGE_PAGE_YPOS,
+    IMG_EDITOR_BUTTON_GFX_CP_PASTE,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
-    ED_BUTTON_COUNT_XSIZE,             ED_BUTTON_COUNT_YSIZE,
     GADGET_ID_PASTE_CHANGE_PAGE,       GADGET_ID_COPY_CHANGE_PAGE,
     NULL, NULL,                                "paste settings to this change page"
   },
@@ -3054,6 +3049,7 @@ static struct
 static struct
 {
   int x, y;
+  int xoffset, yoffset;
   int gadget_id;
   int gadget_id_align;
   int *value;
@@ -3064,6 +3060,7 @@ static struct
   /* ---------- level playfield content ------------------------------------ */
 
   {
+    0,                                 0,
     0,                                 0,
     GADGET_ID_DRAWING_LEVEL,           GADGET_ID_NONE,
     NULL,
@@ -3074,49 +3071,57 @@ static struct
   /* ---------- yam yam content -------------------------------------------- */
 
   {
-    ED_AREA_YAMYAM_CONTENT_XPOS(0),    ED_AREA_YAMYAM_CONTENT_YPOS(0),
+    ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
+    ED_AREA_YAMYAM_CONTENT_XOFF(0),    ED_AREA_YAMYAM_CONTENT_YOFF(0),
     GADGET_ID_YAMYAM_CONTENT_0,                GADGET_ID_NONE,
     &level.yamyam_content[0].e[0][0],  3, 3,
     NULL, NULL, "1",                   NULL
   },
   {
-    ED_AREA_YAMYAM_CONTENT_XPOS(1),    ED_AREA_YAMYAM_CONTENT_YPOS(1),
+    ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
+    ED_AREA_YAMYAM_CONTENT_XOFF(1),    ED_AREA_YAMYAM_CONTENT_YOFF(1),
     GADGET_ID_YAMYAM_CONTENT_1,                GADGET_ID_NONE,
     &level.yamyam_content[1].e[0][0],  3, 3,
     NULL, NULL, "2",                   NULL
   },
   {
-    ED_AREA_YAMYAM_CONTENT_XPOS(2),    ED_AREA_YAMYAM_CONTENT_YPOS(2),
+    ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
+    ED_AREA_YAMYAM_CONTENT_XOFF(2),    ED_AREA_YAMYAM_CONTENT_YOFF(2),
     GADGET_ID_YAMYAM_CONTENT_2,                GADGET_ID_NONE,
     &level.yamyam_content[2].e[0][0],  3, 3,
     NULL, NULL, "3",                   NULL
   },
   {
-    ED_AREA_YAMYAM_CONTENT_XPOS(3),    ED_AREA_YAMYAM_CONTENT_YPOS(3),
+    ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
+    ED_AREA_YAMYAM_CONTENT_XOFF(3),    ED_AREA_YAMYAM_CONTENT_YOFF(3),
     GADGET_ID_YAMYAM_CONTENT_3,                GADGET_ID_NONE,
     &level.yamyam_content[3].e[0][0],  3, 3,
     NULL, NULL, "4",                   NULL
   },
   {
-    ED_AREA_YAMYAM_CONTENT_XPOS(4),    ED_AREA_YAMYAM_CONTENT_YPOS(4),
+    ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
+    ED_AREA_YAMYAM_CONTENT_XOFF(4),    ED_AREA_YAMYAM_CONTENT_YOFF(4),
     GADGET_ID_YAMYAM_CONTENT_4,                GADGET_ID_NONE,
     &level.yamyam_content[4].e[0][0],  3, 3,
     NULL, NULL, "5",                   NULL
   },
   {
-    ED_AREA_YAMYAM_CONTENT_XPOS(5),    ED_AREA_YAMYAM_CONTENT_YPOS(5),
+    ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
+    ED_AREA_YAMYAM_CONTENT_XOFF(5),    ED_AREA_YAMYAM_CONTENT_YOFF(5),
     GADGET_ID_YAMYAM_CONTENT_5,                GADGET_ID_NONE,
     &level.yamyam_content[5].e[0][0],  3, 3,
     NULL, NULL, "6",                   NULL
   },
   {
-    ED_AREA_YAMYAM_CONTENT_XPOS(6),    ED_AREA_YAMYAM_CONTENT_YPOS(6),
+    ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
+    ED_AREA_YAMYAM_CONTENT_XOFF(6),    ED_AREA_YAMYAM_CONTENT_YOFF(6),
     GADGET_ID_YAMYAM_CONTENT_6,                GADGET_ID_NONE,
     &level.yamyam_content[6].e[0][0],  3, 3,
     NULL, NULL, "7",                   NULL
   },
   {
-    ED_AREA_YAMYAM_CONTENT_XPOS(7),    ED_AREA_YAMYAM_CONTENT_YPOS(7),
+    ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
+    ED_AREA_YAMYAM_CONTENT_XOFF(7),    ED_AREA_YAMYAM_CONTENT_YOFF(7),
     GADGET_ID_YAMYAM_CONTENT_7,                GADGET_ID_NONE,
     &level.yamyam_content[7].e[0][0],  3, 3,
     NULL, NULL, "8",                   NULL
@@ -3125,49 +3130,57 @@ static struct
   /* ---------- magic ball content ----------------------------------------- */
 
   {
-    ED_AREA_MAGIC_BALL_CONTENT_XPOS(0),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(0),
+    ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+    ED_AREA_MAGIC_BALL_CONTENT_XOFF(0),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(0),
     GADGET_ID_MAGIC_BALL_CONTENT_0,    GADGET_ID_NONE,
     &level.ball_content[0].e[0][0],    3, 3,
     NULL, NULL, "1",                   NULL
   },
   {
-    ED_AREA_MAGIC_BALL_CONTENT_XPOS(1),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(1),
+    ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+    ED_AREA_MAGIC_BALL_CONTENT_XOFF(1),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(1),
     GADGET_ID_MAGIC_BALL_CONTENT_1,    GADGET_ID_NONE,
     &level.ball_content[1].e[0][0],    3, 3,
     NULL, NULL, "2",                   NULL
   },
   {
-    ED_AREA_MAGIC_BALL_CONTENT_XPOS(2),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(2),
+    ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+    ED_AREA_MAGIC_BALL_CONTENT_XOFF(2),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(2),
     GADGET_ID_MAGIC_BALL_CONTENT_2,    GADGET_ID_NONE,
     &level.ball_content[2].e[0][0],    3, 3,
     NULL, NULL, "3",                   NULL
   },
   {
-    ED_AREA_MAGIC_BALL_CONTENT_XPOS(3),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(3),
+    ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+    ED_AREA_MAGIC_BALL_CONTENT_XOFF(3),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(3),
     GADGET_ID_MAGIC_BALL_CONTENT_3,    GADGET_ID_NONE,
     &level.ball_content[3].e[0][0],    3, 3,
     NULL, NULL, "4",                   NULL
   },
   {
-    ED_AREA_MAGIC_BALL_CONTENT_XPOS(4),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(4),
+    ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+    ED_AREA_MAGIC_BALL_CONTENT_XOFF(4),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(4),
     GADGET_ID_MAGIC_BALL_CONTENT_4,    GADGET_ID_NONE,
     &level.ball_content[4].e[0][0],    3, 3,
     NULL, NULL, "5",                   NULL
   },
   {
-    ED_AREA_MAGIC_BALL_CONTENT_XPOS(5),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(5),
+    ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+    ED_AREA_MAGIC_BALL_CONTENT_XOFF(5),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(5),
     GADGET_ID_MAGIC_BALL_CONTENT_5,    GADGET_ID_NONE,
     &level.ball_content[5].e[0][0],    3, 3,
     NULL, NULL, "6",                   NULL
   },
   {
-    ED_AREA_MAGIC_BALL_CONTENT_XPOS(6),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(6),
+    ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+    ED_AREA_MAGIC_BALL_CONTENT_XOFF(6),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(6),
     GADGET_ID_MAGIC_BALL_CONTENT_6,    GADGET_ID_NONE,
     &level.ball_content[6].e[0][0],    3, 3,
     NULL, NULL, "7",                   NULL
   },
   {
-    ED_AREA_MAGIC_BALL_CONTENT_XPOS(7),        ED_AREA_MAGIC_BALL_CONTENT_YPOS(7),
+    ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
+    ED_AREA_MAGIC_BALL_CONTENT_XOFF(7),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(7),
     GADGET_ID_MAGIC_BALL_CONTENT_7,    GADGET_ID_NONE,
     &level.ball_content[7].e[0][0],    3, 3,
     NULL, NULL, "8",                   NULL
@@ -3177,6 +3190,7 @@ static struct
 
   {
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(5),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_ANDROID_CONTENT,         GADGET_ID_NONE,
     &level.android_clone_element[0],   MAX_ANDROID_ELEMENTS, 1,
     "elements:", NULL, NULL,           "elements android can clone"
@@ -3186,6 +3200,7 @@ static struct
 
   {
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(3),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_AMOEBA_CONTENT,          GADGET_ID_NONE,
     &level.amoeba_content,             1, 1,
     "content:", NULL, NULL,            "amoeba content"
@@ -3195,6 +3210,7 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(9),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_START_ELEMENT,           GADGET_ID_USE_START_ELEMENT,
     &level.start_element[0],           1, 1,
     NULL, NULL, NULL,                  "level start element"
@@ -3204,6 +3220,7 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(10),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_ARTWORK_ELEMENT,         GADGET_ID_USE_ARTWORK_ELEMENT,
     &level.artwork_element[0],         1, 1,
     NULL, NULL, NULL,                  "element for player artwork"
@@ -3213,6 +3230,7 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(11),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_EXPLOSION_ELEMENT,       GADGET_ID_USE_EXPLOSION_ELEMENT,
     &level.explosion_element[0],       1, 1,
     NULL, NULL, NULL,                  "element for player explosion"
@@ -3222,6 +3240,7 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_INVENTORY_CONTENT,       GADGET_ID_USE_INITIAL_INVENTORY,
     &level.initial_inventory_content[0][0], MAX_INITIAL_INVENTORY_SIZE, 1,
     NULL, NULL, NULL,                  "content for initial inventory"
@@ -3233,6 +3252,7 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_GRAPHIC,          GADGET_ID_CUSTOM_USE_GRAPHIC,
     &custom_element.gfx_element_initial,1, 1,
     NULL, NULL, NULL,                  "custom graphic element"
@@ -3244,6 +3264,7 @@ static struct
 
   {
     -1,                                        ED_AREA_3X3_SETTINGS_YPOS(10),
+    0,                                 ED_AREA_3X3_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CONTENT,          GADGET_ID_NONE, /* align three rows */
     &custom_element.content.e[0][0],   3, 3,
     "content:", NULL, NULL,            NULL
@@ -3253,12 +3274,14 @@ static struct
 
   {
     ED_AREA_1X1_SETTINGS_XPOS(1),      ED_AREA_1X1_SETTINGS_YPOS(3),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_MOVE_ENTER,       GADGET_ID_NONE,
     &custom_element.move_enter_element,        1, 1,
     "can dig:", " ", NULL,             "element that can be digged/collected"
   },
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(3),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_MOVE_LEAVE,       GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,
     &custom_element.move_leave_element,        1, 1,
     NULL, NULL, NULL,                  "element that will be left behind"
@@ -3270,6 +3293,7 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CHANGE_TARGET,    GADGET_ID_CUSTOM_CAN_CHANGE,
     &custom_element_change.target_element, 1, 1,
     NULL, "after/when:", NULL,         "new target element after change"
@@ -3279,6 +3303,7 @@ static struct
 
   {
     -1,                                        ED_AREA_3X3_SETTINGS_YPOS(9),
+    0,                                 ED_AREA_3X3_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CHANGE_CONTENT,   GADGET_ID_NONE, /* align three rows */
     &custom_element_change.target_content.e[0][0], 3, 3,
     NULL, NULL, NULL,                  "new extended elements after change"
@@ -3288,6 +3313,7 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(5),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CHANGE_TRIGGER,   GADGET_ID_CHANGE_OTHER_ACTION,
     &custom_element_change.initial_trigger_element, 1, 1,
     NULL, NULL, NULL,                  "other element triggering change"
@@ -3297,6 +3323,7 @@ static struct
 
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(13),
+    0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CHANGE_ACTION,    GADGET_ID_ACTION_ARG,
     &custom_element_change.action_element, 1, 1,
     NULL, NULL, NULL,                  "element used as action parameter"
@@ -3306,6 +3333,7 @@ static struct
 
   {
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(2),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_GROUP_CONTENT,           GADGET_ID_NONE,
     &group_element_info.element[0],    MAX_ELEMENTS_IN_GROUP, 1,
     "content:", NULL, NULL,            NULL
@@ -3314,7 +3342,8 @@ static struct
   /* ---------- random background (for random painting) -------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(-1),
+    -1,                                        ED_AREA_1X1_LSETTINGS_YPOS(1),
+    0,                                 ED_AREA_1X1_LSETTINGS_YOFF,
     GADGET_ID_RANDOM_BACKGROUND,       GADGET_ID_RANDOM_RESTRICTED,
     &random_placement_background_element, 1, 1,
     NULL, NULL, NULL,                  "random placement background"
@@ -5338,7 +5367,6 @@ static void CreateControlButtons()
     int graphic = controlbutton_info[i].graphic;
     struct XY *pos = controlbutton_info[i].pos;
     struct GraphicInfo *gd = &graphic_info[graphic];
-    Bitmap *gd_bitmap = gd->bitmap;
     int gd_x1 = gd->src_x;
     int gd_y1 = gd->src_y;
     int gd_x2 = gd->src_x + gd->pressed_xoffset;
@@ -5347,8 +5375,6 @@ static void CreateControlButtons()
     int gd_y1a = gd->src_y + gd->active_yoffset;
     int gd_x2a = gd->src_x + gd->active_xoffset + gd->pressed_xoffset;
     int gd_y2a = gd->src_y + gd->active_yoffset + gd->pressed_yoffset;
-    int width  = gd->width;
-    int height = gd->height;
     int x = pos->x;
     int y = pos->y;
     unsigned int event_mask;
@@ -5390,16 +5416,16 @@ static void CreateControlButtons()
                      GDI_INFO_TEXT, controlbutton_info[i].infotext,
                      GDI_X, x,
                      GDI_Y, y,
-                     GDI_WIDTH, width,
-                     GDI_HEIGHT, height,
+                     GDI_WIDTH, gd->width,
+                     GDI_HEIGHT, gd->height,
                      GDI_TYPE, type,
                      GDI_STATE, GD_BUTTON_UNPRESSED,
                      GDI_RADIO_NR, radio_button_nr,
                      GDI_CHECKED, checked,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
-                     GDI_ALT_DESIGN_UNPRESSED, gd_bitmap, gd_x1a, gd_y1a,
-                     GDI_ALT_DESIGN_PRESSED, gd_bitmap, gd_x2a, gd_y2a,
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+                     GDI_ALT_DESIGN_UNPRESSED, gd->bitmap, gd_x1a, gd_y1a,
+                     GDI_ALT_DESIGN_PRESSED, gd->bitmap, gd_x2a, gd_y2a,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                      GDI_CALLBACK_ACTION, HandleControlButtons,
@@ -5537,8 +5563,8 @@ static void CreateCounterButtons()
   for (i = 0; i < ED_NUM_COUNTERBUTTONS; i++)
   {
     int j;
-    int x = SX + counterbutton_info[i].x;      /* down count button */
-    int y = SY + counterbutton_info[i].y;
+    int x = SX + ED_SETTINGS_X(counterbutton_info[i].x); /* down count button */
+    int y = SY + ED_SETTINGS_Y(counterbutton_info[i].y);
 
     /* determine horizontal position to the right of specified gadget */
     if (counterbutton_info[i].gadget_id_align != GADGET_ID_NONE)
@@ -5551,14 +5577,13 @@ static void CreateCounterButtons()
 
     for (j = 0; j < 2; j++)
     {
-      Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
       struct GadgetInfo *gi;
       int id = (j == 0 ?
                counterbutton_info[i].gadget_id_down :
                counterbutton_info[i].gadget_id_up);
-      int gd_xoffset;
-      int gd_x, gd_y, gd_x1, gd_x2, gd_y1, gd_y2;
-      int x_size, y_size;
+      int graphic;
+      struct GraphicInfo *gd;
+      int gd_x1, gd_x2, gd_y1, gd_y2;
       unsigned int event_mask;
       char infotext[max_infotext_len + 1];
 
@@ -5566,12 +5591,9 @@ static void CreateCounterButtons()
 
       if (i == ED_COUNTER_ID_SELECT_LEVEL)
       {
-       int graphic = (j == 0 ?
-                      IMG_EDITOR_BUTTON_GFX_PREV_LEVEL :
-                      IMG_EDITOR_BUTTON_GFX_NEXT_LEVEL);
-       struct GraphicInfo *gd = &graphic_info[graphic];
-
-       gd_bitmap = gd->bitmap;
+       graphic = (j == 0 ?
+                  IMG_EDITOR_BUTTON_GFX_PREV_LEVEL :
+                  IMG_EDITOR_BUTTON_GFX_NEXT_LEVEL);
 
        event_mask |= GD_EVENT_RELEASED;
 
@@ -5585,25 +5607,21 @@ static void CreateCounterButtons()
          x = DX + editor.button.next_level.x;
          y = DY + editor.button.next_level.y;
        }
-
-       gd_x1 = gd->src_x;
-       gd_y1 = gd->src_y;
-       gd_x2 = gd->src_x + gd->pressed_xoffset;
-       gd_y2 = gd->src_y + gd->pressed_yoffset;
-       x_size = gd->width;
-       y_size = gd->height;
       }
       else
       {
-       gd_xoffset = (j == 0 ? ED_BUTTON_MINUS_XPOS : ED_BUTTON_PLUS_XPOS);
-       gd_x1 = DOOR_GFX_PAGEX4 + gd_xoffset;
-       gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset;
-       gd_y1 = DOOR_GFX_PAGEY1 + ED_BUTTON_COUNT_YPOS;
-       gd_y2 = gd_y1;
-       x_size = ED_BUTTON_COUNT_XSIZE;
-       y_size = ED_BUTTON_COUNT_YSIZE;
+       graphic = (j == 0 ?
+                  IMG_EDITOR_COUNTER_DOWN :
+                  IMG_EDITOR_COUNTER_UP);
       }
 
+      gd = &graphic_info[graphic];
+
+      gd_x1 = gd->src_x;
+      gd_y1 = gd->src_y;
+      gd_x2 = gd->src_x + gd->pressed_xoffset;
+      gd_y2 = gd->src_y + gd->pressed_yoffset;
+
       sprintf(infotext, "%s counter value by 1, 5 or 10",
              (j == 0 ? "decrease" : "increase"));
 
@@ -5612,12 +5630,12 @@ static void CreateCounterButtons()
                        GDI_INFO_TEXT, infotext,
                        GDI_X, x,
                        GDI_Y, y,
-                       GDI_WIDTH, x_size,
-                       GDI_HEIGHT, y_size,
+                       GDI_WIDTH, gd->width,
+                       GDI_HEIGHT, gd->height,
                        GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
                        GDI_STATE, GD_BUTTON_UNPRESSED,
-                       GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
-                       GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
+                       GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                       GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
                        GDI_EVENT_MASK, event_mask,
                        GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                        GDI_CALLBACK_ACTION, HandleCounterButtons,
@@ -5636,36 +5654,33 @@ static void CreateCounterButtons()
       {
        int font_type = FONT_INPUT_1;
        int font_type_active = FONT_INPUT_1_ACTIVE;
-       int gd_width = ED_WIN_COUNT_XSIZE;
-       int border_size = ED_BORDER_SIZE;
 
        id = counterbutton_info[i].gadget_id_text;
+
        event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
 
        if (i == ED_COUNTER_ID_SELECT_LEVEL)
        {
-         int graphic = IMG_EDITOR_INPUT_GFX_LEVEL_NUMBER;
-         struct GraphicInfo *gd = &graphic_info[graphic];
+         graphic = IMG_EDITOR_INPUT_GFX_LEVEL_NUMBER;
 
-         gd_bitmap = gd->bitmap;
+         font_type = FONT_LEVEL_NUMBER;
+         font_type_active = FONT_LEVEL_NUMBER_ACTIVE;
 
          x = DX + editor.input.level_number.x;
          y = DY + editor.input.level_number.y;
-
-         gd_x = gd->src_x;
-         gd_y = gd->src_y;
-         gd_width = gd->width;
-         border_size = gd->border_size;
-
-         font_type = FONT_LEVEL_NUMBER;
-         font_type_active = FONT_LEVEL_NUMBER_ACTIVE;
        }
        else
        {
-         gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS;
-         gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS;
+         graphic = IMG_EDITOR_COUNTER_INPUT;
        }
 
+       gd = &graphic_info[graphic];
+
+       gd_x1 = gd->src_x;
+       gd_y1 = gd->src_y;
+       gd_x2 = gd->src_x + gd->active_xoffset;
+       gd_y2 = gd->src_y + gd->active_yoffset;
+
        gi = CreateGadget(GDI_CUSTOM_ID, id,
                          GDI_CUSTOM_TYPE_ID, i,
                          GDI_INFO_TEXT, "enter counter value",
@@ -5678,10 +5693,10 @@ static void CreateCounterButtons()
                          GDI_TEXT_SIZE, 3,     /* minimal counter text size */
                          GDI_TEXT_FONT, font_type,
                          GDI_TEXT_FONT_ACTIVE, font_type_active,
-                         GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x, gd_y,
-                         GDI_DESIGN_PRESSED, gd_bitmap, gd_x, gd_y,
-                         GDI_BORDER_SIZE, border_size, border_size,
-                         GDI_DESIGN_WIDTH, gd_width,
+                         GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                         GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+                         GDI_BORDER_SIZE, gd->border_size, gd->border_size,
+                         GDI_DESIGN_WIDTH, gd->width,
                          GDI_EVENT_MASK, event_mask,
                          GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                          GDI_CALLBACK_ACTION, HandleCounterButtons,
@@ -5713,8 +5728,8 @@ static void CreateDrawingAreas()
     struct GadgetInfo *gi;
     unsigned int event_mask;
     int id = drawingarea_info[i].gadget_id;
-    int x = SX + drawingarea_info[i].x;
-    int y = SY + drawingarea_info[i].y;
+    int x = SX + ED_AREA_SETTINGS_X(drawingarea_info[i]);
+    int y = SY + ED_AREA_SETTINGS_Y(drawingarea_info[i]);
     int area_xsize = drawingarea_info[i].area_xsize;
     int area_ysize = drawingarea_info[i].area_ysize;
 
@@ -5754,22 +5769,39 @@ static void CreateDrawingAreas()
 
 static void CreateTextInputGadgets()
 {
+  struct GraphicInfo *gd = &graphic_info[IMG_EDITOR_INPUT_TEXT];
+  int border_size = gd->border_size;
+  int font_nr = FONT_INPUT_1;
+  int font_height = getFontHeight(font_nr);
+  int xoffset = TILEX + ED_ELEMENT_BORDER + 3 * border_size;
+  int yoffset = (TILEY - font_height) / 2;
   int max_infotext_len = getMaxInfoTextLength();
   int i;
 
   for (i = 0; i < ED_NUM_TEXTINPUT; i++)
   {
-    Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
-    int gd_x, gd_y;
+    int gd_x1 = gd->src_x;
+    int gd_y1 = gd->src_y;
+    int gd_x2 = gd->src_x + gd->active_xoffset;
+    int gd_y2 = gd->src_y + gd->active_yoffset;
     struct GadgetInfo *gi;
     unsigned int event_mask;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = textinput_info[i].gadget_id;
+    int x, y;
 
-    event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
+    if (i == ED_TEXTINPUT_ID_ELEMENT_NAME)
+    {
+      x = ED_ELEMENT_SETTINGS_ELEM_XPOS + xoffset - border_size;
+      y = ED_ELEMENT_SETTINGS_ELEM_YPOS + yoffset - border_size;
+    }
+    else
+    {
+      x = ED_SETTINGS_X(textinput_info[i].x);
+      y = ED_SETTINGS_Y(textinput_info[i].y);
+    }
 
-    gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS;
-    gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS;
+    event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
 
     sprintf(infotext, "Enter %s", textinput_info[i].infotext);
     infotext[max_infotext_len] = '\0';
@@ -5777,17 +5809,17 @@ static void CreateTextInputGadgets()
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
                      GDI_INFO_TEXT, infotext,
-                     GDI_X, SX + textinput_info[i].x,
-                     GDI_Y, SY + textinput_info[i].y,
+                     GDI_X, SX + x,
+                     GDI_Y, SY + y,
                      GDI_TYPE, GD_TYPE_TEXT_INPUT_ALPHANUMERIC,
                      GDI_TEXT_VALUE, textinput_info[i].value,
                      GDI_TEXT_SIZE, textinput_info[i].size,
                      GDI_TEXT_FONT, FONT_INPUT_1,
                      GDI_TEXT_FONT_ACTIVE, FONT_INPUT_1_ACTIVE,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x, gd_y,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x, gd_y,
-                     GDI_BORDER_SIZE, ED_BORDER_SIZE, ED_BORDER_SIZE,
-                     GDI_DESIGN_WIDTH, ED_WIN_COUNT_XSIZE,
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+                     GDI_BORDER_SIZE, gd->border_size, gd->border_size,
+                     GDI_DESIGN_WIDTH, gd->width,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                      GDI_CALLBACK_ACTION, HandleTextInputGadgets,
@@ -5807,8 +5839,11 @@ static void CreateTextAreaGadgets()
 
   for (i = 0; i < ED_NUM_TEXTAREAS; i++)
   {
-    Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
-    int gd_x, gd_y;
+    struct GraphicInfo *gd = &graphic_info[IMG_EDITOR_INPUT_TEXTAREA];
+    int gd_x1 = gd->src_x;
+    int gd_y1 = gd->src_y;
+    int gd_x2 = gd->src_x + gd->active_xoffset;
+    int gd_y2 = gd->src_y + gd->active_yoffset;
     struct GadgetInfo *gi;
     unsigned int event_mask;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
@@ -5818,25 +5853,22 @@ static void CreateTextAreaGadgets()
 
     event_mask = GD_EVENT_TEXT_LEAVING;
 
-    gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS;
-    gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS;
-
     sprintf(infotext, "Enter %s", textarea_info[i].infotext);
     infotext[max_infotext_len] = '\0';
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
                      GDI_INFO_TEXT, infotext,
-                     GDI_X, SX + textarea_info[i].x,
-                     GDI_Y, SY + textarea_info[i].y,
+                     GDI_X, SX + ED_SETTINGS_X(textarea_info[i].x),
+                     GDI_Y, SY + ED_SETTINGS_Y(textarea_info[i].y),
                      GDI_TYPE, GD_TYPE_TEXT_AREA,
                      GDI_AREA_SIZE, area_xsize, area_ysize,
                      GDI_TEXT_FONT, FONT_INPUT_1,
                      GDI_TEXT_FONT_ACTIVE, FONT_INPUT_1_ACTIVE,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x, gd_y,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x, gd_y,
-                     GDI_BORDER_SIZE, ED_BORDER_SIZE, ED_BORDER_SIZE,
-                     GDI_DESIGN_WIDTH, ED_WIN_COUNT_XSIZE,
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+                     GDI_BORDER_SIZE, gd->border_size, gd->border_size,
+                     GDI_DESIGN_WIDTH, gd->width,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                      GDI_CALLBACK_ACTION, HandleTextAreaGadgets,
@@ -5856,14 +5888,19 @@ static void CreateSelectboxGadgets()
 
   for (i = 0; i < ED_NUM_SELECTBOX; i++)
   {
-    Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
-    int gd_x, gd_y;
+    struct GraphicInfo *gd = &graphic_info[IMG_EDITOR_SELECTBOX_INPUT];
+    struct GraphicInfo *gd2 = &graphic_info[IMG_EDITOR_SELECTBOX_BUTTON];
+    int gd_x1 = gd->src_x;
+    int gd_y1 = gd->src_y;
+    int gd_x2 = gd->src_x + gd->active_xoffset;
+    int gd_y2 = gd->src_y + gd->active_yoffset;
+    int selectbox_button_xsize = gd2->width;
     struct GadgetInfo *gi;
     unsigned int event_mask;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = selectbox_info[i].gadget_id;
-    int x = SX + selectbox_info[i].x;
-    int y = SY + selectbox_info[i].y;
+    int x = SX + ED_SETTINGS_X(selectbox_info[i].x);
+    int y = SY + ED_SETTINGS_Y(selectbox_info[i].y);
 
     if (selectbox_info[i].size == -1)  /* dynamically determine size */
     {
@@ -5882,9 +5919,6 @@ static void CreateSelectboxGadgets()
     event_mask = GD_EVENT_RELEASED |
       GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
 
-    gd_x = DOOR_GFX_PAGEX4 + ED_SELECTBOX_XPOS;
-    gd_y = DOOR_GFX_PAGEY1 + ED_SELECTBOX_YPOS;
-
     /* determine horizontal position to the right of specified gadget */
     if (selectbox_info[i].gadget_id_align != GADGET_ID_NONE)
       x = (right_gadget_border[selectbox_info[i].gadget_id_align] +
@@ -5909,11 +5943,11 @@ static void CreateSelectboxGadgets()
                      GDI_TEXT_FONT, FONT_INPUT_1,
                      GDI_TEXT_FONT_ACTIVE, FONT_INPUT_1_ACTIVE,
                      GDI_TEXT_FONT_UNSELECTABLE, FONT_TEXT_1,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x, gd_y,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x, gd_y,
-                     GDI_BORDER_SIZE, ED_BORDER_SIZE, ED_BORDER_SIZE,
-                     GDI_BORDER_SIZE_SELECTBUTTON, ED_SELECTBOX_BUTTON_XSIZE,
-                     GDI_DESIGN_WIDTH, ED_WIN_COUNT_XSIZE,
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+                     GDI_BORDER_SIZE, gd->border_size, gd->border_size,
+                     GDI_BORDER_SIZE_SELECTBUTTON, selectbox_button_xsize,
+                     GDI_DESIGN_WIDTH, gd->width,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                      GDI_CALLBACK_ACTION, HandleSelectboxGadgets,
@@ -5935,12 +5969,26 @@ static void CreateTextbuttonGadgets()
 
   for (i = 0; i < ED_NUM_TEXTBUTTONS; i++)
   {
-    Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
-    int gd_x1, gd_x2, gd_y1, gd_y2;
+    int id = textbutton_info[i].gadget_id;
+    int is_tab_button =
+      ((id >= GADGET_ID_LEVELINFO_LEVEL && id <= GADGET_ID_LEVELINFO_EDITOR) ||
+       (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE));
+    int graphic =
+      (is_tab_button ? IMG_EDITOR_TABBUTTON : IMG_EDITOR_TEXTBUTTON);
+    int gadget_distance =
+      (is_tab_button ? ED_GADGET_DISTANCE : ED_GADGET_TEXT_DISTANCE);
+    struct GraphicInfo *gd = &graphic_info[graphic];
+    int gd_x1 = gd->src_x;
+    int gd_y1 = gd->src_y;
+    int gd_x2 = gd->src_x + gd->pressed_xoffset;
+    int gd_y2 = gd->src_y + gd->pressed_yoffset;
+    int gd_x1a = gd->src_x + gd->active_xoffset;
+    int gd_y1a = gd->src_y + gd->active_yoffset;
+    int border_xsize = gd->border_size + gd->draw_xoffset;
+    int border_ysize = gd->border_size;
     struct GadgetInfo *gi;
     unsigned int event_mask;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
-    int id = textbutton_info[i].gadget_id;
     int x = SX + textbutton_info[i].x;
     int y = SY + textbutton_info[i].y;
 
@@ -5949,29 +5997,19 @@ static void CreateTextbuttonGadgets()
 
     event_mask = GD_EVENT_RELEASED;
 
-    if ((id >= GADGET_ID_LEVELINFO_LEVEL && id <= GADGET_ID_LEVELINFO_EDITOR) ||
-       (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE))
-    {
-      gd_x1 = DOOR_GFX_PAGEX4 + ED_TEXTBUTTON_TAB_XPOS;
-      gd_x2 = DOOR_GFX_PAGEX3 + ED_TEXTBUTTON_TAB_XPOS;
-      gd_y1 = DOOR_GFX_PAGEY1 + ED_TEXTBUTTON_TAB_YPOS;
-      gd_y2 = DOOR_GFX_PAGEY1 + ED_TEXTBUTTON_TAB_INACTIVE_YPOS;
-    }
-    else
-    {
-      gd_x1 = DOOR_GFX_PAGEX4 + ED_TEXTBUTTON_XPOS;
-      gd_x2 = DOOR_GFX_PAGEX3 + ED_TEXTBUTTON_XPOS;
-      gd_y1 = DOOR_GFX_PAGEY1 + ED_TEXTBUTTON_YPOS;
-      gd_y2 = DOOR_GFX_PAGEY1 + ED_TEXTBUTTON_INACTIVE_YPOS;
-    }
-
     sprintf(infotext, "%s", textbutton_info[i].infotext);
     infotext[max_infotext_len] = '\0';
 
     /* determine horizontal position to the right of specified gadget */
     if (textbutton_info[i].gadget_id_align != GADGET_ID_NONE)
-      x = (right_gadget_border[textbutton_info[i].gadget_id_align] +
-          ED_GADGET_TEXT_DISTANCE);
+    {
+      int gadget_id_align = textbutton_info[i].gadget_id_align;
+
+      x = right_gadget_border[gadget_id_align] + gadget_distance;
+
+      if (textbutton_info[i].y == -1)
+       y = level_editor_gadget[gadget_id_align]->y;
+    }
 
     /* determine horizontal offset for leading text */
     if (textbutton_info[i].text_left != NULL)
@@ -5985,13 +6023,13 @@ static void CreateTextbuttonGadgets()
                      GDI_TYPE, GD_TYPE_TEXT_BUTTON,
                      GDI_TEXT_VALUE, textbutton_info[i].text,
                      GDI_TEXT_SIZE, textbutton_info[i].size,
-                     GDI_TEXT_FONT, FONT_INPUT_2_ACTIVE,
-                     GDI_TEXT_FONT_ACTIVE, FONT_INPUT_2,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y1,
-                     GDI_ALT_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y2,
-                     GDI_BORDER_SIZE, ED_BORDER_TEXT_XSIZE, ED_BORDER_SIZE,
-                     GDI_DESIGN_WIDTH, ED_WIN_COUNT_XSIZE,
+                     GDI_TEXT_FONT, FONT_INPUT_2,
+                     GDI_TEXT_FONT_ACTIVE, FONT_INPUT_2_ACTIVE,
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+                     GDI_ALT_DESIGN_UNPRESSED, gd->bitmap, gd_x1a, gd_y1a,
+                     GDI_BORDER_SIZE, border_xsize, border_ysize,
+                     GDI_DESIGN_WIDTH, gd->width,
                      GDI_DECORATION_SHIFTING, 1, 1,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
@@ -6009,7 +6047,6 @@ static void CreateTextbuttonGadgets()
 
 static void CreateGraphicbuttonGadgets()
 {
-  Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
   struct GadgetInfo *gi;
   unsigned int event_mask;
   int i;
@@ -6018,27 +6055,16 @@ static void CreateGraphicbuttonGadgets()
   for (i = 0; i < ED_NUM_GRAPHICBUTTONS; i++)
   {
     int id = graphicbutton_info[i].gadget_id;
-    int gd_x1, gd_x2, gd_y1, gd_y2;
-    int x = SX + graphicbutton_info[i].x;
-    int y = SY + graphicbutton_info[i].y;
+    int x = SX + ED_SETTINGS_X(graphicbutton_info[i].x);
+    int y = SY + ED_SETTINGS_Y(graphicbutton_info[i].y);
+    struct GraphicInfo *gd = &graphic_info[graphicbutton_info[i].graphic];
+    int gd_x1 = gd->src_x;
+    int gd_y1 = gd->src_y;
+    int gd_x2 = gd->src_x + gd->pressed_xoffset;
+    int gd_y2 = gd->src_y + gd->pressed_yoffset;
 
     event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
 
-    if (i <= ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE)
-    {
-      gd_x1 = DOOR_GFX_PAGEX4 + graphicbutton_info[i].gd_x;
-      gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
-      gd_x2 = DOOR_GFX_PAGEX3 + graphicbutton_info[i].gd_x;
-      gd_y2 = gd_y1;
-    }
-    else       /* (i <= ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE) */
-    {
-      gd_x1 = DOOR_GFX_PAGEX6 + graphicbutton_info[i].gd_x;
-      gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
-      gd_x2 = gd_x1 - ED_BUTTON_COUNT_XSIZE;
-      gd_y2 = gd_y1;
-    }
-
     /* determine horizontal position to the right of specified gadget */
     if (graphicbutton_info[i].gadget_id_align != GADGET_ID_NONE)
       x = (right_gadget_border[graphicbutton_info[i].gadget_id_align] +
@@ -6053,12 +6079,12 @@ static void CreateGraphicbuttonGadgets()
                      GDI_INFO_TEXT, graphicbutton_info[i].infotext,
                      GDI_X, x,
                      GDI_Y, y,
-                     GDI_WIDTH, graphicbutton_info[i].width,
-                     GDI_HEIGHT, graphicbutton_info[i].height,
+                     GDI_WIDTH, gd->width,
+                     GDI_HEIGHT, gd->height,
                      GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
                      GDI_STATE, GD_BUTTON_UNPRESSED,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                      GDI_CALLBACK_ACTION, HandleGraphicbuttonGadgets,
@@ -6190,30 +6216,28 @@ static void CreateScrollbarGadgets()
 
 static void CreateCheckbuttonGadgets()
 {
-  Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
   struct GadgetInfo *gi;
   unsigned int event_mask;
-  int gd_x1, gd_x2, gd_x3, gd_x4, gd_y;
   int i;
 
   event_mask = GD_EVENT_PRESSED;
 
-  gd_x1 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_UNCHECKED_XPOS;
-  gd_x2 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_UNCHECKED_XPOS;
-  gd_x3 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_CHECKED_XPOS;
-  gd_x4 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_CHECKED_XPOS;
-  gd_y  = DOOR_GFX_PAGEY1 + ED_RADIOBUTTON_YPOS;
-
   for (i = 0; i < ED_NUM_CHECKBUTTONS; i++)
   {
     int id = checkbutton_info[i].gadget_id;
-    int x = SX + checkbutton_info[i].x;
-    int y = SY + checkbutton_info[i].y;
-
-    if (id == GADGET_ID_STICK_ELEMENT)
-      gd_y  = DOOR_GFX_PAGEY1 + ED_STICKYBUTTON_YPOS;
-    else
-      gd_y  = DOOR_GFX_PAGEY1 + ED_CHECKBUTTON_YPOS;
+    int graphic = (id == GADGET_ID_STICK_ELEMENT ? IMG_EDITOR_STICKYBUTTON :
+                  IMG_EDITOR_CHECKBOX);
+    struct GraphicInfo *gd = &graphic_info[graphic];
+    int gd_x1 = gd->src_x;
+    int gd_y1 = gd->src_y;
+    int gd_x2 = gd->src_x + gd->pressed_xoffset;
+    int gd_y2 = gd->src_y + gd->pressed_yoffset;
+    int gd_x1a = gd->src_x + gd->active_xoffset;
+    int gd_y1a = gd->src_y + gd->active_yoffset;
+    int gd_x2a = gd->src_x + gd->active_xoffset + gd->pressed_xoffset;
+    int gd_y2a = gd->src_y + gd->active_yoffset + gd->pressed_yoffset;
+    int x = SX + ED_SETTINGS_X(checkbutton_info[i].x);
+    int y = SY + ED_SETTINGS_Y(checkbutton_info[i].y);
 
     /* determine horizontal position to the right of specified gadget */
     if (checkbutton_info[i].gadget_id_align != GADGET_ID_NONE)
@@ -6229,14 +6253,14 @@ static void CreateCheckbuttonGadgets()
                      GDI_INFO_TEXT, checkbutton_info[i].infotext,
                      GDI_X, x,
                      GDI_Y, y,
-                     GDI_WIDTH, ED_CHECKBUTTON_XSIZE,
-                     GDI_HEIGHT, ED_CHECKBUTTON_YSIZE,
+                     GDI_WIDTH, gd->width,
+                     GDI_HEIGHT, gd->height,
                      GDI_TYPE, GD_TYPE_CHECK_BUTTON,
                      GDI_CHECKED, *checkbutton_info[i].value,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y,
-                     GDI_ALT_DESIGN_UNPRESSED, gd_bitmap, gd_x3, gd_y,
-                     GDI_ALT_DESIGN_PRESSED, gd_bitmap, gd_x4, gd_y,
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+                     GDI_ALT_DESIGN_UNPRESSED, gd->bitmap, gd_x1a, gd_y1a,
+                     GDI_ALT_DESIGN_PRESSED, gd->bitmap, gd_x2a, gd_y2a,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                      GDI_CALLBACK_ACTION, HandleCheckbuttons,
@@ -6253,25 +6277,26 @@ static void CreateCheckbuttonGadgets()
 
 static void CreateRadiobuttonGadgets()
 {
-  Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
+  struct GraphicInfo *gd = &graphic_info[IMG_EDITOR_RADIOBUTTON];
+  int gd_x1 = gd->src_x;
+  int gd_y1 = gd->src_y;
+  int gd_x2 = gd->src_x + gd->pressed_xoffset;
+  int gd_y2 = gd->src_y + gd->pressed_yoffset;
+  int gd_x1a = gd->src_x + gd->active_xoffset;
+  int gd_y1a = gd->src_y + gd->active_yoffset;
+  int gd_x2a = gd->src_x + gd->active_xoffset + gd->pressed_xoffset;
+  int gd_y2a = gd->src_y + gd->active_yoffset + gd->pressed_yoffset;
   struct GadgetInfo *gi;
   unsigned int event_mask;
-  int gd_x1, gd_x2, gd_x3, gd_x4, gd_y;
   int i;
 
   event_mask = GD_EVENT_PRESSED;
 
-  gd_x1 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_UNCHECKED_XPOS;
-  gd_x2 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_UNCHECKED_XPOS;
-  gd_x3 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_CHECKED_XPOS;
-  gd_x4 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_CHECKED_XPOS;
-  gd_y  = DOOR_GFX_PAGEY1 + ED_RADIOBUTTON_YPOS;
-
   for (i = 0; i < ED_NUM_RADIOBUTTONS; i++)
   {
     int id = radiobutton_info[i].gadget_id;
-    int x = SX + radiobutton_info[i].x;
-    int y = SY + radiobutton_info[i].y;
+    int x = SX + ED_SETTINGS_X(radiobutton_info[i].x);
+    int y = SY + ED_SETTINGS_Y(radiobutton_info[i].y);
 
     int checked =
       (*radiobutton_info[i].value == radiobutton_info[i].checked_value);
@@ -6290,15 +6315,15 @@ static void CreateRadiobuttonGadgets()
                      GDI_INFO_TEXT, radiobutton_info[i].infotext,
                      GDI_X, x,
                      GDI_Y, y,
-                     GDI_WIDTH, ED_CHECKBUTTON_XSIZE,
-                     GDI_HEIGHT, ED_CHECKBUTTON_YSIZE,
+                     GDI_WIDTH, gd->width,
+                     GDI_HEIGHT, gd->height,
                      GDI_TYPE, GD_TYPE_RADIO_BUTTON,
                      GDI_RADIO_NR, radiobutton_info[i].radio_button_nr,
                      GDI_CHECKED, checked,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y,
-                     GDI_ALT_DESIGN_UNPRESSED, gd_bitmap, gd_x3, gd_y,
-                     GDI_ALT_DESIGN_PRESSED, gd_bitmap, gd_x4, gd_y,
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+                     GDI_ALT_DESIGN_UNPRESSED, gd->bitmap, gd_x1a, gd_y1a,
+                     GDI_ALT_DESIGN_PRESSED, gd->bitmap, gd_x2a, gd_y2a,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                      GDI_CALLBACK_ACTION, HandleRadiobuttons,
@@ -6376,6 +6401,8 @@ void FreeLevelEditorGadgets()
 
 static void MapCounterButtons(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   int gadget_id_down = counterbutton_info[id].gadget_id_down;
   int gadget_id_text = counterbutton_info[id].gadget_id_text;
   int gadget_id_up   = counterbutton_info[id].gadget_id_up;
@@ -6384,8 +6411,8 @@ static void MapCounterButtons(int id)
   struct GadgetInfo *gi_up   = level_editor_gadget[gadget_id_up];
   int xoffset_left = getTextWidthForGadget(counterbutton_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
-  int yoffset_above = MINI_TILEX + ED_GADGET_DISTANCE;
-  int yoffset = ED_BORDER_SIZE;
+  int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE;
+  int yoffset = (gi_down->height - font_height) / 2;
   int x_left = gi_down->x - xoffset_left;
   int x_right; /* set after gadget position was modified */
   int y_above = gi_down->y - yoffset_above;
@@ -6405,22 +6432,25 @@ static void MapCounterButtons(int id)
   if (id >= ED_COUNTER_ID_ELEMENT_VALUE1 &&
       id <= ED_COUNTER_ID_ELEMENT_VALUE4)
   {
-    ModifyGadget(gi_down, GDI_Y, SY + counterbutton_info[id].y, GDI_END);
-    ModifyGadget(gi_text, GDI_Y, SY + counterbutton_info[id].y, GDI_END);
-    ModifyGadget(gi_up,   GDI_Y, SY + counterbutton_info[id].y, GDI_END);
+    ModifyGadget(gi_down, GDI_Y,
+                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+    ModifyGadget(gi_text, GDI_Y,
+                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+    ModifyGadget(gi_up,   GDI_Y,
+                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
   }
 
   /* vertical position might have changed after setting position above */
   y = gi_up->y + yoffset;
 
   if (counterbutton_info[id].text_above)
-    DrawText(x, y_above, counterbutton_info[id].text_above, FONT_TEXT_1);
+    DrawText(x, y_above, counterbutton_info[id].text_above, font_nr);
 
   if (counterbutton_info[id].text_left)
-    DrawText(x_left, y, counterbutton_info[id].text_left, FONT_TEXT_1);
+    DrawText(x_left, y, counterbutton_info[id].text_left, font_nr);
 
   if (counterbutton_info[id].text_right)
-    DrawText(x_right, y, counterbutton_info[id].text_right, FONT_TEXT_1);
+    DrawText(x_right, y, counterbutton_info[id].text_right, font_nr);
 
   MapGadget(gi_down);
   MapGadget(gi_text);
@@ -6455,25 +6485,27 @@ static void MapControlButtons()
 
 static void MapDrawingArea(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
   int area_xsize = gi->drawing.area_xsize;
   int area_ysize = gi->drawing.area_ysize;
-  int xoffset_left= getTextWidthForDrawingArea(drawingarea_info[id].text_left);
-  int xoffset_below= getTextWidth(drawingarea_info[id].text_below,FONT_TEXT_1);
+  int xoffset_left = getTextWidthForDrawingArea(drawingarea_info[id].text_left);
+  int xoffset_below = getTextWidth(drawingarea_info[id].text_below, font_nr);
   int x_left  = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + ED_DRAWINGAREA_TEXT_DISTANCE;
   int x_below = gi->x + (gi->width - xoffset_below) / 2;
-  int y_side  = gi->y + (gi->height - getFontHeight(FONT_TEXT_1)) / 2;
+  int y_side  = gi->y + (gi->height - font_height) / 2;
   int y_below = gi->y + gi->height + ED_DRAWINGAREA_TEXT_DISTANCE;
 
   if (drawingarea_info[id].text_left)
-    DrawText(x_left, y_side, drawingarea_info[id].text_left, FONT_TEXT_1);
+    DrawText(x_left, y_side, drawingarea_info[id].text_left, font_nr);
 
   if (drawingarea_info[id].text_right)
-    DrawText(x_right, y_side, drawingarea_info[id].text_right, FONT_TEXT_1);
+    DrawText(x_right, y_side, drawingarea_info[id].text_right, font_nr);
 
   if (drawingarea_info[id].text_below)
-    DrawText(x_below, y_below, drawingarea_info[id].text_below, FONT_TEXT_1);
+    DrawText(x_below, y_below, drawingarea_info[id].text_below, font_nr);
 
   if (id != ED_DRAWING_ID_DRAWING_LEVEL)
   {
@@ -6488,14 +6520,15 @@ static void MapDrawingArea(int id)
 
 static void MapTextInputGadget(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[textinput_info[id].gadget_id];
-  int xoffset_above = 0;
-  int yoffset_above = -(MINI_TILEX + ED_GADGET_DISTANCE);
-  int x_above = textinput_info[id].x + xoffset_above;
-  int y_above = textinput_info[id].y + yoffset_above;
+  int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE;
+  int x_above = ED_SETTINGS_X(textinput_info[id].x);
+  int y_above = ED_SETTINGS_Y(textinput_info[id].y) - yoffset_above;
 
   if (textinput_info[id].text_above)
-    DrawTextS(x_above, y_above, FONT_TEXT_1, textinput_info[id].text_above);
+    DrawTextS(x_above, y_above, font_nr, textinput_info[id].text_above);
 
   ModifyGadget(gi, GDI_TEXT_VALUE, textinput_info[id].value, GDI_END);
 
@@ -6504,14 +6537,15 @@ static void MapTextInputGadget(int id)
 
 static void MapTextAreaGadget(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[textarea_info[id].gadget_id];
-  int xoffset_above = 0;
-  int yoffset_above = -(MINI_TILEX + ED_GADGET_DISTANCE);
-  int x_above = textarea_info[id].x + xoffset_above;
-  int y_above = textarea_info[id].y + yoffset_above;
+  int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE;
+  int x_above = ED_SETTINGS_X(textarea_info[id].x);
+  int y_above = ED_SETTINGS_Y(textarea_info[id].y) - yoffset_above;
 
   if (textarea_info[id].text_above)
-    DrawTextS(x_above, y_above, FONT_TEXT_1, textarea_info[id].text_above);
+    DrawTextS(x_above, y_above, font_nr, textarea_info[id].text_above);
 
   ModifyGadget(gi, GDI_TEXT_VALUE, textarea_info[id].value, GDI_END);
 
@@ -6520,19 +6554,21 @@ static void MapTextAreaGadget(int id)
 
 static void MapSelectboxGadget(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id];
   int xoffset_left = getTextWidthForGadget(selectbox_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
-  int yoffset = ED_BORDER_SIZE;
+  int yoffset = (gi->height - font_height) / 2;
   int x_left = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + xoffset_right;
   int y = gi->y + yoffset;
 
   if (selectbox_info[id].text_left)
-    DrawText(x_left, y, selectbox_info[id].text_left, FONT_TEXT_1);
+    DrawText(x_left, y, selectbox_info[id].text_left, font_nr);
 
   if (selectbox_info[id].text_right)
-    DrawText(x_right, y, selectbox_info[id].text_right, FONT_TEXT_1);
+    DrawText(x_right, y, selectbox_info[id].text_right, font_nr);
 
   ModifyEditorSelectboxValue(id, *selectbox_info[id].value);
 
@@ -6541,10 +6577,12 @@ static void MapSelectboxGadget(int id)
 
 static void MapTextbuttonGadget(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[textbutton_info[id].gadget_id];
   int xoffset_left = getTextWidthForGadget(textbutton_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
-  int yoffset = ED_BORDER_SIZE;
+  int yoffset = (gi->height - font_height) / 2;
   int x_left = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + xoffset_right;
   int y = gi->y + yoffset;
@@ -6555,39 +6593,43 @@ static void MapTextbuttonGadget(int id)
     return;
 
   if (textbutton_info[id].text_left)
-    DrawText(x_left, y, textbutton_info[id].text_left, FONT_TEXT_1);
+    DrawText(x_left, y, textbutton_info[id].text_left, font_nr);
 
   if (textbutton_info[id].text_right)
-    DrawText(x_right, y, textbutton_info[id].text_right, FONT_TEXT_1);
+    DrawText(x_right, y, textbutton_info[id].text_right, font_nr);
 
   MapGadget(gi);
 }
 
 static void MapGraphicbuttonGadget(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi= level_editor_gadget[graphicbutton_info[id].gadget_id];
   int xoffset_left = getTextWidthForGadget(graphicbutton_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
-  int yoffset = ED_BORDER_SIZE;
+  int yoffset = (gi->height - font_height) / 2;
   int x_left = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + xoffset_right;
   int y = gi->y + yoffset;
 
   if (graphicbutton_info[id].text_left)
-    DrawText(x_left, y, graphicbutton_info[id].text_left, FONT_TEXT_1);
+    DrawText(x_left, y, graphicbutton_info[id].text_left, font_nr);
 
   if (graphicbutton_info[id].text_right)
-    DrawText(x_right, y, graphicbutton_info[id].text_right, FONT_TEXT_1);
+    DrawText(x_right, y, graphicbutton_info[id].text_right, font_nr);
 
   MapGadget(gi);
 }
 
 static void MapRadiobuttonGadget(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[radiobutton_info[id].gadget_id];
   int xoffset_left = getTextWidthForGadget(checkbutton_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
-  int yoffset = ED_BORDER_SIZE;
+  int yoffset = (gi->height - font_height) / 2;
   int x_left = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + xoffset_right;
   int y = gi->y + yoffset;
@@ -6595,10 +6637,10 @@ static void MapRadiobuttonGadget(int id)
     (*radiobutton_info[id].value == radiobutton_info[id].checked_value);
 
   if (radiobutton_info[id].text_left)
-    DrawText(x_left, y, radiobutton_info[id].text_left, FONT_TEXT_1);
+    DrawText(x_left, y, radiobutton_info[id].text_left, font_nr);
 
   if (radiobutton_info[id].text_right)
-    DrawText(x_right, y, radiobutton_info[id].text_right, FONT_TEXT_1);
+    DrawText(x_right, y, radiobutton_info[id].text_right, font_nr);
 
   ModifyGadget(gi, GDI_CHECKED, checked, GDI_END);
 
@@ -6607,26 +6649,28 @@ static void MapRadiobuttonGadget(int id)
 
 static void MapCheckbuttonGadget(int id)
 {
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[checkbutton_info[id].gadget_id];
   int xoffset_left = getTextWidthForGadget(checkbutton_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
-  int yoffset = ED_BORDER_SIZE;
+  int yoffset = (gi->height - font_height) / 2;
   int x_left, x_right, y;      /* set after gadget position was modified */
 
   /* set position for gadgets with dynamically determined position */
   if (checkbutton_info[id].x != -1)    /* do not change dynamic positions */
-    ModifyGadget(gi, GDI_X, SX + checkbutton_info[id].x, GDI_END);
-  ModifyGadget(gi, GDI_Y, SY + checkbutton_info[id].y, GDI_END);
+    ModifyGadget(gi, GDI_X, SX + ED_SETTINGS_X(checkbutton_info[id].x),GDI_END);
+  ModifyGadget(gi, GDI_Y, SY + ED_SETTINGS_Y(checkbutton_info[id].y), GDI_END);
 
   x_left = gi->x - xoffset_left;
   x_right = gi->x + gi->width + xoffset_right;
   y = gi->y + yoffset;
 
   if (checkbutton_info[id].text_left)
-    DrawText(x_left, y, checkbutton_info[id].text_left, FONT_TEXT_1);
+    DrawText(x_left, y, checkbutton_info[id].text_left, font_nr);
 
   if (checkbutton_info[id].text_right)
-    DrawText(x_right, y, checkbutton_info[id].text_right, FONT_TEXT_1);
+    DrawText(x_right, y, checkbutton_info[id].text_right, font_nr);
 
   ModifyGadget(gi, GDI_CHECKED, *checkbutton_info[id].value, GDI_END);
 
@@ -7571,8 +7615,10 @@ void DrawLevelEd()
   DrawSpecialEditorDoor();
 
   /* draw new control window */
-  BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
-            DOOR_GFX_PAGEX8, 236, EXSIZE, EYSIZE, EX, EY);
+  BlitBitmap(graphic_info[IMG_BACKGROUND_TOOLBOX].bitmap, drawto,
+            graphic_info[IMG_BACKGROUND_TOOLBOX].src_x,
+            graphic_info[IMG_BACKGROUND_TOOLBOX].src_y,
+            EXSIZE, EYSIZE, EX, EY);
 
   // redraw_mask |= REDRAW_ALL;
 
@@ -7878,6 +7924,11 @@ static int getTabulatorBarWidth()
   return gd_gi4->x - gd_gi1->x + gd_gi4->width;
 }
 
+static int getTabulatorBarHeight()
+{
+  return ED_TAB_BAR_HEIGHT;
+}
+
 static void DrawLevelInfoTabulatorGadgets()
 {
   struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL];
@@ -7909,8 +7960,7 @@ static void DrawLevelInfoTabulatorGadgets()
   /* draw little border line below tabulator buttons */
   if (tab_color != BLACK_PIXEL)                        /* black => transparent */
     FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1,
-                 getTabulatorBarWidth(), ED_GADGET_DISTANCE,
-                 tab_color);
+                 getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
 }
 
 static void DrawPropertiesTabulatorGadgets()
@@ -7958,8 +8008,7 @@ static void DrawPropertiesTabulatorGadgets()
   /* draw little border line below tabulator buttons */
   if (tab_color != BLACK_PIXEL)                        /* black => transparent */
     FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1,
-                 getTabulatorBarWidth(), ED_GADGET_DISTANCE,
-                 tab_color);
+                 getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
 }
 
 static void DrawLevelInfoLevel()
@@ -8051,8 +8100,8 @@ static void DrawCustomChangeContentArea()
 
 static void DrawYamYamContentAreas()
 {
-  int x = SX + ED_AREA_YAMYAM_CONTENT_XPOS(3) + 4 * MINI_TILEX;
-  int y = SY + ED_AREA_YAMYAM_CONTENT_YPOS(0) + ED_BORDER_AREA_YSIZE;
+  int x = SX + ED_AREA_YAMYAM_CONTENT_X(3) + 4 * MINI_TILEX;
+  int y = SY + ED_AREA_YAMYAM_CONTENT_Y(0) + ED_BORDER_AREA_YSIZE;
   int i;
 
   /* display counter to choose number of element content areas */
@@ -8073,8 +8122,10 @@ static void DrawYamYamContentAreas()
       UnmapDrawingArea(id);
 
       /* delete content areas in case of reducing number of them */
-      DrawBackground(SX + drawingarea_info[id].x - MINI_TILEX / 2,
-                    SY + drawingarea_info[id].y - MINI_TILEY / 2,
+      DrawBackground(SX + ED_AREA_SETTINGS_X(drawingarea_info[id])
+                    - MINI_TILEX / 2,
+                    SY + ED_AREA_SETTINGS_Y(drawingarea_info[id])
+                    - MINI_TILEY / 2,
                     4 * MINI_TILEX,
                     4 * MINI_TILEY + ED_GADGET_TEXT_DISTANCE + font_height);
     }
@@ -8087,8 +8138,8 @@ static void DrawYamYamContentAreas()
 
 static void DrawMagicBallContentAreas()
 {
-  int x = SX + ED_AREA_MAGIC_BALL_CONTENT_XPOS(3) + 4 * MINI_TILEX;
-  int y = SY + ED_AREA_MAGIC_BALL_CONTENT_YPOS(0) + ED_BORDER_AREA_YSIZE;
+  int x = SX + ED_AREA_MAGIC_BALL_CONTENT_X(3) + 4 * MINI_TILEX;
+  int y = SY + ED_AREA_MAGIC_BALL_CONTENT_Y(0) + ED_BORDER_AREA_YSIZE;
   int i;
 
   /* display counter to choose number of element content areas */
@@ -8109,8 +8160,10 @@ static void DrawMagicBallContentAreas()
       UnmapDrawingArea(id);
 
       /* delete content areas in case of reducing number of them */
-      DrawBackground(SX + drawingarea_info[id].x - MINI_TILEX / 2,
-                    SY + drawingarea_info[id].y - MINI_TILEY / 2,
+      DrawBackground(SX + ED_AREA_SETTINGS_X(drawingarea_info[id])
+                    - MINI_TILEX / 2,
+                    SY + ED_AREA_SETTINGS_Y(drawingarea_info[id])
+                    - MINI_TILEY / 2,
                     4 * MINI_TILEX,
                     4 * MINI_TILEY + ED_GADGET_TEXT_DISTANCE + font_height);
     }
@@ -8125,8 +8178,8 @@ static void DrawAndroidElementArea(int element)
 {
   int num_elements = level.num_android_clone_elements;
   int id = ED_DRAWING_ID_ANDROID_CONTENT;
-  int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2;
-  int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2;
+  int sx = SX + ED_AREA_SETTINGS_X(drawingarea_info[id]) - MINI_TILEX / 2;
+  int sy = SY + ED_AREA_SETTINGS_Y(drawingarea_info[id]) - MINI_TILEY / 2;
   int xsize = MAX_ANDROID_ELEMENTS;
   int ysize = 1;
 
@@ -8152,8 +8205,8 @@ static void DrawGroupElementArea(int element)
   int id = ED_DRAWING_ID_GROUP_CONTENT;
   int bx = ED_ELEMENT_BORDER_INPUT;
   int by = ED_ELEMENT_BORDER_INPUT;
-  int sx = SX + drawingarea_info[id].x - bx;
-  int sy = SY + drawingarea_info[id].y - by;
+  int sx = SX + ED_AREA_SETTINGS_X(drawingarea_info[id]) - bx;
+  int sy = SY + ED_AREA_SETTINGS_Y(drawingarea_info[id]) - by;
   int xsize = MAX_ELEMENTS_IN_GROUP;
   int ysize = 1;
 
@@ -8175,8 +8228,8 @@ static void DrawPlayerInitialInventoryArea(int element)
   int player_nr = GET_PLAYER_NR(element);
   int num_elements = level.initial_inventory_size[player_nr];
   int id = ED_DRAWING_ID_INVENTORY_CONTENT;
-  int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2;
-  int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2;
+  int sx = SX + ED_AREA_SETTINGS_X(drawingarea_info[id]) - MINI_TILEX / 2;
+  int sy = SY + ED_AREA_SETTINGS_Y(drawingarea_info[id]) - MINI_TILEY / 2;
   int xsize = MAX_INITIAL_INVENTORY_SIZE;
   int ysize = 1;
 
@@ -8221,8 +8274,8 @@ static void DrawEnvelopeTextArea(int envelope_nr)
 static boolean PrintInfoText(char *text, int font_nr, int start_line)
 {
   int font_height = getFontHeight(font_nr);
-  int pad_x = ED_ELEMENT_SETTINGS_XPOS(0);
-  int pad_y = ED_ELEMENT_SETTINGS_YPOS(0) + ED_BORDER_SIZE;
+  int pad_x = ED_ELEMENT_SETTINGS_X(0);
+  int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_BORDER_SIZE;
   int sx = SX + pad_x;
   int sy = SY + pad_y;
   int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1;
@@ -8240,8 +8293,8 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line)
   int font_nr = FONT_TEXT_2;
   int font_width = getFontWidth(font_nr);
   int font_height = getFontHeight(font_nr);
-  int pad_x = ED_ELEMENT_SETTINGS_XPOS(0);
-  int pad_y = ED_ELEMENT_SETTINGS_YPOS(0) + ED_BORDER_SIZE;
+  int pad_x = ED_ELEMENT_SETTINGS_X(0);
+  int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_BORDER_SIZE;
   int sx = SX + pad_x;
   int sy = SY + pad_y + start_line * font_height;
   int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width;
@@ -8325,8 +8378,8 @@ static void DrawPropertiesInfo()
   int font2_nr = FONT_TEXT_2;
   int font1_width = getFontWidth(font1_nr);
   int font2_height = getFontHeight(font2_nr);
-  int pad_x = ED_ELEMENT_SETTINGS_XPOS(0);
-  int pad_y = ED_ELEMENT_SETTINGS_YPOS(0) + ED_BORDER_SIZE;
+  int pad_x = ED_ELEMENT_SETTINGS_X(0);
+  int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_BORDER_SIZE;
   int screen_line = 0;
   int i, x, y;
 
@@ -8845,10 +8898,9 @@ static void DrawPropertiesConfig()
 
     if (tab_color != BLACK_PIXEL)              /* black => transparent */
       FillRectangle(drawto,
-                   SX + ED_ELEMENT_SETTINGS_XPOS(0),
-                   SY + ED_ELEMENT_SETTINGS_YPOS(14) - MINI_TILEY / 2,
-                   getTabulatorBarWidth(), ED_GADGET_DISTANCE,
-                   tab_color);
+                   SX + ED_ELEMENT_SETTINGS_X(0),
+                   SY + ED_ELEMENT_SETTINGS_Y(14) - MINI_TILEY / 2,
+                   getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
   }
 }
 
@@ -8916,13 +8968,12 @@ static void DrawEditorElementAnimation(int x, int y)
   DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
 }
 
-static void DrawEditorElementName(int x, int y, int element)
+static void DrawEditorElementName(int x, int y, int font_nr)
 {
-  char *element_name = getElementInfoText(element);
-  int font_nr = FONT_TEXT_1;
+  char *element_name = getElementInfoText(properties_element);
   int font_width = getFontWidth(font_nr);
   int font_height = getFontHeight(font_nr);
-  int max_text_width = SXSIZE - x - ED_ELEMENT_SETTINGS_XPOS(0);
+  int max_text_width = SXSIZE - x - ED_ELEMENT_SETTINGS_X(0);
   int max_chars_per_line = max_text_width / font_width;
   char buffer[max_chars_per_line + 1];
 
@@ -8963,9 +9014,6 @@ static void DrawEditorElementName(int x, int y, int element)
 
 static void DrawPropertiesWindow()
 {
-  int xstart = 2;
-  int ystart = 4;
-
   stick_element_properties_window = FALSE;
 
   /* make sure that previous properties edit mode exists for this element */
@@ -9000,16 +9048,18 @@ static void DrawPropertiesWindow()
 
   FrameCounter = 0;    /* restart animation frame counter */
 
-  DrawElementBorder(SX + xstart * MINI_TILEX,
-                   SY + ystart * MINI_TILEY + MINI_TILEY / 2,
-                   TILEX, TILEY, FALSE);
-
-  DrawEditorElementAnimation(SX + xstart * MINI_TILEX,
-                            SY + ystart * MINI_TILEY + MINI_TILEY / 2);
+  struct GraphicInfo *gd = &graphic_info[IMG_EDITOR_INPUT_TEXT];
+  int border_size = gd->border_size;
+  int font_nr = FONT_TEXT_1;
+  int font_height = getFontHeight(font_nr);
+  int x = ED_ELEMENT_SETTINGS_ELEM_XPOS;
+  int y = ED_ELEMENT_SETTINGS_ELEM_YPOS;
+  int xoffset = TILEX + ED_ELEMENT_BORDER + 3 * border_size;
+  int yoffset = (TILEY - font_height) / 2;
 
-  DrawEditorElementName((xstart + 3) * MINI_TILEX + 1,
-                       (ystart + 1) * MINI_TILEY + 1,
-                       properties_element);
+  DrawElementBorder(SX + x, SY + y, TILEX, TILEY, FALSE);
+  DrawEditorElementAnimation(SX + x, SY + y);
+  DrawEditorElementName(x + xoffset, y + yoffset, font_nr);
 
   DrawPropertiesTabulatorGadgets();
 
@@ -11436,9 +11486,9 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
     case GADGET_ID_ZOOM:
       // zoom level editor tile size in or out (or reset to default size)
-      ed_tilesize = (button == 1 ? ed_tilesize / 2 :
+      ed_tilesize = (button == 1 ? ed_tilesize * 2 :
                     button == 2 ? DEFAULT_EDITOR_TILESIZE :
-                    button == 3 ? ed_tilesize * 2 : ed_tilesize);
+                    button == 3 ? ed_tilesize / 2 : ed_tilesize);
 
       // limit zoom level by upper and lower bound
       ed_tilesize = MIN(MAX(MICRO_TILESIZE, ed_tilesize), TILESIZE);