private bool reload_covers()
        {
            if (Timeline != null) {
                Timeline.Pause ();
            }
            HideAll ();
            Show ();
            if (covers != null && covers.Count != 0) {
                Console.WriteLine("ClutterFlow - Reloading Covers");

                // the old current index
                int old_target_index = CurrentCover!=null ? covers.IndexOf (CurrentCover) : 0;
                // the newly calculated index
                int new_target_index = 0;
                // whether or not to keep the current cover centered
                bool keep_current = false;

                List<ClutterFlowBaseActor> old_covers = new List<ClutterFlowBaseActor> (
                    SafeGetRange (covers, old_target_index - HalfVisCovers - 1, visibleCovers + 2));
                foreach (ClutterFlowBaseActor actor in covers) {
                    if (actor.Data.ContainsKey ("isOldCover")) {
                        actor.Data.Remove ("isOldCover");
                    }
                    actor.Index = -1;
                    if (old_covers.Contains (actor)) {
                        actor.Data.Add ("isOldCover", true);
                    }
                }

                ResetLetterLookup ();
                List<ClutterFlowBaseActor> persistent_covers = new List<ClutterFlowBaseActor>();

                covers = actor_loader.GetActors (this);
                covers.ForEach (delegate (ClutterFlowBaseActor actor) {
                    if (actor.Data.ContainsKey ("isOldCover")) {
                        persistent_covers.Add (actor);
                    }
                    if (CurrentCover==actor) {
                        keep_current = true;
                    }

                    UpdateLetterLookup (actor);
                });
                InvokeLetterLookupChanged ();

                if (covers.Count == 0) {
                    InstallEmptyActor ();
                    if (old_covers.Contains (EmptyActor)) {
                        EmptyActor.Show ();
                        return false;
                    }
                    keep_current = true;
                }

                //recalculate timeline progression and the target index
                if (covers.Count > 1) {
                    if (keep_current) {
                        new_target_index = CurrentCover.Index;
                    } else {
                        if (persistent_covers.Count==0) {
                            new_target_index = (int) Math.Round(Timeline.Progress * (covers.Count-1));
                        } else if (persistent_covers.Count==1) {
                            new_target_index = persistent_covers[0].Index;
                        } else {
                            new_target_index = persistent_covers[(int) (((float) persistent_covers.Count * 0.5f) - 1.0f)].Index;
                        }
                    }
                }
                TargetIndex = new_target_index;
                Timeline.JumpToTarget ();

                //Console.WriteLine ("Timeline progress set to " + Timeline.Progress + " Timeline.RelativeTarget is " + Timeline.RelativeTarget);

                List<ClutterFlowBaseActor> truly_pers = new List<ClutterFlowBaseActor> ();
                List<ClutterFlowBaseActor> new_covers = new List<ClutterFlowBaseActor>(SafeGetRange(covers, new_target_index - HalfVisCovers - 1, visibleCovers + 2));
                foreach (ClutterFlowBaseActor actor in persistent_covers) {
                    if (actor != null) {
                        if (actor.Data.ContainsKey ("isOldCover")) {
                            actor.Data.Remove ("isOldCover");
                        }
                        if (new_covers.Contains (actor)) {
                            truly_pers.Add (actor);
                            new_covers.Remove (actor);
                            old_covers.Remove (actor);
                            actor.Show ();
                        }
                    }
                }
                foreach (ClutterFlowBaseActor actor in old_covers) {
                    if (actor != null) {
                        actor.Data.Remove ("isOldCover");
                    }
                }

                /*Console.WriteLine ("old_covers          contains " + old_covers.Count + " elements:");
                foreach (ClutterFlowBaseActor cover in old_covers)
                    Console.WriteLine("\t- " + cover.Label.Replace("\n", " - "));
                Console.WriteLine ("persistent_covers   contains " + truly_pers.Count + " elements");
                foreach (ClutterFlowBaseActor cover in truly_pers)
                    Console.WriteLine("\t- " + cover.Label.Replace("\n", " - "));
                Console.WriteLine ("new_covers          contains " + new_covers.Count + " elements");
                foreach (ClutterFlowBaseActor cover in new_covers)
                    Console.WriteLine("\t- " + cover.Label.Replace("\n", " - "));*/

                System.EventHandler update_target = delegate (object o, System.EventArgs e) {
                    Timeline.Play ();
                    InvokeCoversChanged();
                };

                Behaviour.FadeCoversInAndOut (old_covers, truly_pers, new_covers, update_target);
            } else {
                Console.WriteLine("ClutterFlow - Loading Covers");
                ResetLetterLookup ();
                covers = actor_loader.GetActors (this);
                covers.ForEach (UpdateLetterLookup);
                InvokeLetterLookupChanged ();
                TargetIndex = 0;
                Timeline.JumpToTarget ();
                if (covers==null || covers.Count==0) {
                    InstallEmptyActor ();
                    Behaviour.UpdateActors ();
                    Behaviour.FadeInActor (EmptyActor);
                }
                Timeline.Play ();
                InvokeCoversChanged ();
            }

            return false;
        }
Пример #2
0
        public void Show(Connection connection, LdapEntry entry, bool showAll)
        {
            displayAll = showAll;
            conn = connection;
            currentDN = entry.DN;
            currentAttributes = new NameValueCollection ();

            // FIXME: crashes after an apply if I don't re-create the store;
            store = new ListStore (typeof (string), typeof(string));
            store.SetSortColumnId (0, SortType.Ascending);
            tv.Model = store;

            //			store.Clear ();

            allAttrs = new List<string> ();
            LdapAttribute a = entry.getAttribute ("objectClass");

            for (int i = 0; i < a.StringValueArray.Length; i++) {

                string o = (string) a.StringValueArray[i];
                store.AppendValues ("objectClass", o);
                currentAttributes.Add ("objectClass", o);

                string[] attrs = conn.Data.GetAllAttributes (o);
                if (attrs != null) {
                    foreach (string at in attrs)
                        if (!allAttrs.Contains (at))
                            allAttrs.Add (at);
                } else {
                    Log.Debug("Could not retrieve any attribute for objectClass " + o);
                }
            }

            LdapAttributeSet attributeSet = entry.getAttributeSet ();

            // Fedora Directory Server supports an Access Control Item (ACI)
            // but it is not listed as "allowed attribute" for any objectClass
            // found in Fedora's LDAP schema.
            if (showAll && conn.Settings.ServerType == LdapServerType.FedoraDirectory) {
                LdapEntry[] acientries = conn.Data.Search(	currentDN,
                                                        LdapConnection.SCOPE_BASE,
                                                        "objectclass=*",
                                                        new string[] {"aci"} );

                if (acientries.Length > 0) {
                    LdapEntry acientry = acientries[0];
                    LdapAttribute aciattr = acientry.getAttribute("aci");
                    if (aciattr != null)
                        if (attributeSet.Add(aciattr) == false)
                            Log.Debug ("Could not add ACI attribute.");
                }
            }

            foreach (LdapAttribute attr in attributeSet) {

                if (allAttrs.Contains (attr.Name))
                    allAttrs.Remove (attr.Name);

                if (attr.Name.ToLower() == "objectclass")
                    continue;

                try {

                    foreach (string s in attr.StringValueArray) {
                        store.AppendValues (attr.Name, s);
                        currentAttributes.Add (attr.Name, s);
                    }

                } catch (ArgumentOutOfRangeException e) {
                    // FIXME: this only happens with gmcs
                    store.AppendValues (attr.Name, "");
                    Log.Debug ("Show attribute arugment out of range: {0}", attr.Name);
                    Log.Debug (e.Message);
                }
            }

            if (!showAll)
                return;

            foreach (string n in allAttrs)
                store.AppendValues (n, "");
        }