diff --git a/HipArthroplastyTemplating/HipArthroplastyTemplating.xcodeproj/project.pbxproj b/HipArthroplastyTemplating/HipArthroplastyTemplating.xcodeproj/project.pbxproj index 02a8ec2..f47f8d7 100644 --- a/HipArthroplastyTemplating/HipArthroplastyTemplating.xcodeproj/project.pbxproj +++ b/HipArthroplastyTemplating/HipArthroplastyTemplating.xcodeproj/project.pbxproj @@ -106,7 +106,7 @@ 59F6A17010564067008585F5 /* ArthroplastyTemplatingWindowController+OsiriX.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "ArthroplastyTemplatingWindowController+OsiriX.mm"; sourceTree = ""; }; 59F6A17410564159008585F5 /* ArthroplastyTemplatingWindowController+Templates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ArthroplastyTemplatingWindowController+Templates.h"; sourceTree = ""; }; 59F6A17510564159008585F5 /* ArthroplastyTemplatingWindowController+Templates.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "ArthroplastyTemplatingWindowController+Templates.mm"; sourceTree = ""; }; - 712BC55D15871807005460E6 /* OsiriXAPI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OsiriXAPI.framework; path = "../../osirix-trunk/build/Development/OsiriXAPI.framework"; sourceTree = ""; }; + 712BC55D15871807005460E6 /* OsiriXAPI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OsiriXAPI.framework; path = ../../osirix/build/Development/OsiriXAPI.framework; sourceTree = ""; }; 713D45E115AD861000B392E0 /* Versions.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Versions.txt; sourceTree = ""; }; 718D0AE8159C8E9A00F27CE9 /* HipAT2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HipAT2D.h; sourceTree = ""; }; 718D0AE9159C8E9A00F27CE9 /* HipAT2D.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = HipAT2D.mm; sourceTree = ""; }; @@ -419,7 +419,7 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", - "\"$(SRCROOT)/../../osirix-trunk/build/Development\"", + "\"$(SRCROOT)/../../osirix/build/Development\"", ); FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/Accelerate.framework/Versions/A/Frameworks\""; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/HipArthroplastyTemplating/Versions.txt b/HipArthroplastyTemplating/Versions.txt index 2bfb32e..fceb6f8 100644 --- a/HipArthroplastyTemplating/Versions.txt +++ b/HipArthroplastyTemplating/Versions.txt @@ -6,7 +6,7 @@ - fixed bug: if /Library/Application Support/OsiriX doesn't exist, don't try to create it 2.4.1 -- 1-click calibration also possible with non-think reference objects thanks to better flood threshold computation +- 1-click calibration also possible with non-thick reference objects thanks to better flood threshold computation 2.4 - Added Medacta miniMAX stems diff --git a/KeyObjectSelection/KeyObjectSelection.xcodeproj/project.pbxproj b/KeyObjectSelection/KeyObjectSelection.xcodeproj/project.pbxproj index 0b4f3d2..b184b6b 100644 --- a/KeyObjectSelection/KeyObjectSelection.xcodeproj/project.pbxproj +++ b/KeyObjectSelection/KeyObjectSelection.xcodeproj/project.pbxproj @@ -40,7 +40,7 @@ 089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 32DBCF630370AF2F00C91783 /* KeyObjectSelection_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KeyObjectSelection_Prefix.pch; path = Sources/KeyObjectSelection_Prefix.pch; sourceTree = ""; }; - 7116D7391574A91300FA293A /* OsiriX.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OsiriX.framework; path = "../../osirix-trunk/build/Development/OsiriX.framework"; sourceTree = ""; }; + 7116D7391574A91300FA293A /* OsiriX.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OsiriX.framework; path = ../../osirix/build/Development/OsiriX.framework; sourceTree = ""; }; 7116D74515751B9A00FA293A /* KeyObjectSelectionPrefs.prefPane */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KeyObjectSelectionPrefs.prefPane; sourceTree = BUILT_PRODUCTS_DIR; }; 7116D74715751B9A00FA293A /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 7116D74915751B9A00FA293A /* PreferencePanes.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PreferencePanes.framework; path = System/Library/Frameworks/PreferencePanes.framework; sourceTree = SDKROOT; }; @@ -53,7 +53,7 @@ 7116D76615751C5800FA293A /* KeyObjectSelectionPrefs.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = KeyObjectSelectionPrefs.xib; path = Resources/KeyObjectSelectionPrefs.xib; sourceTree = ""; }; 71E2C42E1576657800EB8B95 /* NSUserDefaults+KOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSUserDefaults+KOS.h"; path = "Sources/NSUserDefaults+KOS.h"; sourceTree = ""; }; 71E2C42F1576657800EB8B95 /* NSUserDefaults+KOS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSUserDefaults+KOS.m"; path = "Sources/NSUserDefaults+KOS.m"; sourceTree = ""; }; - 8420023112E829A200E1E9CE /* OsiriXAPI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OsiriXAPI.framework; path = "../../osirix-trunk/build/Development/OsiriXAPI.framework"; sourceTree = ""; }; + 8420023112E829A200E1E9CE /* OsiriXAPI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OsiriXAPI.framework; path = ../../osirix/build/Development/OsiriXAPI.framework; sourceTree = ""; }; 8D5B49B7048680CD000E48DA /* Plugin-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Plugin-Info.plist"; path = "Resources/Plugin-Info.plist"; sourceTree = ""; }; AB5D36050680E57E00F4007A /* KeyObjectSelection.osirixplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KeyObjectSelection.osirixplugin; sourceTree = BUILT_PRODUCTS_DIR; }; ABA48A640680BB600089EB4F /* KeyObjectSelectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = KeyObjectSelectionFilter.h; path = Sources/KeyObjectSelectionFilter.h; sourceTree = ""; }; @@ -412,7 +412,7 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", - "\"../../osirix-trunk/build/Development\"", + "\"../../osirix/build/Development\"", ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_TRIGRAPHS = NO; @@ -434,7 +434,7 @@ OTHER_REZFLAGS = ""; PRODUCT_NAME = KeyObjectSelection; SECTORDER_FLAGS = ""; - USER_HEADER_SEARCH_PATHS = "\"../../osirix-trunk/build/Development/OsiriXAPI.framework/Versions/A/Headers\""; + USER_HEADER_SEARCH_PATHS = "\"../../osirix/build/Development/OsiriXAPI.framework/Versions/A/Headers\""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", @@ -452,7 +452,7 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", - "\"../../osirix-trunk/build/Development\"", + "\"../../osirix/build/Development\"", ); GCC_ENABLE_TRIGRAPHS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -471,7 +471,7 @@ OTHER_REZFLAGS = ""; PRODUCT_NAME = KeyObjectSelection; SECTORDER_FLAGS = ""; - USER_HEADER_SEARCH_PATHS = "\"../../osirix-trunk/build/Development/OsiriXAPI.framework/Versions/A/Headers\""; + USER_HEADER_SEARCH_PATHS = "\"../../osirix/build/Development/OsiriXAPI.framework/Versions/A/Headers\""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", diff --git a/KeyObjectSelection/Resources/Plugin-Info.plist b/KeyObjectSelection/Resources/Plugin-Info.plist index 7086e6a..f007f1b 100644 --- a/KeyObjectSelection/Resources/Plugin-Info.plist +++ b/KeyObjectSelection/Resources/Plugin-Info.plist @@ -15,7 +15,7 @@ CFBundleSignature ???? CFBundleShortVersionString - 1.0.2 + 1.0.3 NSPrincipalClass KeyObjectSelectionFilter diff --git a/KeyObjectSelection/Sources/KeyObjectSelectionFilter.mm b/KeyObjectSelection/Sources/KeyObjectSelectionFilter.mm index 45c17ce..f0e5b46 100644 --- a/KeyObjectSelection/Sources/KeyObjectSelectionFilter.mm +++ b/KeyObjectSelection/Sources/KeyObjectSelectionFilter.mm @@ -656,11 +656,11 @@ -(void)_ViewerController_setKeyImage:(id)sender { // import the file into our DB DicomDatabase* database = [DicomDatabase databaseForContext:study.managedObjectContext]; - NSArray* images = [database addFilesAtPaths:[NSArray arrayWithObject:path] - postNotifications:YES - dicomOnly:YES - rereadExistingItems:YES - generatedByOsiriX:YES]; + NSArray* imageIDs = [database addFilesAtPaths:[NSArray arrayWithObject:path] + postNotifications:YES + dicomOnly:YES + rereadExistingItems:YES + generatedByOsiriX:YES]; // upload the new file to the DICOM node if ([NSUserDefaults.standardUserDefaults boolForKey:KOSSynchronizeKey]) // plugin is active @@ -687,8 +687,8 @@ -(void)_ViewerController_setKeyImage:(id)sender { }]; // set the new images as key images - for (DicomImage* image in images) - [image setIsKeyImage:[NSNumber numberWithBool:YES]]; + for (DicomImage* imageID in imageIDs) + [[database objectWithID:imageID] setIsKeyImage:[NSNumber numberWithBool:YES]]; } else [self _ViewerController_setKeyImage:sender]; diff --git a/Reporter/Reporter.xcodeproj/project.pbxproj b/Reporter/Reporter.xcodeproj/project.pbxproj index 2b552d9..2ed66cc 100644 --- a/Reporter/Reporter.xcodeproj/project.pbxproj +++ b/Reporter/Reporter.xcodeproj/project.pbxproj @@ -13,8 +13,6 @@ 717FD97716C4E69900CE8222 /* ReporterPrefsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 717FD97616C4E69900CE8222 /* ReporterPrefsController.m */; }; 717FD97916C4E71200CE8222 /* PreferencePanes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 717FD97816C4E71200CE8222 /* PreferencePanes.framework */; }; 717FD97A16C4EA4800CE8222 /* ReporterPrefs.prefPane in Resources */ = {isa = PBXBuildFile; fileRef = 717FD95F16C4E06B00CE8222 /* ReporterPrefs.prefPane */; }; - 71CD3888151B7657008B5E86 /* KBPopUpToolbarItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 71CD3886151B7657008B5E86 /* KBPopUpToolbarItem.h */; }; - 71CD3889151B7657008B5E86 /* KBPopUpToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 71CD3887151B7657008B5E86 /* KBPopUpToolbarItem.m */; }; 71FD07B8151B5FA5001DA7FE /* Reporter.png in Resources */ = {isa = PBXBuildFile; fileRef = 71FD07B7151B5FA5001DA7FE /* Reporter.png */; }; 8420023212E829A200E1E9CE /* OsiriXAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8420023112E829A200E1E9CE /* OsiriXAPI.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 8D5B49AE048680CD000E48DA /* Reporter_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 32DBCF630370AF2F00C91783 /* Reporter_Prefix.pch */; }; @@ -49,10 +47,8 @@ 717FD97516C4E69900CE8222 /* ReporterPrefsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ReporterPrefsController.h; path = Sources/ReporterPrefsController.h; sourceTree = SOURCE_ROOT; }; 717FD97616C4E69900CE8222 /* ReporterPrefsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ReporterPrefsController.m; path = Sources/ReporterPrefsController.m; sourceTree = SOURCE_ROOT; }; 717FD97816C4E71200CE8222 /* PreferencePanes.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PreferencePanes.framework; path = ../../../../../../System/Library/Frameworks/PreferencePanes.framework; sourceTree = ""; }; - 71CD3886151B7657008B5E86 /* KBPopUpToolbarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KBPopUpToolbarItem.h; path = Sources/KBPopUpToolbarItem.h; sourceTree = ""; }; - 71CD3887151B7657008B5E86 /* KBPopUpToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = KBPopUpToolbarItem.m; path = Sources/KBPopUpToolbarItem.m; sourceTree = ""; }; 71FD07B7151B5FA5001DA7FE /* Reporter.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Reporter.png; path = Resources/Reporter.png; sourceTree = ""; }; - 8420023112E829A200E1E9CE /* OsiriXAPI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OsiriXAPI.framework; path = "../../osirix-trunk/build/Development/OsiriXAPI.framework"; sourceTree = ""; }; + 8420023112E829A200E1E9CE /* OsiriXAPI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OsiriXAPI.framework; path = ../../osirix/build/Development/OsiriXAPI.framework; sourceTree = ""; }; 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Resources/Info.plist; sourceTree = ""; }; AB5D36050680E57E00F4007A /* Reporter.osirixplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Reporter.osirixplugin; sourceTree = BUILT_PRODUCTS_DIR; }; ABA48A640680BB600089EB4F /* ReporterFilter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ReporterFilter.h; path = Sources/ReporterFilter.h; sourceTree = ""; }; @@ -154,8 +150,6 @@ isa = PBXGroup; children = ( 32DBCF630370AF2F00C91783 /* Reporter_Prefix.pch */, - 71CD3886151B7657008B5E86 /* KBPopUpToolbarItem.h */, - 71CD3887151B7657008B5E86 /* KBPopUpToolbarItem.m */, ); name = "Other Sources"; sourceTree = ""; @@ -200,7 +194,6 @@ files = ( 8D5B49AE048680CD000E48DA /* Reporter_Prefix.pch in Headers */, ABA48A650680BB600089EB4F /* ReporterFilter.h in Headers */, - 71CD3888151B7657008B5E86 /* KBPopUpToolbarItem.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -319,7 +312,6 @@ files = ( ABA48A670680BB690089EB4F /* ReporterFilter.mm in Sources */, 7170F8F6151A010100DC48DF /* Reporter.applescript in Sources */, - 71CD3889151B7657008B5E86 /* KBPopUpToolbarItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -411,11 +403,6 @@ buildSettings = { COPY_PHASE_STRIP = NO; DEBUGGING_SYMBOLS = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "../../osirix-trunk/build/Development/", - ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_TRIGRAPHS = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; @@ -452,11 +439,6 @@ isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "../../osirix-trunk/build/Development/", - ); GCC_ENABLE_TRIGRAPHS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Sources/Reporter_Prefix.pch; @@ -490,6 +472,7 @@ isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + FRAMEWORK_SEARCH_PATHS = ../../osirix/build/Development/; MACOSX_DEPLOYMENT_TARGET = 10.7; SDKROOT = macosx10.7; }; @@ -499,6 +482,7 @@ isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + FRAMEWORK_SEARCH_PATHS = ../../osirix/build/Development/; MACOSX_DEPLOYMENT_TARGET = 10.7; SDKROOT = macosx10.7; }; @@ -514,6 +498,7 @@ 717FD97016C4E06B00CE8222 /* Deployment */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Development; }; CE6A9A9008AC841300D0C1EE /* Build configuration list for PBXNativeTarget "Reporter" */ = { isa = XCConfigurationList; diff --git a/Reporter/Resources/Info.plist b/Reporter/Resources/Info.plist index 50ba9bd..67b5a60 100644 --- a/Reporter/Resources/Info.plist +++ b/Reporter/Resources/Info.plist @@ -15,7 +15,7 @@ CFBundleSignature ???? CFBundleShortVersionString - 1.1.0 + 1.2.0 NSPrincipalClass ReporterFilter MenuTitles diff --git a/Reporter/Resources/Reporter.applescript b/Reporter/Resources/Reporter.applescript index bf26292..50f1cc6 100644 --- a/Reporter/Resources/Reporter.applescript +++ b/Reporter/Resources/Reporter.applescript @@ -25,76 +25,95 @@ on run argv -- insert the image as a text box in a paragraph with style Caption tell front document - -- make sure the Caption style exists -- yes, in english... - try - set sc to paragraph style "Caption" - -- the Caption style often has 0 spacing when unused… fix this, or our insertions will be confusing - if space before of sc is 0 and space after of sc is 0 then - set space before of sc to 5 - set space after of sc to 5 - end if - on error errmsg number errnbr - make new paragraph style with properties {name:"Caption", alignment:center, space before:5, space after:5, keep lines together:true, keep with next paragraph:false, font name:"Helvetica", font size:11, italic:true} - end try - - (* - -- is there already a text box with the current uid for name? - set tb to 0 - if replaceFlag is equal to 1 then - repeat with itb in text boxes - if name of itb as Unicode text is equal to uid as Unicode text then - set tb to itb - exit repeat - end if - end repeat - end if - - if tb is not equal to 0 then - set image data of tb to imageFilePath - else - *) - - -- append a new paragraph that will represent image's caption - set p to make new paragraph at after last paragraph - set text of p to (text of p & caption as Unicode text) -- TODO: it would be great to insert a shift-newline: (text of p & shift-newline & caption as Unicode text) - returns are captured as "next paragraph", we just want a newline - -- insert a text box to include the image. this is the only way Pages.app officially allows us to insert images - make new text box at after p with properties {fill type:plain image, image data:imageFilePath, stroke type:none, extra space:1, placement:moving, name:uid, width:iwidth, height:iheight} - -- apply some styling to the newly created text box (the image) and paragraph - set paragraph style of last paragraph to paragraph style "Caption" + -- is there a replaceable image? + set replaceIndex to 0 + set counter to 0 + repeat with theImage in images + set counter to counter + 1 + if replaceable of theImage is true then + set replaceIndex to counter + exit repeat + end if + end repeat - -- set the text box to take the whole width of teh page, or the caption will show at its right - set width of last text box to "100%" - set nwidth to width of last text box - -- if the image width won't fit, adapt the height - if nwidth < iwidth then - set height of last text box to iheight / iwidth * nwidth - end if - - -- if the image is very vertical, it'll cover an entire page.. leave at least the space for the caption - set nheight to height of last text box - set mheight to height of containing page of last text box - top margin - bottom margin - 0.035277778*2 -- 2 points --- display dialog the "ssfsf " & nheight & " " & mheight - if nheight > mheight then - set pc to page count - repeat while (page count) is equal to pc - set height of last text box to height of last text box - 0.2 - end repeat - --set height of last text box to mheight - end if - - -- if the image is much smaller than the page width, force the caption text to be centered - --if nwidth - iwidth > nwidth / 3 then - set alignment of last paragraph to center -- TODO: do we want to modify the Caption style instead? - --end if + if replaceIndex is not 0 then -- there is a replaceable image object, replace it + + set image data of image replaceIndex to imageFilePath + set replaceable of image replaceIndex to false + + else -- there are no replaceable image objects + + -- make sure the Caption style exists -- yes, in english... + try + set sc to paragraph style "Caption" + -- the Caption style often has 0 spacing when unused… fix this, or our insertions will be confusing + if space before of sc is 0 and space after of sc is 0 then + set space before of sc to 5 + set space after of sc to 5 + end if + on error errmsg number errnbr + make new paragraph style with properties {name:"Caption", alignment:center, space before:5, space after:5, keep lines together:true, keep with next paragraph:false, font name:"Helvetica", font size:11, italic:true} + end try + + (* + -- is there already a text box with the current uid for name? + set tb to 0 + if replaceFlag is equal to 1 then + repeat with itb in text boxes + if name of itb as Unicode text is equal to uid as Unicode text then + set tb to itb + exit repeat + end if + end repeat + end if + + if tb is not equal to 0 then + set image data of tb to imageFilePath + else + *) + + -- append a new paragraph that will represent image's caption + set p to make new paragraph at after last paragraph + set text of p to (text of p & caption as Unicode text) -- TODO: it would be great to insert a shift-newline: (text of p & shift-newline & caption as Unicode text) - returns are captured as "next paragraph", we just want a newline + -- insert a text box to include the image. this is the only way Pages.app officially allows us to insert images + make new text box at after p with properties {fill type:plain image, image data:imageFilePath, stroke type:none, extra space:1, placement:moving, name:uid, width:iwidth, height:iheight} + -- apply some styling to the newly created text box (the image) and paragraph + set paragraph style of last paragraph to paragraph style "Caption" + + -- set the text box to take the whole width of teh page, or the caption will show at its right + set width of last text box to "100%" + set nwidth to width of last text box + -- if the image width won't fit, adapt the height + if nwidth < iwidth then + set height of last text box to iheight / iwidth * nwidth + end if + + -- if the image is very vertical, it'll cover an entire page.. leave at least the space for the caption + set nheight to height of last text box + set mheight to height of containing page of last text box - top margin - bottom margin - 0.035277778*2 -- 2 points + -- display dialog the "ssfsf " & nheight & " " & mheight + if nheight > mheight then + set pc to page count + repeat while (page count) is equal to pc + set height of last text box to height of last text box - 0.2 + end repeat + --set height of last text box to mheight + end if + + -- if the image is much smaller than the page width, force the caption text to be centered + --if nwidth - iwidth > nwidth / 3 then + set alignment of last paragraph to center -- TODO: do we want to modify the Caption style instead? + --end if - -- because of a bug in Pages, we need to re-enter the text box height, or the text box size won't be properly saved - set nheight to height of last text box - set height of last text box to 1 - set height of last text box to nheight - - (* - end if - *) + -- because of a bug in Pages, we need to re-enter the text box height, or the text box size won't be properly saved + set nheight to height of last text box + set height of last text box to 1 + set height of last text box to nheight + + (* + end if + *) + end if end tell end tell end run \ No newline at end of file diff --git a/Reporter/Sources/KBPopUpToolbarItem.h b/Reporter/Sources/KBPopUpToolbarItem.h deleted file mode 100644 index 9d4d733..0000000 --- a/Reporter/Sources/KBPopUpToolbarItem.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// KBPopUpToolbarItem.h -// -------------------- -// -// Created by Keith Blount on 14/05/2006. -// Copyright 2006 Keith Blount. All rights reserved. -// -// Provides a toolbar item that performs its given action if clicked, or displays a pop-up menu -// (if it has one) if held down for over half a second. -// - -#import -@class KBDelayedPopUpButton; - - -@interface ReporterKBPopUpToolbarItem : NSToolbarItem -{ - KBDelayedPopUpButton *button; - NSImage *smallImage; - NSImage *regularImage; -} -- (void)setMenu:(NSMenu *)menu; -- (NSMenu *)menu; -@end diff --git a/Reporter/Sources/KBPopUpToolbarItem.m b/Reporter/Sources/KBPopUpToolbarItem.m deleted file mode 100644 index 46817bf..0000000 --- a/Reporter/Sources/KBPopUpToolbarItem.m +++ /dev/null @@ -1,283 +0,0 @@ -// -// KBPopUpToolbarItem.m -// -------------------- -// -// Created by Keith Blount on 14/05/2006. -// Copyright 2006 Keith Blount. All rights reserved. -// - -#import "KBPopUpToolbarItem.h" - -@interface KBDelayedPopUpButtonCell : NSButtonCell -@end - -@implementation KBDelayedPopUpButtonCell - -- (NSPoint)menuPositionForFrame:(NSRect)cellFrame inView:(NSView *)controlView -{ - NSPoint result = [controlView convertPoint:cellFrame.origin toView:nil]; - result.x += 1.0; - result.y -= cellFrame.size.height + 5.5; - return result; -} - -- (void)showMenuForEvent:(NSEvent *)theEvent controlView:(NSView *)controlView cellFrame:(NSRect)cellFrame -{ - NSPoint menuPosition = [self menuPositionForFrame:cellFrame inView:controlView]; - - // Create event for pop up menu with adjusted mouse position - NSEvent *menuEvent = [NSEvent mouseEventWithType:[theEvent type] - location:menuPosition - modifierFlags:[theEvent modifierFlags] - timestamp:[theEvent timestamp] - windowNumber:[theEvent windowNumber] - context:[theEvent context] - eventNumber:[theEvent eventNumber] - clickCount:[theEvent clickCount] - pressure:[theEvent pressure]]; - - [NSMenu popUpContextMenu:[self menu] withEvent:menuEvent forView:controlView]; -} - -- (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(NSView *)controlView untilMouseUp:(BOOL)untilMouseUp -{ - - BOOL result = NO; - NSDate *endDate; - NSPoint currentPoint = [theEvent locationInWindow]; - BOOL done = NO; - BOOL trackContinously = [self startTrackingAt:currentPoint inView:controlView]; - - // Catch next mouse-dragged or mouse-up event until timeout - BOOL mouseIsUp = NO; - NSEvent *event; - while (!done) - { - NSPoint lastPoint = currentPoint; - - // Set up timer for pop-up menu if we have one - if ([self menu]) - endDate = [NSDate dateWithTimeIntervalSinceNow:0.5]; - else - endDate = [NSDate distantFuture]; - - event = [NSApp nextEventMatchingMask:(NSLeftMouseUpMask|NSLeftMouseDraggedMask) - untilDate:endDate - inMode:NSEventTrackingRunLoopMode - dequeue:YES]; - - if (event) // Mouse event - { - currentPoint = [event locationInWindow]; - - // Send continueTracking.../stopTracking... - if (trackContinously) - { - if (![self continueTracking:lastPoint at:currentPoint inView:controlView]) - { - done = YES; - [self stopTracking:lastPoint at:currentPoint inView:controlView mouseIsUp:mouseIsUp]; - } - if ([self isContinuous]) - { - [NSApp sendAction:[self action] to:[self target] from:controlView]; - } - } - - mouseIsUp = ([event type] == NSLeftMouseUp); - done = done || mouseIsUp; - - if (untilMouseUp) - { - result = mouseIsUp; - } - else - { - // Check if the mouse left our cell rect - result = NSPointInRect([controlView convertPoint:currentPoint fromView:nil], cellFrame); - if (!result) - done = YES; - } - - if (done && result && ![self isContinuous]) - [NSApp sendAction:[self action] to:[self target] from:controlView]; - - } - else // Show menu - { - done = YES; - result = YES; - [self showMenuForEvent:theEvent controlView:controlView cellFrame:cellFrame]; - } - } - return result; -} - -@end - -@interface KBDelayedPopUpButton : NSButton -@end - -@implementation KBDelayedPopUpButton - -- (id)initWithFrame:(NSRect)frameRect -{ - if (self = [super initWithFrame:frameRect]) - { - if (![[self cell] isKindOfClass:[KBDelayedPopUpButtonCell class]]) - { - NSString *title = [self title]; - if (title == nil) title = @""; - [self setCell:[[[KBDelayedPopUpButtonCell alloc] initTextCell:title] autorelease]]; - [[self cell] setControlSize:NSRegularControlSize]; - } - } - return self; -} - -@end - - -@implementation ReporterKBPopUpToolbarItem - -- (id)initWithItemIdentifier:(NSString *)ident -{ - if (self = [super initWithItemIdentifier:ident]) - { - button = [[KBDelayedPopUpButton alloc] initWithFrame:NSMakeRect(0,0,32,32)]; - [button setButtonType:NSMomentaryChangeButton]; - [button setBordered:NO]; - [self setView:button]; - [self setMinSize:NSMakeSize(32,32)]; - [self setMaxSize:NSMakeSize(32,32)]; - } - return self; -} - -// Note that we make no assumptions about the retain/release of the toolbar item's view, just to be sure - -// we therefore retain our button view until we are dealloc'd. -- (void)dealloc -{ - [button release]; - [regularImage release]; - [smallImage release]; - [super dealloc]; -} - -- (KBDelayedPopUpButtonCell *)popupCell -{ - return [(KBDelayedPopUpButton *)[self view] cell]; -} - -- (void)setMenu:(NSMenu *)menu -{ - [[self popupCell] setMenu:menu]; - - // Also set menu form representation - this is used in the toolbar overflow menu but also, more importantly, to display - // a menu in text-only mode. - NSMenuItem *menuFormRep = [[NSMenuItem alloc] initWithTitle:[self label] action:nil keyEquivalent:@""]; - [menuFormRep setSubmenu:menu]; - [self setMenuFormRepresentation:menuFormRep]; - [menuFormRep release]; -} - -- (NSMenu *)menu -{ - return [[self popupCell] menu]; -} - -- (void)setAction:(SEL)aSelector -{ - [[self popupCell] setAction:aSelector]; -} - -- (SEL)action -{ - return [[self popupCell] action]; -} - -- (void)setTarget:(id)anObject -{ - [[self popupCell] setTarget:anObject]; -} - -- (id)target -{ - return [[self popupCell] target]; -} - -- (void)setImage:(NSImage *)anImage -{ - [regularImage autorelease]; - [smallImage autorelease]; - - regularImage = [anImage retain]; - smallImage = [anImage copy]; - [smallImage setScalesWhenResized:YES]; - [smallImage setSize:NSMakeSize(24,24)]; - - if ([[self toolbar] sizeMode] == NSToolbarSizeModeSmall) anImage = smallImage; - - [[self popupCell] setImage:anImage]; -} - -- (NSImage *)image -{ - return [[self popupCell] image]; -} - -- (void)setToolTip:(NSString *)theToolTip -{ - [[self view] setToolTip:theToolTip]; -} - -- (NSString *)toolTip -{ - return [[self view] toolTip]; -} - -- (void)validate -{ - // First, make sure the toolbar image size fits the toolbar size mode; there must be a better place to do this! - NSToolbarSizeMode sizeMode = [[self toolbar] sizeMode]; - float imgWidth = [[self image] size].width; - - if (sizeMode == NSToolbarSizeModeSmall && imgWidth != 24) - { - [[self popupCell] setImage:smallImage]; - } - else if (sizeMode == NSToolbarSizeModeRegular && imgWidth == 24) - { - [[self popupCell] setImage:regularImage]; - } - - if ([self action]) - { - if (![self target]) - [self setEnabled:[[[[self view] window] firstResponder] respondsToSelector:[self action]]]; - - else { - if ([[self target] respondsToSelector:@selector(validateToolbarItem:)]) - [self setEnabled:[[self target] validateToolbarItem:self]]; - else - [self setEnabled:[[self target] respondsToSelector:[self action]]]; - } - } - else - if ([[self toolbar] delegate]) - { - BOOL enabled = YES; - - if ([[[self toolbar] delegate] respondsToSelector:@selector(validateToolbarItem:)]) - enabled = [(id)[[self toolbar] delegate] validateToolbarItem:self]; - - else if ([[[self toolbar] delegate] respondsToSelector:@selector(validateUserInterfaceItem:)]) - enabled = [(id)[[self toolbar] delegate] validateUserInterfaceItem:self]; - - [self setEnabled:enabled]; - } - else - [super validate]; -} - -@end diff --git a/Reporter/html/Reporter.osirixplugin.zip b/Reporter/html/Reporter.osirixplugin.zip index 50d37b1..9161e43 100644 Binary files a/Reporter/html/Reporter.osirixplugin.zip and b/Reporter/html/Reporter.osirixplugin.zip differ diff --git a/Reporter/html/index.html b/Reporter/html/index.html index 672f6a3..0a16e39 100644 --- a/Reporter/html/index.html +++ b/Reporter/html/index.html @@ -19,6 +19,10 @@

Reporter

Hold the toolbar button to list all the available features. +
+

Version History

+
+ Versions 1.2 inserts images in existing replaceable image objects (available in the template) before adding them at the end of the document, the old way.
Versions 1.1 allows you to include the study date in the images' captions. diff --git a/Reporter/html/style.css b/Reporter/html/style.css index 0b546ad..8d357d8 100644 --- a/Reporter/html/style.css +++ b/Reporter/html/style.css @@ -34,6 +34,11 @@ h1 { margin-top: 40px; } +h2 { + margin-left: 20px; + margin-top: 20px; +} + .text { margin: 5px 20px 5px 20px; } diff --git a/Worklists/Resources/Info.plist b/Worklists/Resources/Info.plist index 568cc03..d43aa51 100644 --- a/Worklists/Resources/Info.plist +++ b/Worklists/Resources/Info.plist @@ -15,10 +15,14 @@ CFBundleSignature ???? CFBundleShortVersionString - 1.0.5 + 1.1.0 NSPrincipalClass WorklistsPlugin pluginType - Other + Database + MenuTitles + + Temporarily disable Worklists refresh + diff --git a/Worklists/Sources/Worklist.mm b/Worklists/Sources/Worklist.mm index 45f7d3c..8190c74 100644 --- a/Worklists/Sources/Worklist.mm +++ b/Worklists/Sources/Worklist.mm @@ -180,7 +180,7 @@ - (void)setProperties:(NSDictionary*)properties { if (ti != -1) { if (!self.refreshTimer || _refreshTimer.timeInterval != ti) - self.refreshTimer = [NSTimer scheduledTimerWithTimeInterval:ti target:[WorklistsNonretainingTimerInvoker invokerWithTarget:self selector:@selector(initiateRefresh)] selector:@selector(fire:) userInfo:nil repeats:YES]; + self.refreshTimer = [NSTimer scheduledTimerWithTimeInterval:ti target:[WorklistsNonretainingTimerInvoker invokerWithTarget:self selector:@selector(_timedInitiateRefresh:)] selector:@selector(fire:) userInfo:nil repeats:YES]; [_refreshTimer fire]; } else { self.refreshTimer = nil; @@ -541,6 +541,12 @@ - (void)_threadRefresh { } } +- (void)_timedInitiateRefresh:(NSTimer*)timer { + if ([[WorklistsPlugin instance] refreshDisabled]) + return; + [self initiateRefresh]; +} + - (void)initiateRefresh { [self performSelectorInBackground:@selector(_threadRefresh) withObject:nil]; } diff --git a/Worklists/Sources/WorklistsPlugin.h b/Worklists/Sources/WorklistsPlugin.h index d627e87..00a52df 100644 --- a/Worklists/Sources/WorklistsPlugin.h +++ b/Worklists/Sources/WorklistsPlugin.h @@ -23,10 +23,14 @@ extern NSString* const WorklistAlbumIDsDefaultsKey; NSMutableDictionary* _worklistObjs; NSMutableDictionary* _errors; NSTimer* _urlSyncTimer; + NSMenuItem* _pluginMenuItem; + BOOL _refreshDisabled; + NSTimer* _refreshReenableTimer; } @property(readonly,retain) NSArrayController* worklists; @property(readonly,retain) NSTimer* urlSyncTimer; +@property(readonly) BOOL refreshDisabled; + (WorklistsPlugin*)instance; diff --git a/Worklists/Sources/WorklistsPlugin.mm b/Worklists/Sources/WorklistsPlugin.mm index ccc4bf4..8c82ffc 100644 --- a/Worklists/Sources/WorklistsPlugin.mm +++ b/Worklists/Sources/WorklistsPlugin.mm @@ -20,6 +20,7 @@ #import #import #import +#import @interface WorklistsArrayController : NSArrayController @@ -36,6 +37,7 @@ @implementation WorklistsPlugin @synthesize worklists = _worklists; @synthesize urlSyncTimer = _urlSyncTimer; +@synthesize refreshDisabled = _refreshDisabled; static WorklistsPlugin* WorklistsPluginInstance = nil; static NSString* const Worklists = @"Worklists"; @@ -83,7 +85,9 @@ - (void)dealloc { [NSUserDefaultsController.sharedUserDefaultsController removeObserver:self]; [NSNotificationCenter.defaultCenter removeObserver:self]; + self.urlSyncTimer = nil; + [_refreshReenableTimer release]; [_cachePath release]; [_worklistObjs release]; @@ -99,43 +103,42 @@ - (void)initPlugin { [PreferencesWindowController addPluginPaneWithResourceNamed:@"WorklistsPreferences" inBundle:[NSBundle bundleForClass:[self class]] withTitle:Worklists image:image]; Method method; - IMP imp; + //IMP imp; Class BrowserControllerClass = [BrowserController class]; method = class_getInstanceMethod(BrowserControllerClass, @selector(tableView:willDisplayCell:forTableColumn:row:)); if (!method) [NSException raise:NSGenericException format:@"bad OsiriX version"]; - imp = method_getImplementation(method); - class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_tableView:willDisplayCell:forTableColumn:row:), imp, method_getTypeEncoding(method)); + class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_tableView:willDisplayCell:forTableColumn:row:), method_getImplementation(method), method_getTypeEncoding(method)); method_setImplementation(method, class_getMethodImplementation([self class], @selector(_Worklists_BrowserController_tableView:willDisplayCell:forTableColumn:row:))); method = class_getInstanceMethod(BrowserControllerClass, @selector(tableView:validateDrop:proposedRow:proposedDropOperation:)); if (!method) [NSException raise:NSGenericException format:@"bad OsiriX version"]; - imp = method_getImplementation(method); - class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_tableView:validateDrop:proposedRow:proposedDropOperation:), imp, method_getTypeEncoding(method)); + class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_tableView:validateDrop:proposedRow:proposedDropOperation:), method_getImplementation(method), method_getTypeEncoding(method)); method_setImplementation(method, class_getMethodImplementation([self class], @selector(_Worklists_BrowserController_tableView:validateDrop:proposedRow:proposedDropOperation:))); method = class_getInstanceMethod(BrowserControllerClass, @selector(tableView:toolTipForCell:rect:tableColumn:row:mouseLocation:)); if (!method) [NSException raise:NSGenericException format:@"bad OsiriX version"]; - imp = method_getImplementation(method); - class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_tableView:toolTipForCell:rect:tableColumn:row:mouseLocation:), imp, method_getTypeEncoding(method)); + class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_tableView:toolTipForCell:rect:tableColumn:row:mouseLocation:), method_getImplementation(method), method_getTypeEncoding(method)); method_setImplementation(method, class_getMethodImplementation([self class], @selector(_Worklists_BrowserController_tableView:toolTipForCell:rect:tableColumn:row:mouseLocation:))); method = class_getInstanceMethod(BrowserControllerClass, @selector(menuWillOpen:)); if (!method) [NSException raise:NSGenericException format:@"bad OsiriX version"]; - imp = method_getImplementation(method); - class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_menuWillOpen:), imp, method_getTypeEncoding(method)); + class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_menuWillOpen:), method_getImplementation(method), method_getTypeEncoding(method)); method_setImplementation(method, class_getMethodImplementation([self class], @selector(_Worklists_BrowserController_menuWillOpen:))); method = class_getInstanceMethod(BrowserControllerClass, @selector(outlineView:willDisplayCell:forTableColumn:item:)); if (!method) [NSException raise:NSGenericException format:@"bad OsiriX version"]; - imp = method_getImplementation(method); - class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_outlineView:willDisplayCell:forTableColumn:item:), imp, method_getTypeEncoding(method)); + class_addMethod(BrowserControllerClass, @selector(_Worklists_BrowserController_outlineView:willDisplayCell:forTableColumn:item:), method_getImplementation(method), method_getTypeEncoding(method)); method_setImplementation(method, class_getMethodImplementation([self class], @selector(_Worklists_BrowserController_outlineView:willDisplayCell:forTableColumn:item:))); -} - -- (long)filterImage:(NSString*)menuName { - return 0; + + Class PluginManagerClass = [PluginManager class]; + + method = class_getClassMethod(PluginManagerClass, @selector(setMenus::::)); + if (!method) [NSException raise:NSGenericException format:@"bad OsiriX version"]; + class_addMethod(object_getClass(PluginManagerClass), @selector(_Worklists_PluginManager_setMenus::::), method_getImplementation(method), method_getTypeEncoding(method)); + method_setImplementation(method, method_getImplementation(class_getClassMethod([self class], @selector(_Worklists_PluginManager_setMenus::::)))); + } - (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context { @@ -285,6 +288,38 @@ + (void)refreshAlbumsForDatabase:(DicomDatabase*)db { [BrowserController.currentBrowser refreshAlbums]; } +- (void)updateMenuItem { + [_pluginMenuItem setState:(_refreshDisabled? NSOnState : NSOffState)]; +} + +- (long)filterImage:(NSString*)menuName { + if (_refreshDisabled) { + [_refreshReenableTimer invalidate]; + _refreshReenableTimer = nil; + _refreshDisabled = NO; + [self updateMenuItem]; + } else { + NSAlert* alert = [NSAlert alertWithMessageText:NSLocalizedString(@"Worklists won't be refreshed for the next 60 minutes.", nil) defaultButton:nil alternateButton:NSLocalizedString(@"Cancel", nil) otherButton:nil informativeTextWithFormat:NSLocalizedString(@"After 60 minutes, worklists will automatically start refreshing again, but you can use this menu item to re-enable worklists when you're done.", nil)]; + [alert beginSheetModalForWindow:nil modalDelegate:self didEndSelector:@selector(_disableRefreshSheetDidEnd:returnCode:contextInfo:) contextInfo:nil]; + } + + return 0; +} + +- (void)_disableRefreshSheetDidEnd:(NSAlert*)alert returnCode:(NSInteger)returnCode contextInfo:(void*)contextInfo { + if (returnCode == NSOKButton) { + _refreshDisabled = YES; + [self updateMenuItem]; + _refreshReenableTimer = [NSTimer scheduledTimerWithTimeInterval:3600 target:[WorklistsNonretainingTimerInvoker invokerWithTarget:self selector:@selector(_timedReenableRefresh:)] selector:@selector(fire:) userInfo:nil repeats:NO]; + } +} + +- (void)_timedReenableRefresh:(NSTimer*)timer { + _refreshReenableTimer = nil; + _refreshDisabled = NO; + [self updateMenuItem]; +} + #pragma mark BrowserController - (void)_BrowserController:(BrowserController*)bc tableView:(NSTableView*)table willDisplayCell:(PrettyCell*)cell forTableColumn:(NSTableColumn*)column row:(NSInteger)row { @@ -456,6 +491,33 @@ - (void)_Worklists_BrowserController_outlineView:(NSOutlineView*)outlineView wil [WorklistsPluginInstance _BrowserController:(id)self outlineView:outlineView willDisplayCell:cell forTableColumn:column item:item]; } +- (void)_PluginManager_setMenus:(NSMenu*)filtersMenu :(NSMenu*)roisMenu :(NSMenu*)othersMenu :(NSMenu*)dbMenu { + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; + + _pluginMenuItem = nil; + + for (NSMenuItem* mi in dbMenu.itemArray) { + if (mi.representedObject) { // we recently started setting the NSMenuItem's representedObject to the plugin's NSBundle instance + if (mi.representedObject != bundle) + continue; + } else // previously, the only way to identify the menus was by their title + if (![mi.title isEqualToString:@"Temporarily disable Worklists refresh"]) + continue; + + // mi is our menu item + _pluginMenuItem = mi; + + break; // we don't have other menu items + } + + [self updateMenuItem]; +} + ++ (void)_Worklists_PluginManager_setMenus:(NSMenu*)filtersMenu :(NSMenu*)roisMenu :(NSMenu*)othersMenu :(NSMenu*)dbMenu { + [self _Worklists_PluginManager_setMenus:filtersMenu :roisMenu :othersMenu :dbMenu]; + [WorklistsPluginInstance _PluginManager_setMenus:filtersMenu :roisMenu :othersMenu :dbMenu]; +} + @end