aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Interfaces/English.lproj/BundleEditor.xib232
-rw-r--r--Source/SPBundleEditorController.h5
-rw-r--r--Source/SPBundleEditorController.m62
-rw-r--r--Source/SPConstants.h6
-rw-r--r--Source/SPConstants.m6
-rw-r--r--Source/SPCopyTable.h7
-rw-r--r--Source/SPCopyTable.m168
7 files changed, 456 insertions, 30 deletions
diff --git a/Interfaces/English.lproj/BundleEditor.xib b/Interfaces/English.lproj/BundleEditor.xib
index 03cec12d..f3606a7b 100644
--- a/Interfaces/English.lproj/BundleEditor.xib
+++ b/Interfaces/English.lproj/BundleEditor.xib
@@ -23,7 +23,6 @@
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="683"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -91,6 +90,7 @@
<int key="NSvFlags">4370</int>
<string key="NSFrameSize">{143, 421}</string>
<reference key="NSSuperview" ref="34907435"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="_NSCornerView" key="NSCornerView">
<nil key="NSNextResponder"/>
@@ -191,6 +191,7 @@
</object>
<string key="NSFrame">{{1, 1}, {143, 421}}</string>
<reference key="NSSuperview" ref="802985400"/>
+ <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="472206854"/>
<reference key="NSDocView" ref="472206854"/>
<reference key="NSBGColor" ref="255000212"/>
@@ -201,6 +202,7 @@
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{-100, -100}, {15, 102}}</string>
<reference key="NSSuperview" ref="802985400"/>
+ <reference key="NSWindow"/>
<reference key="NSTarget" ref="802985400"/>
<string key="NSAction">_doScroller:</string>
<double key="NSPercent">0.99585062265396118</double>
@@ -210,6 +212,7 @@
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{-100, -100}, {192, 15}}</string>
<reference key="NSSuperview" ref="802985400"/>
+ <reference key="NSWindow"/>
<int key="NSsFlags">1</int>
<reference key="NSTarget" ref="802985400"/>
<string key="NSAction">_doScroller:</string>
@@ -218,6 +221,7 @@
</object>
<string key="NSFrame">{{-1.5, 22.5}, {145, 423}}</string>
<reference key="NSSuperview" ref="69213598"/>
+ <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="34907435"/>
<int key="NSsFlags">530</int>
<reference key="NSVScroller" ref="769403162"/>
@@ -235,6 +239,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{-1, -1}, {32, 25}}</string>
<reference key="NSSuperview" ref="78837987"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="846292214">
<int key="NSCellFlags">67239424</int>
@@ -263,6 +268,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{30, -1}, {32, 25}}</string>
<reference key="NSSuperview" ref="78837987"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="653176607">
<int key="NSCellFlags">67239424</int>
@@ -287,6 +293,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{61, -1}, {32, 24}}</string>
<reference key="NSSuperview" ref="78837987"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="BWAnchoredPopUpButtonCell" key="NSCell" id="998795499">
<int key="NSCellFlags">71433792</int>
@@ -392,6 +399,7 @@
</object>
<string key="NSFrameSize">{142, 23}</string>
<reference key="NSSuperview" ref="69213598"/>
+ <reference key="NSWindow"/>
<bool key="BWABBIsResizable">YES</bool>
<bool key="BWABBIsAtBottom">YES</bool>
<bool key="BWABBHandleIsRightAligned">NO</bool>
@@ -400,6 +408,7 @@
</object>
<string key="NSFrameSize">{142, 444}</string>
<reference key="NSSuperview" ref="358491109"/>
+ <reference key="NSWindow"/>
<string key="NSClassName">NSView</string>
</object>
<object class="BWCustomView" id="338542681">
@@ -412,6 +421,7 @@
<int key="NSvFlags">288</int>
<string key="NSFrame">{{17, 16}, {167, 22}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="1019011390">
<int key="NSCellFlags">-2076049856</int>
@@ -445,6 +455,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 280}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="494412820">
<int key="NSCellFlags">68288064</int>
@@ -466,6 +477,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{236, 332}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="312288989">
<int key="NSCellFlags">68288064</int>
@@ -482,6 +494,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 332}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="201087110">
<int key="NSCellFlags">68288064</int>
@@ -531,6 +544,7 @@
</object>
<string key="NSFrameSize">{504, 110}</string>
<reference key="NSSuperview" ref="593193785"/>
+ <reference key="NSWindow"/>
<object class="NSTextContainer" key="NSTextContainer" id="1024719458">
<object class="NSLayoutManager" key="NSLayoutManager">
<object class="NSTextStorage" key="NSTextStorage">
@@ -613,6 +627,7 @@
</object>
<string key="NSFrame">{{1, 1}, {504, 133}}</string>
<reference key="NSSuperview" ref="737548631"/>
+ <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="367533279"/>
<reference key="NSDocView" ref="367533279"/>
<reference key="NSBGColor" ref="856229010"/>
@@ -627,6 +642,7 @@
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{490, 1}, {15, 140}}</string>
<reference key="NSSuperview" ref="737548631"/>
+ <reference key="NSWindow"/>
<reference key="NSTarget" ref="737548631"/>
<string key="NSAction">_doScroller:</string>
<double key="NSCurValue">1</double>
@@ -637,6 +653,7 @@
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{-100, -100}, {87, 18}}</string>
<reference key="NSSuperview" ref="737548631"/>
+ <reference key="NSWindow"/>
<int key="NSsFlags">1</int>
<reference key="NSTarget" ref="737548631"/>
<string key="NSAction">_doScroller:</string>
@@ -646,6 +663,7 @@
</object>
<string key="NSFrame">{{20, 140}, {506, 135}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="593193785"/>
<int key="NSsFlags">530</int>
<reference key="NSVScroller" ref="245045448"/>
@@ -655,8 +673,9 @@
<object class="NSTextField" id="978939688">
<reference key="NSNextResponder" ref="338542681"/>
<int key="NSvFlags">268</int>
- <string key="NSFrame">{{239, 308}, {161, 19}}</string>
+ <string key="NSFrame">{{239, 309}, {161, 19}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="59154256">
<int key="NSCellFlags">-1804468671</int>
@@ -682,8 +701,9 @@
<object class="NSTextField" id="145924516">
<reference key="NSNextResponder" ref="338542681"/>
<int key="NSvFlags">268</int>
- <string key="NSFrame">{{20, 308}, {161, 19}}</string>
+ <string key="NSFrame">{{20, 309}, {161, 19}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="552732389">
<int key="NSCellFlags">-1804468671</int>
@@ -701,6 +721,7 @@
<int key="NSvFlags">265</int>
<string key="NSFrame">{{440, 394}, {86, 17}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="315187981">
<int key="NSCellFlags">67239424</int>
@@ -721,6 +742,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{236, 330}, {292, 18}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="702004127">
<int key="NSCellFlags">-2080244224</int>
@@ -781,6 +803,7 @@
</object>
<string key="NSFrameSize">{138, 69}</string>
<reference key="NSSuperview" ref="971406968"/>
+ <reference key="NSWindow"/>
<object class="NSTextContainer" key="NSTextContainer" id="1001899575">
<object class="NSLayoutManager" key="NSLayoutManager">
<object class="NSTextStorage" key="NSTextStorage">
@@ -843,6 +866,7 @@
</object>
<string key="NSFrame">{{1, 1}, {504, 187}}</string>
<reference key="NSSuperview" ref="179792134"/>
+ <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="965862131"/>
<reference key="NSDocView" ref="965862131"/>
<reference key="NSBGColor" ref="856229010"/>
@@ -854,6 +878,7 @@
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{454, 1}, {15, 190}}</string>
<reference key="NSSuperview" ref="179792134"/>
+ <reference key="NSWindow"/>
<reference key="NSTarget" ref="179792134"/>
<string key="NSAction">_doScroller:</string>
<double key="NSCurValue">1</double>
@@ -864,6 +889,7 @@
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{-100, -100}, {87, 18}}</string>
<reference key="NSSuperview" ref="179792134"/>
+ <reference key="NSWindow"/>
<int key="NSsFlags">1</int>
<reference key="NSTarget" ref="179792134"/>
<string key="NSAction">_doScroller:</string>
@@ -873,6 +899,7 @@
</object>
<string key="NSFrame">{{20, 140}, {506, 189}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="971406968"/>
<int key="NSsFlags">562</int>
<reference key="NSVScroller" ref="414961522"/>
@@ -884,6 +911,7 @@
<int key="NSvFlags">289</int>
<string key="NSFrame">{{435, 13}, {96, 28}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<int key="NSTag">1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="1051503991">
@@ -905,6 +933,7 @@
<int key="NSvFlags">289</int>
<string key="NSFrame">{{309, 13}, {96, 28}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="697434956">
<int key="NSCellFlags">67239424</int>
@@ -925,6 +954,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{20, 55}, {161, 22}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="SRRecorderCell" key="NSCell" id="670400760">
<int key="NSCellFlags">67239424</int>
@@ -942,11 +972,46 @@
<integer value="1" key="style"/>
</object>
</object>
+ <object class="NSPopUpButton" id="710770414">
+ <reference key="NSNextResponder" ref="338542681"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{236, 356}, {167, 22}}</string>
+ <reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSPopUpButtonCell" key="NSCell" id="68459104">
+ <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags2">133120</int>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="710770414"/>
+ <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ <nil key="NSMenuItem"/>
+ <bool key="NSMenuItemRespectAlignment">YES</bool>
+ <object class="NSMenu" key="NSMenu" id="979150328">
+ <string key="NSTitle">OtherViews</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="NSMenuFont" ref="604392898"/>
+ </object>
+ <int key="NSSelectedIndex">-1</int>
+ <int key="NSPreferredEdge">1</int>
+ <bool key="NSUsesItemFromMenu">YES</bool>
+ <bool key="NSAltersState">YES</bool>
+ <int key="NSArrowPosition">2</int>
+ </object>
+ </object>
<object class="NSPopUpButton" id="1013555552">
<reference key="NSNextResponder" ref="338542681"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{236, 356}, {167, 22}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="4363123">
<int key="NSCellFlags">-2076049856</int>
@@ -980,6 +1045,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{17, 96}, {167, 22}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="299353121">
<int key="NSCellFlags">-2076049856</int>
@@ -1013,6 +1079,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{236, 391}, {167, 22}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="886363818">
<int key="NSCellFlags">-2076049856</int>
@@ -1046,6 +1113,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 356}, {167, 22}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="131002945">
<int key="NSCellFlags">-2076049856</int>
@@ -1079,6 +1147,7 @@
<int key="NSvFlags">265</int>
<string key="NSFrame">{{504, 354}, {25, 25}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="1021110085">
<int key="NSCellFlags">67239424</int>
@@ -1094,11 +1163,29 @@
<int key="NSPeriodicInterval">25</int>
</object>
</object>
+ <object class="NSTextField" id="703222741">
+ <reference key="NSNextResponder" ref="338542681"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{186, 360}, {48, 14}}</string>
+ <reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="116371218">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">138544128</int>
+ <string key="NSContents">and</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="703222741"/>
+ <reference key="NSBackgroundColor" ref="90467341"/>
+ <reference key="NSTextColor" ref="576381864"/>
+ </object>
+ </object>
<object class="NSTextField" id="411989314">
<reference key="NSNextResponder" ref="338542681"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{186, 360}, {48, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="679867674">
<int key="NSCellFlags">68288064</int>
@@ -1115,6 +1202,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{239, 98}, {161, 19}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="748268806">
<int key="NSCellFlags">-1804468671</int>
@@ -1133,6 +1221,7 @@
<int key="NSvFlags">288</int>
<string key="NSFrame">{{17, 78}, {95, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="38136759">
<int key="NSCellFlags">68288064</int>
@@ -1149,6 +1238,7 @@
<int key="NSvFlags">288</int>
<string key="NSFrame">{{17, 38}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="75217064">
<int key="NSCellFlags">68288064</int>
@@ -1165,6 +1255,7 @@
<int key="NSvFlags">288</int>
<string key="NSFrame">{{17, 118}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="849546250">
<int key="NSCellFlags">68288064</int>
@@ -1181,6 +1272,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{236, 118}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="622343774">
<int key="NSCellFlags">68288064</int>
@@ -1197,6 +1289,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{236, 414}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="44795332">
<int key="NSCellFlags">68288064</int>
@@ -1213,6 +1306,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 332}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="553916693">
<int key="NSCellFlags">68288064</int>
@@ -1229,6 +1323,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 379}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="370999655">
<int key="NSCellFlags">68288064</int>
@@ -1245,6 +1340,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{236, 78}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="627233937">
<int key="NSCellFlags">68288064</int>
@@ -1261,6 +1357,7 @@
<int key="NSvFlags">292</int>
<string key="NSFrame">{{239, 57}, {161, 19}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="43525095">
<int key="NSCellFlags">-1804468671</int>
@@ -1279,6 +1376,7 @@
<int key="NSvFlags">264</int>
<string key="NSFrame">{{17, 414}, {167, 14}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="434303900">
<int key="NSCellFlags">68288064</int>
@@ -1295,6 +1393,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{20, 394}, {161, 19}}</string>
<reference key="NSSuperview" ref="338542681"/>
+ <reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1025501303">
<int key="NSCellFlags">-1804468671</int>
@@ -1311,11 +1410,13 @@
</object>
<string key="NSFrame">{{143, 0}, {548, 444}}</string>
<reference key="NSSuperview" ref="358491109"/>
+ <reference key="NSWindow"/>
<string key="NSClassName">NSView</string>
</object>
</object>
<string key="NSFrameSize">{691, 444}</string>
<reference key="NSSuperview" ref="391663674"/>
+ <reference key="NSWindow"/>
<bool key="NSIsVertical">YES</bool>
<int key="NSDividerStyle">2</int>
<string key="NSAutosaveName">SPQueryFavoriteSplitView</string>
@@ -1382,6 +1483,7 @@
</object>
<string key="NSFrameSize">{691, 444}</string>
<reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1920, 1058}}</string>
<string key="NSMinSize">{691, 466}</string>
@@ -2200,6 +2302,38 @@
</object>
<int key="connectionID">1087</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">withBlobLabelField</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="703222741"/>
+ </object>
+ <int key="connectionID">1090</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="710770414"/>
+ <reference key="destination" ref="965862131"/>
+ </object>
+ <int key="connectionID">1094</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">withBlobPopupButton</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="710770414"/>
+ </object>
+ <int key="connectionID">1096</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">withBlobButtonChanged:</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="710770414"/>
+ </object>
+ <int key="connectionID">1097</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -2488,6 +2622,8 @@
<reference ref="284549777"/>
<reference ref="413102423"/>
<reference ref="679408795"/>
+ <reference ref="703222741"/>
+ <reference ref="710770414"/>
</object>
<reference key="parent" ref="358491109"/>
<string key="objectName">Bundle Content View</string>
@@ -3013,6 +3149,44 @@
<reference key="object" ref="75217064"/>
<reference key="parent" ref="413102423"/>
</object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1088</int>
+ <reference key="object" ref="703222741"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="116371218"/>
+ </object>
+ <reference key="parent" ref="338542681"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1089</int>
+ <reference key="object" ref="116371218"/>
+ <reference key="parent" ref="703222741"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1091</int>
+ <reference key="object" ref="710770414"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="68459104"/>
+ </object>
+ <reference key="parent" ref="338542681"/>
+ <string key="objectName">Pop Up Button (Input Fallback)</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1092</int>
+ <reference key="object" ref="68459104"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="979150328"/>
+ </object>
+ <reference key="parent" ref="710770414"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1093</int>
+ <reference key="object" ref="979150328"/>
+ <reference key="parent" ref="68459104"/>
+ </object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -3047,6 +3221,14 @@
<string>1083.IBAttributePlaceholdersKey</string>
<string>1083.IBPluginDependency</string>
<string>1084.IBPluginDependency</string>
+ <string>1088.IBAttributePlaceholdersKey</string>
+ <string>1088.IBPluginDependency</string>
+ <string>1089.IBPluginDependency</string>
+ <string>1091.IBAttributePlaceholdersKey</string>
+ <string>1091.IBPluginDependency</string>
+ <string>1092.IBPluginDependency</string>
+ <string>1093.IBEditorWindowLastContentRect</string>
+ <string>1093.IBPluginDependency</string>
<string>521.IBEditorWindowLastContentRect</string>
<string>521.IBPluginDependency</string>
<string>521.IBWindowTemplateEditedContentRect</string>
@@ -3207,6 +3389,27 @@
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSMutableDictionary">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSMutableDictionary">
+ <string key="NS.key.0">ToolTip</string>
+ <object class="IBToolTipAttribute" key="NS.object.0">
+ <string key="name">ToolTip</string>
+ <reference key="object" ref="710770414"/>
+ <string key="toolTip">Choose the handling of BLOB fields</string>
+ </object>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{430, 598}, {167, 4}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{172, 298}, {691, 444}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{172, 298}, {691, 444}}</string>
@@ -3444,7 +3647,7 @@
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">1087</int>
+ <int key="maxID">1097</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -3602,6 +3805,7 @@
<string>scopeButtonChanged:</string>
<string>showHelp:</string>
<string>triggerButtonChanged:</string>
+ <string>withBlobButtonChanged:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3619,6 +3823,7 @@
<string>id</string>
<string>id</string>
<string>id</string>
+ <string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
@@ -3639,6 +3844,7 @@
<string>scopeButtonChanged:</string>
<string>showHelp:</string>
<string>triggerButtonChanged:</string>
+ <string>withBlobButtonChanged:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3698,6 +3904,10 @@
<string key="name">triggerButtonChanged:</string>
<string key="candidateClassName">id</string>
</object>
+ <object class="IBActionInfo">
+ <string key="name">withBlobButtonChanged:</string>
+ <string key="candidateClassName">id</string>
+ </object>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
@@ -3736,6 +3946,8 @@
<string>showHideMetaButton</string>
<string>tooltipTextField</string>
<string>triggerPopupButton</string>
+ <string>withBlobLabelField</string>
+ <string>withBlobPopupButton</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3771,6 +3983,8 @@
<string>NSButton</string>
<string>NSTextField</string>
<string>NSPopUpButton</string>
+ <string>NSTextField</string>
+ <string>NSPopUpButton</string>
</object>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
@@ -3809,6 +4023,8 @@
<string>showHideMetaButton</string>
<string>tooltipTextField</string>
<string>triggerPopupButton</string>
+ <string>withBlobLabelField</string>
+ <string>withBlobPopupButton</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3940,6 +4156,14 @@
<string key="name">triggerPopupButton</string>
<string key="candidateClassName">NSPopUpButton</string>
</object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">withBlobLabelField</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">withBlobPopupButton</string>
+ <string key="candidateClassName">NSPopUpButton</string>
+ </object>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
diff --git a/Source/SPBundleEditorController.h b/Source/SPBundleEditorController.h
index 5ccd8a9a..7cc36de4 100644
--- a/Source/SPBundleEditorController.h
+++ b/Source/SPBundleEditorController.h
@@ -40,6 +40,7 @@
IBOutlet NSTextField *tooltipTextField;
IBOutlet NSTextField *categoryTextField;
IBOutlet NSTextField *fallbackLabelField;
+ IBOutlet NSTextField *withBlobLabelField;
IBOutlet NSTextField *commandLabelField;
IBOutlet NSTextField *authorLabelField;
IBOutlet NSTextField *contactLabelField;
@@ -49,6 +50,7 @@
IBOutlet NSPopUpButton *outputPopupButton;
IBOutlet NSPopUpButton *scopePopupButton;
IBOutlet NSPopUpButton *triggerPopupButton;
+ IBOutlet NSPopUpButton *withBlobPopupButton;
IBOutlet NSButton *removeButton;
IBOutlet NSButton *addButton;
IBOutlet NSButton *saveButton;
@@ -84,6 +86,7 @@
NSMenu *triggerInputFieldPopUpMenu;
NSMenu *triggerDataTablePopUpMenu;
NSMenu *triggerGeneralPopUpMenu;
+ NSMenu *withBlobDataTablePopUpMenu;
NSArray *inputGeneralScopeArray;
NSArray *inputInputFieldScopeArray;
@@ -95,6 +98,7 @@
NSArray *triggerInputFieldArray;
NSArray *triggerDataTableArray;
NSArray *triggerGeneralArray;
+ NSArray *withBlobDataTableArray;
BOOL doGroupDueToChars;
BOOL allowUndo;
@@ -109,6 +113,7 @@
- (IBAction)outputPopupButtonChanged:(id)sender;
- (IBAction)scopeButtonChanged:(id)sender;
- (IBAction)triggerButtonChanged:(id)sender;
+- (IBAction)withBlobButtonChanged:(id)sender;
- (IBAction)duplicateCommandBundle:(id)sender;
- (IBAction)addCommandBundle:(id)sender;
- (IBAction)removeCommandBundle:(id)sender;
diff --git a/Source/SPBundleEditorController.m b/Source/SPBundleEditorController.m
index 60f95f3b..56258ee3 100644
--- a/Source/SPBundleEditorController.m
+++ b/Source/SPBundleEditorController.m
@@ -93,6 +93,7 @@
[triggerInputFieldArray release];
[triggerDataTableArray release];
[triggerGeneralArray release];
+ [withBlobDataTableArray release];
if(touchedBundleArray) [touchedBundleArray release], touchedBundleArray = nil;
if(commandBundleTree) [commandBundleTree release], commandBundleTree = nil;
@@ -134,6 +135,7 @@
triggerInputFieldPopUpMenu = [[NSMenu alloc] initWithTitle:@""];
triggerDataTablePopUpMenu = [[NSMenu alloc] initWithTitle:@""];
triggerGeneralPopUpMenu = [[NSMenu alloc] initWithTitle:@""];
+ withBlobDataTablePopUpMenu = [[NSMenu alloc] initWithTitle:@""];
inputGeneralScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, nil] retain];
inputInputFieldScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, SPBundleInputSourceSelectedText, SPBundleInputSourceEntireContent, nil] retain];
@@ -145,6 +147,7 @@
triggerInputFieldArray = [[NSArray arrayWithObjects:SPBundleTriggerActionNone, nil] retain];
triggerDataTableArray = [[NSArray arrayWithObjects:SPBundleTriggerActionNone, SPBundleTriggerActionDatabaseChanged, SPBundleTriggerActionTableChanged, SPBundleTriggerActionTableRowChanged, nil] retain];
triggerGeneralArray = [[NSArray arrayWithObjects:SPBundleTriggerActionNone, SPBundleTriggerActionDatabaseChanged, SPBundleTriggerActionTableChanged, nil] retain];
+ withBlobDataTableArray = [[NSArray arrayWithObjects:SPBundleInputSourceBlobHandlingExclude, SPBundleInputSourceBlobHandlingInclude, SPBundleInputSourceBlobHandlingImageFileReference, SPBundleInputSourceBlobHandlingFileReference, nil] retain];
NSMutableArray *allPopupScopeItems = [NSMutableArray array];
[allPopupScopeItems addObjectsFromArray:inputGeneralScopeArray];
@@ -157,6 +160,7 @@
[allPopupScopeItems addObjectsFromArray:triggerInputFieldArray];
[allPopupScopeItems addObjectsFromArray:triggerDataTableArray];
[allPopupScopeItems addObjectsFromArray:triggerGeneralArray];
+ [allPopupScopeItems addObjectsFromArray:withBlobDataTableArray];
NSDictionary *menuItemTitles = [NSDictionary dictionaryWithObjects:
[NSArray arrayWithObjects:
@@ -210,6 +214,11 @@
NSLocalizedString(@"Database changed", @"database changed item label"),
NSLocalizedString(@"Table changed", @"table changed item label"),
+ NSLocalizedString(@"exclude BLOB", @"exclude BLOB item label"),
+ NSLocalizedString(@"include BLOB", @"include BLOB item label"),
+ NSLocalizedString(@"save BLOB as image file", @"save BLOB as image file item label"),
+ NSLocalizedString(@"save BLOB as dat file", @"save BLOB as dat file item label"),
+
nil]
forKeys:allPopupScopeItems];
@@ -264,6 +273,11 @@
[triggerGeneralPopUpMenu addItem:anItem];
[anItem release];
}
+ for(NSString* title in withBlobDataTableArray) {
+ anItem = [[NSMenuItem alloc] initWithTitle:[menuItemTitles objectForKey:title] action:@selector(withBlobButtonChanged:) keyEquivalent:@""];
+ [withBlobDataTablePopUpMenu addItem:anItem];
+ [anItem release];
+ }
anItem = [[NSMenuItem alloc] initWithTitle:[menuItemTitles objectForKey:SPBundleInputSourceNone] action:nil keyEquivalent:@""];
[inputNonePopUpMenu addItem:anItem];
[anItem release];
@@ -456,6 +470,28 @@
}
/**
+ * Store trigger in bundle dict since it is not bound
+ * via key binding and update various GUI elements
+ */
+- (IBAction)withBlobButtonChanged:(id)sender
+{
+
+ id currentDict = [self _currentSelectedObject];
+
+ NSMenu* senderMenu = [sender menu];
+
+ NSInteger selectedIndex = [senderMenu indexOfItem:sender];
+ NSString *input = SPBundleInputSourceBlobHandlingExclude;
+
+ input = [withBlobDataTableArray objectAtIndex:selectedIndex];
+
+ [currentDict setObject:input forKey:SPBundleFileWithBlobKey];
+
+ [self _updateBundleDataView];
+
+}
+
+/**
* Duplicate the selected bundle (processed in addCommandBundle:)
*/
- (IBAction)duplicateCommandBundle:(id)sender
@@ -1618,6 +1654,9 @@
NSString *trigger = [currentDict objectForKey:SPBundleFileTriggerKey];
if(!trigger) trigger = SPBundleTriggerActionNone;
+ NSString *withBlob = [currentDict objectForKey:SPBundleFileWithBlobKey];
+ if(!withBlob) withBlob = SPBundleInputSourceBlobHandlingExclude;
+
// Update the scope popup button
if([scope isEqualToString:SPBundleScopeGeneral])
[scopePopupButton selectItemWithTag:kGeneralScopeArrayIndex];
@@ -1647,6 +1686,8 @@
input = SPBundleInputSourceNone;
[inputFallbackPopupButton setHidden:YES];
[fallbackLabelField setHidden:YES];
+ [withBlobPopupButton setHidden:YES];
+ [withBlobLabelField setHidden:YES];
break;
case kInputFieldScopeArrayIndex: // Input Field
@@ -1670,6 +1711,9 @@
if(anIndex == NSNotFound) anIndex = 0;
[triggerPopupButton selectItemAtIndex:anIndex];
+ [withBlobPopupButton setHidden:YES];
+ [withBlobLabelField setHidden:YES];
+
break;
case kDataTableScopeArrayIndex: // Data Table
[inputPopupButton setMenu:inputDataTableScopePopUpMenu];
@@ -1682,7 +1726,6 @@
if(anIndex == NSNotFound) anIndex = 0;
[outputPopupButton selectItemAtIndex:anIndex];
- input = SPBundleInputSourceNone;
[inputFallbackPopupButton setHidden:YES];
[fallbackLabelField setHidden:YES];
@@ -1691,6 +1734,23 @@
if(anIndex == NSNotFound) anIndex = 0;
[triggerPopupButton selectItemAtIndex:anIndex];
+ [withBlobPopupButton setMenu:withBlobDataTablePopUpMenu];
+ anIndex = [withBlobDataTableArray indexOfObject:withBlob];
+ if(anIndex == NSNotFound) anIndex = 0;
+ [withBlobPopupButton selectItemAtIndex:anIndex];
+
+ [inputFallbackPopupButton setHidden:YES];
+ [fallbackLabelField setHidden:YES];
+
+ if([currentDict objectForKey:SPBundleFileInputSourceKey] && ([[currentDict objectForKey:SPBundleFileInputSourceKey] isEqualToString:SPBundleInputSourceNone] || [[currentDict objectForKey:SPBundleFileInputSourceKey] isEqualToString:SPBundleInputSourceTableRowsAsSqlInsert] || [[currentDict objectForKey:SPBundleFileInputSourceKey] isEqualToString:SPBundleInputSourceSelectedTableRowsAsSqlInsert])) {
+ [withBlobPopupButton setHidden:YES];
+ [withBlobLabelField setHidden:YES];
+ } else {
+ [withBlobPopupButton setHidden:NO];
+ [withBlobLabelField setHidden:NO];
+ }
+ input = SPBundleInputSourceNone;
+
break;
case kDisabledScopeTag: // Disable command
break;
diff --git a/Source/SPConstants.h b/Source/SPConstants.h
index 5327fd45..91777dbe 100644
--- a/Source/SPConstants.h
+++ b/Source/SPConstants.h
@@ -448,6 +448,10 @@ extern NSString *SPBundleInputSourceTableRowsAsTab;
extern NSString *SPBundleInputSourceTableRowsAsCsv;
extern NSString *SPBundleInputSourceTableRowsAsSqlInsert;
extern NSString *SPBundleInputSourceNone;
+extern NSString *SPBundleInputSourceBlobHandlingInclude;
+extern NSString *SPBundleInputSourceBlobHandlingExclude;
+extern NSString *SPBundleInputSourceBlobHandlingImageFileReference;
+extern NSString *SPBundleInputSourceBlobHandlingFileReference;
extern NSString *SPBundleOutputActionNone;
extern NSString *SPBundleOutputActionInsertAsText;
extern NSString *SPBundleOutputActionInsertAsSnippet;
@@ -476,12 +480,14 @@ extern NSString *SPBundleFileContactKey;
extern NSString *SPBundleFileUUIDKey;
extern NSString *SPBundleFileDescriptionKey;
extern NSString *SPBundleFileTriggerKey;
+extern NSString *SPBundleFileWithBlobKey;
extern NSString *SPBundleInternLabelKey;
extern NSString *SPBundleInternPathToFileKey;
extern NSString *SPBundleInternKeyEquivalentKey;
extern NSString *SPBundleFileName;
extern NSString *SPBundleTaskInputFilePath;
extern NSString *SPBundleTaskScriptCommandFilePath;
+extern NSString *SPBundleTaskCopyBlobFileDirectory;
// sequel URL scheme
extern NSString *SPURLSchemeQueryInputPathHeader;
diff --git a/Source/SPConstants.m b/Source/SPConstants.m
index 495a7580..94abe414 100644
--- a/Source/SPConstants.m
+++ b/Source/SPConstants.m
@@ -260,6 +260,10 @@ NSString *SPBundleInputSourceTableRowsAsTab = @"tablerowsastab";
NSString *SPBundleInputSourceTableRowsAsCsv = @"tablerowsascsv";
NSString *SPBundleInputSourceTableRowsAsSqlInsert = @"tablerowsassqlinsert";
NSString *SPBundleInputSourceNone = @"none";
+NSString *SPBundleInputSourceBlobHandlingInclude = @"include";
+NSString *SPBundleInputSourceBlobHandlingExclude = @"exclude";
+NSString *SPBundleInputSourceBlobHandlingImageFileReference = @"imagefilereference";
+NSString *SPBundleInputSourceBlobHandlingFileReference = @"filereference";
NSString *SPBundleOutputActionNone = @"none";
NSString *SPBundleOutputActionInsertAsText = @"insertastext";
NSString *SPBundleOutputActionInsertAsSnippet = @"insertassnippet";
@@ -288,6 +292,7 @@ NSString *SPBundleFileContactKey = @"contact";
NSString *SPBundleFileUUIDKey = @"uuid";
NSString *SPBundleFileDescriptionKey = @"description";
NSString *SPBundleFileTriggerKey = @"trigger";
+NSString *SPBundleFileWithBlobKey = @"withblob";
NSString *SPBundleInternLabelKey = @"label";
NSString *SPBundleInternPathToFileKey = @"path";
NSString *SPBundleInternKeyEquivalentKey = @"keyEquivalent";
@@ -295,6 +300,7 @@ NSString *SPBundleInternKeyEquivalentKey = @"keyEquivalent";
NSString *SPBundleFileName = @"command.plist";
NSString *SPBundleTaskInputFilePath = @"/tmp/SP_BUNDLE_TASK_INPUT";
NSString *SPBundleTaskScriptCommandFilePath = @"/tmp/SP_SCRIPT_COMMAND";
+NSString *SPBundleTaskCopyBlobFileDirectory = @"/tmp/SP_COPY_BLOB_FILES";
// sequel URL scheme
NSString *SPURLSchemeQueryInputPathHeader = @"/tmp/SP_QUERY_";
diff --git a/Source/SPCopyTable.h b/Source/SPCopyTable.h
index 89030976..4723dbc9 100644
--- a/Source/SPCopyTable.h
+++ b/Source/SPCopyTable.h
@@ -48,9 +48,12 @@
NSUserDefaults *prefs;
NSRange fieldEditorSelectedRange;
+ NSString *copyBlobFileDirectory;
}
+@property(readwrite,assign) NSString *copyBlobFileDirectory;
+
@property(readwrite,assign) NSRange fieldEditorSelectedRange;
/*!
@@ -90,7 +93,7 @@
returns something meaningful.
@result The above described string, or nil if nothing selected
*/
-- (NSString *)rowsAsTabStringWithHeaders:(BOOL)withHeaders onlySelectedRows:(BOOL)onlySelected;
+- (NSString *)rowsAsTabStringWithHeaders:(BOOL)withHeaders onlySelectedRows:(BOOL)onlySelected blobHandling:(NSInteger)withBlobHandling;
/*!
@method rowsAsCsvStringWithHeaders:onlySelectedRows:
@@ -101,7 +104,7 @@
returns something meaningful.
@result The above described string, or nil if nothing selected
*/
-- (NSString *)rowsAsCsvStringWithHeaders:(BOOL)withHeaders onlySelectedRows:(BOOL)onlySelected;
+- (NSString *)rowsAsCsvStringWithHeaders:(BOOL)withHeaders onlySelectedRows:(BOOL)onlySelected blobHandling:(NSInteger)withBlobHandling;
/*
* Generate a string in form of INSERT INTO <table> VALUES () of
diff --git a/Source/SPCopyTable.m b/Source/SPCopyTable.m
index 687cb2e4..493c3fb4 100644
--- a/Source/SPCopyTable.m
+++ b/Source/SPCopyTable.m
@@ -34,11 +34,17 @@
#import "SPTooltip.h"
#import "SPAlertSheets.h"
#import "SPBundleHTMLOutputController.h"
+#import "SPGeometryDataView.h"
NSInteger MENU_EDIT_COPY = 2001;
NSInteger MENU_EDIT_COPY_WITH_COLUMN = 2002;
NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
+NSInteger kBlobExclude = 1;
+NSInteger kBlobInclude = 2;
+NSInteger kBlobAsFile = 3;
+NSInteger kBlobAsImageFile = 4;
+
@implementation SPCopyTable
@@ -47,6 +53,7 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
* selection in the field editor's editTextView
*/
@synthesize fieldEditorSelectedRange;
+@synthesize copyBlobFileDirectory;
/**
* Cell editing in SPCustomQuery or for views in SPTableContent
@@ -93,7 +100,7 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
[pb setString:tmp forType:NSStringPboardType];
}
} else {
- tmp = [self rowsAsTabStringWithHeaders:([sender tag] == MENU_EDIT_COPY_WITH_COLUMN) onlySelectedRows:YES];
+ tmp = [self rowsAsTabStringWithHeaders:([sender tag] == MENU_EDIT_COPY_WITH_COLUMN) onlySelectedRows:YES blobHandling:kBlobInclude];
if ( nil != tmp )
{
NSPasteboard *pb = [NSPasteboard generalPasteboard];
@@ -114,7 +121,7 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
* Get selected rows a string of newline separated lines of tab separated fields
* the value in each field is from the objects description method
*/
-- (NSString *) rowsAsTabStringWithHeaders:(BOOL)withHeaders onlySelectedRows:(BOOL)onlySelected
+- (NSString *) rowsAsTabStringWithHeaders:(BOOL)withHeaders onlySelectedRows:(BOOL)onlySelected blobHandling:(NSInteger)withBlobHandling
{
if (onlySelected && [self numberOfSelectedRows] == 0) return nil;
@@ -152,6 +159,13 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
NSString *nullString = [prefs objectForKey:SPNullValue];
NSStringEncoding connectionEncoding = [mySQLConnection encoding];
Class mcpGeometryData = [MCPGeometryData class];
+ NSUInteger rowCounter = 0;
+
+ if((withBlobHandling == kBlobAsFile || withBlobHandling == kBlobAsImageFile) && copyBlobFileDirectory && [copyBlobFileDirectory length]) {
+ NSFileManager *fm = [NSFileManager defaultManager];
+ [fm removeItemAtPath:copyBlobFileDirectory error:nil];
+ [fm createDirectoryAtPath:copyBlobFileDirectory withIntermediateDirectories:YES attributes:nil error:nil];
+ }
while ( rowIndex != NSNotFound )
{
@@ -159,22 +173,59 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
cellData = SPDataStorageObjectAtRowAndColumn(tableStorage, rowIndex, columnMappings[c]);
// Copy the shown representation of the cell - custom NULL display strings, (not loaded),
- // and the string representation of any blobs or binary texts.
+ // definable representation of any blobs or binary texts.
if (cellData) {
if ([cellData isNSNull])
[result appendFormat:@"%@\t", nullString];
else if ([cellData isSPNotLoaded])
[result appendFormat:@"%@\t", NSLocalizedString(@"(not loaded)", @"value shown for hidden blob and text fields")];
else if ([cellData isKindOfClass:[NSData class]]) {
- NSString *displayString = [[NSString alloc] initWithData:cellData encoding:[mySQLConnection stringEncoding]];
- if (!displayString) displayString = [[NSString alloc] initWithData:cellData encoding:NSASCIIStringEncoding];
- if (displayString) {
- [result appendFormat:@"%@\t", displayString];
- [displayString release];
+ if(withBlobHandling == kBlobInclude) {
+ NSString *displayString = [[NSString alloc] initWithData:cellData encoding:[mySQLConnection stringEncoding]];
+ if (!displayString) displayString = [[NSString alloc] initWithData:cellData encoding:NSASCIIStringEncoding];
+ if (displayString) {
+ [result appendFormat:@"%@\t", displayString];
+ [displayString release];
+ }
+ }
+ else if(withBlobHandling == kBlobAsFile && copyBlobFileDirectory && [copyBlobFileDirectory length]) {
+ NSString *fp = [NSString stringWithFormat:@"%@/%ld_%ld.dat", copyBlobFileDirectory, rowCounter, c];
+ [cellData writeToFile:fp atomically:NO];
+ [result appendFormat:@"%@\t", fp];
+ }
+ else if(withBlobHandling == kBlobAsImageFile && copyBlobFileDirectory && [copyBlobFileDirectory length]) {
+ NSString *fp = [NSString stringWithFormat:@"%@/%ld_%ld.tif", copyBlobFileDirectory, rowCounter, c];
+ NSImage *image = [[NSImage alloc] initWithData:cellData];
+ if (image) {
+ NSData *d = [[NSData alloc] initWithData:[image TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1]];
+ [d writeToFile:fp atomically:NO];
+ if(d) [d release], d = nil;
+ [image release];
+ } else {
+ NSString *noData = @"";
+ [noData writeToFile:fp atomically:NO];
+ }
+ [result appendFormat:@"%@\t", fp];
+ }
+ else {
+ [result appendString:@"BLOB\t"];
}
}
else if ([cellData isKindOfClass:mcpGeometryData]) {
- [result appendFormat:@"%@\t", [cellData wktString]];
+ if((withBlobHandling == kBlobAsFile || withBlobHandling == kBlobAsImageFile) && copyBlobFileDirectory && [copyBlobFileDirectory length]) {
+ NSString *fp = [NSString stringWithFormat:@"%@/%ld_%ld.pdf", copyBlobFileDirectory, rowCounter, c];
+ SPGeometryDataView *v = [[SPGeometryDataView alloc] initWithCoordinates:[cellData coordinates]];
+ NSData *thePDF = [v pdfData];
+ if(thePDF) {
+ [thePDF writeToFile:fp atomically:NO];
+ [result appendFormat:@"%@\t", fp];
+ } else {
+ [result appendFormat:@"%@\t", [cellData wktString]];
+ }
+ if(v) [v release], v = nil;
+ } else {
+ [result appendFormat:@"%@\t", [cellData wktString]];
+ }
}
else
[result appendFormat:@"%@\t", [cellData description]];
@@ -183,6 +234,8 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
}
}
+ rowCounter++;
+
// Remove the trailing tab and add the linebreak
if ([result length]){
[result deleteCharactersInRange:NSMakeRange([result length]-1, 1)];
@@ -207,7 +260,7 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
* Get selected rows a string of newline separated lines of , separated fields wrapped into quotes
* the value in each field is from the objects description method
*/
-- (NSString *) rowsAsCsvStringWithHeaders:(BOOL)withHeaders onlySelectedRows:(BOOL)onlySelected
+- (NSString *) rowsAsCsvStringWithHeaders:(BOOL)withHeaders onlySelectedRows:(BOOL)onlySelected blobHandling:(NSInteger)withBlobHandling
{
if (onlySelected && [self numberOfSelectedRows] == 0) return nil;
@@ -246,36 +299,83 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
NSStringEncoding connectionEncoding = [mySQLConnection encoding];
Class mcpGeometryData = [MCPGeometryData class];
+ NSUInteger rowCounter = 0;
+
+ if((withBlobHandling == kBlobAsFile || withBlobHandling == kBlobAsImageFile) && copyBlobFileDirectory && [copyBlobFileDirectory length]) {
+ NSFileManager *fm = [NSFileManager defaultManager];
+ [fm removeItemAtPath:copyBlobFileDirectory error:nil];
+ [fm createDirectoryAtPath:copyBlobFileDirectory withIntermediateDirectories:YES attributes:nil error:nil];
+ }
+
while ( rowIndex != NSNotFound )
{
for ( c = 0; c < numColumns; c++ ) {
cellData = SPDataStorageObjectAtRowAndColumn(tableStorage, rowIndex, columnMappings[c]);
// Copy the shown representation of the cell - custom NULL display strings, (not loaded),
- // and the string representation of any blobs or binary texts.
+ // definable representation of any blobs or binary texts.
if (cellData) {
if ([cellData isNSNull])
[result appendFormat:@"\"%@\",", nullString];
else if ([cellData isSPNotLoaded])
[result appendFormat:@"\"%@\",", NSLocalizedString(@"(not loaded)", @"value shown for hidden blob and text fields")];
else if ([cellData isKindOfClass:[NSData class]]) {
- NSString *displayString = [[NSString alloc] initWithData:cellData encoding:[mySQLConnection stringEncoding]];
- if (!displayString) displayString = [[NSString alloc] initWithData:cellData encoding:NSASCIIStringEncoding];
- if (displayString) {
- [result appendFormat:@"\"%@\",", [displayString stringByReplacingOccurrencesOfString:@"\"" withString:@"\"\""]];
- [displayString release];
+ if(withBlobHandling == kBlobInclude) {
+ NSString *displayString = [[NSString alloc] initWithData:cellData encoding:[mySQLConnection stringEncoding]];
+ if (!displayString) displayString = [[NSString alloc] initWithData:cellData encoding:NSASCIIStringEncoding];
+ if (displayString) {
+ [result appendFormat:@"\"%@\",", displayString];
+ [displayString release];
+ }
+ }
+ else if(withBlobHandling == kBlobAsFile && copyBlobFileDirectory && [copyBlobFileDirectory length]) {
+ NSString *fp = [NSString stringWithFormat:@"%@/%ld_%ld.dat", copyBlobFileDirectory, rowCounter, c];
+ [cellData writeToFile:fp atomically:NO];
+ [result appendFormat:@"\"%@\",", fp];
+ }
+ else if(withBlobHandling == kBlobAsImageFile && copyBlobFileDirectory && [copyBlobFileDirectory length]) {
+ NSString *fp = [NSString stringWithFormat:@"%@/%ld_%ld.tif", copyBlobFileDirectory, rowCounter, c];
+ NSImage *image = [[NSImage alloc] initWithData:cellData];
+ if (image) {
+ NSData *d = [[NSData alloc] initWithData:[image TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1]];
+ [d writeToFile:fp atomically:NO];
+ if(d) [d release], d = nil;
+ [image release];
+ } else {
+ NSString *noData = @"";
+ [noData writeToFile:fp atomically:NO];
+ }
+ [result appendFormat:@"\"%@\",", fp];
+ }
+ else {
+ [result appendString:@"\"BLOB\","];
}
}
else if ([cellData isKindOfClass:mcpGeometryData]) {
- [result appendFormat:@"\"%@\",", [cellData wktString]];
+ if((withBlobHandling == kBlobAsFile || withBlobHandling == kBlobAsImageFile) && copyBlobFileDirectory && [copyBlobFileDirectory length]) {
+ NSString *fp = [NSString stringWithFormat:@"%@/%ld_%ld.pdf", copyBlobFileDirectory, rowCounter, c];
+ SPGeometryDataView *v = [[SPGeometryDataView alloc] initWithCoordinates:[cellData coordinates]];
+ NSData *thePDF = [v pdfData];
+ if(thePDF) {
+ [thePDF writeToFile:fp atomically:NO];
+ [result appendFormat:@"\"%@\",", fp];
+ } else {
+ [result appendFormat:@"\"%@\",", [cellData wktString]];
+ }
+ if(v) [v release], v = nil;
+ } else {
+ [result appendFormat:@"\"%@\",", [cellData wktString]];
+ }
}
else
- [result appendFormat:@"\"%@\",", [[cellData description] stringByReplacingOccurrencesOfString:@"\"" withString:@"\"\""]];
+ [result appendFormat:@"\"%@\",", [cellData description]];
} else {
[result appendString:@","];
}
}
+ rowCounter++;
+
// Remove the trailing tab and add the linebreak
if ([result length]){
[result deleteCharactersInRange:NSMakeRange([result length]-1, 1)];
@@ -860,8 +960,10 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
NSString *cmd = [cmdData objectForKey:SPBundleFileCommandKey];
NSString *inputAction = @"";
NSString *inputFallBackAction = @"";
+ NSString *withBlobHandling = @"";
NSError *err = nil;
- NSString *bundleInputFilePath = [NSString stringWithFormat:@"%@_%@", SPBundleTaskInputFilePath, [NSString stringWithNewUUID]];
+ NSString *uuid = [NSString stringWithNewUUID];
+ NSString *bundleInputFilePath = [NSString stringWithFormat:@"%@_%@", SPBundleTaskInputFilePath, uuid];
[[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil];
@@ -890,20 +992,40 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
NSError *inputFileError = nil;
NSString *input = @"";
+ NSInteger blobHandling = kBlobExclude;
+ if([cmdData objectForKey:SPBundleFileWithBlobKey]) {
+ if([[cmdData objectForKey:SPBundleFileWithBlobKey] isEqualToString:SPBundleInputSourceBlobHandlingExclude])
+ blobHandling = kBlobExclude;
+ else if([[cmdData objectForKey:SPBundleFileWithBlobKey] isEqualToString:SPBundleInputSourceBlobHandlingInclude])
+ blobHandling = kBlobInclude;
+ else if([[cmdData objectForKey:SPBundleFileWithBlobKey] isEqualToString:SPBundleInputSourceBlobHandlingImageFileReference])
+ blobHandling = kBlobAsImageFile;
+ else if([[cmdData objectForKey:SPBundleFileWithBlobKey] isEqualToString:SPBundleInputSourceBlobHandlingFileReference])
+ blobHandling = kBlobAsFile;
+ }
+
+ if(blobHandling != kBlobExclude) {
+ NSString *bundleBlobFilePath = [NSString stringWithFormat:@"%@_%@", SPBundleTaskCopyBlobFileDirectory, uuid];
+ [env setObject:bundleBlobFilePath forKey:@"SP_BUNDLE_BLOB_FILES_DIRECTORY"];
+ [self setCopyBlobFileDirectory:bundleBlobFilePath];
+ } else {
+ [self setCopyBlobFileDirectory:@""];
+ }
+
if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsTab]) {
- input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:YES];
+ input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:YES blobHandling:blobHandling];
}
else if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsCsv]) {
- input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:YES];
+ input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:YES blobHandling:blobHandling];
}
else if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsSqlInsert]) {
input = [self rowsAsSqlInsertsOnlySelectedRows:YES];
}
else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsTab]) {
- input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:NO];
+ input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:NO blobHandling:blobHandling];
}
else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsCsv]) {
- input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:NO];
+ input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:NO blobHandling:blobHandling];
}
else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsSqlInsert]) {
input = [self rowsAsSqlInsertsOnlySelectedRows:NO];