]> git.saurik.com Git - wxWidgets.git/blame - utils/dialoged/src/dlghndlr.cpp
Moved the cleanup code to an EVT_WINDOW_DESTROY handler.
[wxWidgets.git] / utils / dialoged / src / dlghndlr.cpp
CommitLineData
457814b5
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: dlghndlr.cpp
3// Purpose: Dialog handler
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation
14#endif
15
16// For compilers that support precompilation, includes "wx/wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24#include "wx/wx.h"
25#endif
26
27#include <ctype.h>
28#include <stdlib.h>
29#include <math.h>
30#include <string.h>
31
457814b5
JS
32#include "reseditr.h"
33#include "winprop.h"
457814b5 34#include "dlghndlr.h"
ae8351fc 35#include "edlist.h"
457814b5 36
c0e66542 37
457814b5
JS
38IMPLEMENT_CLASS(wxResourceEditorDialogHandler, wxEvtHandler)
39IMPLEMENT_CLASS(wxResourceEditorControlHandler, wxEvtHandler)
40
41BEGIN_EVENT_TABLE(wxResourceEditorDialogHandler, wxEvtHandler)
f6bcfd97
BP
42EVT_PAINT(wxResourceEditorDialogHandler::OnPaint)
43EVT_MOUSE_EVENTS(wxResourceEditorDialogHandler::OnMouseEvent)
44EVT_SIZE(wxResourceEditorDialogHandler::OnSize)
59ae5075
JS
45EVT_MENU(OBJECT_MENU_EDIT, wxResourceEditorDialogHandler::OnObjectEdit)
46EVT_MENU(OBJECT_MENU_DELETE, wxResourceEditorDialogHandler::OnObjectDelete)
457814b5
JS
47END_EVENT_TABLE()
48
49BEGIN_EVENT_TABLE(wxResourceEditorControlHandler, wxEvtHandler)
f6bcfd97 50EVT_MOUSE_EVENTS(wxResourceEditorControlHandler::OnMouseEvent)
457814b5
JS
51END_EVENT_TABLE()
52
53/*
f6bcfd97
BP
54* Dialog box event handler
55*/
457814b5
JS
56
57wxResourceEditorDialogHandler::wxResourceEditorDialogHandler(wxPanel *dialog, wxItemResource *resource,
f6bcfd97 58 wxEvtHandler *oldHandler, wxResourceManager *manager)
457814b5 59{
f6bcfd97
BP
60 handlerDialog = dialog;
61 handlerResource = resource;
62 handlerOldHandler = oldHandler;
63 resourceManager = manager;
64
65 dragMode = wxDRAG_MODE_NONE;
66 dragType = wxDRAG_TYPE_NONE;
67 dragItem = NULL;
68 firstDragX = 0;
69 firstDragY = 0;
70 oldDragX = 0;
71 oldDragY = 0;
72 dragTolerance = 3;
73 checkTolerance = TRUE;
74 m_mouseCaptured = FALSE;
75 // m_treeItem = 0;
ae8351fc
JS
76}
77
78wxResourceEditorDialogHandler::~wxResourceEditorDialogHandler(void)
79{
457814b5
JS
80}
81
82void wxResourceEditorDialogHandler::OnItemSelect(wxControl *item, bool select)
83{
f6bcfd97
BP
84 if (select)
85 resourceManager->AddSelection(item);
86 else
87 resourceManager->RemoveSelection(item);
457814b5
JS
88}
89
b127f301 90void wxResourceEditorDialogHandler::OnPaint(wxPaintEvent& WXUNUSED(event))
457814b5 91{
f6bcfd97
BP
92 wxPaintDC dc(handlerDialog);
93
94 PaintSelectionHandles(dc);
457814b5
JS
95}
96
97// Add event handlers for all children
98void wxResourceEditorDialogHandler::AddChildHandlers(void)
99{
f6bcfd97
BP
100 wxNode *node = handlerDialog->GetChildren().First();
101 while ( node )
102 {
103 wxControl *child = (wxControl *)node->Data();
104 wxEvtHandler *childHandler = child->GetEventHandler();
105 if ( child->IsKindOf(CLASSINFO(wxControl)) && childHandler == child )
106 child->PushEventHandler(new wxResourceEditorControlHandler(child, childHandler));
107 node = node->Next();
108 }
457814b5
JS
109}
110
111void wxResourceEditorDialogHandler::OnLeftClick(int x, int y, int keys)
112{
f6bcfd97 113 if (keys & wxKEY_CTRL)
ae8351fc 114 {
f6bcfd97
BP
115 wxResourceManager::GetCurrentResourceManager()->EditWindow(handlerDialog);
116 return;
ae8351fc 117 }
f6bcfd97
BP
118
119 // Deselect all items if click on panel
120 if (wxResourceManager::GetCurrentResourceManager()->GetEditorControlList()->GetSelection() == RESED_POINTER)
ae8351fc 121 {
f6bcfd97
BP
122 int needsRefresh = 0;
123 wxNode *node = handlerDialog->GetChildren().First();
124 while (node)
125 {
126 wxControl *item = (wxControl *)node->Data();
127 wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
128 if (item->IsKindOf(CLASSINFO(wxControl)) && childHandler->IsSelected())
129 {
130 needsRefresh ++;
131 OnItemSelect(item, FALSE);
132 childHandler->SelectItem(FALSE);
133 }
134 node = node->Next();
135 }
136 if (needsRefresh > 0)
137 {
138 wxClientDC dc(handlerDialog);
139 dc.Clear();
140 handlerDialog->Refresh();
141 }
142 return;
ae8351fc 143 }
c0e66542 144
f6bcfd97
BP
145 // Round down to take account of dialog units
146 wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerDialog);
147 if (resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
148 {
e3a43801 149 wxPoint pt = handlerDialog->ConvertPixelsToDialog(wxPoint(x, y));
f6bcfd97 150
e3a43801
JS
151 // Convert back so we've rounded down
152 pt = handlerDialog->ConvertDialogToPixels(pt);
153 pt = handlerDialog->ConvertPixelsToDialog(pt);
154 pt = handlerDialog->ConvertDialogToPixels(pt);
155 x = pt.x;
156 y = pt.y;
f6bcfd97
BP
157 }
158
159 switch (wxResourceManager::GetCurrentResourceManager()->GetEditorControlList()->GetSelection())
160 {
161 case RESED_BUTTON:
162 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxButton", x, y);
163 break;
164 case RESED_BMPBUTTON:
165 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxBitmapButton", x, y, TRUE);
166 break;
167 case RESED_STATICTEXT:
168 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxStaticText", x, y);
169 break;
170 case RESED_STATICBMP:
171 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxStaticBitmap", x, y, TRUE);
172 break;
173 case RESED_TEXTCTRL_SINGLE:
174 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxTextCtrl (single-line)", x, y);
175 break;
176 case RESED_TEXTCTRL_MULTIPLE:
177 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxTextCtrl (multi-line)", x, y);
178 break;
179 case RESED_CHOICE:
180 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxChoice", x, y);
181 break;
182 case RESED_COMBOBOX:
183 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxComboBox", x, y);
184 break;
185 case RESED_CHECKBOX:
186 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxCheckBox", x, y);
187 break;
188 case RESED_RADIOBOX:
189 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxRadioBox", x, y);
190 break;
191 case RESED_RADIOBUTTON:
192 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxRadioButton", x, y);
193 break;
194 case RESED_LISTBOX:
195 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxListBox", x, y);
196 break;
197 case RESED_SLIDER:
198 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxSlider", x, y);
199 break;
200 case RESED_GAUGE:
201 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxGauge", x, y);
202 break;
203 case RESED_STATICBOX:
204 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxStaticBox", x, y);
205 break;
206 case RESED_SCROLLBAR:
207 resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxScrollBar", x, y);
208 break;
209 default:
210 break;
211 }
212
213 // Now switch pointer on.
214 if (wxResourceManager::GetCurrentResourceManager()->GetEditorControlList()->GetSelection() != RESED_POINTER)
215 {
216 wxResourceManager::GetCurrentResourceManager()->GetEditorControlList()->SetItemState(RESED_POINTER, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
217 }
ae8351fc
JS
218}
219
b127f301 220void wxResourceEditorDialogHandler::OnRightClick(int x, int y, int WXUNUSED(keys))
457814b5 221{
f6bcfd97
BP
222 wxMenu *menu = resourceManager->GetPopupMenu();
223 menu->SetClientData((char *)handlerDialog);
c0e66542
GT
224
225 wxString str("wxDialog : ");
226 str += handlerDialog->GetName();
227
228 menu->SetLabel(OBJECT_MENU_TITLE,str);
229
f6bcfd97 230 handlerDialog->PopupMenu(menu, x, y);
457814b5
JS
231}
232
560b92f5 233void wxResourceEditorDialogHandler::OnItemLeftClick(wxControl *item, int WXUNUSED(x), int WXUNUSED(y), int keys)
457814b5 234{
f6bcfd97
BP
235 if (keys & wxKEY_CTRL)
236 {
237 wxResourceManager::GetCurrentResourceManager()->EditWindow(item);
238 return;
239 }
240
241 /*
242 // If this is a wxStaticBox and the pointer isn't an arrow, chances
243 // are that we really meant to place an item on the panel.
244 // Fake this event.
245 if ((item->GetClassInfo() == CLASSINFO(wxStaticBox)) && resourceManager->GetEditorPalette()->currentlySelected != PALETTE_ARROW)
246 {
457814b5
JS
247 OnLeftClick(x, y, keys);
248 return;
f6bcfd97
BP
249 }
250 */
251
252 wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
457814b5 253
f6bcfd97 254 if (childHandler->IsSelected())
457814b5 255 {
f6bcfd97
BP
256 childHandler->SelectItem(FALSE);
257 OnItemSelect(item, FALSE);
258
259 wxClientDC dc(handlerDialog);
260 dc.Clear();
261 handlerDialog->Refresh();
457814b5 262 }
f6bcfd97 263 else
457814b5 264 {
f6bcfd97
BP
265 childHandler->SelectItem(TRUE);
266 OnItemSelect(item, TRUE);
267
268 // Deselect other items if shift is not pressed
269 int needsRefresh = 0;
270 if (!(keys & wxKEY_SHIFT))
271 {
272 wxNode *node = item->GetParent()->GetChildren().First();
273 while (node)
274 {
275 wxControl *child = (wxControl *)node->Data();
276 wxResourceEditorControlHandler *childHandler2 = (wxResourceEditorControlHandler *)child->GetEventHandler();
277 if (child->IsKindOf(CLASSINFO(wxControl)) && childHandler2->IsSelected() && child != item)
278 {
279 childHandler2->SelectItem(FALSE);
280 OnItemSelect(child, FALSE);
281 needsRefresh ++;
282 }
283 node = node->Next();
284 }
285 }
286
287 wxClientDC dc(handlerDialog);
288 childHandler->DrawSelectionHandles(dc);
289
290 if (needsRefresh > 0)
291 {
292 dc.Clear();
293 handlerDialog->Refresh();
294 }
457814b5 295 }
457814b5
JS
296}
297
b127f301 298void wxResourceEditorDialogHandler::OnItemRightClick(wxControl *item, int x, int y, int WXUNUSED(keys))
457814b5
JS
299{
300/*
f6bcfd97
BP
301if (keys & wxKEY_CTRL)
302{
303wxDebugMsg("Item %s, selected = %d\n", item->GetName(), item->IsSelected());
304return;
305}
306 */
307
308 wxMenu *menu = resourceManager->GetPopupMenu();
309 menu->SetClientData((char *)item);
c0e66542
GT
310
311 wxWindow *win = (wxWindow *)item;
312
313 wxWindowPropertyInfo *info = resourceManager->CreatePropertyInfoForWindow(win);
314 if (info)
315 {
316 info->SetResource(resourceManager->FindResourceForWindow(win));
317 wxString str;
318 str = win->GetClassInfo()->GetClassName();
319 str += " : ";
320 if (win->GetName() != "")
321 str += win->GetName();
322
323 menu->SetLabel(OBJECT_MENU_TITLE,str);
324 }
325
f6bcfd97 326 handlerDialog->PopupMenu(menu, x, y);
457814b5
JS
327}
328
fd71308f
JS
329// Under Windows 95, you can resize a panel interactively depending on
330// window styles.
331void wxResourceEditorDialogHandler::OnSize(wxSizeEvent& event)
332{
333 // Update the associated resource
334 int w, h;
335 handlerDialog->GetClientSize(& w, & h);
f6bcfd97 336
fd71308f
JS
337 wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerDialog);
338 if (resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
339 {
340 wxSize sz = handlerDialog->ConvertPixelsToDialog(wxSize(w, h));
341 w = sz.x; h = sz.y;
342 }
343 resource->SetSize(resource->GetX(), resource->GetY(), w, h);
344}
345
457814b5
JS
346// An event outside any items: may be a drag event.
347void wxResourceEditorDialogHandler::OnMouseEvent(wxMouseEvent& event)
348{
f6bcfd97 349 if (GetEvtHandlerEnabled())
457814b5 350 {
f6bcfd97
BP
351 // If we're dragging an item or selection handle,
352 // continue dragging.
353 if (dragMode != wxDRAG_MODE_NONE)
457814b5 354 {
c0e66542
GT
355 if (dragType != wxDRAG_TYPE_BOUNDING_BOX &&
356 dragItem != NULL)
357 {
358 ProcessItemEvent(dragItem, event, dragType);
359 return;
360 }
457814b5 361 }
f6bcfd97
BP
362
363 wxCoord x, y;
364 event.GetPosition(&x, &y);
365
366 // Find which selection handle we're on, if any
367 wxNode *node = handlerDialog->GetChildren().First();
368 while (node)
ae8351fc 369 {
f6bcfd97
BP
370 wxWindow *win = (wxWindow *)node->Data();
371 if (win->IsKindOf(CLASSINFO(wxControl)))
372 {
373 wxControl *item = (wxControl *)win;
374 wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
375 int selHandle = childHandler->SelectionHandleHitTest(x, y);
376 if (selHandle > 0)
377 {
378 ProcessItemEvent(item, event, selHandle);
379 return;
380 }
381 }
382 node = node->Next();
ae8351fc 383 }
c0e66542 384
f6bcfd97
BP
385 // We're not on an item or selection handle.
386 // so... check for a left or right click event
387 // to send to the application.
388 int keys = 0;
389 if (event.ShiftDown()) keys = keys | wxKEY_SHIFT;
390 if (event.ControlDown()) keys = keys | wxKEY_CTRL;
391
c0e66542
GT
392 if (node == NULL)
393 {
394 if (event.Dragging() &&
395 (dragType == wxDRAG_TYPE_BOUNDING_BOX))
396
397 {
398 if (dragMode == wxDRAG_MODE_CONTINUE_LEFT)
399 {
400 wxClientDC dc(handlerDialog);
401 OnDragContinue(FALSE, oldDragX, oldDragY, keys, dc, NULL);
402 OnDragContinue(TRUE, x, y, keys, dc, NULL);
403 oldDragX = x; oldDragY = y;
404 }
405/*
406 else if (event.LeftUp() && dragMode == wxDRAG_MODE_CONTINUE_LEFT)
407 {
408
409 wxClientDC dc(handlerDialog);
410 OnDragContinue(FALSE, oldDragX, oldDragY, keys, dc, NULL);
411 OnDragContinue(TRUE, x, y, keys, dc, NULL);
412 oldDragX = x; oldDragY = y;
413 }
414*/
415 }
416 }
417
418 if (event.LeftDown())
419 {
420 if (!m_mouseCaptured)
421 {
422 handlerDialog->CaptureMouse();
423 m_mouseCaptured = TRUE;
424 }
425
426 // Starting to draw a bounding box around
427 // some numbe of controls on the dialog
428 if (node == NULL &&
429 wxResourceManager::GetCurrentResourceManager()->GetEditorControlList()->GetSelection() == RESED_POINTER)
430 {
431 dragItem = NULL;
432 dragMode = wxDRAG_MODE_START_LEFT;
433 firstDragX = x;
434 firstDragY = y;
435 dragType = wxDRAG_TYPE_BOUNDING_BOX;
436 wxClientDC dc(handlerDialog);
5aa5c1e4 437 OnDragBegin(x, y, keys, dc, 0);
c0e66542
GT
438 dragMode = wxDRAG_MODE_CONTINUE_LEFT;
439 oldDragX = x; oldDragY = y;
440 }
441
442 event.Skip();
443 }
444 else if (event.LeftUp())
ae8351fc 445 {
f6bcfd97
BP
446 if (m_mouseCaptured)
447 {
448 handlerDialog->ReleaseMouse();
449 m_mouseCaptured = FALSE;
450 }
c0e66542
GT
451
452 if (dragType == wxDRAG_TYPE_BOUNDING_BOX)
453 {
454 // Determine the bounds of the surrounding box
455 int upperLeftX = (x < firstDragX) ? x : firstDragX;
456 int upperLeftY = (y < firstDragY) ? y : firstDragY;
457 int lowerRightX = (x > firstDragX) ? x : firstDragX;
458 int lowerRightY = (y > firstDragY) ? y : firstDragY;
459
460 int xpos,ypos;
461 int width,height;
462
463 bool widgetWithinBounds = FALSE;
464
465 int needsRefresh = 0;
466
467 wxClientDC dc(handlerDialog);
468
469 // Determine what widgets which fall within the bounding box
470 // and select them
471 wxNode *node = handlerDialog->GetChildren().First();
472 while (node)
473 {
474 widgetWithinBounds = FALSE;
475 wxWindow *win = (wxWindow *)node->Data();
476 if (win->IsKindOf(CLASSINFO(wxControl)))
477 {
478 wxControl *item = (wxControl *)win;
479 wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
480
481 // Unselect all widgets that are currently selected
482 if (!(keys & wxKEY_SHIFT) && childHandler->IsSelected())
483 {
484 needsRefresh ++;
485 OnItemSelect(item, FALSE);
486 childHandler->SelectItem(FALSE);
487 }
488
489 // Get X,Y and WIDTH,HEIGHT of the widget to be able
490 // to determine if any portion of it is within the bounded
491 // area
492 childHandler->handlerControl->GetPosition(&xpos, &ypos);
493 childHandler->handlerControl->GetSize(&width, &height);
494
495 // Check if the current widget is inside the rectangle
496 // that was just bounded
497 if (xpos >= upperLeftX && xpos <= lowerRightX)
498 {
499 if (ypos >= upperLeftY && ypos <= lowerRightY)
500 widgetWithinBounds = TRUE;
501 else if (ypos+height >= upperLeftY && ypos+height <= lowerRightY)
502 widgetWithinBounds = TRUE;
503 }
504 else if (xpos+width >= upperLeftX && xpos <= lowerRightX)
505 {
506 if (ypos >= upperLeftY && ypos <= lowerRightY)
507 widgetWithinBounds = TRUE;
508 else if (ypos+height >= upperLeftY && ypos+height <= lowerRightY)
509 widgetWithinBounds = TRUE;
510 }
511
512 if (widgetWithinBounds)
513 {
514 childHandler->SelectItem(TRUE);
515 OnItemSelect(item, TRUE);
516
517// childHandler->DrawSelectionHandles(dc);
518 }
519
520 }
521 node = node->Next();
522 }
523
524 OnDragContinue(FALSE, oldDragX, oldDragY, keys, dc, NULL);
525 OnDragEnd(x, y, keys, dc, NULL);
526
527 if (needsRefresh > 0)
528 {
529 dc.Clear();
530 handlerDialog->Refresh();
531 }
532
533 // Always paint, in case the bounding box overlapped with
534 // the handles of any selected widgets, that way when the
535 // bounding box is cleared, the handles don't get partially
536 // erased where the overlap occured
537 PaintSelectionHandles(dc);
538
539 dragMode = wxDRAG_MODE_NONE;
540 checkTolerance = TRUE;
541 dragItem = NULL;
542 dragType = wxDRAG_TYPE_NONE;
543 }
544 else
545 OnLeftClick(x, y, keys);
ae8351fc 546 }
f6bcfd97 547 else if (event.RightDown())
fd71308f 548 {
f6bcfd97
BP
549 if (m_mouseCaptured)
550 {
551 handlerDialog->ReleaseMouse();
552 m_mouseCaptured = FALSE;
553 }
554
555 OnRightClick(x, y, keys);
556 }
557 else if (event.LeftDClick())
558 {
559 if (m_mouseCaptured)
560 {
561 handlerDialog->ReleaseMouse();
562 m_mouseCaptured = FALSE;
563 }
564 wxResourceManager::GetCurrentResourceManager()->EditWindow(handlerDialog);
fd71308f 565 }
fd71308f 566 }
f6bcfd97
BP
567 else
568 event.Skip();
457814b5
JS
569}
570
571void wxResourceEditorDialogHandler::OnItemEvent(wxControl *item, wxMouseEvent& event)
572{
f6bcfd97
BP
573 if (!GetEvtHandlerEnabled())
574 return;
575
576 // Not a selection handle event: just a normal item event.
577 // Transform to panel coordinates.
578 wxCoord x, y;
579 item->GetPosition(&x, &y);
580
581 event.m_x = event.m_x + x;
582 event.m_y = event.m_y + y;
583
584 ProcessItemEvent(item, event, dragType);
457814b5
JS
585}
586
587void wxResourceEditorDialogHandler::ProcessItemEvent(wxControl *item, wxMouseEvent& event, int selectionHandle)
588{
f6bcfd97
BP
589 wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
590
591 wxCoord x, y;
592 event.GetPosition(&x, &y);
593 int keys = 0;
594 if (event.ShiftDown()) keys = keys | wxKEY_SHIFT;
595 if (event.ControlDown()) keys = keys | wxKEY_CTRL;
596 bool dragging = event.Dragging();
c0e66542 597
f6bcfd97 598 if (dragging)
457814b5 599 {
f6bcfd97
BP
600 int dx = (int)abs((x - firstDragX));
601 int dy = (int)abs((y - firstDragY));
602 if (checkTolerance && (dx <= dragTolerance) && (dy <= dragTolerance))
603 {
604 return;
605 }
606 else
607 // If we've ignored the tolerance once, then ALWAYS ignore
608 // tolerance in this drag, even if we come back within
609 // the tolerance range.
610 {
611 checkTolerance = FALSE;
612 }
457814b5 613 }
f6bcfd97 614 if (event.LeftDClick())
ae8351fc 615 {
f6bcfd97
BP
616 if (m_mouseCaptured)
617 {
618 handlerDialog->ReleaseMouse();
619 m_mouseCaptured = FALSE;
620 }
621
622 wxResourceManager::GetCurrentResourceManager()->EditWindow(item);
ae8351fc 623 }
f6bcfd97 624 else if (dragging && dragItem && dragMode == wxDRAG_MODE_START_LEFT)
ae8351fc 625 {
f6bcfd97
BP
626 dragMode = wxDRAG_MODE_CONTINUE_LEFT;
627 wxClientDC dc(handlerDialog);
628 childHandler->OnDragBegin(x, y, keys, dc, selectionHandle);
629 oldDragX = x; oldDragY = y;
630 if (!m_mouseCaptured)
631 {
632 handlerDialog->CaptureMouse();
633 m_mouseCaptured = TRUE;
634 }
ae8351fc 635 }
f6bcfd97
BP
636 else if (dragging && dragItem && dragMode == wxDRAG_MODE_CONTINUE_LEFT)
637 {
638 wxClientDC dc(handlerDialog);
639 childHandler->OnDragContinue(FALSE, oldDragX, oldDragY, keys, dc, selectionHandle);
640 childHandler->OnDragContinue(TRUE, x, y, keys, dc, selectionHandle);
641 oldDragX = x; oldDragY = y;
ae8351fc 642 }
f6bcfd97 643 else if (event.LeftUp() && dragItem && dragMode == wxDRAG_MODE_CONTINUE_LEFT)
ae8351fc 644 {
f6bcfd97
BP
645 wxClientDC dc(handlerDialog);
646 dragMode = wxDRAG_MODE_NONE;
647 checkTolerance = TRUE;
648
649 childHandler->OnDragContinue(FALSE, oldDragX, oldDragY, keys, dc, selectionHandle);
650 childHandler->OnDragEnd(x, y, keys, dc, selectionHandle);
651
652 dragItem = NULL;
653 dragType = wxDRAG_TYPE_NONE;
654
655 if (m_mouseCaptured)
656 {
657 handlerDialog->ReleaseMouse();
658 m_mouseCaptured = FALSE;
659 }
ae8351fc 660 }
f6bcfd97 661 else if (dragging && dragItem && dragMode == wxDRAG_MODE_START_RIGHT)
457814b5 662 {
f6bcfd97
BP
663 wxClientDC dc(handlerDialog);
664 dragMode = wxDRAG_MODE_CONTINUE_RIGHT;
665 childHandler->OnDragBegin(x, y, keys, dc, selectionHandle);
666 oldDragX = x; oldDragY = y;
667
668 if (!m_mouseCaptured)
669 {
670 handlerDialog->CaptureMouse();
671 m_mouseCaptured = TRUE;
672 }
457814b5 673 }
f6bcfd97
BP
674 else if (dragging && dragItem && dragMode == wxDRAG_MODE_CONTINUE_RIGHT)
675 {
676 oldDragX = x; oldDragY = y;
457814b5 677 }
f6bcfd97
BP
678 // Obsolete; no longer try to right-drag
679 else if (event.RightUp() && dragItem && dragMode == wxDRAG_MODE_CONTINUE_RIGHT)
457814b5 680 {
f6bcfd97
BP
681 dragMode = wxDRAG_MODE_NONE;
682 checkTolerance = TRUE;
683 dragItem = NULL;
684 dragType = wxDRAG_TYPE_NONE;
685
686 if (m_mouseCaptured)
687 {
688 handlerDialog->ReleaseMouse();
689 m_mouseCaptured = FALSE;
690 }
457814b5 691 }
f6bcfd97 692 else if (event.IsButton())
457814b5 693 {
f6bcfd97
BP
694 checkTolerance = TRUE;
695
696 if (event.LeftDown())
697 {
698 dragItem = item;
699 dragMode = wxDRAG_MODE_START_LEFT;
700 firstDragX = x;
701 firstDragY = y;
702 dragType = selectionHandle;
703
704 if (!m_mouseCaptured)
705 {
706 handlerDialog->CaptureMouse();
707 m_mouseCaptured = TRUE;
708 }
709 }
710 else if (event.RightDown())
711 {
712 if (m_mouseCaptured)
713 {
714 handlerDialog->ReleaseMouse();
715 m_mouseCaptured = FALSE;
716 }
717
718 if (item)
719 childHandler->OnRightClick(x, y, keys);
720 else
721 OnRightClick(x, y, keys);
722
723 dragItem = NULL; dragMode = wxDRAG_MODE_NONE; dragType = wxDRAG_TYPE_NONE;
724
725 /*
726 dragItem = item;
727 dragMode = wxDRAG_MODE_START_RIGHT;
728 firstDragX = x;
729 firstDragY = y;
730 dragType = selectionHandle;
731
732 if (!m_mouseCaptured)
733 {
734 handlerDialog->CaptureMouse();
735 m_mouseCaptured = TRUE;
736 }
737 */
738 }
739 else if (event.LeftUp())
740 {
741 if (dragItem)
742 childHandler->OnLeftClick(x, y, keys);
743 else
744 OnLeftClick(x, y, keys);
745
746 dragItem = NULL; dragMode = wxDRAG_MODE_NONE; dragType = wxDRAG_TYPE_NONE;
747
748 if (m_mouseCaptured)
749 {
750 handlerDialog->ReleaseMouse();
751 m_mouseCaptured = FALSE;
752 }
753 }
754 else if (event.RightUp())
755 {
756 /*
757 if (dragItem)
457814b5 758 childHandler->OnRightClick(x, y, keys);
f6bcfd97 759 else
457814b5 760 OnRightClick(x, y, keys);
f6bcfd97
BP
761
762 dragItem = NULL; dragMode = wxDRAG_MODE_NONE; dragType = wxDRAG_TYPE_NONE;
763
764 if (m_mouseCaptured)
765 {
766 handlerDialog->ReleaseMouse();
767 m_mouseCaptured = FALSE;
768 }
769 */
770 }
457814b5 771 }
457814b5
JS
772}
773
774// Calls DrawSelectionHandles for all items if
775// edit mode is on.
776void wxResourceEditorDialogHandler::PaintSelectionHandles(wxDC& dc)
777{
f6bcfd97
BP
778 if (!GetEvtHandlerEnabled())
779 return;
780
781 dc.BeginDrawing();
782
783 wxNode *node = handlerDialog->GetChildren().First();
784 while (node)
457814b5 785 {
f6bcfd97
BP
786 wxWindow *win = (wxWindow *)node->Data();
787 if (win->IsKindOf(CLASSINFO(wxControl)))
788 {
789 wxControl *item = (wxControl *)win;
790 wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
791
792 // Don't draw handles for an item that's being moved: it'll
793 // smear.
794 if (childHandler->IsSelected() && (item != dragItem))
795 childHandler->DrawSelectionHandles(dc);
796 }
797 node = node->Next();
457814b5 798 }
f6bcfd97 799 dc.EndDrawing();
457814b5
JS
800}
801
c0e66542
GT
802
803
804void wxResourceEditorDialogHandler::DrawBoundingBox(wxDC& dc, int x, int y, int w, int h)
805{
806 dc.DrawRectangle(x, y, w, h);
807}
808
809
810void wxResourceEditorDialogHandler::OnDragBegin(int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle)
811{
812/*
813 dc.BeginDrawing();
814
815 dc.SetOptimization(FALSE);
816
817 dc.SetLogicalFunction(wxINVERT);
818
819 wxPen pen(wxColour(0, 0, 0), 1, wxDOT);
820 dc.SetPen(pen);
821 dc.SetBrush(* wxTRANSPARENT_BRUSH);
822
823 dc.SetOptimization(TRUE);
824
825// Refresh();
826// DrawBoundingBox(dc, xpos, ypos, width, height);
827
828 dc.EndDrawing();
829*/
830} //wxResourceEditorDialogHandler::OnDragBegin()
831
832
833void wxResourceEditorDialogHandler::OnDragContinue(bool WXUNUSED(paintIt), int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle)
834{
835 int upperLeftX = (x < firstDragX) ? x : firstDragX;
836 int upperLeftY = (y < firstDragY) ? y : firstDragY;
837 int lowerRightX = (x > firstDragX) ? x : firstDragX;
838 int lowerRightY = (y > firstDragY) ? y : firstDragY;
839
840 dc.BeginDrawing();
841 dc.SetLogicalFunction(wxINVERT);
842 wxPen pen(wxColour(0, 0, 0), 1, wxDOT);
843 dc.SetPen(pen);
844 dc.SetBrush(* wxTRANSPARENT_BRUSH);
845
846 DrawBoundingBox(dc, (int)upperLeftX, upperLeftY,
847 lowerRightX-upperLeftX, lowerRightY-upperLeftY);
848
849 dc.EndDrawing();
850
851} // wxResourceEditorDialogHandler::OnDragContinue()
852
853
854void wxResourceEditorDialogHandler::OnDragEnd(int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle)
855{
856/*
857 dc.BeginDrawing();
858
859 dc.SetOptimization(FALSE);
860
861 dc.SetLogicalFunction(wxCOPY);
862 dc.SetPen(* wxBLACK_PEN);
863 dc.SetBrush(* wxBLACK_BRUSH);
864
865 dc.SetOptimization(TRUE);
866
867 dc.EndDrawing();
868*/
869
870} // wxResourceEditorDialogHandler::OnDragEnd()
871
59ae5075
JS
872void wxResourceEditorDialogHandler::OnObjectEdit(wxCommandEvent& event)
873{
874 wxMenu* menu = (wxMenu*) event.GetEventObject();
875
876 wxWindow *data = (wxWindow *)menu->GetClientData();
877 if (!data)
878 return;
879
880 wxResourceManager::GetCurrentResourceManager()->EditWindow(data);
881}
882
883void wxResourceEditorDialogHandler::OnObjectDelete(wxCommandEvent& event)
884{
885 wxMenu* menu = (wxMenu*) event.GetEventObject();
886
887 wxWindow *data = (wxWindow *)menu->GetClientData();
888 if (!data)
889 return;
890
891 // Before deleting a dialog, give the user a last chance
892 // change their mind, in case they accidentally right
893 // clicked the dialog rather than the widget they were
894 // aiming for.
895 if (data->IsKindOf(CLASSINFO(wxPanel)))
896 {
897 wxString str(wxT("Deleting dialog : "));
898 str += data->GetName();
899 if (wxMessageBox(wxT("Are you sure?"), str, wxYES_NO | wxCENTRE) == wxNO)
900 return;
901 }
902
903 wxResourceManager::GetCurrentResourceManager()->DeselectItemIfNecessary(data);
904
905 wxResourceManager::GetCurrentResourceManager()->SaveInfoAndDeleteHandler(data);
906 wxResourceManager::GetCurrentResourceManager()->DeleteResource(data);
907 wxResourceManager::GetCurrentResourceManager()->DeleteWindow(data);
908}
c0e66542
GT
909
910
911
457814b5 912/*
f6bcfd97
BP
913* Event handler for controls
914*/
457814b5
JS
915
916int wxResourceEditorControlHandler::dragOffsetX = 0;
917int wxResourceEditorControlHandler::dragOffsetY = 0;
918
919wxResourceEditorControlHandler::wxResourceEditorControlHandler(wxControl *control,
f6bcfd97 920 wxEvtHandler *oldHandler)
457814b5 921{
f6bcfd97
BP
922 handlerControl = control;
923 handlerOldHandler = oldHandler;
924
925 handleSize = 6;
926 handleMargin = 1;
927 isSelected = FALSE;
928 dragOffsetX = 0;
929 dragOffsetY = 0;
930 // m_treeItem = 0;
ae8351fc
JS
931}
932
933wxResourceEditorControlHandler::~wxResourceEditorControlHandler(void)
934{
457814b5
JS
935}
936
937/*
f6bcfd97
BP
938* Manipulation and drawing of items in Edit Mode
939*/
940
457814b5
JS
941void wxResourceEditorControlHandler::SelectItem(bool select)
942{
f6bcfd97 943 isSelected = select;
457814b5
JS
944}
945
946// Returns TRUE or FALSE
947bool wxResourceEditorControlHandler::HitTest(int x, int y)
948{
f6bcfd97
BP
949 int xpos, ypos, width, height;
950 handlerControl->GetPosition(&xpos, &ypos);
951 handlerControl->GetSize(&width, &height);
952
953 return ((x >= xpos) && (x <= (xpos + width)) && (y >= ypos) && (y <= (ypos + height)));
457814b5
JS
954}
955
956// Calculate position of the 8 handles
957void wxResourceEditorControlHandler::CalcSelectionHandles(int *hx, int *hy)
958{
f6bcfd97
BP
959 int xpos, ypos, width, height;
960 handlerControl->GetPosition(&xpos, &ypos);
961 handlerControl->GetSize(&width, &height);
962 int middleX = (xpos + (width/2));
963 int middleY = (ypos + (height/2));
964
965 // Start from top middle, clockwise.
966 /*
967 7 0 1
968
969 6 2
970
971 5 4 3
972 */
973
974 hx[0] = (int)(middleX - (handleSize/2));
975 hy[0] = ypos - handleSize - handleMargin;
976
977 hx[1] = xpos + width + handleMargin;
978 hy[1] = ypos - handleSize - handleMargin;
979
980 hx[2] = xpos + width + handleMargin;
981 hy[2] = (int)(middleY - (handleSize/2));
982
983 hx[3] = xpos + width + handleMargin;
984 hy[3] = ypos + height + handleMargin;
985
986 hx[4] = (int)(middleX - (handleSize/2));
987 hy[4] = ypos + height + handleMargin;
988
989 hx[5] = xpos - handleSize - handleMargin;
990 hy[5] = ypos + height + handleMargin;
991
992 hx[6] = xpos - handleSize - handleMargin;
993 hy[6] = (int)(middleY - (handleSize/2));
994
995 hx[7] = xpos - handleSize - handleMargin;
996 hy[7] = ypos - handleSize - handleMargin;
457814b5
JS
997}
998
999// Returns 0 (no hit), 1 - 8 for which selection handle
1000// (clockwise from top middle)
1001int wxResourceEditorControlHandler::SelectionHandleHitTest(int x, int y)
1002{
f6bcfd97
BP
1003 // Handle positions
1004 int hx[8];
1005 int hy[8];
1006 CalcSelectionHandles(hx, hy);
1007
1008 int i;
1009 for (i = 0; i < 8; i++)
1010 {
1011 if ((x >= hx[i]) && (x <= (hx[i] + handleSize)) && (y >= hy[i]) && (y <= (hy[i] + handleSize)))
1012 return (i + 1);
1013 }
1014 return 0;
457814b5
JS
1015}
1016
1017void wxResourceEditorControlHandler::DrawSelectionHandles(wxDC& dc, bool WXUNUSED(erase))
1018{
f6bcfd97
BP
1019 dc.SetOptimization(FALSE);
1020
1021 dc.SetLogicalFunction(wxCOPY);
1022 dc.SetPen(* wxBLACK_PEN);
1023 dc.SetBrush(* wxBLACK_BRUSH);
1024
1025 dc.SetOptimization(TRUE);
1026
1027 // Handle positions
1028 int hx[8];
1029 int hy[8];
1030 CalcSelectionHandles(hx, hy);
1031
1032 int i;
1033 for (i = 0; i < 8; i++)
1034 {
1035 dc.DrawRectangle(hx[i], hy[i], handleSize, handleSize);
1036 }
457814b5
JS
1037}
1038
1039void wxResourceEditorControlHandler::DrawBoundingBox(wxDC& dc, int x, int y, int w, int h)
1040{
f6bcfd97 1041 dc.DrawRectangle(x, y, w, h);
457814b5
JS
1042}
1043
1044// If selectionHandle is zero, not dragging the selection handle.
1045void wxResourceEditorControlHandler::OnDragBegin(int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle)
1046{
f6bcfd97
BP
1047 int xpos, ypos, width, height;
1048 handlerControl->GetPosition(&xpos, &ypos);
1049 handlerControl->GetSize(&width, &height);
1050
457814b5 1051 dc.BeginDrawing();
f6bcfd97
BP
1052
1053 // dc.DestroyClippingRegion();
1054
1055 wxPanel *panel = (wxPanel *)handlerControl->GetParent();
1056
1057 // Erase selection handles
1058 // DrawSelectionHandles(dc, TRUE);
1059
1060 dc.SetOptimization(FALSE);
1061
2b62ab35 1062 dc.SetLogicalFunction(wxINVERT);
f6bcfd97 1063
ae8351fc
JS
1064 wxPen pen(wxColour(0, 0, 0), 1, wxDOT);
1065 dc.SetPen(pen);
c030b70f 1066 dc.SetBrush(* wxTRANSPARENT_BRUSH);
f6bcfd97
BP
1067
1068 dc.SetOptimization(TRUE);
1069
1070 if (selectionHandle > 0)
1071 {
1072 panel->Refresh();
1073
1074 DrawBoundingBox(dc, xpos, ypos, width, height);
1075 }
1076 else
1077 {
1078 panel->Refresh();
1079
1080 dragOffsetX = (x - xpos);
1081 dragOffsetY = (y - ypos);
1082
1083 DrawBoundingBox(dc, xpos, ypos, width, height);
1084
1085 // Also draw bounding boxes for other selected items
1086 wxNode *node = panel->GetChildren().First();
1087 while (node)
457814b5 1088 {
f6bcfd97
BP
1089 wxWindow *win = (wxWindow *)node->Data();
1090 if (win->IsKindOf(CLASSINFO(wxControl)))
1091 {
1092 wxControl *item = (wxControl *)win;
1093 wxResourceEditorControlHandler *handler = (wxResourceEditorControlHandler *)item->GetEventHandler();
1094 if ((item != handlerControl) && handler->IsSelected())
1095 {
1096 int x1, y1, w1, h1;
1097 item->GetPosition(&x1, &y1);
1098 item->GetSize(&w1, &h1);
1099 handler->DrawBoundingBox(dc, x1, y1, w1, h1);
1100 }
1101 }
1102 node = node->Next();
457814b5 1103 }
f6bcfd97
BP
1104 }
1105 dc.EndDrawing();
457814b5
JS
1106}
1107
f6bcfd97 1108void wxResourceEditorControlHandler::OnDragContinue(bool WXUNUSED(paintIt), int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle)
457814b5 1109{
f6bcfd97
BP
1110 wxPanel *panel = (wxPanel *)handlerControl->GetParent();
1111 int xpos, ypos, width, height;
1112 handlerControl->GetPosition(&xpos, &ypos);
1113 handlerControl->GetSize(&width, &height);
1114
1115 if (selectionHandle > 0)
457814b5 1116 {
f6bcfd97
BP
1117 /*
1118 8 1 2
1119
1120 7 3
1121
1122 6 5 4
1123 */
1124
1125 int x1, y1, width1, height1;
1126
1127 switch (selectionHandle)
1128 {
1129 case 1:
1130 x1 = xpos;
1131 y1 = y;
1132 width1 = width;
1133 height1 = (ypos + height) - y;
1134 break;
1135 case 5:
1136 x1 = xpos;
1137 y1 = ypos;
1138 width1 = width;
1139 height1 = (y - ypos);
1140 break;
1141 case 3:
1142 x1 = xpos;
1143 y1 = ypos;
1144 width1 = (x - xpos);
1145 height1 = height;
1146 break;
1147 case 7:
1148 x1 = x;
1149 y1 = ypos;
1150 width1 = (xpos + width) - x;
1151 height1 = height;
1152 break;
1153 case 2:
1154 x1 = xpos;
1155 y1 = y;
1156 width1 = (x - xpos);
1157 height1 = (ypos + height) - y;
1158 break;
1159 case 4:
1160 x1 = xpos;
1161 y1 = ypos;
1162 width1 = (x - xpos);
1163 height1 = (y - ypos);
1164 break;
1165 case 6:
1166 x1 = x;
1167 y1 = ypos;
1168 width1 = (xpos + width) - x;
1169 height1 = y - ypos;
1170 break;
1171 case 8:
1172 x1 = x;
1173 y1 = y;
1174 width1 = (xpos + width) - x;
1175 height1 = (ypos + height) - y;
1176 break;
1177 }
1178 dc.BeginDrawing();
1179
1180 dc.SetLogicalFunction(wxINVERT);
1181 wxPen pen(wxColour(0, 0, 0), 1, wxDOT);
1182 dc.SetPen(pen);
1183 dc.SetBrush(* wxTRANSPARENT_BRUSH);
1184
1185 DrawBoundingBox(dc, x1, y1, width1, height1);
1186
1187 dc.EndDrawing();
457814b5 1188 }
f6bcfd97 1189 else
fd71308f 1190 {
f6bcfd97
BP
1191 dc.BeginDrawing();
1192 dc.SetLogicalFunction(wxINVERT);
1193 wxPen pen(wxColour(0, 0, 0), 1, wxDOT);
1194 dc.SetPen(pen);
1195 dc.SetBrush(* wxTRANSPARENT_BRUSH);
1196
1197 DrawBoundingBox(dc, (int)(x - dragOffsetX), (int)(y - dragOffsetY), width, height);
1198
1199 // Also draw bounding boxes for other selected items
1200 wxNode *node = panel->GetChildren().First();
1201 while (node)
1202 {
1203 wxWindow *win = (wxWindow *)node->Data();
1204 if (win->IsKindOf(CLASSINFO(wxControl)))
1205 {
1206 wxControl *item = (wxControl *)win;
1207 wxResourceEditorControlHandler *handler = (wxResourceEditorControlHandler *)item->GetEventHandler();
1208 if ((item != handlerControl) && handler->IsSelected())
1209 {
1210 int x1, y1, w1, h1;
1211 item->GetPosition(&x1, &y1);
1212 item->GetSize(&w1, &h1);
1213 int x2 = (int)(x1 + (x - dragOffsetX) - xpos);
1214 int y2 = (int)(y1 + (y - dragOffsetY) - ypos);
1215 handler->DrawBoundingBox(dc, x2, y2, w1, h1);
1216 }
1217 }
1218 node = node->Next();
1219 }
1220 dc.EndDrawing();
fd71308f 1221 }
f6bcfd97 1222}
fd71308f 1223
f6bcfd97
BP
1224void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle)
1225{
1226 wxPanel *panel = (wxPanel *)handlerControl->GetParent();
1227
1228 dc.BeginDrawing();
1229
1230 int xpos, ypos, width, height;
1231 handlerControl->GetPosition(&xpos, &ypos);
1232 handlerControl->GetSize(&width, &height);
1233
1234 wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerControl);
1235 wxItemResource* parentResource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerControl->GetParent());
1236
1237 if (selectionHandle > 0)
fd71308f 1238 {
f6bcfd97
BP
1239 int x1, y1, width1, height1;
1240
1241 switch (selectionHandle)
1242 {
1243 case 1:
1244 x1 = xpos;
1245 y1 = y;
1246 width1 = width;
1247 height1 = (ypos + height) - y;
1248 break;
1249 case 5:
1250 x1 = xpos;
1251 y1 = ypos;
1252 width1 = width;
1253 height1 = (y - ypos);
1254 break;
1255 case 3:
1256 x1 = xpos;
1257 y1 = ypos;
1258 width1 = (x - xpos);
1259 height1 = height;
1260 break;
1261 case 7:
1262 x1 = x;
1263 y1 = ypos;
1264 width1 = (xpos + width) - x;
1265 height1 = height;
1266 break;
1267 case 2:
1268 x1 = xpos;
1269 y1 = y;
1270 width1 = (x - xpos);
1271 height1 = (ypos + height) - y;
1272 break;
1273 case 4:
1274 x1 = xpos;
1275 y1 = ypos;
1276 width1 = (x - xpos);
1277 height1 = (y - ypos);
1278 break;
1279 case 6:
1280 x1 = x;
1281 y1 = ypos;
1282 width1 = (xpos + width) - x;
1283 height1 = y - ypos;
1284 break;
1285 case 8:
1286 x1 = x;
1287 y1 = y;
1288 width1 = (xpos + width) - x;
1289 height1 = (ypos + height) - y;
1290 break;
1291 }
1292 // Update the associated resource
1293 // We need to convert to dialog units if this is not a dialog or panel, but
1294 // the parent resource specifies dialog units.
1295 int resourceX = x1;
1296 int resourceY = y1;
1297 int resourceWidth = width1;
1298 int resourceHeight = height1;
1299
1300 if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
1301 {
1302 wxPoint pt = handlerControl->GetParent()->ConvertPixelsToDialog(wxPoint(x1, y1));
1303 wxSize sz = handlerControl->GetParent()->ConvertPixelsToDialog(wxSize(width1, height1));
1304
1305 // Convert back so we've rounded down
1306 sz = handlerControl->GetParent()->ConvertDialogToPixels(sz);
1307 sz = handlerControl->GetParent()->ConvertPixelsToDialog(sz);
1308 resourceWidth = sz.x; resourceHeight = sz.y;
1309
1310 sz = handlerControl->GetParent()->ConvertDialogToPixels(sz);
1311 width1 = sz.x;
1312 height1 = sz.y;
1313
1314 pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
1315 pt = handlerControl->GetParent()->ConvertPixelsToDialog(pt);
1316 resourceX = pt.x; resourceY = pt.y;
1317
1318 pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
1319 x1 = pt.x;
1320 y1 = pt.y;
1321 }
1322 handlerControl->SetSize(x1, y1, width1, height1);
1323 resource->SetSize(resourceX, resourceY, resourceWidth, resourceHeight);
fd71308f 1324 }
f6bcfd97 1325 else
457814b5 1326 {
f6bcfd97
BP
1327 // Correction 31/12/98. We need to round down the values to take into account
1328 // the fact that several pixels map to the same dialog unit.
1329
1330 int newX = (int)(x - dragOffsetX);
1331 int newY = (int)(y - dragOffsetY);
1332 int resourceX = newX;
1333 int resourceY = newY;
1334
1335 // Update the associated resource
1336 if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
457814b5 1337 {
f6bcfd97
BP
1338 wxPoint pt = handlerControl->GetParent()->ConvertPixelsToDialog(wxPoint(newX, newY));
1339 pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
1340 pt = handlerControl->GetParent()->ConvertPixelsToDialog(pt);
e3a43801
JS
1341 resourceX = pt.x; resourceY = pt.y;
1342 pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
f6bcfd97
BP
1343
1344 // Having converted it several times, we know it'll map to dialog units exactly.
1345 newX = pt.x;
1346 newY = pt.y;
1347 }
1348 handlerControl->Move(newX, newY);
1349 OldOnMove(newX, newY);
1350
1351 resource->SetSize(resourceX, resourceY, resource->GetWidth(), resource->GetHeight());
1352
1353 // Also move other selected items
1354 wxNode *node = panel->GetChildren().First();
1355 while (node)
1356 {
1357 wxWindow *win = (wxWindow *)node->Data();
1358 if (win->IsKindOf(CLASSINFO(wxControl)))
1359 {
1360 wxControl *item = (wxControl *)win;
1361 wxResourceEditorControlHandler *handler = (wxResourceEditorControlHandler *)item->GetEventHandler();
1362 if ((item != handlerControl) && handler->IsSelected())
1363 {
1364 int x1, y1;
1365 item->GetPosition(&x1, &y1);
1366 int x2 = (int)(x1 + (x - dragOffsetX) - xpos);
1367 int y2 = (int)(y1 + (y - dragOffsetY) - ypos);
1368
1369 resourceX = x2;
1370 resourceY = y2;
1371
1372 // Update the associated resource
1373 resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item);
1374 if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
1375 {
1376 wxPoint pt = item->GetParent()->ConvertPixelsToDialog(wxPoint(x2, y2));
1377 pt = item->GetParent()->ConvertDialogToPixels(pt);
1378 pt = item->GetParent()->ConvertPixelsToDialog(pt);
1379
1380 resourceX = pt.x; resourceY = pt.y;
1381 pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
1382
1383 // Having converted it several times, we know it'll map to dialog units exactly
1384 x2 = pt.x;
1385 y2 = pt.y;
1386 }
1387
1388 item->Move(x2, y2);
1389 ((wxResourceEditorControlHandler *)item->GetEventHandler())->OldOnMove(x2, y2);
1390 ((wxResourceEditorControlHandler *)item->GetEventHandler())->DrawSelectionHandles(dc);
1391
1392 resource->SetSize(resourceX, resourceY, resource->GetWidth(), resource->GetHeight());
1393
1394 }
1395 }
1396 node = node->Next();
457814b5 1397 }
457814b5 1398 }
f6bcfd97
BP
1399 dc.SetOptimization(FALSE);
1400
1401 dc.SetLogicalFunction(wxCOPY);
1402 dc.SetPen(* wxBLACK_PEN);
1403 dc.SetBrush(* wxBLACK_BRUSH);
1404
1405 dc.SetOptimization(TRUE);
1406
1407 // Force it to repaint the selection handles (if any)
1408 // since the panel thinks we're still within a drag and
1409 // won't paint the handles.
1410 if (IsSelected())
1411 DrawSelectionHandles(dc);
1412
1413 dc.EndDrawing();
1414
1415 panel->Refresh();
457814b5
JS
1416}
1417
1418// These functions call OnItemEvent, OnItemMove and OnItemSize
1419// by default.
1420void wxResourceEditorControlHandler::OnMouseEvent(wxMouseEvent& event)
1421{
ae8351fc 1422/*
f6bcfd97
BP
1423if ((event.m_eventType == wxEVENT_TYPE_LEFT_DCLICK) ||
1424(event.m_eventType == wxEVENT_TYPE_RIGHT_DCLICK))
1425return;
1426 */
1427 wxWindow *panel = handlerControl->GetParent();
1428 if ( !panel->GetEventHandler()->IsKindOf(CLASSINFO(wxResourceEditorDialogHandler)) )
1429 return;
1430 wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler();
1431 if ( !panelHandler->GetEvtHandlerEnabled() )
1432 {
1433 event.Skip();
1434 return;
1435 }
457814b5 1436
f6bcfd97 1437 panelHandler->OnItemEvent(handlerControl, event);
457814b5
JS
1438}
1439
1440void wxResourceEditorControlHandler::OldOnMove(int x, int y)
1441{
f6bcfd97
BP
1442 wxWindow *panel = handlerControl->GetParent();
1443 if ( !panel->GetEventHandler()->IsKindOf(CLASSINFO(wxResourceEditorDialogHandler)) )
1444 return;
1445
1446 wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler();
1447 panelHandler->OnItemMove(handlerControl, x, y);
457814b5
JS
1448}
1449
1450void wxResourceEditorControlHandler::OldOnSize(int w, int h)
1451{
f6bcfd97
BP
1452 wxWindow *panel = handlerControl->GetParent();
1453 if ( !panel->GetEventHandler()->IsKindOf(CLASSINFO(wxResourceEditorDialogHandler)) )
1454 return;
1455
1456 wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler();
1457 panelHandler->OnItemSize(handlerControl, w, h);
457814b5
JS
1458}
1459
1460void wxResourceEditorControlHandler::OnSelect(bool select)
1461{
f6bcfd97
BP
1462 wxWindow *panel = handlerControl->GetParent();
1463 if ( !panel->GetEventHandler()->IsKindOf(CLASSINFO(wxResourceEditorDialogHandler)) )
1464 return;
1465
1466 wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler();
1467 panelHandler->OnItemSelect(handlerControl, select);
457814b5
JS
1468}
1469
1470void wxResourceEditorControlHandler::OnLeftClick(int x, int y, int keys)
1471{
f6bcfd97
BP
1472 wxWindow *panel = handlerControl->GetParent();
1473 if ( !panel->GetEventHandler()->IsKindOf(CLASSINFO(wxResourceEditorDialogHandler)) )
1474 return;
1475
1476 wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler();
1477 panelHandler->OnItemLeftClick(handlerControl, x, y, keys);
457814b5
JS
1478}
1479
1480void wxResourceEditorControlHandler::OnRightClick(int x, int y, int keys)
1481{
f6bcfd97
BP
1482 wxWindow *panel = handlerControl->GetParent();
1483 if ( !panel->GetEventHandler()->IsKindOf(CLASSINFO(wxResourceEditorDialogHandler)) )
1484 return;
1485
1486 wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler();
1487 panelHandler->OnItemRightClick(handlerControl, x, y, keys);
457814b5
JS
1488}
1489
1490