]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/dialoged/src/dlghndlr.cpp
Cured some small doc typos; some WIN16 fixes; transferred DLL WinMain to
[wxWidgets.git] / utils / dialoged / src / dlghndlr.cpp
index 88f3a1ab9258f1a6621f005bd5be81f853be09b8..ba3be91fd94fe819d9a00647983c339d3761c7b5 100644 (file)
 #include <math.h>
 #include <string.h>
 
+#if wxUSE_IOSTREAMH
 #if defined(__WXMSW__) && !defined(__GNUWIN32__)
 #include <strstrea.h>
 #else
 #include <strstream.h>
 #endif
+#else
+#include <strstream>
+#endif
 
 #include "reseditr.h"
 #include "winprop.h"
@@ -100,7 +104,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();
@@ -123,7 +127,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();
@@ -145,6 +149,20 @@ void wxResourceEditorDialogHandler::OnLeftClick(int x, int y, int keys)
     return;
   }
 
+  // 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())
   {
         case RESED_BUTTON:
@@ -252,7 +270,7 @@ void wxResourceEditorDialogHandler::OnItemLeftClick(wxControl *item, int WXUNUSE
     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();
@@ -327,7 +345,7 @@ void wxResourceEditorDialogHandler::OnMouseEvent(wxMouseEvent& event)
     event.Position(&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();
@@ -597,7 +615,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();
@@ -726,8 +744,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);
 
@@ -770,7 +788,7 @@ void wxResourceEditorControlHandler::OnDragBegin(int x, int y, int WXUNUSED(keys
 
   wxPen pen(wxColour(0, 0, 0), 1, wxDOT);
   dc.SetPen(pen);
-  dc.SetBrush(wxTRANSPARENT_BRUSH);
+  dc.SetBrush(wxTRANSPARENT_BRUSH);
 
   dc.SetOptimization(TRUE);
 
@@ -790,7 +808,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();
@@ -887,7 +905,7 @@ void wxResourceEditorControlHandler::OnDragContinue(bool WXUNUSED(paintIt), int
     dc.SetLogicalFunction(wxXOR);
     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);
 
@@ -899,12 +917,12 @@ void wxResourceEditorControlHandler::OnDragContinue(bool WXUNUSED(paintIt), int
       dc.SetLogicalFunction(wxXOR);
       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();
@@ -996,37 +1014,69 @@ void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys),
         height1 = (ypos + height) - y;
         break;
     }
-    handlerControl->SetSize(x1, y1, width1, height1);
-
-    // Also update the associated resource
+    // 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));
-        x1 = pt.x; y1 = pt.y;
         wxSize sz = handlerControl->GetParent()->ConvertPixelsToDialog(wxSize(width1, height1));
-        width1 = sz.x; height1 = sz.y;
+
+        // 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;
     }
-    resource->SetSize(x1, y1, width1, height1);
+    handlerControl->SetSize(x1, y1, width1, height1);
+    resource->SetSize(resourceX, resourceY, resourceWidth, resourceHeight);
   }
   else
   {
+    // 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);
-    handlerControl->Move(newX, newY);
-    OldOnMove(newX, newY);
+    int resourceX = newX;
+    int resourceY = newY;
 
-    // Also update the associated resource
+    // Update the associated resource
     if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
     {
         wxPoint pt = handlerControl->GetParent()->ConvertPixelsToDialog(wxPoint(newX, newY));
-        newX = pt.x; newY = pt.y;
+        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;
     }
-    resource->SetSize(newX, newY, resource->GetWidth(), resource->GetHeight());
+    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();
@@ -1040,18 +1090,28 @@ 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);
-          item->Move(x2, y2);
-          ((wxResourceEditorControlHandler *)item->GetEventHandler())->OldOnMove(x2, y2);
-          ((wxResourceEditorControlHandler *)item->GetEventHandler())->DrawSelectionHandles(dc);
 
-          // Also update the associated resource
+          // Update the associated resource
           resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item);
           if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
           {
-            wxPoint pt = item->GetParent()->ConvertPixelsToDialog(wxPoint(newX, newY));
-            x2 = pt.x; y2 = pt.y;
+            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;
           }
-          resource->SetSize(x2, y2, resource->GetWidth(), resource->GetHeight());
+
+          item->Move(x2, y2);
+          ((wxResourceEditorControlHandler *)item->GetEventHandler())->OldOnMove(x2, y2);
+          ((wxResourceEditorControlHandler *)item->GetEventHandler())->DrawSelectionHandles(dc);
+
+          resource->SetSize(resourceX, resourceY, resource->GetWidth(), resource->GetHeight());
 
         }
       }
@@ -1061,8 +1121,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);