// Verify that the name of an entry can be modified to a new name.
        private bool CanModify(MetadataEntryDescription description, string newName)
        {
            MetadataEntryDescription newDescription =
                MetadataEntryDescription.GetDAISYEntries().ContainsKey(newName) ?
                MetadataEntryDescription.GetDAISYEntries()[newName] : null;

            return(CanRemove(description) &&
                   (newDescription == null || CanAdd(newDescription)));
        }
        /// <summary>
        /// A particular entry can be removed if it is not readonly and not the only occurrence in case of a required entry.
        /// </summary>
        public bool CanRemove(MetadataEntryDescription d)
        {
            // do not allow delete metadata node if focus is in text boxes
            if (mContentTextbox.ContainsFocus || mNameTextbox.ContainsFocus)
            {
                return(false);
            }

            return
                (d == null ||
                 (!d.ReadOnly && (d.Occurrence != MetadataOccurrence.Required || mView.Presentation.GetMetadata(d.Name).Count > 1)));
        }
        private MetadataEntryDescription mDescription;  // and corresponding description (may be null for free metadata)

        public MetadataItemSelection(ListViewItem item, MetadataEntryDescription description)
        {
            mItem        = item;
            mDescription = description;
        }
 private void mMetadataListView_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (mMetadataListView.SelectedItems.Count == 0)
     {
         mView.Selection = null;
     }
     else
     {
         ListViewItem item = mMetadataListView.SelectedItems[0];
         if (item != null)
         {
             mView.Selection = new MetadataSelection((ObiNode)mView.Presentation.RootNode, this,
                                                     new MetadataItemSelection(item, MetadataEntryDescription.GetDAISYEntry(item.Text)));
         }
     }
 }
 private void CommitValues()
 {
     if (mSelection != null && !String.IsNullOrEmpty(mNameTextbox.Text))
     {
         if (GetTextFromContentTextbox() != "")
         {
             string contentBoxText = GetTextFromContentTextbox();
             int    itemIndex      = 0;
             if (mMetadataListView.SelectedItems.Count > 0)
             {
                 itemIndex = mMetadataListView.SelectedItems[0].Index;
             }
             urakawa.metadata.Metadata entry = mSelection.Item.Entry;
             if (entry == null && mNameTextbox.Text != "")
             {
                 if (mMetadataListView.Items.Count > 0 && mMetadataListView.Items[itemIndex].Tag == null &&
                     CanAdd(MetadataEntryDescription.GetDAISYEntry(mNameTextbox.Text)))
                 {
                     entry = mView.AddMetadataEntry(mNameTextbox.Text);
                 }
                 else
                 {
                     return;
                 }
             }
             if (mSelection == null)
             {
                 return;
             }
             CompositeCommand command =
                 mView.Presentation.CreateCompositeCommand(Localizer.Message("modify_metadata_entry"));
             if (entry.NameContentAttribute.Name != mNameTextbox.Text)
             {
                 if (CanModify(mSelection.Item.Description, mNameTextbox.Text))
                 {
                     command.ChildCommands.Insert(command.ChildCommands.Count, new Commands.Metadata.ModifyName(mView, entry, mNameTextbox.Text));
                 }
                 else
                 {
                     MessageBox.Show(String.Format(Localizer.Message("metadata_name_error_text"), mNameTextbox.Text),
                                     Localizer.Message("metadata_name_error_caption"),
                                     MessageBoxButtons.OK, MessageBoxIcon.Error);
                     mNameTextbox.Text = entry.NameContentAttribute.Name;
                 }
             }
             if (entry.NameContentAttribute.Value != contentBoxText)
             {
                 command.ChildCommands.Insert(command.ChildCommands.Count, new Commands.Metadata.ModifyContent(mView, entry, contentBoxText));
             }
             if (command.ChildCommands.Count > 0)
             {
                 mView.Presentation.UndoRedoManager.Execute(command);
             }
         }
         else
         {
             if (!IsDateMetadataSelected || string.IsNullOrEmpty(mContentTextbox.Text))
             {
                 MessageBox.Show(Localizer.Message("MetadataView_CannotCommitEmptyContent"), Localizer.Message("Caption_Error"));
             }
             mContentTextbox.Focus();
             if (mSelection != null && mSelection.Item.Entry == null &&
                 mMetadataListView.SelectedItems.Count > 0 && mMetadataListView.SelectedItems[0] != null && mMetadataListView.SelectedItems[0].Checked)
             {
                 mMetadataListView.SelectedItems[0].Checked = false;
             }
         }     // contentbox check ends
     }
 }
        // Import metadata entries from the presentation
        private void ImportMetadata()
        {
            if (InvokeRequired)
            {
                Invoke(new ImportMetadataInvokation(ImportMetadata));
            }
            else
            {
                mMetadataListView.ItemChecked -= new System.Windows.Forms.ItemCheckedEventHandler(mMetadataListView_ItemChecked);
                m_IsImportingMetadata          = true;
                mMetadataListView.Items.Clear();
                string[] nameContent = new string[2];
                List <urakawa.metadata.Metadata> items = mView.Presentation.Metadatas.ContentsAs_ListCopy;
                items.Sort(delegate(urakawa.metadata.Metadata a, urakawa.metadata.Metadata b)
                {
                    int names = a.NameContentAttribute.Name.CompareTo(b.NameContentAttribute.Name);
                    if (a.NameContentAttribute.Value != null && b.NameContentAttribute.Value != null)
                    {
                        return(names == 0 ? a.NameContentAttribute.Value.CompareTo(b.NameContentAttribute.Value) : names);
                    }
                    else
                    {
                        if (a.NameContentAttribute.Value == null)
                        {
                            a.NameContentAttribute.Value = Localizer.Message("Metadata_Empty");
                        }
                        if (b.NameContentAttribute.Value == null)
                        {
                            b.NameContentAttribute.Value = Localizer.Message("Metadata_Empty");
                        }
                        return(names);
                    }
                });

                // a list of metadata names which already exists
                // purpose is to compare addable items and prevent their addition to list if it is already there
                List <string> ExistingItemsList = new List <string>();

                foreach (urakawa.metadata.Metadata m in items)
                {
                    nameContent[0] = m.NameContentAttribute.Name;
                    nameContent[1] = m.NameContentAttribute.Value;
                    ListViewItem item = new ListViewItem(nameContent);
                    mMetadataListView.Items.Add(item);
                    item.Checked = true;
                    item.Tag     = m;

                    ExistingItemsList.Add(nameContent[0]);
                    MetadataEntryDescription metDes = MetadataEntryDescription.GetDAISYEntry(m.NameContentAttribute.Name);
                    if (metDes != null)
                    {
                        if (metDes.ReadOnly)
                        {
                            item.BackColor = SystemColors.InactiveCaption;
                        }
                    }
                }
                List <string> addables = mView.AddableMetadataNames;
                addables.Sort();
                addables.Add(Localizer.Message("metadata_custom"));
                foreach (string name in addables)
                {
                    if (!ExistingItemsList.Contains(name))
                    {
                        nameContent[0] = name;
                        nameContent[1] = "";
                        ListViewItem item = new ListViewItem(nameContent);
                        mMetadataListView.Items.Add(item);
                        item.Checked = false;
                        item.Tag     = null;
                        MetadataEntryDescription metDes = MetadataEntryDescription.GetDAISYEntry(name);
                        if (metDes != null)
                        {
                            if (metDes.ReadOnly)
                            {
                                item.BackColor = SystemColors.InactiveCaption;
                            }
                        }
                    }
                }
                m_IsImportingMetadata          = false;
                mMetadataListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(mMetadataListView_ItemChecked);
            }
        }
 /// <summary>
 /// A new entry of the given kind can be added if this is not readonly, and if it is repeatable
 /// or there is not yet any occurrence of it.
 /// </summary>
 public bool CanAdd(MetadataEntryDescription d)
 {
     return
         (d == null ||
          (!d.ReadOnly && (d.Repeatable || mView.Presentation.GetMetadata(d.Name).Count == 0)));
 }
        private void UpdateMetaDataListForItemAdd(MetadataEventArgs e)
        {
            if (InvokeRequired)
            {
                Invoke(new UpdateMetadataInvokation(UpdateMetaDataListForContentChange), e);
            }
            else
            {
                mMetadataListView.ItemChecked -= new System.Windows.Forms.ItemCheckedEventHandler(mMetadataListView_ItemChecked);
                this.mMetadataListView.SelectedIndexChanged -= new System.EventHandler(this.mMetadataListView_SelectedIndexChanged);
                m_IsImportingMetadata = true;

                string[] nameContent = new string[2];
                List <urakawa.metadata.Metadata> items = mView.Presentation.Metadatas.ContentsAs_ListCopy;
                items.Sort(delegate(urakawa.metadata.Metadata a, urakawa.metadata.Metadata b)
                {
                    int names = a.NameContentAttribute.Name.CompareTo(b.NameContentAttribute.Name);
                    return(names == 0 && a.NameContentAttribute.Value != null && b.NameContentAttribute.Value != null
                        ? a.NameContentAttribute.Value.CompareTo(b.NameContentAttribute.Value)
                        : names);
                });
                string        itemToRemove      = "";
                List <string> ExistingItemsList = new List <string> ();
                int           i = 0;

                if (mMetadataListView.Items.Count == 0)
                {
                    return;
                }

                for (i = 0; i < items.Count; i++)
                {
                    string metaDataListString = mMetadataListView.Items[i].SubItems[0].Text;
                    string itemsListString    = items[i].NameContentAttribute.Name;

                    if (string.CompareOrdinal(metaDataListString, itemsListString) != 0)
                    {
                        itemToRemove = itemsListString;
                        urakawa.metadata.Metadata m = items[i];
                        nameContent[0] = m.NameContentAttribute.Name;
                        nameContent[1] = m.NameContentAttribute.Value;
                        ListViewItem item = new ListViewItem(nameContent);
                        mMetadataListView.Items.Insert(i, item);
                        item.Checked = true;
                        item.Tag     = m;
                        MetadataEntryDescription metDes = MetadataEntryDescription.GetDAISYEntry(m.NameContentAttribute.Name);
                        if (metDes != null)
                        {
                            if (metDes.ReadOnly)
                            {
                                item.BackColor = SystemColors.InactiveCaption;
                            }
                        }
                    }

                    ExistingItemsList.Add(itemsListString);
                }

                // remove only if metadata is not custom
                if (itemToRemove != Localizer.Message("metadata_custom"))
                {
                    // now search items below checked items and remove the item which we have just added above.
                    for (i = i; i < mMetadataListView.Items.Count; i++)
                    {
                        if (string.CompareOrdinal(itemToRemove, mMetadataListView.Items[i].SubItems[0].Text) == 0)
                        {
                            mMetadataListView.Items.RemoveAt(i);
                            break;
                        }
                    }
                }     // check for custom ends

                m_IsImportingMetadata = false;
                this.mMetadataListView.SelectedIndexChanged += new System.EventHandler(this.mMetadataListView_SelectedIndexChanged);
                mMetadataListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(mMetadataListView_ItemChecked);
            }
        }