2 * levels__wndEditPanelOrder.cpp
4 * Created on: 5 mai 2009
12 #include <wx/dcbuffer.h>
14 #include "levels__sidesWindows.h"
15 #include "levels__globals.h"
18 const int max_img_size
= 200;
19 const int margins
= 8;
20 const int imgs_space
= 5;
21 const int margin_orderCtrl
= 25;
23 //****************************************************
25 myWnd_EditPanelOrder::myWnd_EditPanelOrder( wxWindow
* _parent
, ob_stage
* _stage
)
26 :wxDialog( _parent
, wxID_ANY
, wxT("Panel Order"), wxDefaultPosition
, wxDefaultSize
27 ,wxMAXIMIZE_BOX
| wxRESIZE_BORDER
| wxDEFAULT_DIALOG_STYLE
| wxFULL_REPAINT_ON_RESIZE
)
28 , font_Alphabet( 18, wxFONTFAMILY_DEFAULT
, wxFONTSTYLE_NORMAL
, wxFONTWEIGHT_BOLD
, true )
29 , font_Label( 16, wxFONTFAMILY_DEFAULT
, wxFONTSTYLE_NORMAL
, wxNORMAL
, true )
34 b_reverted_direction
= false;
35 b_rotate_imgs
= false;
38 switch( stage->direction )
43 b_reverted_direction = true;
46 switch( stage->direction )
59 void myWnd_EditPanelOrder::Init()
61 //*****************************
63 wxBoxSizer
* sizer_wrapper
= new wxBoxSizer( wxHORIZONTAL
);
64 thePanel
= new wxScrolledWindow( this );
65 thePanel
->EnableScrolling( false, true );
66 thePanel
->SetScrollRate( 0, 20 );
67 sizer_wrapper
->Add( thePanel
, 1, wxEXPAND
| wxALL
, 10 );
68 wxBoxSizer
* sizer_main
= new wxBoxSizer( wxVERTICAL
);
69 thePanel
->SetSizer( sizer_main
);
73 //*****************************
77 l_panels
= (ob_stage_panel
**) stage
->GetSubObjectS_ofType( OB_TYPE_STAGE_PANEL
, nb_panels
);
81 curr_order
= stage
->Get_Panels_Order();
87 wxStaticText
* t
= new wxStaticText( thePanel
, wxID_ANY
, wxT("STAGE OBJECT == NULL !!"));
88 t
->SetFont(font_Alphabet
);
89 sizer_main
->Add( t
, 0, wxCENTER
);
93 //*****************************
95 else if( nb_panels
<= 0 )
97 wxStaticText
* t
= new wxStaticText( thePanel
, wxID_ANY
, wxT("NO PANELS DEFINED !!"));
98 t
->SetFont(font_Alphabet
);
99 sizer_main
->Add( t
, 0, wxCENTER
);
104 wxBoxSizer
* sizer_temp
;
105 wxStaticText
* t_stat
;
107 //*****************************
110 t_stat
= new wxStaticText( thePanel
, wxID_ANY
, wxT("Avalaible panels"),
111 wxDefaultPosition
, wxDefaultSize
);
112 t_stat
->SetFont( font_Label
);
113 sizer_main
->Add( t_stat
, 0, wxALL
, margins
);
116 wxBoxSizer
* sizerWrapper_panel_BGs
= new wxBoxSizer( wxVERTICAL
);
117 AScrollPanel
*panel_BGs
= new AScrollPanel( thePanel
);
118 // panel_BGs->SetBackgroundColour( *wxWHITE );
119 wxBoxSizer
* panel_BGs_sizer
= new wxBoxSizer( wxHORIZONTAL
);
120 panel_BGs
->SetSizer( panel_BGs_sizer
);
121 panel_BGs
->SetMinSize( wxSize(60, 60) );
122 panel_BGs
->Set_FixedDirections( false, true );
123 sizerWrapper_panel_BGs
->Add(panel_BGs
, 1, wxEXPAND
);
124 sizer_main
->Add( sizerWrapper_panel_BGs
, 0, wxEXPAND
);
126 for( size_t i
= 0; i
< nb_panels
; i
++ )
128 sizer_temp
= new wxBoxSizer( wxVERTICAL
);
130 MyImageCtrl
* t_imgctrl
= new MyImageCtrl( panel_BGs
);
131 t_imgctrl
->Set_BoundDimensions( max_img_size
, max_img_size
);
132 t_imgctrl
->SetImage( l_panels
[i
]->GetImage() );
133 sizer_temp
->Add( t_imgctrl
, 0, wxALL
, imgs_space
);
135 t_stat
= new wxStaticText( panel_BGs
, wxID_ANY
, l_panels
[i
]->GetName() );
136 sizer_temp
->Add( t_stat
, 0, wxCENTER
|wxALL
, imgs_space
);
137 panel_BGs_sizer
->Add( sizer_temp
, 0, wxEXPAND
|wxALL
, imgs_space
);
139 t_stat
= new wxStaticText( panel_BGs
, wxID_ANY
, wxChar( 'a' + i
),
140 wxDefaultPosition
, wxDefaultSize
, wxALIGN_CENTRE
);
141 t_stat
->SetFont( font_Alphabet
);
142 t_stat
->SetMinSize( wxSize( 40, wxDefaultCoord
));
143 sizer_temp
->Add( t_stat
, 0, wxCENTER
|wxALL
, 5);
148 //*****************************
149 // ADD the control Text of the order
150 sizer_temp
= new wxBoxSizer( wxHORIZONTAL
);
151 t_stat
= new wxStaticText( thePanel
, wxID_ANY
, wxT("Order\n(Use arrow Keys)") );
152 sizer_temp
->Add( t_stat
, 0, wxCENTER
);
153 txtCtrl_order
= new wxTextCtrl( thePanel
, wxID_ANY
, wxString(),
154 wxDefaultPosition
, wxDefaultSize
, 0,
155 wxValidator_Restrict_Range( 'a', wxChar( 'a' + nb_panels
- 1 ) ) );
156 txtCtrl_order
->Connect( wxEVT_KEY_UP
, wxKeyEventHandler(myWnd_EditPanelOrder::Evt_Order_KeyPress
), NULL
, this);
157 txtCtrl_order
->Connect( wxEVT_COMMAND_TEXT_UPDATED
, wxCommandEventHandler(myWnd_EditPanelOrder::Evt_Order_Changed
), NULL
, this);
158 /* txtCtrl_order->Connect( wxEVT_LEFT_UP , wxMouseEventHandler(myWnd_EditPanelOrder::Evt_Order_Mouse_In), NULL, this);
160 sizer_temp
->Add( txtCtrl_order
, 1, wxCENTER
|wxTOP
|wxBOTTOM
|wxEXPAND
, margin_orderCtrl
);
162 sizer_main
->Add( sizer_temp
, 0, wxEXPAND
);
165 /* // No order, make a initial one
166 if( curr_order == wxString() )
168 for( size_t i =0; i < nb_panels; i++ )
169 curr_order += wxChar( 'a' + i );
170 // stage->Add_SubObj( new ob_object( "order", curr_order ) );
172 txtCtrl_order
->ChangeValue( curr_order
);
175 //*****************************
176 // ADD the view of the order
177 t_stat
= new wxStaticText( thePanel
, wxID_ANY
, wxT("Order view"),
178 wxDefaultPosition
, wxDefaultSize
);
179 t_stat
->SetFont( font_Label
);
180 sizer_main
->Add( t_stat
, 0, wxALL
, margins
);
182 wxBoxSizer
* sizerWrapper_stage_view
= new wxBoxSizer( wxVERTICAL
);
183 panel_stage_view
= new AScrollPanel( thePanel
);
184 panel_stage_view
->SetMinSize( wxSize(100, 100) );
185 panel_stage_view
->Set_FixedDirections( false, true );
186 panel_stage_view
->SetBackgroundStyle( wxBG_STYLE_CUSTOM
);
187 // panel_stage_view->SetBackgroundColour( *wxWHITE );
188 panel_stage_view
->Connect( wxEVT_PAINT
, wxPaintEventHandler(myWnd_EditPanelOrder::Evt_Paint_PanelView
), NULL
, this);
189 sizerWrapper_stage_view
->Add(panel_stage_view
, 1, wxEXPAND
);
190 wxBoxSizer
* panel_stage_view_sizer
= new wxBoxSizer( wxHORIZONTAL
);
191 panel_stage_view
->SetSizer( panel_stage_view_sizer
);
192 sizer_main
->Add( sizerWrapper_stage_view
, 0, wxEXPAND
);
194 img_ctrl_list
= NULL
;
195 img_ctrl_list_count
= 0;
199 //*****************************
200 // ADD the OK/CANCEL buttons
201 sizer_temp
= new wxBoxSizer( wxHORIZONTAL
);
203 sizer_temp
->AddStretchSpacer();
205 wxButton
* t_butt
= new wxButton( thePanel
, wxID_ANY
, wxT("OK") );
206 t_butt
->Connect( wxEVT_COMMAND_BUTTON_CLICKED
, wxCommandEventHandler(myWnd_EditPanelOrder::Evt_Click_OK
), NULL
, this);
207 sizer_temp
->Add( t_butt
);
209 sizer_temp
->AddSpacer( 30 );
211 t_butt
= new wxButton( thePanel
, wxID_ANY
, wxT("CANCEL" ));
212 t_butt
->Connect( wxEVT_COMMAND_BUTTON_CLICKED
, wxCommandEventHandler(myWnd_EditPanelOrder::Evt_Click_CANCEL
), NULL
, this);
213 sizer_temp
->Add( t_butt
);
215 sizer_temp
->AddStretchSpacer();
217 sizer_main
->Add( sizer_temp
, 0, wxEXPAND
| wxTOP
, 15);
220 SetSizer( sizer_wrapper
);
222 Frame_RestorePrevCoord( this, wxT("Panels_Ordering" ));
226 //****************************************************
228 void myWnd_EditPanelOrder::ZeroInit()
236 img_ctrl_list
= NULL
;
237 img_ctrl_list_count
= 0;
242 //****************************************************
244 void myWnd_EditPanelOrder::EvtClose( wxCloseEvent
& event
)
246 Frame_SaveCoord( this, wxT("Panels_Ordering" ));
251 //****************************************************
253 myWnd_EditPanelOrder::~myWnd_EditPanelOrder()
255 if( l_panels
!= NULL
)
260 //****************************************************
262 void myWnd_EditPanelOrder::EvtSize( wxSizeEvent
& evt
)
264 wxSize s
= thePanel
->GetClientSize();
265 int max_x
= s
.x
- 20;
268 thePanel
->SetVirtualSizeHints(60,60, max_x
, -1 );
269 // SetSize( wxSize( s.x, wxDefaultCoord ) );
275 //****************************************************
277 void myWnd_EditPanelOrder::Evt_Click_OK( wxCommandEvent
& evt
)
281 wxString old_order
= stage
->Get_Panels_Order();
282 if( curr_order
!= old_order
)
285 orders
= stage
->GetSubObjectS( wxT("order"), nb_orders
);
289 orders
= new ob_object
*[1];
290 orders
[0] = new ob_object( wxT("order") );
292 stage
->Add_SubObj( orders
[0] );
296 ob_object
* last_obj
= orders
[nb_orders
-1];
297 while( curr_order
.Len() > 0 )
300 if( curr_ind
>= nb_orders
)
302 o
= new ob_object(wxT("order" ));
303 last_obj
->InsertObject_After( o
);
306 o
= orders
[curr_ind
];
308 if( curr_order
.Len() <= 26 )
310 o
->SetToken( 0, curr_order
);
315 o
->SetToken( 0, curr_order
.Left(26) );
316 curr_order
= curr_order
.Right(curr_order
.Len()-26);
320 // Remove unused orders objects
321 for( size_t i
= curr_ind
; i
< nb_orders
; i
++ )
328 /* // Debug panel_map
329 if( false && panels_map != NULL )
331 wxString str_panelmap = "[";
332 for( int i = 0; i< tay_panels_map; i++)
334 str_panelmap += IntToStr( panels_map[i] ) + ",";
336 str_panelmap = str_panelmap.Mid(0, str_panelmap.Len() -1 );
339 wxMessageBox( "Panels Map :\n" + str_panelmap );
347 //****************************************************
349 void myWnd_EditPanelOrder::Evt_Click_CANCEL( wxCommandEvent
& evt
)
351 // Update_PanelsView();
356 //****************************************************
358 void myWnd_EditPanelOrder::Evt_Click_OrderElt( wxMouseEvent
& evt
)
360 int id
= evt
.GetId() - wxID_HIGHEST
;
361 if( b_reverted_direction
)
362 id
= curr_order
.Len() - id
- 1;
363 txtCtrl_order
->SetInsertionPoint( id
);
369 //****************************************************
371 void myWnd_EditPanelOrder::Evt_Order_Mouse_In( wxMouseEvent
& evt
)
373 //int id = txtCtrl_order->GetInsertionPoint();
374 txtCtrl_order
->SetSelection( curr_ind
, curr_ind
);
375 txtCtrl_order
->SetInsertionPoint( curr_ind
);
376 txtCtrl_order
->Update();
381 //****************************************************
383 void myWnd_EditPanelOrder::Evt_Order_KeyPress( wxKeyEvent
& evt
)
390 //****************************************************
392 void myWnd_EditPanelOrder::Evt_Order_Changed( wxCommandEvent
& evt
)
394 wxString new_order
= txtCtrl_order
->GetValue();
395 if( new_order
!= curr_order
)
397 bool b_accept_change
= true;
401 if( curr_order
.Len() < new_order
.Len() )
404 for( size_t i
=0; i
< curr_order
.Len();i
++)
406 if( curr_order
[i
] != new_order
[i
] )
409 i
= curr_order
.Len();
413 // have to handle the clones char case
414 if( ind_change
> 0 && new_order
[ind_change
] == new_order
[ind_change
-1] )
416 // get insertion point
417 long i
= txtCtrl_order
->GetInsertionPoint();
419 ind_change
= (int) i
;
423 if( ind_change
!= -1 )
425 // Check that everything is really unchanged after the mod
426 bool b_no_change_after
= true;
427 for( size_t i
= ind_change
; i
< curr_order
.Len();i
++ )
429 if( new_order
[i
+1] != curr_order
[i
] )
431 b_no_change_after
= false;
432 i
= curr_order
.Len();
436 if( ! b_no_change_after
)
438 wxMessageBox( wxT("More than one change at one time can't be handled !!\nChange after case...") );
439 b_accept_change
= false;
443 //Get the ind in map for the lower changed panel
445 for( int i
= 0; i
< tay_panels_map
; i
++ )
447 if( panels_map
[i
] >= ind_change
)
454 if( ind_in_map
== -1 )
456 wxMessageBox( wxT("BUG ??\nNo indice in map found for the insertion !!!") );
457 b_accept_change
= false;
461 //must remap all the upper indices to indices +1
462 for( int i
= ind_in_map
; i
< tay_panels_map
; i
++ )
464 // except if the panel have been deleted
465 if( panels_map
[i
] != -1 )
466 panels_map
[i
] = panels_map
[i
] + 1;
472 // Insertion after the old order -> ok
479 else if( curr_order
.Len() > new_order
.Len() )
482 for( size_t i
=0; i
< new_order
.Len(); i
++)
484 if( curr_order
[i
] != new_order
[i
] )
487 i
= curr_order
.Len();
492 if( ind_change
!= -1 )
494 // Check that everything is really unchanged after the mod
495 bool b_no_change_after
= true;
496 for( size_t i
= ind_change
; i
< new_order
.Len();i
++ )
498 if( new_order
[i
] != curr_order
[i
+1] )
500 b_no_change_after
= false;
501 i
= curr_order
.Len();
505 if( ! b_no_change_after
)
507 wxMessageBox( wxT("More than one change at one time can't be handled !!\nChange after case...") );
508 b_accept_change
= false;
512 //Get the ind in map for the lower changed panel
514 bool b_suppress_original
= false;
515 for( int i
= 0; i
< tay_panels_map
; i
++ )
517 if( panels_map
[i
] >= ind_change
)
519 if( panels_map
[i
] == ind_change
)
520 b_suppress_original
= true;
527 if( ind_in_map
== -1 )
529 wxMessageBox( wxT("BUG ??\nNo indice in map found for the suppression !!!" ));
530 b_accept_change
= false;
536 //must remap all the upper indices to indices -1
537 for( int i
= ind_in_map
; i
< tay_panels_map
; i
++ )
539 // except if the panel have been deleted
540 if( panels_map
[i
] != -1 )
541 panels_map
[i
] = panels_map
[i
] - 1;
544 // Must Set "delete" to the ind_of_change
545 if( b_suppress_original
)
546 panels_map
[ind_in_map
] = -1;
551 // End char Suppressed
554 for( int i
= tay_panels_map
-1; i
>= 0; i
-- )
556 if( (size_t) panels_map
[i
] >= new_order
.Len() )
565 // Check that there is only one change
567 for( size_t i
= 0; i
< curr_order
.Len(); i
++)
569 if( curr_order
[i
] != new_order
[i
] )
571 if( ind_change
== -1 && ind_change
!= -2 )
578 i
= curr_order
.Len();
584 if( ind_change
== -2 )
586 wxMessageBox( wxT("More than one change at one time can't be handled !!\nChange after case..." ));
587 b_accept_change
= false;
590 // one change -> must update the map
591 else if( ind_change
>= 0 )
593 //Get the ind in map for the changed panel
595 for( int i
= 0; i
< tay_panels_map
; i
++ )
597 if( panels_map
[i
] == ind_change
)
604 if( ind_in_map
!= -1 )
606 // the changed panel implie deletion of the older
607 panels_map
[ind_in_map
] = -1;
611 // END update the map
613 // Update the panel map
614 if( b_accept_change
)
616 curr_order
= new_order
;
621 txtCtrl_order
->ChangeValue( curr_order
);
630 //****************************************************
632 void myWnd_EditPanelOrder::Evt_Paint_PanelView( wxPaintEvent
& evt
)
634 wxAutoBufferedPaintDC
dc( panel_stage_view
);
635 panel_stage_view
->DoPrepareDC( dc
);
636 // dc.SetBackground( *wxWHITE_BRUSH );
639 if( panel_cursor_x
<= 0 )
642 wxSize s
= panel_stage_view
->GetSize();
643 dc
.SetBrush( *wxRED_BRUSH
);
645 // panel_stage_view->CalcScrolledPosition( panel_cursor_x, dummy, &panel_cursor_x, &dummy );
646 dc
.DrawRectangle( panel_cursor_x
, 5, 4, s
.y
- 10 );
650 //****************************************************
652 void myWnd_EditPanelOrder::UpdateInsertPoint()
654 //Get the current insertion point
655 curr_ind
= txtCtrl_order
->GetInsertionPoint();
656 MoveImagesCursor( curr_ind
);
660 //****************************************************
662 int myWnd_EditPanelOrder::Get_OrderElt_X( int ind
)
664 if( ind
>= img_ctrl_list_count
|| ind
< 0 )
667 wxPoint p
= img_ctrl_list
[ind
]->GetPosition();
668 panel_stage_view
->CalcUnscrolledPosition( p
.x
, p
.y
, &p
.x
, &p
.y
);
674 //****************************************************
676 const int dec_cursor
= 3;
677 void myWnd_EditPanelOrder::MoveImagesCursor( long i
)
680 int scrollU_x
, scrollU_y
;
682 panel_stage_view
->GetScrollPixelsPerUnit(&scrollU_x
, &scrollU_y
);
683 wxSize v_s
= panel_stage_view
->GetVirtualSize();
684 wxSize r_s
= panel_stage_view
->GetSize();
686 if( b_reverted_direction
)
687 i
= curr_order
.Len() - i
;
689 if( curr_order
.Len() <= 0 || (size_t) i
>= curr_order
.Len() )
691 panel_cursor_x
= -30;
692 scroll_pos
= v_s
.x
/ scrollU_x
;
696 panel_cursor_x
= -30;
701 panel_cursor_x
= Get_OrderElt_X( i
) - dec_cursor
* 2.5;
702 scroll_pos
= panel_cursor_x
- r_s
.x
/ 2;
707 panel_stage_view
->Scroll( scroll_pos
/ scrollU_x
, -1 );
708 panel_stage_view
->Refresh();
709 // wxSizeEvent dummy;
710 // panel_stage_view->EvtSize( dummy );
714 //****************************************************
716 void myWnd_EditPanelOrder::Update_PanelsView()
718 wxSizer
* panel_stage_view_sizer
= panel_stage_view
->GetSizer();
719 panel_stage_view
->Freeze();
721 // Remove old images ctrls
722 if( img_ctrl_list
!= NULL
)
724 delete[] img_ctrl_list
;
725 img_ctrl_list
= NULL
;
726 img_ctrl_list_count
= 0;
730 size_t max_letter
= (size_t) ('a' + nb_panels
);
731 for( size_t i
= 0; i
< curr_order
.Len(); i
++ )
733 size_t curr_letter
= (size_t) curr_order
[i
];
734 if( curr_letter
>= (size_t) 'a' && curr_letter
< max_letter
)
735 order
+= curr_order
[i
];
740 img_ctrl_list
= new MyImageCtrl
*[order
.Len()];
741 img_ctrl_list_count
= order
.Len();
744 panel_stage_view_sizer
->Clear( true );
746 for( size_t i
= 0; i
< order
.Len(); i
++ )
748 wxBoxSizer
* sizer_temp
= new wxBoxSizer( wxVERTICAL
);
750 MyImageCtrl
* t_imgctrl
= new MyImageCtrl( panel_stage_view
);
752 // With vertical Levels ==>> rotate the stuff
753 if( b_rotate_imgs
== true )
754 t_imgctrl
->Rotate90( 3 );
755 int ind
= b_reverted_direction
? order
.Len() - i
- 1 : i
;
757 t_imgctrl
->SetId( wxID_HIGHEST
+ i
);
758 t_imgctrl
->Set_BoundDimensions( max_img_size
, max_img_size
);
759 t_imgctrl
->SetImage( l_panels
[order
[ind
]-'a']->GetImage() );
760 t_imgctrl
->Connect( wxEVT_LEFT_UP
, wxMouseEventHandler(myWnd_EditPanelOrder::Evt_Click_OrderElt
), NULL
, this);
761 sizer_temp
->Add( t_imgctrl
, 0, wxALL
, 1 );
762 img_ctrl_list
[i
] = t_imgctrl
;
764 wxStaticText
* t_stat
= new wxStaticText( panel_stage_view
, wxID_ANY
, wxChar( order
[ind
] ),
765 wxDefaultPosition
, wxDefaultSize
, wxALIGN_CENTRE
);
766 t_stat
->SetFont( font_Alphabet
);
767 t_stat
->SetMinSize( wxSize( 40, wxDefaultCoord
));
768 sizer_temp
->Add( t_stat
, 0, wxCENTER
|wxALL
, 1 );
770 panel_stage_view_sizer
->Add( sizer_temp
, 0, wxEXPAND
|wxALL
, imgs_space
);
773 panel_stage_view
->Layout();
775 panel_stage_view
->EvtSize(dummy
);
778 panel_stage_view
->Thaw();
779 panel_stage_view
->Refresh();
783 //****************************************************
784 //****************************************************
785 //****************************************************
786 //****************************************************
787 //****************************************************
789 BEGIN_EVENT_TABLE(myWnd_EditPanelOrder
, wxDialog
)
790 EVT_CLOSE(myWnd_EditPanelOrder::EvtClose
)
791 EVT_SIZE(myWnd_EditPanelOrder::EvtSize
)
792 // EVT_PAINT(myWnd_EditPanelOrder::Evt_Paint_PanelView)