+int elements_in_list = sizeof(editor_element)/sizeof(int);
+
+static void ScrollMiniLevel(int from_x, int from_y, int scroll)
+{
+ int x,y;
+ int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
+ int dy = (scroll==ED_SCROLL_UP ? -1 : scroll==ED_SCROLL_DOWN ? 1 : 0);
+
+ XCopyArea(display,drawto,drawto,gc,
+ SX+MINI_TILEX*(dx==-1),SY+MINI_TILEY*(dy==-1),
+ SXSIZE-MINI_TILEX*ABS(dx),SYSIZE-MINI_TILEY*ABS(dy),
+ SX+MINI_TILEX*(dx==+1),SY+MINI_TILEY*(dy==+1));
+ if (dx)
+ {
+ x = (dx==1 ? 0 : 2*SCR_FIELDX-1);
+ for(y=0;y<2*SCR_FIELDY;y++)
+ DrawMiniElementOrWall(x,y,from_x,from_y);
+ }
+ else if (dy)
+ {
+ y = (dy==1 ? 0 : 2*SCR_FIELDY-1);
+ for(x=0;x<2*SCR_FIELDX;x++)
+ DrawMiniElementOrWall(x,y,from_x,from_y);
+ }
+
+ redraw_mask |= REDRAW_FIELD;
+ BackToFront();
+}
+
+void InitLevelEditorGadgets()
+{
+ int i;
+
+ for (i=0; i<ED_NUM_GADGETS; i++)
+ level_editor_gadget[i] = NULL;
+}
+
+static void CreateControlButtons()
+{
+ int i;
+
+ for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
+ {
+ Pixmap gd_pixmap = pix[PIX_DOOR];
+ struct GadgetInfo *gi;
+ int gd_xoffset, gd_yoffset;
+ int gd_x1, gd_x2, gd_y;
+ int width, height;
+ unsigned long event_mask;
+ int id = i;
+
+ if (i < ED_NUM_CTRL1_BUTTONS)
+ {
+ int x = i % ED_CTRL1_BUTTONS_HORIZ;
+ int y = i / ED_CTRL1_BUTTONS_HORIZ;
+
+ gd_xoffset = ED_CTRL1_BUTTONS_XPOS + x * ED_CTRL1_BUTTON_XSIZE;
+ gd_yoffset = ED_CTRL1_BUTTONS_YPOS + y * ED_CTRL1_BUTTON_YSIZE;
+ width = ED_CTRL1_BUTTON_XSIZE;
+ height = ED_CTRL1_BUTTON_YSIZE;
+ }
+ else
+ {
+ int x = (i - ED_NUM_CTRL1_BUTTONS) % ED_CTRL2_BUTTONS_HORIZ;
+ int y = (i - ED_NUM_CTRL1_BUTTONS) / ED_CTRL2_BUTTONS_HORIZ;
+
+ gd_xoffset = ED_CTRL2_BUTTONS_XPOS + x * ED_CTRL2_BUTTON_XSIZE;
+ gd_yoffset = ED_CTRL2_BUTTONS_YPOS + y * ED_CTRL2_BUTTON_YSIZE;
+ width = ED_CTRL2_BUTTON_XSIZE;
+ height = ED_CTRL2_BUTTON_YSIZE;
+ }
+
+ gd_x1 = DOOR_GFX_PAGEX8 + gd_xoffset;
+ gd_x2 = DOOR_GFX_PAGEX7 + gd_xoffset;
+ gd_y = DOOR_GFX_PAGEY1 + ED_CTRL_BUTTONS_GFX_YPOS + gd_yoffset;
+
+ if (i == ED_CTRL_ID_WRAP_LEFT ||
+ i == ED_CTRL_ID_WRAP_RIGHT ||
+ i == ED_CTRL_ID_WRAP_UP ||
+ i == ED_CTRL_ID_WRAP_DOWN)
+ event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
+ else
+ event_mask = GD_EVENT_RELEASED;
+
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_X, EX + gd_xoffset,
+ GDI_Y, EY + gd_yoffset,
+ GDI_WIDTH, width,
+ GDI_HEIGHT, height,
+ GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
+ GDI_STATE, GD_BUTTON_UNPRESSED,
+ GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y,
+ GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK, HandleControlButtons,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[id] = gi;
+ }
+}
+
+static void CreateCounterButtons(int counter_id)
+{
+ int i;
+
+ for (i=0; i<2; i++)
+ {
+ Pixmap gd_pixmap = pix[PIX_DOOR];
+ struct GadgetInfo *gi;
+ int gd_xoffset;
+ int gd_x1, gd_x2, gd_y;
+ int id = counter_info[counter_id].gadget_id + i;
+ unsigned long event_mask;
+
+ event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
+
+ gd_xoffset = (i == 0 ? ED_BUTTON_MINUS_XPOS : ED_BUTTON_PLUS_XPOS);
+ gd_x1 = DOOR_GFX_PAGEX4 + gd_xoffset;
+ gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset;
+ gd_y = DOOR_GFX_PAGEY1 + ED_BUTTON_COUNT_YPOS;
+
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_X, SX + counter_info[counter_id].x + gd_xoffset,
+ GDI_Y, SY + counter_info[counter_id].y,
+ GDI_WIDTH, ED_BUTTON_COUNT_XSIZE,
+ GDI_HEIGHT, ED_BUTTON_COUNT_YSIZE,
+ GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
+ GDI_STATE, GD_BUTTON_UNPRESSED,
+ GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y,
+ GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK, HandleCounterButtons,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[id] = gi;
+ }
+}
+
+static void CreateDrawingAreas()
+{
+ struct GadgetInfo *gi;
+ unsigned long event_mask;
+
+ event_mask =
+ GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING |
+ GD_EVENT_OFF_BORDERS;
+
+ gi = CreateGadget(GDI_CUSTOM_ID, ED_CTRL_ID_DRAWING_LEVEL,
+ GDI_X, SX,
+ GDI_Y, SY,
+ GDI_WIDTH, SXSIZE,
+ GDI_HEIGHT, SYSIZE,
+ GDI_TYPE, GD_TYPE_DRAWING_AREA,
+ GDI_ITEM_SIZE, MINI_TILEX, MINI_TILEY,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK, HandleDrawingAreas,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[ED_CTRL_ID_DRAWING_LEVEL] = gi;
+}
+
+static void CreateLevelEditorGadgets()
+{
+ if (level_editor_gadgets_created)
+ return;
+
+ CreateControlButtons();
+ CreateCounterButtons(ED_COUNTER_SCORE);
+ CreateDrawingAreas();
+
+ level_editor_gadgets_created = TRUE;
+}
+
+static void MapControlButtons()
+{
+ int i;
+
+ for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
+ MapGadget(level_editor_gadget[i]);
+}
+
+static void MapCounterButtons(int counter_id)
+{
+ int i;
+
+ for (i=0; i<2; i++)
+ MapGadget(level_editor_gadget[counter_info[counter_id].gadget_id + i]);
+}
+
+static void MapMainDrawingArea()
+{
+ MapGadget(level_editor_gadget[ED_CTRL_ID_DRAWING_LEVEL]);
+}
+
+void UnmapLevelEditorWindowGadgets()
+{
+ int i;
+
+ for (i=ED_NUM_CTRL_BUTTONS; i<ED_NUM_GADGETS; i++)
+ UnmapGadget(level_editor_gadget[i]);
+}
+
+void UnmapLevelEditorGadgets()
+{
+ int i;
+
+ for (i=0; i<ED_NUM_GADGETS; i++)
+ UnmapGadget(level_editor_gadget[i]);
+}