1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        cbcustom.cpp
3 // Purpose:     cbSimpleCustomizationPlugin class declaration
4 // Author:      Aleksandras Gluchovas
5 // Modified by:
6 // Created:     06/09/98
7 // RCS-ID:      $Id: cbcustom.cpp 36189 2005-11-16 17:27:38Z ABX $
8 // Copyright:   (c) Aleksandras Gluchovas
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
14 
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18 
19 #ifndef WX_PRECOMP
20 #include "wx/wx.h"
21 #endif
22 
23 #include "wx/fl/cbcustom.h"
24 
25 // helper class to receive menu customization event
26 
27 class cbContextMenuHandler : public wxEvtHandler
28 {
29 public:
30     cbSimpleCustomizationPlugin* mpBackRef;
31 
32 public:
33     void OnCommandEvents( wxCommandEvent& evt );
34 
35     DECLARE_EVENT_TABLE()
36 };
37 
38 // FIXME:: is this "safe" ?
39 
40 #define CB_CUSTOMIZE_MENU_FIRST_ITEM_ID 17500
41 
42 /***** Implementation for helper class cbContextMenuHandler *****/
43 
BEGIN_EVENT_TABLE(cbContextMenuHandler,wxEvtHandler)44 BEGIN_EVENT_TABLE( cbContextMenuHandler, wxEvtHandler )
45 
46     // FIXME:: what is the right range for these ids ? so that they
47     //         would not collide with user commands?
48 
49     EVT_COMMAND_RANGE( CB_CUSTOMIZE_MENU_FIRST_ITEM_ID,
50                        CB_CUSTOMIZE_MENU_FIRST_ITEM_ID + 300,
51                        wxEVT_COMMAND_MENU_SELECTED,
52                        cbContextMenuHandler::OnCommandEvents )
53 
54 END_EVENT_TABLE()
55 
56 void cbContextMenuHandler::OnCommandEvents( wxCommandEvent& evt )
57 {
58     //wxMessageBox("Wowwwww, Yeah!");
59 
60     mpBackRef->OnMenuItemSelected( evt );
61 }
62 
63 /***** Implementation for class cbSimpleCustomizationPlugin *****/
64 
IMPLEMENT_DYNAMIC_CLASS(cbSimpleCustomizationPlugin,cbPluginBase)65 IMPLEMENT_DYNAMIC_CLASS( cbSimpleCustomizationPlugin, cbPluginBase )
66 
67 BEGIN_EVENT_TABLE( cbSimpleCustomizationPlugin, cbPluginBase )
68 
69     EVT_PL_CUSTOMIZE_BAR   ( cbSimpleCustomizationPlugin::OnCustomizeBar    )
70     EVT_PL_CUSTOMIZE_LAYOUT( cbSimpleCustomizationPlugin::OnCustomizeLayout )
71 
72 END_EVENT_TABLE()
73 
74 cbSimpleCustomizationPlugin::cbSimpleCustomizationPlugin(void)
75 {}
76 
cbSimpleCustomizationPlugin(wxFrameLayout * pPanel,int paneMask)77 cbSimpleCustomizationPlugin::cbSimpleCustomizationPlugin( wxFrameLayout* pPanel, int paneMask )
78 
79     : cbPluginBase( pPanel, paneMask )
80 {}
81 
OnCustomizeBar(cbCustomizeBarEvent & event)82 void cbSimpleCustomizationPlugin::OnCustomizeBar( cbCustomizeBarEvent& event )
83 {
84     // ingnore bar customization, treat it
85     // as layout-customization...ugly, eh?
86 
87     cbCustomizeLayoutEvent clEvt( event.mClickPos );
88 
89     OnCustomizeLayout( clEvt );
90 }
91 
OnCustomizeLayout(cbCustomizeLayoutEvent & event)92 void cbSimpleCustomizationPlugin::OnCustomizeLayout( cbCustomizeLayoutEvent& event )
93 {
94     wxString helpStr1 = wxT("Select this item to show the corresponding control bar");
95     wxString helpStr2 = wxT("Select this itme to hide the corresponding control bar");
96 
97     int id = CB_CUSTOMIZE_MENU_FIRST_ITEM_ID;
98 
99     wxMenu* pMenu = new wxMenu();
100 
101     BarArrayT& bars = mpLayout->GetBars();
102 
103     for( size_t i = 0; i != bars.GetCount(); ++i )
104     {
105         cbBarInfo& bar = *bars[i];
106 
107         bool isHidden = ( bar.mState == wxCBAR_HIDDEN );
108 
109         wxString* pHelpStr = ( isHidden ) ? &helpStr1 : &helpStr2;
110 
111         pMenu->Append( id, bar.mName, *pHelpStr, true );
112 
113         pMenu->Check( id, (isHidden == false) );
114 
115         ++id;
116     }
117 
118     // Customization dialog not implemented, so don't show the menu item
119 #if 0
120     pMenu->AppendSeparator();
121     pMenu->Append( id, "Customize...", "Show layout customization dialog", false );
122 #endif
123     mCustMenuItemId = id;
124 
125     cbContextMenuHandler* pHandler = new cbContextMenuHandler();
126     pHandler->mpBackRef            = this;
127 
128     wxWindow* pFrm = &mpLayout->GetParentFrame();
129 
130     // FOR NOW FOR NOW:: to work-around wxFrame's (MSW) nasty event-handling bugs!!!
131 
132     wxWindow* pTmpWnd = new wxWindow( pFrm, wxID_ANY, event.mClickPos, wxSize(0,0) );
133 
134     pMenu->SetEventHandler( pHandler );
135 
136     pTmpWnd->PopupMenu( pMenu, 0,0 );
137 
138     pTmpWnd->Destroy();
139 
140     delete pMenu;
141     delete pHandler;
142 
143     // event is "eaten" by this plugin
144 }
145 
OnMenuItemSelected(wxCommandEvent & event)146 void cbSimpleCustomizationPlugin::OnMenuItemSelected( wxCommandEvent& event )
147 {
148     if ( event.GetId() == mCustMenuItemId )
149     {
150         wxMessageBox(wxT("Customization dialog box is not supported by this plugin yet"));
151 
152         return;
153     }
154     else
155     {
156         cbBarInfo* pBar = mpLayout->GetBars()[ event.GetId() -  CB_CUSTOMIZE_MENU_FIRST_ITEM_ID ];
157 
158         wxASSERT( pBar ); // DBG::
159 
160         // "inverse" bar-visibility of the selected bar
161 
162         int newState;
163 
164         if ( pBar->mState == wxCBAR_HIDDEN )
165         {
166             if ( pBar->mAlignment == -1 )
167             {
168                 pBar->mAlignment = 0;       // just remove "-1" marking
169                 newState = wxCBAR_FLOATING;
170             }
171             else
172                 if ( pBar->mAlignment == FL_ALIGN_TOP ||
173                      pBar->mAlignment == FL_ALIGN_BOTTOM )
174 
175                     newState = wxCBAR_DOCKED_HORIZONTALLY;
176                 else
177                     newState = wxCBAR_DOCKED_VERTICALLY;
178         }
179         else
180         {
181             newState = wxCBAR_HIDDEN;
182 
183             if ( pBar->mState == wxCBAR_FLOATING )
184 
185                 pBar->mAlignment = -1;
186         }
187 
188         mpLayout->SetBarState( pBar, newState, true );
189 
190         if ( newState == wxCBAR_FLOATING )
191             mpLayout->RepositionFloatedBar( pBar );
192     }
193 
194     // menu-item-selected event is "eaten"
195 }
196