uitoolkit.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 1,812 行 · 第 1/4 页

CPP
1,812
字号

	AcceleratorKey::Value key( event->getKeyMask(), event->getVirtualCode() );

	typedef std::multimap<ulong32,AcceleratorKey*>::iterator AccelMapIter;
	std::pair<AccelMapIter, AccelMapIter> range = acceleratorMap_.equal_range( key );

	//look for accelerator in control then app
	AcceleratorKey* accelerator = NULL;
	Control* control = (Control*)event->getSource();


	AccelMapIter it = range.first;
	if ( control ) {
		if ( control->areParentsEnabled() ) {

			while ( it != range.second ) {

				AcceleratorKey* accel = it->second;
				// check if the control associated to this accelerator is the same having the focus
				if ( accel->getAssociatedControl() == control ) {
					accelerator = accel;
					break;
				}

				it ++;
			}
		}
	}




	//if accelerator is still null try and find the first matching menu item
	if ( NULL == accelerator ) {
		it = range.first;
		while ( it != range.second ) {
			AcceleratorKey* accel = it->second;
			if ( accel->getAssociatedMenuItem() != NULL ) {
				accelerator = accel;
				//check to make sure the menu item's frame is enabled!
				if ( NULL != accel ) {
					MenuItem* mi = accel->getAssociatedMenuItem();
					mi->update();
				}
				break;
			}

			it ++;
		}
	}

	//if accelerator is still null try and find the first matching object
	if ( NULL == accelerator ) {
		it = range.first;
		while ( it != range.second ) {

			AcceleratorKey* accel = it->second;
			if ( accel->getAssociatedObject() != NULL ) {
				accelerator = accel;
				break;
			}

			it ++;
		}
	}


	if ( NULL != accelerator ) {

		EventHandler* ev = NULL;

		if ( accelerator->isMnemonic() ) {
			ev = acceleratorMnemonicHandler_;
		}
		else {
			ev = accelerator->getEventHandler();
		}

		if ( NULL != ev ) {
			if ( accelerator->isEnabled() ) {
				KeyboardEvent* acceleratorEvent = new KeyboardEvent( accelerator, Control::KEYBOARD_ACCELERATOR,
																	event->getRepeatCount(),
																	event->getKeyMask(),
																	event->getKeyValue(),
																	event->getVirtualCode() );

				postEvent( ev, acceleratorEvent, false );
			}

			//KeyboardEvent acceleratorEvent( accelerator, Control::KEYBOARD_ACCELERATOR,
			//														event->getRepeatCount(),
			//														event->getKeyMask(),
			//														event->getKeyValue(),
			//														event->getVirtualCode() );

			//ev->invoke( &acceleratorEvent );


			// as the event has been processed, we don't let it to be forwarded further to any other controls
			event->setConsumed( true );
		}
	}
	else if ( NULL != control ) {

		VirtualKeyCode keyCode = event->getVirtualCode();
		/**
		as per bug [ 585087 ] Get rid of arrow key tabbing
		I am commenting the arrow key tabbing out - will
		work out something better !
		*/
		switch( keyCode ) {

			case vkTab : /*case vkUpArrow : case vkDownArrow : case vkLeftArrow : case vkRightArrow :*/{
				handleTabKeyboardEvent( event );
			}
			break;

			case vkReturn :{

				if ( false == control->keepReturnCharacter() ) {
					//event->setConsumed( true );

					Button* button = getDefaultButton();

					Event* e = (Event*)event->clone();
					e->setUserData( button );

					postEvent( new StaticEventHandlerInstance<Event>(internal_handleKeyboardButtonEvent),
								e );

					/*
					if ( NULL != button ) {
						button->click();
					}
					*/
				}
			}
			break;
		}
	}
}

void UIToolkit::handleTabKeyboardEvent( KeyboardEvent* event )
{
	Control* control = (Control*) event->getSource();

	if ( !control->keepsTabKey() ) {
		bool goForward = !event->hasShiftKey();

		Control* currentFocused = Control::getCurrentFocusedControl();
		if ( NULL == currentFocused ) {
			currentFocused = control;
		}
		Frame* parentFrame = currentFocused->getParentFrame();

		std::vector<Control*> tabList;
		Control::buildTabList( parentFrame, tabList );

		Control* newFocusedControl = NULL;
		std::vector<Control*>::iterator found = std::find( tabList.begin(), tabList.end(), currentFocused );
		long index = -1;
		if ( found != tabList.end() ) {
			index = found - tabList.begin();
		}
		if ( goForward ) {
			index ++;

			if ( index >= tabList.size() ) {
				index = 0;
			}

			if ( index >= 0 ) {
				while ( index < tabList.size() ) {
					Control* c = tabList[index];
					if ( c->canAcceptFocus() ) {
						if ( c->getTabStop() ) {
							break;
						}
					}
					index++;
				}
			}

			if ( index >= tabList.size() ) {
				index = 0;
			}

		}
		else {
			index --;

			if ( index <= 0 ) {
				index = tabList.size()-1;
			}

			if ( index < tabList.size() ) {
				while ( index > -1 ) {
					Control* c = tabList[index];
					if ( c->canAcceptFocus() ) {
						if ( c->getTabStop() ) {
							break;
						}
					}
					index--;
				}
			}

			if ( index <= 0 ) {
				index = tabList.size()-1;
			}
		}


		newFocusedControl = tabList[index];
		newFocusedControl->setFocused();

		event->consume();
	}
}

const Image* UIToolkit::internal_getStandardStopImage()
{
	return stopImage_;
}

const Image* UIToolkit::internal_getStandardWarningImage()
{
	return warningImage_;
}

const Image* UIToolkit::internal_getStandardQuestionImage()
{
	return questionImage_;
}

const Image* UIToolkit::internal_getStandardInformationImage()
{
	return informationImage_;
}

void UIToolkit::onAcceleratorMnemonic( KeyboardEvent* event )
{
	 AcceleratorKey* accelerator = (AcceleratorKey*)event->getSource();
	 if ( NULL != accelerator ) {
		Control* control = accelerator->getAssociatedControl();
		if ( NULL != control ) {
			control->mnemonicActivate();
		}
	}
}

VirtualKeyCode UIToolkit::internal_findMnemonic( const String& caption )
{
	VirtualKeyCode result = vkUndefined;

#if (! defined _MSC_VER) || ( (_MSC_VER < 1300) || defined ( STLPORT ) )
	const VCFChar* P = caption.c_str();
#else
	const VCFChar* P = caption.c_str();
#endif
	const VCFChar* start = P;
	int size = caption.size();

	while ( (P - start) < size ) {
		if ( (*P == '&') && (((P - start)+1) < size) ) {
			VCFChar nextChar = *(P+1);
			//this is not locale or Unicode safe !
			if ( ((nextChar >= 'A') && (nextChar <= 'Z')) || ((nextChar >= 'a') && (nextChar <= 'z')) ) {
				if ( (nextChar >= 'A') && (nextChar <= 'Z') ) {
					result = (VirtualKeyCode)(vkLetterA + (nextChar - 'A'));
				}
				else {
					result = (VirtualKeyCode)(vkLetterA + (nextChar - 'a'));
				}
				break;
			}
			else if ( (nextChar >= '0') && (nextChar <= '9') ) {
				result = (VirtualKeyCode)(vkNumber0 + (nextChar - '0'));

				break;
			}
		}
		P++;
	}

	return result;
}

VCF::Button* UIToolkit::internal_getDefaultButton()
{
	Button* result = NULL;
	if ( ! defaultButtonList_.empty() ) {
		result = *defaultButtonList_.begin();
	}
	return result;
}

void UIToolkit::internal_setDefaultButton( Button* defaultButton )
{
	if ( true == defaultButtonList_.empty() ) {
		defaultButtonList_.push_back( defaultButton );
	}
	else {
		defaultButtonList_.insert( defaultButtonList_.begin(), defaultButton );
	}
}

void UIToolkit::onDefaultButton( KeyboardEvent* event )
{
	//Control* control = (Control*)event->getSource();
	/*
	Control* buttonControl = dynamic_cast<Control*>(control);
	if ( (buttonControl == Control::getCurrentFocusedControl()) && (NULL != temporaryDefaultButton_) ) {
		temporaryDefaultButton_->click();
	}
	else if ( NULL != defaultButton_ ) {
		defaultButton_->click();
	}

  */

}

void UIToolkit::internal_removeDefaultButton( Button* defaultButton )
{
	std::vector<Button*>::iterator found = std::find( defaultButtonList_.begin(), defaultButtonList_.end(), defaultButton );
	if ( found != defaultButtonList_.end() ) {
		defaultButtonList_.erase( found );
	}
}

void UIToolkit::internal_removeAccelerator( const VirtualKeyCode& keyCode, const ulong32& modifierMask, Object* src )
{

	AcceleratorKey::Value key( modifierMask, keyCode );

	typedef std::multimap<ulong32,AcceleratorKey*>::iterator AccelMapIter;

	std::pair<AccelMapIter, AccelMapIter> range = acceleratorMap_.equal_range( key );	

	std::vector<AccelMapIter> removeAccels;

	AccelMapIter it = range.first;
	while ( it != range.second ) {
		AcceleratorKey* accel = it->second;
		if ( (accel->getAssociatedControl() == src) || 
			(accel->getAssociatedMenuItem() == src) ||
			(accel->getAssociatedObject() == src) ) {
			accel->release();
			removeAccels.push_back( it );
		}

		it ++;
	}

	std::vector<AccelMapIter>::iterator it2 = removeAccels.begin();
	while ( it2 != removeAccels.end() ) {
		acceleratorMap_.erase( *it2 );
		it2 ++;
	}
}

void UIToolkit::internal_removeAcceleratorKeysForControl( Control* control )
{
	typedef std::multimap<ulong32,AcceleratorKey*>::iterator accel_iter;

	std::vector<accel_iter> removeAccels;

	accel_iter it = acceleratorMap_.begin();

	while ( it != acceleratorMap_.end() ) {
		AcceleratorKey* accel = it->second;
		if ( accel->getAssociatedControl() == control ) {
			accel->release();
			removeAccels.push_back( it );
		}
		it ++;
	}

	std::vector<accel_iter>::iterator it2 = removeAccels.begin();
	while ( it2 != removeAccels.end() ) {
		acceleratorMap_.erase( *it2 );
		it2 ++;
	}

}

void UIToolkit::internal_removeAcceleratorKeysForMenuItem( MenuItem* menuItem )
{
	typedef std::multimap<ulong32,AcceleratorKey*>::iterator accel_iter;

	std::vector<accel_iter> removeAccels;

	accel_iter it = acceleratorMap_.begin();

	while ( it != acceleratorMap_.end() ) {
		AcceleratorKey* accel = it->second;
		if ( accel->getAssociatedMenuItem() == menuItem ) {
			accel->release();
			removeAccels.push_back( it );
		}
		it ++;
	}

	std::vector<accel_iter>::iterator it2 = removeAccels.begin();
	while ( it2 != removeAccels.end() ) {
		acceleratorMap_.erase( *it2 );
		it2 ++;
	}
}

void UIToolkit::internal_removeAcceleratorKeysForObject( Object* src )
{
	typedef std::multimap<ulong32,AcceleratorKey*>::iterator accel_iter;

	std::vector<accel_iter> removeAccels;

	accel_iter it = acceleratorMap_.begin();

	while ( it != acceleratorMap_.end() ) {
		AcceleratorKey* accel = it->second;
		if ( accel->getAssociatedObject() == src ) {
			accel->release();
			removeAccels.push_back( it );
		}
		it ++;
	}

	std::vector<accel_iter>::iterator it2 = removeAccels.begin();
	while ( it2 != removeAccels.end() ) {
		acceleratorMap_.erase( *it2 );
		it2 ++;
	}
}


void UIToolkit::addToUpdateList( Component* component )
{
	UIToolkit::toolKitInstance->internal_addToUpdateList( component );
}

void UIToolkit::removeFromUpdateList( Component* component )
{
	UIToolkit::toolKitInstance->internal_removeFromUpdateList( component );
}

void UIToolkit::setUpdateTimerSpeed( const unsigned long& milliseconds )
{
	UIToolkit::toolKitInstance->internal_setUpdateTimerSpeed( milliseconds );
}

void UIToolkit::internal_addToUpdateList( Component* component )
{

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?