Skip to content

Commit

Permalink
change bahavior: create bookmark when inserting reference, both vba a…
Browse files Browse the repository at this point in the history
…nd js version
  • Loading branch information
shishouyuan committed Jun 17, 2021
1 parent b3576a9 commit 2c26218
Show file tree
Hide file tree
Showing 14 changed files with 111 additions and 110 deletions.
51 changes: 30 additions & 21 deletions HandyRef.bas
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
'创建时期: 2021/5/11


Const HandyRefVersion = "20210616.1916.VBA"
Const HandyRefVersion = "20210617.2006.VBA"

Const TEXT_HandyRefGithubUrl = "https://github.com/shishouyuan/HandyRefVBA"

Expand Down Expand Up @@ -70,9 +70,8 @@ Const BrokenRefNumPosHolder = "#"

#End If

Public selectedRange As Range
Private selectedRange As Range
Private selectedBM As Bookmark
'Private lastBMRefered As Boolean

Private ribbonUI As IRibbonUI
Private helper As helper
Expand Down Expand Up @@ -137,29 +136,39 @@ Private Function GetTimeStamp() As String
GetTimeStamp = Replace(CStr(CDbl(Now)), ".", "")
End Function


Public Sub HandyRef_InsertCrossReferenceField()
Application.UndoRecord.StartCustomRecord FormatUndoRecordText(TEXT_ActionName_InsertReference)
On Error GoTo errHandle

Application.UndoRecord.StartCustomRecord FormatUndoRecordText(TEXT_ActionName_InsertReference)

Dim bmValid As Boolean
bmValid = False

If Not selectedBM Is Nothing Then
If Application.IsObjectValid(selectedBM) Then
If selectedBM.Parent Is ActiveDocument Then
insertRef:
ActiveDocument.Fields.Add Selection.Range, WdFieldType.wdFieldRef, selectedBM.Name & " \h"
bmValid = True
Else
crossFile:
MsgBox TEXT_InsertCrossReferenceField_CannotCrossFile, vbOKOnly + vbInformation, TEXT_HandyRefAppName
GoTo exitSub
End If
Else
Else ' it's possible the bookmark is deleted by the user, but the range remaind.
Set selectedBM = Nothing
GoTo noBookmark
End If
Else
noBookmark:
If Not selectedRange Is Nothing Then
If Not Application.IsObjectValid(selectedRange) Or selectedRange.Start = selectedRange.End Then
Set selectedRange = Nothing
GoTo noRange
End If
End If
If Not bmValid Then
If selectedRange Is Nothing Then
GoTo emptyRange
ElseIf Not Application.IsObjectValid(selectedRange) Or selectedRange.Start = selectedRange.End Then
emptyRange:
Set selectedRange = Nothing
MsgBox TEXT_InsertCrossReferenceField_NoRefPoint, vbOKOnly + vbInformation, TEXT_HandyRefAppName
GoTo exitSub
ElseIf Not selectedRange.Document Is ActiveDocument Then
GoTo crossFile
Else
Dim oldbm As Bookmark
Dim bmi As Bookmark
Dim bmShowHiddenOld As Boolean
Expand All @@ -181,15 +190,16 @@ noBookmark:
'create new bookmark using timestamp as its name
Set selectedBM = selectedRange.Bookmarks.Add(BookmarkPrefix & GetTimeStamp(), selectedRange)
End If
GoTo insertRef

Else
noRange:
MsgBox TEXT_InsertCrossReferenceField_NoRefPoint, vbOKOnly + vbInformation, TEXT_HandyRefAppName
bmValid = True
End If

End If

If bmValid Then
ActiveDocument.Fields.Add Selection.Range, WdFieldType.wdFieldRef, selectedBM.Name & " \h"
End If

exitSub:
Application.UndoRecord.EndCustomRecord
Exit Sub
Expand Down Expand Up @@ -348,5 +358,4 @@ Public Sub HandyRef_GetLatestVersion_RibbonFun(ByVal control As IRibbonControl)
errHandle:
ShowUnknowErrorPrompt err

End Sub

End Sub
126 changes: 59 additions & 67 deletions HandyRef.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@ var TEXT_ActionName_ClearRefBrokenComment

function HandyRef_OnLoad(ribbonUI) {

HandyRefVersion = "20210616.1908.JS"
HandyRefVersion = "20210616.2006.JS"

TEXT_HandyRefGithubUrl = "https://github.com/shishouyuan/HandyRefVBA"

BookmarkPrefix = "_HandyRef"
RefBrokenCommentTitle = "$HANDYREF_REFERENCE_BROKEN_COMMENT$"

HandyRef_Lang = "en-us"
HandyRef_Lang = "zh-cn"

BrokenRefNumPosHolder = "#"

Expand All @@ -76,8 +76,7 @@ function HandyRef_OnLoad(ribbonUI) {
TEXT_ActionName_ClearRefBrokenComment = "清除批注"


}
else {
} else {

TEXT_HandyRefAppName = "HandyRef"
TEXT_HandyRefAuthor = "Shouyuan Shi @ South China University of Technology"
Expand Down Expand Up @@ -110,7 +109,7 @@ function HandyRef_GetEnabled(control) {


var selectedBM
var lastBMRefered
var selectedRange


function HandyRef_FormatUndoRecordText(s) {
Expand All @@ -126,94 +125,87 @@ function HandyRef_CreateReferencePoint_RibbonFun(control) { // wrap the function
}

function HandyRef_CreateReferencePoint() {
try {

Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_CreateSource))

var rg = Application.Selection.Range
if (rg.End - rg.Start == 0) {

var rg = Application.Selection.Range
if(selectedRange && Application.IsObjectValid(selectedRange) && rg.IsEqual(selectedRange)){
return
}
else {
selectedBM = null
if (rg.End == rg.Start) {
selectedRange = null
alert(TEXT_CreateReferencePoint_nullSelected)
return
}

if (selectedBM) {
if (!Application.IsObjectValid(selectedBM)) {
selectedBM = null //set to null when the bookmark is deleted by user
}
else if (rg.IsEqual(selectedBM.Range)) {
return //same range, thus the same bookmark remained
}
else {
if (!lastBMRefered) {
selectedBM.Delete //delete unreferenced bookmark
selectedBM = null
}
}
}

var oldbm// As Bookmark
var bmi// As Bookmark
var bmShowHiddenOld = rg.Bookmarks.ShowHidden


//search for existing bookmark reference the same range
var bmRegExp = new RegExp(BookmarkPrefix + "\\d+")
rg.Bookmarks.ShowHidden = true
for (var i = 1; i <= rg.Bookmarks.Count; i++) {
var bmi = rg.Bookmarks.Item(i)
if (bmi.Range.IsEqual(rg) && bmRegExp.test(bmi.Name)) {
oldbm = bmi
break
}
}
rg.Bookmarks.ShowHidden = bmShowHiddenOld

if (oldbm) {
selectedBM = oldbm
lastBMRefered = true
} else {
//create new bookmark using timestamp as its name
selectedBM = rg.Bookmarks.Add(BookmarkPrefix + new Date().getTime(), rg)
lastBMRefered = false

else {
selectedRange = rg
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}

}


function HandyRef_InsertCrossReferenceField_RibbonFun(control) {
HandyRef_InsertCrossReferenceField()
}



function HandyRef_InsertCrossReferenceField() {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_InsertReference))

var bmValid = false
if (selectedBM) {
if (Application.IsObjectValid(selectedBM)) {
if (selectedBM.Parent == ActiveDocument) {
ActiveDocument.Fields.Add(Selection.Range, wdFieldRef, selectedBM.Name + " \\h")
lastBMRefered = true
bmValid = true
}
else {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
}
else {
else {// it's possible the bookmark is deleted by the user, but the range remaind.
selectedBM = null
alert(TEXT_InsertCrossReferenceField_NoRefPoint)
}
}
else {
if (!bmValid) {
if (!selectedRange || !Application.IsObjectValid(selectedRange) || selectedRange.Start == selectedRange.End) {
selectedRange = null
alert(TEXT_InsertCrossReferenceField_NoRefPoint)
return
}
else if (selectedRange.Document != ActiveDocument) {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
else {
var oldbm// As Bookmark
var bmShowHiddenOld = selectedRange.Bookmarks.ShowHidden

//search for existing bookmark reference the same range
var bmRegExp = new RegExp(BookmarkPrefix + "\\d+")
selectedRange.Bookmarks.ShowHidden = true
for (var i = 1; i <= selectedRange.Bookmarks.Count; i++) {
var bmi = selectedRange.Bookmarks.Item(i)
if (bmi.Range.IsEqual(selectedRange) && bmRegExp.test(bmi.Name)) {
oldbm = bmi
break
}
}
selectedRange.Bookmarks.ShowHidden = bmShowHiddenOld

alert(TEXT_InsertCrossReferenceField_NoRefPoint)
if (oldbm) {
selectedBM = oldbm
}
else {
//create new bookmark using timestamp as its name
selectedBM = selectedRange.Bookmarks.Add(BookmarkPrefix + new Date().getTime(), selectedRange)
}
bmValid = true

}
}
if (bmValid) {
ActiveDocument.Fields.Add(Selection.Range, wdFieldRef, selectedBM.Name + " \\h")
}
}
catch (err) {
Expand Down
Binary file modified HandyRef/HandyRef-Dev.dotm
Binary file not shown.
Binary file removed HandyRef/handyref-dev.js.dotm
Binary file not shown.
Loading

0 comments on commit 2c26218

Please sign in to comment.