OpenKeyWord  Version: 426, Datum:
FrameObjectDictionary.cs
1 #region Header
2 /*
3  ==============================================================================
4  Author: Zoltan Hrabovszki <zh@openkeyword.de>
5 
6  Copyright © 2012, 2013, 2014, 2015 IT-Beratung Hrabovszki
7  www.OpenKeyWord.de
8  ==============================================================================
9 
10  This file is part of OpenKeyWord.
11 
12  OpenKeyWord is free software: you can redistribute it and/or modify
13  it under the terms of the GNU General Public License as published by
14  the Free Software Foundation, either version 3 of the License, or
15  (at your option) any later version.
16 
17  OpenKeyWord is distributed in the hope that it will be useful,
18  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  GNU General Public License for more details.
21 
22  You should have received a copy of the GNU General Public License
23  along with OpenKeyWord. If not, see <http://www.gnu.org/licenses/>.
24 
25  Diese Datei ist Teil von OpenKeyWord.
26 
27  OpenKeyWord ist Freie Software: Sie können es unter den Bedingungen
28  der GNU General Public License, wie von der Free Software Foundation,
29  Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren
30  veröffentlichten Version, weiterverbreiten und/oder modifizieren.
31 
32  OpenKeyWord wird in der Hoffnung, dass es nützlich sein wird, aber
33  OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite
34  Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
35  Siehe die GNU General Public License für weitere Details.
36 
37  Sie sollten eine Kopie der GNU General Public License zusammen mit
38  OpenKeyWord erhalten haben. Wenn nicht, siehe <http://www.gnu.org/licenses/>.
39 */
40 #endregion Header
41 
42 namespace OKW
43 {
44  using System;
45  using System.Collections.Generic;
46  using System.Reflection;
47  using System.Linq;
48  using OKW;
49  using OKW.Log;
50 
65  public class FrameObjectDictionary
66  {
67  #region Fields
68 
87  public Dictionary<string, object> __FrameObjectDictionary = new Dictionary<string, object>();
88 
89  private LogMessenger LM = null;
90 
91  #endregion Fields
92 
93  #region Constructors
94 
107  {
108  Logger.Instance.LogFunctionStartDebug("FrameObjectDictionary.FrameObjectDictionary");
109 
110  this.Init();
111 
112  Logger.Instance.LogFunctionEndDebug();
113  }
114 
115  #endregion Constructors
116 
117  #region Methods
118 
154  public object GetParentObjectByName(string fpsParentObject)
155  {
156  object lvo_Return = null;
157 
158  Logger.Instance.LogFunctionStartDebug("FrameObjectDictionary.GetParentObjectByName", "fpsFunctionalnameOfWindow", fpsParentObject);
159  try {
160  // Gibt es den Schlüssel im Dictinary? - D.h. Gibt es schon eine Instanz des Objektes im Speicher?
161  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetParentObjectByName", "M1", fpsParentObject));
162  if (this.__FrameObjectDictionary.ContainsKey(fpsParentObject))
163  {
164  // Ja, das Objekt existiert.
165  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetParentObjectByName", "M2"));
166  lvo_Return = this.__FrameObjectDictionary[fpsParentObject];
167  } else {
168  // Nein -> Frame zum Funtionalen NAme wurde nicht gefunden -> Exception auslösen...
169  // \todo TODO: Fehlermeldung einbauen...
170  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetParentObjectByName", "M3"));
171 
172  string lvsMessage = this.LM.GetMessage("GetParentObjectByName", "OKWFrameObjectParentNotFoundException", fpsParentObject);
173  throw new OKWFrameObjectParentNotFoundException(lvsMessage);
174  }
175  } finally {
176  Logger.Instance.LogFunctionEndDebug();
177  }
178 
179  return lvo_Return;
180  }
181 
209  public object GetChildObjectByName(string fps_ParentObject, string fps_ChildObject)
210  {
211  object lvo_Return = null;
212  string lvs_ObjectName = fps_ParentObject + "." + fps_ChildObject;
213 
214  Logger.Instance.LogFunctionStartDebug("FrameObjectDictionary.GetChildObjectByName", "fps_ParentObject", fps_ParentObject, "fps_ChildObject", fps_ChildObject);
215 
216  // Gibt es den Schlüssel im Dictinary?
217  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetChildObjectByName", "M1", fps_ChildObject, fps_ParentObject));
218 
219  if (this.__FrameObjectDictionary.ContainsKey(lvs_ObjectName)) {
220  // Ja, das Objekt existiert.
221  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetChildObjectByName", "M2"));
222  // Hole refarenc auf des Objekt im Dictionary
223  lvo_Return = this.__FrameObjectDictionary[lvs_ObjectName];
224  } else {
225  // Nein -> Frame zum Funtionalen Name wurde nicht gefunden -> Exception OKWFrameObjectChildNotFoundException auslösen...
226  // \todo TODO: Fehlermeldung einbauen...
227  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetChildObjectByName", "M3"));
228 
229  string lvsMessage = this.LM.GetMessage("GetChildObjectByName", "OKWFrameObjectChildNotFoundException", lvs_ObjectName );
230  throw new OKWFrameObjectChildNotFoundException(lvsMessage);
231  }
232 
233  Logger.Instance.LogFunctionEndDebug();
234  return lvo_Return;
235  }
236 
254  public void Init()
255  {
256  Logger.Instance.LogFunctionStartDebug("FrameObjectDictionary.Init");
257 
258 
259  try {
260  this.LM = new LogMessenger("FrameObjectDictionary");
261 
262  Logger.Instance.LogPrint(this.LM.GetMessage("Init", "InitClear", this.GetType().Name));
263  this.__FrameObjectDictionary.Clear();
264 
265  List<Type> lvOKWGuiClasses = GetListOfOKWGuiClasses();
266 
267  this.AddFrameInstancesToDictionary(lvOKWGuiClasses);
268  } finally {
269  Logger.Instance.LogFunctionEndDebug();
270  }
271  }
272 
295  public List<Type> GetListOfOKWGuiClasses()
296  {
297  string @namespace = "OKW.Frames";
298  var lvLsReturn = new List<Type>();
299 
300  Type[] myTypes;
301 
302  Assembly[] appAssemblies = AppDomain.CurrentDomain.GetAssemblies();
303 
304  for (int i = 0; i < appAssemblies.Length; i++) {
305  Logger.Instance.LogPrint("-------------------------------------------------------------------------------------------");
306  Logger.Instance.LogPrint(string.Format("Assambly {0}: {1}\n", i, appAssemblies[i].FullName));
307  Logger.Instance.LogPrint("-------------------------------------------------------------------------------------------");
308 
309  Assembly myAssembly = appAssemblies[i];
310  myTypes = myAssembly.GetTypes();
311 
312  var q = from t in myTypes
313  where t.IsClass && t.Namespace == @namespace
314  select t;
315 
316  foreach (Type t in q) {
317  if (t.GetCustomAttributes(typeof(OKWGUIAttribute), true).Length > 0) {
318  lvLsReturn.Add(t);
319  }
320  }
321  }
322  return lvLsReturn;
323  }
324 
334 
341  private void AddFrameInstancesToDictionary(List<Type> fpListOfOKWGuiTypes)
342  {
343  object lvTypeInstanceAsObject = null;
344 
345  Logger.Instance.LogFunctionStartDebug("FrameObjectDictionary.AddFrameInstancesToDictionary");
346 
347  try {
348  // Für jede Klasse...
349  foreach (Type lvOKWGuiClass in fpListOfOKWGuiTypes) {
350  lvTypeInstanceAsObject = CreateInstanceByType(lvOKWGuiClass);
351 
352  // Funktionalenname der Klasse aus dem Attribute OKWGUI auslesen.
353  string lvFunktionalname = this.GetFunktionlanameFromObjekt(lvTypeInstanceAsObject);
354 
355  // Wenn Attribute vorhanden (!=null) und nicht Leer dann ins Dictionary einfügen.
356  if (!string.IsNullOrEmpty(lvFunktionalname)) {
357  string lvsKey = lvFunktionalname;
358  System.Console.WriteLine("\n Window Frame: >>" + lvsKey + "<<");
359  System.Console.WriteLine(" Technisches Objekt: >>" + lvTypeInstanceAsObject.GetType().FullName + "<<");
360 
361  this.__FrameObjectDictionary.Add(lvFunktionalname, lvTypeInstanceAsObject);
362 
363  Logger.Instance.LogPrintDebug(this.LM.GetMessage("CreateInstanceByObjectName", "InstanceWasCreated", lvTypeInstanceAsObject.GetType().FullName));
364 
365  //nun Rekursive die Kinder (=Felder) des Frames durgehen und ins einlesen.
366  Scanfields(lvOKWGuiClass, lvTypeInstanceAsObject, lvFunktionalname);
367  }
368  }
369  } finally {
370  Logger.Instance.LogFunctionEndDebug();
371  }
372 
373  return;
374  }
375 
376 
377  public void Scanfields(Type fpType, object fpsWindowAsObject, string fpsWindowName)
378  {
379  Type myType = fpType;
380 
381  try {
382  // Get the FieldInfo of MyClass.
383  FieldInfo[] myFields = myType.GetFields(BindingFlags.Public | BindingFlags.Instance);
384 
385  foreach (FieldInfo myField in myFields) {
386  object[] myAttribute = myField.GetCustomAttributes(typeof(OKWGUIAttribute), false);
387 
388  object lvoChildObjekt = fpsWindowAsObject.GetType().InvokeMember(
389  myField.Name,
390  BindingFlags.GetField,
391  null,
392  fpsWindowAsObject,
393  null);
394 
395  if (myAttribute.Length > 0) {
396  OKWGUIAttribute myOKWGUI = (OKWGUIAttribute)myAttribute[0];
397  // Get the value from property.
398 
399  string lvsKey = fpsWindowName + "." + myOKWGUI.FunctionalName;
400  System.Console.WriteLine("\n Child: >>" + lvsKey + "<<");
401  System.Console.WriteLine(" Technisches Objekt: >>" + lvoChildObjekt.GetType().FullName + "<<");
402 
403  __FrameObjectDictionary.Add(fpsWindowName + "." + myOKWGUI.FunctionalName, lvoChildObjekt);
404 
405  // Dann im Bojket weiter Scannen...
406  Scanfields(myField.FieldType, lvoChildObjekt, fpsWindowName);
407  } else {
408  Scanfields(myField.FieldType, lvoChildObjekt, fpsWindowName);
409  }
410  }
411  } catch (Exception e) {
412  Console.WriteLine("Exception : {0}", e.Message);
413  }
414  }
415 
416 
421  private string GetFunktionlanameFromObjekt(object fpObject)
422  {
423  string lvsReturn = "";
424 
425  Attribute[] attrs = System.Attribute.GetCustomAttributes(fpObject.GetType()); // Reflection.
426 
427  // Displaying output.
428  foreach (System.Attribute attr in attrs) {
429  if (attr is OKWGUIAttribute) {
430  OKWGUIAttribute a = (OKWGUIAttribute)attr;
431  lvsReturn = a.FunctionalName;
432  }
433  }
434 
435  return lvsReturn;
436  }
437 
438 
465  private object CreateInstanceByType(Type fpParentType)
466  {
467  object lvo_Obj = null;
468  bool bOK = false;
469 
470  Logger.Instance.LogFunctionStartDebug("FrameObjectDictionary.CreateInstanceByObjectName", "fpParentClass", fpParentType.FullName);
471 
472  try {
473  lvo_Obj = Activator.CreateInstance(fpParentType, null);
474 
475  Logger.Instance.LogPrintDebug(this.LM.GetMessage("CreateInstanceByObjectName", "InstanceWasCreated", lvo_Obj.GetType().FullName));
476  bOK = true;
477  } catch (TargetInvocationException e) {
478  // EXCEPTION: Pürfen was hier genau passiert. Exception weitergeben
479  throw new OKWFrameObjectParentNotFoundException(this.LM.GetMessage("CreateInstanceByObjectName", "InstanceWasCreated", fpParentType.FullName), e);
480  } finally {
481  if (bOK) {
482  // Wir sind ohne Exception durchgekommen und wir nehmen an,
483  // dass lvo_Obj != null
484  // -> wir geben den Namen des Objektes zurück...
485  Logger.Instance.LogFunctionEndDebug(lvo_Obj.GetType().FullName);
486  } else {
487  // Irgend etwas ist faul wir rufen nur LogFunctionEndDebug auf...
488  Logger.Instance.LogFunctionEndDebug();
489  }
490  }
491 
492  return lvo_Obj;
493  }
494 
519  private object __CreateInstanceByObjectName(string fps_ParentObject, string fps_ChildObject)
520  {
521  Logger.Instance.LogFunctionStartDebug("FrameObjectDictionary.CreateInstanceByObjectName", "fps_ParentObject", fps_ParentObject, "fps_ChildObject", fps_ChildObject);
522 
523  object myParentObject = null;
524  object myChildObject = null;
525  bool bOK = false;
526 
527  try {
528  // PerentObject holen und ggf. als instanz anlegen
529  myParentObject = this.GetParentObjectByName(fps_ParentObject);
530 
531  // Kindobjekt aufrufen...
532  // aber nur wenn Paretobjekt gefunden worden ist.
533  if (myParentObject != null) {
534  // FIXME: was ist wenn das myChildObject = null ist??Checken
535  myChildObject = this.GetChildObjectByName(myParentObject, fps_ChildObject);
536  } else {
537  // LANGUAGE: Log Schreiben..
538  throw new OKWFrameObjectParentNotFoundException("Frame Objekt des Fensters");
539  }
540 
541  bOK = true;
542  } finally {
543  if (bOK) {
544  // Wir sind ohne Exception durchgekommen und wir nehmen an,
545  // dass lvo_Obj != null
546  // -> wir geben den Namen des Objektes zurück...
547  Logger.Instance.LogFunctionEndDebug(myChildObject.GetType().FullName);
548  } else {
549  // Irgend etwas ist faul wir rufen nur LogFunctionEndDebug auf...
550  Logger.Instance.LogFunctionEndDebug();
551  }
552  }
553 
554  return myChildObject;
555  }
556 
576  private object GetChildObjectByName(object fpo_ParentObject, string fps_ChildName)
577  {
578  object lvo_Return = null;
579 
580  Logger.Instance.LogFunctionStartDebug("FrameObjectDictionary.GetChildObjectByName", "fpo_ParentObject", fpo_ParentObject.ToString(), "fps_ChildName", fps_ChildName);
581 
582  try {
583  FieldInfo fieldInfoObj = fpo_ParentObject.GetType().GetField(fps_ChildName);
584 
585  // Existiert es das Kindobjekt >>{0:}<< im Objekt >>{1:}<<?
586  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetChildObjectByName", "M1", fps_ChildName, fpo_ParentObject.GetType().Name));
587  if (fieldInfoObj == null) {
588  // Nein -> Exception auslösen und alles beenden!
589  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetChildObjectByName", "M3"));
590  throw new OKWFrameObjectChildNotFoundException(this.LM.GetMessage("GetChildObjectByName", "ChildIsNotDefined_Exception", fps_ChildName, fpo_ParentObject.GetType().Name));
591  } else {
592  // Ja, das Objekt existiert.
593  Logger.Instance.LogPrintDebug(this.LM.GetMessage("GetChildObjectByName", "M2"));
594 
595  // Get the value from property.
596  lvo_Return = fpo_ParentObject.GetType().InvokeMember(
597  fieldInfoObj.Name,
598  BindingFlags.GetField,
599  null,
600  fpo_ParentObject,
601  null);
602  }
603  } finally {
604  Logger.Instance.LogFunctionEndDebug();
605  }
606 
607  return lvo_Return;
608  }
609 
610  #endregion Methods
611  }
612 }
Attribute-Klasse OKWAttribute stellt für die Erstellung der GUIFrames aus den OKW-GUIKlassen zusätztl...
void LogPrint(string fps_Message)
LogPrint Function: Prints the values of expressions to the results file.
Definition: Logger.cs:302
object GetChildObjectByName(object fpo_ParentObject, string fps_ChildName)
Holt sich einen öffentlichen Feld Wert über den Namen.
List< Type > GetListOfOKWGuiClasses()
Methode erstellt eine Liste alle OKWGUI-Rahmenklassen (frame class), die in der aktuell ausgeführten ...
object GetParentObjectByName(string fpsParentObject)
Die Methode liefert das Frame-Object des gegebenen Fensterobjektes zurück.
Verwaltet zentral die Frame-Klassen: Instanziert Frame-Klassen zu Frame-Objekten und liefert die Refe...
object __CreateInstanceByObjectName(string fps_ParentObject, string fps_ChildObject)
Erzeugt eine Instanz des OKW-Frame-Objekts.
object CreateInstanceByType(Type fpParentType)
Die Methode erzeugt eine Instanz der Rahmenklasse (frame class) mit dem in 'fps_ParentClassName' gege...
OKW.OKWFrameObjectChildNotFoundException wird ausgelöst, wenn die Frame-Definition eines Kind-Objekte...
Dictionary< string, object > __FrameObjectDictionary
Zentrale Liste, genauer Dictionary/Hash der aktuell benutzten Frame-Objekte.
LogMessenger liest Log-Meldungen sprachspezifisch für die im Konstruktor gegeben Klasse aus der Zugeh...
Definition: LogMessenger.cs:90
void LogPrintDebug(string fpsMessage)
Loggt eine Nachricht.
Definition: Logger.cs:332
FrameObjectDictionary()
Konstuktor der Klasse. Es wird die Methode FrameObjectDictionary.Init() aufgerufen.
object GetChildObjectByName(string fps_ParentObject, string fps_ChildObject)
Die Methode liefert das Objekt des gegebenen Kindobjekttests zurück.
void Init()
Methode initialisiert diese Klasse.
void AddFrameInstancesToDictionary(List< Type > fpListOfOKWGuiTypes)
Definition: Core.cs:40
string GetFunktionlanameFromObjekt(object fpObject)
List dasAttribute Funktionalname das übergeben Objektes aus.