Exemplo n.º 1
0
		/// -----------------------------------------------------------------------------------
		/// <summary>
		/// When the user has selected a keyboard from the system tray, adjust the language of
		/// the selection to something that matches, if possible.
		/// </summary>
		/// <param name="vwsel">Selection</param>
		/// <param name="wsMatch">Writing system determined from keyboard change</param>
		/// -----------------------------------------------------------------------------------
		public virtual void HandleKeyboardChange(IVwSelection vwsel, int wsMatch)
		{
			CheckDisposed();
			// Get the writing system factory associated with the root box.
			if (m_rootb == null || !GotCacheOrWs)
				return; // For paranoia.

			if (vwsel == null)
			{
				// Delay handling it until we get a selection.
				m_wsPending = wsMatch;
				return;
			}
			bool fRange = vwsel.IsRange;
			if (fRange)
			{
				// Delay handling it until we get an insertion point.
				m_wsPending = wsMatch;
				return;
			}

			ITsTextProps[] vttp;
			IVwPropertyStore[] vvps;
			int cttp;

			SelectionHelper.GetSelectionProps(vwsel, out vttp, out vvps, out cttp);

			if (cttp == 0)
				return;
			Debug.Assert(cttp == 1);

			// If nothing changed, avoid the infinite loop that happens when we change the selection
			// and update the system keyboard, which in turn tells the program to change its writing system.
			// (This is a problem on Windows 98.)
			int wsTmp;
			int var;
			wsTmp = vttp[0].GetIntPropValues((int)FwTextPropType.ktptWs, out var);
			if (wsTmp == wsMatch)
				return;

			ITsPropsBldr tpb = vttp[0].GetBldr();
			tpb.SetIntPropValues((int)FwTextPropType.ktptWs,
				(int)FwTextPropVar.ktpvDefault, wsMatch);
			vttp[0] = tpb.GetTextProps();
			vwsel.SetSelectionProps(cttp, vttp);
			SelectionChanged(m_rootb, m_rootb.Selection); // might NOT be vwsel any more
		}
Exemplo n.º 2
0
		/// -----------------------------------------------------------------------------------
		/// <summary>
		/// When the user has selected a keyboard from the system tray, adjust the language of
		/// the selection to something that matches, if possible.
		/// </summary>
		/// <param name="vwsel">Selection</param>
		/// <param name="nLangId">Language identification</param>
		/// -----------------------------------------------------------------------------------
		public virtual void HandleKeyboardChange(IVwSelection vwsel, short nLangId)
		{
			CheckDisposed();
			// Get the writing system factory associated with the root box.
			if (m_rootb == null || !GotCacheOrWs)
				return; // For paranoia.

			//			Debug.WriteLine("HandleKeyboardChange nLangId=" + nLangId + "; " + Name +
			//				"/" + this);

			ILgWritingSystemFactory wsf = WritingSystemFactory;

			int cws = wsf.NumberOfWs;
			if (cws < 2)
				return;	// no writing systems to work with

			int[] vwsTemp = new int[0];
			using (ArrayPtr ptr = MarshalEx.ArrayToNative(cws, typeof(int)))
			{
				wsf.GetWritingSystems(ptr, cws);
				vwsTemp = (int[])MarshalEx.NativeToArray(ptr, cws, typeof(int));
			}

			// resize the array leaving slot 0 empty
			int[] vws = new int[++cws];
			Array.Copy(vwsTemp, 0, vws, 1, vwsTemp.Length);

			// Put the writing system of the selection first in the list, which gives it
			// priority -- we'll find it first if it matches.
			int wsSel = SelectionHelper.GetFirstWsOfSelection(vwsel);
			vws[0] = wsSel != 0 ? wsSel : vws[1];

			InputLanguage lngDefault = InputLanguage.DefaultInputLanguage;
			short defaultLangId = LcidHelper.LangIdFromLCID(lngDefault.Culture.LCID);
			int wsMatch = -1;
			int wsDefault = -1;
			int wsCurrentLang = -1; // used to note first ws whose CurrentInputLanguage matches.
			for (int iws = 0; iws < cws; iws++)
			{
				if (vws[iws] == 0)
					continue;

				IWritingSystem ws = wsf.get_EngineOrNull(vws[iws]);
				if (ws == null)
					continue;

				// REVIEW SteveMc, SharonC, KenZ, JohnT: nail down where the locale/langid belongs, in
				// the writing system or in the old writing system.
				int nLocale = ws.Locale;
				int nLangIdWs = LcidHelper.LangIdFromLCID(nLocale);

				if (nLangIdWs != 0 && nLangIdWs == nLangId)
				{
					wsMatch = vws[iws];
					break;
				}
				if (iws == 0 && nLangIdWs == 0 && nLangId == defaultLangId)
				{
					// The writing system of the current selection doesn't have any keyboard specified,
					// and we've set the keyboard to the default. This is acceptable; leave as is.
					wsMatch = vws[iws];
					break;
				}
				if (nLangIdWs == 0 && nLangId == defaultLangId && wsDefault == -1)
				{
					// Use this old writing system as the default.
					wsDefault = vws[iws];
				}
				if (wsCurrentLang == -1)
				{
					int nLangIdCurrent = ws.CurrentInputLanguage;
					if (nLangId == nLangIdCurrent)
						wsCurrentLang = vws[iws];
				}
			}

			if (wsMatch == -1)
			{
				wsMatch = wsDefault;
			}
			m_wsPending = -1;
			// Next, see if it is the current langid of any ws. This will leave it -1 if we didn't find such a match.
			if (wsMatch == -1)
				wsMatch = wsCurrentLang;

			if (wsMatch == -1)
			{
				// Nothing matched.
				if (defaultLangId == nLangId) // We're trying to set to the default keyboard
				{
					// The default keyboard sets set for odd reasons. Just ignore it.
					// Review: what if the HKL's are different versions of the same language,
					// eg UK and US English?
				}
				else
				{
					// We will make this the current input language for the current writing system for the current session.
					IWritingSystem wsCurrent = wsf.get_EngineOrNull(wsSel);
					if (wsCurrent != null)
						wsCurrent.CurrentInputLanguage = nLangId;
				}
				return;
			}

			// We are going to make wsMatch the current writing system.
			// Make sure it is set to use the langid that the user just selected.
			// (This cleans up any earlier overrides).
			IWritingSystem wsMatchEng = wsf.get_EngineOrNull(wsMatch);
			if (wsMatchEng != null)
				wsMatchEng.CurrentInputLanguage = nLangId;

			if (vwsel == null)
			{
				// Delay handling it until we get a selection.
				m_wsPending = wsMatch;
				return;
			}
			bool fRange = vwsel.IsRange;
			if (fRange)
			{
				// Delay handling it until we get an insertion point.
				m_wsPending = wsMatch;
				return;
			}

			ITsTextProps[] vttp;
			IVwPropertyStore[] vvps;
			int cttp;

			SelectionHelper.GetSelectionProps(vwsel, out vttp, out vvps, out cttp);

			if (cttp == 0)
				return;
			Debug.Assert(cttp == 1);

			// If nothing changed, avoid the infinite loop that happens when we change the selection
			// and update the system keyboard, which in turn tells the program to change its writing system.
			// (This is a problem on Windows 98.)
			int wsTmp;
			int var;
			wsTmp = vttp[0].GetIntPropValues((int)FwTextPropType.ktptWs, out var);
			if (wsTmp == wsMatch)
				return;

			ITsPropsBldr tpb = vttp[0].GetBldr();
			tpb.SetIntPropValues((int)FwTextPropType.ktptWs,
				(int)FwTextPropVar.ktpvDefault, wsMatch);
			vttp[0] = tpb.GetTextProps();
			vwsel.SetSelectionProps(cttp, vttp);
			SelectionChanged(m_rootb, vwsel);
		}