X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b127f3011fe1950a6b423c87560f026cdc90e4a3..c12a24e223e8ad2bf7962341e2f0e28a6fb79260:/utils/dialoged/src/dlghndlr.cpp diff --git a/utils/dialoged/src/dlghndlr.cpp b/utils/dialoged/src/dlghndlr.cpp index aad48c3e3b..721af4b4b0 100644 --- a/utils/dialoged/src/dlghndlr.cpp +++ b/utils/dialoged/src/dlghndlr.cpp @@ -29,12 +29,6 @@ #include #include -#if defined(__WXMSW__) && !defined(__GNUWIN32__) -#include -#else -#include -#endif - #include "reseditr.h" #include "winprop.h" #include "dlghndlr.h" @@ -46,6 +40,7 @@ IMPLEMENT_CLASS(wxResourceEditorControlHandler, wxEvtHandler) BEGIN_EVENT_TABLE(wxResourceEditorDialogHandler, wxEvtHandler) EVT_PAINT(wxResourceEditorDialogHandler::OnPaint) EVT_MOUSE_EVENTS(wxResourceEditorDialogHandler::OnMouseEvent) + EVT_SIZE(wxResourceEditorDialogHandler::OnSize) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxResourceEditorControlHandler, wxEvtHandler) @@ -99,7 +94,7 @@ void wxResourceEditorDialogHandler::OnPaint(wxPaintEvent& WXUNUSED(event)) // Add event handlers for all children void wxResourceEditorDialogHandler::AddChildHandlers(void) { - wxNode *node = handlerDialog->GetChildren()->First(); + wxNode *node = handlerDialog->GetChildren().First(); while ( node ) { wxControl *child = (wxControl *)node->Data(); @@ -122,7 +117,7 @@ void wxResourceEditorDialogHandler::OnLeftClick(int x, int y, int keys) if (wxResourceManager::GetCurrentResourceManager()->GetEditorControlList()->GetSelection() == RESED_POINTER) { int needsRefresh = 0; - wxNode *node = handlerDialog->GetChildren()->First(); + wxNode *node = handlerDialog->GetChildren().First(); while (node) { wxControl *item = (wxControl *)node->Data(); @@ -144,7 +139,19 @@ void wxResourceEditorDialogHandler::OnLeftClick(int x, int y, int keys) return; } - wxResourceManager* manager = resourceManager; + // Round down to take account of dialog units + wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerDialog); + if (resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) + { + wxPoint pt = handlerDialog->ConvertPixelsToDialog(wxPoint(x, y)); + + // Convert back so we've rounded down + pt = handlerDialog->ConvertDialogToPixels(pt); + pt = handlerDialog->ConvertPixelsToDialog(pt); + pt = handlerDialog->ConvertDialogToPixels(pt); + x = pt.x; + y = pt.y; + } switch (wxResourceManager::GetCurrentResourceManager()->GetEditorControlList()->GetSelection()) { @@ -214,7 +221,7 @@ void wxResourceEditorDialogHandler::OnRightClick(int x, int y, int WXUNUSED(keys handlerDialog->PopupMenu(menu, x, y); } -void wxResourceEditorDialogHandler::OnItemLeftClick(wxControl *item, int x, int y, int keys) +void wxResourceEditorDialogHandler::OnItemLeftClick(wxControl *item, int WXUNUSED(x), int WXUNUSED(y), int keys) { if (keys & wxKEY_CTRL) { @@ -253,7 +260,7 @@ void wxResourceEditorDialogHandler::OnItemLeftClick(wxControl *item, int x, int int needsRefresh = 0; if (!(keys & wxKEY_SHIFT)) { - wxNode *node = item->GetParent()->GetChildren()->First(); + wxNode *node = item->GetParent()->GetChildren().First(); while (node) { wxControl *child = (wxControl *)node->Data(); @@ -294,6 +301,23 @@ void wxResourceEditorDialogHandler::OnItemRightClick(wxControl *item, int x, int handlerDialog->PopupMenu(menu, x, y); } +// Under Windows 95, you can resize a panel interactively depending on +// window styles. +void wxResourceEditorDialogHandler::OnSize(wxSizeEvent& event) +{ + // Update the associated resource + int w, h; + handlerDialog->GetClientSize(& w, & h); + + wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerDialog); + if (resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) + { + wxSize sz = handlerDialog->ConvertPixelsToDialog(wxSize(w, h)); + w = sz.x; h = sz.y; + } + resource->SetSize(resource->GetX(), resource->GetY(), w, h); +} + // An event outside any items: may be a drag event. void wxResourceEditorDialogHandler::OnMouseEvent(wxMouseEvent& event) { @@ -307,11 +331,11 @@ void wxResourceEditorDialogHandler::OnMouseEvent(wxMouseEvent& event) return; } - long x, y; - event.Position(&x, &y); + wxCoord x, y; + event.GetPosition(&x, &y); // Find which selection handle we're on, if any - wxNode *node = handlerDialog->GetChildren()->First(); + wxNode *node = handlerDialog->GetChildren().First(); while (node) { wxWindow *win = (wxWindow *)node->Data(); @@ -346,7 +370,7 @@ void wxResourceEditorDialogHandler::OnMouseEvent(wxMouseEvent& event) OnLeftClick(x, y, keys); } - else if (event.RightUp()) + else if (event.RightDown()) { if (m_mouseCaptured) { @@ -356,6 +380,15 @@ void wxResourceEditorDialogHandler::OnMouseEvent(wxMouseEvent& event) OnRightClick(x, y, keys); } + else if (event.LeftDClick()) + { + if (m_mouseCaptured) + { + handlerDialog->ReleaseMouse(); + m_mouseCaptured = FALSE; + } + wxResourceManager::GetCurrentResourceManager()->EditWindow(handlerDialog); + } } else event.Skip(); @@ -368,20 +401,21 @@ void wxResourceEditorDialogHandler::OnItemEvent(wxControl *item, wxMouseEvent& e // Not a selection handle event: just a normal item event. // Transform to panel coordinates. - int x, y; + wxCoord x, y; item->GetPosition(&x, &y); event.m_x = event.m_x + x; event.m_y = event.m_y + y; + ProcessItemEvent(item, event, dragType); } void wxResourceEditorDialogHandler::ProcessItemEvent(wxControl *item, wxMouseEvent& event, int selectionHandle) { wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler(); - - long x, y; - event.Position(&x, &y); + + wxCoord x, y; + event.GetPosition(&x, &y); int keys = 0; if (event.ShiftDown()) keys = keys | wxKEY_SHIFT; if (event.ControlDown()) keys = keys | wxKEY_CTRL; @@ -466,6 +500,7 @@ void wxResourceEditorDialogHandler::ProcessItemEvent(wxControl *item, wxMouseEve { oldDragX = x; oldDragY = y; } + // Obsolete; no longer try to right-drag else if (event.RightUp() && dragItem && dragMode == wxDRAG_MODE_CONTINUE_RIGHT) { dragMode = wxDRAG_MODE_NONE; @@ -499,6 +534,20 @@ void wxResourceEditorDialogHandler::ProcessItemEvent(wxControl *item, wxMouseEve } else if (event.RightDown()) { + if (m_mouseCaptured) + { + handlerDialog->ReleaseMouse(); + m_mouseCaptured = FALSE; + } + + if (item) + childHandler->OnRightClick(x, y, keys); + else + OnRightClick(x, y, keys); + + dragItem = NULL; dragMode = wxDRAG_MODE_NONE; dragType = wxDRAG_TYPE_NONE; + + /* dragItem = item; dragMode = wxDRAG_MODE_START_RIGHT; firstDragX = x; @@ -510,6 +559,7 @@ void wxResourceEditorDialogHandler::ProcessItemEvent(wxControl *item, wxMouseEve handlerDialog->CaptureMouse(); m_mouseCaptured = TRUE; } + */ } else if (event.LeftUp()) { @@ -528,6 +578,7 @@ void wxResourceEditorDialogHandler::ProcessItemEvent(wxControl *item, wxMouseEve } else if (event.RightUp()) { + /* if (dragItem) childHandler->OnRightClick(x, y, keys); else @@ -540,6 +591,7 @@ void wxResourceEditorDialogHandler::ProcessItemEvent(wxControl *item, wxMouseEve handlerDialog->ReleaseMouse(); m_mouseCaptured = FALSE; } + */ } } } @@ -553,7 +605,7 @@ void wxResourceEditorDialogHandler::PaintSelectionHandles(wxDC& dc) dc.BeginDrawing(); - wxNode *node = handlerDialog->GetChildren()->First(); + wxNode *node = handlerDialog->GetChildren().First(); while (node) { wxWindow *win = (wxWindow *)node->Data(); @@ -682,8 +734,8 @@ void wxResourceEditorControlHandler::DrawSelectionHandles(wxDC& dc, bool WXUNUSE dc.SetOptimization(FALSE); dc.SetLogicalFunction(wxCOPY); - dc.SetPen(wxBLACK_PEN); - dc.SetBrush(wxBLACK_BRUSH); + dc.SetPen(* wxBLACK_PEN); + dc.SetBrush(* wxBLACK_BRUSH); dc.SetOptimization(TRUE); @@ -716,18 +768,17 @@ void wxResourceEditorControlHandler::OnDragBegin(int x, int y, int WXUNUSED(keys // dc.DestroyClippingRegion(); wxPanel *panel = (wxPanel *)handlerControl->GetParent(); - wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler(); // Erase selection handles // DrawSelectionHandles(dc, TRUE); dc.SetOptimization(FALSE); - dc.SetLogicalFunction(wxXOR); + dc.SetLogicalFunction(wxINVERT); wxPen pen(wxColour(0, 0, 0), 1, wxDOT); dc.SetPen(pen); - dc.SetBrush(wxTRANSPARENT_BRUSH); + dc.SetBrush(* wxTRANSPARENT_BRUSH); dc.SetOptimization(TRUE); @@ -747,7 +798,7 @@ void wxResourceEditorControlHandler::OnDragBegin(int x, int y, int WXUNUSED(keys DrawBoundingBox(dc, xpos, ypos, width, height); // Also draw bounding boxes for other selected items - wxNode *node = panel->GetChildren()->First(); + wxNode *node = panel->GetChildren().First(); while (node) { wxWindow *win = (wxWindow *)node->Data(); @@ -769,11 +820,9 @@ void wxResourceEditorControlHandler::OnDragBegin(int x, int y, int WXUNUSED(keys dc.EndDrawing(); } -void wxResourceEditorControlHandler::OnDragContinue(bool paintIt, int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle) +void wxResourceEditorControlHandler::OnDragContinue(bool WXUNUSED(paintIt), int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle) { wxPanel *panel = (wxPanel *)handlerControl->GetParent(); - wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler(); - int xpos, ypos, width, height; handlerControl->GetPosition(&xpos, &ypos); handlerControl->GetSize(&width, &height); @@ -843,10 +892,10 @@ void wxResourceEditorControlHandler::OnDragContinue(bool paintIt, int x, int y, } dc.BeginDrawing(); - dc.SetLogicalFunction(wxXOR); + dc.SetLogicalFunction(wxINVERT); wxPen pen(wxColour(0, 0, 0), 1, wxDOT); dc.SetPen(pen); - dc.SetBrush(wxTRANSPARENT_BRUSH); + dc.SetBrush(* wxTRANSPARENT_BRUSH); DrawBoundingBox(dc, x1, y1, width1, height1); @@ -855,15 +904,15 @@ void wxResourceEditorControlHandler::OnDragContinue(bool paintIt, int x, int y, else { dc.BeginDrawing(); - dc.SetLogicalFunction(wxXOR); + dc.SetLogicalFunction(wxINVERT); wxPen pen(wxColour(0, 0, 0), 1, wxDOT); dc.SetPen(pen); - dc.SetBrush(wxTRANSPARENT_BRUSH); + dc.SetBrush(* wxTRANSPARENT_BRUSH); DrawBoundingBox(dc, (int)(x - dragOffsetX), (int)(y - dragOffsetY), width, height); // Also draw bounding boxes for other selected items - wxNode *node = panel->GetChildren()->First(); + wxNode *node = panel->GetChildren().First(); while (node) { wxWindow *win = (wxWindow *)node->Data(); @@ -890,7 +939,6 @@ void wxResourceEditorControlHandler::OnDragContinue(bool paintIt, int x, int y, void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys), wxDC& dc, int selectionHandle) { wxPanel *panel = (wxPanel *)handlerControl->GetParent(); - wxResourceEditorDialogHandler *panelHandler = (wxResourceEditorDialogHandler *)panel->GetEventHandler(); dc.BeginDrawing(); @@ -898,6 +946,9 @@ void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys), handlerControl->GetPosition(&xpos, &ypos); handlerControl->GetSize(&width, &height); + wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerControl); + wxItemResource* parentResource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerControl->GetParent()); + if (selectionHandle > 0) { int x1, y1, width1, height1; @@ -953,15 +1004,69 @@ void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys), height1 = (ypos + height) - y; break; } + // Update the associated resource + // We need to convert to dialog units if this is not a dialog or panel, but + // the parent resource specifies dialog units. + int resourceX = x1; + int resourceY = y1; + int resourceWidth = width1; + int resourceHeight = height1; + + if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) + { + wxPoint pt = handlerControl->GetParent()->ConvertPixelsToDialog(wxPoint(x1, y1)); + wxSize sz = handlerControl->GetParent()->ConvertPixelsToDialog(wxSize(width1, height1)); + + // Convert back so we've rounded down + sz = handlerControl->GetParent()->ConvertDialogToPixels(sz); + sz = handlerControl->GetParent()->ConvertPixelsToDialog(sz); + resourceWidth = sz.x; resourceHeight = sz.y; + + sz = handlerControl->GetParent()->ConvertDialogToPixels(sz); + width1 = sz.x; + height1 = sz.y; + + pt = handlerControl->GetParent()->ConvertDialogToPixels(pt); + pt = handlerControl->GetParent()->ConvertPixelsToDialog(pt); + resourceX = pt.x; resourceY = pt.y; + + pt = handlerControl->GetParent()->ConvertDialogToPixels(pt); + x1 = pt.x; + y1 = pt.y; + } handlerControl->SetSize(x1, y1, width1, height1); + resource->SetSize(resourceX, resourceY, resourceWidth, resourceHeight); } else { - handlerControl->Move((int)(x - dragOffsetX), (int)(y - dragOffsetY)); - OldOnMove((int)(x - dragOffsetX), (int)(y - dragOffsetY)); + // Correction 31/12/98. We need to round down the values to take into account + // the fact that several pixels map to the same dialog unit. + + int newX = (int)(x - dragOffsetX); + int newY = (int)(y - dragOffsetY); + int resourceX = newX; + int resourceY = newY; + + // Update the associated resource + if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) + { + wxPoint pt = handlerControl->GetParent()->ConvertPixelsToDialog(wxPoint(newX, newY)); + pt = handlerControl->GetParent()->ConvertDialogToPixels(pt); + pt = handlerControl->GetParent()->ConvertPixelsToDialog(pt); + resourceX = pt.x; resourceY = pt.y; + pt = handlerControl->GetParent()->ConvertDialogToPixels(pt); + + // Having converted it several times, we know it'll map to dialog units exactly. + newX = pt.x; + newY = pt.y; + } + handlerControl->Move(newX, newY); + OldOnMove(newX, newY); + + resource->SetSize(resourceX, resourceY, resource->GetWidth(), resource->GetHeight()); // Also move other selected items - wxNode *node = panel->GetChildren()->First(); + wxNode *node = panel->GetChildren().First(); while (node) { wxWindow *win = (wxWindow *)node->Data(); @@ -975,9 +1080,29 @@ void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys), item->GetPosition(&x1, &y1); int x2 = (int)(x1 + (x - dragOffsetX) - xpos); int y2 = (int)(y1 + (y - dragOffsetY) - ypos); + + // Update the associated resource + resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item); + if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) + { + wxPoint pt = item->GetParent()->ConvertPixelsToDialog(wxPoint(x2, y2)); + pt = item->GetParent()->ConvertDialogToPixels(pt); + pt = item->GetParent()->ConvertPixelsToDialog(pt); + + resourceX = pt.x; resourceY = pt.y; + pt = handlerControl->GetParent()->ConvertDialogToPixels(pt); + + // Having converted it several times, we know it'll map to dialog units exactly + x2 = pt.x; + y2 = pt.y; + } + item->Move(x2, y2); ((wxResourceEditorControlHandler *)item->GetEventHandler())->OldOnMove(x2, y2); ((wxResourceEditorControlHandler *)item->GetEventHandler())->DrawSelectionHandles(dc); + + resource->SetSize(resourceX, resourceY, resource->GetWidth(), resource->GetHeight()); + } } node = node->Next(); @@ -986,8 +1111,8 @@ void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys), dc.SetOptimization(FALSE); dc.SetLogicalFunction(wxCOPY); - dc.SetPen(wxBLACK_PEN); - dc.SetBrush(wxBLACK_BRUSH); + dc.SetPen(* wxBLACK_PEN); + dc.SetBrush(* wxBLACK_BRUSH); dc.SetOptimization(TRUE);