2
* This file is part of wxSmith plugin for Code::Blocks Studio
3
* Copyright (C) 2006-2007 Bartlomiej Swiecki
5
* wxSmith is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 3 of the License, or
8
* (at your option) any later version.
10
* wxSmith is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with wxSmith. If not, see <http://www.gnu.org/licenses/>.
19
* $Id: wxsitemeditorcontent.cpp 4850 2008-01-29 21:45:49Z byo $
20
* $HeadURL: svn://svn.berlios.de/codeblocks/tags/8.02/src/plugins/contrib/wxSmith/wxwidgets/wxsitemeditorcontent.cpp $
23
#include "wxsitemeditorcontent.h"
24
#include "wxsitemeditordragassist.h"
25
#include "wxsbaseproperties.h"
26
#include "wxsitemresdata.h"
27
#include "wxsiteminfo.h"
28
#include "wxsparent.h"
29
#include "wxsitemeditor.h"
30
#include "wxsgridpanel.h"
31
#include "../wxscoder.h"
34
BEGIN_EVENT_TABLE(wxsItemEditorContent,wxsDrawingWindow)
35
EVT_MOUSE_EVENTS(wxsItemEditorContent::OnMouse)
36
EVT_KEY_DOWN(wxsItemEditorContent::OnKeyDown)
39
wxsItemEditorContent::wxsItemEditorContent(wxWindow* Parent,wxsItemResData* Data,wxsItemEditor* Editor):
40
wxsDrawingWindow(Parent,-1,wxDefaultPosition,wxDefaultSize,wxHSCROLL|wxVSCROLL|wxWANTS_CHARS),
50
m_AssistAddAfter(false),
53
m_Assist = new wxsItemEditorDragAssist(this);
56
wxsItemEditorContent::~wxsItemEditorContent()
60
wxsCoder::Get()->Flush(0);
63
void wxsItemEditorContent::PaintExtra(wxDC* DC)
65
m_Assist->DrawExtra(m_AssistTarget,m_AssistParent,m_AssistAddAfter,DC);
67
for ( size_t i = m_DragPoints.Count(); i-- > 0; )
69
DragPointData* DPD = m_DragPoints[i];
72
DC->SetPen(*wxGREY_PEN);
73
DC->SetBrush(*wxGREY_BRUSH);
77
DC->SetPen(*wxBLACK_PEN);
78
DC->SetBrush(*wxBLACK_BRUSH);
80
int PosX = DPD->PosX - m_DragBoxSize/2;
81
int PosY = DPD->PosY - m_DragBoxSize/2;
82
DC->DrawRectangle(PosX , PosY, m_DragBoxSize, m_DragBoxSize );
85
if ( m_MouseState==msTargetSearch && m_TargetInfo )
87
DC->DrawBitmap(m_TargetInfo->Icon16,m_TargetX+16,m_TargetY,true);
91
void wxsItemEditorContent::RefreshSelection()
97
void wxsItemEditorContent::ClearDragPoints()
99
for ( size_t i = m_DragPoints.Count(); i-- > 0; )
101
delete m_DragPoints[i];
103
m_DragPoints.Clear();
106
void wxsItemEditorContent::GreyDragPoints()
108
for ( size_t i = m_DragPoints.Count(); i-->0; )
110
m_DragPoints[i]->Grey = true;
114
void wxsItemEditorContent::RebuildDragPoints()
117
AddDragPoints(m_Data->GetRootItem(),m_Data->GetLastSelection());
120
void wxsItemEditorContent::AddDragPoints(wxsItem* Item,wxsItem* RootSelection)
122
if ( Item->GetIsSelected() )
126
if ( FindAbsoluteRect(Item,PosX,PosY,SizeX,SizeY) )
128
bool Grey = Item!=RootSelection;
129
DragPointData* ItemPoints[DragBoxTypeCnt];
131
for ( int i=0; i<DragBoxTypeCnt; ++i )
133
ItemPoints[i] = new DragPointData;
134
ItemPoints[i]->Grey = Grey;
135
ItemPoints[i]->PosX = PosX;
136
ItemPoints[i]->PosY = PosY;
137
ItemPoints[i]->Item = Item;
138
ItemPoints[i]->Type = (DragBoxType)i;
140
if ( i == Top || i == Btm )
142
ItemPoints[i]->PosX += SizeX / 2;
144
else if ( i == RightTop || i == Right || i == RightBtm )
146
ItemPoints[i]->PosX += SizeX;
149
if ( i==Left || i == Right )
151
ItemPoints[i]->PosY += SizeY / 2;
153
else if ( i == LeftBtm || i == Btm || i == RightBtm )
155
ItemPoints[i]->PosY += SizeY;
158
ItemPoints[i]->DragInitPosX = ItemPoints[i]->PosX;
159
ItemPoints[i]->DragInitPosY = ItemPoints[i]->PosY;
162
for ( int i=0; i<DragBoxTypeCnt; ++i )
164
memcpy(ItemPoints[i]->ItemPoints,ItemPoints,sizeof(ItemPoints[0]->ItemPoints));
165
m_DragPoints.Add(ItemPoints[i]);
170
wxsParent* Parent = Item->ConvertToParent();
173
for ( int i = Parent->GetChildCount(); i-->0; )
175
AddDragPoints(Parent->GetChild(i),RootSelection);
180
void wxsItemEditorContent::UpdateDragPoints(DragPointData* anyPoint)
182
DragPointData** ItemPoints = anyPoint->ItemPoints;
183
wxsItem* Item = anyPoint->Item;
187
if ( FindAbsoluteRect(Item,PosX,PosY,SizeX,SizeY) )
189
for ( int i=0; i<DragBoxTypeCnt; ++i )
191
ItemPoints[i]->PosX = PosX;
192
ItemPoints[i]->PosY = PosY;
193
ItemPoints[i]->Item = Item;
195
if ( i == Top || i == Btm )
197
ItemPoints[i]->PosX += SizeX / 2;
199
else if ( i == RightTop || i == Right || i == RightBtm )
201
ItemPoints[i]->PosX += SizeX;
204
if ( i==Left || i == Right )
206
ItemPoints[i]->PosY += SizeY / 2;
208
else if ( i == LeftBtm || i == Btm || i == RightBtm )
210
ItemPoints[i]->PosY += SizeY;
213
ItemPoints[i]->DragInitPosX = ItemPoints[i]->PosX;
214
ItemPoints[i]->DragInitPosY = ItemPoints[i]->PosY;
219
bool wxsItemEditorContent::FindAbsoluteRect(wxsItem* Item,int& PosX,int& PosY,int& SizeX,int& SizeY)
221
if ( !Item ) return false;
222
ItemToRectT::iterator i = m_ItemToRect.find(Item);
223
if ( i==m_ItemToRect.end() ) return false;
224
wxRect& Rect = (*i).second;
227
SizeX = Rect.GetWidth();
228
SizeY = Rect.GetHeight();
232
wxsItem* wxsItemEditorContent::FindItemAtPos(int PosX,int PosY,wxsItem* SearchIn)
239
if ( !FindAbsoluteRect(SearchIn,itemPosX,itemPosY,itemSizeX,itemSizeY) ) return 0;
241
if ( PosX < itemPosX ) return 0;
242
if ( PosX >= (itemPosX+itemSizeX) ) return 0;
243
if ( PosY < itemPosY ) return 0;
244
if ( PosY >= (itemPosY+itemSizeY) ) return 0;
246
wxsParent* parent = SearchIn->ConvertToParent();
249
for ( int i = parent->GetChildCount(); i-->0; )
251
wxsItem* f = FindItemAtPos(PosX,PosY,parent->GetChild(i));
262
wxsItemEditorContent::DragPointData* wxsItemEditorContent::FindDragPointAtPos(int PosX,int PosY)
264
for ( size_t i=m_DragPoints.Count(); i-->0; )
266
DragPointData* DPD = m_DragPoints[i];
267
int dpx = DPD->PosX - (m_DragBoxSize/2);
268
int dpy = DPD->PosY - (m_DragBoxSize/2);
270
if ( (PosX >= dpx) && (PosX < dpx+m_DragBoxSize) &&
271
(PosY >= dpy) && (PosY < dpy+m_DragBoxSize) )
277
// TODO (SpOoN#1#): Search for edges
282
wxsItemEditorContent::DragPointData* wxsItemEditorContent::FindDragPointFromItem(wxsItem* Item)
284
for ( size_t i = 0; i<m_DragPoints.Count(); i+= 8 )
286
if ( m_DragPoints[i]->Item == Item )
288
return m_DragPoints[i];
294
void wxsItemEditorContent::OnMouse(wxMouseEvent& event)
296
// Anti-recursion lock
297
static bool IsRunning = false;
298
if ( IsRunning ) return;
301
if ( event.ButtonDown() )
305
else if ( m_MouseState == msWaitForIdle )
307
m_MouseState = msIdle;
310
int NewX = event.m_x;
311
int NewY = event.m_y;
312
CalcUnscrolledPosition(NewX,NewY,&NewX,&NewY);
315
switch ( m_MouseState )
317
case msDraggingPointInit: OnMouseDraggingPointInit (event); break;
318
case msDraggingPoint: OnMouseDraggingPoint (event); break;
319
case msDraggingItemInit: OnMouseDraggingItemInit (event); break;
320
case msDraggingItem: OnMouseDraggingItem (event); break;
321
case msTargetSearch: OnMouseTargetSearch (event); break;
322
case msWaitForIdle: break;
323
default: OnMouseIdle (event); break;
329
void wxsItemEditorContent::OnMouseIdle(wxMouseEvent& event)
332
m_DragInitPosX = event.GetX();
333
m_DragInitPosY = event.GetY();
335
int MouseX = event.GetX();
336
int MouseY = event.GetY();
338
wxsItem* OnCursor = FindItemAtPos(MouseX,MouseY,m_Data->GetRootItem());
339
if ( !OnCursor ) OnCursor = m_Data->GetRootItem();
341
wxWindow* Preview = GetPreviewWindow(OnCursor);
343
if ( event.LeftDClick() && !event.RightIsDown() && !event.MiddleIsDown() )
347
int PosX, PosY, SizeX, SizeY;
348
FindAbsoluteRect(OnCursor,PosX,PosY,SizeX,SizeY);
349
if ( OnCursor->MouseDClick(Preview,MouseX-PosX,MouseY-PosY) )
351
m_MouseState = msWaitForIdle;
352
m_Editor->RebuildPreview();
353
m_MouseState = msWaitForIdle;
359
if ( event.LeftDown() && !event.LeftDClick() && !event.RightIsDown() && !event.MiddleIsDown() )
361
// Selecting / drag init event
362
bool NeedRefresh = false;
365
int PosX, PosY, SizeX, SizeY;
366
FindAbsoluteRect(OnCursor,PosX,PosY,SizeX,SizeY);
367
NeedRefresh = OnCursor->MouseClick(Preview,MouseX-PosX,MouseY-PosY);
372
m_MouseState = msWaitForIdle;
373
m_Editor->RebuildPreview();
374
m_MouseState = msWaitForIdle;
378
DragPointData* DPD = FindDragPointAtPos(MouseX,MouseY);
382
// If there's drag point, starting point-dragging sequence
383
m_CurDragPoint = DPD;
384
m_CurDragItem = DPD->Item;
385
m_MouseState = msDraggingPointInit;
389
if ( !OnCursor->GetIsSelected() )
391
m_Data->SelectItem(OnCursor,!event.ControlDown());
395
m_Data->SelectItem(OnCursor,false);
398
m_CurDragPoint = FindDragPointFromItem(OnCursor);
399
m_CurDragItem = OnCursor;
400
m_MouseState = msDraggingItemInit;
402
if ( !m_CurDragPoint || !m_CurDragItem )
404
// If we're here, preview has probably not been updated yet
405
m_MouseState = msWaitForIdle;
410
if ( !event.LeftIsDown() && event.RightDown() && !event.MiddleIsDown() )
414
int PosX, PosY, SizeX, SizeY;
415
FindAbsoluteRect(OnCursor,PosX,PosY,SizeX,SizeY);
416
if ( OnCursor->MouseRightClick(Preview,MouseX-PosX,MouseY-PosY) )
418
m_MouseState = msWaitForIdle;
419
m_Editor->RebuildPreview();
420
m_MouseState = msWaitForIdle;
426
if ( !event.LeftIsDown() && !event.RightIsDown() && !event.MiddleIsDown() )
430
DragPointData* DPD = FindDragPointAtPos(event.GetX(),event.GetY());
438
SetCur(wxCURSOR_SIZENWSE);
443
SetCur(wxCURSOR_SIZENS);
448
SetCur(wxCURSOR_SIZENESW);
453
SetCur(wxCURSOR_SIZEWE);
457
SetCur(wxCURSOR_ARROW);
462
SetCur(wxCURSOR_ARROW);
468
void wxsItemEditorContent::OnMouseDraggingPointInit(wxMouseEvent& event)
472
if ( event.RightIsDown() || event.MiddleIsDown() || !event.LeftIsDown() )
474
m_MouseState = msIdle;
478
int DeltaX = event.GetX() - m_DragInitPosX;
479
if ( DeltaX<0 ) DeltaX = -DeltaX;
480
int DeltaY = event.GetY() - m_DragInitPosY;
481
if ( DeltaY<0 ) DeltaY = -DeltaY;
483
if ( DeltaX + DeltaY > m_MinDragDistance )
485
m_MouseState = msDraggingPoint;
489
void wxsItemEditorContent::OnMouseDraggingPoint(wxMouseEvent& event)
491
if ( event.RightIsDown() || event.MiddleIsDown() )
494
for ( size_t i=0; i<m_DragPoints.Count(); i++ )
496
m_DragPoints[i]->PosX = m_DragPoints[i]->DragInitPosX;
497
m_DragPoints[i]->PosY = m_DragPoints[i]->DragInitPosY;
499
m_MouseState = msIdle;
503
if ( !event.LeftIsDown() )
506
m_Data->BeginChange();
508
wxsBaseProperties* Props = m_CurDragPoint->Item->GetBaseProps();
511
DragPointData* leftTop = m_CurDragPoint->ItemPoints[LeftTop];
512
DragPointData* rightBtm = m_CurDragPoint->ItemPoints[RightBtm];
513
int OldPosX = leftTop->DragInitPosX;
514
int OldPosY = leftTop->DragInitPosY;
515
int OldSizeX = rightBtm->DragInitPosX - OldPosX;
516
int OldSizeY = rightBtm->DragInitPosY - OldPosY;
517
int NewPosX = leftTop->PosX;
518
int NewPosY = leftTop->PosY;
519
int NewSizeX = rightBtm->PosX - NewPosX;
520
int NewSizeY = rightBtm->PosY - NewPosY;
525
NewSizeX = -NewSizeX;
531
NewSizeY = -NewSizeY;
534
wxWindow* Preview = GetPreviewWindow(m_CurDragPoint->Item);
538
if ( NewPosX!=OldPosX || NewPosY!=OldPosY )
540
if ( m_CurDragItem->GetParent() && (m_CurDragItem->GetParent()->GetType() == wxsTSizer) )
542
Props->m_Position.SetPosition(wxDefaultPosition,Preview->GetParent());
546
if ( m_CurDragItem->GetParent() )
548
// Adjusting position to parent coordinates
549
int ParentPosX = 0, ParentPosY = 0, ParentSizeX = 0, ParentSizeY = 0;
550
if ( FindAbsoluteRect(m_CurDragItem->GetParent(),ParentPosX,ParentPosY,ParentSizeX,ParentSizeY) )
552
NewPosX -= ParentPosX;
553
NewPosY -= ParentPosY;
554
Props->m_Position.SetPosition(wxPoint(NewPosX,NewPosY),Preview->GetParent());
559
// TODO: Update default position of window
564
if ( NewSizeX!=OldSizeX || NewSizeY!=OldSizeY )
566
Props->m_Size.SetSize(wxSize(NewSizeX,NewSizeY),Preview->GetParent());
571
m_MouseState = msIdle;
576
int DeltaX = event.GetX() - m_DragInitPosX;
577
int DeltaY = event.GetY() - m_DragInitPosY;
579
DragPointData* leftTop = m_CurDragPoint->ItemPoints[LeftTop];
580
DragPointData* rightBtm = m_CurDragPoint->ItemPoints[RightBtm];
583
switch ( m_CurDragPoint->Type )
586
leftTop->PosX = leftTop->DragInitPosX + DeltaX;
587
leftTop->PosY = leftTop->DragInitPosY + DeltaY;
588
GridFixupForGlobalCoordinates(leftTop->PosX,leftTop->PosY,m_CurDragItem);
592
leftTop->PosY = leftTop->DragInitPosY + DeltaY;
593
GridFixupForGlobalCoordinates(Dummy,leftTop->PosY,m_CurDragItem);
597
rightBtm->PosX = rightBtm->DragInitPosX + DeltaX;
598
leftTop->PosY = leftTop->DragInitPosY + DeltaY;
599
GridFixupForGlobalCoordinates(rightBtm->PosX,leftTop->PosY,m_CurDragItem);
603
leftTop->PosX = leftTop->DragInitPosX + DeltaX;
604
GridFixupForGlobalCoordinates(leftTop->PosX,Dummy,m_CurDragItem);
608
rightBtm->PosX = rightBtm->DragInitPosX + DeltaX;
609
GridFixupForGlobalCoordinates(rightBtm->PosX,Dummy,m_CurDragItem);
613
leftTop->PosX = leftTop->DragInitPosX + DeltaX;
614
rightBtm->PosY = rightBtm->DragInitPosY + DeltaY;
615
GridFixupForGlobalCoordinates(leftTop->PosX,rightBtm->PosY,m_CurDragItem);
619
rightBtm->PosY = rightBtm->DragInitPosY + DeltaY;
620
GridFixupForGlobalCoordinates(Dummy,rightBtm->PosY,m_CurDragItem);
624
rightBtm->PosX = rightBtm->DragInitPosX + DeltaX;
625
rightBtm->PosY = rightBtm->DragInitPosY + DeltaY;
626
GridFixupForGlobalCoordinates(rightBtm->PosX,rightBtm->PosY,m_CurDragItem);
632
int LX = leftTop->PosX;
633
int LY = leftTop->PosY;
634
int RX = rightBtm->PosX;
635
int RY = rightBtm->PosY;
637
DragPointData** ItemPoints = leftTop->ItemPoints;
639
ItemPoints[Top]->PosX = (LX+RX)/2;
640
ItemPoints[Top]->PosY = LY;
641
ItemPoints[RightTop]->PosX = RX;
642
ItemPoints[RightTop]->PosY = LY;
643
ItemPoints[Left]->PosX = LX;
644
ItemPoints[Left]->PosY = (LY+RY) / 2;
645
ItemPoints[Right]->PosX = RX;
646
ItemPoints[Right]->PosY = (LY+RY) / 2;
647
ItemPoints[LeftBtm]->PosX = LX;
648
ItemPoints[LeftBtm]->PosY = RY;
649
ItemPoints[Btm]->PosX = (LX+RX)/2;
650
ItemPoints[Btm]->PosY = RY;
654
void wxsItemEditorContent::OnMouseDraggingItemInit(wxMouseEvent& event)
658
if ( event.RightIsDown() || event.MiddleIsDown() || !event.LeftIsDown() )
660
m_MouseState = msIdle;
664
int DeltaX = event.GetX() - m_DragInitPosX;
665
if ( DeltaX<0 ) DeltaX = -DeltaX;
666
int DeltaY = event.GetY() - m_DragInitPosY;
667
if ( DeltaY<0 ) DeltaY = -DeltaY;
669
if ( DeltaX + DeltaY > m_MinDragDistance )
671
m_MouseState = msDraggingItem;
672
m_Assist->NewDragging();
673
SetCur(wxCURSOR_SIZING);
677
void wxsItemEditorContent::OnMouseDraggingItem(wxMouseEvent& event)
679
if ( event.RightIsDown() || event.MiddleIsDown() )
682
for ( size_t i=0; i<m_DragPoints.Count(); i++ )
684
m_DragPoints[i]->PosX = m_DragPoints[i]->DragInitPosX;
685
m_DragPoints[i]->PosY = m_DragPoints[i]->DragInitPosY;
687
m_MouseState = msIdle;
690
m_AssistAddAfter = false;
691
m_Assist->NewDragging();
695
if ( !event.LeftIsDown() )
697
if ( !m_CurDragPoint )
699
// TODO: Enable this anti-crash check after tests
704
m_Data->BeginChange();
706
if ( m_CurDragPoint->PosX != m_CurDragPoint->DragInitPosX ||
707
m_CurDragPoint->PosY != m_CurDragPoint->DragInitPosY )
709
wxsParent* NewParent = 0;
710
wxsItem* AtCursor = 0;
711
bool AddAfter = true;
712
if ( FindDraggingItemTarget(event.GetX(),event.GetY(),m_CurDragItem,NewParent,AtCursor,AddAfter) )
714
if ( (m_CurDragItem->GetParent() == NewParent) ||
715
(NewParent->CanAddChild(m_CurDragItem,false) &&
716
m_CurDragItem->CanAddToParent(NewParent,false)) )
718
wxsParent* CurParent = m_CurDragItem->GetParent();
720
if ( CurParent != NewParent || NewParent->GetType() == wxsTSizer )
722
if ( AtCursor != m_CurDragItem )
724
// Storing extra data
725
int CurIndex = CurParent->GetChildIndex(m_CurDragItem);
726
TiXmlElement ExtraData("extra");
727
CurParent->StoreExtraData(CurIndex,&ExtraData);
729
// Unbinding from old parent
730
m_CurDragItem->GetParent()->UnbindChild(m_CurDragItem);
736
NewIndex = NewParent->GetChildIndex(AtCursor);
737
if ( AddAfter ) NewIndex++;
740
NewParent->AddChild(m_CurDragItem,NewIndex);
742
// Restoring extra data
743
NewIndex = NewParent->GetChildIndex(m_CurDragItem);
744
NewParent->RestoreExtraData(NewIndex,&ExtraData);
748
wxsBaseProperties* Props = m_CurDragItem->GetBaseProps();
751
if ( NewParent->GetType() == wxsTSizer )
753
Props->m_Position.SetPosition(wxDefaultPosition,0);
757
// Calculating new position
758
int ParentPosX = 0, ParentPosY = 0, ParentSizeX = 0, ParentSizeY = 0;
759
if ( FindAbsoluteRect(NewParent,ParentPosX,ParentPosY,ParentSizeX,ParentSizeY) )
761
int NewPosX = m_CurDragPoint->ItemPoints[LeftTop]->PosX - ParentPosX;
762
int NewPosY = m_CurDragPoint->ItemPoints[LeftTop]->PosY - ParentPosY;
763
wxWindow* PreviewParent = GetPreviewWindow(NewParent);
764
GridFixup(PreviewParent,NewPosX,NewPosY);
767
Props->m_Position.SetPosition(wxPoint(NewPosX,NewPosY),PreviewParent);
775
m_MouseState = msIdle;
778
m_AssistAddAfter = false;
779
m_Assist->NewDragging();
784
int DeltaX = event.GetX() - m_DragInitPosX;
785
int DeltaY = event.GetY() - m_DragInitPosY;
787
if ( !FindDraggingItemTarget(event.GetX(),event.GetY(),m_CurDragItem,m_AssistParent,m_AssistTarget,m_AssistAddAfter) )
791
m_AssistAddAfter = false;
795
// Applying grid stuff
796
int ParentPosX = 0, ParentPosY = 0, ParentSizeX = 0, ParentSizeY = 0;
797
if ( FindAbsoluteRect(m_AssistParent,ParentPosX,ParentPosY,ParentSizeX,ParentSizeY) )
799
int NewPosX = m_CurDragPoint->ItemPoints[LeftTop]->DragInitPosX - ParentPosX + DeltaX;
800
int NewPosY = m_CurDragPoint->ItemPoints[LeftTop]->DragInitPosY - ParentPosY + DeltaY;
801
int PosXStore = NewPosX;
802
int PosYStore = NewPosY;
803
wxWindow* PreviewParent = GetPreviewWindow(m_AssistParent);
804
GridFixup(PreviewParent,NewPosX,NewPosY);
807
DeltaX += NewPosX - PosXStore;
808
DeltaY += NewPosY - PosYStore;
814
for ( size_t i=0; i<m_DragPoints.Count(); i++ )
816
m_DragPoints[i]->PosX = m_DragPoints[i]->DragInitPosX + DeltaX;
817
m_DragPoints[i]->PosY = m_DragPoints[i]->DragInitPosY + DeltaY;
823
void wxsItemEditorContent::OnMouseTargetSearch(wxMouseEvent& event)
825
if ( event.RightDown() )
827
// Getting out of point-by-mouse state
828
m_MouseState = msIdle;
832
m_AssistAddAfter = false;
833
m_Assist->NewDragging();
838
if ( event.LeftDown() )
841
if ( m_AssistParent )
843
int Position = m_AssistParent->GetChildIndex(m_AssistTarget);
844
if ( m_AssistAddAfter && Position>=0 )
848
AddItemAtTarget(m_AssistParent,Position,m_TargetInfo,event.GetX(),event.GetY());
852
m_AssistAddAfter = false;
853
m_Assist->NewDragging();
855
if ( !IsContinousInsert() )
857
m_MouseState = msIdle;
865
// highlight selection
866
m_TargetX = event.GetX();
867
m_TargetY = event.GetY();
868
if ( !FindDraggingItemTarget(event.GetX(),event.GetY(),0,m_AssistParent,m_AssistTarget,m_AssistAddAfter) )
872
m_AssistAddAfter = false;
877
bool wxsItemEditorContent::FindDraggingItemTarget(int PosX,int PosY,wxsItem* Dragging,wxsParent*& NewParent,wxsItem*& AtCursor,bool& AddAfter)
879
// Searching for item at cursor position
880
wxsItem* Cursor = FindItemAtPos(PosX,PosY,m_Data->GetRootItem());
881
if ( !Cursor ) Cursor = m_Data->GetRootItem();
883
// Avoiding shifting into dragged item
884
wxsParent* DraggedAsParent = Dragging ? Dragging->ConvertToParent() : 0;
885
if ( DraggedAsParent && DraggedAsParent->IsGrandChild(Cursor) )
887
// Can not drag into own child
891
NewParent = Cursor->ConvertToParent();
893
if ( NewParent && !::wxGetKeyState(WXK_ALT) )
900
NewParent = Cursor->GetParent();
903
// Should never be here, just in case
907
if ( NewParent->GetType() == wxsTSizer )
916
if ( FindAbsoluteRect(Cursor,ItemPosX,ItemPosY,ItemSizeX,ItemSizeY) )
918
// If cursor is on the left side, changing AddAfter flag to false
919
if ( PosX < ItemPosX+(ItemSizeX/2) )
933
void wxsItemEditorContent::BeforePreviewChanged()
937
BeforeContentChanged();
940
void wxsItemEditorContent::AfterPreviewChanged()
942
m_RebuildMaps = true;
943
AfterContentChanged();
946
void wxsItemEditorContent::ScreenShootTaken()
955
m_AssistAddAfter = false;
956
m_Assist->NewDragging();
959
wxWindow* wxsItemEditorContent::GetPreviewWindow(wxsItem* Item)
961
if ( !Item ) return 0;
962
ItemToWindowT::iterator i = m_ItemToWindow.find(Item);
963
if ( i==m_ItemToWindow.end() ) return 0;
967
void wxsItemEditorContent::ClearMaps()
969
m_ItemToRect.clear();
970
m_ItemToWindow.clear();
973
void wxsItemEditorContent::RecalculateMaps()
975
m_ItemToRect.clear();
976
m_ItemToWindow.clear();
977
RecalculateMapsReq(m_Data->GetRootItem());
978
m_RebuildMaps = false;
981
void wxsItemEditorContent::RecalculateMapsReq(wxsItem* Item)
983
if ( Item->GetLastPreview() )
985
wxWindow* win = wxDynamicCast(Item->GetLastPreview(),wxWindow);
988
m_ItemToWindow[Item] = win;
989
if ( win->IsShown() )
995
win->GetPosition(&PosX,&PosY);
996
win->GetParent()->ClientToScreen(&PosX,&PosY);
997
ScreenToClient(&PosX,&PosY);
998
CalcUnscrolledPosition(PosX,PosY,&PosX,&PosY);
999
win->GetSize(&SizeX,&SizeY);
1000
m_ItemToRect[Item] = wxRect(PosX,PosY,SizeX,SizeY);
1002
wxsParent* Parent = Item->ConvertToParent();
1005
for ( int i=0; i<Parent->GetChildCount(); i++ )
1007
if ( Parent->IsChildPreviewVisible(Parent->GetChild(i)) )
1009
RecalculateMapsReq(Parent->GetChild(i));
1018
void wxsItemEditorContent::InsertByPointing(const wxsItemInfo* Info)
1020
m_MouseState = msTargetSearch;
1021
m_TargetInfo = Info;
1024
void wxsItemEditorContent::AddItemAtTarget(wxsParent* AssistParent,int Position,const wxsItemInfo* Info,int PosX,int PosY)
1026
wxsItem* New = wxsItemFactory::Build(Info->ClassName,m_Data);
1029
if ( New->CanAddToParent(AssistParent,true) && AssistParent->CanAddChild(New,true) )
1031
m_Data->BeginChange();
1032
if ( AssistParent->AddChild(New,Position) )
1034
wxsBaseProperties* Props = New->GetBaseProps();
1036
if ( AssistParent->GetType() == wxsTSizer )
1038
Props->m_Position.SetPosition(wxDefaultPosition,0);
1042
// Calculating new position
1043
int ParentPosX = 0, ParentPosY = 0, ParentSizeX = 0, ParentSizeY = 0;
1044
if ( FindAbsoluteRect(AssistParent,ParentPosX,ParentPosY,ParentSizeX,ParentSizeY) )
1048
wxWindow* PreviewParent = GetPreviewWindow(AssistParent);
1049
GridFixup(PreviewParent,PosX,PosY);
1050
if ( PreviewParent )
1052
Props->m_Position.SetPosition(wxPoint(PosX,PosY),PreviewParent);
1057
m_Data->SelectItem(New,true);
1063
m_Data->EndChange();
1070
void wxsItemEditorContent::GridFixup(wxWindow* PreviewWindow,int& PosX,int& PosY)
1072
if ( PreviewWindow && wxDynamicCast(PreviewWindow,wxsGridPanel) )
1074
int GridSize = wxsGridPanel::GetGridSize();
1077
PosX = ( ( PosX + GridSize/2 ) / GridSize ) * GridSize;
1078
PosY = ( ( PosY + GridSize/2 ) / GridSize ) * GridSize;
1083
void wxsItemEditorContent::GridFixupForGlobalCoordinates(int& PosX,int& PosY,wxsItem* Owner)
1087
wxsParent* Parent = Owner->GetParent();
1090
int ParentPosX = 0, ParentPosY = 0, ParentSizeX = 0, ParentSizeY = 0;
1091
if ( FindAbsoluteRect(Parent,ParentPosX,ParentPosY,ParentSizeX,ParentSizeY) )
1095
wxWindow* PreviewParent = GetPreviewWindow(Parent);
1096
GridFixup(PreviewParent,PosX,PosY);
1104
bool wxsItemEditorContent::IsContinousInsert()
1106
return Manager::Get()->GetConfigManager(_T("wxsmith"))->ReadBool(_T("/continousinsert"),false);
1109
void wxsItemEditorContent::OnKeyDown(wxKeyEvent& event)
1111
GetParent()->ProcessEvent(event);