static void RemoveTrailingBracket(Wd.Range range)
 {
     range.MoveEnd(Wd.WdUnits.wdCharacter, 2);
     if (range.Characters.Count == 2 && range.Text == "\")")
         range.Delete();
     range.Collapse(Wd.WdCollapseDirection.wdCollapseStart);
 }
Esempio n. 2
0
 static void DeleteParagraphIfEmpty1(Wd.ContentControl control)
 {
     Wd.Range range = control.Range;
     control.Delete(true);
     if (range.Paragraphs[1].IsEmpty())
         range.Paragraphs[1].Range.Delete();
 }
 static void RemovePreceedingComma(Wd.Range range)
 {
     range.MoveStart(Wd.WdUnits.wdCharacter, -2);
     if (range.Characters.Count == 2 && range.Text == ", ")
         range.Delete();
     range.Collapse(Wd.WdCollapseDirection.wdCollapseEnd);
 }
        /// <summary>
        /// Delete certain hyperlink
        /// </summary>
        /// <param name="h">the link itself</param>
        private void Delete1Hl(Word.Hyperlink h)
        {
            if (!LinkIsOurs(h)) return;
#if with_LinkCache
            if (LinkCache.ContainsKey(h)) LinkCache.Remove(h);
#endif//with_LinkCache
            //check if we have set this link: 1)by address(contains http://eur-lex...) and 2) has color wdRed or wdGreen: todo
            try
            {
                if (h != null) if (h.Range != null) if (h.Range.Font != null) h.Range.Font.ColorIndex = Word.WdColorIndex.wdBlack;
            }
            catch { }
            //System.Windows.Forms.MessageBox.Show(hl.Range.Text.ToString() + "\n" + hl.Address.ToString());
            h.Delete();
        }
        public void copyBuildingBlockLogic(Word.Document target, Word.Range range)
        {
            // FabDotxAsTemplate.OpenAsDocument() throws:
            //     This object model command is not available while in the current event.
            // Documents.Open(the dotx) is not allowed either
            // so make a temporary copy.

            //string tmp = System.IO.Path.GetTempFileName();
            //System.IO.File.Copy(templatePath, tmp, true);
            // .. but that fails the second time
            Word.Document fabdocx;
            try
            {
                //fabdocx = openDocument(tmp);
                fabdocx = FabDotxAsTemplate.OpenAsDocument();
            }
            catch (Exception e)
            {
                log.Error(e);
                throw e;
            }

            Model srcModel = Model.ModelFactory(fabdocx);

            Helpers.LibraryHelper libHelp = new Helpers.LibraryHelper(srcModel);
            try
            {
                libHelp.identifyLogic(range);
            }
            catch (Helpers.BuildingBlockLogicException bble)
            {
                log.Error(bble);
                MessageBox.Show("You can't reuse repeating content in a repeat"); // TODO, relax this restriction
                range.Delete();
                return;
            }

            Model targetModel = Model.ModelFactory(target);

            try
            {
                libHelp.injectLogic(targetModel, false, true, false);
                libHelp.updateBindings(range, targetModel.answersPart);
                // OK, remove od:source from the cc's
                // in our document
                libHelp.TagsSourceRemove(range);
            }
            catch (Helpers.BuildingBlockLogicException bble)
            {
                log.Error(bble);
                MessageBox.Show("ID collision"); // TODO, relax this restriction
                range.Delete();
                return;
            }
            finally
            {
                // OK to close the template now
                closeDocument(fabdocx);
                //System.IO.File.Delete(tmp);
                //log.Debug("deleted " + tmp);
            }
        }
Esempio n. 6
0
        public void removeRangeTextAndRepositionCursor(Word.Range range)
        {
            range.Delete();

            // Reposition the cursor to the end of the sentence
            int position = extensionRange.End;
            Globals.ThisAddIn.Application.Selection.SetRange(position, position);
            highlight(extensionRange);
            scrollToRange(extensionRange);

            isRetrieving = 1;

            if (extensionPos == -1)
                resetExtensionMode();
        }
 protected void removeButKeepContents(Word.ContentControl copiedCC)
 {
     log.Warn("Deleting cc " + copiedCC.Tag);
     copiedCC.Delete(); // keeps contents
 }
        public static void editXPath(Word.ContentControl cc)
        {
            Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;

            // First, work out whether this is a condition or a repeat or a plain bind
            bool isCondition = false;
            bool isRepeat = false;
            bool isBind = false;
            if ( (cc.Title!=null && cc.Title.StartsWith("Condition") )
                || (cc.Tag!=null && cc.Tag.Contains("od:condition") ))
            {
                isCondition = true;
            }
            else if ( (cc.Title!=null && cc.Title.StartsWith("Repeat"))
                || (cc.Tag!=null && cc.Tag.Contains("od:repeat") ))
            {
                isRepeat = true;
            }
            else if ((cc.Title != null && cc.Title.StartsWith("Data"))
                || (cc.Tag != null && cc.Tag.Contains("od:xpath"))
                || cc.XMLMapping.IsMapped
                )
            {
                isBind = true;
            }
            else
            {
                // Ask user
                using (Forms.ConditionOrRepeat cor = new Forms.ConditionOrRepeat())
                {
                    if (cor.ShowDialog() == DialogResult.OK)
                    {
                        isCondition = cor.radioButtonCondition.Checked;
                        isRepeat = cor.radioButtonRepeat.Checked;
                        isBind = cor.radioButtonBind.Checked;
                    }
                    else
                    {
                        // They cancelled
                        return;
                    }
                }
            }

            // OK, now we know whether its a condition or a repeat or a bind
            // Is it already mapped to something?
            TagData td = new TagData(cc.Tag);
            Model model = Model.ModelFactory(document);

            string strXPath = "";

            // In order to get Id and prefix mappings for current part
            CustomTaskPane ctpPaneForThisWindow = Utilities.FindTaskPaneForCurrentWindow();
            Controls.ControlMain ccm = (Controls.ControlMain)ctpPaneForThisWindow.Control;

            string cxpId = ccm.CurrentPart.Id;
            string prefixMappings = ""; // TODO GetPrefixMappings(ccm.CurrentPart.NamespaceManager);
            log.Debug("default prefixMappings: " + prefixMappings);

            XPathsPartEntry xppe = null;
            ConditionsPartEntry cpe = null;

            if (isCondition
                && td.get("od:condition") != null)
            {
                string conditionId = td.get("od:condition");
                cpe = new ConditionsPartEntry(model);
                condition c = cpe.getConditionByID(conditionId);

                string xpathid = null;
                if (c!=null
                    && c.Item is xpathref)
                {
                    xpathref ex = (xpathref)c.Item;
                    xpathid = ex.id;

                    // Now fetch the XPath
                    xppe = new XPathsPartEntry(model);

                    xpathsXpath xx = xppe.getXPathByID(xpathid);

                    if (xx != null)
                    {
                        strXPath = xx.dataBinding.xpath;
                        cxpId = xx.dataBinding.storeItemID;
                        prefixMappings = xx.dataBinding.prefixMappings;
                    }
                }
            }
            else if (isRepeat
              && td.get("od:repeat") != null)
            {
                string repeatId = td.get("od:repeat");

                // Now fetch the XPath
                xppe = new XPathsPartEntry(model);

                xpathsXpath xx = xppe.getXPathByID(repeatId);

                if (xx != null)
                {
                    strXPath = xx.dataBinding.xpath;
                    cxpId = xx.dataBinding.storeItemID;
                    prefixMappings = xx.dataBinding.prefixMappings;
                }
            }
            else if (isBind) {

              if (cc.XMLMapping.IsMapped) {
                // Prefer this, if for some reason it contradicts od:xpath
                strXPath = cc.XMLMapping.XPath;
                cxpId = cc.XMLMapping.CustomXMLPart.Id;
                prefixMappings = cc.XMLMapping.PrefixMappings;

              } else if( td.get("od:xpath") != null) {
                string xpathId = td.get("od:xpath");

                // Now fetch the XPath
                xppe = new XPathsPartEntry(model);

                xpathsXpath xx = xppe.getXPathByID(xpathId);

                if (xx != null)
                {
                    strXPath = xx.dataBinding.xpath;
                    cxpId = xx.dataBinding.storeItemID;
                    prefixMappings = xx.dataBinding.prefixMappings;
                }

              }
            }

            // Now we can present the form
            using (Forms.XPathEditor xpe = new Forms.XPathEditor())
            {
                xpe.textBox1.Text = strXPath;
                if (xpe.ShowDialog() == DialogResult.OK)
                {
                    strXPath = xpe.textBox1.Text;
                }
                else
                {
                    // They cancelled
                    return;
                }
            }

            // Now give effect to it
            td = new TagData("");
            if (isCondition)
            {
                // Create the new condition. Doesn't attempt to delete
                // the old one (if any)
                if (cpe == null)
                {
                    cpe = new ConditionsPartEntry(model);
                }
                cpe.setup(cxpId, strXPath, prefixMappings, true);
                cpe.save();

                cc.Title = "Conditional: " + cpe.conditionId;
                // Write tag
                td.set("od:condition", cpe.conditionId);
                cc.Tag = td.asQueryString();

            }
            else if (isRepeat)
            {
                // Create the new repeat. Doesn't attempt to delete
                // the old one (if any)
                if (xppe == null)
                {
                    xppe = new XPathsPartEntry(model);
                }

                xppe.setup("rpt", cxpId, strXPath, prefixMappings, false);
                xppe.save();

                cc.Title = "Repeat: " + xppe.xpathId;
                // Write tag
                td.set("od:repeat", xppe.xpathId);
                cc.Tag = td.asQueryString();
            }
            else if (isBind)
            {
                // Create the new bind. Doesn't attempt to delete
                // the old one (if any)
                if (xppe == null)
                {
                    xppe = new XPathsPartEntry(model);
                }

                Word.XMLMapping bind = cc.XMLMapping;
                bool mappable = bind.SetMapping(strXPath, prefixMappings,
                    CustomXmlUtilities.getPartById(document, cxpId) );
                if (mappable) {
                    // What does the XPath point to?
                    string val = cc.XMLMapping.CustomXMLNode.Text;

                    cc.Title = "Data value: " + xppe.xpathId;

                    if (ContentDetection.IsBase64Encoded(val))
                    {
                        // Force picture content control ...
                        // cc.Type = Word.WdContentControlType.wdContentControlPicture;
                        // from wdContentControlText (or wdContentControlRichText for that matter)
                        // doesn't work (you get "inappropriate range for applying this
                        // content control type").

                        cc.Delete(true);

                        // Now add a new cc
                        object missing = System.Type.Missing;
                        Globals.ThisAddIn.Application.Selection.Collapse(ref missing);
                        cc = document.ContentControls.Add(
                            Word.WdContentControlType.wdContentControlPicture, ref missing);

                        cc.XMLMapping.SetMapping(strXPath, prefixMappings,
                            CustomXmlUtilities.getPartById(document, cxpId));

                    } else if (ContentDetection.IsXHTMLContent(val) )
                    {
                        td.set("od:ContentType", "application/xhtml+xml");
                        cc.Tag = td.asQueryString();

                        cc.XMLMapping.Delete();
                        cc.Type = Word.WdContentControlType.wdContentControlRichText;
                        cc.Title = "XHTML: " + xppe.xpathId;

                        if (Inline2Block.containsBlockLevelContent(val))
                        {
                            Inline2Block i2b = new Inline2Block();
                            cc = i2b.convertToBlockLevel(cc, true);

                            if (cc == null)
                            {
                                MessageBox.Show("Problems inserting block level XHTML at this location.");
                                return;
                            }

                        }
                    }

                    xppe.setup(null, cxpId, strXPath, prefixMappings, true);
                    xppe.save();

                    td.set("od:xpath", xppe.xpathId);

                    cc.Tag = td.asQueryString();

                } else
                {
                    xppe.setup(null, cxpId, strXPath, prefixMappings, true);
                    xppe.save();

                    td.set("od:xpath", xppe.xpathId);

                    cc.Title = "Data value: " + xppe.xpathId;
                    cc.Tag = td.asQueryString();

                    log.Warn(" XPath \n\r " + strXPath
                        + "\n\r does not return an element. The OpenDoPE pre-processor will attempt to evaluate it, but Word will never update the result. ");
                    bind.Delete();
                    MessageBox.Show(" XPath \n\r " + strXPath
                        + "\n\r does not return an element. Check this is what you want? ");
                }

            }
        }
        /// <summary>
        /// An inline rich text control can't contain carriage returns.
        /// </summary>
        /// <param name="control"></param>
        public Word.ContentControl convertToBlockLevel(Word.ContentControl currentCC, bool keepContents, bool updateScreen)
        {
            Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;
            OpenDoPEModel.DesignMode designMode = new OpenDoPEModel.DesignMode(document);

            // Only do it if the content control is rich text
            if (!currentCC.Type.Equals(Word.WdContentControlType.wdContentControlRichText))
            {
                log.Warn("convert to block level only operates on rich text controls, not " + currentCC.Type);
                return null;
            }

            string majorVersionString = Globals.ThisAddIn.Application.Version.Split(new char[] { '.' })[0];
            int majorVersion = Convert.ToInt32(majorVersionString);

            // Only do it if the content control is not already block level
            //
            if (isBlockLevel(currentCC)) return currentCC;

            // Can only do this if the content control is not
            // nested within some other inline content control
            if (currentCC.ParentContentControl != null
                && !isBlockLevel(currentCC.ParentContentControl))
            {
                MessageBox.Show("This content control contains block level content, but can't be converted automatically.  Please correct this yourself, by deleting it, and re-creating at block level.");
                return null;
            }

            if (majorVersion >= 14)
            {
                getWordApp().UndoRecord.StartCustomRecord("Promote content control to block-level");
            }

            bool ccIsAtPStart = ccStartsAtStartOfParagraph(currentCC);

            object collapseStart = Word.WdCollapseDirection.wdCollapseStart;
            //object collapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
            object unitCharacter = Word.WdUnits.wdCharacter;

            // Get a range start of cc.
            Word.Range ccRange = currentCC.Range;
            ccRange.Collapse(ref collapseStart);

            // Delete the cc, but preserve Tag, Title
            string tagVal = currentCC.Tag;
            string titleVal = currentCC.Title;
            string contents = currentCC.Range.Text;

            currentCC.Delete(true);

            ccRange.Select();
            if (ccIsAtPStart)
            {
                document.Windows[1].Selection.TypeParagraph();
            }
            else
            {
                // Insert 2 new paragraphs
                document.Windows[1].Selection.TypeParagraph();
                document.Windows[1].Selection.TypeParagraph();
            }

            // Create a cc around the first new p
            object start = ccRange.Start+1;
            object end = ccRange.Start+1;
            object newRange = document.Range(ref start, ref end);
            log.Info("target {0}, {1}", ((Word.Range)newRange).Start, ((Word.Range)newRange).End);

            designMode.Off();
            Word.ContentControl newCC = document.ContentControls.Add(Word.WdContentControlType.wdContentControlRichText, ref newRange);
            designMode.restoreState();

            newCC.Tag = tagVal;
            newCC.Title = titleVal;
            if (keepContents) // want to do this for XHTML
            {
                newCC.Range.Text = contents;
            }

            if (updateScreen)
            {
                newCC.Application.ScreenUpdating = true;
                newCC.Application.ScreenRefresh();
            }
            return newCC;

            // Approach:
            //  .. Get the paragraph
            // .. Make a copy
            // .. in the copy, delete up to our position
            // .. in the original, delete after our position

            //Word.Range splittingPoint = sel.Range;

            //object para1DeleteStartPoint = splittingPoint.Start;

            //Word.Range paraOrig = Globals.ThisAddIn.Application.ActiveDocument.Range(ref para1DeleteStartPoint, ref para1DeleteStartPoint);
            //paraOrig.MoveStart(ref unitParagraph, ref back1);

            //int lengthStartSegment = paraOrig.End - paraOrig.Start;

            //object startPoint = paraOrig.Start;

            //paraOrig.MoveEnd(ref unitParagraph, ref forward1);

            //object endPoint = paraOrig.End;
            //object endPointPlusOne = paraOrig.End + 1;

            //// copy it
            //Word.Range insertPoint = Globals.ThisAddIn.Application.ActiveDocument.Range(ref endPoint, ref endPoint);
            //paraOrig.Copy();
            //insertPoint.Paste();

            //// In the copy, delete the first half
            //// (do this operation first, to preserve our original position calculations)
            //object para2DeleteEndpoint = (int)endPoint + lengthStartSegment;
            //Word.Range para2Deletion = Globals.ThisAddIn.Application.ActiveDocument.Range(ref endPoint, ref para2DeleteEndpoint);
            //para2Deletion.Delete();

            //// In the original, delete the second half
            //Word.Range para1Deletion = Globals.ThisAddIn.Application.ActiveDocument.Range(ref para1DeleteStartPoint, ref endPoint);
            //para1Deletion.Delete();

            if (majorVersion >= 14)
            {
                getWordApp().UndoRecord.EndCustomRecord();
            }
        }
Esempio n. 10
0
        private static void ProcessWordField(Dictionary<string, string> dictionary, Word.Field field, Word.Application word)
        {
            if (field.Code == null) return;
            if (String.IsNullOrEmpty(field.Code.Text) == true) return;

            foreach (var key in dictionary.Keys)
            {
                string MergeFieldKey = string.Format(MERGEFIELD_PATTERN_0, key);
                if (field.Code.Text.IndexOf(MergeFieldKey) > -1)
                {
                    string value = dictionary[key];
                    if (String.IsNullOrEmpty(value) == true)
                    {
                        //field.Code.Text = String.Empty;
                        field.Delete();
                        break;
                    }

                    if (key.IndexOf(PICTURE) > -1)
                    {
                        InsertPicture(field, word, value);

                    }
                    else
                    {
                        InsertText(field, word, value);
                    }
                    break;
                }

            }
        }