fixed bug with broken 'page up/down' keys (for element list) in level editor
[rocksndiamonds.git] / src / editor.c
index 632810d3f2b3fd854475aeb5e39cb12177983d3e..479fec7af807ebc7dbd3bbb34c3f5a078c6a0197 100644 (file)
@@ -69,7 +69,6 @@
 #define ED_GADGET_TINY_DISTANCE                (editor.gadget.tiny_spacing)
 #define ED_GADGET_LINE_DISTANCE                (editor.gadget.line_spacing)
 #define ED_GADGET_TEXT_DISTANCE                (editor.gadget.text_spacing)
-#define ED_GADGET_TAB_DISTANCE         (editor.gadget.tab_spacing)
 #define ED_TAB_BAR_HEIGHT              (editor.gadget.separator_line.height)
 #define ED_DRAWINGAREA_TEXT_DISTANCE   (ED_GADGET_TEXT_DISTANCE +      \
                                         ED_DRAWINGAREA_BORDER_SIZE)
@@ -80,7 +79,7 @@
 #define IMG_BORDER_2                   IMG_EDITOR_ELEMENT_BORDER_INPUT
 #define ED_ELEMENT_BORDER              (graphic_info[IMG_BORDER_1].border_size)
 #define ED_DRAWINGAREA_BORDER_SIZE     (graphic_info[IMG_BORDER_2].border_size)
-#define ED_DRAWINGAREA_TILE_SIZE       (graphic_info[IMG_BORDER_2].tile_size)
+#define ED_DRAWINGAREA_TILE_SIZE       (editor.drawingarea.tile_size)
 
 /* values for checkbutton gadgets */
 #define ED_CHECKBUTTON_XSIZE        (graphic_info[IMG_EDITOR_CHECKBOX].width)
 #define ED_TABBUTTON_XSIZE          (graphic_info[IMG_EDITOR_TABBUTTON].width)
 #define ED_TABBUTTON_YSIZE          (graphic_info[IMG_EDITOR_TABBUTTON].height)
 
-#define ED_LEVEL_SETTINGS_TABS_XPOS    (editor.level_settings.tabs.x)
-#define ED_LEVEL_SETTINGS_TABS_YPOS    (editor.level_settings.tabs.y)
-#define ED_ELEMENT_SETTINGS_TABS_XPOS  (editor.element_settings.tabs.x)
-#define ED_ELEMENT_SETTINGS_TABS_YPOS  (editor.element_settings.tabs.y)
+#define ED_LEVEL_SETTINGS_TABS_X       (editor.settings.tabs.x)
+#define ED_LEVEL_SETTINGS_TABS_Y       (editor.settings.tabs.y)
+#define ED_ELEMENT_SETTINGS_TABS_X     (editor.settings.tabs.x)
+#define ED_ELEMENT_SETTINGS_TABS_Y     (editor.settings.tabs.y +       \
+                                        editor.settings.tabs.yoffset2)
 
-#define ED_LEVEL_SETTINGS_XSTART       (ED_LEVEL_SETTINGS_TABS_XPOS)
-#define ED_LEVEL_SETTINGS_YSTART       (ED_LEVEL_SETTINGS_TABS_YPOS +  \
+#define ED_SETTINGS_TABS_XOFFSET       (editor.settings.tabs.draw_xoffset)
+#define ED_SETTINGS_TABS_YOFFSET       (editor.settings.tabs.draw_yoffset)
+
+#define ED_LEVEL_SETTINGS_XSTART       (ED_LEVEL_SETTINGS_TABS_X +     \
+                                        ED_SETTINGS_TABS_XOFFSET)
+#define ED_LEVEL_SETTINGS_YSTART       (ED_LEVEL_SETTINGS_TABS_Y +     \
                                         ED_TABBUTTON_YSIZE +           \
                                         ED_GADGET_TINY_DISTANCE +      \
                                         ED_TAB_BAR_HEIGHT +            \
-                                        ED_GADGET_TAB_DISTANCE +       \
+                                        ED_SETTINGS_TABS_YOFFSET +     \
                                         getFontHeight(FONT_TEXT_1) +   \
                                         ED_GADGET_TEXT_DISTANCE)
-#define ED_ELEMENT_SETTINGS_XSTART     (ED_ELEMENT_SETTINGS_TABS_XPOS)
-#define ED_ELEMENT_SETTINGS_YSTART     (ED_ELEMENT_SETTINGS_TABS_YPOS + \
+#define ED_ELEMENT_SETTINGS_XSTART     (ED_ELEMENT_SETTINGS_TABS_X +   \
+                                        ED_SETTINGS_TABS_XOFFSET)
+#define ED_ELEMENT_SETTINGS_YSTART     (ED_ELEMENT_SETTINGS_TABS_Y +   \
                                         ED_TABBUTTON_YSIZE +           \
                                         ED_GADGET_TINY_DISTANCE +      \
                                         ED_TAB_BAR_HEIGHT +            \
-                                        ED_GADGET_TAB_DISTANCE)
+                                        ED_SETTINGS_TABS_YOFFSET)
 
 #define ED_SETTINGS_XOFFSET            (ED_CHECKBUTTON_XSIZE +         \
                                         ED_GADGET_TEXT_DISTANCE)
                                         ED_POS_TO_ELEMENT_SETTINGS_Y(n) : (n))
 
 #define ED_TAB_SETTINGS_X(n)           (IS_POS_LEVEL_SETTINGS(n) ?     \
-                                        ED_LEVEL_SETTINGS_TABS_XPOS :  \
-                                        ED_ELEMENT_SETTINGS_TABS_XPOS)
+                                        ED_LEVEL_SETTINGS_TABS_X :     \
+                                        ED_ELEMENT_SETTINGS_TABS_X)
 #define ED_TAB_SETTINGS_Y(n)           (IS_POS_LEVEL_SETTINGS(n) ?     \
-                                        ED_LEVEL_SETTINGS_TABS_YPOS :  \
-                                        ED_ELEMENT_SETTINGS_TABS_YPOS)
+                                        ED_LEVEL_SETTINGS_TABS_Y :     \
+                                        ED_ELEMENT_SETTINGS_TABS_Y)
 
 #define ED_SETTINGS_XOFF(n)            (5 * ((n) % 4) *                \
                                         ED_DRAWINGAREA_TILE_SIZE)
 #define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 15)
 #define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 16)
 #define GADGET_ID_SHIFTED_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_USE_INITIAL_INVENTORY        (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_ENVELOPE_AUTOWRAP    (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_ENVELOPE_CENTERED    (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 42)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 43)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 44)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 45)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 46)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 47)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 48)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 49)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 50)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 51)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 52)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 53)
+#define GADGET_ID_LAZY_RELOCATION      (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_USE_INITIAL_INVENTORY        (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_ENVELOPE_AUTOWRAP    (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_ENVELOPE_CENTERED    (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 47)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 48)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 49)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 50)
+#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 51)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 52)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 53)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 54)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 54)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 55)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  13
 #define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   14
 #define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION   15
-#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    16
-#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  17
-#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        18
-#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      19
-#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY        20
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 21
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   22
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   23
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    24
-#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP    25
-#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED    26
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   27
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  28
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    29
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        30
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        31
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        32
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        33
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      34
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      35
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     36
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      37
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                38
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   39
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  40
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 41
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        42
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    43
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         44
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 45
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  46
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 47
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   48
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 49
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    50
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    51
-
-#define ED_NUM_CHECKBUTTONS                    52
+#define ED_CHECKBUTTON_ID_LAZY_RELOCATION      16
+#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    17
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  18
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        19
+#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      20
+#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY        21
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 22
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   23
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   24
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    25
+#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP    26
+#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED    27
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   28
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  29
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    30
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        31
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        32
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        33
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        34
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      35
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      36
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     37
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      38
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                39
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   40
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  41
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 42
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        43
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    44
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         45
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 46
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  47
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 48
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   49
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 50
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    51
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    52
+
+#define ED_NUM_CHECKBUTTONS                    53
 
 #define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_CHECKBUTTON_ID_EDITOR_LAST  ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
@@ -998,82 +1005,82 @@ static struct
   /* ---------- toolbox control buttons ------------------------------------ */
 
   {
-    IMG_EDITOR_BUTTON_GFX_DRAW_SINGLE,         GADGET_ID_SINGLE_ITEMS,
+    IMG_GFX_EDITOR_BUTTON_DRAW_SINGLE,         GADGET_ID_SINGLE_ITEMS,
     &editor.button.draw_single,                        GD_TYPE_RADIO_BUTTON,
     "draw single items",                       's'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_DRAW_CONNECTED,      GADGET_ID_CONNECTED_ITEMS,
+    IMG_GFX_EDITOR_BUTTON_DRAW_CONNECTED,      GADGET_ID_CONNECTED_ITEMS,
     &editor.button.draw_connected,             GD_TYPE_RADIO_BUTTON,
     "draw connected items",                    'd'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_DRAW_LINE,           GADGET_ID_LINE,
+    IMG_GFX_EDITOR_BUTTON_DRAW_LINE,           GADGET_ID_LINE,
     &editor.button.draw_line,                  GD_TYPE_RADIO_BUTTON,
     "draw lines",                              'l'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_DRAW_ARC,            GADGET_ID_ARC,
+    IMG_GFX_EDITOR_BUTTON_DRAW_ARC,            GADGET_ID_ARC,
     &editor.button.draw_arc,                   GD_TYPE_RADIO_BUTTON,
     "draw arcs",                               'a'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_DRAW_RECTANGLE,      GADGET_ID_RECTANGLE,
+    IMG_GFX_EDITOR_BUTTON_DRAW_RECTANGLE,      GADGET_ID_RECTANGLE,
     &editor.button.draw_rectangle,             GD_TYPE_RADIO_BUTTON,
     "draw outline rectangles",                 'r'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_DRAW_FILLED_BOX,     GADGET_ID_FILLED_BOX,
+    IMG_GFX_EDITOR_BUTTON_DRAW_FILLED_BOX,     GADGET_ID_FILLED_BOX,
     &editor.button.draw_filled_box,            GD_TYPE_RADIO_BUTTON,
     "draw filled rectangles",                  'R'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_ROTATE_UP,           GADGET_ID_WRAP_UP,
+    IMG_GFX_EDITOR_BUTTON_ROTATE_UP,           GADGET_ID_WRAP_UP,
     &editor.button.rotate_up,                  GD_TYPE_NORMAL_BUTTON,
     "wrap (rotate) level up",                  0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_DRAW_TEXT,           GADGET_ID_TEXT,
+    IMG_GFX_EDITOR_BUTTON_DRAW_TEXT,           GADGET_ID_TEXT,
     &editor.button.draw_text,                  GD_TYPE_RADIO_BUTTON,
     "enter text elements",                     't'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_FLOOD_FILL,          GADGET_ID_FLOOD_FILL,
+    IMG_GFX_EDITOR_BUTTON_FLOOD_FILL,          GADGET_ID_FLOOD_FILL,
     &editor.button.flood_fill,                 GD_TYPE_RADIO_BUTTON,
     "flood fill",                              'f'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_ROTATE_LEFT,         GADGET_ID_WRAP_LEFT,
+    IMG_GFX_EDITOR_BUTTON_ROTATE_LEFT,         GADGET_ID_WRAP_LEFT,
     &editor.button.rotate_left,                        GD_TYPE_NORMAL_BUTTON,
     "wrap (rotate) level left",                        0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_ZOOM_LEVEL,          GADGET_ID_ZOOM,
+    IMG_GFX_EDITOR_BUTTON_ZOOM_LEVEL,          GADGET_ID_ZOOM,
     &editor.button.zoom_level,                 GD_TYPE_NORMAL_BUTTON,
-    "zoom level tile size",                    '-'
+    "zoom level tile size",                    '+'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_ROTATE_RIGHT,                GADGET_ID_WRAP_RIGHT,
+    IMG_GFX_EDITOR_BUTTON_ROTATE_RIGHT,                GADGET_ID_WRAP_RIGHT,
     &editor.button.rotate_right,               GD_TYPE_NORMAL_BUTTON,
     "wrap (rotate) level right",               0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_DRAW_RANDOM,         GADGET_ID_RANDOM_PLACEMENT,
+    IMG_GFX_EDITOR_BUTTON_DRAW_RANDOM,         GADGET_ID_RANDOM_PLACEMENT,
     &editor.button.draw_random,                        GD_TYPE_NORMAL_BUTTON,
     "random element placement",                        0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_GRAB_BRUSH,          GADGET_ID_GRAB_BRUSH,
+    IMG_GFX_EDITOR_BUTTON_GRAB_BRUSH,          GADGET_ID_GRAB_BRUSH,
     &editor.button.grab_brush,                 GD_TYPE_RADIO_BUTTON,
     "grab brush",                              'b'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_ROTATE_DOWN,         GADGET_ID_WRAP_DOWN,
+    IMG_GFX_EDITOR_BUTTON_ROTATE_DOWN,         GADGET_ID_WRAP_DOWN,
     &editor.button.rotate_down,                        GD_TYPE_NORMAL_BUTTON,
     "wrap (rotate) level down",                        0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_PICK_ELEMENT,                GADGET_ID_PICK_ELEMENT,
+    IMG_GFX_EDITOR_BUTTON_PICK_ELEMENT,                GADGET_ID_PICK_ELEMENT,
     &editor.button.pick_element,               GD_TYPE_RADIO_BUTTON,
     "pick drawing element",                    ','
   },
@@ -1081,32 +1088,32 @@ static struct
   /* ---------- level control buttons -------------------------------------- */
 
   {
-    IMG_EDITOR_BUTTON_GFX_UNDO,                        GADGET_ID_UNDO,
+    IMG_GFX_EDITOR_BUTTON_UNDO,                        GADGET_ID_UNDO,
     &editor.button.undo,                       GD_TYPE_NORMAL_BUTTON,
     "undo/redo last operation",                        'u'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_CONF,                        GADGET_ID_INFO,
+    IMG_GFX_EDITOR_BUTTON_CONF,                        GADGET_ID_INFO,
     &editor.button.conf,                       GD_TYPE_NORMAL_BUTTON,
     "properties of level",                     'I'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_SAVE,                        GADGET_ID_SAVE,
+    IMG_GFX_EDITOR_BUTTON_SAVE,                        GADGET_ID_SAVE,
     &editor.button.save,                       GD_TYPE_NORMAL_BUTTON,
     "save level",                              'S'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_CLEAR,               GADGET_ID_CLEAR,
+    IMG_GFX_EDITOR_BUTTON_CLEAR,               GADGET_ID_CLEAR,
     &editor.button.clear,                      GD_TYPE_NORMAL_BUTTON,
     "clear level",                             'C'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_TEST,                        GADGET_ID_TEST,
+    IMG_GFX_EDITOR_BUTTON_TEST,                        GADGET_ID_TEST,
     &editor.button.test,                       GD_TYPE_NORMAL_BUTTON,
     "test level",                              'T'
   },
   {
-    IMG_EDITOR_BUTTON_GFX_EXIT,                        GADGET_ID_EXIT,
+    IMG_GFX_EDITOR_BUTTON_EXIT,                        GADGET_ID_EXIT,
     &editor.button.exit,                       GD_TYPE_NORMAL_BUTTON,
     "exit level editor",                       'E'
   },
@@ -1114,27 +1121,27 @@ static struct
   /* ---------- CE and GE control buttons ---------------------------------- */
 
   {
-    IMG_EDITOR_BUTTON_GFX_CE_COPY_FROM,                GADGET_ID_CUSTOM_COPY_FROM,
+    IMG_GFX_EDITOR_BUTTON_CE_COPY_FROM,                GADGET_ID_CUSTOM_COPY_FROM,
     &editor.button.ce_copy_from,               GD_TYPE_RADIO_BUTTON,
     "copy settings from other element",                0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_CE_COPY_TO,          GADGET_ID_CUSTOM_COPY_TO,
+    IMG_GFX_EDITOR_BUTTON_CE_COPY_TO,          GADGET_ID_CUSTOM_COPY_TO,
     &editor.button.ce_copy_to,                 GD_TYPE_RADIO_BUTTON,
     "copy settings to other element",          0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_CE_SWAP,             GADGET_ID_CUSTOM_EXCHANGE,
+    IMG_GFX_EDITOR_BUTTON_CE_SWAP,             GADGET_ID_CUSTOM_EXCHANGE,
     &editor.button.ce_swap,                    GD_TYPE_RADIO_BUTTON,
     "exchange element with other element",     0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_CE_COPY,             GADGET_ID_CUSTOM_COPY,
+    IMG_GFX_EDITOR_BUTTON_CE_COPY,             GADGET_ID_CUSTOM_COPY,
     &editor.button.ce_copy,                    GD_TYPE_NORMAL_BUTTON,
     "copy settings from this element",         0
   },
   {
-    IMG_EDITOR_BUTTON_GFX_CE_PASTE,            GADGET_ID_CUSTOM_PASTE,
+    IMG_GFX_EDITOR_BUTTON_CE_PASTE,            GADGET_ID_CUSTOM_PASTE,
     &editor.button.ce_paste,                   GD_TYPE_NORMAL_BUTTON,
     "paste settings to this element",          0
   },
@@ -1142,7 +1149,7 @@ static struct
   /* ---------- palette control buttons ------------------------------------ */
 
   {
-    IMG_EDITOR_BUTTON_GFX_PROPERTIES,          GADGET_ID_PROPERTIES,
+    IMG_GFX_EDITOR_BUTTON_PROPERTIES,          GADGET_ID_PROPERTIES,
     &editor.button.properties,                 GD_TYPE_NORMAL_BUTTON,
     "properties of drawing element",           'p'
   }
@@ -2257,7 +2264,7 @@ static struct
   /* ---------- element settings: configure (several elements) ------------- */
 
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_PLAYER_SPEED,            GADGET_ID_NONE,
     -1,
     options_player_speed,
@@ -2575,13 +2582,13 @@ static struct
     NULL, "change page",               "select next change page"
   },
   {
-    IMG_EDITOR_BUTTON_GFX_CP_COPY,
+    IMG_GFX_EDITOR_BUTTON_CP_COPY,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_COPY_CHANGE_PAGE,                GADGET_ID_NEXT_CHANGE_PAGE,
     " ", NULL,                         "copy settings from this change page"
   },
   {
-    IMG_EDITOR_BUTTON_GFX_CP_PASTE,
+    IMG_GFX_EDITOR_BUTTON_CP_PASTE,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_PASTE_CHANGE_PAGE,       GADGET_ID_COPY_CHANGE_PAGE,
     NULL, NULL,                                "paste settings to this change page"
@@ -2781,14 +2788,14 @@ static struct
     "exit level if all fields solved", "automatically finish Sokoban levels"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CONTINUOUS_SNAPPING,     GADGET_ID_NONE,
     &level.continuous_snapping,
     NULL,
     "continuous snapping",             "use snapping without releasing key"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_BLOCK_SNAP_FIELD,                GADGET_ID_NONE,
     &level.block_snap_field,
     NULL,
@@ -2823,28 +2830,35 @@ static struct
     "no centering when relocating",    "level not centered after relocation"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
+    GADGET_ID_LAZY_RELOCATION,         GADGET_ID_NONE,
+    &level.lazy_relocation,
+    NULL,
+    "only redraw off-screen relocation","no redraw if relocation target visible"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
     GADGET_ID_USE_START_ELEMENT,       GADGET_ID_NONE,
     &level.use_start_element[0],
     NULL,
     "use level start element:",               "start level at this element's position"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_USE_ARTWORK_ELEMENT,     GADGET_ID_NONE,
     &level.use_artwork_element[0],
     NULL,
     "use artwork from element:",       "use player artwork from other element"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(11),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(12),
     GADGET_ID_USE_EXPLOSION_ELEMENT,   GADGET_ID_NONE,
     &level.use_explosion_element[0],
     NULL,
     "use explosion from element:",     "use explosion properties from element"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(12),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_INITIAL_GRAVITY,         GADGET_ID_NONE,
     &level.initial_player_gravity[0],
     NULL,
@@ -2858,7 +2872,7 @@ static struct
     "use initial inventory:",          "use collected elements on level start"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
     GADGET_ID_CAN_PASS_TO_WALKABLE,    GADGET_ID_NONE,
     &level.can_pass_to_walkable,
     NULL,
@@ -3248,7 +3262,7 @@ static struct
   /* ---------- level start element ---------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(9),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(10),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_START_ELEMENT,           GADGET_ID_USE_START_ELEMENT,
     &level.start_element[0],           1, 1,
@@ -3258,7 +3272,7 @@ static struct
   /* ---------- player artwork element ------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(10),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(11),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_ARTWORK_ELEMENT,         GADGET_ID_USE_ARTWORK_ELEMENT,
     &level.artwork_element[0],         1, 1,
@@ -3268,7 +3282,7 @@ static struct
   /* ---------- player explosion element ----------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(11),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(12),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_EXPLOSION_ELEMENT,       GADGET_ID_USE_EXPLOSION_ELEMENT,
     &level.explosion_element[0],       1, 1,
@@ -3419,10 +3433,6 @@ static int new_element3 = EL_SAND;
 #define BUTTON_ELEMENT(button) ((button) == 1 ? new_element1 : \
                                (button) == 2 ? new_element2 : \
                                (button) == 3 ? new_element3 : EL_EMPTY)
-#define BUTTON_STEPSIZE(button) ((button) == 1 ?  1 : \
-                                (button) == 2 ?  5 : \
-                                (button) == 3 ? 10 : \
-                                (button))
 
 /* forward declaration for internal use */
 static void ModifyEditorCounterValue(int, int);
@@ -5216,9 +5226,9 @@ void PrintEditorElementList()
       int cascade_element_show = EL_CASCADE_INACTIVE(cascade_element);
       char *headline = element_info[cascade_element_show].editor_description;
 
-      printf_line_with_prefix("# ", "-", 77);
-      printf("# %s\n", headline);
-      printf_line_with_prefix("# ", "-", 77);
+      PrintLineWithPrefix("# ", "-", 77);
+      Print("# %s\n", headline);
+      PrintLineWithPrefix("# ", "-", 77);
     }
 
     for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
@@ -5228,21 +5238,21 @@ void PrintEditorElementList()
       if (IS_EDITOR_CASCADE(element))
        element = EL_CHAR_MINUS;
 
-      printf("# %s\n", element_info[element].token_name);
+      Print("# %s\n", element_info[element].token_name);
     }
 
     if (j > 0)
-      printf("#\n");
+      Print("#\n");
 
     for (j = 0; j < *editor_elements_info[i].element_list_size; j++)
     {
       int element = (*editor_elements_info[i].element_list)[j];
 
-      printf("# %s\n", element_info[element].token_name);
+      Print("# %s\n", element_info[element].token_name);
     }
 
     if (j > 0)
-      printf("#\n");
+      Print("#\n");
   }
 }
 
@@ -5640,8 +5650,8 @@ static void CreateCounterButtons()
       if (i == ED_COUNTER_ID_SELECT_LEVEL)
       {
        graphic = (j == 0 ?
-                  IMG_EDITOR_BUTTON_GFX_PREV_LEVEL :
-                  IMG_EDITOR_BUTTON_GFX_NEXT_LEVEL);
+                  IMG_GFX_EDITOR_BUTTON_PREV_LEVEL :
+                  IMG_GFX_EDITOR_BUTTON_NEXT_LEVEL);
 
        event_mask |= GD_EVENT_RELEASED;
 
@@ -5709,7 +5719,7 @@ static void CreateCounterButtons()
 
        if (i == ED_COUNTER_ID_SELECT_LEVEL)
        {
-         graphic = IMG_EDITOR_INPUT_GFX_LEVEL_NUMBER;
+         graphic = IMG_GFX_EDITOR_INPUT_LEVEL_NUMBER;
 
          font_type = FONT_LEVEL_NUMBER;
          font_type_active = FONT_LEVEL_NUMBER_ACTIVE;
@@ -5844,8 +5854,12 @@ static void CreateTextInputGadgets()
       int xoffset = element_border + TILEX + element_border + 3 * border_size;
       int yoffset = element_border + (TILEY - font_height) / 2;
 
-      x = editor.element_settings.element.x + xoffset - border_size;
-      y = editor.element_settings.element.y + yoffset - border_size;
+      x = (editor.settings.element_name.x != -1 ?
+          editor.settings.element_name.x :
+          editor.settings.element_graphic.x + xoffset) - border_size;
+      y = (editor.settings.element_name.y != -1 ?
+          editor.settings.element_name.y :
+          editor.settings.element_graphic.y + yoffset) - border_size;
     }
     else
     {
@@ -6389,10 +6403,8 @@ static void CreateRadiobuttonGadgets()
 
 void CreateLevelEditorGadgets()
 {
-  int old_game_status = game_status;
-
-  /* setting 'game_status' is needed to get the right fonts for the editor */
-  game_status = GAME_MODE_EDITOR;
+  /* force EDITOR font inside level editor */
+  SetFontStatus(GAME_MODE_EDITOR);
 
   /* these values are not constant, but can change at runtime */
   ed_fieldx = MAX_ED_FIELDX - 1;
@@ -6426,7 +6438,7 @@ void CreateLevelEditorGadgets()
   CreateTextbuttonGadgets();
   CreateDrawingAreas();
 
-  game_status = old_game_status;
+  ResetFontStatus();
 }
 
 void FreeLevelEditorGadgets()
@@ -7607,25 +7619,23 @@ void InitZoomLevelSettings()
   MAX_ED_FIELDY = getMaxEdFieldY(FALSE);
 }
 
-static boolean playfield_area_changed = FALSE;
-
 void DrawLevelEd()
 {
-  StopAnimation();
+  int fade_mask = REDRAW_FIELD;
 
-  CloseDoor(DOOR_CLOSE_ALL);
+  FadeSoundsAndMusic();
 
-  FadeOut(REDRAW_FIELD);
+  if (CheckIfGlobalBorderHasChanged())
+    fade_mask = REDRAW_ALL;
 
-  /* needed after playing if editor playfield area has different size */
-  ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
+  FadeOut(fade_mask);
 
   /* needed if different viewport properties defined for editor */
   ChangeViewportPropertiesIfNeeded();
 
-  InitZoomLevelSettings();
+  ClearField();
 
-  playfield_area_changed = DrawingAreaChanged();
+  InitZoomLevelSettings();
 
   OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
 
@@ -7685,7 +7695,9 @@ void DrawLevelEd()
 
   DrawEditModeWindow();
 
-  FadeIn(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+  DrawMaskedBorder(fade_mask);
+
+  FadeIn(fade_mask);
 
   /* copy actual editor door content to door double buffer for OpenDoor() */
   BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
@@ -8107,7 +8119,7 @@ static void DrawLevelInfoWindow()
 {
   char *text = "Global Settings";
   int font_nr = FONT_TITLE_1;
-  struct MenuPosInfo *pos = &editor.level_settings.headline;
+  struct MenuPosInfo *pos = &editor.settings.headline;
   int sx = SX + ALIGNED_XPOS(pos->x, getTextWidth(text, font_nr), pos->align);
   int sy = SY + pos->y;
 
@@ -8772,6 +8784,7 @@ static void DrawPropertiesConfig()
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING);
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION);
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_SHIFTED_RELOCATION);
+      MapCheckbuttonGadget(ED_CHECKBUTTON_ID_LAZY_RELOCATION);
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT);
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT);
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT);
@@ -8972,7 +8985,7 @@ static void DrawPropertiesConfig()
     if (tab_color != BLACK_PIXEL)              /* black => transparent */
       FillRectangle(drawto,
                    SX + ED_ELEMENT_SETTINGS_X(0),
-                   SY + ED_ELEMENT_SETTINGS_Y(14) - ED_GADGET_TAB_DISTANCE -
+                   SY + ED_ELEMENT_SETTINGS_Y(14) - ED_SETTINGS_TABS_YOFFSET -
                    ED_TAB_BAR_HEIGHT,
                    getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
   }
@@ -9093,13 +9106,17 @@ static void DrawPropertiesWindow()
   int border_size = gd->border_size;
   int font_nr = FONT_TEXT_1;
   int font_height = getFontHeight(font_nr);
-  int x = editor.element_settings.element.x + element_border;
-  int y = editor.element_settings.element.y + element_border;
   int xoffset = TILEX + element_border + 3 * border_size;
   int yoffset = (TILEY - font_height) / 2;
+  int x1 = editor.settings.element_graphic.x + element_border;
+  int y1 = editor.settings.element_graphic.y + element_border;
+  int x2 = (editor.settings.element_name.x == -1 ? x1 + xoffset :
+           editor.settings.element_name.x);
+  int y2 = (editor.settings.element_name.y == -1 ? y1 + yoffset :
+           editor.settings.element_name.y);
   char *text = "Element Settings";
   int font2_nr = FONT_TITLE_1;
-  struct MenuPosInfo *pos = &editor.element_settings.headline;
+  struct MenuPosInfo *pos = &editor.settings.headline;
   int sx = SX + ALIGNED_XPOS(pos->x, getTextWidth(text, font2_nr), pos->align);
   int sy = SY + pos->y;
 
@@ -9137,9 +9154,9 @@ static void DrawPropertiesWindow()
 
   FrameCounter = 0;    /* restart animation frame counter */
 
-  DrawElementBorder(SX + x, SY + y, TILEX, TILEY, FALSE);
-  DrawEditorElementAnimation(SX + x, SY + y);
-  DrawEditorElementName(x + xoffset, y + yoffset, font_nr);
+  DrawElementBorder(SX + x1, SY + y1, TILEX, TILEY, FALSE);
+  DrawEditorElementAnimation(SX + x1, SY + y1);
+  DrawEditorElementName(x2, y2, font_nr);
 
   DrawPropertiesTabulatorGadgets();
 
@@ -10912,7 +10929,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
          DrawFixedGraphicExt(drawto,
                              gi->x + sx * TILEX,
                              gi->y + sy * TILEY,
-                             el2img(new_element), 0);
+                             el2edimg(new_element), 0);
 
        if (id == GADGET_ID_CUSTOM_GRAPHIC)
          new_element = GFX_ELEMENT(new_element);
@@ -11868,6 +11885,7 @@ void HandleLevelEditorKeyInput(Key key)
   {
     int id = GADGET_ID_NONE;
     int new_element_shift = element_shift;
+    int step = ED_ELEMENTLIST_BUTTONS_VERT - 1;
     int i;
 
     switch (key)
@@ -11884,13 +11902,23 @@ void HandleLevelEditorKeyInput(Key key)
       case KSYM_Down:
        id = GADGET_ID_SCROLL_DOWN;
        break;
+
       case KSYM_Page_Up:
-       id = GADGET_ID_SCROLL_LIST_UP;
-       button = ED_ELEMENTLIST_BUTTONS_VERT - 1;
-       break;
       case KSYM_Page_Down:
-       id = GADGET_ID_SCROLL_LIST_DOWN;
-       button = ED_ELEMENTLIST_BUTTONS_VERT - 1;
+       step *= (key == KSYM_Page_Up ? -1 : +1);
+        element_shift += step * ED_ELEMENTLIST_BUTTONS_HORIZ;
+
+        if (element_shift < 0)
+          element_shift = 0;
+        if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
+          element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+
+        ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL],
+                     GDI_SCROLLBAR_ITEM_POSITION,
+                     element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END);
+
+       ModifyEditorElementList();
+
        break;
 
       case KSYM_Home:
@@ -11974,12 +12002,13 @@ void HandleLevelEditorKeyInput(Key key)
       ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button);
     else if (letter == 'U')
       ClickOnGadget(level_editor_gadget[GADGET_ID_UNDO], 3);
-    else if (key == KSYM_KP_Subtract)
-      ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 1);
-    else if (key == KSYM_KP_0 || letter == '0')
-      ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 2);
-    else if (key == KSYM_KP_Add || letter == '+')
+    else if (letter == '-' || key == KSYM_KP_Subtract)
       ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 3);
+    else if (letter == '0' || key == KSYM_KP_0)
+      ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 2);
+    else if (letter == '+' || key == KSYM_KP_Add ||
+            letter == '=')     // ("Shift-=" is "+" on US keyboards)
+      ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 1);
     else if (key == KSYM_Return ||
             key == KSYM_space ||
             key == setup.shortcut.toggle_pause)
@@ -11995,8 +12024,8 @@ void HandleLevelEditorKeyInput(Key key)
 void HandleLevelEditorIdle()
 {
   int element_border = graphic_info[IMG_EDITOR_ELEMENT_BORDER].border_size;
-  int x = editor.element_settings.element.x + element_border;
-  int y = editor.element_settings.element.y + element_border;
+  int x = editor.settings.element_graphic.x + element_border;
+  int y = editor.settings.element_graphic.y + element_border;
   static unsigned int action_delay = 0;
   unsigned int action_delay_value = GameFrameDelay;
   int i;
@@ -12033,7 +12062,7 @@ void PrintEditorGadgetInfoText(struct GadgetInfo *gi)
   char shortcut[MAX_OUTPUT_LINESIZE + 1];
   int max_infotext_len = getMaxInfoTextLength();
 
-  if (gi == NULL || gi->info_text == NULL)
+  if (gi == NULL || strlen(gi->info_text) == 0)
     return;
 
   strncpy(infotext, gi->info_text, max_infotext_len);
@@ -12248,14 +12277,33 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed,
       Request("Level has changed! Exit without saving?",
              REQ_ASK | REQ_STAY_OPEN))
   {
-    SetDoorState(DOOR_CLOSE_2);
+    struct RectWithBorder *vp_door_1 = &viewport.door_1[GAME_MODE_MAIN];
+    struct RectWithBorder *vp_door_2 = &viewport.door_2[GAME_MODE_MAIN];
+
+    /* draw normal door */
+    UndrawSpecialEditorDoor();
+
+    // close editor doors if viewport definition is the same as in main menu
+    if (vp_door_1->x      == DX     &&
+       vp_door_1->y      == DY     &&
+       vp_door_1->width  == DXSIZE &&
+       vp_door_1->height == DYSIZE &&
+       vp_door_2->x      == VX     &&
+       vp_door_2->y      == VY     &&
+       vp_door_2->width  == VXSIZE &&
+       vp_door_2->height == VYSIZE)
+      CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
+    else
+      SetDoorState(DOOR_CLOSE_2);
+
+    BackToFront();
 
     if (quick_quit)
       FadeSkipNextFadeIn();
 
-    game_status = GAME_MODE_MAIN;
+    SetGameStatus(GAME_MODE_MAIN);
 
-    DrawAndFadeInMainMenu(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+    DrawMainMenu();
   }
   else
   {