<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<!--Created: 19.03.2015 16:22:08-->
<!--ACTOptimumVersion: 6.0.5548.21444-->
<ACTOptimumItems ACTOptimumVersion="6.0.5548.21444" Created="19.03.2015 16:22:08">
  <AutoDataMenu Created="19.03.2015 16:22:08" ClassName="Melville_Schellmann.ACTOptimum6.Plugin.MenuItemAutoData" PrefClassVersion="1.0" ACTOptimumVersion="6.0.5548.21444">
    <GlobalPref>True</GlobalPref>
    <NeededRole>2</NeededRole>
    <Name>Spaltenauswahl setzen</Name>
    <Tooltip>Setzt die Spaltenauswahl in der Kontaktlistenansicht.</Tooltip>
    <Description>Setzt die Spaltenauswahl in der Kontaktlistenansicht.</Description>
    <CommandBar>Symbolleiste Kontaktliste</CommandBar>
    <Menu>
    </Menu>
    <Index>-1</Index>
    <Separator>True</Separator>
    <Shortcut>None</Shortcut>
    <SourceCode>    ' #ScriptName: RestoreColumnsInContactListView
    ' #Description: Setzt die Spalten in der Listenansicht der Kontakte.
    ' #Copyright: © 2012 by Melville-Schellmann
    ' #Author: Robert Schellmann, rs@melville-schellmann.de
    ' #Version: 1.0 (07.10.2013) Erste Version

    ' Hier können die Spalten festgelegt werden, die angezeigt werden sollen
    ' In der Form: &lt;Feldname1&gt;;&lt;Spaltenbreite1&gt;;&lt;Feldname2&gt;;&lt;Spaltenbreite2&gt;;...&lt;Feldname n&gt;;&lt;Spaltenbreite n&gt;
    Dim sColumnNames As String = "Kontakt;150;Firma;150;Adresse 1;150;PLZ;50;Stadt;100;Land;100"
    Dim aColumnName() As String
    Dim oContactList As Act.Framework.Contacts.ContactList = Nothing
    Dim oDataDescriptorList As Act.Shared.Collections.DataList.DataDescriptorCollection = Nothing
    Dim oColumnSizeList As System.Collections.ArrayList = Nothing
    Dim oColumnNameList As System.Collections.ArrayList = Nothing
    Dim sViewName As String = "Act.UI.ContactViews.ContactListView"
    
    Dim sPropertyNameContactList As String = "ContactList"
    Dim sFieldNameColumnSizes As String = "columnSizes"
    Dim sFieldNameColumnNames As String = "fieldNames"
    Dim sMethodNameFixupFieldFormatting As String = "FixupFieldFormatting"
    Dim sMethodNameSetColumnSizes As String = "SetColumnSizes"
    Dim oMethod As Reflection.MethodInfo
    Dim oFieldDescriptor As Act.Framework.MutableEntities.MutableEntityFieldDescriptor
    Dim lIndexColumn As Integer
    Dim bColumnExist As Boolean
    Dim oView As Object
    Dim oValue As Object = Nothing
    oView = ACTApp.CurrentView
    If String.Compare(oView.GetType.ToString, sViewName, True) &lt;&gt; 0 Then
      MsgBox(String.Format("Die ACT!-Ansicht '{0}' wird nicht unterstützt.", oView.GetType.ToString))
      GoTo Abbruch
    End If
    If Not TryToGetMemberFromObject(oView, sPropertyNameContactList, Reflection.MemberTypes.Property, GetType(Act.Framework.Contacts.ContactList), oValue) Then
      GoTo Abbruch
    End If
    oContactList = CType(oValue, Act.Framework.Contacts.ContactList)
    oDataDescriptorList = oContactList.FieldDescriptors
    
    If Not TryToGetMemberFromObject(oView, sFieldNameColumnSizes, Reflection.MemberTypes.Field, GetType(System.Collections.ArrayList), oValue) Then
      GoTo Abbruch
    End If
    oColumnSizeList = CType(oValue, System.Collections.ArrayList)
    If Not TryToGetMemberFromObject(oView, sFieldNameColumnNames, Reflection.MemberTypes.Field, GetType(System.Collections.ArrayList), oValue) Then
      GoTo Abbruch
    End If
    oColumnNameList = CType(oValue, System.Collections.ArrayList)
    aColumnName = sColumnNames.Split(";".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    If aColumnName.Length = 0 Then
      MsgBox("Keine Spaltennamen vorhanden.")
      GoTo Abbruch
    End If
    oDataDescriptorList.BeginEdit()
    oDataDescriptorList.Clear()
    oColumnSizeList.Clear()
    oColumnNameList.Clear()
    For lIndexColumn = 0 To aColumnName.Length - 2 Step 2
      bColumnExist = False
      For Each oFieldDescriptor In ACTApp.ActFramework.Contacts.GetMutableEntityFieldDescriptors()
        If String.Compare(aColumnName(lIndexColumn), oFieldDescriptor.DisplayName, True) = 0 Then
          bColumnExist = True
          oDataDescriptorList.Add(oFieldDescriptor)
          oColumnNameList.Add(oFieldDescriptor.Name)
          oColumnSizeList.Add(CInt(aColumnName(lIndexColumn + 1)))
        End If
      Next
      If bColumnExist = False Then
        MsgBox(String.Format("Die Spalte '{0}' wurde nicht gefunden.", aColumnName(lIndexColumn)))
      End If
    Next lIndexColumn
    oDataDescriptorList.EndEdit()
    oMethod = oView.GetType.GetMethod(sMethodNameSetColumnSizes, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
    If oMethod Is Nothing Then
      MsgBox(String.Format("Methode '{0}' nicht gefunden.", sMethodNameSetColumnSizes))
      GoTo Abbruch
    End If
    oMethod.Invoke(oView, Nothing)
    oMethod = oView.GetType.GetMethod(sMethodNameFixupFieldFormatting, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
    If oMethod Is Nothing Then
      MsgBox(String.Format("Methode '{0}' nicht gefunden.", sMethodNameFixupFieldFormatting))
      GoTo Abbruch
    End If
    oMethod.Invoke(oView, Nothing)
    Abbruch:
  End Sub
  Shared Function TryToGetMemberFromObject(ByVal oObject As Object, ByVal sMemberName As String, ByVal oMemberType As System.Reflection.MemberTypes, ByVal oReturnType As System.Type, ByRef oReturnValue As Object) As Boolean
    Dim aMember() As System.Reflection.MemberInfo
    Dim oValue As Object
    Try
      aMember = oObject.GetType.GetMember(sMemberName, oMemberType, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
      oReturnValue = Nothing
      TryToGetMemberFromObject = False
      Select Case aMember.Length
        Case 0
          MsgBox(String.Format("Es wurde kein Member mit dem Namen '{0}' am Objekt vom Type '{1}' gefunden werden.", sMemberName, oObject.GetType.ToString))
          GoTo Abbruch
        Case 1
          Select Case aMember(0).MemberType
            Case Reflection.MemberTypes.Property
              oValue = CType(aMember(0), System.Reflection.PropertyInfo).GetValue(oObject, Nothing)
              If String.Compare(oValue.GetType.ToString, oReturnType.ToString, True) &lt;&gt; 0 Then
                MsgBox(String.Format("Der Type von der Property '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oValue.GetType.ToString, oReturnType.ToString))
                GoTo Abbruch
              End If
              oReturnValue = oValue
              TryToGetMemberFromObject = True
            Case Reflection.MemberTypes.Field
              oValue = CType(aMember(0), System.Reflection.FieldInfo).GetValue(oObject)
              If String.Compare(oValue.GetType.ToString, oReturnType.ToString, True) &lt;&gt; 0 Then
                MsgBox(String.Format("Der Type vom Field '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oValue.GetType.ToString, oReturnType.ToString))
                Return Nothing
              End If
              oReturnValue = oValue
              TryToGetMemberFromObject = True
            Case Else
              MsgBox(String.Format("Der Membertype '{0}' für das Member '{1}' wird nicht unterstützt.", aMember(0).MemberType.ToString, sMemberName))
              GoTo Abbruch
          End Select
        Case Else
          MsgBox(String.Format("Es wurden mehr als ein Member mit dem Namen '{0}' am Objekt vom Typ '{1}' gefunden werden.", sMemberName, oObject.GetType.ToString))
          GoTo Abbruch
      End Select
      Abbruch:
    Catch ex As Exception
      MsgBox(ex.ToString)
    End Try
  End Function
  Shared Sub Dummy()

</SourceCode>
    <IconName>star_green</IconName>
  </AutoDataMenu>
</ACTOptimumItems>