码迷,mamicode.com
首页 > 其他好文 > 详细

Splitters

时间:2014-12-18 16:35:01      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   io   color   os   sp   for   on   

  1 //Splitters.cpp
  2 
  3 /*
  4 Copyright 2000-2004 The VCF Project.
  5 Please see License.txt in the top level directory
  6 where you installed the VCF.
  7 */
  8 
  9 
 10 #define USING_SPLITTER
 11 #define NUM_OF_PANELS 5     // 1-6
 12 
 13 
 14 #include "vcf/ApplicationKit/ApplicationKit.h"
 15 #include "vcf/ApplicationKit/ControlsKit.h"
 16 
 17 using namespace VCF;
 18 
 19 class SplittersWindow;
 20 
 21 class MyPanel : public Panel
 22 {
 23 public:
 24     MyPanel( SplittersWindow* mainWnd ) {
 25         mainWnd_ = mainWnd;
 26         MouseClicked += new ClassProcedure1<ControlEvent*,MyPanel>(this, &MyPanel::onMouseClicked, "MyPanel::onMouseClicked" );
 27     }
 28 
 29     SplittersWindow* getMainWindow() {
 30         return mainWnd_;
 31     }
 32 
 33     void onMouseClicked( ControlEvent* e );
 34 
 35 public:
 36     SplittersWindow* mainWnd_;
 37 };
 38 
 39 class SplittersWindow : public Window {
 40 public:
 41     SplittersWindow() {
 42         clickedPanel_ = NULL;
 43         panelVisible_ = true;
 44 
 45         setCaption( "Splitters" );
 46 
 47         ControlSized += new ClassProcedure1<ControlEvent*,SplittersWindow>(this, &SplittersWindow::onResized, "SplittersWindow::onResized" );
 48         ControlPositioned += new ClassProcedure1<ControlEvent*,SplittersWindow>(this, &SplittersWindow::onPosChanged, "SplittersWindow::onPosChanged" );
 49 
 50         Panel* buttonsPanel = new Panel();
 51         buttonsPanel->setUseColorForBackground( true );
 52         buttonsPanel->setHeight( 30 );
 53         buttonsPanel->setColor( Color::getColor("lightyellow") );
 54         add( buttonsPanel, AlignTop );
 55 
 56 
 57         btnShow_ = new CommandButton();
 58         btnShow_->ButtonClicked +=
 59             new ClassProcedure1<ButtonEvent*,SplittersWindow>(this,&SplittersWindow::onBtnShow, "SplittersWindow::onBtnShow");
 60         btnShow_->setBounds( 120, 2, 100, btnShow_->getPreferredHeight() );
 61         btnShow_->setCaption( "Hide" );
 62         btnShow_->setToolTipText( "Hide/Show any selected panel" );
 63         buttonsPanel->add( btnShow_, AlignLeft );
 64 
 65         Label* label = NULL;
 66         label = new Label();
 67         label->setWidth( 50 );
 68         label->setWordWrap( true );
 69         label->setCaption( "Click into a panel first and then press the Hide/Show button." );
 70         buttonsPanel->add( label, AlignClient );
 71 
 72         label = new Label();
 73         label->setHeight( 20 );
 74         label->setWordWrap( true );
 75         label->setCaption( "Drag a splitter to resize a panel - Try to DoubleClick on a splitter - Try then with the <Shift> key" );
 76         label->setColor( Color::getColor("blue") );
 77         add( label, AlignBottom );
 78 
 79 
 80 
 81         main_ = new Panel;
 82         main_->setHeight( 25 );
 83         main_->setUseColorForBackground( true );
 84         main_->setColor( Color::getColor("brown") );
 85         main_->setToolTipText( "main: AlignClient, brown" );
 86         add( main_, AlignClient );
 87 
 88         panelLeft_ = new Panel;
 89         panelLeft_->setUseColorForBackground( true );
 90         panelLeft_->setWidth( main_->getWidth()/2 );
 91         panelLeft_->setColor( Color::getColor("cyan") );
 92         panelLeft_->setToolTipText( "left: AlignLeft, cyan" );
 93         main_->add( panelLeft_, AlignLeft );
 94 
 95         panelRight_ = new Panel;
 96         panelRight_->setUseColorForBackground( true );
 97         panelRight_->setWidth( main_->getWidth()/2 );
 98         panelRight_->setColor( Color::getColor("navy") );
 99         panelRight_->setToolTipText( "right: AlignRight, navy" );
100         main_->add( panelRight_, AlignRight );
101 
102         addPanels( panelLeft_ , NUM_OF_PANELS, AlignLeft );
103         addPanels( panelRight_, NUM_OF_PANELS, AlignTop );
104     }
105 
106     void addPanels( Panel* panel, int num, AlignmentType alignment  )
107     {
108         panel->setContainer( new StandardContainer() );
109 
110         int n = maxVal<int>( minVal<int>( num, NUM_OF_PANELS ), 1 );
111         int width = panel->getWidth() / n;
112         int height = panel->getHeight() / n;
113 
114         std::vector< String > colors;
115         colors.push_back( "red" );
116         colors.push_back( "green" );
117         colors.push_back( "blue" );
118         colors.push_back( "violet" );
119         colors.push_back( "yellow" );
120         colors.push_back( "gold" );
121 
122         String alignments[6];
123         alignments[AlignNone]        = "AlignNone";
124         alignments[AlignTop]        = "AlignTop";
125         alignments[AlignLeft]        = "AlignLeft";
126         alignments[AlignRight]    = "AlignRight";
127         alignments[AlignBottom] = "AlignBottom";
128         alignments[AlignClient] = "AlignClient";
129 
130         String s, sTip;
131         Splitter* splitter = NULL;
132 
133         for ( int i = 1; i <= n; i ++ ) {
134             MyPanel* p = new MyPanel( this );
135             p->setUseColorForBackground( true );
136             p->setWidth( width );
137             p->setHeight( height );
138             p->setColor( Color::getColor( colors[i-1] ) );
139             p->setBorder( NULL );
140             s = Format( "panel%d" ) % i;
141             p->setName( s );
142             if ( i < n ) {
143                 sTip = Format( "p%d: %s, %s" ) % i % alignments[alignment] % colors[i-1];
144                 p->setToolTipText( sTip );
145                 panel->add( p, alignment );
146 
147 #ifdef USING_SPLITTER
148                 splitter = new Splitter( alignment );
149                 s = Format( "splitter %d" ) % i;
150                 splitter->setToolTipText( s );
151                 splitter->setToolTipText( s );
152                 splitter->setWidth( 5 );
153                 splitter->setMinimumWidth( 35 );
154                 splitter->setDblClickEnabled( true );
155                 panel->add( splitter, alignment );
156 #endif
157             } else {
158                 sTip = Format( "p%d: %s, %s" ) % i % alignments[AlignClient] % colors[i-1];
159                 p->setToolTipText( sTip );
160                 panel->add( p, AlignClient );
161             }
162         }
163     }
164 
165     virtual ~SplittersWindow(){};
166 
167     void onBtnHide( ButtonEvent* e ) {
168         int i = 1;
169         String s = Format( "panel%d" ) % i;
170         //Panel* panel = (Panel*)panelLeft_->findComponent( s );
171         if ( NULL != clickedPanel_ ) {
172             clickedPanel_->setVisible( false );
173             int x = 0;
174         }
175     }
176 
177     void onBtnShow( ButtonEvent* e ) {
178         //String s = Format( "panel%d" ) % i ;
179         //Panel* panel = (Panel*)panelLeft_->findComponent( s );
180         if ( NULL != clickedPanel_ ) {
181             panelVisible_ = !panelVisible_;
182             clickedPanel_->setVisible( panelVisible_ );
183             if ( panelVisible_ ) {
184                 clickedPanel_ = NULL;
185                 btnShow_->setCaption( "Hide" );
186             } else {
187                 btnShow_->setCaption( "Show " + clickedPanel_->getName() );
188             }
189         } else {
190             Dialog::showMessage( "Please, click on a window first." );
191         }
192     }
193 
194     void setClickedPanel( Panel* panel ) {
195         if ( panelVisible_ ) {
196             clickedPanel_ = panel;
197         } else {
198             Dialog::showMessage( "Please, press the show/hide button first" );
199         }
200     }
201 /*
202     virtual void resizeChildren( Control* control ) {
203         Window::resizeChildren( control );
204     }
205 */
206     void onResized( ControlEvent*e ) {
207 
208         double w = main_->getWidth()/2;
209         StringUtils::trace( Format("w: %0.2f\n") % w );
210 
211         panelLeft_->setWidth( w );
212 
213         panelRight_->setWidth( w );
214     }
215 
216     void onPosChanged( ControlEvent*e ) {
217 
218     }
219 
220 public:
221     Panel* main_;
222     Panel* panelLeft_;
223     Panel* panelRight_;
224     Panel* clickedPanel_;
225     bool panelVisible_;
226     CommandButton* btnShow_;
227 };
228 
229 void MyPanel::onMouseClicked( ControlEvent* e ) {
230     //Panel* panel = (Panel*)e->getSource();
231     getMainWindow()->setClickedPanel( this );
232     getMainWindow()->btnShow_->setCaption( "Hide " + getName() );
233     //Rect r = getBounds();
234     //trace( Format( "New Left/Top: %0.2f, %0.2f\n", r.left_, r.top_ );
235 }
236 
237 
238 
239 class SplittersApplication : public Application {
240 public:
241 
242     SplittersApplication( int argc, char** argv ) : Application(argc, argv) {
243 
244     }
245 
246     virtual bool initRunningApplication(){
247         bool result = Application::initRunningApplication();
248 
249         Window* mainWindow = new SplittersWindow();
250         setMainWindow(mainWindow);
251         mainWindow->setBounds( &Rect( 100.0, 100.0, 700.0, 700.0 ) );
252         mainWindow->show();
253 
254         return result;
255     }
256 
257 };
258 
259 
260 int main(int argc, char *argv[])
261 {
262     Application* app = new SplittersApplication( argc, argv );
263 
264     Application::main();
265 
266     return 0;
267 }
268 
269 
270 /**
271 $Id: Splitters.cpp 3184 2007-09-17 02:26:00Z ddiego $
272 */

 

Splitters

标签:style   blog   ar   io   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/elitiwin/p/4171797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!