#include <math.h>
#include <string.h>
-#if defined(__WXMSW__) && !defined(__GNUWIN32__)
-#include <strstrea.h>
-#else
-#include <strstream.h>
-#endif
-
#include "reseditr.h"
#include "winprop.h"
#include "dlghndlr.h"
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)
resourceManager->RemoveSelection(item);
}
-void wxResourceEditorDialogHandler::OnPaint(wxPaintEvent& event)
+void wxResourceEditorDialogHandler::OnPaint(wxPaintEvent& WXUNUSED(event))
{
wxPaintDC dc(handlerDialog);
// 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();
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();
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())
{
case RESED_CHOICE:
resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxChoice", x, y);
break;
+ case RESED_COMBOBOX:
+ resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxComboBox", x, y);
+ break;
case RESED_CHECKBOX:
resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxCheckBox", x, y);
break;
}
}
-#if 0
-void wxResourceEditorDialogHandler::OnLeftClick(int x, int y, int keys)
-{
- if (keys & wxKEY_CTRL)
- {
- wxResourceManager::GetCurrentResourceManager()->EditWindow(handlerDialog);
- return;
- }
-
- // Deselect all items if click on panel
- if (resourceManager->GetEditorPalette()->currentlySelected == PALETTE_ARROW)
- {
- int needsRefresh = 0;
- wxNode *node = handlerDialog->GetChildren()->First();
- while (node)
- {
- wxControl *item = (wxControl *)node->Data();
- wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
- if (item->IsKindOf(CLASSINFO(wxControl)) && childHandler->IsSelected())
- {
- needsRefresh ++;
- OnItemSelect(item, FALSE);
- childHandler->SelectItem(FALSE);
- }
- node = node->Next();
- }
- if (needsRefresh > 0)
- {
- wxClientDC dc(handlerDialog);
- dc.Clear();
- handlerDialog->Refresh();
- }
- return;
- }
-
- wxResourceManager* manager = resourceManager;
-
- switch (resourceManager->GetEditorPalette()->currentlySelected)
- {
- case PALETTE_FRAME:
- break;
- case PALETTE_DIALOG_BOX:
- break;
- case PALETTE_PANEL:
- break;
- case PALETTE_CANVAS:
- break;
- case PALETTE_TEXT_WINDOW:
- break;
- case PALETTE_BUTTON:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxButton", x, y);
- break;
- case PALETTE_BITMAP_BUTTON:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxButton", x, y, TRUE);
- break;
- case PALETTE_MESSAGE:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxStaticText", x, y);
- break;
- case PALETTE_BITMAP_MESSAGE:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxStaticBitmap", x, y, TRUE);
- break;
- case PALETTE_TEXT:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxTextCtrl (single-line)", x, y);
- break;
- case PALETTE_MULTITEXT:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxTextCtrl (multi-line)", x, y);
- break;
- case PALETTE_CHOICE:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxChoice", x, y);
- break;
- case PALETTE_CHECKBOX:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxCheckBox", x, y);
- break;
- case PALETTE_RADIOBOX:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxRadioBox", x, y);
- break;
- case PALETTE_LISTBOX:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxListBox", x, y);
- break;
- case PALETTE_SLIDER:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxSlider", x, y);
- break;
- case PALETTE_GAUGE:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxGauge", x, y);
- break;
- case PALETTE_GROUPBOX:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxStaticBox", x, y);
- break;
- case PALETTE_SCROLLBAR:
- resourceManager->CreatePanelItem(handlerResource, handlerDialog, "wxScrollBar", x, y);
- break;
- default:
- break;
- }
-
- // Now switch pointer on.
- if (manager->GetEditorPalette()->currentlySelected != PALETTE_ARROW)
- {
- manager->GetEditorPalette()->ToggleTool(manager->GetEditorPalette()->currentlySelected, FALSE);
- manager->GetEditorPalette()->ToggleTool(PALETTE_ARROW, TRUE);
- manager->GetEditorPalette()->currentlySelected = PALETTE_ARROW;
- }
-}
-#endif
-
-void wxResourceEditorDialogHandler::OnRightClick(int x, int y, int keys)
+void wxResourceEditorDialogHandler::OnRightClick(int x, int y, int WXUNUSED(keys))
{
wxMenu *menu = resourceManager->GetPopupMenu();
menu->SetClientData((char *)handlerDialog);
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)
{
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();
}
}
-void wxResourceEditorDialogHandler::OnItemRightClick(wxControl *item, int x, int y, int keys)
+void wxResourceEditorDialogHandler::OnItemRightClick(wxControl *item, int x, int y, int WXUNUSED(keys))
{
/*
if (keys & wxKEY_CTRL)
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)
{
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();
OnLeftClick(x, y, keys);
}
- else if (event.RightUp())
+ else if (event.RightDown())
{
if (m_mouseCaptured)
{
OnRightClick(x, y, keys);
}
+ else if (event.LeftDClick())
+ {
+ if (m_mouseCaptured)
+ {
+ handlerDialog->ReleaseMouse();
+ m_mouseCaptured = FALSE;
+ }
+ wxResourceManager::GetCurrentResourceManager()->EditWindow(handlerDialog);
+ }
}
else
event.Skip();
// 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;
{
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;
}
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;
handlerDialog->CaptureMouse();
m_mouseCaptured = TRUE;
}
+ */
}
else if (event.LeftUp())
{
}
else if (event.RightUp())
{
+ /*
if (dragItem)
childHandler->OnRightClick(x, y, keys);
else
handlerDialog->ReleaseMouse();
m_mouseCaptured = FALSE;
}
+ */
}
}
}
dc.BeginDrawing();
- wxNode *node = handlerDialog->GetChildren()->First();
+ wxNode *node = handlerDialog->GetChildren().First();
while (node)
{
wxWindow *win = (wxWindow *)node->Data();
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);
// 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);
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();
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);
}
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);
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();
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();
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;
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();
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();
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);