From ebf5a2d507178480fa18fa51a623e0dc67100345 Mon Sep 17 00:00:00 2001 From: helge Date: Fri, 20 Aug 2004 17:57:50 +0000 Subject: [PATCH] added SOPE:X git-svn-id: http://svn.opengroupware.org/SOPE/trunk@6 e4a50df8-12e2-0310-a44c-efbce7f8a7e3 --- README | 12 +- sope-appserver/GNUmakefile | 6 +- .../NGScripting/NGObjectMappingContext.h | 4 +- .../NGScripting/NGObjectMappingContext.m | 4 +- sope-appserver/NGScripting/NGScriptLanguage.h | 4 +- sope-appserver/NGScripting/NGScriptLanguage.m | 4 +- .../NGScripting/NSObject+Scripting.h | 4 +- .../NGScripting/NSObject+Scripting.m | 4 +- sope-ical/README-OSX.txt | 133 + sope-ldap/README-OSX.txt | 133 + sope-mime/README-OSX.txt | 135 + sopex/COPYING | 482 + sopex/COPYRIGHT | 3 + sopex/ChangeLog | 9 + sopex/PROJECTLEAD | 3 + sopex/README | 23 + sopex/README-WebObjects | 13 + sopex/SOPEX/COPYING | 482 + sopex/SOPEX/COPYRIGHT | 3 + sopex/SOPEX/ChangeLog | 207 + sopex/SOPEX/Clean.tiff | Bin 0 -> 16648 bytes sopex/SOPEX/English.lproj/InfoPlist.strings | Bin 0 -> 516 bytes sopex/SOPEX/English.lproj/Localizable.strings | Bin 0 -> 1696 bytes .../SOPEXConsole.nib/classes.nib | 13 + .../English.lproj/SOPEXConsole.nib/info.nib | 20 + .../SOPEXConsole.nib/keyedobjects.nib | 1401 ++ .../SOPEX/English.lproj/SOPEXConsole.toolbar | 24 + .../SOPEXMainMenu.nib/classes.nib | 63 + .../English.lproj/SOPEXMainMenu.nib/info.nib | 24 + .../SOPEXMainMenu.nib/keyedobjects.nib | 14476 ++++++++++++++++ .../SOPEXStatisticsNatLang.plist | 30 + .../English.lproj/SOPEXStats.nib/classes.nib | 22 + .../English.lproj/SOPEXStats.nib/info.nib | 16 + .../SOPEXStats.nib/keyedobjects.nib | Bin 0 -> 10660 bytes sopex/SOPEX/English.lproj/SOPEXWebUI.toolbar | 78 + sopex/SOPEX/Info.plist | 24 + sopex/SOPEX/Lori.icns | Bin 0 -> 42190 bytes sopex/SOPEX/NSBundle+Ext.h | 36 + sopex/SOPEX/NSBundle+Ext.m | 53 + sopex/SOPEX/NSString+Ext.h | 36 + sopex/SOPEX/NSString+Ext.m | 35 + sopex/SOPEX/PROJECTLEAD | 3 + sopex/SOPEX/README | 104 + sopex/SOPEX/Reload.tiff | Bin 0 -> 14936 bytes sopex/SOPEX/SOPEX.h | 49 + sopex/SOPEX/SOPEX.xcode/project.pbxproj | 1536 ++ sopex/SOPEX/SOPEXAppController.h | 112 + sopex/SOPEX/SOPEXAppController.m | 967 ++ sopex/SOPEX/SOPEXApplication.h | 36 + sopex/SOPEX/SOPEXApplication.m | 34 + sopex/SOPEX/SOPEXAuthPanel.h | 32 + sopex/SOPEX/SOPEXAuthPanel.m | 49 + sopex/SOPEX/SOPEXBrowserWindow.h | 39 + sopex/SOPEX/SOPEXBrowserWindow.m | 119 + sopex/SOPEX/SOPEXConsole.h | 54 + sopex/SOPEX/SOPEXConsole.m | 236 + sopex/SOPEX/SOPEXConstants.h | 33 + sopex/SOPEX/SOPEXConstants.m | 27 + sopex/SOPEX/SOPEXContentValidator.h | 58 + sopex/SOPEX/SOPEXContentValidator.m | 278 + sopex/SOPEX/SOPEXDocument.h | 68 + sopex/SOPEX/SOPEXDocument.m | 237 + sopex/SOPEX/SOPEXMain.h | 33 + sopex/SOPEX/SOPEXMain.m | 50 + sopex/SOPEX/SOPEXRangeUtilities.h | 34 + sopex/SOPEX/SOPEXRangeUtilities.m | 168 + sopex/SOPEX/SOPEXSNSController.h | 72 + sopex/SOPEX/SOPEXSNSController.m | 331 + sopex/SOPEX/SOPEXSheetRunner.h | 40 + sopex/SOPEX/SOPEXSheetRunner.m | 70 + sopex/SOPEX/SOPEXStatisticsController.h | 62 + sopex/SOPEX/SOPEXStatisticsController.m | 301 + sopex/SOPEX/SOPEXTextView.h | 54 + sopex/SOPEX/SOPEXTextView.m | 102 + sopex/SOPEX/SOPEXToolbarController.h | 29 + sopex/SOPEX/SOPEXToolbarController.m | 166 + sopex/SOPEX/SOPEXWODocument.h | 37 + sopex/SOPEX/SOPEXWODocument.m | 104 + sopex/SOPEX/SOPEXWOXDocument.h | 37 + sopex/SOPEX/SOPEXWOXDocument.m | 78 + sopex/SOPEX/SOPEXWebConnection.h | 36 + sopex/SOPEX/SOPEXWebConnection.m | 210 + sopex/SOPEX/SOPEXWebMetaParser.h | 27 + sopex/SOPEX/SOPEXWebMetaParser.m | 117 + sopex/SOPEX/SOPEX_Prefix.pch | 13 + sopex/SOPEX/Version | 13 + sopex/SOPEX/WebView+Ext.h | 36 + sopex/SOPEX/WebView+Ext.m | 33 + sopex/SOPEX/version.plist | 16 + sopex/Samples/ChangeLog | 5 + sopex/Samples/WOxExtTest/AlertPanel.m | 49 + sopex/Samples/WOxExtTest/AlertPanel.wox | 25 + sopex/Samples/WOxExtTest/Application.h | 21 + sopex/Samples/WOxExtTest/Application.m | 32 + sopex/Samples/WOxExtTest/Browser.m | 148 + sopex/Samples/WOxExtTest/Browser.wox | 14 + sopex/Samples/WOxExtTest/CalendarField.m | 44 + sopex/Samples/WOxExtTest/CalendarField.wox | 15 + sopex/Samples/WOxExtTest/CheckBoxMatrix.m | 52 + sopex/Samples/WOxExtTest/CheckBoxMatrix.wox | 36 + sopex/Samples/WOxExtTest/CollapsibleContent.m | 54 + .../Samples/WOxExtTest/CollapsibleContent.wox | 77 + .../WOxExtTest/CollapsibleContentExt.m | 54 + .../WOxExtTest/CollapsibleContentExt.wox | 132 + sopex/Samples/WOxExtTest/ConfirmPanel.m | 49 + sopex/Samples/WOxExtTest/ConfirmPanel.wox | 28 + sopex/Samples/WOxExtTest/DateField.m | 42 + sopex/Samples/WOxExtTest/DateField.wox | 12 + sopex/Samples/WOxExtTest/Dictionary.plist | 9 + .../Samples/WOxExtTest/DictionaryRepetition.m | 67 + .../WOxExtTest/DictionaryRepetition.wox | 28 + sopex/Samples/WOxExtTest/DirectAction.h | 21 + sopex/Samples/WOxExtTest/DirectAction.m | 12 + sopex/Samples/WOxExtTest/DnD.m | 73 + sopex/Samples/WOxExtTest/DnD.wox | 99 + .../English.lproj/InfoPlist.strings | Bin 0 -> 552 bytes sopex/Samples/WOxExtTest/Frame.m | 68 + sopex/Samples/WOxExtTest/Frame.wox | 40 + sopex/Samples/WOxExtTest/ImageFlyover.m | 49 + sopex/Samples/WOxExtTest/ImageFlyover.wox | 45 + sopex/Samples/WOxExtTest/Info.plist | 26 + .../Samples/WOxExtTest/KeyValueConditional.m | 46 + .../WOxExtTest/KeyValueConditional.wox | 29 + sopex/Samples/WOxExtTest/Lori.icns | Bin 0 -> 42190 bytes sopex/Samples/WOxExtTest/Main.m | 35 + sopex/Samples/WOxExtTest/Main.wox | 90 + sopex/Samples/WOxExtTest/ModalWindow.m | 29 + sopex/Samples/WOxExtTest/ModalWindow.wox | 12 + sopex/Samples/WOxExtTest/MonthOverview.m | 98 + sopex/Samples/WOxExtTest/MonthOverview.wox | 25 + sopex/Samples/WOxExtTest/PageView.m | 44 + sopex/Samples/WOxExtTest/PageView.wox | 178 + .../Samples/WOxExtTest/QualifierConditional.m | 57 + .../WOxExtTest/QualifierConditional.wox | 29 + sopex/Samples/WOxExtTest/README | 11 + sopex/Samples/WOxExtTest/RadioButtonMatrix.m | 54 + .../Samples/WOxExtTest/RadioButtonMatrix.wox | 34 + sopex/Samples/WOxExtTest/RichString.m | 38 + sopex/Samples/WOxExtTest/RichString.wox | 51 + sopex/Samples/WOxExtTest/Session.h | 21 + sopex/Samples/WOxExtTest/Session.m | 12 + sopex/Samples/WOxExtTest/ShiftClick.m | 53 + sopex/Samples/WOxExtTest/ShiftClick.wox | 23 + sopex/Samples/WOxExtTest/Switch.m | 54 + sopex/Samples/WOxExtTest/Switch.wox | 61 + sopex/Samples/WOxExtTest/TabPanel.m | 47 + sopex/Samples/WOxExtTest/TabPanel.wox | 50 + sopex/Samples/WOxExtTest/TabView.m | 98 + sopex/Samples/WOxExtTest/TabView.wox | 99 + sopex/Samples/WOxExtTest/Table.m | 46 + sopex/Samples/WOxExtTest/Table.wox | 42 + sopex/Samples/WOxExtTest/TableMatrix.m | 29 + sopex/Samples/WOxExtTest/TableMatrix.wox | 32 + sopex/Samples/WOxExtTest/TableView.m | 125 + sopex/Samples/WOxExtTest/TableView.plist | 83 + sopex/Samples/WOxExtTest/TableView.wox | 120 + sopex/Samples/WOxExtTest/TextFlyover.m | 51 + sopex/Samples/WOxExtTest/TextFlyover.wox | 46 + .../WOxExtTest/ThresholdColoredNumber.m | 45 + .../WOxExtTest/ThresholdColoredNumber.wox | 48 + sopex/Samples/WOxExtTest/TimeField.m | 40 + sopex/Samples/WOxExtTest/TimeField.wox | 28 + sopex/Samples/WOxExtTest/TreeView.m | 161 + sopex/Samples/WOxExtTest/TreeView.plist | 158 + sopex/Samples/WOxExtTest/TreeView.wox | 107 + sopex/Samples/WOxExtTest/ValidatedField.m | 29 + sopex/Samples/WOxExtTest/ValidatedField.wox | 41 + sopex/Samples/WOxExtTest/VarString.wox | 76 + .../WOExtTest.xcode/project.pbxproj | 1774 ++ sopex/Samples/WOxExtTest/WOExtTest_Prefix.pch | 9 + sopex/Samples/WOxExtTest/WOExtTest_main.m | 16 + .../WOxExtTest/WebServerResources/OGoLogo.gif | Bin 0 -> 2047 bytes .../WebServerResources/collapsed.gif | Bin 0 -> 123 bytes .../WebServerResources/corner_left.gif | Bin 0 -> 970 bytes .../WebServerResources/corner_right.gif | Bin 0 -> 517 bytes .../WebServerResources/downward_sorted.gif | Bin 0 -> 118 bytes .../WebServerResources/expanded.gif | Bin 0 -> 122 bytes .../WOxExtTest/WebServerResources/favicon.ico | Bin 0 -> 3262 bytes .../WOxExtTest/WebServerResources/first.gif | Bin 0 -> 118 bytes .../WebServerResources/first_blind.gif | Bin 0 -> 118 bytes .../WebServerResources/folder_closed.gif | Bin 0 -> 563 bytes .../WebServerResources/folder_opened.gif | Bin 0 -> 567 bytes .../WOxExtTest/WebServerResources/last.gif | Bin 0 -> 118 bytes .../WebServerResources/last_blind.gif | Bin 0 -> 118 bytes .../WebServerResources/menu_email.gif | Bin 0 -> 2064 bytes .../menu_email_inactive.gif | Bin 0 -> 2071 bytes .../WOxExtTest/WebServerResources/next.gif | Bin 0 -> 114 bytes .../WebServerResources/next_blind.gif | Bin 0 -> 114 bytes .../WebServerResources/non_sorted.gif | Bin 0 -> 120 bytes .../WebServerResources/previous.gif | Bin 0 -> 114 bytes .../WebServerResources/previous_blind.gif | Bin 0 -> 114 bytes .../WOxExtTest/WebServerResources/site.css | 39 + .../WOxExtTest/WebServerResources/tab_.gif | Bin 0 -> 1333 bytes .../WebServerResources/tab_left.gif | Bin 0 -> 881 bytes .../WebServerResources/tab_news.gif | Bin 0 -> 1528 bytes .../WebServerResources/tab_news_left.gif | Bin 0 -> 1500 bytes .../WebServerResources/tab_news_selected.gif | Bin 0 -> 1355 bytes .../WebServerResources/tab_persons.gif | Bin 0 -> 1617 bytes .../WebServerResources/tab_persons_left.gif | Bin 0 -> 1617 bytes .../tab_persons_selected.gif | Bin 0 -> 1428 bytes .../WebServerResources/tab_projects.gif | Bin 0 -> 1758 bytes .../WebServerResources/tab_projects_left.gif | Bin 0 -> 1611 bytes .../tab_projects_selected.gif | Bin 0 -> 1445 bytes .../WebServerResources/tab_selected.gif | Bin 0 -> 1189 bytes .../WebServerResources/treeview_corner.gif | Bin 0 -> 70 bytes .../treeview_corner_minus.gif | Bin 0 -> 138 bytes .../treeview_corner_plus.gif | Bin 0 -> 141 bytes .../WebServerResources/treeview_junction.gif | Bin 0 -> 75 bytes .../WebServerResources/treeview_leaf.gif | Bin 0 -> 72 bytes .../treeview_leaf_corner.gif | Bin 0 -> 77 bytes .../WebServerResources/treeview_line.gif | Bin 0 -> 73 bytes .../WebServerResources/treeview_minus.gif | Bin 0 -> 142 bytes .../WebServerResources/treeview_plus.gif | Bin 0 -> 145 bytes .../WebServerResources/treeview_space.gif | Bin 0 -> 58 bytes .../WebServerResources/upward_sorted.gif | Bin 0 -> 117 bytes sopex/Samples/WOxExtTest/WeekColumnView.m | 124 + sopex/Samples/WOxExtTest/WeekColumnView.wox | 51 + sopex/Samples/WOxExtTest/WeekOverview.m | 103 + sopex/Samples/WOxExtTest/WeekOverview.wox | 34 + sopex/Samples/WOxExtTest/appointments.plist | 100 + sopex/Samples/WOxExtTest/common.h | 33 + sopex/Samples/WOxExtTest/version.plist | 16 + .../SOPE/Web Application/Application.h | 21 + .../SOPE/Web Application/Application.m | 12 + .../SOPE/Web Application/COPYING | 0 .../SOPE/Web Application/COPYRIGHT | 0 .../SOPE/Web Application/ChangeLog | 0 .../SOPE/Web Application/DirectAction.h | 21 + .../SOPE/Web Application/DirectAction.m | 12 + .../English.lproj/InfoPlist.strings | Bin 0 -> 588 bytes .../SOPE/Web Application/GNUmakefile | 26 + .../Web Application/GNUmakefile.postamble | 33 + .../SOPE/Web Application/GNUmakefile.preamble | 27 + .../SOPE/Web Application/Info.plist | 26 + .../SOPE/Web Application/Lori.icns | Bin 0 -> 42190 bytes .../SOPE/Web Application/Main.h | 21 + .../SOPE/Web Application/Main.m | 14 + .../SOPE/Web Application/Main.wo/Main.html | 8 + .../SOPE/Web Application/Main.wo/Main.wod | 3 + .../SOPE/Web Application/NOTES | 0 .../SOPE/Web Application/PROJECTLEAD | 0 .../SOPE/Web Application/README | 11 + .../SOPE/Web Application/Session.h | 21 + .../SOPE/Web Application/Session.m | 12 + .../SOPE/Web Application/TODO | 0 .../SOPE/Web Application/Version | 15 + .../WebApp.xcode/TemplateInfo.plist | 21 + .../WebApp.xcode/project.pbxproj | 728 + .../SOPE/Web Application/WebApp_Prefix.pch | 9 + .../SOPE/Web Application/WebApp_main.m | 20 + .../WebServerResources/favicon.ico | Bin 0 -> 3262 bytes .../SOPE/Web Application/version.plist | 16 + sopex/WebObjects/COPYING | 482 + sopex/WebObjects/COPYRIGHT | 3 + sopex/WebObjects/ChangeLog | 8 + .../English.lproj/InfoPlist.strings | Bin 0 -> 536 bytes sopex/WebObjects/GNUmakefile | 28 + sopex/WebObjects/INSTALL | 15 + sopex/WebObjects/Info.plist | 24 + sopex/WebObjects/PROJECTLEAD | 3 + sopex/WebObjects/README | 91 + sopex/WebObjects/WebObjects.h | 45 + .../WebObjects.xcode/project.pbxproj | 484 + sopex/WebObjects/WebObjects_Prefix.pch | 7 + sopex/WebObjects/main.c | 3 + sopex/WebObjects/version.plist | 16 + 266 files changed, 33034 insertions(+), 21 deletions(-) create mode 100644 sope-ical/README-OSX.txt create mode 100644 sope-ldap/README-OSX.txt create mode 100644 sope-mime/README-OSX.txt create mode 100644 sopex/COPYING create mode 100644 sopex/COPYRIGHT create mode 100644 sopex/ChangeLog create mode 100644 sopex/PROJECTLEAD create mode 100644 sopex/README create mode 100644 sopex/README-WebObjects create mode 100644 sopex/SOPEX/COPYING create mode 100644 sopex/SOPEX/COPYRIGHT create mode 100644 sopex/SOPEX/ChangeLog create mode 100644 sopex/SOPEX/Clean.tiff create mode 100644 sopex/SOPEX/English.lproj/InfoPlist.strings create mode 100644 sopex/SOPEX/English.lproj/Localizable.strings create mode 100644 sopex/SOPEX/English.lproj/SOPEXConsole.nib/classes.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXConsole.nib/info.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXConsole.nib/keyedobjects.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXConsole.toolbar create mode 100644 sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/classes.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/info.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/keyedobjects.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXStatisticsNatLang.plist create mode 100644 sopex/SOPEX/English.lproj/SOPEXStats.nib/classes.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXStats.nib/info.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXStats.nib/keyedobjects.nib create mode 100644 sopex/SOPEX/English.lproj/SOPEXWebUI.toolbar create mode 100644 sopex/SOPEX/Info.plist create mode 100644 sopex/SOPEX/Lori.icns create mode 100644 sopex/SOPEX/NSBundle+Ext.h create mode 100644 sopex/SOPEX/NSBundle+Ext.m create mode 100644 sopex/SOPEX/NSString+Ext.h create mode 100644 sopex/SOPEX/NSString+Ext.m create mode 100644 sopex/SOPEX/PROJECTLEAD create mode 100644 sopex/SOPEX/README create mode 100644 sopex/SOPEX/Reload.tiff create mode 100644 sopex/SOPEX/SOPEX.h create mode 100644 sopex/SOPEX/SOPEX.xcode/project.pbxproj create mode 100644 sopex/SOPEX/SOPEXAppController.h create mode 100644 sopex/SOPEX/SOPEXAppController.m create mode 100644 sopex/SOPEX/SOPEXApplication.h create mode 100644 sopex/SOPEX/SOPEXApplication.m create mode 100644 sopex/SOPEX/SOPEXAuthPanel.h create mode 100644 sopex/SOPEX/SOPEXAuthPanel.m create mode 100644 sopex/SOPEX/SOPEXBrowserWindow.h create mode 100644 sopex/SOPEX/SOPEXBrowserWindow.m create mode 100644 sopex/SOPEX/SOPEXConsole.h create mode 100644 sopex/SOPEX/SOPEXConsole.m create mode 100644 sopex/SOPEX/SOPEXConstants.h create mode 100644 sopex/SOPEX/SOPEXConstants.m create mode 100644 sopex/SOPEX/SOPEXContentValidator.h create mode 100644 sopex/SOPEX/SOPEXContentValidator.m create mode 100644 sopex/SOPEX/SOPEXDocument.h create mode 100644 sopex/SOPEX/SOPEXDocument.m create mode 100644 sopex/SOPEX/SOPEXMain.h create mode 100644 sopex/SOPEX/SOPEXMain.m create mode 100644 sopex/SOPEX/SOPEXRangeUtilities.h create mode 100644 sopex/SOPEX/SOPEXRangeUtilities.m create mode 100644 sopex/SOPEX/SOPEXSNSController.h create mode 100644 sopex/SOPEX/SOPEXSNSController.m create mode 100644 sopex/SOPEX/SOPEXSheetRunner.h create mode 100644 sopex/SOPEX/SOPEXSheetRunner.m create mode 100644 sopex/SOPEX/SOPEXStatisticsController.h create mode 100644 sopex/SOPEX/SOPEXStatisticsController.m create mode 100644 sopex/SOPEX/SOPEXTextView.h create mode 100644 sopex/SOPEX/SOPEXTextView.m create mode 100644 sopex/SOPEX/SOPEXToolbarController.h create mode 100644 sopex/SOPEX/SOPEXToolbarController.m create mode 100644 sopex/SOPEX/SOPEXWODocument.h create mode 100644 sopex/SOPEX/SOPEXWODocument.m create mode 100644 sopex/SOPEX/SOPEXWOXDocument.h create mode 100644 sopex/SOPEX/SOPEXWOXDocument.m create mode 100644 sopex/SOPEX/SOPEXWebConnection.h create mode 100644 sopex/SOPEX/SOPEXWebConnection.m create mode 100644 sopex/SOPEX/SOPEXWebMetaParser.h create mode 100644 sopex/SOPEX/SOPEXWebMetaParser.m create mode 100644 sopex/SOPEX/SOPEX_Prefix.pch create mode 100644 sopex/SOPEX/Version create mode 100644 sopex/SOPEX/WebView+Ext.h create mode 100644 sopex/SOPEX/WebView+Ext.m create mode 100644 sopex/SOPEX/version.plist create mode 100644 sopex/Samples/ChangeLog create mode 100644 sopex/Samples/WOxExtTest/AlertPanel.m create mode 100644 sopex/Samples/WOxExtTest/AlertPanel.wox create mode 100644 sopex/Samples/WOxExtTest/Application.h create mode 100644 sopex/Samples/WOxExtTest/Application.m create mode 100644 sopex/Samples/WOxExtTest/Browser.m create mode 100644 sopex/Samples/WOxExtTest/Browser.wox create mode 100644 sopex/Samples/WOxExtTest/CalendarField.m create mode 100644 sopex/Samples/WOxExtTest/CalendarField.wox create mode 100644 sopex/Samples/WOxExtTest/CheckBoxMatrix.m create mode 100644 sopex/Samples/WOxExtTest/CheckBoxMatrix.wox create mode 100644 sopex/Samples/WOxExtTest/CollapsibleContent.m create mode 100644 sopex/Samples/WOxExtTest/CollapsibleContent.wox create mode 100644 sopex/Samples/WOxExtTest/CollapsibleContentExt.m create mode 100644 sopex/Samples/WOxExtTest/CollapsibleContentExt.wox create mode 100644 sopex/Samples/WOxExtTest/ConfirmPanel.m create mode 100644 sopex/Samples/WOxExtTest/ConfirmPanel.wox create mode 100644 sopex/Samples/WOxExtTest/DateField.m create mode 100644 sopex/Samples/WOxExtTest/DateField.wox create mode 100644 sopex/Samples/WOxExtTest/Dictionary.plist create mode 100644 sopex/Samples/WOxExtTest/DictionaryRepetition.m create mode 100644 sopex/Samples/WOxExtTest/DictionaryRepetition.wox create mode 100644 sopex/Samples/WOxExtTest/DirectAction.h create mode 100644 sopex/Samples/WOxExtTest/DirectAction.m create mode 100644 sopex/Samples/WOxExtTest/DnD.m create mode 100644 sopex/Samples/WOxExtTest/DnD.wox create mode 100644 sopex/Samples/WOxExtTest/English.lproj/InfoPlist.strings create mode 100644 sopex/Samples/WOxExtTest/Frame.m create mode 100644 sopex/Samples/WOxExtTest/Frame.wox create mode 100644 sopex/Samples/WOxExtTest/ImageFlyover.m create mode 100644 sopex/Samples/WOxExtTest/ImageFlyover.wox create mode 100644 sopex/Samples/WOxExtTest/Info.plist create mode 100644 sopex/Samples/WOxExtTest/KeyValueConditional.m create mode 100644 sopex/Samples/WOxExtTest/KeyValueConditional.wox create mode 100644 sopex/Samples/WOxExtTest/Lori.icns create mode 100644 sopex/Samples/WOxExtTest/Main.m create mode 100644 sopex/Samples/WOxExtTest/Main.wox create mode 100644 sopex/Samples/WOxExtTest/ModalWindow.m create mode 100644 sopex/Samples/WOxExtTest/ModalWindow.wox create mode 100644 sopex/Samples/WOxExtTest/MonthOverview.m create mode 100644 sopex/Samples/WOxExtTest/MonthOverview.wox create mode 100644 sopex/Samples/WOxExtTest/PageView.m create mode 100644 sopex/Samples/WOxExtTest/PageView.wox create mode 100644 sopex/Samples/WOxExtTest/QualifierConditional.m create mode 100644 sopex/Samples/WOxExtTest/QualifierConditional.wox create mode 100644 sopex/Samples/WOxExtTest/README create mode 100644 sopex/Samples/WOxExtTest/RadioButtonMatrix.m create mode 100644 sopex/Samples/WOxExtTest/RadioButtonMatrix.wox create mode 100644 sopex/Samples/WOxExtTest/RichString.m create mode 100644 sopex/Samples/WOxExtTest/RichString.wox create mode 100644 sopex/Samples/WOxExtTest/Session.h create mode 100644 sopex/Samples/WOxExtTest/Session.m create mode 100644 sopex/Samples/WOxExtTest/ShiftClick.m create mode 100644 sopex/Samples/WOxExtTest/ShiftClick.wox create mode 100644 sopex/Samples/WOxExtTest/Switch.m create mode 100644 sopex/Samples/WOxExtTest/Switch.wox create mode 100644 sopex/Samples/WOxExtTest/TabPanel.m create mode 100644 sopex/Samples/WOxExtTest/TabPanel.wox create mode 100644 sopex/Samples/WOxExtTest/TabView.m create mode 100644 sopex/Samples/WOxExtTest/TabView.wox create mode 100644 sopex/Samples/WOxExtTest/Table.m create mode 100644 sopex/Samples/WOxExtTest/Table.wox create mode 100644 sopex/Samples/WOxExtTest/TableMatrix.m create mode 100644 sopex/Samples/WOxExtTest/TableMatrix.wox create mode 100644 sopex/Samples/WOxExtTest/TableView.m create mode 100644 sopex/Samples/WOxExtTest/TableView.plist create mode 100644 sopex/Samples/WOxExtTest/TableView.wox create mode 100644 sopex/Samples/WOxExtTest/TextFlyover.m create mode 100644 sopex/Samples/WOxExtTest/TextFlyover.wox create mode 100644 sopex/Samples/WOxExtTest/ThresholdColoredNumber.m create mode 100644 sopex/Samples/WOxExtTest/ThresholdColoredNumber.wox create mode 100644 sopex/Samples/WOxExtTest/TimeField.m create mode 100644 sopex/Samples/WOxExtTest/TimeField.wox create mode 100644 sopex/Samples/WOxExtTest/TreeView.m create mode 100644 sopex/Samples/WOxExtTest/TreeView.plist create mode 100644 sopex/Samples/WOxExtTest/TreeView.wox create mode 100644 sopex/Samples/WOxExtTest/ValidatedField.m create mode 100644 sopex/Samples/WOxExtTest/ValidatedField.wox create mode 100644 sopex/Samples/WOxExtTest/VarString.wox create mode 100644 sopex/Samples/WOxExtTest/WOExtTest.xcode/project.pbxproj create mode 100644 sopex/Samples/WOxExtTest/WOExtTest_Prefix.pch create mode 100644 sopex/Samples/WOxExtTest/WOExtTest_main.m create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/OGoLogo.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/collapsed.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/corner_left.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/corner_right.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/downward_sorted.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/expanded.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/favicon.ico create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/first.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/first_blind.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/folder_closed.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/folder_opened.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/last.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/last_blind.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/menu_email.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/menu_email_inactive.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/next.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/next_blind.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/non_sorted.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/previous.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/previous_blind.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/site.css create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_left.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_news.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_news_left.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_news_selected.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_persons.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_persons_left.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_persons_selected.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_projects.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_projects_left.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_projects_selected.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/tab_selected.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_corner.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_corner_minus.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_corner_plus.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_junction.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_leaf.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_leaf_corner.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_line.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_minus.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_plus.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/treeview_space.gif create mode 100644 sopex/Samples/WOxExtTest/WebServerResources/upward_sorted.gif create mode 100644 sopex/Samples/WOxExtTest/WeekColumnView.m create mode 100644 sopex/Samples/WOxExtTest/WeekColumnView.wox create mode 100644 sopex/Samples/WOxExtTest/WeekOverview.m create mode 100644 sopex/Samples/WOxExtTest/WeekOverview.wox create mode 100644 sopex/Samples/WOxExtTest/appointments.plist create mode 100644 sopex/Samples/WOxExtTest/common.h create mode 100644 sopex/Samples/WOxExtTest/version.plist create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Application.h create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Application.m create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/COPYING create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/COPYRIGHT create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/ChangeLog create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/DirectAction.h create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/DirectAction.m create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/English.lproj/InfoPlist.strings create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/GNUmakefile create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/GNUmakefile.postamble create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/GNUmakefile.preamble create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Info.plist create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Lori.icns create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Main.h create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Main.m create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Main.wo/Main.html create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Main.wo/Main.wod create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/NOTES create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/PROJECTLEAD create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/README create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Session.h create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Session.m create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/TODO create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/Version create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/WebApp.xcode/TemplateInfo.plist create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/WebApp.xcode/project.pbxproj create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/WebApp_Prefix.pch create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/WebApp_main.m create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/WebServerResources/favicon.ico create mode 100644 sopex/Templates/Project Templates/SOPE/Web Application/version.plist create mode 100644 sopex/WebObjects/COPYING create mode 100644 sopex/WebObjects/COPYRIGHT create mode 100644 sopex/WebObjects/ChangeLog create mode 100644 sopex/WebObjects/English.lproj/InfoPlist.strings create mode 100644 sopex/WebObjects/GNUmakefile create mode 100644 sopex/WebObjects/INSTALL create mode 100644 sopex/WebObjects/Info.plist create mode 100644 sopex/WebObjects/PROJECTLEAD create mode 100644 sopex/WebObjects/README create mode 100644 sopex/WebObjects/WebObjects.h create mode 100644 sopex/WebObjects/WebObjects.xcode/project.pbxproj create mode 100644 sopex/WebObjects/WebObjects_Prefix.pch create mode 100644 sopex/WebObjects/main.c create mode 100644 sopex/WebObjects/version.plist diff --git a/README b/README index f9b569d8..1fa35788 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -# $Id$ +// TODO: update for new SOPE 3.3 structure SKYRiX Object Publishing Environment ==================================== @@ -15,8 +15,8 @@ server isn't blocked by IO of slow connections ! (this eliminates the need for threading because of IO, the Apache server pool runs the blocking IO operations) -SKYRiX Libraries for XML Processing (skyrix-xml) -================================================ +SKYRiX Libraries for XML Processing (sope-xml) +============================================== The package contains: - a SAX2 Implementation for Objective-C @@ -25,10 +25,10 @@ The package contains: - DOM on top of SaxObjC - an XML-RPC implementation (without the transport layer) -SKYRiX Core Libraries (skyrix-core) -=================================== +SKYRiX Core Libraries (sope-core) +================================= -The SKYRiX Core libraries (skyrix-core) contain: +The SKYRiX Core libraries (sope-core) contain: - various Foundation extensions - a java.io like stream and socket library - classes for processing MIME entities diff --git a/sope-appserver/GNUmakefile b/sope-appserver/GNUmakefile index 3dbef8bb..1a09a823 100644 --- a/sope-appserver/GNUmakefile +++ b/sope-appserver/GNUmakefile @@ -2,14 +2,14 @@ include $(GNUSTEP_MAKEFILES)/common.make +PACKAGE_NAME=sope-appserver +VERSION=4.3.0 + SUBPROJECTS += \ NGScripting \ - NGJavaScript \ NGObjWeb \ - SxComponents \ WEExtensions \ WOExtensions \ - NGObjDOM \ WOXML \ -include $(GNUSTEP_MAKEFILES)/GNUmakefile.preamble diff --git a/sope-appserver/NGScripting/NGObjectMappingContext.h b/sope-appserver/NGScripting/NGObjectMappingContext.h index e9e72f77..96519641 100644 --- a/sope-appserver/NGScripting/NGObjectMappingContext.h +++ b/sope-appserver/NGScripting/NGObjectMappingContext.h @@ -1,7 +1,7 @@ /* - Copyright (C) 2000-2003 SKYRIX Software AG + Copyright (C) 2000-2004 SKYRIX Software AG - This file is part of OGo + This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the diff --git a/sope-appserver/NGScripting/NGObjectMappingContext.m b/sope-appserver/NGScripting/NGObjectMappingContext.m index 4ccd0e86..81f0fb9b 100644 --- a/sope-appserver/NGScripting/NGObjectMappingContext.m +++ b/sope-appserver/NGScripting/NGObjectMappingContext.m @@ -1,7 +1,7 @@ /* - Copyright (C) 2000-2003 SKYRIX Software AG + Copyright (C) 2000-2004 SKYRIX Software AG - This file is part of OGo + This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the diff --git a/sope-appserver/NGScripting/NGScriptLanguage.h b/sope-appserver/NGScripting/NGScriptLanguage.h index 8711f824..f11db1ae 100644 --- a/sope-appserver/NGScripting/NGScriptLanguage.h +++ b/sope-appserver/NGScripting/NGScriptLanguage.h @@ -1,7 +1,7 @@ /* - Copyright (C) 2000-2003 SKYRIX Software AG + Copyright (C) 2000-2004 SKYRIX Software AG - This file is part of OGo + This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the diff --git a/sope-appserver/NGScripting/NGScriptLanguage.m b/sope-appserver/NGScripting/NGScriptLanguage.m index 7600c92d..0b708e62 100644 --- a/sope-appserver/NGScripting/NGScriptLanguage.m +++ b/sope-appserver/NGScripting/NGScriptLanguage.m @@ -1,7 +1,7 @@ /* - Copyright (C) 2000-2003 SKYRIX Software AG + Copyright (C) 2000-2004 SKYRIX Software AG - This file is part of OGo + This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the diff --git a/sope-appserver/NGScripting/NSObject+Scripting.h b/sope-appserver/NGScripting/NSObject+Scripting.h index 020aa312..0084d37d 100644 --- a/sope-appserver/NGScripting/NSObject+Scripting.h +++ b/sope-appserver/NGScripting/NSObject+Scripting.h @@ -1,7 +1,7 @@ /* - Copyright (C) 2000-2003 SKYRIX Software AG + Copyright (C) 2000-2004 SKYRIX Software AG - This file is part of OGo + This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the diff --git a/sope-appserver/NGScripting/NSObject+Scripting.m b/sope-appserver/NGScripting/NSObject+Scripting.m index ec3a95bc..ac13c131 100644 --- a/sope-appserver/NGScripting/NSObject+Scripting.m +++ b/sope-appserver/NGScripting/NSObject+Scripting.m @@ -1,7 +1,7 @@ /* - Copyright (C) 2000-2003 SKYRIX Software AG + Copyright (C) 2000-2004 SKYRIX Software AG - This file is part of OGo + This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the diff --git a/sope-ical/README-OSX.txt b/sope-ical/README-OSX.txt new file mode 100644 index 00000000..3bb39980 --- /dev/null +++ b/sope-ical/README-OSX.txt @@ -0,0 +1,133 @@ +# $Id: README-OSX.txt 4 2004-08-20 17:04:31Z helge $ + +Building Notes +============== + +Prerequisites: +- Apple Developer Tools +- sope-xml +- sope-core + +There are two ways to build SOPE on MacOSX, either using the gnustep-make +package or as native Xcode projects. The first option is usually used when +you build SOPE for use with OGo, while the latter is more appropriate for +SOPE:X applications. + +Building using gstep-make: +========================== + +First install gnustep-make (eg v1.8), then ensure that GNUstep.sh is properly +sources. For the build just enter: + make -s install +or + make -s debug=yes install +if you build with debug informations. + +Building using Xcode: +===================== + +The Xcode build comes in two variants, one for development and the other for +deployment. + + +Development +----------- +Development usually means you're happily hacking away at your pet +projects and sometimes want to update the SOPE frameworks. For this purpose +use the "all" target and the accompanied "Development" build style. Later, +you can narrow the target down to something more specific. For development we +assume the destination for frameworks to be /Library/Frameworks. Once you are +done building all the frameworks the loader commands of the frameworks will +have that destination path built in. In order to use the frameworks you either +have to install them (by copying them manually to their destination) or to +prepare symlinks from /Library/Frameworks to the place where the built products +are. I usually build everything in a central place (i.e. /Local/BuildArea) and +have symlinks from /Library/Frameworks to /Local/BuildArea for each of the +products. + +Also the following products are expected to be in the following locations: +*.sax -> /Library/SaxDrivers +*.sxp -> /Library/SoProducts + +Either copy them to the appropriate places or symlink them (my suggestion). + + +Deployment +---------- +Deployment in our terms means you want to copy all required SOPE products into +an application's app wrapper. For this step all frameworks need to be built in +a special fashion, as the "install_name" of the frameworks needs to be prepared +to point to a relative path in the app wrapper. The situation is even more +complicated as all frameworks during linking store the "install names" of other +frameworks in their mach loader commands. In order for this step not to break +we need to set up an environment which is clearly separated from the +Development environment. I chose to use $(USER_LIBRARY_DIR)/EmbeddedFrameworks +as the default destination for these builds. In order for your application to +easily pick up the built products and copy them into its app wrapper this +location needs to be fixed and easily accessible. Note that on my system +~/Library/EmbeddedFrameworks is a symlink to /Library/EmbeddedFrameworks so +even if you don't like the location at all it's very easy to point it to +somewhere else. As soon as you have set this up you can use the +"Wrapper Contents" target with the accompanied "Wrapper" build style to build +all wrapper contents in the appropriate fashion. When you're done you can copy +all the wrapper products into your application's wrapper. The expected +destination is the "Frameworks" directory in the wrappers "Contents" directory. +For a complete list of what you need to copy into your application's wrapper +see the "Direct Dependencies" of all "Wrapper Contents" targets in all SOPE +related projects. At the time of this writing the complete list for SOPE +consisted of the following: + +SxXML + SaxObjC.framework + DOM.framework + XmlRpc.framework + +SxCore + EOControl.framework + NGExtensions.framework + NGStreams.framework + NGMime.framework + NGImap4.framework + NGLdap.framework + NGMail.framework + NGiCal.framework + + +Note: "A word on umbrellas" + The general idea of umbrellas is to make life easier by providing a cover + for linking. In an ideal world we would provide a SOPE umbrella (we + actually do that) and you just link against that and forget about the + complete list. However, with the "Wrapper" style things do not work that + way. Because the "install name"s of all frameworks are relative paths, + during linking the mach dyld cannot find the dependend frameworks + (because the path isn't absolute) and thus symbol checking fails. This + directly leads to prebinding to fail which we really don't want since we + have such a huge dependency tree and prebinding escpecially in our case + speeds up loading significantly. So, umbrellas do not really help with + "Wrapper" products - in fact they just add to the overall dependency + graph without providing any benefit. With the notable exception of the + "Development" build style umbrellas are totally useless. If you're + not planning to do a "Wrapper" deployment you might be happy to have + the umbrellas, however, that's why they are still here. + +Note: You cannot use the -buildAllTargets commandline argument for Xcode, + because the Xcode projects also contain a target to build in the + gstep-make environment (called GSM:all) + + +Prebinding Notes +================ + +General technical information about prebinding is available from Apple at +http://developer.apple.com/documentation/Performance/Conceptual/LaunchTime/Tasks/Prebinding.html#//apple_ref/doc/uid/20001858. + +OGo frameworks currently use the range from 0xC0000000 to 0xCFFFFFFF. + +Any questions and feedback regarding our use of this range should go to +Marcus Müller . + + +SxCore: 0xC1000000 - 0xC2FFFFFF +=============================== + +0xC1E00000 NGiCal diff --git a/sope-ldap/README-OSX.txt b/sope-ldap/README-OSX.txt new file mode 100644 index 00000000..08cd417e --- /dev/null +++ b/sope-ldap/README-OSX.txt @@ -0,0 +1,133 @@ +# $Id: README-OSX.txt 4 2004-08-20 17:04:31Z helge $ + +Building Notes +============== + +Prerequisites: +- Apple Developer Tools +- sope-xml +- sope-core + +There are two ways to build SOPE on MacOSX, either using the gnustep-make +package or as native Xcode projects. The first option is usually used when +you build SOPE for use with OGo, while the latter is more appropriate for +SOPE:X applications. + +Building using gstep-make: +========================== + +First install gnustep-make (eg v1.8), then ensure that GNUstep.sh is properly +sources. For the build just enter: + make -s install +or + make -s debug=yes install +if you build with debug informations. + +Building using Xcode: +===================== + +The Xcode build comes in two variants, one for development and the other for +deployment. + + +Development +----------- +Development usually means you're happily hacking away at your pet +projects and sometimes want to update the SOPE frameworks. For this purpose +use the "all" target and the accompanied "Development" build style. Later, +you can narrow the target down to something more specific. For development we +assume the destination for frameworks to be /Library/Frameworks. Once you are +done building all the frameworks the loader commands of the frameworks will +have that destination path built in. In order to use the frameworks you either +have to install them (by copying them manually to their destination) or to +prepare symlinks from /Library/Frameworks to the place where the built products +are. I usually build everything in a central place (i.e. /Local/BuildArea) and +have symlinks from /Library/Frameworks to /Local/BuildArea for each of the +products. + +Also the following products are expected to be in the following locations: +*.sax -> /Library/SaxDrivers +*.sxp -> /Library/SoProducts + +Either copy them to the appropriate places or symlink them (my suggestion). + + +Deployment +---------- +Deployment in our terms means you want to copy all required SOPE products into +an application's app wrapper. For this step all frameworks need to be built in +a special fashion, as the "install_name" of the frameworks needs to be prepared +to point to a relative path in the app wrapper. The situation is even more +complicated as all frameworks during linking store the "install names" of other +frameworks in their mach loader commands. In order for this step not to break +we need to set up an environment which is clearly separated from the +Development environment. I chose to use $(USER_LIBRARY_DIR)/EmbeddedFrameworks +as the default destination for these builds. In order for your application to +easily pick up the built products and copy them into its app wrapper this +location needs to be fixed and easily accessible. Note that on my system +~/Library/EmbeddedFrameworks is a symlink to /Library/EmbeddedFrameworks so +even if you don't like the location at all it's very easy to point it to +somewhere else. As soon as you have set this up you can use the +"Wrapper Contents" target with the accompanied "Wrapper" build style to build +all wrapper contents in the appropriate fashion. When you're done you can copy +all the wrapper products into your application's wrapper. The expected +destination is the "Frameworks" directory in the wrappers "Contents" directory. +For a complete list of what you need to copy into your application's wrapper +see the "Direct Dependencies" of all "Wrapper Contents" targets in all SOPE +related projects. At the time of this writing the complete list for SOPE +consisted of the following: + +SxXML + SaxObjC.framework + DOM.framework + XmlRpc.framework + +SxCore + EOControl.framework + NGExtensions.framework + NGStreams.framework + NGMime.framework + NGImap4.framework + NGLdap.framework + NGMail.framework + NGiCal.framework + + +Note: "A word on umbrellas" + The general idea of umbrellas is to make life easier by providing a cover + for linking. In an ideal world we would provide a SOPE umbrella (we + actually do that) and you just link against that and forget about the + complete list. However, with the "Wrapper" style things do not work that + way. Because the "install name"s of all frameworks are relative paths, + during linking the mach dyld cannot find the dependend frameworks + (because the path isn't absolute) and thus symbol checking fails. This + directly leads to prebinding to fail which we really don't want since we + have such a huge dependency tree and prebinding escpecially in our case + speeds up loading significantly. So, umbrellas do not really help with + "Wrapper" products - in fact they just add to the overall dependency + graph without providing any benefit. With the notable exception of the + "Development" build style umbrellas are totally useless. If you're + not planning to do a "Wrapper" deployment you might be happy to have + the umbrellas, however, that's why they are still here. + +Note: You cannot use the -buildAllTargets commandline argument for Xcode, + because the Xcode projects also contain a target to build in the + gstep-make environment (called GSM:all) + + +Prebinding Notes +================ + +General technical information about prebinding is available from Apple at +http://developer.apple.com/documentation/Performance/Conceptual/LaunchTime/Tasks/Prebinding.html#//apple_ref/doc/uid/20001858. + +OGo frameworks currently use the range from 0xC0000000 to 0xCFFFFFFF. + +Any questions and feedback regarding our use of this range should go to +Marcus Müller . + + +SxCore: 0xC1000000 - 0xC2FFFFFF +=============================== + +0xC1C00000 NGLdap diff --git a/sope-mime/README-OSX.txt b/sope-mime/README-OSX.txt new file mode 100644 index 00000000..fc837fdf --- /dev/null +++ b/sope-mime/README-OSX.txt @@ -0,0 +1,135 @@ +# $Id: README-OSX.txt 4 2004-08-20 17:04:31Z helge $ + +Building Notes +============== + +Prerequisites: +- Apple Developer Tools +- sope-xml +- sope-core + +There are two ways to build SOPE on MacOSX, either using the gnustep-make +package or as native Xcode projects. The first option is usually used when +you build SOPE for use with OGo, while the latter is more appropriate for +SOPE:X applications. + +Building using gstep-make: +========================== + +First install gnustep-make (eg v1.8), then ensure that GNUstep.sh is properly +sources. For the build just enter: + make -s install +or + make -s debug=yes install +if you build with debug informations. + +Building using Xcode: +===================== + +The Xcode build comes in two variants, one for development and the other for +deployment. + + +Development +----------- +Development usually means you're happily hacking away at your pet +projects and sometimes want to update the SOPE frameworks. For this purpose +use the "all" target and the accompanied "Development" build style. Later, +you can narrow the target down to something more specific. For development we +assume the destination for frameworks to be /Library/Frameworks. Once you are +done building all the frameworks the loader commands of the frameworks will +have that destination path built in. In order to use the frameworks you either +have to install them (by copying them manually to their destination) or to +prepare symlinks from /Library/Frameworks to the place where the built products +are. I usually build everything in a central place (i.e. /Local/BuildArea) and +have symlinks from /Library/Frameworks to /Local/BuildArea for each of the +products. + +Also the following products are expected to be in the following locations: +*.sax -> /Library/SaxDrivers +*.sxp -> /Library/SoProducts + +Either copy them to the appropriate places or symlink them (my suggestion). + + +Deployment +---------- +Deployment in our terms means you want to copy all required SOPE products into +an application's app wrapper. For this step all frameworks need to be built in +a special fashion, as the "install_name" of the frameworks needs to be prepared +to point to a relative path in the app wrapper. The situation is even more +complicated as all frameworks during linking store the "install names" of other +frameworks in their mach loader commands. In order for this step not to break +we need to set up an environment which is clearly separated from the +Development environment. I chose to use $(USER_LIBRARY_DIR)/EmbeddedFrameworks +as the default destination for these builds. In order for your application to +easily pick up the built products and copy them into its app wrapper this +location needs to be fixed and easily accessible. Note that on my system +~/Library/EmbeddedFrameworks is a symlink to /Library/EmbeddedFrameworks so +even if you don't like the location at all it's very easy to point it to +somewhere else. As soon as you have set this up you can use the +"Wrapper Contents" target with the accompanied "Wrapper" build style to build +all wrapper contents in the appropriate fashion. When you're done you can copy +all the wrapper products into your application's wrapper. The expected +destination is the "Frameworks" directory in the wrappers "Contents" directory. +For a complete list of what you need to copy into your application's wrapper +see the "Direct Dependencies" of all "Wrapper Contents" targets in all SOPE +related projects. At the time of this writing the complete list for SOPE +consisted of the following: + +SxXML + SaxObjC.framework + DOM.framework + XmlRpc.framework + +SxCore + EOControl.framework + NGExtensions.framework + NGStreams.framework + NGMime.framework + NGImap4.framework + NGLdap.framework + NGMail.framework + NGiCal.framework + + +Note: "A word on umbrellas" + The general idea of umbrellas is to make life easier by providing a cover + for linking. In an ideal world we would provide a SOPE umbrella (we + actually do that) and you just link against that and forget about the + complete list. However, with the "Wrapper" style things do not work that + way. Because the "install name"s of all frameworks are relative paths, + during linking the mach dyld cannot find the dependend frameworks + (because the path isn't absolute) and thus symbol checking fails. This + directly leads to prebinding to fail which we really don't want since we + have such a huge dependency tree and prebinding escpecially in our case + speeds up loading significantly. So, umbrellas do not really help with + "Wrapper" products - in fact they just add to the overall dependency + graph without providing any benefit. With the notable exception of the + "Development" build style umbrellas are totally useless. If you're + not planning to do a "Wrapper" deployment you might be happy to have + the umbrellas, however, that's why they are still here. + +Note: You cannot use the -buildAllTargets commandline argument for Xcode, + because the Xcode projects also contain a target to build in the + gstep-make environment (called GSM:all) + + +Prebinding Notes +================ + +General technical information about prebinding is available from Apple at +http://developer.apple.com/documentation/Performance/Conceptual/LaunchTime/Tasks/Prebinding.html#//apple_ref/doc/uid/20001858. + +OGo frameworks currently use the range from 0xC0000000 to 0xCFFFFFFF. + +Any questions and feedback regarding our use of this range should go to +Marcus Müller . + + +SxCore: 0xC1000000 - 0xC2FFFFFF +=============================== + +0xC1600000 NGImap4 [not available with gstep-make] +0xC1800000 NGMail [not available with gstep-make] +0xC1A00000 NGMime [used as base in gstep-make] diff --git a/sopex/COPYING b/sopex/COPYING new file mode 100644 index 00000000..161a3d1d --- /dev/null +++ b/sopex/COPYING @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/sopex/COPYRIGHT b/sopex/COPYRIGHT new file mode 100644 index 00000000..1160c91d --- /dev/null +++ b/sopex/COPYRIGHT @@ -0,0 +1,3 @@ +Copyright (C) 2004 OpenGroupware.org + +Contact: info@opengroupware.org diff --git a/sopex/ChangeLog b/sopex/ChangeLog new file mode 100644 index 00000000..3d8ed6af --- /dev/null +++ b/sopex/ChangeLog @@ -0,0 +1,9 @@ +2004-08-20 Helge Hess + + * moved sopex from OGo/Contrib to SOPE/sopex + + * moved in WebObjects compatibility layer + +2004-02-16 Marcus Mueller + + * ChangeLog: created. diff --git a/sopex/PROJECTLEAD b/sopex/PROJECTLEAD new file mode 100644 index 00000000..2e60ed5f --- /dev/null +++ b/sopex/PROJECTLEAD @@ -0,0 +1,3 @@ +# $Id: PROJECTLEAD 1 2004-08-20 11:17:52Z znek $ + +PROJECTLEAD=znek@mulle-kybernetik.com diff --git a/sopex/README b/sopex/README new file mode 100644 index 00000000..c0662072 --- /dev/null +++ b/sopex/README @@ -0,0 +1,23 @@ +# $Id: README 1 2004-08-20 11:17:52Z znek $ + + +SKYRIX Object Publishing Evironment on mac os X +=============================================== + +This directory contains SOPEX, a Mac OS X framework and accompanied +tools for running and developing SOPE applications on the Mac OS X +Desktop using Apple's XCode. + + +SOPEX +===== + +A framework used for launching SOPE applications directly from the +Mac OS X Desktop (self-hosting web applications). + + +Templates +========= + +XCode project template and several file templates. + diff --git a/sopex/README-WebObjects b/sopex/README-WebObjects new file mode 100644 index 00000000..013d089a --- /dev/null +++ b/sopex/README-WebObjects @@ -0,0 +1,13 @@ +# $Id: README 1 2004-08-20 11:17:52Z znek $ + +WebObjects +========== + +This directory contains resources for making SOPE compatible with +Apple's discontinued WebObjects 4.51 release. + + +WebObjects +========== + +An umbrella framework for linking your old legacy projects against. diff --git a/sopex/SOPEX/COPYING b/sopex/SOPEX/COPYING new file mode 100644 index 00000000..161a3d1d --- /dev/null +++ b/sopex/SOPEX/COPYING @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/sopex/SOPEX/COPYRIGHT b/sopex/SOPEX/COPYRIGHT new file mode 100644 index 00000000..1160c91d --- /dev/null +++ b/sopex/SOPEX/COPYRIGHT @@ -0,0 +1,3 @@ +Copyright (C) 2004 OpenGroupware.org + +Contact: info@opengroupware.org diff --git a/sopex/SOPEX/ChangeLog b/sopex/SOPEX/ChangeLog new file mode 100644 index 00000000..58b2659a --- /dev/null +++ b/sopex/SOPEX/ChangeLog @@ -0,0 +1,207 @@ +2004-06-05 Marcus Mueller + + * v1.0.9 + + * SOPEX.h: exports nearly all headers now, suitable for real AppKit + apps constructed from a SOPE:X app that need to subclass from + SOPE:X classes + + * SOPEXAppController.[hm]: exposed -(BOOL)isInRADMode and added + - (void)appendToDaemonLaunchArguments:(NSMutableArray *)_args; for + subclassers to append custom launch arguments to the daemon + process. + + * SOPEX.xcode: modified visibility of most headers to be public instead + of project. + +2004-05-02 Marcus Mueller + + * v1.0.8 + + * Version: changed to 1.0.8. Added comment for MacOSX explaining + /Developer/Tools/agvtool to set version on MacOSX properly. + + * *.[hm]: changed all relevant #include statements into #import + statements, as #import now officially has been undeprecated from + FSF gcc. + + * NSBundle+Ext.[hm]: New category on NSBundle to ease resource lookup + in SOPE:X. + + * English.lproj/Localizable.strings: English localization template, + sporting fancy unicode characters. + + * SOPEXAppController.m: rewrote some document management code which now + defaults to better integration with SoApplication based apps. Also + rewrote bundle handling - properly works now in development and + deployment modes. + + * SOPEXWebConnection.m: fixed resource lookup. Uses NSBundle+Ext now. + + * SOPEX_Prefix.pch: redefined NSLocalizedString macro in a way it works + with SOPE:X out of the box. + + * SOPEXBrowserWindow.m: experimental support for setting the favicon + in the window's title bar similar to NSDocumentController managed + applications. However, this support is questionable in itself and + I'm probably dropping it altogether in an upcoming release. The code + is currently left as an exercise only. + +2004-04-09 Marcus Mueller + + * v1.0.7 + + * SOPEXContentValidator.[hm]: New (concrete) class implementing all + necessary validation for SOPE:X. The WOHTML validation could be a + bit smarter, though. + + * SOPEXWODocument.m: Implemented validation. + + * SOPEXWOXDocument.m: Implemented validation. + + * SOPEXDocument.[hm]: Removed SOPEXDocumentErrorDomain declaration. + + * SOPEXTextView.m: Fixed -adjustStatusField. + + * README: Updated TODO section + +2004-04-01 Marcus Mueller + + * v1.0.6 + + * SOPEXSheetRunner.[hm]: Cover for running sheets in a synchronous way, + similar to NSRunAlertPanel() - but only for sheets. + + * SOPEXTextView.[hm]: Subclass of NSTextView being able to indicate + errors via auxiliary NSTextField. + + * SOPEXDocument.[hm]: Documents are now the delegates of the TextViews + representing the documents, thus appropriate functionality is + provided by SOPEXDocument as of now (selection management, + undoManager, etc.). Also, implemented the validation API. + + * SOPEXWODocument.m: Added code for selection management. + + * SOPEXWOXDocument.[hm]: Added code for selection management, also + added some validation code (just for testing purposes).sudo + + * SOPEXAppController.[hm]: Added code for properly discovering RAD + mode - will now remove certain functionality when in deployment. + Removed code dealing with change management (now in SOPEXDocument), + implemented new validation API. Also, added alert sheets when + unsaved changes are about to be discarded. This does work correctly + now. + + * README: Updated TODO section + +2004-03-26 Marcus Mueller + + * v1.0.5 + + * Introduced a new document architecture. Instead of subclassing from + NSDocument, this is written from scratch. The NSDocument + architecture does something different (though not completely) than + what we needed here, so this is pretty much specialised on our + needs. I felt that NSDocument didn't fit in too well - also, it + felt rather oversized for our purpose. I didn't want to introduce + window controllers since we really don't have a need for that. + + * SOPEXDocument.[hm]: Abstract superclass for documents in SOPEX. + + * SOPEXWOXDocument.[hm]: A .wox document wrapper. Please note that + encoding is done wrong here! This needs to be addressed in a later + version. For the time being, NSUTF8StringEncoding is assumed as + the default encoding. + + * SOPEXWODocument.[hm]: A .wo document wrapper. Encoding is also + broken, see SOPEXWOXDocument comment. + + * SOPEXRangeUtilities.[hm]: Functions for intelligently handling + selections in NSTextViews. Intelligently for the time being means + selecting to matching HTML tags (yes!). However, this is still + incomplete and the algorithm is more or less optimized for speed + than for formal correctness - however it works pretty well in + real life szenarios (famous last words ;-). + + * SOPEXBrowserWindow.[hm]: Toyed a bit with setting the favIcon into + the window's title bar, but haven't found out how to do that + correctly, yet. + + * SOPEXAppController.[hm]: Changed to use the new document + architecture. + Added revertDocumentToSaved: and editInXcode: + Added delegate code for proper selection handling, uses + SOPEXRangeUtilities (no surprise here). + +2004-03-22 Marcus Mueller + + * v1.0.4 + + * README: Explained some debugging issues. + + * SOPEXWebConnection.[hm]: Fixed resource loading issue. Images are + now (correctly) loaded by the wrapper app. This directly results in + much better throughput/performance. + + * SOPEXAppController.[hm]: Added WOPort default, see README for usage. + Added several new views. User visible changes are a new HTTP header + view and source views for .wox and .wo components. The source + views aren't complete, yet. + + * SOPEXSNSController.m: Added SNSPort default, see README for usage. + + * SOPEXBrowserWindow.[hm]: New NSWindow subclass, SHOULD add some + fancy extensions in the near future. + + * NSString+Ext.[hm]: Extensions that later might go into SxCore. + + * WebView+Ext.[hm]: Extensions to WebView from WebKit. + + +2004-03-11 Marcus Mueller + + * v1.0.3 + + * SOPEXAppController.[hm]: added Source view. Fast switching + between application and source view possible via Apple-1 and Apple-2. + +2004-03-10 Marcus Mueller + + * v1.0.2 + + * SOPEXAppController.[hm]: added status bar with some nifty infos, + removed toolbar due to some very strange problems (toggle toolbar + in "Tools" menu to see what I mean). Added "Navigation" menu for + browser navigation support. Also added "View" menu which is intended + for switching between different views (source code, structure, etc.). + The general idea is to have an integrated editor somewhen. + + * SOPEXToolbarController.[hm]: added caching of items as proposed in + Apple's dox and implemented selectableItems. + + * SOPEXApplication.m: moved loading of Main NIB from -(id)init + to -(void)finishLaunching in order to avoid problems with certain + widgets' initialization methods. + +2004-03-09 Marcus Mueller + + * v1.0.1 + + * SOPEXAppController.[hm]: Cosmetic changes, clear: console support + + * SOPEXConsole.toolbar: Toolbar definition for console + + * SOPEXConsole.[hm]: Added clear: functionality, utilizes toolbar + +2004-02-27 Helge Hess + + * SOPEXAppController.m: disabled some logs + + * SOPEXMain.m: properly use ".sopex" instead of "sopex" in the + bundle suffix + + * SOPEXWebUI.toolbar: removed some unnecessary things + +2004-02-16 Marcus Mueller + + * ChangeLog: created. diff --git a/sopex/SOPEX/Clean.tiff b/sopex/SOPEX/Clean.tiff new file mode 100644 index 0000000000000000000000000000000000000000..d2b13df3a8a771d6e679f56a4d52b7d473c764d7 GIT binary patch literal 16648 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 avi|P^@_V$2Mn!7~45-j1`e+%#@c1`&<0!}g literal 0 HcmV?d00001 diff --git a/sopex/SOPEX/English.lproj/InfoPlist.strings b/sopex/SOPEX/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..a2360e083dab266d2b4945b28d7aeb74d78d0e86 GIT binary patch literal 516 zcmbu5QA@&L7=@o}f5qs^B+R6{=q4!(M5RG=yK=55w=p%*A8$TxU>NHv#&+Jl-}%ma z&b$5QoE8BCGG2-Jo$4GpR=(0A$wi2T52|Ydfait zQuah%%uxNA7;x=-Ldb|Qw>(>4)$l{!oKmR%bmSzoQ|KxsIcQzzrt^nR-`k6W>$=-N zPJX8jsFcr~)YDCF#{KL>Z~N3uw{|Lao!;TnY9uGtTVGyg`ka-y3w!M{O(Ir#hi>3r a#?14SM;Vcuig+ovRX45LTiwY&eCzF literal 0 HcmV?d00001 diff --git a/sopex/SOPEX/English.lproj/Localizable.strings b/sopex/SOPEX/English.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..f3661e8d4943b569729ebdfde1a6903ecaf86895 GIT binary patch literal 1696 zcmdT_%SyvQ6g}(yfxE$F5nnqI5wRN=;zE~hQronJkVqaze_lQ3PKKnhQY?WYrNhjf zd*|He$>$eNFoweeN-Qx)&ixb>PbD&>Je8Ebb9IO*(Y@Dnh>)0t?h3P>o8Fjjj&O)u zYNU9fPQsJJ75{zdB{fHl4^LRpUT-=g#ay=`)rKlBYucum(XQr6-eim-p~TUHgr~yZ z^|48|H18Ia7SxFtnQ#kYuBe}IpVG?57U7MzdMm^>;hn>Wp$J`(N>^FaE8gNKj=v9a z6=t7Xj-;CrLtad|`fTeI{8xkvTz7K0UoVELU1haVXN5efB0f{EtV?G3@%jIc^;?f& zzg7Irmu@X@*!`ONoc$KrZa7X*$EJAZufjP_afS;bv=h_vglW2i-fh> z&KVUw36tu1VlyX1oJX-qJKvg5*RYDDffeqIwE`>5w#0fwORuZm?=zAZ&GXPY+Hq(8 iH{kU$wmU{Q(-X!Uvlqmuig&0l#ACygZPi + + + + IBDocumentLocation + 69 45 356 241 0 0 1152 848 + IBFramework Version + 362.0 + IBOldestOS + 2 + IBOpenObjects + + 6 + + IBSystem Version + 7D24 + IBUsesTextArchiving + + + diff --git a/sopex/SOPEX/English.lproj/SOPEXConsole.nib/keyedobjects.nib b/sopex/SOPEX/English.lproj/SOPEXConsole.nib/keyedobjects.nib new file mode 100644 index 00000000..47b586d7 --- /dev/null +++ b/sopex/SOPEX/English.lproj/SOPEXConsole.nib/keyedobjects.nib @@ -0,0 +1,1401 @@ + + + + + $archiver + NSKeyedArchiver + $objects + + $null + + $class + + CF$UID + 115 + + NSClassesKeys + + CF$UID + 103 + + NSClassesValues + + CF$UID + 104 + + NSConnections + + CF$UID + 8 + + NSFontManager + + CF$UID + 0 + + NSFramework + + CF$UID + 5 + + NSNamesKeys + + CF$UID + 98 + + NSNamesValues + + CF$UID + 99 + + NSNextOid + 13 + NSObjectsKeys + + CF$UID + 95 + + NSObjectsValues + + CF$UID + 97 + + NSOidsKeys + + CF$UID + 105 + + NSOidsValues + + CF$UID + 106 + + NSRoot + + CF$UID + 2 + + NSVisibleWindows + + CF$UID + 6 + + + + $class + + CF$UID + 4 + + NSClassName + + CF$UID + 3 + + + SOPEXConsole + + $classes + + NSCustomObject + NSObject + + $classname + NSCustomObject + + IBCocoaFramework + + $class + + CF$UID + 7 + + NS.objects + + + + $classes + + NSMutableSet + NSSet + NSObject + + $classname + NSMutableSet + + + $class + + CF$UID + 32 + + NS.objects + + + CF$UID + 9 + + + CF$UID + 62 + + + CF$UID + 93 + + + + + $class + + CF$UID + 61 + + NSDestination + + CF$UID + 10 + + NSLabel + + CF$UID + 60 + + NSSource + + CF$UID + 2 + + + + $class + + CF$UID + 59 + + NSDelegate + + CF$UID + 0 + + NSDragTypes + + CF$UID + 12 + + NSFrameSize + + CF$UID + 24 + + NSMaxSize + + CF$UID + 58 + + NSNextResponder + + CF$UID + 11 + + NSSharedData + + CF$UID + 35 + + NSSuperview + + CF$UID + 11 + + NSTVFlags + 6 + NSTextContainer + + CF$UID + 25 + + NSvFlags + 2066 + + + $class + + CF$UID + 76 + + NSBGColor + + CF$UID + 36 + + NSCursor + + CF$UID + 74 + + NSDocView + + CF$UID + 10 + + NSFrame + + CF$UID + 73 + + NSNextKeyView + + CF$UID + 10 + + NSNextResponder + + CF$UID + 70 + + NSSubviews + + CF$UID + 72 + + NSSuperview + + CF$UID + 70 + + NScvFlags + 4 + NSvFlags + 2304 + + + $class + + CF$UID + 7 + + NS.objects + + + CF$UID + 13 + + + CF$UID + 14 + + + CF$UID + 15 + + + CF$UID + 16 + + + CF$UID + 17 + + + CF$UID + 18 + + + CF$UID + 19 + + + CF$UID + 20 + + + CF$UID + 21 + + + CF$UID + 22 + + + CF$UID + 23 + + + + Apple PDF pasteboard type + Apple PICT pasteboard type + NSStringPboardType + NeXT Rich Text Format v1.0 pasteboard type + NeXT Encapsulated PostScript v1.2 pasteboard type + Apple HTML pasteboard type + NSFilenamesPboardType + NeXT TIFF v4.0 pasteboard type + NeXT RTFD pasteboard type + CorePasteboardFlavorType 0x6D6F6F76 + NSColor pasteboard type + {383, 238} + + $class + + CF$UID + 34 + + NSLayoutManager + + CF$UID + 26 + + NSTCFlags + 1 + NSTextView + + CF$UID + 10 + + NSWidth + 383 + + + $class + + CF$UID + 33 + + NSDelegate + + CF$UID + 0 + + NSLMFlags + 6 + NSTextContainers + + CF$UID + 31 + + NSTextStorage + + CF$UID + 27 + + + + $class + + CF$UID + 30 + + NSDelegate + + CF$UID + 0 + + NSString + + CF$UID + 28 + + + + $class + + CF$UID + 29 + + NS.string + + + + $classes + + NSMutableString + NSString + NSObject + + $classname + NSMutableString + + + $classes + + NSTextStorage + NSMutableAttributedString + NSAttributedString + NSObject + + $classname + NSTextStorage + + + $class + + CF$UID + 32 + + NS.objects + + + CF$UID + 25 + + + + + $classes + + NSMutableArray + NSArray + NSObject + + $classname + NSMutableArray + + + $classes + + NSLayoutManager + NSObject + + $classname + NSLayoutManager + + + $classes + + NSTextContainer + NSObject + + $classname + NSTextContainer + + + $class + + CF$UID + 57 + + NSBackgroundColor + + CF$UID + 36 + + NSDefaultParagraphStyle + + CF$UID + 0 + + NSFlags + 11237 + NSInsertionColor + + CF$UID + 38 + + NSLinkAttributes + + CF$UID + 49 + + NSMarkedAttributes + + CF$UID + 0 + + NSSelectedAttributes + + CF$UID + 39 + + + + $class + + CF$UID + 37 + + NSColorSpace + 3 + NSWhite + + MQA= + + + + $classes + + NSColor + NSObject + + $classname + NSColor + + + $class + + CF$UID + 37 + + NSColorSpace + 3 + NSWhite + + MAA= + + + + $class + + CF$UID + 48 + + NS.keys + + + CF$UID + 40 + + + CF$UID + 41 + + + NS.objects + + + CF$UID + 42 + + + CF$UID + 46 + + + + NSBackgroundColor + NSColor + + $class + + CF$UID + 37 + + NSCatalogName + + CF$UID + 43 + + NSColor + + CF$UID + 45 + + NSColorName + + CF$UID + 44 + + NSColorSpace + 6 + + System + selectedTextBackgroundColor + + $class + + CF$UID + 37 + + NSColorSpace + 3 + NSWhite + + MC42NjY2NjY2OQA= + + + + $class + + CF$UID + 37 + + NSCatalogName + + CF$UID + 43 + + NSColor + + CF$UID + 38 + + NSColorName + + CF$UID + 47 + + NSColorSpace + 6 + + selectedTextColor + + $classes + + NSDictionary + NSObject + + $classname + NSDictionary + + + $class + + CF$UID + 48 + + NS.keys + + + CF$UID + 50 + + + CF$UID + 51 + + + CF$UID + 41 + + + NS.objects + + + CF$UID + 52 + + + CF$UID + 53 + + + CF$UID + 56 + + + + NSUnderline + NSCursor + 1 + + $class + + CF$UID + 55 + + NSCursorType + 13 + NSHotSpot + + CF$UID + 54 + + + {8, -8} + + $classes + + NSCursor + NSObject + + $classname + NSCursor + + + $class + + CF$UID + 37 + + NSColorSpace + 1 + NSRGB + + MCAwIDEA + + + + $classes + + NSTextViewSharedData + NSObject + + $classname + NSTextViewSharedData + + {398, 1e+07} + + $classes + + NSTextView + %NSTextView + NSText + NSView + NSResponder + NSObject + + $classname + NSTextView + + text + + $classes + + NSNibOutletConnector + NSNibConnector + NSObject + + $classname + NSNibOutletConnector + + + $class + + CF$UID + 61 + + NSDestination + + CF$UID + 2 + + NSLabel + + CF$UID + 92 + + NSSource + + CF$UID + 63 + + + + $class + + CF$UID + 91 + + NSFrameAutosaveName + + CF$UID + 65 + + NSMaxSize + + CF$UID + 90 + + NSMinSize + + CF$UID + 89 + + NSScreenRect + + CF$UID + 88 + + NSViewClass + + CF$UID + 67 + + NSWTFlags + 1886912512 + NSWindowBacking + 2 + NSWindowClass + + CF$UID + 66 + + NSWindowRect + + CF$UID + 64 + + NSWindowStyleMask + 14 + NSWindowTitle + + CF$UID + 65 + + NSWindowView + + CF$UID + 68 + + + {{289, 95}, {400, 240}} + Console + NSWindow + + $class + + CF$UID + 29 + + NS.string + View + + + $class + + CF$UID + 87 + + NSFrame + + CF$UID + 86 + + NSNextResponder + + CF$UID + 0 + + NSSubviews + + CF$UID + 69 + + + + $class + + CF$UID + 32 + + NS.objects + + + CF$UID + 70 + + + + + $class + + CF$UID + 85 + + NSContentView + + CF$UID + 11 + + NSFrameSize + + CF$UID + 84 + + NSHScroller + + CF$UID + 81 + + NSNextKeyView + + CF$UID + 11 + + NSNextResponder + + CF$UID + 68 + + NSSubviews + + CF$UID + 71 + + NSSuperview + + CF$UID + 68 + + NSVScroller + + CF$UID + 77 + + NSsFlags + 18 + NSvFlags + 274 + + + $class + + CF$UID + 32 + + NS.objects + + + CF$UID + 11 + + + CF$UID + 77 + + + CF$UID + 81 + + + + + $class + + CF$UID + 32 + + NS.objects + + + CF$UID + 10 + + + + {{1, 1}, {383, 238}} + + $class + + CF$UID + 55 + + NSCursorType + 1 + NSHotSpot + + CF$UID + 75 + + + {4, -5} + + $classes + + NSClipView + NSView + NSResponder + NSObject + + $classname + NSClipView + + + $class + + CF$UID + 80 + + NSAction + + CF$UID + 79 + + NSCurValue + 1 + NSFrame + + CF$UID + 78 + + NSNextResponder + + CF$UID + 70 + + NSSuperview + + CF$UID + 70 + + NSTarget + + CF$UID + 70 + + NSvFlags + 256 + + {{384, 1}, {15, 238}} + _doScroller: + + $classes + + NSScroller + NSControl + NSView + NSResponder + NSObject + + $classname + NSScroller + + + $class + + CF$UID + 80 + + NSAction + + CF$UID + 83 + + NSCurValue + 1 + NSFrame + + CF$UID + 82 + + NSNextResponder + + CF$UID + 70 + + NSPercent + 0.94565218687057495 + NSSuperview + + CF$UID + 70 + + NSTarget + + CF$UID + 70 + + NSsFlags + 1 + NSvFlags + 256 + + {{-100, -100}, {87, 18}} + _doScroller: + {400, 240} + + $classes + + NSScrollView + NSView + NSResponder + NSObject + + $classname + NSScrollView + + {{1, 9}, {400, 240}} + + $classes + + NSView + NSResponder + NSObject + + $classname + NSView + + {{0, 0}, {1024, 746}} + {213, 129} + {3.40282e+38, 3.40282e+38} + + $classes + + NSWindowTemplate + NSObject + + $classname + NSWindowTemplate + + delegate + + $class + + CF$UID + 61 + + NSDestination + + CF$UID + 63 + + NSLabel + + CF$UID + 94 + + NSSource + + CF$UID + 2 + + + window + + $class + + CF$UID + 96 + + NS.objects + + + CF$UID + 70 + + + CF$UID + 63 + + + CF$UID + 68 + + + CF$UID + 10 + + + + + $classes + + NSArray + NSObject + + $classname + NSArray + + + $class + + CF$UID + 96 + + NS.objects + + + CF$UID + 68 + + + CF$UID + 2 + + + CF$UID + 63 + + + CF$UID + 70 + + + + + $class + + CF$UID + 96 + + NS.objects + + + CF$UID + 70 + + + CF$UID + 63 + + + CF$UID + 2 + + + CF$UID + 10 + + + + + $class + + CF$UID + 96 + + NS.objects + + + CF$UID + 100 + + + CF$UID + 65 + + + CF$UID + 101 + + + CF$UID + 102 + + + + NSScrollView2 + File's Owner + NSTextView + + $class + + CF$UID + 96 + + NS.objects + + + + $class + + CF$UID + 96 + + NS.objects + + + + $class + + CF$UID + 96 + + NS.objects + + + CF$UID + 62 + + + CF$UID + 93 + + + CF$UID + 9 + + + CF$UID + 68 + + + CF$UID + 70 + + + CF$UID + 63 + + + CF$UID + 2 + + + CF$UID + 10 + + + + + $class + + CF$UID + 96 + + NS.objects + + + CF$UID + 107 + + + CF$UID + 108 + + + CF$UID + 109 + + + CF$UID + 110 + + + CF$UID + 111 + + + CF$UID + 112 + + + CF$UID + 113 + + + CF$UID + 114 + + + + 11 + 12 + 9 + 5 + 8 + 6 + 1 + 7 + + $classes + + NSIBObjectData + NSObject + + $classname + NSIBObjectData + + + $top + + IB.objectdata + + CF$UID + 1 + + + $version + 100000 + + diff --git a/sopex/SOPEX/English.lproj/SOPEXConsole.toolbar b/sopex/SOPEX/English.lproj/SOPEXConsole.toolbar new file mode 100644 index 00000000..aa2ff75f --- /dev/null +++ b/sopex/SOPEX/English.lproj/SOPEXConsole.toolbar @@ -0,0 +1,24 @@ +{ + CleanToolbarItem = { + label = "Clean"; + paletteLabel = "Clean"; + toolTip = "Clean"; + imageName = "Clean.tiff"; + action = "clear:"; + }; + + defaultItems = ( + CleanToolbarItem, + NSToolbarFlexibleSpaceItem, + NSToolbarCustomizeToolbarItem + ); + + allowedItems = ( + CleanToolbarItem, + NSToolbarCustomizeToolbarItem, + NSToolbarFlexibleSpaceItem, + NSToolbarSpaceItem, + NSToolbarSeparatorItem, + NSToolbarCustomizeToolbarItem + ); +} \ No newline at end of file diff --git a/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/classes.nib b/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/classes.nib new file mode 100644 index 00000000..a75fed20 --- /dev/null +++ b/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/classes.nib @@ -0,0 +1,63 @@ +{ + IBClasses = ( + { + ACTIONS = {viewSource = id; }; + CLASS = FirstResponder; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, + {CLASS = NSObject; LANGUAGE = ObjC; }, + { + ACTIONS = { + back = id; + clear = id; + editInXcode = id; + openConsole = id; + openStatistics = id; + reload = id; + restartDaemonTask = id; + stopDaemonTask = id; + toggleToolbar = id; + viewApplication = id; + viewHTML = id; + viewHTTP = id; + viewSource = id; + }; + CLASS = SOPEXAppController; + LANGUAGE = ObjC; + OUTLETS = { + aboutMenuItem = NSMenuItem; + debugMenuItem = NSMenuItem; + hideMenuItem = NSMenuItem; + htmlView = NSTextView; + mainMenu = NSMenu; + mainWindow = SOPEXBrowserWindow; + progressIndicator = NSProgressIndicator; + quitMenuItem = NSMenuItem; + responseHeaderInfoTableView = NSTableView; + statusBarTextField = NSTextField; + tabView = NSTabView; + viewApplicationMenuItem = NSMenuItem; + viewHTMLMenuItem = NSMenuItem; + viewHTTPMenuItem = NSMenuItem; + viewSeparatorMenuItem = NSMenuItem; + viewSourceMenuItem = NSMenuItem; + webView = WebView; + woComponentNameField = NSTextField; + woDefinitionView = NSTextView; + woSourceView = NSTextView; + woxNameField = NSTextField; + woxSourceView = NSTextView; + }; + SUPERCLASS = NSObject; + }, + {CLASS = SOPEXBrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; }, + { + CLASS = SOPEXTextView; + LANGUAGE = ObjC; + OUTLETS = {statusField = NSTextField; }; + SUPERCLASS = NSTextView; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/info.nib b/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/info.nib new file mode 100644 index 00000000..d0eafae8 --- /dev/null +++ b/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/info.nib @@ -0,0 +1,24 @@ + + + + + IBDocumentLocation + 22 49 356 241 0 0 1024 746 + IBEditorPositions + + 29 + 25 444 317 44 0 0 1024 746 + + IBFramework Version + 362.0 + IBOpenObjects + + 29 + 21 + + IBSystem Version + 7F44 + IBUsesTextArchiving + + + diff --git a/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/keyedobjects.nib b/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/keyedobjects.nib new file mode 100644 index 00000000..739fcd96 --- /dev/null +++ b/sopex/SOPEX/English.lproj/SOPEXMainMenu.nib/keyedobjects.nib @@ -0,0 +1,14476 @@ + + + + + $archiver + NSKeyedArchiver + $objects + + $null + + $class + + CF$UID + 983 + + NSClassesKeys + + CF$UID + 782 + + NSClassesValues + + CF$UID + 783 + + NSConnections + + CF$UID + 393 + + NSFontManager + + CF$UID + 0 + + NSFramework + + CF$UID + 6 + + NSNamesKeys + + CF$UID + 742 + + NSNamesValues + + CF$UID + 743 + + NSNextOid + 411 + NSObjectsKeys + + CF$UID + 739 + + NSObjectsValues + + CF$UID + 741 + + NSOidsKeys + + CF$UID + 784 + + NSOidsValues + + CF$UID + 785 + + NSRoot + + CF$UID + 2 + + NSVisibleWindows + + CF$UID + 7 + + + + $class + + CF$UID + 5 + + NSClassName + + CF$UID + 3 + + + + $class + + CF$UID + 4 + + NS.string + NSApplication + + + $classes + + NSMutableString + NSString + NSObject + + $classname + NSMutableString + + + $classes + + NSCustomObject + NSObject + + $classname + NSCustomObject + + + $class + + CF$UID + 4 + + NS.string + IBCocoaFramework + + + $class + + CF$UID + 167 + + NS.objects + + + CF$UID + 8 + + + + + $class + + CF$UID + 392 + + NSFrameAutosaveName + + CF$UID + 391 + + NSMaxSize + + CF$UID + 390 + + NSMinSize + + CF$UID + 389 + + NSScreenRect + + CF$UID + 388 + + NSViewClass + + CF$UID + 12 + + NSWTFlags + 1881669632 + NSWindowBacking + 2 + NSWindowClass + + CF$UID + 11 + + NSWindowRect + + CF$UID + 9 + + NSWindowStyleMask + 14 + NSWindowTitle + + CF$UID + 10 + + NSWindowView + + CF$UID + 13 + + + {{125, 149}, {480, 565}} + Window + SOPEXBrowserWindow + + $class + + CF$UID + 4 + + NS.string + View + + + $class + + CF$UID + 138 + + NSFrame + + CF$UID + 387 + + NSNextResponder + + CF$UID + 0 + + NSSubviews + + CF$UID + 14 + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 15 + + + CF$UID + 367 + + + CF$UID + 371 + + + CF$UID + 376 + + + + + $class + + CF$UID + 366 + + NSFont + + CF$UID + 253 + + NSFrame + + CF$UID + 139 + + NSNextResponder + + CF$UID + 13 + + NSSelectedTabViewItem + + CF$UID + 363 + + NSSubviews + + CF$UID + 16 + + NSSuperview + + CF$UID + 13 + + NSTabViewItems + + CF$UID + 140 + + NSTvFlags + 268435462 + NSvFlags + 18 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 17 + + + + + $class + + CF$UID + 138 + + NSFrameSize + + CF$UID + 137 + + NSNextResponder + + CF$UID + 15 + + NSSubviews + + CF$UID + 18 + + NSSuperview + + CF$UID + 15 + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 19 + + + CF$UID + 37 + + + CF$UID + 126 + + + CF$UID + 132 + + + + + $class + + CF$UID + 36 + + NSCell + + CF$UID + 21 + + NSEnabled + + NSFrame + + CF$UID + 20 + + NSNextResponder + + CF$UID + 17 + + NSSuperview + + CF$UID + 17 + + NSvFlags + 12 + + {{17, 528}, {446, 13}} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 27 + + NSCellFlags + 67239424 + NSCellFlags2 + 4194304 + NSContents + + CF$UID + 22 + + NSControlView + + CF$UID + 19 + + NSPlaceholderString + + CF$UID + 26 + + NSSupport + + CF$UID + 23 + + NSTextColor + + CF$UID + 32 + + + + + $class + + CF$UID + 25 + + NSName + + CF$UID + 24 + + NSSize + 10 + NSfFlags + 27 + + LucidaGrande + + $classes + + NSFont + NSObject + + $classname + NSFont + + WO Name + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 30 + + NSColorName + + CF$UID + 29 + + NSColorSpace + 6 + + System + controlColor + + $class + + CF$UID + 31 + + NSColorSpace + 3 + NSWhite + + MC42NjY2NjY2OQA= + + + + $classes + + NSColor + NSObject + + $classname + NSColor + + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 34 + + NSColorName + + CF$UID + 33 + + NSColorSpace + 6 + + controlTextColor + + $class + + CF$UID + 31 + + NSColorSpace + 3 + NSWhite + + MAA= + + + + $classes + + NSTextFieldCell + NSActionCell + NSCell + NSObject + + $classname + NSTextFieldCell + + + $classes + + NSTextField + %NSTextField + NSControl + NSView + NSResponder + NSObject + + $classname + NSTextField + + + $class + + CF$UID + 125 + + NSFrameSize + + CF$UID + 124 + + NSNextResponder + + CF$UID + 17 + + NSSubviews + + CF$UID + 38 + + NSSuperview + + CF$UID + 17 + + NSvFlags + 274 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 39 + + + CF$UID + 97 + + + + + $class + + CF$UID + 96 + + NSContentView + + CF$UID + 41 + + NSFrameSize + + CF$UID + 95 + + NSHScroller + + CF$UID + 92 + + NSNextKeyView + + CF$UID + 41 + + NSNextResponder + + CF$UID + 37 + + NSSubviews + + CF$UID + 40 + + NSSuperview + + CF$UID + 37 + + NSVScroller + + CF$UID + 88 + + NSsFlags + 18 + NSvFlags + 256 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 41 + + + CF$UID + 88 + + + CF$UID + 92 + + + + + $class + + CF$UID + 87 + + NSBGColor + + CF$UID + 65 + + NSCursor + + CF$UID + 85 + + NSDocView + + CF$UID + 43 + + NSFrame + + CF$UID + 84 + + NSNextKeyView + + CF$UID + 43 + + NSNextResponder + + CF$UID + 39 + + NSSubviews + + CF$UID + 42 + + NSSuperview + + CF$UID + 39 + + NScvFlags + 4 + NSvFlags + 2304 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 43 + + + + + $class + + CF$UID + 83 + + NSClassName + + CF$UID + 44 + + NSDelegate + + CF$UID + 0 + + NSFrameSize + + CF$UID + 46 + + NSMaxSize + + CF$UID + 82 + + NSNextResponder + + CF$UID + 41 + + NSOriginalClassName + + CF$UID + 45 + + NSSharedData + + CF$UID + 64 + + NSSuperview + + CF$UID + 41 + + NSTVFlags + 6 + NSTextContainer + + CF$UID + 47 + + NSvFlags + 274 + + SOPEXTextView + NSTextView + {463, 248} + + $class + + CF$UID + 63 + + NSLayoutManager + + CF$UID + 48 + + NSTCFlags + 1 + NSTextView + + CF$UID + 43 + + NSWidth + 463 + + + $class + + CF$UID + 62 + + NSDelegate + + CF$UID + 0 + + NSLMFlags + 6 + NSTextContainers + + CF$UID + 60 + + NSTextStorage + + CF$UID + 49 + + + + $class + + CF$UID + 59 + + NSAttributes + + CF$UID + 51 + + NSDelegate + + CF$UID + 0 + + NSString + + CF$UID + 50 + + + + $class + + CF$UID + 4 + + NS.string + source + + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 52 + + + CF$UID + 53 + + + NS.objects + + + CF$UID + 54 + + + CF$UID + 56 + + + + NSFont + NSParagraphStyle + + $class + + CF$UID + 25 + + NSName + + CF$UID + 55 + + NSSize + 10 + NSfFlags + 18 + + Monaco + + $class + + CF$UID + 57 + + NSTabStops + + CF$UID + 0 + + + + $classes + + NSMutableParagraphStyle + NSParagraphStyle + NSObject + + $classname + NSMutableParagraphStyle + + + $classes + + NSDictionary + NSObject + + $classname + NSDictionary + + + $classes + + NSTextStorage + NSMutableAttributedString + NSAttributedString + NSObject + + $classname + NSTextStorage + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 47 + + + + + $classes + + NSMutableArray + NSArray + NSObject + + $classname + NSMutableArray + + + $classes + + NSLayoutManager + NSObject + + $classname + NSLayoutManager + + + $classes + + NSTextContainer + NSObject + + $classname + NSTextContainer + + + $class + + CF$UID + 81 + + NSBackgroundColor + + CF$UID + 65 + + NSDefaultParagraphStyle + + CF$UID + 0 + + NSFlags + 12131 + NSInsertionColor + + CF$UID + 34 + + NSLinkAttributes + + CF$UID + 73 + + NSMarkedAttributes + + CF$UID + 0 + + NSSelectedAttributes + + CF$UID + 66 + + + + $class + + CF$UID + 31 + + NSColorSpace + 3 + NSWhite + + MQA= + + + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 67 + + + CF$UID + 68 + + + NS.objects + + + CF$UID + 69 + + + CF$UID + 71 + + + + NSBackgroundColor + NSColor + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 30 + + NSColorName + + CF$UID + 70 + + NSColorSpace + 6 + + selectedTextBackgroundColor + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 34 + + NSColorName + + CF$UID + 72 + + NSColorSpace + 6 + + selectedTextColor + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 74 + + + CF$UID + 75 + + + CF$UID + 68 + + + NS.objects + + + CF$UID + 76 + + + CF$UID + 77 + + + CF$UID + 80 + + + + NSUnderline + NSCursor + 1 + + $class + + CF$UID + 79 + + NSCursorType + 13 + NSHotSpot + + CF$UID + 78 + + + {8, -8} + + $classes + + NSCursor + NSObject + + $classname + NSCursor + + + $class + + CF$UID + 31 + + NSColorSpace + 1 + NSRGB + + MCAwIDEA + + + + $classes + + NSTextViewSharedData + NSObject + + $classname + NSTextViewSharedData + + {463, 1e+07} + + $classes + + NSClassSwapper + NSObject + + $classname + NSClassSwapper + + {{1, 1}, {463, 248}} + + $class + + CF$UID + 79 + + NSCursorType + 1 + NSHotSpot + + CF$UID + 86 + + + {4, -5} + + $classes + + NSClipView + NSView + NSResponder + NSObject + + $classname + NSClipView + + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 90 + + NSCurValue + 1 + NSFrame + + CF$UID + 89 + + NSNextResponder + + CF$UID + 39 + + NSSuperview + + CF$UID + 39 + + NSTarget + + CF$UID + 39 + + NSvFlags + 256 + + {{464, 1}, {15, 248}} + _doScroller: + + $classes + + NSScroller + NSControl + NSView + NSResponder + NSObject + + $classname + NSScroller + + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 94 + + NSCurValue + 1 + NSFrame + + CF$UID + 93 + + NSNextResponder + + CF$UID + 39 + + NSPercent + 0.94565218687057495 + NSSuperview + + CF$UID + 39 + + NSTarget + + CF$UID + 39 + + NSsFlags + 1 + NSvFlags + 256 + + {{-100, -100}, {87, 18}} + _doScroller: + {480, 250} + + $classes + + NSScrollView + NSView + NSResponder + NSObject + + $classname + NSScrollView + + + $class + + CF$UID + 96 + + NSContentView + + CF$UID + 99 + + NSFrame + + CF$UID + 123 + + NSHScroller + + CF$UID + 120 + + NSNextKeyView + + CF$UID + 99 + + NSNextResponder + + CF$UID + 37 + + NSSubviews + + CF$UID + 98 + + NSSuperview + + CF$UID + 37 + + NSVScroller + + CF$UID + 117 + + NSsFlags + 18 + NSvFlags + 256 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 99 + + + CF$UID + 117 + + + CF$UID + 120 + + + + + $class + + CF$UID + 87 + + NSBGColor + + CF$UID + 65 + + NSBounds + + CF$UID + 116 + + NSCursor + + CF$UID + 85 + + NSDocView + + CF$UID + 101 + + NSFrame + + CF$UID + 115 + + NSNextKeyView + + CF$UID + 101 + + NSNextResponder + + CF$UID + 97 + + NSSubviews + + CF$UID + 100 + + NSSuperview + + CF$UID + 97 + + NScvFlags + 4 + NSvFlags + 2304 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 101 + + + + + $class + + CF$UID + 83 + + NSClassName + + CF$UID + 44 + + NSDelegate + + CF$UID + 0 + + NSFrame + + CF$UID + 103 + + NSMaxSize + + CF$UID + 114 + + NSNextResponder + + CF$UID + 99 + + NSOriginalClassName + + CF$UID + 102 + + NSSharedData + + CF$UID + 110 + + NSSuperview + + CF$UID + 99 + + NSTVFlags + 6 + NSTextContainer + + CF$UID + 104 + + NSvFlags + 274 + + NSTextView + {{0, 102}, {463, 264}} + + $class + + CF$UID + 63 + + NSLayoutManager + + CF$UID + 105 + + NSTCFlags + 1 + NSTextView + + CF$UID + 101 + + NSWidth + 463 + + + $class + + CF$UID + 62 + + NSDelegate + + CF$UID + 0 + + NSLMFlags + 6 + NSTextContainers + + CF$UID + 109 + + NSTextStorage + + CF$UID + 106 + + + + $class + + CF$UID + 59 + + NSAttributes + + CF$UID + 108 + + NSDelegate + + CF$UID + 0 + + NSString + + CF$UID + 107 + + + + $class + + CF$UID + 4 + + NS.string + definition + + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 68 + + + CF$UID + 53 + + + CF$UID + 52 + + + NS.objects + + + CF$UID + 34 + + + CF$UID + 56 + + + CF$UID + 54 + + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 104 + + + + + $class + + CF$UID + 81 + + NSBackgroundColor + + CF$UID + 65 + + NSDefaultParagraphStyle + + CF$UID + 0 + + NSFlags + 12131 + NSInsertionColor + + CF$UID + 34 + + NSLinkAttributes + + CF$UID + 112 + + NSMarkedAttributes + + CF$UID + 0 + + NSSelectedAttributes + + CF$UID + 111 + + + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 67 + + + CF$UID + 68 + + + NS.objects + + + CF$UID + 69 + + + CF$UID + 71 + + + + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 74 + + + CF$UID + 75 + + + CF$UID + 68 + + + NS.objects + + + CF$UID + 113 + + + CF$UID + 77 + + + CF$UID + 80 + + + + 1 + {463, 1e+07} + {{1, 1}, {463, 264}} + {{0, 102}, {463, 264}} + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 119 + + NSCurValue + 1 + NSFrame + + CF$UID + 118 + + NSNextResponder + + CF$UID + 97 + + NSSuperview + + CF$UID + 97 + + NSTarget + + CF$UID + 97 + + NSvFlags + 256 + + {{464, 1}, {15, 264}} + _doScroller: + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 122 + + NSCurValue + 1 + NSFrame + + CF$UID + 121 + + NSNextResponder + + CF$UID + 97 + + NSPercent + 0.94565218687057495 + NSSuperview + + CF$UID + 97 + + NSTarget + + CF$UID + 97 + + NSsFlags + 1 + NSvFlags + 256 + + {{-100, -100}, {87, 18}} + _doScroller: + {{0, 259}, {480, 266}} + {480, 525} + + $classes + + NSSplitView + NSView + NSResponder + NSObject + + $classname + NSSplitView + + + $class + + CF$UID + 36 + + NSCell + + CF$UID + 128 + + NSEnabled + + NSFrame + + CF$UID + 127 + + NSNextResponder + + CF$UID + 17 + + NSSuperview + + CF$UID + 17 + + NSvFlags + 9 + + {{336, 507}, {128, 17}} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 131 + + NSCellFlags + 75628032 + NSCellFlags2 + 71303168 + NSContents + + CF$UID + 129 + + NSControlView + + CF$UID + 126 + + NSDrawsBackground + + NSSupport + + CF$UID + 130 + + NSTextColor + + CF$UID + 32 + + + .html Validation failed + + + $class + + CF$UID + 25 + + NSName + + CF$UID + 24 + + NSSize + 11 + NSfFlags + 28 + + + $class + + CF$UID + 31 + + NSColorSpace + 1 + NSRGB + + MSAwLjcxOTk2NzI1IDAuNzQ3Mjk4NDgA + + + + $class + + CF$UID + 36 + + NSCell + + CF$UID + 134 + + NSEnabled + + NSFrame + + CF$UID + 133 + + NSNextResponder + + CF$UID + 17 + + NSSuperview + + CF$UID + 17 + + NSvFlags + 1 + + {{342, 248}, {122, 17}} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 136 + + NSCellFlags + 75628032 + NSCellFlags2 + 71303168 + NSContents + + CF$UID + 135 + + NSControlView + + CF$UID + 132 + + NSDrawsBackground + + NSSupport + + CF$UID + 130 + + NSTextColor + + CF$UID + 32 + + + .wod Validation failed + + + $class + + CF$UID + 31 + + NSColorSpace + 1 + NSRGB + + MSAwLjcxOTk2NzI1IDAuNzQ3Mjk4NDgA + + + {480, 547} + + $classes + + NSView + NSResponder + NSObject + + $classname + NSView + + {{0, 18}, {480, 547}} + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 141 + + + CF$UID + 203 + + + CF$UID + 264 + + + CF$UID + 318 + + + CF$UID + 363 + + + + + $class + + CF$UID + 202 + + NSColor + + CF$UID + 27 + + NSIdentifier + + CF$UID + 142 + + NSLabel + + CF$UID + 201 + + NSTabView + + CF$UID + 15 + + NSView + + CF$UID + 143 + + + application + + $class + + CF$UID + 138 + + NSFrameSize + + CF$UID + 200 + + NSNextResponder + + CF$UID + 0 + + NSSubviews + + CF$UID + 144 + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 145 + + + + + $class + + CF$UID + 199 + + FrameName + + CF$UID + 0 + + GroupName + + CF$UID + 0 + + NSDragTypes + + CF$UID + 160 + + NSFrame + + CF$UID + 168 + + NSNextKeyView + + CF$UID + 147 + + NSNextResponder + + CF$UID + 143 + + NSSubviews + + CF$UID + 146 + + NSSuperview + + CF$UID + 143 + + NSvFlags + 274 + Preferences + + CF$UID + 169 + + UseBackForwardList + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 147 + + + + + $class + + CF$UID + 159 + + NSFrameSize + + CF$UID + 158 + + NSNextKeyView + + CF$UID + 149 + + NSNextResponder + + CF$UID + 145 + + NSSubviews + + CF$UID + 148 + + NSSuperview + + CF$UID + 145 + + NSvFlags + 274 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 149 + + + + + $class + + CF$UID + 157 + + NSContentView + + CF$UID + 151 + + NSFrameSize + + CF$UID + 156 + + NSNextKeyView + + CF$UID + 151 + + NSNextResponder + + CF$UID + 147 + + NSSubviews + + CF$UID + 150 + + NSSuperview + + CF$UID + 147 + + NSsFlags + 0 + NSvFlags + 274 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 151 + + + + + $class + + CF$UID + 155 + + NSBGColor + + CF$UID + 153 + + NSFrameSize + + CF$UID + 152 + + NSNextResponder + + CF$UID + 149 + + NSSuperview + + CF$UID + 149 + + NScvFlags + 2 + NSvFlags + 256 + + {480, 547} + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 30 + + NSColorName + + CF$UID + 154 + + NSColorSpace + 6 + + controlBackgroundColor + + $classes + + WebClipView + NSClipView + NSView + NSResponder + NSObject + + $classname + WebClipView + + {480, 547} + + $classes + + WebDynamicScrollBarsView + WebCoreScrollView + NSScrollView + NSView + NSResponder + NSObject + + $classname + WebDynamicScrollBarsView + + {480, 547} + + $classes + + WebFrameView + NSView + NSResponder + NSObject + + $classname + WebFrameView + + + $class + + CF$UID + 167 + + NS.objects + + + CF$UID + 161 + + + CF$UID + 162 + + + CF$UID + 163 + + + CF$UID + 164 + + + CF$UID + 165 + + + CF$UID + 166 + + + + NSStringPboardType + Apple URL pasteboard type + dyn.aqr104pxbsb2g23msr731k8puqy81n6xqr2oooooo + NSFilenamesPboardType + public.url + WebURLsWithTitlesPboardType + + $classes + + NSMutableSet + NSSet + NSObject + + $classname + NSMutableSet + + {{0, 1}, {480, 547}} + + $class + + CF$UID + 198 + + Identifier + + CF$UID + 170 + + Values + + CF$UID + 171 + + + WebUI + + $class + + CF$UID + 197 + + NS.keys + + + CF$UID + 172 + + + CF$UID + 173 + + + CF$UID + 174 + + + CF$UID + 175 + + + CF$UID + 176 + + + CF$UID + 177 + + + CF$UID + 178 + + + CF$UID + 179 + + + CF$UID + 180 + + + CF$UID + 181 + + + CF$UID + 182 + + + CF$UID + 183 + + + CF$UID + 184 + + + CF$UID + 185 + + + CF$UID + 186 + + + CF$UID + 187 + + + NS.objects + + + CF$UID + 188 + + + CF$UID + 189 + + + CF$UID + 189 + + + CF$UID + 190 + + + CF$UID + 191 + + + CF$UID + 189 + + + CF$UID + 192 + + + CF$UID + 189 + + + CF$UID + 193 + + + CF$UID + 189 + + + CF$UID + 194 + + + CF$UID + 192 + + + CF$UID + 195 + + + CF$UID + 196 + + + CF$UID + 189 + + + CF$UID + 189 + + + + WebUIWebKitFantasyFont + WebUIWebKitAllowAnimatedImageLoopingPreferenceKey + WebUIWebKitJavaEnabled + WebUIWebKitDefaultFontSize + WebUIWebKitMinimumFontSize + WebUIWebKitPluginsEnabled + WebUIWebKitStandardFont + WebUIWebKitJavaScriptEnabled + WebUIWebKitSansSerifFont + WebUIWebKitDisplayImagesKey + WebUIWebKitCursiveFont + WebUIWebKitSerifFont + WebUIWebKitDefaultFixedFontSize + WebUIWebKitFixedFont + WebUIWebKitAllowAnimatedImagesPreferenceKey + WebUIWebKitJavaScriptCanOpenWindowsAutomatically + Papyrus + + 16 + 1 + Times + Helvetica + Apple Chancery + 13 + Courier + + $classes + + NSMutableDictionary + NSDictionary + NSObject + + $classname + NSMutableDictionary + + + $classes + + WebPreferences + NSObject + + $classname + WebPreferences + + + $classes + + WebView + %WebView + NSView + NSResponder + NSObject + + $classname + WebView + + {480, 547} + Application + + $classes + + NSTabViewItem + NSObject + + $classname + NSTabViewItem + + + $class + + CF$UID + 202 + + NSColor + + CF$UID + 27 + + NSIdentifier + + CF$UID + 204 + + NSLabel + + CF$UID + 263 + + NSTabView + + CF$UID + 15 + + NSView + + CF$UID + 205 + + + html + + $class + + CF$UID + 138 + + NSFrameSize + + CF$UID + 262 + + NSNextResponder + + CF$UID + 0 + + NSSubviews + + CF$UID + 206 + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 207 + + + CF$UID + 249 + + + CF$UID + 258 + + + + + $class + + CF$UID + 96 + + NSContentView + + CF$UID + 209 + + NSFrameSize + + CF$UID + 248 + + NSHScroller + + CF$UID + 245 + + NSNextKeyView + + CF$UID + 209 + + NSNextResponder + + CF$UID + 205 + + NSSubviews + + CF$UID + 208 + + NSSuperview + + CF$UID + 205 + + NSVScroller + + CF$UID + 242 + + NSsFlags + 18 + NSvFlags + 274 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 209 + + + CF$UID + 242 + + + CF$UID + 245 + + + + + $class + + CF$UID + 87 + + NSBGColor + + CF$UID + 229 + + NSBounds + + CF$UID + 241 + + NSCursor + + CF$UID + 85 + + NSDocView + + CF$UID + 211 + + NSFrame + + CF$UID + 240 + + NSNextKeyView + + CF$UID + 211 + + NSNextResponder + + CF$UID + 207 + + NSSubviews + + CF$UID + 210 + + NSSuperview + + CF$UID + 207 + + NScvFlags + 4 + NSvFlags + 2304 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 211 + + + + + $class + + CF$UID + 239 + + NSDelegate + + CF$UID + 0 + + NSDragTypes + + CF$UID + 212 + + NSFrame + + CF$UID + 222 + + NSMaxSize + + CF$UID + 238 + + NSNextResponder + + CF$UID + 209 + + NSSharedData + + CF$UID + 228 + + NSSuperview + + CF$UID + 209 + + NSTVFlags + 6 + NSTextContainer + + CF$UID + 223 + + NSvFlags + 2066 + + + $class + + CF$UID + 167 + + NS.objects + + + CF$UID + 213 + + + CF$UID + 214 + + + CF$UID + 161 + + + CF$UID + 215 + + + CF$UID + 216 + + + CF$UID + 217 + + + CF$UID + 164 + + + CF$UID + 218 + + + CF$UID + 219 + + + CF$UID + 220 + + + CF$UID + 221 + + + + Apple PDF pasteboard type + Apple PICT pasteboard type + NeXT Rich Text Format v1.0 pasteboard type + NeXT Encapsulated PostScript v1.2 pasteboard type + Apple HTML pasteboard type + NeXT TIFF v4.0 pasteboard type + NeXT RTFD pasteboard type + CorePasteboardFlavorType 0x6D6F6F76 + NSColor pasteboard type + {{0, 124}, {463, 523}} + + $class + + CF$UID + 63 + + NSLayoutManager + + CF$UID + 224 + + NSTCFlags + 1 + NSTextView + + CF$UID + 211 + + NSWidth + 463 + + + $class + + CF$UID + 62 + + NSDelegate + + CF$UID + 0 + + NSLMFlags + 6 + NSTextContainers + + CF$UID + 227 + + NSTextStorage + + CF$UID + 225 + + + + $class + + CF$UID + 59 + + NSDelegate + + CF$UID + 0 + + NSString + + CF$UID + 226 + + + + $class + + CF$UID + 4 + + NS.string + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 223 + + + + + $class + + CF$UID + 81 + + NSBackgroundColor + + CF$UID + 229 + + NSDefaultParagraphStyle + + CF$UID + 0 + + NSFlags + 11105 + NSInsertionColor + + CF$UID + 34 + + NSLinkAttributes + + CF$UID + 234 + + NSMarkedAttributes + + CF$UID + 0 + + NSSelectedAttributes + + CF$UID + 231 + + + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 65 + + NSColorName + + CF$UID + 230 + + NSColorSpace + 6 + + controlHighlightColor + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 232 + + + CF$UID + 233 + + + NS.objects + + + CF$UID + 69 + + + CF$UID + 71 + + + + NSBackgroundColor + NSColor + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 233 + + + NS.objects + + + CF$UID + 237 + + + CF$UID + 77 + + + CF$UID + 80 + + + + NSUnderline + NSCursor + 1 + {463, 1e+07} + + $classes + + NSTextView + %NSTextView + NSText + NSView + NSResponder + NSObject + + $classname + NSTextView + + {{1, 1}, {463, 523}} + {{0, 124}, {463, 523}} + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 244 + + NSCurValue + 1 + NSFrame + + CF$UID + 243 + + NSNextResponder + + CF$UID + 207 + + NSSuperview + + CF$UID + 207 + + NSTarget + + CF$UID + 207 + + NSvFlags + 256 + + {{464, 1}, {15, 523}} + _doScroller: + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 247 + + NSCurValue + 1 + NSFrame + + CF$UID + 246 + + NSNextResponder + + CF$UID + 207 + + NSPercent + 0.94565218687057495 + NSSuperview + + CF$UID + 207 + + NSTarget + + CF$UID + 207 + + NSsFlags + 1 + NSvFlags + 256 + + {{-100, -100}, {87, 18}} + _doScroller: + {480, 525} + + $class + + CF$UID + 257 + + NSCell + + CF$UID + 251 + + NSEnabled + + NSFrame + + CF$UID + 250 + + NSNextResponder + + CF$UID + 205 + + NSSuperview + + CF$UID + 205 + + NSvFlags + 9 + + {{397, 527}, {64, 16}} + + $class + + CF$UID + 256 + + NSAlternateContents + + CF$UID + 22 + + NSAlternateImage + + CF$UID + 254 + + NSButtonFlags + -2038284033 + NSButtonFlags2 + 1 + NSCellFlags + 604110336 + NSCellFlags2 + 134479872 + NSContents + + CF$UID + 252 + + NSControlView + + CF$UID + 249 + + NSKeyEquivalent + + CF$UID + 255 + + NSPeriodicDelay + 200 + NSPeriodicInterval + 25 + NSSupport + + CF$UID + 253 + + + Reformat + + $class + + CF$UID + 25 + + NSName + + CF$UID + 24 + + NSSize + 9 + NSfFlags + 30 + + + $class + + CF$UID + 25 + + NSName + + CF$UID + 24 + + NSSize + 9 + NSfFlags + 16 + + + $class + + CF$UID + 4 + + NS.string + + + + $classes + + NSButtonCell + %NSButtonCell + NSActionCell + NSCell + NSObject + + $classname + NSButtonCell + + + $classes + + NSButton + NSControl + NSView + NSResponder + NSObject + + $classname + NSButton + + + $class + + CF$UID + 36 + + NSCell + + CF$UID + 260 + + NSEnabled + + NSFrame + + CF$UID + 259 + + NSNextResponder + + CF$UID + 205 + + NSSuperview + + CF$UID + 205 + + NSvFlags + 12 + + {{17, 528}, {371, 13}} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 27 + + NSCellFlags + 69336577 + NSCellFlags2 + 4194304 + NSContents + + CF$UID + 261 + + NSControlView + + CF$UID + 258 + + NSSupport + + CF$UID + 23 + + NSTextColor + + CF$UID + 32 + + + HTML Source + + {480, 547} + HTML + + $class + + CF$UID + 202 + + NSColor + + CF$UID + 27 + + NSIdentifier + + CF$UID + 265 + + NSLabel + + CF$UID + 317 + + NSTabView + + CF$UID + 15 + + NSView + + CF$UID + 266 + + + http + + $class + + CF$UID + 138 + + NSFrameSize + + CF$UID + 316 + + NSNextResponder + + CF$UID + 0 + + NSSubviews + + CF$UID + 267 + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 268 + + + CF$UID + 312 + + + + + $class + + CF$UID + 96 + + NSContentView + + CF$UID + 270 + + NSFrameSize + + CF$UID + 311 + + NSHScroller + + CF$UID + 306 + + NSHeaderClipView + + CF$UID + 275 + + NSNextKeyView + + CF$UID + 270 + + NSNextResponder + + CF$UID + 266 + + NSScrollAmts + + QSAAAEEgAABBmAAAQZgAAA== + + NSSubviews + + CF$UID + 269 + + NSSuperview + + CF$UID + 266 + + NSVScroller + + CF$UID + 303 + + NSsFlags + 562 + NSvFlags + 274 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 270 + + + CF$UID + 303 + + + CF$UID + 306 + + + CF$UID + 275 + + + CF$UID + 278 + + + + + $class + + CF$UID + 87 + + NSBGColor + + CF$UID + 153 + + NSDocView + + CF$UID + 272 + + NSFrame + + CF$UID + 302 + + NSNextKeyView + + CF$UID + 272 + + NSNextResponder + + CF$UID + 268 + + NSSubviews + + CF$UID + 271 + + NSSuperview + + CF$UID + 268 + + NScvFlags + 4 + NSvFlags + 2304 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 272 + + + + + $class + + CF$UID + 301 + + NSBackgroundColor + + CF$UID + 65 + + NSCornerView + + CF$UID + 278 + + NSEnabled + + NSFrameSize + + CF$UID + 273 + + NSGridColor + + CF$UID + 298 + + NSHeaderView + + CF$UID + 274 + + NSIntercellSpacingHeight + 2 + NSIntercellSpacingWidth + 3 + NSNextResponder + + CF$UID + 270 + + NSRowHeight + 17 + NSSuperview + + CF$UID + 270 + + NSTableColumns + + CF$UID + 281 + + NSTvFlags + -759169024 + + {478, 0} + + $class + + CF$UID + 277 + + NSFrameSize + + CF$UID + 276 + + NSNextResponder + + CF$UID + 275 + + NSSuperview + + CF$UID + 275 + + NSTableView + + CF$UID + 272 + + NSvFlags + 256 + + + $class + + CF$UID + 87 + + NSBGColor + + CF$UID + 153 + + NSDocView + + CF$UID + 274 + + NSFrame + + CF$UID + 310 + + NSNextKeyView + + CF$UID + 274 + + NSNextResponder + + CF$UID + 268 + + NSSubviews + + CF$UID + 309 + + NSSuperview + + CF$UID + 268 + + NScvFlags + 4 + NSvFlags + 2304 + + {478, 17} + + $classes + + NSTableHeaderView + NSView + NSResponder + NSObject + + $classname + NSTableHeaderView + + + $class + + CF$UID + 280 + + NSFrame + + CF$UID + 279 + + NSNextResponder + + CF$UID + 268 + + NSSuperview + + CF$UID + 268 + + NSvFlags + -2147483392 + + {{-32, -34}, {16, 17}} + + $classes + + _NSCornerView + NSView + NSResponder + NSObject + + $classname + _NSCornerView + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 282 + + + CF$UID + 293 + + + + + $class + + CF$UID + 292 + + NSDataCell + + CF$UID + 290 + + NSHeaderCell + + CF$UID + 284 + + NSIdentifier + + CF$UID + 283 + + NSIsResizeable + + NSMaxWidth + 1000 + NSMinWidth + 40 + NSTableView + + CF$UID + 272 + + NSWidth + 164 + + header + + $class + + CF$UID + 289 + + NSBackgroundColor + + CF$UID + 286 + + NSCellFlags + 75628032 + NSCellFlags2 + 0 + NSContents + + CF$UID + 285 + + NSSupport + + CF$UID + 130 + + NSTextColor + + CF$UID + 287 + + + Header + + $class + + CF$UID + 31 + + NSColorSpace + 3 + NSWhite + + MC4zMzMzMzI5OQA= + + + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 34 + + NSColorName + + CF$UID + 288 + + NSColorSpace + 6 + + headerTextColor + + $classes + + NSTableHeaderCell + NSTextFieldCell + NSActionCell + NSCell + NSObject + + $classname + NSTableHeaderCell + + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 65 + + NSCellFlags + 338820672 + NSCellFlags2 + 0 + NSControlView + + CF$UID + 272 + + NSSupport + + CF$UID + 291 + + NSTextColor + + CF$UID + 32 + + + + $class + + CF$UID + 25 + + NSName + + CF$UID + 24 + + NSSize + 13 + NSfFlags + 20 + + + $classes + + NSTableColumn + NSObject + + $classname + NSTableColumn + + + $class + + CF$UID + 292 + + NSDataCell + + CF$UID + 297 + + NSHeaderCell + + CF$UID + 295 + + NSIdentifier + + CF$UID + 294 + + NSIsEditable + + NSIsResizeable + + NSMaxWidth + 1000 + NSMinWidth + 8 + NSTableView + + CF$UID + 272 + + NSWidth + 308.4010009765625 + + value + + $class + + CF$UID + 289 + + NSBackgroundColor + + CF$UID + 286 + + NSCellFlags + 75628032 + NSCellFlags2 + 0 + NSContents + + CF$UID + 296 + + NSSupport + + CF$UID + 130 + + NSTextColor + + CF$UID + 287 + + + Value + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 65 + + NSCellFlags + 338820672 + NSCellFlags2 + 0 + NSControlView + + CF$UID + 272 + + NSSupport + + CF$UID + 291 + + NSTextColor + + CF$UID + 32 + + + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 300 + + NSColorName + + CF$UID + 299 + + NSColorSpace + 6 + + gridColor + + $class + + CF$UID + 31 + + NSColorSpace + 3 + NSWhite + + MC41AA== + + + + $classes + + NSTableView + %NSTableView + NSControl + NSView + NSResponder + NSObject + + $classname + NSTableView + + {{1, 17}, {478, 507}} + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 305 + + NSFrame + + CF$UID + 304 + + NSNextResponder + + CF$UID + 268 + + NSPercent + 0.41052630543708801 + NSSuperview + + CF$UID + 268 + + NSTarget + + CF$UID + 268 + + NSvFlags + -2147483392 + + {{-30, 17}, {15, 472}} + _doScroller: + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 308 + + NSFrame + + CF$UID + 307 + + NSNextResponder + + CF$UID + 268 + + NSPercent + 0.99047619104385376 + NSSuperview + + CF$UID + 268 + + NSTarget + + CF$UID + 268 + + NSsFlags + 1 + NSvFlags + -2147483392 + + {{1, -30}, {423, 15}} + _doScroller: + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 274 + + + + {{1, 0}, {478, 17}} + {480, 525} + + $class + + CF$UID + 36 + + NSCell + + CF$UID + 314 + + NSEnabled + + NSFrame + + CF$UID + 313 + + NSNextResponder + + CF$UID + 266 + + NSSuperview + + CF$UID + 266 + + NSvFlags + 12 + + {{17, 528}, {446, 13}} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 27 + + NSCellFlags + 69336577 + NSCellFlags2 + 4194304 + NSContents + + CF$UID + 315 + + NSControlView + + CF$UID + 312 + + NSSupport + + CF$UID + 23 + + NSTextColor + + CF$UID + 32 + + + HTTP Headers + + {480, 547} + HTTP + + $class + + CF$UID + 202 + + NSColor + + CF$UID + 27 + + NSIdentifier + + CF$UID + 319 + + NSLabel + + CF$UID + 362 + + NSTabView + + CF$UID + 15 + + NSView + + CF$UID + 320 + + + wox + + $class + + CF$UID + 138 + + NSFrameSize + + CF$UID + 361 + + NSNextResponder + + CF$UID + 0 + + NSSubviews + + CF$UID + 321 + + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 322 + + + CF$UID + 347 + + + CF$UID + 351 + + + CF$UID + 356 + + + + + $class + + CF$UID + 96 + + NSContentView + + CF$UID + 324 + + NSFrameSize + + CF$UID + 346 + + NSHScroller + + CF$UID + 343 + + NSNextKeyView + + CF$UID + 324 + + NSNextResponder + + CF$UID + 320 + + NSSubviews + + CF$UID + 323 + + NSSuperview + + CF$UID + 320 + + NSVScroller + + CF$UID + 340 + + NSsFlags + 18 + NSvFlags + 274 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 324 + + + CF$UID + 340 + + + CF$UID + 343 + + + + + $class + + CF$UID + 87 + + NSBGColor + + CF$UID + 65 + + NSCursor + + CF$UID + 85 + + NSDocView + + CF$UID + 326 + + NSFrame + + CF$UID + 339 + + NSNextKeyView + + CF$UID + 326 + + NSNextResponder + + CF$UID + 322 + + NSSubviews + + CF$UID + 325 + + NSSuperview + + CF$UID + 322 + + NScvFlags + 4 + NSvFlags + 2304 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 326 + + + + + $class + + CF$UID + 83 + + NSClassName + + CF$UID + 44 + + NSDelegate + + CF$UID + 0 + + NSFrameSize + + CF$UID + 328 + + NSMaxSize + + CF$UID + 338 + + NSNextResponder + + CF$UID + 324 + + NSOriginalClassName + + CF$UID + 327 + + NSSharedData + + CF$UID + 334 + + NSSuperview + + CF$UID + 324 + + NSTVFlags + 6 + NSTextContainer + + CF$UID + 329 + + NSvFlags + 2066 + + NSTextView + {463, 523} + + $class + + CF$UID + 63 + + NSLayoutManager + + CF$UID + 330 + + NSTCFlags + 1 + NSTextView + + CF$UID + 326 + + NSWidth + 463 + + + $class + + CF$UID + 62 + + NSDelegate + + CF$UID + 0 + + NSLMFlags + 6 + NSTextContainers + + CF$UID + 333 + + NSTextStorage + + CF$UID + 331 + + + + $class + + CF$UID + 59 + + NSAttributes + + CF$UID + 108 + + NSDelegate + + CF$UID + 0 + + NSString + + CF$UID + 332 + + + + $class + + CF$UID + 4 + + NS.string + source + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 329 + + + + + $class + + CF$UID + 81 + + NSBackgroundColor + + CF$UID + 65 + + NSDefaultParagraphStyle + + CF$UID + 0 + + NSFlags + 12131 + NSInsertionColor + + CF$UID + 34 + + NSLinkAttributes + + CF$UID + 336 + + NSMarkedAttributes + + CF$UID + 0 + + NSSelectedAttributes + + CF$UID + 335 + + + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 232 + + + CF$UID + 233 + + + NS.objects + + + CF$UID + 69 + + + CF$UID + 71 + + + + + $class + + CF$UID + 58 + + NS.keys + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 233 + + + NS.objects + + + CF$UID + 337 + + + CF$UID + 77 + + + CF$UID + 80 + + + + 1 + {463, 1e+07} + {{1, 1}, {463, 523}} + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 342 + + NSCurValue + 1 + NSFrame + + CF$UID + 341 + + NSNextResponder + + CF$UID + 322 + + NSSuperview + + CF$UID + 322 + + NSTarget + + CF$UID + 322 + + NSvFlags + 256 + + {{464, 1}, {15, 523}} + _doScroller: + + $class + + CF$UID + 91 + + NSAction + + CF$UID + 345 + + NSCurValue + 1 + NSFrame + + CF$UID + 344 + + NSNextResponder + + CF$UID + 322 + + NSPercent + 0.94565218687057495 + NSSuperview + + CF$UID + 322 + + NSTarget + + CF$UID + 322 + + NSsFlags + 1 + NSvFlags + 256 + + {{-100, -100}, {87, 18}} + _doScroller: + {480, 525} + + $class + + CF$UID + 36 + + NSCell + + CF$UID + 349 + + NSEnabled + + NSFrame + + CF$UID + 348 + + NSNextResponder + + CF$UID + 320 + + NSSuperview + + CF$UID + 320 + + NSvFlags + 12 + + {{17, 528}, {359, 13}} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 27 + + NSCellFlags + 69336577 + NSCellFlags2 + 4194304 + NSContents + + CF$UID + 350 + + NSControlView + + CF$UID + 347 + + NSSupport + + CF$UID + 23 + + NSTextColor + + CF$UID + 32 + + + WOX Name + + $class + + CF$UID + 257 + + NSCell + + CF$UID + 353 + + NSEnabled + + NSFrame + + CF$UID + 352 + + NSNextResponder + + CF$UID + 320 + + NSSuperview + + CF$UID + 320 + + NSvFlags + 9 + + {{380, 527}, {81, 16}} + + $class + + CF$UID + 256 + + NSAlternateContents + + CF$UID + 22 + + NSAlternateImage + + CF$UID + 254 + + NSButtonFlags + -2038284033 + NSButtonFlags2 + 1 + NSCellFlags + 67239424 + NSCellFlags2 + 134479872 + NSContents + + CF$UID + 354 + + NSControlView + + CF$UID + 351 + + NSKeyEquivalent + + CF$UID + 355 + + NSPeriodicDelay + 200 + NSPeriodicInterval + 25 + NSSupport + + CF$UID + 253 + + + Edit in Xcode + + $class + + CF$UID + 4 + + NS.string + + + + $class + + CF$UID + 36 + + NSCell + + CF$UID + 358 + + NSEnabled + + NSFrame + + CF$UID + 357 + + NSNextResponder + + CF$UID + 320 + + NSSuperview + + CF$UID + 320 + + NSvFlags + 9 + + {{369, 507}, {95, 17}} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 360 + + NSCellFlags + 75628032 + NSCellFlags2 + 71303168 + NSContents + + CF$UID + 359 + + NSControlView + + CF$UID + 356 + + NSDrawsBackground + + NSSupport + + CF$UID + 130 + + NSTextColor + + CF$UID + 32 + + + Validation failed + + + $class + + CF$UID + 31 + + NSColorSpace + 1 + NSRGB + + MSAwLjcxOTk2NzI1IDAuNzQ3Mjk4NDgA + + + {480, 547} + WOX + + $class + + CF$UID + 202 + + NSColor + + CF$UID + 27 + + NSIdentifier + + CF$UID + 364 + + NSLabel + + CF$UID + 365 + + NSTabView + + CF$UID + 15 + + NSView + + CF$UID + 17 + + + wo + WO + + $classes + + NSTabView + NSView + NSResponder + NSObject + + $classname + NSTabView + + + $class + + CF$UID + 36 + + NSCell + + CF$UID + 369 + + NSEnabled + + NSFrame + + CF$UID + 368 + + NSNextResponder + + CF$UID + 13 + + NSSuperview + + CF$UID + 13 + + NSvFlags + 34 + + {{3, 4}, {442, 11}} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 27 + + NSCellFlags + 67239424 + NSCellFlags2 + 4194304 + NSContents + + CF$UID + 370 + + NSControlView + + CF$UID + 367 + + NSSupport + + CF$UID + 253 + + NSTextColor + + CF$UID + 32 + + + Status Bar + + + $class + + CF$UID + 375 + + NSDrawMatrix + + CF$UID + 372 + + NSFrame + + CF$UID + 374 + + NSMaxValue + 100 + NSNextResponder + + CF$UID + 13 + + NSSuperview + + CF$UID + 13 + + NSpiFlags + 12554 + NSvFlags + 1057 + + + $class + + CF$UID + 373 + + + + $classes + + NSPSMatrix + NSObject + + $classname + NSPSMatrix + + {{450, 2}, {16, 16}} + + $classes + + NSProgressIndicator + NSView + NSResponder + NSObject + + $classname + NSProgressIndicator + + + $class + + CF$UID + 386 + + NSBorderType + 3 + NSBoxType + 2 + NSFrame + + CF$UID + 380 + + NSNextResponder + + CF$UID + 13 + + NSOffsets + + CF$UID + 381 + + NSSubviews + + CF$UID + 377 + + NSSuperview + + CF$UID + 13 + + NSTitleCell + + CF$UID + 382 + + NSTitlePosition + 0 + NSTransparent + + NSvFlags + 34 + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 378 + + + + + $class + + CF$UID + 138 + + NSFrame + + CF$UID + 379 + + NSNextResponder + + CF$UID + 376 + + NSSuperview + + CF$UID + 376 + + + {{2, 2}, {125, 1}} + {{0, 16}, {480, 5}} + {0, 0} + + $class + + CF$UID + 35 + + NSBackgroundColor + + CF$UID + 384 + + NSCellFlags + 67239424 + NSCellFlags2 + 0 + NSContents + + CF$UID + 383 + + NSSupport + + CF$UID + 291 + + NSTextColor + + CF$UID + 32 + + + Box + + $class + + CF$UID + 31 + + NSCatalogName + + CF$UID + 28 + + NSColor + + CF$UID + 65 + + NSColorName + + CF$UID + 385 + + NSColorSpace + 6 + + textBackgroundColor + + $classes + + NSBox + NSView + NSResponder + NSObject + + $classname + NSBox + + {{1, 9}, {480, 565}} + {{0, 0}, {1024, 746}} + {213, 129} + {3.40282e+38, 3.40282e+38} + MainWindow + + $classes + + NSWindowTemplate + NSObject + + $classname + NSWindowTemplate + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 394 + + + CF$UID + 408 + + + CF$UID + 412 + + + CF$UID + 418 + + + CF$UID + 423 + + + CF$UID + 429 + + + CF$UID + 433 + + + CF$UID + 438 + + + CF$UID + 442 + + + CF$UID + 446 + + + CF$UID + 451 + + + CF$UID + 456 + + + CF$UID + 462 + + + CF$UID + 467 + + + CF$UID + 472 + + + CF$UID + 477 + + + CF$UID + 482 + + + CF$UID + 487 + + + CF$UID + 492 + + + CF$UID + 497 + + + CF$UID + 502 + + + CF$UID + 506 + + + CF$UID + 510 + + + CF$UID + 514 + + + CF$UID + 520 + + + CF$UID + 524 + + + CF$UID + 528 + + + CF$UID + 532 + + + CF$UID + 537 + + + CF$UID + 542 + + + CF$UID + 544 + + + CF$UID + 545 + + + CF$UID + 551 + + + CF$UID + 556 + + + CF$UID + 560 + + + CF$UID + 565 + + + CF$UID + 567 + + + CF$UID + 569 + + + CF$UID + 571 + + + CF$UID + 573 + + + CF$UID + 575 + + + CF$UID + 577 + + + CF$UID + 579 + + + CF$UID + 581 + + + CF$UID + 583 + + + CF$UID + 585 + + + CF$UID + 587 + + + CF$UID + 592 + + + CF$UID + 596 + + + CF$UID + 598 + + + CF$UID + 600 + + + CF$UID + 602 + + + CF$UID + 607 + + + CF$UID + 609 + + + CF$UID + 610 + + + CF$UID + 612 + + + CF$UID + 616 + + + CF$UID + 621 + + + CF$UID + 623 + + + CF$UID + 625 + + + CF$UID + 627 + + + CF$UID + 629 + + + CF$UID + 631 + + + CF$UID + 633 + + + CF$UID + 635 + + + CF$UID + 637 + + + CF$UID + 641 + + + CF$UID + 646 + + + CF$UID + 650 + + + CF$UID + 654 + + + CF$UID + 655 + + + CF$UID + 656 + + + CF$UID + 657 + + + CF$UID + 659 + + + CF$UID + 660 + + + CF$UID + 662 + + + CF$UID + 673 + + + CF$UID + 734 + + + CF$UID + 736 + + + CF$UID + 738 + + + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 406 + + NSSource + + CF$UID + 395 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 398 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 396 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 397 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 729 + + NSName + + CF$UID + 731 + + NSTitle + + CF$UID + 728 + + + Minimize + m + + $class + + CF$UID + 402 + + NSClassName + + CF$UID + 400 + + NSResourceName + + CF$UID + 401 + + + NSImage + NSMenuCheckmark + + $classes + + NSCustomResource + %NSCustomResource + NSObject + + $classname + NSCustomResource + + + $class + + CF$UID + 402 + + NSClassName + + CF$UID + 400 + + NSResourceName + + CF$UID + 404 + + + NSMenuMixedState + + $classes + + NSMenuItem + NSObject + + $classname + NSMenuItem + + + $class + + CF$UID + 4 + + NS.string + performMiniaturize: + + + $classes + + NSNibControlConnector + NSNibConnector + NSObject + + $classname + NSNibControlConnector + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 411 + + NSSource + + CF$UID + 409 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 396 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 410 + + + Bring All to Front + + $class + + CF$UID + 4 + + NS.string + arrangeInFront: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 417 + + NSSource + + CF$UID + 413 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 416 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 414 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 415 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 699 + + NSTitle + + CF$UID + 698 + + + Print… + p + + $class + + CF$UID + 4 + + NS.string + print: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 422 + + NSSource + + CF$UID + 419 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 421 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 414 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 420 + + + Page Setup… + P + + $class + + CF$UID + 4 + + NS.string + runPageLayout: + + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 2 + + NSLabel + + CF$UID + 428 + + NSSource + + CF$UID + 424 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 427 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 426 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 679 + + NSName + + CF$UID + 694 + + NSTitle + + CF$UID + 677 + + + Quit %@ + q + + $class + + CF$UID + 4 + + NS.string + terminate: + + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 2 + + NSLabel + + CF$UID + 432 + + NSSource + + CF$UID + 430 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 431 + + + About %@ + + $class + + CF$UID + 4 + + NS.string + orderFrontStandardAboutPanel: + + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 2 + + NSLabel + + CF$UID + 437 + + NSSource + + CF$UID + 434 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 436 + + NSKeyEquivModMask + 1572864 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 435 + + + Hide Others + h + hideOtherApplications: + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 2 + + NSLabel + + CF$UID + 441 + + NSSource + + CF$UID + 439 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 436 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 440 + + + Hide %@ + hide: + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 2 + + NSLabel + + CF$UID + 445 + + NSSource + + CF$UID + 443 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 444 + + + Show All + unhideAllApplications: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 450 + + NSSource + + CF$UID + 447 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 449 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 414 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 448 + + + Close + w + performClose: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 455 + + NSSource + + CF$UID + 452 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 453 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 454 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 716 + + NSTitle + + CF$UID + 714 + + + Check Spelling as You Type + toggleContinuousSpellChecking: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 461 + + NSSource + + CF$UID + 457 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 460 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 459 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 705 + + NSTitle + + CF$UID + 704 + + + Undo + z + + $class + + CF$UID + 4 + + NS.string + undo: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 466 + + NSSource + + CF$UID + 463 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 465 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 464 + + + Copy + c + + $class + + CF$UID + 4 + + NS.string + copy: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 471 + + NSSource + + CF$UID + 468 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 470 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 453 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 469 + + + Check Spelling + ; + + $class + + CF$UID + 4 + + NS.string + checkSpelling: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 476 + + NSSource + + CF$UID + 473 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 475 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 474 + + + Paste + v + + $class + + CF$UID + 4 + + NS.string + paste: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 481 + + NSSource + + CF$UID + 478 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 479 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 480 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 720 + + NSTitle + + CF$UID + 718 + + + Stop Speaking + stopSpeaking: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 486 + + NSSource + + CF$UID + 483 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 485 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 484 + + + Cut + x + + $class + + CF$UID + 4 + + NS.string + cut: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 491 + + NSSource + + CF$UID + 488 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 490 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 453 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 489 + + + Spelling… + : + + $class + + CF$UID + 4 + + NS.string + showGuessPanel: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 496 + + NSSource + + CF$UID + 493 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 495 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 494 + + + Redo + Z + + $class + + CF$UID + 4 + + NS.string + redo: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 501 + + NSSource + + CF$UID + 498 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 500 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 499 + + + Select All + a + + $class + + CF$UID + 4 + + NS.string + selectAll: + + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 505 + + NSSource + + CF$UID + 503 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 479 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 504 + + + Start Speaking + startSpeaking: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 509 + + NSSource + + CF$UID + 507 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 508 + + + Delete + delete: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 513 + + NSSource + + CF$UID + 511 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 396 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 512 + + + Zoom + performZoom: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 519 + + NSSource + + CF$UID + 515 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 518 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 516 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTag + 1 + NSTitle + + CF$UID + 517 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 712 + + NSTitle + + CF$UID + 711 + + + Find… + f + performFindPanelAction: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 519 + + NSSource + + CF$UID + 521 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 523 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 516 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTag + 2 + NSTitle + + CF$UID + 522 + + + Find Next + g + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 519 + + NSSource + + CF$UID + 525 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 527 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 516 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTag + 3 + NSTitle + + CF$UID + 526 + + + Find Previous + G + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 519 + + NSSource + + CF$UID + 529 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 531 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 516 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTag + 7 + NSTitle + + CF$UID + 530 + + + Use Selection for Find + e + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 536 + + NSSource + + CF$UID + 533 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 535 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 516 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 534 + + + Jump to Selection + j + centerSelectionInVisibleArea: + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 540 + + NSSource + + CF$UID + 2 + + + + $class + + CF$UID + 5 + + NSClassName + + CF$UID + 539 + + + SOPEXAppController + delegate + + $classes + + NSNibOutletConnector + NSNibConnector + NSObject + + $classname + NSNibOutletConnector + + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 8 + + NSLabel + + CF$UID + 543 + + NSSource + + CF$UID + 538 + + + mainWindow + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 540 + + NSSource + + CF$UID + 8 + + + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 550 + + NSSource + + CF$UID + 546 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 549 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 547 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 548 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 667 + + NSTitle + + CF$UID + 665 + + + Show Statistics + S + openStatistics: + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 555 + + NSSource + + CF$UID + 552 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 554 + + NSKeyEquivModMask + 1572864 + NSMenu + + CF$UID + 547 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 553 + + + Restart + r + restartDaemonTask: + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 559 + + NSSource + + CF$UID + 557 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 547 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 558 + + + Show Console + openConsole: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 564 + + NSSource + + CF$UID + 561 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 563 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 547 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 562 + + + Clean Console + k + clear: + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 430 + + NSLabel + + CF$UID + 566 + + NSSource + + CF$UID + 538 + + + aboutMenuItem + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 439 + + NSLabel + + CF$UID + 568 + + NSSource + + CF$UID + 538 + + + hideMenuItem + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 424 + + NSLabel + + CF$UID + 570 + + NSSource + + CF$UID + 538 + + + quitMenuItem + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 145 + + NSLabel + + CF$UID + 572 + + NSSource + + CF$UID + 538 + + + webView + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 574 + + NSSource + + CF$UID + 145 + + + downloadDelegate + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 576 + + NSSource + + CF$UID + 145 + + + frameLoadDelegate + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 578 + + NSSource + + CF$UID + 145 + + + policyDelegate + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 580 + + NSSource + + CF$UID + 145 + + + resourceLoadDelegate + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 582 + + NSSource + + CF$UID + 145 + + + UIDelegate + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 367 + + NSLabel + + CF$UID + 584 + + NSSource + + CF$UID + 538 + + + statusBarTextField + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 371 + + NSLabel + + CF$UID + 586 + + NSSource + + CF$UID + 538 + + + progressIndicator + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 591 + + NSSource + + CF$UID + 588 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 590 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 589 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSState + 1 + NSTitle + + CF$UID + 201 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 724 + + NSTitle + + CF$UID + 722 + + + 1 + viewApplication: + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 595 + + NSSource + + CF$UID + 593 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 547 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 594 + + + *debug* Toggle Toolbar + toggleToolbar: + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 211 + + NSLabel + + CF$UID + 597 + + NSSource + + CF$UID + 538 + + + htmlView + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 15 + + NSLabel + + CF$UID + 599 + + NSSource + + CF$UID + 538 + + + tabView + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 588 + + NSLabel + + CF$UID + 601 + + NSSource + + CF$UID + 538 + + + viewApplicationMenuItem + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 603 + + NSLabel + + CF$UID + 606 + + NSSource + + CF$UID + 538 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 605 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 589 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTag + 1 + NSTitle + + CF$UID + 604 + + + Source + 2 + viewSourceMenuItem + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 608 + + NSSource + + CF$UID + 272 + + + dataSource + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 540 + + NSSource + + CF$UID + 272 + + + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 272 + + NSLabel + + CF$UID + 611 + + NSSource + + CF$UID + 538 + + + responseHeaderInfoTableView + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 615 + + NSSource + + CF$UID + 613 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 614 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 589 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTag + 1 + NSTitle + + CF$UID + 263 + + + 3 + viewHTML: + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 620 + + NSSource + + CF$UID + 617 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 619 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 589 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTag + 1 + NSTitle + + CF$UID + 618 + + + HTTP Info + 4 + viewHTTP: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 622 + + NSSource + + CF$UID + 603 + + + viewSource: + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 347 + + NSLabel + + CF$UID + 624 + + NSSource + + CF$UID + 538 + + + woxNameField + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 326 + + NSLabel + + CF$UID + 626 + + NSSource + + CF$UID + 538 + + + woxSourceView + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 19 + + NSLabel + + CF$UID + 628 + + NSSource + + CF$UID + 538 + + + woComponentNameField + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 43 + + NSLabel + + CF$UID + 630 + + NSSource + + CF$UID + 538 + + + woSourceView + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 101 + + NSLabel + + CF$UID + 632 + + NSSource + + CF$UID + 538 + + + woDefinitionView + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 613 + + NSLabel + + CF$UID + 634 + + NSSource + + CF$UID + 538 + + + viewHTMLMenuItem + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 617 + + NSLabel + + CF$UID + 636 + + NSSource + + CF$UID + 538 + + + viewHTTPMenuItem + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 640 + + NSSource + + CF$UID + 638 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 414 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 639 + + + Revert to Saved + revertDocumentToSaved: + + $class + + CF$UID + 407 + + NSLabel + + CF$UID + 645 + + NSSource + + CF$UID + 642 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 644 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 414 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 643 + + + Save + s + saveDocument: + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 649 + + NSSource + + CF$UID + 647 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 554 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 589 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 648 + + + Reload + reload: + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 653 + + NSSource + + CF$UID + 651 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 589 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 652 + + + Go Back + back: + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 540 + + NSSource + + CF$UID + 326 + + + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 540 + + NSSource + + CF$UID + 43 + + + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 540 + + NSSource + + CF$UID + 101 + + + + $class + + CF$UID + 407 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 658 + + NSSource + + CF$UID + 351 + + + editInXcode: + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 538 + + NSLabel + + CF$UID + 540 + + NSSource + + CF$UID + 211 + + + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 356 + + NSLabel + + CF$UID + 661 + + NSSource + + CF$UID + 326 + + + statusField + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 663 + + NSLabel + + CF$UID + 672 + + NSSource + + CF$UID + 538 + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 666 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 664 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 547 + + NSTitle + + CF$UID + 665 + + + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 675 + + NSName + + CF$UID + 732 + + NSTitle + + CF$UID + 674 + + + Debug + submenuAction: + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 552 + + + CF$UID + 668 + + + CF$UID + 546 + + + CF$UID + 557 + + + CF$UID + 669 + + + CF$UID + 561 + + + CF$UID + 670 + + + CF$UID + 593 + + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 547 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 547 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 547 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $classes + + NSMenu + NSObject + + $classname + NSMenu + + debugMenuItem + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 664 + + NSLabel + + CF$UID + 733 + + NSSource + + CF$UID + 538 + + + MainMenu + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 676 + + + CF$UID + 695 + + + CF$UID + 701 + + + CF$UID + 663 + + + CF$UID + 721 + + + CF$UID + 726 + + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 678 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 664 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 425 + + NSTitle + + CF$UID + 677 + + + SOPEX + submenuAction: + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 430 + + + CF$UID + 680 + + + CF$UID + 681 + + + CF$UID + 684 + + + CF$UID + 685 + + + CF$UID + 692 + + + CF$UID + 439 + + + CF$UID + 434 + + + CF$UID + 443 + + + CF$UID + 693 + + + CF$UID + 424 + + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSKeyEquiv + + CF$UID + 683 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 682 + + + Preferences… + , + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 687 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 688 + + NSTitle + + CF$UID + 686 + + + Services + submenuAction: + + $class + + CF$UID + 671 + + NSMenuItems + + CF$UID + 690 + + NSName + + CF$UID + 691 + + NSTitle + + CF$UID + 689 + + + + $class + + CF$UID + 4 + + NS.string + Services + + + $class + + CF$UID + 61 + + NS.objects + + + _NSServicesMenu + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 425 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + _NSAppleMenu + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 697 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 664 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 414 + + NSTitle + + CF$UID + 696 + + + File + submenuAction: + + $class + + CF$UID + 4 + + NS.string + File + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 447 + + + CF$UID + 642 + + + CF$UID + 638 + + + CF$UID + 700 + + + CF$UID + 419 + + + CF$UID + 413 + + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 414 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 703 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 664 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 458 + + NSTitle + + CF$UID + 702 + + + Edit + submenuAction: + + $class + + CF$UID + 4 + + NS.string + Edit + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 457 + + + CF$UID + 493 + + + CF$UID + 706 + + + CF$UID + 483 + + + CF$UID + 463 + + + CF$UID + 473 + + + CF$UID + 507 + + + CF$UID + 498 + + + CF$UID + 707 + + + CF$UID + 708 + + + CF$UID + 713 + + + CF$UID + 717 + + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 710 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 516 + + NSTitle + + CF$UID + 709 + + + Find + submenuAction: + + $class + + CF$UID + 4 + + NS.string + Find + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 515 + + + CF$UID + 521 + + + CF$UID + 525 + + + CF$UID + 529 + + + CF$UID + 533 + + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 715 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 453 + + NSTitle + + CF$UID + 714 + + + Spelling + submenuAction: + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 488 + + + CF$UID + 468 + + + CF$UID + 452 + + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 719 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 458 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 479 + + NSTitle + + CF$UID + 718 + + + Speech + submenuAction: + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 503 + + + CF$UID + 478 + + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 723 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 664 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 589 + + NSTitle + + CF$UID + 722 + + + View + submenuAction: + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 647 + + + CF$UID + 651 + + + CF$UID + 725 + + + CF$UID + 588 + + + CF$UID + 603 + + + CF$UID + 613 + + + CF$UID + 617 + + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 589 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + + $class + + CF$UID + 405 + + NSAction + + CF$UID + 727 + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 664 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSSubmenu + + CF$UID + 396 + + NSTitle + + CF$UID + 10 + + + submenuAction: + + $class + + CF$UID + 4 + + NS.string + Window + + + $class + + CF$UID + 61 + + NS.objects + + + CF$UID + 395 + + + CF$UID + 511 + + + CF$UID + 730 + + + CF$UID + 409 + + + + + $class + + CF$UID + 405 + + NSIsDisabled + + NSIsSeparator + + NSKeyEquiv + + CF$UID + 22 + + NSKeyEquivModMask + 1048576 + NSMenu + + CF$UID + 396 + + NSMixedImage + + CF$UID + 403 + + NSMnemonicLoc + 2147483647 + NSOnImage + + CF$UID + 399 + + NSTitle + + CF$UID + 22 + + + _NSWindowsMenu + _NSMainMenu + mainMenu + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 725 + + NSLabel + + CF$UID + 735 + + NSSource + + CF$UID + 538 + + + viewSeparatorMenuItem + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 126 + + NSLabel + + CF$UID + 737 + + NSSource + + CF$UID + 43 + + + statusField + + $class + + CF$UID + 541 + + NSDestination + + CF$UID + 132 + + NSLabel + + CF$UID + 737 + + NSSource + + CF$UID + 101 + + + + $class + + CF$UID + 740 + + NS.objects + + + CF$UID + 395 + + + CF$UID + 447 + + + CF$UID + 730 + + + CF$UID + 717 + + + CF$UID + 203 + + + CF$UID + 320 + + + CF$UID + 708 + + + CF$UID + 396 + + + CF$UID + 603 + + + CF$UID + 676 + + + CF$UID + 695 + + + CF$UID + 685 + + + CF$UID + 725 + + + CF$UID + 205 + + + CF$UID + 282 + + + CF$UID + 663 + + + CF$UID + 211 + + + CF$UID + 463 + + + CF$UID + 378 + + + CF$UID + 638 + + + CF$UID + 642 + + + CF$UID + 478 + + + CF$UID + 409 + + + CF$UID + 318 + + + CF$UID + 452 + + + CF$UID + 701 + + + CF$UID + 516 + + + CF$UID + 326 + + + CF$UID + 39 + + + CF$UID + 613 + + + CF$UID + 473 + + + CF$UID + 688 + + + CF$UID + 664 + + + CF$UID + 347 + + + CF$UID + 363 + + + CF$UID + 515 + + + CF$UID + 249 + + + CF$UID + 721 + + + CF$UID + 700 + + + CF$UID + 453 + + + CF$UID + 419 + + + CF$UID + 498 + + + CF$UID + 207 + + + CF$UID + 101 + + + CF$UID + 617 + + + CF$UID + 488 + + + CF$UID + 507 + + + CF$UID + 43 + + + CF$UID + 141 + + + CF$UID + 17 + + + CF$UID + 15 + + + CF$UID + 692 + + + CF$UID + 588 + + + CF$UID + 726 + + + CF$UID + 707 + + + CF$UID + 97 + + + CF$UID + 126 + + + CF$UID + 503 + + + CF$UID + 367 + + + CF$UID + 371 + + + CF$UID + 457 + + + CF$UID + 521 + + + CF$UID + 681 + + + CF$UID + 458 + + + CF$UID + 589 + + + CF$UID + 268 + + + CF$UID + 546 + + + CF$UID + 713 + + + CF$UID + 525 + + + CF$UID + 557 + + + CF$UID + 684 + + + CF$UID + 538 + + + CF$UID + 493 + + + CF$UID + 670 + + + CF$UID + 547 + + + CF$UID + 145 + + + CF$UID + 356 + + + CF$UID + 322 + + + CF$UID + 439 + + + CF$UID + 413 + + + CF$UID + 376 + + + CF$UID + 293 + + + CF$UID + 272 + + + CF$UID + 468 + + + CF$UID + 669 + + + CF$UID + 693 + + + CF$UID + 37 + + + CF$UID + 593 + + + CF$UID + 434 + + + CF$UID + 552 + + + CF$UID + 19 + + + CF$UID + 529 + + + CF$UID + 414 + + + CF$UID + 424 + + + CF$UID + 312 + + + CF$UID + 264 + + + CF$UID + 425 + + + CF$UID + 561 + + + CF$UID + 479 + + + CF$UID + 668 + + + CF$UID + 706 + + + CF$UID + 430 + + + CF$UID + 13 + + + CF$UID + 443 + + + CF$UID + 143 + + + CF$UID + 511 + + + CF$UID + 647 + + + CF$UID + 266 + + + CF$UID + 351 + + + CF$UID + 533 + + + CF$UID + 132 + + + CF$UID + 8 + + + CF$UID + 258 + + + CF$UID + 483 + + + CF$UID + 651 + + + CF$UID + 680 + + + + + $classes + + NSArray + NSObject + + $classname + NSArray + + + $class + + CF$UID + 740 + + NS.objects + + + CF$UID + 396 + + + CF$UID + 414 + + + CF$UID + 396 + + + CF$UID + 458 + + + CF$UID + 15 + + + CF$UID + 318 + + + CF$UID + 458 + + + CF$UID + 726 + + + CF$UID + 589 + + + CF$UID + 664 + + + CF$UID + 664 + + + CF$UID + 425 + + + CF$UID + 589 + + + CF$UID + 203 + + + CF$UID + 272 + + + CF$UID + 664 + + + CF$UID + 207 + + + CF$UID + 458 + + + CF$UID + 376 + + + CF$UID + 414 + + + CF$UID + 414 + + + CF$UID + 479 + + + CF$UID + 396 + + + CF$UID + 15 + + + CF$UID + 453 + + + CF$UID + 664 + + + CF$UID + 708 + + + CF$UID + 322 + + + CF$UID + 37 + + + CF$UID + 589 + + + CF$UID + 458 + + + CF$UID + 685 + + + CF$UID + 2 + + + CF$UID + 320 + + + CF$UID + 15 + + + CF$UID + 516 + + + CF$UID + 205 + + + CF$UID + 664 + + + CF$UID + 414 + + + CF$UID + 713 + + + CF$UID + 414 + + + CF$UID + 458 + + + CF$UID + 205 + + + CF$UID + 97 + + + CF$UID + 589 + + + CF$UID + 453 + + + CF$UID + 458 + + + CF$UID + 39 + + + CF$UID + 15 + + + CF$UID + 363 + + + CF$UID + 13 + + + CF$UID + 425 + + + CF$UID + 589 + + + CF$UID + 664 + + + CF$UID + 458 + + + CF$UID + 37 + + + CF$UID + 17 + + + CF$UID + 479 + + + CF$UID + 13 + + + CF$UID + 13 + + + CF$UID + 458 + + + CF$UID + 516 + + + CF$UID + 425 + + + CF$UID + 701 + + + CF$UID + 721 + + + CF$UID + 266 + + + CF$UID + 547 + + + CF$UID + 458 + + + CF$UID + 516 + + + CF$UID + 547 + + + CF$UID + 425 + + + CF$UID + 2 + + + CF$UID + 458 + + + CF$UID + 547 + + + CF$UID + 663 + + + CF$UID + 143 + + + CF$UID + 320 + + + CF$UID + 320 + + + CF$UID + 425 + + + CF$UID + 414 + + + CF$UID + 13 + + + CF$UID + 272 + + + CF$UID + 268 + + + CF$UID + 453 + + + CF$UID + 547 + + + CF$UID + 425 + + + CF$UID + 17 + + + CF$UID + 547 + + + CF$UID + 425 + + + CF$UID + 547 + + + CF$UID + 17 + + + CF$UID + 516 + + + CF$UID + 695 + + + CF$UID + 425 + + + CF$UID + 266 + + + CF$UID + 15 + + + CF$UID + 676 + + + CF$UID + 547 + + + CF$UID + 717 + + + CF$UID + 547 + + + CF$UID + 458 + + + CF$UID + 425 + + + CF$UID + 8 + + + CF$UID + 425 + + + CF$UID + 141 + + + CF$UID + 396 + + + CF$UID + 589 + + + CF$UID + 264 + + + CF$UID + 320 + + + CF$UID + 516 + + + CF$UID + 17 + + + CF$UID + 2 + + + CF$UID + 205 + + + CF$UID + 458 + + + CF$UID + 589 + + + CF$UID + 425 + + + + + $class + + CF$UID + 740 + + NS.objects + + + CF$UID + 664 + + + CF$UID + 452 + + + CF$UID + 419 + + + CF$UID + 132 + + + CF$UID + 205 + + + CF$UID + 538 + + + CF$UID + 322 + + + CF$UID + 367 + + + CF$UID + 39 + + + CF$UID + 424 + + + CF$UID + 268 + + + CF$UID + 713 + + + CF$UID + 453 + + + CF$UID + 356 + + + CF$UID + 347 + + + CF$UID + 413 + + + CF$UID + 8 + + + CF$UID + 19 + + + CF$UID + 376 + + + CF$UID + 488 + + + CF$UID + 126 + + + CF$UID + 101 + + + CF$UID + 15 + + + CF$UID + 371 + + + CF$UID + 468 + + + CF$UID + 43 + + + CF$UID + 414 + + + CF$UID + 312 + + + CF$UID + 326 + + + CF$UID + 700 + + + CF$UID + 211 + + + CF$UID + 282 + + + CF$UID + 730 + + + CF$UID + 351 + + + CF$UID + 141 + + + CF$UID + 695 + + + CF$UID + 97 + + + CF$UID + 258 + + + CF$UID + 272 + + + CF$UID + 396 + + + CF$UID + 249 + + + CF$UID + 203 + + + CF$UID + 143 + + + CF$UID + 378 + + + CF$UID + 681 + + + CF$UID + 447 + + + CF$UID + 293 + + + CF$UID + 2 + + + CF$UID + 145 + + + CF$UID + 207 + + + CF$UID + 668 + + + CF$UID + 669 + + + + + $class + + CF$UID + 740 + + NS.objects + + + CF$UID + 744 + + + CF$UID + 745 + + + CF$UID + 746 + + + CF$UID + 747 + + + CF$UID + 748 + + + CF$UID + 749 + + + CF$UID + 750 + + + CF$UID + 751 + + + CF$UID + 750 + + + CF$UID + 752 + + + CF$UID + 753 + + + CF$UID + 754 + + + CF$UID + 755 + + + CF$UID + 756 + + + CF$UID + 757 + + + CF$UID + 758 + + + CF$UID + 10 + + + CF$UID + 757 + + + CF$UID + 759 + + + CF$UID + 760 + + + CF$UID + 761 + + + CF$UID + 762 + + + CF$UID + 763 + + + CF$UID + 764 + + + CF$UID + 754 + + + CF$UID + 762 + + + CF$UID + 765 + + + CF$UID + 757 + + + CF$UID + 762 + + + CF$UID + 766 + + + CF$UID + 762 + + + CF$UID + 767 + + + CF$UID + 765 + + + CF$UID + 768 + + + CF$UID + 769 + + + CF$UID + 765 + + + CF$UID + 770 + + + CF$UID + 757 + + + CF$UID + 771 + + + CF$UID + 772 + + + CF$UID + 768 + + + CF$UID + 774 + + + CF$UID + 748 + + + CF$UID + 748 + + + CF$UID + 775 + + + CF$UID + 776 + + + CF$UID + 777 + + + CF$UID + 778 + + + CF$UID + 779 + + + CF$UID + 750 + + + CF$UID + 780 + + + CF$UID + 781 + + + + + $class + + CF$UID + 4 + + NS.string + MainMenu + + NSMenuItem2 + + $class + + CF$UID + 4 + + NS.string + 5 + + NSTextField11 + NSView + AppController + NSScrollView2 + NSTextField111 + 1111 + NSScrollView1 + NSMenuItem + NSMenu + NSTextField1 + NSTextField111111 + + $class + + CF$UID + 4 + + NS.string + 6 + + NSBox1 + NSMenuItem1 + NSTextField1 + NSTextView + NSTabView + 11 + + $class + + CF$UID + 4 + + NS.string + + + + $class + + CF$UID + 4 + + NS.string + 2 + + NSTableColumn + NSButton + NSTabViewItem + NSScrollView21 + NSTableView + + $class + + CF$UID + 773 + + + + $classes + + NSNull + %NSNull + NSObject + + $classname + NSNull + + NSTabViewItem1 + 121 + + $class + + CF$UID + 4 + + NS.string + 1 + + NSTableColumn1 + + $class + + CF$UID + 4 + + NS.string + File's Owner + + WebView + 7 + 71 + + $class + + CF$UID + 740 + + NS.objects + + + CF$UID + 326 + + + CF$UID + 101 + + + CF$UID + 43 + + + + + $class + + CF$UID + 740 + + NS.objects + + + CF$UID + 44 + + + CF$UID + 44 + + + CF$UID + 44 + + + + + $class + + CF$UID + 740 + + NS.objects + + + CF$UID + 429 + + + CF$UID + 264 + + + CF$UID + 43 + + + CF$UID + 511 + + + CF$UID + 633 + + + CF$UID + 409 + + + CF$UID + 588 + + + CF$UID + 515 + + + CF$UID + 545 + + + CF$UID + 19 + + + CF$UID + 529 + + + CF$UID + 552 + + + CF$UID + 483 + + + CF$UID + 692 + + + CF$UID + 126 + + + CF$UID + 434 + + + CF$UID + 638 + + + CF$UID + 502 + + + CF$UID + 451 + + + CF$UID + 596 + + + CF$UID + 701 + + + CF$UID + 211 + + + CF$UID + 326 + + + CF$UID + 8 + + + CF$UID + 472 + + + CF$UID + 378 + + + CF$UID + 544 + + + CF$UID + 482 + + + CF$UID + 598 + + + CF$UID + 651 + + + CF$UID + 473 + + + CF$UID + 734 + + + CF$UID + 493 + + + CF$UID + 524 + + + CF$UID + 680 + + + CF$UID + 673 + + + CF$UID + 569 + + + CF$UID + 479 + + + CF$UID + 356 + + + CF$UID + 546 + + + CF$UID + 600 + + + CF$UID + 684 + + + CF$UID + 363 + + + CF$UID + 635 + + + CF$UID + 143 + + + CF$UID + 556 + + + CF$UID + 272 + + + CF$UID + 101 + + + CF$UID + 2 + + + CF$UID + 424 + + + CF$UID + 266 + + + CF$UID + 561 + + + CF$UID + 565 + + + CF$UID + 602 + + + CF$UID + 571 + + + CF$UID + 688 + + + CF$UID + 670 + + + CF$UID + 637 + + + CF$UID + 312 + + + CF$UID + 668 + + + CF$UID + 487 + + + CF$UID + 503 + + + CF$UID + 457 + + + CF$UID + 607 + + + CF$UID + 447 + + + CF$UID + 641 + + + CF$UID + 573 + + + CF$UID + 537 + + + CF$UID + 37 + + + CF$UID + 575 + + + CF$UID + 268 + + + CF$UID + 589 + + + CF$UID + 609 + + + CF$UID + 646 + + + CF$UID + 320 + + + CF$UID + 603 + + + CF$UID + 533 + + + CF$UID + 141 + + + CF$UID + 438 + + + CF$UID + 592 + + + CF$UID + 577 + + + CF$UID + 700 + + + CF$UID + 676 + + + CF$UID + 443 + + + CF$UID + 205 + + + CF$UID + 610 + + + CF$UID + 547 + + + CF$UID + 367 + + + CF$UID + 433 + + + CF$UID + 650 + + + CF$UID + 532 + + + CF$UID + 13 + + + CF$UID + 446 + + + CF$UID + 654 + + + CF$UID + 97 + + + CF$UID + 419 + + + CF$UID + 612 + + + CF$UID + 413 + + + CF$UID + 507 + + + CF$UID + 693 + + + CF$UID + 17 + + + CF$UID + 467 + + + CF$UID + 725 + + + CF$UID + 462 + + + CF$UID + 412 + + + CF$UID + 655 + + + CF$UID + 498 + + + CF$UID + 376 + + + CF$UID + 39 + + + CF$UID + 616 + + + CF$UID + 456 + + + CF$UID + 662 + + + CF$UID + 708 + + + CF$UID + 521 + + + CF$UID + 656 + + + CF$UID + 621 + + + CF$UID + 506 + + + CF$UID + 593 + + + CF$UID + 452 + + + CF$UID + 663 + + + CF$UID + 713 + + + CF$UID + 657 + + + CF$UID + 551 + + + CF$UID + 623 + + + CF$UID + 642 + + + CF$UID + 145 + + + CF$UID + 293 + + + CF$UID + 282 + + + CF$UID + 557 + + + CF$UID + 659 + + + CF$UID + 15 + + + CF$UID + 347 + + + CF$UID + 625 + + + CF$UID + 717 + + + CF$UID + 249 + + + CF$UID + 613 + + + CF$UID + 510 + + + CF$UID + 442 + + + CF$UID + 408 + + + CF$UID + 660 + + + CF$UID + 695 + + + CF$UID + 560 + + + CF$UID + 738 + + + CF$UID + 567 + + + CF$UID + 414 + + + CF$UID + 425 + + + CF$UID + 579 + + + CF$UID + 706 + + + CF$UID + 520 + + + CF$UID + 395 + + + CF$UID + 351 + + + CF$UID + 707 + + + CF$UID + 538 + + + CF$UID + 492 + + + CF$UID + 581 + + + CF$UID + 478 + + + CF$UID + 203 + + + CF$UID + 721 + + + CF$UID + 730 + + + CF$UID + 516 + + + CF$UID + 322 + + + CF$UID + 525 + + + CF$UID + 207 + + + CF$UID + 430 + + + CF$UID + 627 + + + CF$UID + 583 + + + CF$UID + 458 + + + CF$UID + 726 + + + CF$UID + 453 + + + CF$UID + 664 + + + CF$UID + 439 + + + CF$UID + 468 + + + CF$UID + 736 + + + CF$UID + 681 + + + CF$UID + 132 + + + CF$UID + 629 + + + CF$UID + 418 + + + CF$UID + 514 + + + CF$UID + 497 + + + CF$UID + 585 + + + CF$UID + 528 + + + CF$UID + 258 + + + CF$UID + 477 + + + CF$UID + 371 + + + CF$UID + 669 + + + CF$UID + 647 + + + CF$UID + 463 + + + CF$UID + 685 + + + CF$UID + 542 + + + CF$UID + 631 + + + CF$UID + 394 + + + CF$UID + 587 + + + CF$UID + 318 + + + CF$UID + 617 + + + CF$UID + 488 + + + CF$UID + 423 + + + CF$UID + 396 + + + + + $class + + CF$UID + 740 + + NS.objects + + + CF$UID + 786 + + + CF$UID + 787 + + + CF$UID + 788 + + + CF$UID + 789 + + + CF$UID + 790 + + + CF$UID + 791 + + + CF$UID + 792 + + + CF$UID + 793 + + + CF$UID + 794 + + + CF$UID + 795 + + + CF$UID + 796 + + + CF$UID + 797 + + + CF$UID + 798 + + + CF$UID + 799 + + + CF$UID + 800 + + + CF$UID + 801 + + + CF$UID + 802 + + + CF$UID + 803 + + + CF$UID + 804 + + + CF$UID + 805 + + + CF$UID + 806 + + + CF$UID + 807 + + + CF$UID + 808 + + + CF$UID + 809 + + + CF$UID + 810 + + + CF$UID + 811 + + + CF$UID + 812 + + + CF$UID + 813 + + + CF$UID + 814 + + + CF$UID + 815 + + + CF$UID + 816 + + + CF$UID + 817 + + + CF$UID + 818 + + + CF$UID + 819 + + + CF$UID + 820 + + + CF$UID + 821 + + + CF$UID + 822 + + + CF$UID + 823 + + + CF$UID + 824 + + + CF$UID + 825 + + + CF$UID + 826 + + + CF$UID + 827 + + + CF$UID + 828 + + + CF$UID + 829 + + + CF$UID + 830 + + + CF$UID + 831 + + + CF$UID + 832 + + + CF$UID + 833 + + + CF$UID + 834 + + + CF$UID + 835 + + + CF$UID + 836 + + + CF$UID + 837 + + + CF$UID + 838 + + + CF$UID + 839 + + + CF$UID + 840 + + + CF$UID + 841 + + + CF$UID + 842 + + + CF$UID + 843 + + + CF$UID + 844 + + + CF$UID + 845 + + + CF$UID + 846 + + + CF$UID + 847 + + + CF$UID + 848 + + + CF$UID + 849 + + + CF$UID + 850 + + + CF$UID + 851 + + + CF$UID + 852 + + + CF$UID + 853 + + + CF$UID + 854 + + + CF$UID + 855 + + + CF$UID + 856 + + + CF$UID + 857 + + + CF$UID + 858 + + + CF$UID + 859 + + + CF$UID + 860 + + + CF$UID + 861 + + + CF$UID + 862 + + + CF$UID + 863 + + + CF$UID + 864 + + + CF$UID + 865 + + + CF$UID + 866 + + + CF$UID + 867 + + + CF$UID + 868 + + + CF$UID + 869 + + + CF$UID + 870 + + + CF$UID + 871 + + + CF$UID + 872 + + + CF$UID + 873 + + + CF$UID + 874 + + + CF$UID + 875 + + + CF$UID + 876 + + + CF$UID + 877 + + + CF$UID + 878 + + + CF$UID + 879 + + + CF$UID + 880 + + + CF$UID + 881 + + + CF$UID + 882 + + + CF$UID + 883 + + + CF$UID + 884 + + + CF$UID + 885 + + + CF$UID + 886 + + + CF$UID + 887 + + + CF$UID + 888 + + + CF$UID + 889 + + + CF$UID + 890 + + + CF$UID + 891 + + + CF$UID + 892 + + + CF$UID + 893 + + + CF$UID + 894 + + + CF$UID + 895 + + + CF$UID + 896 + + + CF$UID + 897 + + + CF$UID + 898 + + + CF$UID + 899 + + + CF$UID + 900 + + + CF$UID + 901 + + + CF$UID + 902 + + + CF$UID + 903 + + + CF$UID + 904 + + + CF$UID + 905 + + + CF$UID + 906 + + + CF$UID + 907 + + + CF$UID + 908 + + + CF$UID + 909 + + + CF$UID + 910 + + + CF$UID + 911 + + + CF$UID + 912 + + + CF$UID + 913 + + + CF$UID + 914 + + + CF$UID + 915 + + + CF$UID + 916 + + + CF$UID + 917 + + + CF$UID + 918 + + + CF$UID + 919 + + + CF$UID + 920 + + + CF$UID + 921 + + + CF$UID + 922 + + + CF$UID + 923 + + + CF$UID + 924 + + + CF$UID + 925 + + + CF$UID + 926 + + + CF$UID + 927 + + + CF$UID + 928 + + + CF$UID + 929 + + + CF$UID + 930 + + + CF$UID + 931 + + + CF$UID + 932 + + + CF$UID + 933 + + + CF$UID + 934 + + + CF$UID + 935 + + + CF$UID + 936 + + + CF$UID + 937 + + + CF$UID + 938 + + + CF$UID + 939 + + + CF$UID + 940 + + + CF$UID + 941 + + + CF$UID + 942 + + + CF$UID + 943 + + + CF$UID + 944 + + + CF$UID + 945 + + + CF$UID + 946 + + + CF$UID + 947 + + + CF$UID + 948 + + + CF$UID + 949 + + + CF$UID + 950 + + + CF$UID + 951 + + + CF$UID + 952 + + + CF$UID + 953 + + + CF$UID + 954 + + + CF$UID + 955 + + + CF$UID + 956 + + + CF$UID + 957 + + + CF$UID + 958 + + + CF$UID + 959 + + + CF$UID + 960 + + + CF$UID + 961 + + + CF$UID + 962 + + + CF$UID + 963 + + + CF$UID + 964 + + + CF$UID + 965 + + + CF$UID + 966 + + + CF$UID + 967 + + + CF$UID + 968 + + + CF$UID + 969 + + + CF$UID + 970 + + + CF$UID + 971 + + + CF$UID + 972 + + + CF$UID + 973 + + + CF$UID + 974 + + + CF$UID + 975 + + + CF$UID + 976 + + + CF$UID + 977 + + + CF$UID + 978 + + + CF$UID + 979 + + + CF$UID + 980 + + + CF$UID + 981 + + + CF$UID + 982 + + + + 142 + 339 + 363 + 239 + 376 + 5 + 323 + 209 + 274 + 361 + 221 + 276 + 199 + 144 + 406 + 145 + 382 + 233 + 222 + 335 + 217 + 334 + 358 + 21 + 226 + 315 + 256 + 228 + 336 + 389 + 203 + 401 + 215 + 243 + 236 + 400 + 285 + 212 + 396 + 269 + 337 + 143 + 356 + 377 + 303 + 279 + 345 + 364 + 1 + 136 + 340 + 281 + 283 + 338 + 306 + 130 + 330 + 383 + 379 + 277 + 230 + 196 + 207 + 346 + 73 + 384 + 307 + 254 + 366 + 308 + 342 + 322 + 347 + 387 + 353 + 325 + 210 + 299 + 152 + 332 + 309 + 74 + 56 + 150 + 302 + 349 + 271 + 291 + 146 + 390 + 245 + 2 + 193 + 391 + 365 + 77 + 368 + 78 + 202 + 149 + 357 + 225 + 388 + 224 + 86 + 392 + 198 + 316 + 362 + 369 + 223 + 399 + 218 + 208 + 393 + 370 + 235 + 331 + 219 + 270 + 216 + 394 + 278 + 371 + 381 + 305 + 344 + 343 + 272 + 395 + 300 + 360 + 372 + 211 + 341 + 367 + 240 + 153 + 39 + 397 + 83 + 282 + 410 + 284 + 81 + 57 + 310 + 206 + 242 + 23 + 385 + 214 + 253 + 231 + 311 + 195 + 301 + 324 + 92 + 220 + 359 + 213 + 333 + 58 + 373 + 312 + 205 + 19 + 200 + 29 + 134 + 201 + 409 + 129 + 408 + 374 + 87 + 241 + 232 + 314 + 244 + 380 + 227 + 313 + 280 + 386 + 197 + 131 + 255 + 375 + 37 + 328 + 352 + 348 + 204 + 139 + 24 + + $classes + + NSIBObjectData + NSObject + + $classname + NSIBObjectData + + + $top + + IB.objectdata + + CF$UID + 1 + + + $version + 100000 + + diff --git a/sopex/SOPEX/English.lproj/SOPEXStatisticsNatLang.plist b/sopex/SOPEX/English.lproj/SOPEXStatisticsNatLang.plist new file mode 100644 index 00000000..a19aa4ff --- /dev/null +++ b/sopex/SOPEX/English.lproj/SOPEXStatisticsNatLang.plist @@ -0,0 +1,30 @@ +{ + "statisticsDate" = ""; + + "instanceLoad" = "Instance Load Factor"; + "instanceStartDate" = "Instance Start Date"; + + "totalResponseSize" = "Total Response Size (bytes)"; + "averageResponseSize" = "Average Response Size (bytes)"; + "smallestResponseSize" = "Smallest Response Size (bytes)"; + "largestResponseSize" = "Largest Response Size (bytes)"; + + "pageResponseCount" = "Page Response Count"; + "totalResponseCount" = "Total Response Count"; + + "totalDuration" = "Total Duration (seconds)"; + "maximumDuration" = "Maximum Duration (seconds)"; + "minimumDuration" = "Minimum Duration (seconds)"; + "averageDuration" = "Average Duration (seconds)"; + + "instanceUptimeInHours" = "Instance Uptime (hours)"; + "instanceUptime" = "Instance Uptime (seconds)"; + + "numberOfZippedResponses" = "Compressed Responses Count"; + "totalZippedSize" = "Total Compressed Size (bytes)"; + + "responseFrequency" = "Response Frequency (percent)"; + "pageDeliveryVolume" = "Page Delivery Volume (percent)"; + "pageFrequency" = "Page Frequency (percent)"; + "relativeTimeConsumption" = "Relative Time Consumption (percent)"; +} \ No newline at end of file diff --git a/sopex/SOPEX/English.lproj/SOPEXStats.nib/classes.nib b/sopex/SOPEX/English.lproj/SOPEXStats.nib/classes.nib new file mode 100644 index 00000000..92de6d08 --- /dev/null +++ b/sopex/SOPEX/English.lproj/SOPEXStats.nib/classes.nib @@ -0,0 +1,22 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {openApplicationInBrowser = id; orderFront = id; performRefresh = id; }; + CLASS = SOPEXStatisticsController; + LANGUAGE = ObjC; + OUTLETS = { + applicationStatsTableView = NSTableView; + baseURLTextField = NSTextField; + lastRefreshDateTextField = NSTextField; + pageStatsOutlineView = NSOutlineView; + pidTextField = NSTextField; + refreshButton = NSButton; + refreshProgressIndicator = NSProgressIndicator; + window = NSWindow; + }; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/sopex/SOPEX/English.lproj/SOPEXStats.nib/info.nib b/sopex/SOPEX/English.lproj/SOPEXStats.nib/info.nib new file mode 100644 index 00000000..6e7f775a --- /dev/null +++ b/sopex/SOPEX/English.lproj/SOPEXStats.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 55 74 356 241 0 0 1024 746 + IBFramework Version + 362.0 + IBOpenObjects + + 6 + + IBSystem Version + 7D24 + + diff --git a/sopex/SOPEX/English.lproj/SOPEXStats.nib/keyedobjects.nib b/sopex/SOPEX/English.lproj/SOPEXStats.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..74fd382146a154184757cc90c72d14a646844e5b GIT binary patch literal 10660 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 + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + SOPEX + CFBundleIconFile + + CFBundleIdentifier + org.OpenGroupware.SOPE.SOPEX + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSPrincipalClass + + + diff --git a/sopex/SOPEX/Lori.icns b/sopex/SOPEX/Lori.icns new file mode 100644 index 0000000000000000000000000000000000000000..4d1024410cdf2b6083b078bd282c5751afd4e959 GIT binary patch literal 42190 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 literal 0 HcmV?d00001 diff --git a/sopex/SOPEX/NSBundle+Ext.h b/sopex/SOPEX/NSBundle+Ext.h new file mode 100644 index 00000000..60df947a --- /dev/null +++ b/sopex/SOPEX/NSBundle+Ext.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: NSBundle+Ext.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Sun May 02 2004. + +#ifndef __NSBundle_Ext_H_ +#define __NSBundle_Ext_H_ + +#import + + +@interface NSBundle (SOPEXExt) + +- (NSString *)pathForResourceWithURLPath:(NSString *)_urlPath; + +@end + +#endif /* __NSBundle+Ext_H_ */ diff --git a/sopex/SOPEX/NSBundle+Ext.m b/sopex/SOPEX/NSBundle+Ext.m new file mode 100644 index 00000000..3c7f40c0 --- /dev/null +++ b/sopex/SOPEX/NSBundle+Ext.m @@ -0,0 +1,53 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: NSBundle+Ext.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Sun May 02 2004. + + +#import "NSBundle+Ext.h" + + +@implementation NSBundle (SOPEXExt) + +- (NSString *)pathForResourceWithURLPath:(NSString *)_urlPath +{ + static NSFileManager *fm = nil; + NSRange r; + NSString *resourcePath; + + if(fm == nil) + fm = [[NSFileManager defaultManager] retain]; + + // need to strip /Appname/WebServerResources/ first + r = [_urlPath rangeOfString:@"WebServerResources"]; + if(r.location != NSNotFound) + _urlPath = [_urlPath substringFromIndex:r.location + r.length]; + + resourcePath = [[self bundlePath] stringByAppendingPathComponent:_urlPath]; + if([fm fileExistsAtPath:resourcePath]) + return resourcePath; + + _urlPath = [_urlPath lastPathComponent]; + return [self pathForResource:[_urlPath stringByDeletingPathExtension] + ofType:[_urlPath pathExtension]]; +} + +@end diff --git a/sopex/SOPEX/NSString+Ext.h b/sopex/SOPEX/NSString+Ext.h new file mode 100644 index 00000000..3b8892ab --- /dev/null +++ b/sopex/SOPEX/NSString+Ext.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: NSString+Ext.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Mar 22 2004. + +#ifndef __NSString_Ext_H_ +#define __NSString_Ext_H_ + +#import + + +@interface NSString (SOPEXExt) + +- (BOOL)containsString:(NSString *)_other; + +@end + +#endif /* __NSString_Ext_H_ */ diff --git a/sopex/SOPEX/NSString+Ext.m b/sopex/SOPEX/NSString+Ext.m new file mode 100644 index 00000000..fc1fa0cb --- /dev/null +++ b/sopex/SOPEX/NSString+Ext.m @@ -0,0 +1,35 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: NSString+Ext.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Mar 22 2004. + +#import "NSString+Ext.h" + +@implementation NSString (SOPEXExt) + +- (BOOL)containsString:(NSString *)_other +{ + if(_other == nil) + return NO; + return [self rangeOfString:_other].location != NSNotFound; +} + +@end diff --git a/sopex/SOPEX/PROJECTLEAD b/sopex/SOPEX/PROJECTLEAD new file mode 100644 index 00000000..2e60ed5f --- /dev/null +++ b/sopex/SOPEX/PROJECTLEAD @@ -0,0 +1,3 @@ +# $Id: PROJECTLEAD 1 2004-08-20 11:17:52Z znek $ + +PROJECTLEAD=znek@mulle-kybernetik.com diff --git a/sopex/SOPEX/README b/sopex/SOPEX/README new file mode 100644 index 00000000..ab3a6187 --- /dev/null +++ b/sopex/SOPEX/README @@ -0,0 +1,104 @@ +# $Id: README 1 2004-08-20 11:17:52Z znek $ + + +ABSTRACT +======== + +SOPEX provides basic infrastructure for developing SOPE applications +using Xcode on Mac OS X. SOPEX consists of a framework, a project +template and several file templates. The SOPEX.framework provides functionality +for launching and debugging SOPE applications. SOPEX applications can be +launched as normal Desktop applications and provide their own, integrated web +browser (using Apple's WebKit). Doing so, SOPEX applications are fully +functional stand-alone HTML applications. + + +PREREQUISITES +============= + +SOPEX depends on the following frameworks to be properly installed: + +a) SxXML +b) SxCore +c) SOPE + +Please note that in order for SOPE to run properly you need to have +installed at least one SaxDriver in /Library/SaxDrivers. The SOPE +installer should take care of this, however. + + +DEBUGGING +========= + +When debugging SOPEX apps in Xcode, you'll pretty soon experience that +gdb doesn't attach to the process you're expecting to ... that is because +gdb attaches itself to the frontmost process which is the application wrapper. +The web application is a process which gets forked off the application +wrapper. So if you want to debug the web process, you have two options: + +a) attach gdb to this process manually (the process's pid is available from the +statistics panel) +b) launch the application from Xcode with the --daemon option set. Something +like this will do the trick (all arguments in a single row): +--daemon -WOProjectDirectory +/Network/Users/znek/Projects/unchecked/znek/MulleCMS2/ -WOCachingEnabled NO +-WODebuggingEnabled YES -WODebugComponentLookup YES + +It's totally clear to me that a) and b) aren't perfect. A perfect solution +would probably be to attach gdb on demand (via a menu command). I don't know +if Xcode is scriptable enough to do this. Someone with more knowledge on the +subject please elaborate! + + +USEFUL DEBUGGING DEFAULTS +========================= + +At present there's a limited set of NSUserDefaults aiding in the debugging +of SOPEX applications. Please note that all user defaults for SOPE applications +will work as well. + +-WOPort : + if set, forces the child process to be launched on this specific port. + Useful for debugging with tcpdump. + +-SNSPort : + if set, forces the parent process to listen on this port number for + SNS connections. Useful for debugging with tcpdump. + +-SOPEXDebugEnabled : + Global debug message trigger. + +-SOPEXDebugWebConnection : + Use this to trigger debug messages in SOPEXWebConnection. + + +TODO +==== + +- preferences (optional debugging options, etc.) +- session statistics, resource consumption (real mem, virtual mem) +- working auth panel +- SOPEXBrowserWindow: make favIcon work + + +Known BUGS +========== + + + +Prebinding Notes +================ + +General technical information about prebinding is available from Apple at +http://developer.apple.com/documentation/Performance/Conceptual/LaunchTime/Tasks/Prebinding.html#//apple_ref/doc/uid/20001858. + +OGo frameworks currently use the range from 0xC0000000 to 0xCFFFFFFF. + +Any questions and feedback regarding our use of this range should go to +Marcus Müller . + + +SOPEX: 0xC6000000 - 0xC6FFFFFF +============================= + +0xC6FF0000 SOPEX diff --git a/sopex/SOPEX/Reload.tiff b/sopex/SOPEX/Reload.tiff new file mode 100644 index 0000000000000000000000000000000000000000..627fe7df22e70c1215b45864d07a95d7875db52f GIT binary patch literal 14936 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 literal 0 HcmV?d00001 diff --git a/sopex/SOPEX/SOPEX.h b/sopex/SOPEX/SOPEX.h new file mode 100644 index 00000000..ce5591d1 --- /dev/null +++ b/sopex/SOPEX/SOPEX.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEX.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Feb 13 2004. + +#ifndef __SOPEX_H_ +#define __SOPEX_H_ + +#import + +#import "SOPEXAppController.h" +#import "SOPEXApplication.h" +#import "SOPEXAuthPanel.h" +#import "SOPEXBrowserWindow.h" +#import "SOPEXConsole.h" +#import "SOPEXConstants.h" +#import "SOPEXContentValidator.h" +#import "SOPEXDocument.h" +#import "SOPEXMain.h" +#import "SOPEXRangeUtilities.h" +#import "SOPEXSNSController.h" +#import "SOPEXSheetRunner.h" +#import "SOPEXStatisticsController.h" +#import "SOPEXTextView.h" +#import "SOPEXToolbarController.h" +#import "SOPEXWODocument.h" +#import "SOPEXWOXDocument.h" +#import "SOPEXWebConnection.h" +#import "SOPEXWebMetaParser.h" + +#endif /* __SOPEX_H_ */ diff --git a/sopex/SOPEX/SOPEX.xcode/project.pbxproj b/sopex/SOPEX/SOPEX.xcode/project.pbxproj new file mode 100644 index 00000000..ec8bb736 --- /dev/null +++ b/sopex/SOPEX/SOPEX.xcode/project.pbxproj @@ -0,0 +1,1536 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 39; + objects = { + 014CEA440018CDF011CA2923 = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = NO; + DEBUGGING_SYMBOLS = YES; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + OPTIMIZATION_CFLAGS = "-O0"; + ZERO_LINK = YES; + }; + isa = PBXBuildStyle; + name = Development; + }; + 014CEA450018CDF011CA2923 = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + ZERO_LINK = NO; + }; + isa = PBXBuildStyle; + name = Deployment; + }; +//010 +//011 +//012 +//013 +//014 +//030 +//031 +//032 +//033 +//034 + 034768DFFF38A50411DB9C8B = { + children = ( + 8DC2EF5B0486A6940098B216, + ); + isa = PBXGroup; + name = Products; + refType = 4; + sourceTree = ""; + }; +//030 +//031 +//032 +//033 +//034 +//080 +//081 +//082 +//083 +//084 + 0867D690FE84028FC02AAC07 = { + buildSettings = { + }; + buildStyles = ( + 014CEA440018CDF011CA2923, + 014CEA450018CDF011CA2923, + ); + hasScannedForEncodings = 1; + isa = PBXProject; + mainGroup = 0867D691FE84028FC02AAC07; + productRefGroup = 034768DFFF38A50411DB9C8B; + projectDirPath = ""; + targets = ( + 8DC2EF4F0486A6940098B216, + ); + }; + 0867D691FE84028FC02AAC07 = { + children = ( + ADDFB3F305DC513A005FB28D, + ADDFB3FB05DC51F6005FB28D, + ADDFB3FD05DC521A005FB28D, + ADDFB3F505DC517A005FB28D, + ADDFB3F705DC51A0005FB28D, + ADDFB3F905DC51BD005FB28D, + ADEE3D9505DCF8EC00F523DB, + ADFA08B10614634400E216F9, + AD3FED21060F558A00A90173, + AD3FED1B060F556400A90173, + AD3FED1E060F556C00A90173, + 08FB77AEFE84172EC02AAC07, + 32C88DFF0371C24200C91783, + 089C1665FE841158C02AAC07, + 0867D69AFE84028FC02AAC07, + 034768DFFF38A50411DB9C8B, + ); + isa = PBXGroup; + name = SOPEX; + refType = 4; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 = { + children = ( + 1058C7B1FEA5585E11CA2CBB, + ADDFB3D305DC50BD005FB28D, + ADDFB3D405DC50BD005FB28D, + ADDFB3D205DC50BD005FB28D, + ADDFB3B205DC508E005FB28D, + ); + isa = PBXGroup; + name = Frameworks; + refType = 4; + sourceTree = ""; + }; + 089C1665FE841158C02AAC07 = { + children = ( + ADDFB41D05DC532D005FB28D, + ADDFB41B05DC532D005FB28D, + ADDFB42105DC532D005FB28D, + 8DC2EF5A0486A6940098B216, + ADDFB41F05DC532D005FB28D, + 089C1666FE841158C02AAC07, + ADDFB42705DC534C005FB28D, + AD0A625905FE1D5F0067C575, + AD5C3D2506454EFD00E9BFC5, + ADDFB35605DC4D7B005FB28D, + ADDFB35705DC4D7B005FB28D, + AD0A625B05FE20950067C575, + ); + isa = PBXGroup; + name = Resources; + refType = 4; + sourceTree = ""; + }; + 089C1666FE841158C02AAC07 = { + children = ( + 089C1667FE841158C02AAC07, + ); + isa = PBXVariantGroup; + name = InfoPlist.strings; + refType = 4; + sourceTree = ""; + }; + 089C1667FE841158C02AAC07 = { + fileEncoding = 10; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/InfoPlist.strings; + refType = 4; + sourceTree = ""; + }; + 08FB77AEFE84172EC02AAC07 = { + children = ( + ADDFB35C05DC4D7B005FB28D, + ADDFB35D05DC4D7B005FB28D, + ADDFB37405DC4E58005FB28D, + ADDFB37505DC4E58005FB28D, + ); + isa = PBXGroup; + name = "Misc Debris"; + refType = 4; + sourceTree = ""; + }; +//080 +//081 +//082 +//083 +//084 +//100 +//101 +//102 +//103 +//104 + 1058C7B1FEA5585E11CA2CBB = { + fallbackIsa = PBXFileReference; + isa = PBXFrameworkReference; + lastKnownFileType = wrapper.framework; + name = Cocoa.framework; + path = /System/Library/Frameworks/Cocoa.framework; + refType = 0; + sourceTree = ""; + }; +//100 +//101 +//102 +//103 +//104 +//320 +//321 +//322 +//323 +//324 + 32C88DFF0371C24200C91783 = { + children = ( + ADEE3DAB05DCFD0800F523DB, + ADEE3D8705DCF8C800F523DB, + ); + isa = PBXGroup; + name = "Other Sources"; + refType = 4; + sourceTree = ""; + }; + 32DBCF5E0370ADEE00C91783 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEX_Prefix.pch; + refType = 4; + sourceTree = ""; + }; +//320 +//321 +//322 +//323 +//324 +//8D0 +//8D1 +//8D2 +//8D3 +//8D4 + 8DC2EF4F0486A6940098B216 = { + buildPhases = ( + 8DC2EF500486A6940098B216, + 8DC2EF520486A6940098B216, + 8DC2EF540486A6940098B216, + 8DC2EF560486A6940098B216, + 8DC2EF580486A6940098B216, + ); + buildRules = ( + ); + buildSettings = { + CURRENT_PROJECT_VERSION = 1.0.9; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1.0.9; + FRAMEWORK_SEARCH_PATHS = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + FRAMEWORK_VERSION = A; + GCC_ENABLE_TRIGRAPHS = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = SOPEX_Prefix.pch; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO; + GCC_WARN_UNKNOWN_PRAGMAS = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LIBRARY_SEARCH_PATHS = ""; + LIBRARY_STYLE = Dynamic; + OTHER_LDFLAGS = "-seg1addr 0xC6FF0000 -sub_umbrella SxCore -sub_umbrella SxXML -sub_umbrella SOPE -headerpad_max_install_names"; + PRODUCT_NAME = SOPEX; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + WRAPPER_EXTENSION = framework; + }; + dependencies = ( + ); + isa = PBXNativeTarget; + name = "SOPEX (Umbrella)"; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = SOPEX; + productReference = 8DC2EF5B0486A6940098B216; + productType = "com.apple.product-type.framework"; + }; + 8DC2EF500486A6940098B216 = { + buildActionMask = 2147483647; + files = ( + 8DC2EF510486A6940098B216, + ADDFB36105DC4D7B005FB28D, + ADDFB36305DC4D7B005FB28D, + ADDFB36705DC4D7B005FB28D, + ADDFB36905DC4D7B005FB28D, + ADDFB36B05DC4D7B005FB28D, + ADDFB36D05DC4D7B005FB28D, + ADDFB37605DC4E58005FB28D, + ADDFB37805DC4E58005FB28D, + ADDFB45305DC5555005FB28D, + ADDFB49105DC5A05005FB28D, + ADEE3DAD05DCFD0800F523DB, + ADEE3DB105DCFE0600F523DB, + AD92104C060F3A01001C0B56, + AD3FED13060F53C200A90173, + AD3FED17060F554300A90173, + AD1800BB0610B3A800ED723F, + ADFA08B40614635A00E216F9, + ADFA08BC0614771F00E216F9, + ADFA08C0061482D800E216F9, + ADDCA0CB0618850C00DEBECD, + ADB592E8061C598E0094D980, + AD81AD030621878E00550A49, + ADD5D7C606453B3400CCCB8C, + ); + isa = PBXHeadersBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8DC2EF510486A6940098B216 = { + fileRef = 32DBCF5E0370ADEE00C91783; + isa = PBXBuildFile; + settings = { + }; + }; + 8DC2EF520486A6940098B216 = { + buildActionMask = 2147483647; + files = ( + 8DC2EF530486A6940098B216, + ADDFB36505DC4D7B005FB28D, + ADDFB36605DC4D7B005FB28D, + ADDFB42805DC534C005FB28D, + ADDFB3F405DC513A005FB28D, + ADDFB3F605DC517A005FB28D, + ADDFB3F805DC51A0005FB28D, + ADDFB3FA05DC51BD005FB28D, + ADDFB3FC05DC51F6005FB28D, + ADDFB3FE05DC521A005FB28D, + ADDFB42305DC532D005FB28D, + ADDFB42405DC532D005FB28D, + ADDFB42505DC532D005FB28D, + ADDFB42605DC532D005FB28D, + AD0A625A05FE1D5F0067C575, + AD0A625C05FE20950067C575, + AD5C3D2606454EFD00E9BFC5, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8DC2EF530486A6940098B216 = { + fileRef = 089C1666FE841158C02AAC07; + isa = PBXBuildFile; + settings = { + }; + }; + 8DC2EF540486A6940098B216 = { + buildActionMask = 2147483647; + files = ( + ADDFB36205DC4D7B005FB28D, + ADDFB36405DC4D7B005FB28D, + ADDFB36805DC4D7B005FB28D, + ADDFB36A05DC4D7B005FB28D, + ADDFB36C05DC4D7B005FB28D, + ADDFB36E05DC4D7B005FB28D, + ADDFB37705DC4E58005FB28D, + ADDFB37905DC4E58005FB28D, + ADDFB45405DC5555005FB28D, + ADEE3D8805DCF8C800F523DB, + ADEE3DB205DCFE0600F523DB, + AD92104D060F3A02001C0B56, + AD3FED14060F53C200A90173, + AD3FED18060F554300A90173, + AD1800BC0610B3A800ED723F, + ADFA08B50614635A00E216F9, + ADFA08BD0614771F00E216F9, + ADFA08C1061482D800E216F9, + ADDCA0CC0618850C00DEBECD, + ADB592E9061C598E0094D980, + AD81AD040621878E00550A49, + ADD5D7C706453B3400CCCB8C, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8DC2EF560486A6940098B216 = { + buildActionMask = 2147483647; + files = ( + 8DC2EF570486A6940098B216, + ADDFB3B305DC508E005FB28D, + ADDFB3D505DC50BD005FB28D, + ADDFB3D605DC50BD005FB28D, + ADDFB3D705DC50BD005FB28D, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8DC2EF570486A6940098B216 = { + fileRef = 1058C7B1FEA5585E11CA2CBB; + isa = PBXBuildFile; + settings = { + }; + }; + 8DC2EF580486A6940098B216 = { + buildActionMask = 2147483647; + files = ( + ); + isa = PBXRezBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8DC2EF5A0486A6940098B216 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist; + path = Info.plist; + refType = 4; + sourceTree = ""; + }; + 8DC2EF5B0486A6940098B216 = { + explicitFileType = wrapper.framework; + includeInIndex = 0; + isa = PBXFileReference; + path = SOPEX.framework; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; +//8D0 +//8D1 +//8D2 +//8D3 +//8D4 +//AD0 +//AD1 +//AD2 +//AD3 +//AD4 + AD0A625705FE1D410067C575 = { + explicitFileType = text.plist; + fileEncoding = 4; + isa = PBXFileReference; + name = English; + path = English.lproj/SOPEXConsole.toolbar; + refType = 4; + sourceTree = ""; + }; + AD0A625905FE1D5F0067C575 = { + children = ( + AD0A625705FE1D410067C575, + ); + isa = PBXVariantGroup; + name = SOPEXConsole.toolbar; + refType = 4; + sourceTree = ""; + }; + AD0A625A05FE1D5F0067C575 = { + fileRef = AD0A625905FE1D5F0067C575; + isa = PBXBuildFile; + settings = { + }; + }; + AD0A625B05FE20950067C575 = { + isa = PBXFileReference; + lastKnownFileType = image.tiff; + path = Clean.tiff; + refType = 4; + sourceTree = ""; + }; + AD0A625C05FE20950067C575 = { + fileRef = AD0A625B05FE20950067C575; + isa = PBXBuildFile; + settings = { + }; + }; + AD1800B90610B3A800ED723F = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXRangeUtilities.h; + refType = 4; + sourceTree = ""; + }; + AD1800BA0610B3A800ED723F = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXRangeUtilities.m; + refType = 4; + sourceTree = ""; + }; + AD1800BB0610B3A800ED723F = { + fileRef = AD1800B90610B3A800ED723F; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + AD1800BC0610B3A800ED723F = { + fileRef = AD1800BA0610B3A800ED723F; + isa = PBXBuildFile; + settings = { + }; + }; + AD3FED11060F53C200A90173 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = "WebView+Ext.h"; + refType = 4; + sourceTree = ""; + }; + AD3FED12060F53C200A90173 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = "WebView+Ext.m"; + refType = 4; + sourceTree = ""; + }; + AD3FED13060F53C200A90173 = { + fileRef = AD3FED11060F53C200A90173; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + ); + }; + }; + AD3FED14060F53C200A90173 = { + fileRef = AD3FED12060F53C200A90173; + isa = PBXBuildFile; + settings = { + }; + }; + AD3FED15060F554300A90173 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXBrowserWindow.h; + refType = 4; + sourceTree = ""; + }; + AD3FED16060F554300A90173 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXBrowserWindow.m; + refType = 4; + sourceTree = ""; + }; + AD3FED17060F554300A90173 = { + fileRef = AD3FED15060F554300A90173; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + AD3FED18060F554300A90173 = { + fileRef = AD3FED16060F554300A90173; + isa = PBXBuildFile; + settings = { + }; + }; + AD3FED1B060F556400A90173 = { + children = ( + AD3FED15060F554300A90173, + AD3FED16060F554300A90173, + ADB592E6061C598E0094D980, + ADB592E7061C598E0094D980, + ); + isa = PBXGroup; + name = Widgets; + refType = 4; + sourceTree = ""; + }; + AD3FED1E060F556C00A90173 = { + children = ( + AD92104A060F3A01001C0B56, + AD92104B060F3A01001C0B56, + AD3FED11060F53C200A90173, + AD3FED12060F53C200A90173, + ADD5D7C406453B3400CCCB8C, + ADD5D7C506453B3400CCCB8C, + AD1800B90610B3A800ED723F, + AD1800BA0610B3A800ED723F, + ); + isa = PBXGroup; + name = Extensions; + refType = 4; + sourceTree = ""; + }; + AD3FED21060F558A00A90173 = { + children = ( + ADEE3DAF05DCFE0600F523DB, + ADEE3DB005DCFE0600F523DB, + ADDFB35405DC4D7B005FB28D, + ADDFB35505DC4D7B005FB28D, + ADDFB35205DC4D7B005FB28D, + ADDFB35305DC4D7B005FB28D, + ADDFB35805DC4D7B005FB28D, + ADDFB35905DC4D7B005FB28D, + ADDFB35A05DC4D7B005FB28D, + ADDFB35B05DC4D7B005FB28D, + ADDFB35E05DC4D7B005FB28D, + ADDFB35F05DC4D7B005FB28D, + ADDFB37205DC4E58005FB28D, + ADDFB37305DC4E58005FB28D, + ADDCA0C90618850C00DEBECD, + ADDCA0CA0618850C00DEBECD, + ); + isa = PBXGroup; + name = Controllers; + refType = 4; + sourceTree = ""; + }; + AD5C3D2306454EBE00E9BFC5 = { + fileEncoding = 10; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/Localizable.strings; + refType = 4; + sourceTree = ""; + }; + AD5C3D2506454EFD00E9BFC5 = { + children = ( + AD5C3D2306454EBE00E9BFC5, + ); + isa = PBXVariantGroup; + name = Localizable.strings; + refType = 4; + sourceTree = ""; + }; + AD5C3D2606454EFD00E9BFC5 = { + fileRef = AD5C3D2506454EFD00E9BFC5; + isa = PBXBuildFile; + settings = { + }; + }; + AD81AD010621878E00550A49 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXContentValidator.h; + refType = 4; + sourceTree = ""; + }; + AD81AD020621878E00550A49 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXContentValidator.m; + refType = 4; + sourceTree = ""; + }; + AD81AD030621878E00550A49 = { + fileRef = AD81AD010621878E00550A49; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + AD81AD040621878E00550A49 = { + fileRef = AD81AD020621878E00550A49; + isa = PBXBuildFile; + settings = { + }; + }; + AD92104A060F3A01001C0B56 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = "NSString+Ext.h"; + refType = 4; + sourceTree = ""; + }; + AD92104B060F3A01001C0B56 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = "NSString+Ext.m"; + refType = 4; + sourceTree = ""; + }; + AD92104C060F3A01001C0B56 = { + fileRef = AD92104A060F3A01001C0B56; + isa = PBXBuildFile; + settings = { + }; + }; + AD92104D060F3A02001C0B56 = { + fileRef = AD92104B060F3A01001C0B56; + isa = PBXBuildFile; + settings = { + }; + }; + ADB592E6061C598E0094D980 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXTextView.h; + refType = 4; + sourceTree = ""; + }; + ADB592E7061C598E0094D980 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXTextView.m; + refType = 4; + sourceTree = ""; + }; + ADB592E8061C598E0094D980 = { + fileRef = ADB592E6061C598E0094D980; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADB592E9061C598E0094D980 = { + fileRef = ADB592E7061C598E0094D980; + isa = PBXBuildFile; + settings = { + }; + }; + ADD5D7C406453B3400CCCB8C = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = "NSBundle+Ext.h"; + refType = 4; + sourceTree = ""; + }; + ADD5D7C506453B3400CCCB8C = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = "NSBundle+Ext.m"; + refType = 4; + sourceTree = ""; + }; + ADD5D7C606453B3400CCCB8C = { + fileRef = ADD5D7C406453B3400CCCB8C; + isa = PBXBuildFile; + settings = { + }; + }; + ADD5D7C706453B3400CCCB8C = { + fileRef = ADD5D7C506453B3400CCCB8C; + isa = PBXBuildFile; + settings = { + }; + }; + ADDCA0C90618850C00DEBECD = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXSheetRunner.h; + refType = 4; + sourceTree = ""; + }; + ADDCA0CA0618850C00DEBECD = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXSheetRunner.m; + refType = 4; + sourceTree = ""; + }; + ADDCA0CB0618850C00DEBECD = { + fileRef = ADDCA0C90618850C00DEBECD; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDCA0CC0618850C00DEBECD = { + fileRef = ADDCA0CA0618850C00DEBECD; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB35205DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXConsole.h; + refType = 4; + sourceTree = ""; + }; + ADDFB35305DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXConsole.m; + refType = 4; + sourceTree = ""; + }; + ADDFB35405DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXAppController.h; + refType = 4; + sourceTree = ""; + }; + ADDFB35505DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXAppController.m; + refType = 4; + sourceTree = ""; + }; + ADDFB35605DC4D7B005FB28D = { + isa = PBXFileReference; + lastKnownFileType = image.icns; + path = Lori.icns; + refType = 4; + sourceTree = ""; + }; + ADDFB35705DC4D7B005FB28D = { + isa = PBXFileReference; + lastKnownFileType = image.tiff; + path = Reload.tiff; + refType = 4; + sourceTree = ""; + }; + ADDFB35805DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXSNSController.h; + refType = 4; + sourceTree = ""; + }; + ADDFB35905DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXSNSController.m; + refType = 4; + sourceTree = ""; + }; + ADDFB35A05DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXStatisticsController.h; + refType = 4; + sourceTree = ""; + }; + ADDFB35B05DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXStatisticsController.m; + refType = 4; + sourceTree = ""; + }; + ADDFB35C05DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXAuthPanel.h; + refType = 4; + sourceTree = ""; + }; + ADDFB35D05DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXAuthPanel.m; + refType = 4; + sourceTree = ""; + }; + ADDFB35E05DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXToolbarController.h; + refType = 4; + sourceTree = ""; + }; + ADDFB35F05DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXToolbarController.m; + refType = 4; + sourceTree = ""; + }; + ADDFB36005DC4D7B005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = text; + name = English; + path = English.lproj/SOPEXWebUI.toolbar; + refType = 4; + sourceTree = ""; + }; + ADDFB36105DC4D7B005FB28D = { + fileRef = ADDFB35205DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB36205DC4D7B005FB28D = { + fileRef = ADDFB35305DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB36305DC4D7B005FB28D = { + fileRef = ADDFB35405DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB36405DC4D7B005FB28D = { + fileRef = ADDFB35505DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB36505DC4D7B005FB28D = { + fileRef = ADDFB35605DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB36605DC4D7B005FB28D = { + fileRef = ADDFB35705DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB36705DC4D7B005FB28D = { + fileRef = ADDFB35805DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB36805DC4D7B005FB28D = { + fileRef = ADDFB35905DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB36905DC4D7B005FB28D = { + fileRef = ADDFB35A05DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB36A05DC4D7B005FB28D = { + fileRef = ADDFB35B05DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB36B05DC4D7B005FB28D = { + fileRef = ADDFB35C05DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB36C05DC4D7B005FB28D = { + fileRef = ADDFB35D05DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB36D05DC4D7B005FB28D = { + fileRef = ADDFB35E05DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB36E05DC4D7B005FB28D = { + fileRef = ADDFB35F05DC4D7B005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB37205DC4E58005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXWebConnection.h; + refType = 4; + sourceTree = ""; + }; + ADDFB37305DC4E58005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXWebConnection.m; + refType = 4; + sourceTree = ""; + }; + ADDFB37405DC4E58005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXWebMetaParser.h; + refType = 4; + sourceTree = ""; + }; + ADDFB37505DC4E58005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXWebMetaParser.m; + refType = 4; + sourceTree = ""; + }; + ADDFB37605DC4E58005FB28D = { + fileRef = ADDFB37205DC4E58005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB37705DC4E58005FB28D = { + fileRef = ADDFB37305DC4E58005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB37805DC4E58005FB28D = { + fileRef = ADDFB37405DC4E58005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB37905DC4E58005FB28D = { + fileRef = ADDFB37505DC4E58005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3B205DC508E005FB28D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = WebKit.framework; + path = /System/Library/Frameworks/WebKit.framework; + refType = 0; + sourceTree = ""; + }; + ADDFB3B305DC508E005FB28D = { + fileRef = ADDFB3B205DC508E005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3D205DC50BD005FB28D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = SOPE.framework; + path = /Library/Frameworks/SOPE.framework; + refType = 0; + sourceTree = ""; + }; + ADDFB3D305DC50BD005FB28D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = SxCore.framework; + path = /Library/Frameworks/SxCore.framework; + refType = 0; + sourceTree = ""; + }; + ADDFB3D405DC50BD005FB28D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = SxXML.framework; + path = /Library/Frameworks/SxXML.framework; + refType = 0; + sourceTree = ""; + }; + ADDFB3D505DC50BD005FB28D = { + fileRef = ADDFB3D205DC50BD005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3D605DC50BD005FB28D = { + fileRef = ADDFB3D305DC50BD005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3D705DC50BD005FB28D = { + fileRef = ADDFB3D405DC50BD005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3F305DC513A005FB28D = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = README; + refType = 4; + sourceTree = ""; + }; + ADDFB3F405DC513A005FB28D = { + fileRef = ADDFB3F305DC513A005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3F505DC517A005FB28D = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = PROJECTLEAD; + refType = 4; + sourceTree = ""; + }; + ADDFB3F605DC517A005FB28D = { + fileRef = ADDFB3F505DC517A005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3F705DC51A0005FB28D = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = ChangeLog; + refType = 4; + sourceTree = ""; + }; + ADDFB3F805DC51A0005FB28D = { + fileRef = ADDFB3F705DC51A0005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3F905DC51BD005FB28D = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = Version; + refType = 4; + sourceTree = ""; + }; + ADDFB3FA05DC51BD005FB28D = { + fileRef = ADDFB3F905DC51BD005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3FB05DC51F6005FB28D = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = COPYING; + refType = 4; + sourceTree = ""; + }; + ADDFB3FC05DC51F6005FB28D = { + fileRef = ADDFB3FB05DC51F6005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB3FD05DC521A005FB28D = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = COPYRIGHT; + refType = 4; + sourceTree = ""; + }; + ADDFB3FE05DC521A005FB28D = { + fileRef = ADDFB3FD05DC521A005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB41B05DC532D005FB28D = { + children = ( + ADDFB41C05DC532D005FB28D, + ); + isa = PBXVariantGroup; + name = SOPEXConsole.nib; + path = ""; + refType = 4; + sourceTree = ""; + }; + ADDFB41C05DC532D005FB28D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = English; + path = English.lproj/SOPEXConsole.nib; + refType = 4; + sourceTree = ""; + }; + ADDFB41D05DC532D005FB28D = { + children = ( + ADDFB41E05DC532D005FB28D, + ); + isa = PBXVariantGroup; + name = SOPEXMainMenu.nib; + path = ""; + refType = 4; + sourceTree = ""; + }; + ADDFB41E05DC532D005FB28D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = English; + path = English.lproj/SOPEXMainMenu.nib; + refType = 4; + sourceTree = ""; + }; + ADDFB41F05DC532D005FB28D = { + children = ( + ADDFB42005DC532D005FB28D, + ); + isa = PBXVariantGroup; + name = SOPEXStatisticsNatLang.plist; + path = ""; + refType = 4; + sourceTree = ""; + }; + ADDFB42005DC532D005FB28D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = text.plist; + name = English; + path = English.lproj/SOPEXStatisticsNatLang.plist; + refType = 4; + sourceTree = ""; + }; + ADDFB42105DC532D005FB28D = { + children = ( + ADDFB42205DC532D005FB28D, + ); + isa = PBXVariantGroup; + name = SOPEXStats.nib; + path = ""; + refType = 4; + sourceTree = ""; + }; + ADDFB42205DC532D005FB28D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = English; + path = English.lproj/SOPEXStats.nib; + refType = 4; + sourceTree = ""; + }; + ADDFB42305DC532D005FB28D = { + fileRef = ADDFB41B05DC532D005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB42405DC532D005FB28D = { + fileRef = ADDFB41D05DC532D005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB42505DC532D005FB28D = { + fileRef = ADDFB41F05DC532D005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB42605DC532D005FB28D = { + fileRef = ADDFB42105DC532D005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB42705DC534C005FB28D = { + children = ( + ADDFB36005DC4D7B005FB28D, + ); + isa = PBXVariantGroup; + name = SOPEXWebUI.toolbar; + refType = 4; + sourceTree = ""; + }; + ADDFB42805DC534C005FB28D = { + fileRef = ADDFB42705DC534C005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB45105DC5555005FB28D = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXConstants.h; + refType = 4; + sourceTree = ""; + }; + ADDFB45205DC5555005FB28D = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXConstants.m; + refType = 4; + sourceTree = ""; + }; + ADDFB45305DC5555005FB28D = { + fileRef = ADDFB45105DC5555005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADDFB45405DC5555005FB28D = { + fileRef = ADDFB45205DC5555005FB28D; + isa = PBXBuildFile; + settings = { + }; + }; + ADDFB48F05DC5A05005FB28D = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEX.h; + refType = 4; + sourceTree = ""; + }; + ADDFB49105DC5A05005FB28D = { + fileRef = ADDFB48F05DC5A05005FB28D; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADEE3D8705DCF8C800F523DB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXMain.m; + refType = 4; + sourceTree = ""; + }; + ADEE3D8805DCF8C800F523DB = { + fileRef = ADEE3D8705DCF8C800F523DB; + isa = PBXBuildFile; + settings = { + }; + }; + ADEE3D9505DCF8EC00F523DB = { + children = ( + 32DBCF5E0370ADEE00C91783, + ADDFB48F05DC5A05005FB28D, + ADDFB45105DC5555005FB28D, + ADDFB45205DC5555005FB28D, + ); + isa = PBXGroup; + name = Global; + refType = 4; + sourceTree = ""; + }; + ADEE3DAB05DCFD0800F523DB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXMain.h; + refType = 4; + sourceTree = ""; + }; + ADEE3DAD05DCFD0800F523DB = { + fileRef = ADEE3DAB05DCFD0800F523DB; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADEE3DAF05DCFE0600F523DB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXApplication.h; + refType = 4; + sourceTree = ""; + }; + ADEE3DB005DCFE0600F523DB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXApplication.m; + refType = 4; + sourceTree = ""; + }; + ADEE3DB105DCFE0600F523DB = { + fileRef = ADEE3DAF05DCFE0600F523DB; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADEE3DB205DCFE0600F523DB = { + fileRef = ADEE3DB005DCFE0600F523DB; + isa = PBXBuildFile; + settings = { + }; + }; + ADFA08B10614634400E216F9 = { + children = ( + ADFA08B20614635A00E216F9, + ADFA08B30614635A00E216F9, + ADFA08BE061482D800E216F9, + ADFA08BF061482D800E216F9, + ADFA08BA0614771F00E216F9, + ADFA08BB0614771F00E216F9, + AD81AD010621878E00550A49, + AD81AD020621878E00550A49, + ); + isa = PBXGroup; + name = Model; + refType = 4; + sourceTree = ""; + }; + ADFA08B20614635A00E216F9 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXDocument.h; + refType = 4; + sourceTree = ""; + }; + ADFA08B30614635A00E216F9 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXDocument.m; + refType = 4; + sourceTree = ""; + }; + ADFA08B40614635A00E216F9 = { + fileRef = ADFA08B20614635A00E216F9; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADFA08B50614635A00E216F9 = { + fileRef = ADFA08B30614635A00E216F9; + isa = PBXBuildFile; + settings = { + }; + }; + ADFA08BA0614771F00E216F9 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXWODocument.h; + refType = 4; + sourceTree = ""; + }; + ADFA08BB0614771F00E216F9 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXWODocument.m; + refType = 4; + sourceTree = ""; + }; + ADFA08BC0614771F00E216F9 = { + fileRef = ADFA08BA0614771F00E216F9; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADFA08BD0614771F00E216F9 = { + fileRef = ADFA08BB0614771F00E216F9; + isa = PBXBuildFile; + settings = { + }; + }; + ADFA08BE061482D800E216F9 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SOPEXWOXDocument.h; + refType = 4; + sourceTree = ""; + }; + ADFA08BF061482D800E216F9 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SOPEXWOXDocument.m; + refType = 4; + sourceTree = ""; + }; + ADFA08C0061482D800E216F9 = { + fileRef = ADFA08BE061482D800E216F9; + isa = PBXBuildFile; + settings = { + ATTRIBUTES = ( + Public, + ); + }; + }; + ADFA08C1061482D800E216F9 = { + fileRef = ADFA08BF061482D800E216F9; + isa = PBXBuildFile; + settings = { + }; + }; + }; + rootObject = 0867D690FE84028FC02AAC07; +} diff --git a/sopex/SOPEX/SOPEXAppController.h b/sopex/SOPEX/SOPEXAppController.h new file mode 100644 index 00000000..01e1439c --- /dev/null +++ b/sopex/SOPEX/SOPEXAppController.h @@ -0,0 +1,112 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXAppController.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Jan 26 2004. + +#ifndef __AppController_H_ +#define __AppController_H_ + +#import +#import "SOPEXDocument.h" + +@class SOPEXBrowserWindow; +@class WebView; +@class SOPEXToolbarController; +@class SOPEXWebConnection; +@class SOPEXConsole; +@class SOPEXSNSController; +@class SOPEXStatisticsController; + + +@interface SOPEXAppController : NSObject +{ + IBOutlet SOPEXBrowserWindow *mainWindow; + IBOutlet NSMenu *mainMenu; + IBOutlet NSTabView *tabView; + + IBOutlet NSProgressIndicator *progressIndicator; + IBOutlet NSTextField *statusBarTextField; + + IBOutlet WebView *webView; + + IBOutlet NSTextField *woxNameField; + IBOutlet NSTextView *woxSourceView; + IBOutlet NSTextField *woComponentNameField; + IBOutlet NSTextView *woSourceView; + IBOutlet NSTextView *woDefinitionView; + + IBOutlet NSTextView *htmlView; + + IBOutlet NSTableView *responseHeaderInfoTableView; + NSMutableArray *responseHeaderValues; + + IBOutlet NSMenuItem *debugMenuItem; + IBOutlet NSMenuItem *viewSeparatorMenuItem; + + IBOutlet NSMenuItem *viewApplicationMenuItem; + IBOutlet NSMenuItem *viewSourceMenuItem; + IBOutlet NSMenuItem *viewHTMLMenuItem; + IBOutlet NSMenuItem *viewHTTPMenuItem; + + IBOutlet NSMenuItem *aboutMenuItem; + IBOutlet NSMenuItem *hideMenuItem; + IBOutlet NSMenuItem *quitMenuItem; + + + SOPEXWebConnection *connection; + SOPEXToolbarController *toolbarController; + SOPEXSNSController *snsd; + SOPEXConsole *console; + SOPEXStatisticsController *statsController; + NSTask *daemonTask; + + SOPEXDocument *document; +} + +- (NSTextView *)document:(SOPEXDocument *)document textViewForType:(NSString *)fileType; + +- (BOOL)isInRADMode; + +- (IBAction)restartDaemonTask:(id)sender; +- (IBAction)stopDaemonTask:(id)sender; + +/* hook to provide custom launch arguments. remember to call super! */ +- (void)appendToDaemonLaunchArguments:(NSMutableArray *)_args; + +- (IBAction)reload:(id)sender; +- (IBAction)back:(id)sender; +- (IBAction)viewApplication:(id)sender; +- (IBAction)viewSource:(id)sender; +- (IBAction)viewHTML:(id)sender; +- (IBAction)viewHTTP:(id)sender; + +- (IBAction)editInXcode:(id)sender; + +- (IBAction)openConsole:(id)sender; +- (IBAction)openStatistics:(id)sender; +- (IBAction)clear:(id)sender; + +/* debugging */ +- (IBAction)toggleToolbar:(id)sender; + +@end + +#endif /* __AppController_H_ */ diff --git a/sopex/SOPEX/SOPEXAppController.m b/sopex/SOPEX/SOPEXAppController.m new file mode 100644 index 00000000..53efb8cc --- /dev/null +++ b/sopex/SOPEX/SOPEXAppController.m @@ -0,0 +1,967 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXAppController.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Jan 26 2004. + +#import "SOPEXAppController.h" +#import +#import +#import +#import +#import +#import "SOPEXConsole.h" +#import "SOPEXToolbarController.h" +#import "SOPEXWebConnection.h" +#import "SOPEXSNSController.h" +#import "SOPEXStatisticsController.h" +#import "SOPEXConstants.h" +#import "WebView+Ext.h" +#import "SOPEXBrowserWindow.h" +#import "SOPEXRangeUtilities.h" +#import "SOPEXDocument.h" +#import "SOPEXWOXDocument.h" +#import "SOPEXWODocument.h" +#import "SOPEXSheetRunner.h" + +#define DNC [NSNotificationCenter defaultCenter] +#define UD [NSUserDefaults standardUserDefaults] + + +#define SNS_CHILD_DEBUG 0 + + +@interface SOPEXAppController (PrivateAPI) +- (void)_setup; +- (void)_setupDaemonTask; +- (void)_launchDaemonTask; +- (void)setStatus:(NSString *)_msg; +- (void)setStatus:(NSString *)_msg isError:(BOOL)isError; +- (void)flushDocument; +- (void)createDocumentFromResponse; +- (void)_selectTabWithIdentifier:(NSString *)identifier menuItem:(NSMenuItem *)menuItem; +@end + +@implementation SOPEXAppController + +static BOOL debugOn = NO; +static BOOL isInRADMode = YES; + ++ (void)initialize +{ + static BOOL isInitialized = NO; + + if(isInitialized) + return; + + debugOn = [[NSUserDefaults standardUserDefaults] boolForKey:@"SOPEXDebugEnabled"]; + isInitialized = YES; +} + + +#pragma mark - +#pragma mark ### INIT & DEALLOC ### + +- (id)init { + self = [super init]; + if(self) { + NSArray *args; + + // check, if Application has been launched by Finder + args = [[NSProcessInfo processInfo] arguments]; + if([[args lastObject] hasPrefix:@"-psn_"]) + isInRADMode = NO; + } + return self; +} + +- (void)dealloc +{ + [DNC removeObserver:self]; + [self->responseHeaderValues release]; + [self->statsController release]; + [self->snsd release]; + [self->daemonTask release]; + [self->console release]; + [super dealloc]; +} + + +#pragma mark - +#pragma mark ### SETUP ### + + +- (void)awakeFromNib +{ + NSString *appName; + + [self->webView setGroupName:@"WebUI"]; + + // Fix menu items + appName = [[NSProcessInfo processInfo] processName]; + [self->aboutMenuItem setTitle:[NSString stringWithFormat:[self->aboutMenuItem title], appName]]; + [self->hideMenuItem setTitle:[NSString stringWithFormat:[self->hideMenuItem title], appName]]; + [self->quitMenuItem setTitle:[NSString stringWithFormat:[self->quitMenuItem title], appName]]; + + self->responseHeaderValues = [[NSMutableArray alloc] initWithCapacity:20]; +#if 0 + [DNC addObserver:self selector:@selector(textViewDidChangeSelection:) name:NSTextViewDidChangeSelectionNotification object:nil]; +#endif + [self viewApplication:nil]; +} + + +- (void)_setup +{ + if(! [self isInRADMode]) { + NSMenu *viewMenu; + + // remove RAD menuItems + [self->mainMenu removeItem:self->debugMenuItem]; + viewMenu = [self->viewSeparatorMenuItem menu]; + [viewMenu removeItem:self->viewSeparatorMenuItem]; + [viewMenu removeItem:self->viewApplicationMenuItem]; + [viewMenu removeItem:self->viewSourceMenuItem]; + [viewMenu removeItem:self->viewHTMLMenuItem]; + [viewMenu removeItem:self->viewHTTPMenuItem]; + } + + self->snsd = [[SOPEXSNSController alloc] init]; + [self->snsd setDelegate:self]; + [self->snsd start]; + + if(debugOn) + NSLog(@"%s snsd's address:%@", __PRETTY_FUNCTION__, [snsd socketAddress]); + + self->console = [[SOPEXConsole alloc] init]; + + self->toolbarController = [[SOPEXToolbarController alloc] initWithIdentifier:@"SOPEXWebUI" target:self]; + + [self _setupDaemonTask]; +} + +- (void)_setupDaemonTask +{ + NSString *daemonPath; + NSMutableArray *args; + NSString *woPort; + + self->daemonTask = [[NSTask alloc] init]; + daemonPath = [[NSBundle mainBundle] executablePath]; + + // prepare the task + [self->daemonTask setLaunchPath:daemonPath]; + [self->daemonTask setStandardInput:[NSPipe new]]; +#if(SNS_CHILD_DEBUG == 0) + [self->daemonTask setStandardOutput:[NSPipe new]]; + [self->daemonTask setStandardError:[NSPipe new]]; +#endif + + // prepare arguments + args = [[NSMutableArray alloc] initWithCapacity:20]; + [args addObject:SOPEXDaemonFlag]; // this triggers 'daemon' mode + [args addObject:@"-WOContactSNS"]; + [args addObject:@"YES"]; + // increase responsiveness in case we terminate by accident + [args addObject:@"-SNSPingInterval"]; + [args addObject:@"10"]; +#if SNS_CHILD_DEBUG +#warning ** ZNeK: Debugging SNS in child + [args addObject:@"-SNSLogActivity"]; + [args addObject:@"YES"]; +#endif + [args addObject:@"-SNSPort"]; + [args addObject:[snsd socketAddress]]; + [args addObject:@"-WOPort"]; + woPort = [UD stringForKey:@"WOPort"]; + if(woPort != nil) + [args addObject:woPort]; + else + [args addObject:@"auto"]; + [self appendToDaemonLaunchArguments:args]; + [self->daemonTask setArguments:args]; + [args release]; +} + +- (void)_launchDaemonTask +{ + if(debugOn) + NSLog(@"%s", __PRETTY_FUNCTION__); + [DNC addObserver:self selector:@selector(daemonTaskDidTerminate:) name:NSTaskDidTerminateNotification object:self->daemonTask]; + +#if(SNS_CHILD_DEBUG == 0) + [self->console setStandardOutput:[self->daemonTask standardOutput] standardError:[self->daemonTask standardError]]; +#endif + + [self->daemonTask launch]; +} + +- (void)appendToDaemonLaunchArguments:(NSMutableArray *)_args { + // the next entry works, because executable's cwd is the project directory + // (set in project's launch options) + if([self isInRADMode]) { + [_args addObject:@"-WOProjectDirectory"]; + [_args addObject:[[NSFileManager defaultManager] currentDirectoryPath]]; + + // Debugging options + [_args addObject:@"-WOCachingEnabled"]; + [_args addObject:@"NO"]; + [_args addObject:@"-WODebuggingEnabled"]; + [_args addObject:@"YES"]; +#if 0 + [_args addObject:@"-WODebugComponentLookup"]; + [_args addObject:@"YES"]; + [_args addObject:@"-WODebugResourceLookup"]; + [_args addObject:@"YES"]; +#endif +#if 0 + [_args addObject:@"-WOxComponentElemBuilderDebugEnabled"]; + [_args addObject:@"YES"]; + [_args addObject:@"-WOxElemBuilder_LogAssociationMapping"]; + [_args addObject:@"YES"]; + [_args addObject:@"-WOxElemBuilder_LogAssociationCreation"]; + [_args addObject:@"YES"]; +#endif +#if 0 +#warning ** ZNeK: Profiling information + [_args addObject:@"-WOProfileComponents"]; + [_args addObject:@"YES"]; + [_args addObject:@"-WOProfileElements"]; + [_args addObject:@"YES"]; + [_args addObject:@"-WOProfileHttpAdaptor"]; + [_args addObject:@"YES"]; +#endif + } +} + +#pragma mark - +#pragma mark ### ACCESSORS ### + + +- (BOOL)isInRADMode { + return isInRADMode; +} + + +#pragma mark - +#pragma mark ### ACTIONS ### + + +- (IBAction)restartDaemonTask:(id)sender +{ + [DNC removeObserver:self name:NSTaskDidTerminateNotification object:self->daemonTask]; + + // we're done writing + [[[self->daemonTask standardInput] fileHandleForWriting] closeFile]; + + [self->daemonTask terminate]; + [self->daemonTask waitUntilExit]; + [self->daemonTask release]; + [self _setupDaemonTask]; + [self _launchDaemonTask]; +} + +- (IBAction)stopDaemonTask:(id)sender +{ + if(debugOn) + NSLog(@"%s", __PRETTY_FUNCTION__); + [self->progressIndicator startAnimation:self]; + + // we're done writing + [[[self->daemonTask standardInput] fileHandleForWriting] closeFile]; + + [self->daemonTask terminate]; + [self->daemonTask waitUntilExit]; + [NSApp terminate:self]; +} + +- (IBAction)reload:(id)sender +{ + if(sender == nil) + { + NSURLRequest *rq; + + rq = [NSURLRequest requestWithURL:[self->connection url] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0]; + if(debugOn) + NSLog(@"%s request: %@", __PRETTY_FUNCTION__, rq); + [[self->webView mainFrame] loadRequest:rq]; + } + else + { + [self->webView reload:self]; + } + [self viewApplication:sender]; +} + +- (IBAction)back:(id)sender +{ + [self->webView goBack]; +} + +- (IBAction)viewApplication:(id)sender +{ + [self _selectTabWithIdentifier:@"application" menuItem:self->viewApplicationMenuItem]; +} + +- (IBAction)viewSource:(id)sender +{ + NSString *componentName; + + componentName = [[self->document path] lastPathComponent]; + if([componentName hasSuffix:@"wo"]) + { + [self->woComponentNameField setStringValue:componentName]; + [self _selectTabWithIdentifier:@"wo" menuItem:self->viewSourceMenuItem]; + } + else + { + [self->woxNameField setStringValue:componentName]; + [self _selectTabWithIdentifier:@"wox" menuItem:self->viewSourceMenuItem]; + } +} + +- (IBAction)viewHTML:(id)sender +{ + WebDataSource *dataSource; + id representation; + NSString *source; + + dataSource = [[self->webView mainFrame] dataSource]; + NSAssert(dataSource != nil, @"dataSource not yet committed?!"); + NSAssert([dataSource isLoading] == NO, @"dataSource not finished loading?!"); + + representation = [dataSource representation]; + + if([representation canProvideDocumentSource]) + source = [representation documentSource]; + else + source = @""; + + [self->htmlView setString:source]; + [self _selectTabWithIdentifier:@"html" menuItem:self->viewHTMLMenuItem]; +} + +- (IBAction)viewHTTP:(id)sender +{ + WebDataSource *dataSource; + NSHTTPURLResponse *response; + NSDictionary *headerFields; + NSArray *headers; + int count, i; + + dataSource = [[self->webView mainFrame] dataSource]; + response = (NSHTTPURLResponse *)[dataSource response]; + + headerFields = [response allHeaderFields]; + headers = [headerFields allKeys]; + count = [headers count]; + + [self->responseHeaderValues removeAllObjects]; + + for(i = 0; i < count; i++) + { + NSString *header, *value; + NSDictionary *headerValueInfo; + + header = [headers objectAtIndex:i]; + value = [headerFields objectForKey:header]; + headerValueInfo = [[NSDictionary alloc] initWithObjectsAndKeys:value, @"value", header, @"header", nil]; + [self->responseHeaderValues addObject:headerValueInfo]; + [headerValueInfo release]; + } + + [self->responseHeaderInfoTableView reloadData]; + [self _selectTabWithIdentifier:@"http" menuItem:self->viewHTTPMenuItem]; +} + +- (void)_selectTabWithIdentifier:(NSString *)identifier menuItem:(NSMenuItem *)menuItem +{ + [self->tabView selectTabViewItemWithIdentifier:identifier]; + if(isInRADMode) + { + [self->viewApplicationMenuItem setState:menuItem == self->viewApplicationMenuItem ? NSOnState : NSOffState]; + [self->viewSourceMenuItem setState:menuItem == self->viewSourceMenuItem ? NSOnState : NSOffState]; + [self->viewHTMLMenuItem setState:menuItem == self->viewHTMLMenuItem ? NSOnState : NSOffState]; + [self->viewHTTPMenuItem setState:menuItem == self->viewHTTPMenuItem ? NSOnState : NSOffState]; + } +} + +- (IBAction)saveDocument:(id)sender +{ + if(self->document != nil) + { + if([self->document hasChanges]) + { + if(![self->document performSave]) + { + NSBeep(); + return; + } + [self->mainWindow setDocumentEdited:NO]; + } + } +} + +- (IBAction)revertDocumentToSaved:(id)sender +{ + [self->document revertChanges]; + [self->mainWindow setDocumentEdited:NO]; +} + +- (IBAction)openConsole:(id)sender +{ +#if(SNS_CHILD_DEBUG == 0) + [self->console orderFront:sender]; +#endif +} + +- (IBAction)openStatistics:(id)sender +{ + [self->statsController orderFront:sender]; +} + +- (IBAction)clear:(id)sender +{ + [self->console clear:sender]; +} + +- (IBAction)toggleToolbar:(id)sender +{ + if([self->mainWindow toolbar] == nil) + [self->toolbarController applyOnWindow:self->mainWindow]; + else + [self->mainWindow setToolbar:nil]; +} + +- (IBAction)editInXcode:(id)sender +{ + NSString *path; + + path = [self->document path]; + + [[NSWorkspace sharedWorkspace] openFile:path withApplication:@"Xcode" andDeactivate:YES]; +} + + +#pragma mark ### VALIDATION ### + + +- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem +{ + return [self validateMenuItem:(id )theItem]; +} + +- (BOOL)validateMenuItem:(id )menuItem +{ + SEL action = [menuItem action]; + +#if 0 + NSLog(@"%s action:%@", __PRETTY_FUNCTION__, NSStringFromSelector(action)); +#endif + if(action == @selector(openStatistics:)) + return self->statsController != nil; + if(action == @selector(clear:)) + return [self->console validateMenuItem:menuItem]; + if(action == @selector(back:)) + return [self->webView canGoBack]; + if(action == @selector(viewHTML:)) + { + WebDataSource *dataSource = [[self->webView mainFrame] dataSource]; + if(dataSource == nil) + return NO; + return [dataSource isLoading] == NO; + } + if(action == @selector(viewSource:)) + return self->document != nil; + if(action == @selector(saveDocument:) || action == @selector(revertDocumentToSaved:)) + if(self->document == nil) + return NO; + else + return [self->document hasChanges]; + + return YES; +} + + +#pragma mark - +#pragma mark ### SOPEXDocumentController PROTOCOL ### + + +- (NSTextView *)document:(SOPEXDocument *)_document textViewForType:(NSString *)_fileType +{ + if([_document isKindOfClass:[SOPEXWODocument class]]) { + if([_fileType isEqualToString:@"html"]) + return self->woSourceView; + return self->woDefinitionView; + } + return self->woxSourceView; +} + +- (void)document:(SOPEXDocument *)document didValidateWithError:(NSError *)error forType:(NSString *)fileType +{ + [self viewSource:self]; +} + + +#pragma mark - +#pragma mark ### NOTIFICATIONS ### + + +- (void)daemonTaskDidTerminate:(NSNotification *)notification +{ + if(debugOn) + NSLog(@"%s", __PRETTY_FUNCTION__); + [self->progressIndicator stopAnimation:self]; +} + + +#pragma mark - +#pragma mark ### APPLICATION DELEGATE ### + + +- (void)applicationWillFinishLaunching:(NSNotification *)notification +{ +} + +- (void)applicationDidFinishLaunching:(NSNotification *)notification +{ + [self setStatus:nil]; + [self _setup]; + [self _launchDaemonTask]; + if(isInRADMode) + [self openConsole:self]; +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app +{ + return YES; +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)app +{ + if(! [self windowShouldClose:self->mainWindow]) + return NSTerminateLater; + return NSTerminateNow; +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification +{ + [self stopDaemonTask:self]; +} + + +#pragma mark - +#pragma mark ### TEXTVIEW DELEGATE ### + +// ZNeK: This is something I'd like to out-source somplace else, but it just doesn't feel right +// to do it at the moment. + +- (void)textViewDidChangeSelection:(NSNotification *)notification +{ + NSTextView *textView = [notification object]; + NSEvent *event; + NSRange selRange; + + selRange = [textView selectedRange]; + event = [NSApp currentEvent]; + + if(([event type] == NSLeftMouseUp) && ([event clickCount] == 2)) + { + NSRange matchRange = SOPEX_findMatchingTagForRangeInString(selRange, [textView string]); + + if(matchRange.location != NSNotFound) + { + selRange = NSUnionRange(selRange, matchRange); + [textView setSelectedRange:selRange affinity:NSSelectionAffinityUpstream stillSelecting:YES]; + [textView scrollRangeToVisible:matchRange]; + } + } +} + + +#pragma mark - +#pragma mark ### PRIVATE API ### + + +- (void)setStatus:(NSString *)_msg +{ + [self setStatus:_msg isError:NO]; +} + +- (void)setStatus:(NSString *)_msg isError:(BOOL)isError +{ + if(_msg == nil) + _msg = @""; + [self->statusBarTextField setStringValue:_msg]; +} + +- (void)flushDocument +{ + [self->document release]; + self->document = nil; + [self->mainWindow setDocumentEdited:NO]; +} + +- (void)createDocumentFromResponse +{ + WebDataSource *dataSource; + NSHTTPURLResponse *response; + NSDictionary *headerFields; + NSString *templatePath; + + dataSource = [[self->webView mainFrame] dataSource]; + response = (NSHTTPURLResponse *)[dataSource response]; + + if([response isKindOfClass:[NSHTTPURLResponse class]]) { + headerFields = [response allHeaderFields]; + // NOTE: WebKit cuddly-capses header keys! + templatePath = [headerFields objectForKey:@"X-Sope-Template-Path"]; + if(templatePath == nil) + return; + + if([templatePath hasSuffix:@"wo"]) + self->document = [[SOPEXWODocument alloc] initWithPath:templatePath controller:self]; + else + self->document = [[SOPEXWOXDocument alloc] initWithPath:templatePath controller:self]; + } +} + + +#pragma mark - +#pragma mark ### SNS CONTROLLER DELEGATE ### + + +- (void)snsController:(SOPEXSNSController *)controller registerInstance:(NSDictionary *)instanceDescription +{ + NGInternetSocketAddress *applicationAddress; + NSString *applicationName, *url; + NSBundle *resourceBundle; + NSString *path; + + applicationName = [instanceDescription objectForKey:SNSApplicationNameKey]; + applicationAddress = [instanceDescription objectForKey:SNSApplicationAddressKey]; + + url = [NSString stringWithFormat:@"http://localhost:%d/%@", [applicationAddress port], applicationName]; + + [self->connection release]; + + // In Rapid Development mode the mainBundle path is the current working directory, + // which is where the source code is located + if(isInRADMode) { + path = [[NSFileManager defaultManager] currentDirectoryPath]; + } + else { + path = [[NSBundle mainBundle] resourcePath]; + } + + // However, SOPE:X applications have a special WebServerResources folder + path = [path stringByAppendingPathComponent:@"WebServerResources"]; + resourceBundle = [[[NSBundle alloc] initWithPath:path] autorelease]; + + self->connection = [(SOPEXWebConnection *)[SOPEXWebConnection alloc] initWithURL:url localResourceBundle:resourceBundle]; + + if(debugOn) + NSLog(@"%s OGo connection: %@", __PRETTY_FUNCTION__, self->connection); + + self->statsController = [[SOPEXStatisticsController alloc] initWithApplicationURL:url]; + + if(debugOn) + NSLog(@"%s instance:%@", __PRETTY_FUNCTION__, instanceDescription); + [self reload:nil]; +} + +- (void)snsController:(SOPEXSNSController *)controller unregisterInstance:(NSDictionary *)instanceDescription +{ + NSLog(@"%s WARNING!! Child did terminate!", __PRETTY_FUNCTION__); +} + + +#pragma mark - +#pragma mark ### WINDOW DELEGATE ### + + +- (BOOL)windowShouldClose:(id)sender +{ +#if 0 + if(debugOn) + NSLog(@"%s sender:%@", __PRETTY_FUNCTION__, sender); +#endif + + if(sender != self->mainWindow) + return YES; + + if(self->document != nil && [self->document hasChanges]) + { + id panel; + int rc; + + panel = NSGetAlertPanel( + NSLocalizedString(@"Do you want to save changes to the source code before closing?", "Title of the alert sheet when window should close but changes are still not saved"), + NSLocalizedString(@"If you don\\u2019t save, your changes will be lost.", "Message of the alert sheet when unsaved changes are about to be lost"), + NSLocalizedString(@"Save", "Default button text for the alert sheet"), + NSLocalizedString(@"Don\\u2019t save", "Alternate button text for the alert sheet"), + NSLocalizedString(@"Cancel", "Other button text for the alert sheet") + ); + + rc = SOPEXRunSheetModalForWindow(panel, self->mainWindow); + NSReleaseAlertPanel(panel); + + // NSAlertOtherReturn == Cancel + // NSAlertAlternateReturn == Don't save + // NSAlertDefaultReturn == Save + + if(rc == NSAlertOtherReturn) + return NO; + if(rc == NSAlertDefaultReturn) + [self saveDocument:self]; + [self flushDocument]; + } + return YES; +} + +- (void)windowWillClose:(NSNotification *)notification +{ +#if 0 + if(debugOn) + NSLog(@"%s notification:%@", __PRETTY_FUNCTION__, notification); +#endif + if([notification object] == self->mainWindow) + [NSApp terminate:self]; +} + + +#pragma mark - +#pragma mark ### TableView DATASOURCE ### + + +- (int)numberOfRowsInTableView:(NSTableView *)_tableView +{ + return [self->responseHeaderValues count]; +} + +- (id)tableView:(NSTableView *)_tableView objectValueForTableColumn:(NSTableColumn *)_tableColumn row:(int)_rowIndex +{ + return [[self->responseHeaderValues objectAtIndex:_rowIndex] objectForKey:[_tableColumn identifier]]; +} + + +#pragma mark - +#pragma mark ### WebResource Load DELEGATE ### + + +- (id)webView:(WebView *)_sender + identifierForInitialRequest:(NSURLRequest *)_rq + fromDataSource:(WebDataSource *)_ds +{ + return [[_rq URL] absoluteString]; +} + +- (NSURLRequest *)webView:(WebView *)_sender + resource:(id)_id + willSendRequest:(NSURLRequest *)_rq + redirectResponse:(NSURLResponse *)redirectResponse + fromDataSource:(WebDataSource *)_ds +{ + /* use that to patch resource requests to local files ;-) */ + NSURL *url, *rurl; + + url = [_rq URL]; + if(debugOn) + NSLog(@"%s: %@ request: %@ url: %@", __PRETTY_FUNCTION__, _id, _rq, url); + + if (![self->connection shouldRewriteRequestURL:url]) + return _rq; + + if ((rurl = [self->connection rewriteRequestURL:url]) == nil) + return _rq; + if ([rurl isEqual:url]) + return _rq; + + return [NSURLRequest requestWithURL:rurl + cachePolicy:NSURLRequestUseProtocolCachePolicy + timeoutInterval:5.0]; +} + +- (void)webView:(WebView *)_sender resource:(id)_rid + didReceiveContentLength:(unsigned)_length + fromDataSource:(WebDataSource *)_ds +{ + //NSLog(@"%s: %@ len: %d", __PRETTY_FUNCTION__, _rid, _length); +} + +- (void)webView:(WebView *)_sender resource:(id)_rid + didFinishLoadingFromDataSource:(WebDataSource *)_ds +{ + NSURLResponse *r = [_ds response]; + + if(debugOn) + { + NSLog(@"%s: %@ ds: %@\n data-len: %i\n response: %@\n type: %@\n enc: %@", + __PRETTY_FUNCTION__, _rid, _ds, + [[_ds data] length], r, [r MIMEType], [r textEncodingName]); + } + [self->connection processResponse:[_ds response] data:[_ds data]]; +} + +- (void)webView:(WebView *)_sender resource:(id)_rid + didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + fromDataSource:(WebDataSource *)_ds +{ + if(debugOn) + NSLog(@"%s: %@ ds: %@", __PRETTY_FUNCTION__, _rid, _ds); +} + +- (void)webView:(WebView *)_sender + resource:(id)_identifier + didReceiveResponse:(NSURLResponse *)_response + fromDataSource:(WebDataSource *)_ds +{ + if (debugOn) { + NSLog(@"%s: view: %@\n resource: %@\n received: %@\n" + @" datasource: %@\n data-len: %i%s", + __PRETTY_FUNCTION__, + _sender, _identifier, _response, _ds, + [[_ds data] length], [_ds isLoading]?" LOADING":""); + } +} + + +#pragma mark - +#pragma mark ### WebFrame Load DELEGATE ### + + +- (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame +{ + if(self->document != nil && [self->document hasChanges]) + { + id panel; + int rc; + + panel = NSGetAlertPanel( + NSLocalizedString(@"Do you want to save changes to the source code before proceeding?", "Title of the alert sheet when user wants to proceed but changes are still not saved"), + NSLocalizedString(@"If you don\\u2019t save, your changes will be lost.", "Message of the alert sheet when unsaved changes are about to be lost"), + NSLocalizedString(@"Save", "Default button text for the alert sheet"), + NSLocalizedString(@"Don\\u2019t save", "Alternate button text for the alert sheet"), + NULL); + + rc = SOPEXRunSheetModalForWindow(panel, self->mainWindow); + NSReleaseAlertPanel(panel); + + // NSAlertOtherReturn == Cancel + // NSAlertAlternateReturn == Don't save + // NSAlertDefaultReturn == Save + + if(rc == NSAlertDefaultReturn) + [self saveDocument:self]; + } + [self flushDocument]; + [self->progressIndicator startAnimation:self]; +} + +- (void)webView:(WebView *)sender didReceiveTitle:(NSString *)_title forFrame:(WebFrame *)_frame +{ + [self->mainWindow setTitle:_title]; +} + + +- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame +{ + [self->progressIndicator stopAnimation:self]; + +#if 0 +#warning ** setFavIcon enabled ... doesnt really make sense + [self->mainWindow setFavIcon:[sender pageIcon]]; +#endif + [self createDocumentFromResponse]; +} + +- (void)webView:(WebView *)sender didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame +{ + [self->progressIndicator stopAnimation:self]; + [self setStatus:[error localizedDescription] isError:YES]; +} + +- (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame +{ + [self webView:sender didFailLoadWithError:error forFrame:frame]; +} + + +#pragma mark - +#pragma mark ### WebView UI DELEGATE ### + + +- (BOOL)webViewIsStatusBarVisible:(WebView *)sender +{ + return YES; +} + +- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation modifierFlags:(unsigned int)modifierFlags +{ + NSURL *url; + +#if 0 + NSLog(@"%s elementInformation:%@", __PRETTY_FUNCTION__, elementInformation); +#endif + + + url = [elementInformation objectForKey:WebElementImageURLKey]; + if(url != nil) + { + NSString *altString; + NSRect imageRect; + NSImage *image; + NSMutableString *status; + + altString = [elementInformation objectForKey:WebElementImageAltStringKey]; + imageRect = [[elementInformation objectForKey:WebElementImageRectKey] rectValue]; + image = [elementInformation objectForKey:WebElementImageKey]; + + status = [NSMutableString string]; + + if(altString == nil) + altString = [url absoluteString]; + + url = [elementInformation objectForKey:WebElementLinkURLKey]; + if(url != nil) + [status appendFormat:@"%@ ", [url absoluteString]]; + + [status appendFormat:@"[%@] (w:%.0f h:%.0f)", altString, imageRect.size.width, imageRect.size.height]; + if(NSEqualSizes([image size], imageRect.size) == NO) + { + NSSize size = [image size]; + [status appendFormat:@" -> scaled from (w:%.0f h:%.0f)!", size.width, size.height]; + } + + [self setStatus:status]; + return; + } + + url = [elementInformation objectForKey:WebElementLinkURLKey]; + if(url != nil) + { + [self setStatus:[url absoluteString]]; + return; + } + + [self setStatus:nil]; +} + +@end diff --git a/sopex/SOPEX/SOPEXApplication.h b/sopex/SOPEX/SOPEXApplication.h new file mode 100644 index 00000000..a40eceec --- /dev/null +++ b/sopex/SOPEX/SOPEXApplication.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXApplication.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Feb 13 2004. + +#ifndef __SOPEXApplication_H_ +#define __SOPEXApplication_H_ + +#import + + +@interface SOPEXApplication : NSApplication +{ +} + +@end + +#endif /* __SOPEXApplication_H_ */ diff --git a/sopex/SOPEX/SOPEXApplication.m b/sopex/SOPEX/SOPEXApplication.m new file mode 100644 index 00000000..176fca82 --- /dev/null +++ b/sopex/SOPEX/SOPEXApplication.m @@ -0,0 +1,34 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXApplication.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Feb 13 2004. + +#import "SOPEXApplication.h" + +@implementation SOPEXApplication + +- (void)finishLaunching +{ + [NSBundle loadNibNamed:@"SOPEXMainMenu" owner:self]; + [super finishLaunching]; +} + +@end diff --git a/sopex/SOPEX/SOPEXAuthPanel.h b/sopex/SOPEX/SOPEXAuthPanel.h new file mode 100644 index 00000000..33520d79 --- /dev/null +++ b/sopex/SOPEX/SOPEXAuthPanel.h @@ -0,0 +1,32 @@ +// $Id: SOPEXAuthPanel.h 1 2004-08-20 11:17:52Z znek $ +// +// SOPEXAuthPanel.h SxCallTest +// +// Created by Helge Hess on Sun Jun 30 2002. +// Copyright (c) 2002 SKYRIX Software AG. All rights reserved. + +#ifndef __SOPEXAuthPanel_H__ +#define __SOPEXAuthPanel_H__ + +#import + +@interface SOPEXAuthPanel : NSObject +{ + IBOutlet NSTextField *loginField; + IBOutlet NSTextField *passwordField; + IBOutlet NSButton *rememberPassword; + IBOutlet NSWindow *window; +} + +/* accessors */ + +/* operations */ + +- (void)doLoginForWindow:(NSWindow *)_win; + +- (IBAction)login:(id)sender; +- (IBAction)cancel:(id)sender; + +@end + +#endif /* __SOPEXAuthPanel_H__ */ diff --git a/sopex/SOPEX/SOPEXAuthPanel.m b/sopex/SOPEX/SOPEXAuthPanel.m new file mode 100644 index 00000000..6bfe01eb --- /dev/null +++ b/sopex/SOPEX/SOPEXAuthPanel.m @@ -0,0 +1,49 @@ +// $Id: SOPEXAuthPanel.m 1 2004-08-20 11:17:52Z znek $ +// +// SOPEXAuthPanel.m SxCallTest +// +// Created by Helge Hess on Sun Jun 30 2002. +// Copyright (c) 2002 SKYRIX Software AG. All rights reserved. + +#import "SOPEXAuthPanel.h" + +@implementation SOPEXAuthPanel + +- (void)dealloc { + [super dealloc]; +} + +/* accessors */ + +/* modal delegate */ + +- (void)authSheetDidEnd:(NSWindow *)_sheet + returnCode:(int)_returnCode + contextInfo:(void *)_info +{ +} + +/* operations */ + +- (void)doLoginForWindow:(NSWindow *)_win { + [NSApp beginSheet:self->window + modalForWindow:_win + modalDelegate:self + didEndSelector:@selector(authSheetDidEnd:returnCode:contextInfo:) + contextInfo:NULL]; + [NSApp runModalForWindow:_win]; + //[NSApp runModalForWindow:self->window]; + + [NSApp endSheet:self->window]; + [self->window orderOut:self]; +} + +- (IBAction)login:(id)sender { + [NSApp stopModal]; +} + +- (IBAction)cancel:(id)sender { + [NSApp stopModal]; +} + +@end /* SOPEXAuthPanel */ diff --git a/sopex/SOPEX/SOPEXBrowserWindow.h b/sopex/SOPEX/SOPEXBrowserWindow.h new file mode 100644 index 00000000..157b3fe3 --- /dev/null +++ b/sopex/SOPEX/SOPEXBrowserWindow.h @@ -0,0 +1,39 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXBrowserWindow.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Mar 22 2004. + +#ifndef __SOPEXBrowserWindow_H_ +#define __SOPEXBrowserWindow_H_ + +#import + + +@interface SOPEXBrowserWindow : NSWindow +{ + NSImageView *favIconView; +} + +- (void)setFavIcon:(NSImage *)_favIcon; + +@end + +#endif /* __SOPEXBrowserWindow_H_ */ diff --git a/sopex/SOPEX/SOPEXBrowserWindow.m b/sopex/SOPEX/SOPEXBrowserWindow.m new file mode 100644 index 00000000..542fbdd2 --- /dev/null +++ b/sopex/SOPEX/SOPEXBrowserWindow.m @@ -0,0 +1,119 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXBrowserWindow.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Mar 22 2004. + + +#import "SOPEXBrowserWindow.h" + + +#define USE_NSTheme_PRIVATE_API 0 + + +#if USE_NSTheme_PRIVATE_API +@interface NSView (NSTheme_PrivateAPI_We_Know_Exists) +- (void)addFileButton:(id)fp8; +- (id)newFileButton; +@end + + +@implementation NSImageView (HACQUE_alert) +- (NSString *)representedFilename +{ + return nil; +} +@end +#endif + + +@interface SOPEXBrowserWindow (PrivateAPI) +- (NSView *)borderView; +- (NSRect)favIconFrameForTitle:(NSString *)_title; +@end + + +@implementation SOPEXBrowserWindow + +#if 0 +- (void)dealloc +{ + [self->favIconView release]; + [super dealloc]; +} +#endif + +- (NSView *)borderView +{ + return self->_borderView; +} + +#if !USE_NSTheme_PRIVATE_API +- (NSRect)favIconFrameForTitle:(NSString *)_title +{ + NSDictionary *attrs; + NSRect frame, bvFrame; + float textWidth; + + attrs = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:[NSFont systemFontSize]], NSFontAttributeName, nil]; + textWidth = [_title sizeWithAttributes:attrs].width; + bvFrame = [[self borderView] frame]; + frame = NSMakeRect((NSMidX(bvFrame) - (textWidth / 2.0)) - 24, NSHeight(bvFrame) - 19, 16, 16); + return frame; +} +#endif + +- (void)setFavIcon:(NSImage *)_favIcon +{ +#if 0 + if(self->favIconView == nil) + { +#if !USE_NSTheme_PRIVATE_API + self->favIconView = [[NSImageView alloc] initWithFrame:[self favIconFrameForTitle:[self title]]]; + [self->favIconView setAutoresizingMask:(NSViewMinYMargin | NSViewMinXMargin | NSViewMaxXMargin)]; +#else + self->favIconView = [[self borderView] newFileButton]; + [self->favIconView retain]; +#endif + +#if !USE_NSTheme_PRIVATE_API + [[self borderView] addSubview:self->favIconView]; +#else + [[self borderView] addFileButton:self->favIconView]; +#endif + [self->favIconView release]; + } + [self->favIconView setImage:_favIcon]; +#endif +} + +#if !USE_NSTheme_PRIVATE_API +- (void)setTitle:(NSString *)_title +{ + if(self->favIconView != nil) + { + [self->favIconView setFrame:[self favIconFrameForTitle:_title]]; + [[self borderView] setNeedsDisplay:YES]; + } + [super setTitle:_title]; +} +#endif + +@end diff --git a/sopex/SOPEX/SOPEXConsole.h b/sopex/SOPEX/SOPEXConsole.h new file mode 100644 index 00000000..b5115b31 --- /dev/null +++ b/sopex/SOPEX/SOPEXConsole.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXConsole.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Jan 26 2004. + +#ifndef __SOPEXConsole_H_ +#define __SOPEXConsole_H_ + +#import + +@class SOPEXToolbarController; + + +@interface SOPEXConsole : NSObject +{ + IBOutlet NSWindow *window; + IBOutlet NSTextView *text; + + SOPEXToolbarController *toolbar; + + NSPipe *stdoutPipe, *stderrPipe; + NSDictionary *stdoutAttributes, *stderrAttributes; +} + +- (id)initWithStandardOutput:(id)standardOutput standardError:(id)standardError; + +- (void)setStandardOutput:(id)standardOutput standardError:(id)standardError; + +- (IBAction)orderFront:(id)sender; +- (IBAction)clear:(id)sender; + +- (BOOL)validateMenuItem:(id )menuItem; + +@end + +#endif /* __SOPEXConsole_H_ */ diff --git a/sopex/SOPEX/SOPEXConsole.m b/sopex/SOPEX/SOPEXConsole.m new file mode 100644 index 00000000..817a1aea --- /dev/null +++ b/sopex/SOPEX/SOPEXConsole.m @@ -0,0 +1,236 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXConsole.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Jan 26 2004. + + +#import "SOPEXConsole.h" +#import "SOPEXToolbarController.h" + + +#define DNC [NSNotificationCenter defaultCenter] + + +@interface SOPEXConsole (PrivateAPI) +- (NSFont *)stdoutFont; +- (NSFont *)stderrFont; +- (NSColor *)stdoutFontColor; +- (NSColor *)stderrFontColor; + +- (void)appendConsoleData:(NSData *)data usingAttributes:(NSDictionary *)attributes; +@end + + +@implementation SOPEXConsole + +#pragma mark - +#pragma mark ### INIT & DEALLOC ### + + +- (id)init +{ + [super init]; + + [NSBundle loadNibNamed:@"SOPEXConsole" owner:self]; + NSAssert(self->window != nil, @"Problem loading SOPEXConsole.nib!"); + + self->toolbar = [[SOPEXToolbarController alloc] initWithIdentifier:@"SOPEXConsole" target:self]; + [self->toolbar applyOnWindow:self->window]; + + self->stdoutAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:[self stdoutFont], NSFontAttributeName, [self stdoutFontColor], NSForegroundColorAttributeName, nil]; + self->stderrAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:[self stderrFont], NSFontAttributeName, [self stderrFontColor], NSForegroundColorAttributeName, nil]; + return self; +} + +- (id)initWithStandardOutput:(id)standardOutput standardError:(id)standardError +{ + [self init]; + [self setStandardOutput:standardOutput standardError:standardError]; + return self; +} + +- (void)dealloc +{ + [DNC removeObserver:self]; + [self->window orderOut:self]; + [self->stdoutPipe release]; + [self->stderrPipe release]; + [self->stdoutAttributes release]; + [self->stderrAttributes release]; + [super dealloc]; +} + + +#pragma mark - +#pragma mark ### CONSOLE PROPERTIES ### + + +- (NSFont *)stdoutFont +{ + return [NSFont fontWithName:@"Courier" size:12]; +} + +- (NSFont *)stderrFont +{ + return [NSFont fontWithName:@"Courier" size:12]; +} + +- (NSColor *)stdoutFontColor +{ + return [NSColor blackColor]; +} + +- (NSColor *)stderrFontColor +{ + return [NSColor redColor]; +} + + +#pragma mark - +#pragma mark ### WINDOW HANDLING & DELEGATE ### + + +- (IBAction)orderFront:(id)sender +{ + [self->window makeKeyAndOrderFront:sender]; +} + +- (void)windowWillClose:(NSNotification *)aNotification +{ +} + + +#pragma mark - +#pragma mark ### ACTIONS ### + + +- (IBAction)clear:(id)sender +{ + NSTextStorage *textStorage; + + textStorage = [self->text textStorage]; + [textStorage beginEditing]; + [textStorage deleteCharactersInRange:NSMakeRange(0, [textStorage length])]; + [textStorage endEditing]; +} + +- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem +{ + return [self validateMenuItem:(id )theItem]; +} + +- (BOOL)validateMenuItem:(id )menuItem +{ + SEL action = [menuItem action]; + + if(action == @selector(clear:)) + return [[self->text textStorage] length] > 0; + return YES; +} + + +#pragma mark - +#pragma mark ### STDOUT & STDERR ### + + +- (void)setStandardOutput:(id)standardOutput standardError:(id)standardError +{ + if(self->stdoutPipe != nil) + { + [DNC removeObserver:self name:NSFileHandleReadCompletionNotification object:self->stdoutPipe]; + [self->stdoutPipe release]; + } + self->stdoutPipe = [standardOutput retain]; + if(self->stderrPipe != nil) + { + [DNC removeObserver:self name:NSFileHandleReadCompletionNotification object:self->stderrPipe]; + [self->stderrPipe release]; + } + self->stderrPipe = [standardError retain]; + + // register for NSFileHandle notifications + [DNC addObserver:self selector:@selector(readData:) name:NSFileHandleReadCompletionNotification object:[self->stdoutPipe fileHandleForReading]]; + [DNC addObserver:self selector:@selector(readData:) name:NSFileHandleReadCompletionNotification object:[self->stderrPipe fileHandleForReading]]; + + // start reading in background + [[self->stdoutPipe fileHandleForReading] readInBackgroundAndNotify]; + [[self->stderrPipe fileHandleForReading] readInBackgroundAndNotify]; +} + + +#pragma mark - +#pragma mark ### POLLING ### + + +- (void)readData:(NSNotification *)notification +{ + NSData *data; + NSFileHandle *fileHandle; + NSDictionary *attributes; + + fileHandle = [notification object]; + data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem]; + + if([data length] == 0) + { + NSLog(@"%s pipe closed the connection!", __PRETTY_FUNCTION__); + return; + } + + [fileHandle readInBackgroundAndNotify]; + + if(fileHandle == [self->stdoutPipe fileHandleForReading]) + attributes = self->stdoutAttributes; + else + attributes = self->stderrAttributes; + + [self appendConsoleData:data usingAttributes:attributes]; +} + +- (void)appendConsoleData:(NSData *)data usingAttributes:(NSDictionary *)attributes +{ + NSTextStorage *textStorage; + NSString *message; + unsigned int location; + + textStorage = [self->text textStorage]; + +// NSLog(@"%s ping ... %@", __PRETTY_FUNCTION__, textStorage); + + message = [[NSString alloc] initWithData:data encoding:NSMacOSRomanStringEncoding]; + + [textStorage beginEditing]; + location = [textStorage length]; + [textStorage replaceCharactersInRange:NSMakeRange(location, 0) withString:message]; + [textStorage setAttributes:attributes range:NSMakeRange(location, [textStorage length] - location)]; + + if([textStorage length] > 50 * 1024) + [textStorage deleteCharactersInRange:NSMakeRange(0, [textStorage length] - 50 * 1024)]; + [textStorage endEditing]; + + [message release]; + + // scroll to bottom if verticalScroller is at bottom + if([[(NSScrollView*)[[self->text superview] superview] verticalScroller] floatValue] == 1.0) + [self->text scrollRangeToVisible:NSMakeRange([textStorage length], 1)]; +} + +@end diff --git a/sopex/SOPEX/SOPEXConstants.h b/sopex/SOPEX/SOPEXConstants.h new file mode 100644 index 00000000..473fa585 --- /dev/null +++ b/sopex/SOPEX/SOPEXConstants.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXConstants.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Feb 13 2004. + +#ifndef __SOPEXConstants_H_ +#define __SOPEXConstants_H_ + +#import + + +extern NSString *SOPEXDaemonFlag; + + +#endif /* __SOPEXConstants_H_ */ diff --git a/sopex/SOPEX/SOPEXConstants.m b/sopex/SOPEX/SOPEXConstants.m new file mode 100644 index 00000000..6b9ee2b3 --- /dev/null +++ b/sopex/SOPEX/SOPEXConstants.m @@ -0,0 +1,27 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXConstants.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Feb 13 2004. + +#import "SOPEXConstants.h" + + +NSString *SOPEXDaemonFlag = @"--daemon"; diff --git a/sopex/SOPEX/SOPEXContentValidator.h b/sopex/SOPEX/SOPEXContentValidator.h new file mode 100644 index 00000000..eb5cd288 --- /dev/null +++ b/sopex/SOPEX/SOPEXContentValidator.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXContentValidator.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Apr 05 2004. + +#ifndef __SOPEXContentValidator_H_ +#define __SOPEXContentValidator_H_ + +#import +#import +#import +#import + + +@interface SOPEXContentValidator : NSObject +{ + NSMutableArray *warnings; + NSMutableArray *errors; +} + ++ (NSError *)validateWOXContent:(id)content; ++ (NSError *)validateWOHTMLContent:(id)content; ++ (NSError *)validateWODContent:(id)content; + +- (NSError *)validateWOXContent:(id)content; +- (NSError *)validateWOHTMLContent:(id)content; +- (NSError *)validateWODContent:(id)content; + +- (BOOL)hasWarnings; +- (NSArray *)warnings; +- (BOOL)hasErrors; +- (NSArray *)errors; + +- (NSError *)status; + +@end + +extern NSString *SOPEXDocumentValidationErrorDomain; + +#endif /* __SOPEXContentValidator_H_ */ diff --git a/sopex/SOPEX/SOPEXContentValidator.m b/sopex/SOPEX/SOPEXContentValidator.m new file mode 100644 index 00000000..6d79a77a --- /dev/null +++ b/sopex/SOPEX/SOPEXContentValidator.m @@ -0,0 +1,278 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXContentValidator.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Apr 05 2004. + + +#import "SOPEXContentValidator.h" +#import + + +NSString *SOPEXDocumentValidationErrorDomain = @"SOPEXDocumentValidationErrorDomain"; + + +@interface SOPEXContentValidator (PrivateAPI) ++ (NSError *)validateContent:(id)content usingSelector:(SEL)selector; +- (NSError *)validateContent:(id)content ofMIMEType:(NSString *)mimeType; +- (NSError *)validateContent:(id)content withParserClass:(Class)parserClass selector:(SEL)selector; +- (NSString *)formattedErrorString; +@end + + +@implementation SOPEXContentValidator + + +#pragma mark - +#pragma mark ### INIT & DEALLOC ### + + +- (id)init +{ + [super init]; + self->warnings = [[NSMutableArray alloc] init]; + self->errors = [[NSMutableArray alloc] init]; + return self; +} + +- (void)dealloc +{ + [self->warnings release]; + [self->errors release]; + [super dealloc]; +} + + +#pragma mark - +#pragma mark ### VALIDATION ### + + ++ (NSError *)validateWOXContent:(id)content +{ + return [self validateContent:content usingSelector:@selector(validateWOXContent:)]; +} + ++ (NSError *)validateWOHTMLContent:(id)content +{ + return [self validateContent:content usingSelector:@selector(validateWOHTMLContent:)]; +} + ++ (NSError *)validateWODContent:(id)content +{ + return [self validateContent:content usingSelector:@selector(validateWODContent:)]; +} + ++ (NSError *)validateContent:(id)content usingSelector:(SEL)selector +{ + SOPEXContentValidator *validator; + NSError *status; + + validator = [[self alloc] init]; + status = [validator performSelector:selector withObject:content]; + [validator release]; + return status; +} + +- (NSError *)validateWOXContent:(id)content +{ + return [self validateContent:content ofMIMEType:@"text/xml"]; +} + +- (NSError *)validateContent:(id)content ofMIMEType:(NSString *)mimeType +{ + id xmlReader; + + xmlReader = [[SaxXMLReaderFactory standardXMLReaderFactory] createXMLReaderForMimeType:mimeType]; + [xmlReader setErrorHandler:self]; + [xmlReader parseFromSource:content]; + return [self status]; +} + +- (NSError *)validateWOHTMLContent:(id)content +{ + return [self validateContent:content withParserClass:[WOHTMLParser class] selector:@selector(parseHTMLData:)]; +} + +- (NSError *)validateWODContent:(id)content +{ + return [self validateContent:content withParserClass:[WODParser class] selector:@selector(parseDeclarationData:)]; +} + +- (NSError *)validateContent:(id)content withParserClass:(Class)parserClass selector:(SEL)selector +{ + NSData *data; + id parser; + + if([content isKindOfClass:[NSString class]]) + data = [content dataUsingEncoding:NSUTF8StringEncoding]; + else + data = content; + + NS_DURING + + parser = [[parserClass alloc] initWithHandler:self]; + [parser performSelector:selector withObject:data]; + + NS_HANDLER + + [self->errors addObject:[localException reason]]; + + NS_ENDHANDLER; + + [parser release]; + return [self status]; +} + + +#pragma mark - +#pragma mark ### ACCESSORS ### + + +- (BOOL)hasWarnings +{ + return [self->warnings count] != 0; +} + +- (NSArray *)warnings +{ + return self->warnings; +} + +- (BOOL)hasErrors +{ + return [self->errors count] != 0; +} + +- (NSArray *)errors +{ + return self->errors; +} + +- (NSString *)formattedErrorString +{ + return [[self errors] componentsJoinedByString:@"\n"]; +} + +- (NSError *)status +{ + NSDictionary *info; + + if([self hasErrors] == NO) + return nil; + + info = [NSDictionary dictionaryWithObject:[self formattedErrorString] forKey:NSLocalizedDescriptionKey]; + return [NSError errorWithDomain:SOPEXDocumentValidationErrorDomain code:0 userInfo:info]; +} + + +#pragma mark - +#pragma mark ### SaxErrorHandler Protocol ### + + +- (void)warning:(SaxParseException *)_exception +{ + [self->warnings addObject:[_exception reason]]; +} + +- (void)error:(SaxParseException *)_exception +{ +#if 0 + NSLog(@"%s reason:%@ ui:%@ line:%@ column:%@", __PRETTY_FUNCTION__, [_exception reason], [_exception userInfo], [[_exception userInfo] objectForKey:@"line"], [[_exception userInfo] objectForKey:@"column"]); +#endif + [self->errors addObject:[_exception reason]]; +} + +- (void)fatalError:(SaxParseException *)_exception +{ + [self error:_exception]; +} + + +#pragma mark - +#pragma mark ### WODParserHandler PROTOCOL ### + + +- (BOOL)parser:(id)_parser willParseDeclarationData:(NSData *)_data +{ + return YES; +} + +- (void)parser:(id)_parser finishedParsingDeclarationData:(NSData *)_data declarations:(NSDictionary *)_decls +{ +} + +- (void)parser:(id)_parser failedParsingDeclarationData:(NSData *)_data exception:(NSException *)_exception +{ + [_exception raise]; +} + +- (id)parser:(id)_parser makeAssociationWithValue:(id)_value +{ + return nil; +} + +- (id)parser:(id)_parser makeAssociationWithKeyPath:(NSString *)_keyPath +{ + return nil; +} + +- (id)parser:(id)_parser makeDefinitionForComponentNamed:(NSString *)_cname associations:(id)_entry elementName:(NSString *)_elemName +{ + return nil; +} + + +#pragma mark - +#pragma mark ### WOHTMLParserHandler PROTOCOL ### + + +- (BOOL)parser:(id)_parser willParseHTMLData:(NSData *)_data +{ + return YES; +} + +- (void)parser:(id)_parser finishedParsingHTMLData:(NSData *)_data elements:(NSArray *)_elements +{ +} + +- (void)parser:(id)_parser failedParsingHTMLData:(NSData *)_data exception:(NSException *)_exception +{ +#if 0 + NSLog(@"%s reason:%@ ui:%@ line:%@ column:%@", __PRETTY_FUNCTION__, [_exception reason], [_exception userInfo], [[_exception userInfo] objectForKey:@"line"], [[_exception userInfo] objectForKey:@"column"]); +#endif + [_exception raise]; +} + +- (WOElement *)dynamicElementWithName:(NSString *)_element attributes:(NSDictionary *)_attributes contentElements:(NSArray *)_subElements +{ + return (WOElement *)[NSNull null]; +} + + +#pragma mark - +#pragma mark ### DEBUGGING ### + + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@:0x%x warnings:%d errors:%d>", NSStringFromClass(self->isa), self, [self->warnings count], [self->errors count]]; +} + +@end diff --git a/sopex/SOPEX/SOPEXDocument.h b/sopex/SOPEX/SOPEXDocument.h new file mode 100644 index 00000000..47de73c4 --- /dev/null +++ b/sopex/SOPEX/SOPEXDocument.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXDocument.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Mar 26 2004. + +#ifndef __SOPEXDocument_H_ +#define __SOPEXDocument_H_ + +#import + + +@class SOPEXDocument; +@class SOPEXTextView; + + +@protocol SOPEXDocumentController +- (SOPEXTextView *)document:(SOPEXDocument *)document textViewForType:(NSString *)fileType; +- (void)document:(SOPEXDocument *)document didValidateWithError:(NSError *)error forType:(NSString *)fileType; +@end + +@interface SOPEXDocument : NSObject +{ + NSObject *controller; + NSStringEncoding documentEncoding; + NSString *path; + NSMutableDictionary *typeTextViewLUT; + NSMutableDictionary *undoManagerLUT; +} + +- (id)initWithPath:(NSString *)_path controller:(NSObject *)_controller; +- (id)initWithPath:(NSString *)path; + +- (NSString *)path; + +- (NSArray *)fileTypes; + +- (NSString *)fullPathForFileType:(NSString *)fileType; + +- (SOPEXTextView *)textViewForFileType:(NSString *)fileType; +- (NSString *)loadRepresentationForFileType:(NSString *)fileType; +- (NSData *)representationForFileType:(NSString *)fileType; +- (NSError *)validateRepresentationForFileType:(NSString *)fileType; + +- (BOOL)hasChanges; +- (void)revertChanges; +- (BOOL)performSave; + +@end + +#endif /* __SOPEXDocument_H_ */ diff --git a/sopex/SOPEX/SOPEXDocument.m b/sopex/SOPEX/SOPEXDocument.m new file mode 100644 index 00000000..ae7c6575 --- /dev/null +++ b/sopex/SOPEX/SOPEXDocument.m @@ -0,0 +1,237 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXDocument.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Mar 26 2004. + + +#import "SOPEXDocument.h" +#import "SOPEXTextView.h" + + +@implementation SOPEXDocument + +#pragma mark - +#pragma mark ### INIT & DEALLOC ### + + +- (id)init +{ + [super init]; + typeTextViewLUT = [[NSMutableDictionary alloc] init]; + undoManagerLUT = [[NSMutableDictionary alloc] init]; + documentEncoding = NSUTF8StringEncoding; + return self; +} + +- (id)initWithPath:(NSString *)_path controller:(NSObject *)_controller +{ + self->controller = _controller; + [self initWithPath:_path]; + [self revertChanges]; + return self; +} + +- (id)initWithPath:(NSString *)_path +{ + [self init]; + NSAssert(self->controller != nil, @"controller is not set! This indicates wrong initialization order!"); + self->path = [_path retain]; + return self; +} + +- (void)dealloc +{ + [self->path release]; + [self->typeTextViewLUT release]; + [self->undoManagerLUT release]; + [super dealloc]; +} + + +#pragma mark - +#pragma mark ### ACCESSORS ### + + +- (NSString *)path +{ + return self->path; +} + +- (NSArray *)fileTypes +{ + [NSException raise:NSGenericException format:@"%s SUBCLASS RESPONSIBILITY!", __PRETTY_FUNCTION__]; + return nil; +} + +- (SOPEXTextView *)textViewForFileType:(NSString *)fileType +{ + SOPEXTextView *textView; + + textView = [self->typeTextViewLUT objectForKey:fileType]; + if(textView == nil) + { + NSUndoManager *undoManager; + + textView = [self->controller document:self textViewForType:fileType]; + [textView setDelegate:self]; + [self->typeTextViewLUT setObject:textView forKey:fileType]; + + undoManager = [[NSUndoManager alloc] init]; + [self->undoManagerLUT setObject:undoManager forKey:fileType]; + [undoManager release]; + } + return textView; +} + +- (NSString *)loadRepresentationForFileType:(NSString *)fileType +{ + NSData *data; + + data = [NSData dataWithContentsOfFile:[self fullPathForFileType:fileType]]; + return [[[NSString alloc] initWithData:data encoding:self->documentEncoding] autorelease]; +} + +- (NSString *)fullPathForFileType:(NSString *)fileType +{ + return self->path; +} + +- (NSData *)representationForFileType:(NSString *)fileType +{ + NSTextView *textView; + NSData *representation; + + textView = [self textViewForFileType:fileType]; + representation = [[textView string] dataUsingEncoding:self->documentEncoding]; + return representation; +} + +- (BOOL)hasChanges +{ + NSEnumerator *umEnum; + NSUndoManager *undoManager; + + umEnum = [self->undoManagerLUT objectEnumerator]; + while((undoManager = [umEnum nextObject]) != nil) + if([undoManager canUndo]) + return YES; + return NO; +} + +- (BOOL)performSave +{ + NSArray *fileTypes; + unsigned i, count; + + fileTypes = [self fileTypes]; + count = [fileTypes count]; + for(i = 0; i < count; i++) + { + NSString *fileType; + NSData *representation; + + fileType = [fileTypes objectAtIndex:i]; + representation = [self representationForFileType:fileType]; + if(![representation writeToFile:[self fullPathForFileType:fileType] atomically:YES]) + return NO; + } + + for(i = 0; i < count; i++) + { + NSString *fileType; + NSError *status; + SOPEXTextView *textView; + + fileType = [fileTypes objectAtIndex:i]; + textView = [self textViewForFileType:fileType]; + status = [self validateRepresentationForFileType:fileType]; + if(status != nil) + [self->controller document:self didValidateWithError:status forType:fileType]; + [textView setErrorStatus:status]; +#if 1 + [[textView undoManager] removeAllActions]; +#endif + } + + return YES; +} + +- (void)revertChanges +{ + NSArray *fileTypes; + unsigned i, count; + + fileTypes = [self fileTypes]; + count = [fileTypes count]; + for(i = 0; i < count; i++) + { + NSString *fileType, *representation; + NSTextView *textView; + + fileType = [fileTypes objectAtIndex:i]; + textView = [self textViewForFileType:fileType]; + representation = [self loadRepresentationForFileType:fileType]; + [textView setString:representation]; + [[textView undoManager] removeAllActions]; + } +} + +- (NSError *)validateRepresentationForFileType:(NSString *)fileType +{ + return nil; +} + + +#pragma mark - +#pragma mark ### TEXTVIEW DELEGATE ### + + +- (NSUndoManager *)undoManagerForTextView:(NSTextView *)textView +{ + NSString *type; + + type = [[self->typeTextViewLUT allKeysForObject:textView] lastObject]; + return [self->undoManagerLUT objectForKey:type]; +} + +- (void)textDidChange:(NSNotification *)notification +{ + [self performSelector:@selector(_delayedCheckForDocumentEdited:) withObject:[notification object] afterDelay:0.1]; +} + +- (void)_delayedCheckForDocumentEdited:(SOPEXTextView *)textView +{ + [[textView window] setDocumentEdited:[self hasChanges]]; +} + +#if 0 +- (void)textViewWillBecomeFirstResponder:(SOPEXTextView *)textView +{ + NSLog(@"%s", __PRETTY_FUNCTION__); +} + +- (void)textViewWillResignFirstResponder:(SOPEXTextView *)textView +{ + NSLog(@"%s", __PRETTY_FUNCTION__); +} +#endif + +@end diff --git a/sopex/SOPEX/SOPEXMain.h b/sopex/SOPEX/SOPEXMain.h new file mode 100644 index 00000000..a31647ef --- /dev/null +++ b/sopex/SOPEX/SOPEXMain.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXMain.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Feb 13 2004. + +#ifndef __SOPEXMain_H_ +#define __SOPEXMain_H_ + +#import + + +int SOPEXMain(NSString *appClassName, int argc, const char *argv[]); + + +#endif /* __SOPEXMain_H_ */ diff --git a/sopex/SOPEX/SOPEXMain.m b/sopex/SOPEX/SOPEXMain.m new file mode 100644 index 00000000..0abd835c --- /dev/null +++ b/sopex/SOPEX/SOPEXMain.m @@ -0,0 +1,50 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXMain.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Feb 13 2004. + + +#import +#import +#import "SOPEXConstants.h" + + +int SOPEXMain(NSString *appClassName, int argc, const char *argv[]) +{ + NSAutoreleasePool *pool; + int status; + + pool = [[NSAutoreleasePool alloc] init]; + + if([[[NSProcessInfo processInfo] arguments] containsObject:SOPEXDaemonFlag]) + { + [[NSUserDefaults standardUserDefaults] + setObject:@".sopex" forKey:@"WOApplicationSuffix"]; + status = WOApplicationMain(appClassName, argc, argv); + } + else + { + status = NSApplicationMain(argc, argv); + } + + [pool release]; + return status; +} diff --git a/sopex/SOPEX/SOPEXRangeUtilities.h b/sopex/SOPEX/SOPEXRangeUtilities.h new file mode 100644 index 00000000..425b2b84 --- /dev/null +++ b/sopex/SOPEX/SOPEXRangeUtilities.h @@ -0,0 +1,34 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXRangeUtilities.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Tue Mar 23 2004. + +#ifndef __SOPEXRangeUtilities_H_ +#define __SOPEXRangeUtilities_H_ + +#import + + +// returns {NSNotFound, 0} if none found +extern NSRange SOPEX_findMatchingTagForRangeInString(NSRange range, NSString *string); + + +#endif /* __SOPEXRangeUtilities_H_ */ diff --git a/sopex/SOPEX/SOPEXRangeUtilities.m b/sopex/SOPEX/SOPEXRangeUtilities.m new file mode 100644 index 00000000..d3c7b289 --- /dev/null +++ b/sopex/SOPEX/SOPEXRangeUtilities.m @@ -0,0 +1,168 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXRangeUtilities.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Tue Mar 23 2004. + + +#import "SOPEXRangeUtilities.h" + + +extern BOOL SOPEX_isValidTagNameCharacter(unichar character); + +extern NSRange SOPEX_findOpenTagForRangeInString(NSRange range, NSString *string); +extern NSRange SOPEX_findMatchingClosingTagForRangeInString(NSRange range, NSString *string); +extern NSRange SOPEX_findClosingTagForRangeInString(NSRange range, NSString *string); +extern NSRange SOPEX_findMatchingOpenTagForRangeInString(NSRange range, NSString *string); + + +/* 'valid' is really bound to the SOPE context, here */ +BOOL SOPEX_isValidTagNameCharacter(unichar character) +{ + static NSCharacterSet *validTagNameCharacterSet = nil; + + if(validTagNameCharacterSet == nil) + { + validTagNameCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-:.#?!"]; + [validTagNameCharacterSet retain]; + } + + return [validTagNameCharacterSet characterIsMember:character]; +} + +/* This implementation is pretty naive, it doesn't know SGML rules and doesn't perform any +other sophisticated matching. It works pretty well in real life, though. */ +NSRange SOPEX_findMatchingTagForRangeInString(NSRange range, NSString *string) +{ + NSRange matchingRange; + + if((matchingRange = SOPEX_findOpenTagForRangeInString(range, string)).location != NSNotFound) + { + NSRange closingRange; + + closingRange = SOPEX_findMatchingClosingTagForRangeInString(matchingRange, string); + if(closingRange.location == NSNotFound) + return NSMakeRange(NSNotFound, 0); + matchingRange = NSUnionRange(matchingRange, closingRange); + } + else if((matchingRange = SOPEX_findClosingTagForRangeInString(range, string)).location != NSNotFound) + { + NSRange openRange; + + openRange = SOPEX_findMatchingOpenTagForRangeInString(matchingRange, string); + if(openRange.location == NSNotFound) + return NSMakeRange(NSNotFound, 0); + matchingRange = NSUnionRange(matchingRange, openRange); + } + return matchingRange; +} + +NSRange SOPEX_findOpenTagForRangeInString(NSRange range, NSString *string) +{ + BOOL found; + int left, right, count; + + if(range.location == NSNotFound) + return NSMakeRange(NSNotFound, 0); + + if((range.length == 2) && ([[string substringWithRange:range] isEqualToString:@"= 0) + { + unichar charToLeft; + + charToLeft = [string characterAtIndex:--left]; + if(!SOPEX_isValidTagNameCharacter(charToLeft)) + if(charToLeft == '<') + found = YES; + else + break; + } + if(!found) + return NSMakeRange(NSNotFound, 0); + + right = range.location + range.length; + count = [string length]; + + while(SOPEX_isValidTagNameCharacter([string characterAtIndex:right]) && right <= count) + right++; + + return NSMakeRange(left, right - left); +} + +NSRange SOPEX_findMatchingClosingTagForRangeInString(NSRange range, NSString *string) +{ + unsigned depth, loc, count; + BOOL isCloseTag; + unichar current; + + isCloseTag = NO; + count = [string length]; + loc = range.location + range.length; + + current = [string characterAtIndex:range.location + 1]; + if((current == '!') && ([string characterAtIndex:range.location + 2] != '-')) + depth = 0; + else + depth = 1; + + while(loc < count) + { + current = [string characterAtIndex:loc]; + if(current == '<') + { + if((loc + 1) < count) + if([string characterAtIndex:loc + 1] != '/') + depth++; + } + else if(current == '>') + { + if(isCloseTag) + depth--; + if(depth == 0) + return NSUnionRange(range, NSMakeRange(loc, 1)); + } + else if((current == '/') || (current == '-') || (current == '?')) + { + isCloseTag = YES; + } + else if(!SOPEX_isValidTagNameCharacter(current)) + { + isCloseTag = NO; + } + loc++; + } + return NSMakeRange(NSNotFound, 0); +} + +NSRange SOPEX_findClosingTagForRangeInString(NSRange range, NSString *string) +{ + return NSMakeRange(NSNotFound, 0); +} + +NSRange SOPEX_findMatchingOpenTagForRangeInString(NSRange range, NSString *string) +{ + return NSMakeRange(NSNotFound, 0); +} + diff --git a/sopex/SOPEX/SOPEXSNSController.h b/sopex/SOPEX/SOPEXSNSController.h new file mode 100644 index 00000000..e58a31b7 --- /dev/null +++ b/sopex/SOPEX/SOPEXSNSController.h @@ -0,0 +1,72 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXSNSController.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Wed Feb 11 2004. + +#ifndef __SOPEXSNSController_H_ +#define __SOPEXSNSController_H_ + +#import + + +@interface SOPEXSNSController : NSObject +{ + NSFileHandle *serverSocket; + NSMutableDictionary *connectionLUT; + id delegate; + struct { + unsigned int respondsToUnregisterInstance: 1; + unsigned int respondsToRegisterInstance: 1; + unsigned int respondsToRegisterSession: 1; + unsigned int respondsToExpireSession: 1; + unsigned int respondsToTerminateSession: 1; + unsigned int respondsToLookupSession: 1; + unsigned int respondsToInstanceIsAlive: 1; + unsigned int RESERVED: 1; + } dflags; +} + +- (void)setDelegate:(id)_delegate; +- (id)delegate; + +- (void)start; +- (void)stop; + +- (NSString *)socketAddress; + +@end + +@interface NSObject (SOPEXSNSControllerDelegate) +- (void)snsController:(SOPEXSNSController *)controller unregisterInstance:(NSDictionary *)instanceDescription; +- (void)snsController:(SOPEXSNSController *)controller registerInstance:(NSDictionary *)instanceDescription; +- (void)snsController:(SOPEXSNSController *)controller instanceIsAlive:(NSDictionary *)instanceDescription; +- (void)snsController:(SOPEXSNSController *)controller instance:(NSDictionary *)instanceDescription sessionDidCreate:(NSString *)sessionID; +- (void)snsController:(SOPEXSNSController *)controller instance:(NSDictionary *)instanceDescription sessionDidTerminate:(NSString *)sessionID; +- (void)snsController:(SOPEXSNSController *)controller instance:(NSDictionary *)instanceDescription sessionDidExpire:(NSString *)sessionID; + +@end + +extern NSString *SNSApplicationNameKey; +extern NSString *SNSApplicationPathKey; +extern NSString *SNSApplicationPIDKey; +extern NSString *SNSApplicationAddressKey; + +#endif /* __SOPEXSNSController_H_ */ diff --git a/sopex/SOPEX/SOPEXSNSController.m b/sopex/SOPEX/SOPEXSNSController.m new file mode 100644 index 00000000..250f5bb6 --- /dev/null +++ b/sopex/SOPEX/SOPEXSNSController.m @@ -0,0 +1,331 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXSNSController.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Wed Feb 11 2004. + +#import "SOPEXSNSController.h" +#include +#include +#include + + +#define DNC [NSNotificationCenter defaultCenter] +#define UD [NSUserDefaults standardUserDefaults] + + +NSString *SNSApplicationNameKey = @"Name"; +NSString *SNSApplicationPathKey = @"Path"; +NSString *SNSApplicationPIDKey = @"PID"; +NSString *SNSApplicationAddressKey = @"Address"; + + +typedef enum { + SNSUnregisterInstance = 0, + SNSRegisterInstance = 1, + SNSRegisterSession = 2, + SNSExpireSession = 3, + SNSTerminateSession = 4, + SNSLookupSession = 50, + SNSInstanceAlive = 100 +} SNSMessageCode; + + +@interface NSFileHandle (SOPEXSNSControllerPrivate) +- (NSData *)_safeReadDataOfLength:(unsigned int)length; +- (NSData *)_snsGetData; +- (NSString *)_snsGetString; +- (int)_snsGetInt; +@end + +@implementation NSFileHandle (SOPEXSNSControllerPrivate) +- (NSData *)_safeReadDataOfLength:(unsigned int)length +{ + NSMutableData *safeData; + NSData *data; + int stillNeeded; + + data = [self readDataOfLength:length]; + stillNeeded = length - [data length]; + + if(stillNeeded == 0) + return data; + + safeData = [[NSMutableData alloc] initWithData:data]; + while(stillNeeded > 0) + { + data = [self readDataOfLength:stillNeeded]; + [safeData appendData:data]; + stillNeeded -= [data length]; + } + return [safeData autorelease]; +} + +- (NSData *)_snsGetData +{ + NSData *data; + int length; + + // Application Name + data = [self _safeReadDataOfLength:sizeof(int)]; + length = *(int *)[data bytes]; + data = [self _safeReadDataOfLength:length]; + return data; +} +- (NSString *)_snsGetString +{ + NSData *data = [self _snsGetData]; + return [[[NSString alloc] initWithCString:(const char *)[data bytes] length:[data length]] autorelease]; +} +- (int)_snsGetInt +{ + NSData *data; + int integer; + + data = [self _safeReadDataOfLength:sizeof(int)]; + integer = *(int *)[data bytes]; + return integer; +} + +@end + + +@implementation SOPEXSNSController + +#pragma mark - +#pragma mark ### INIT & DEALLOC ### + + +- (id)init +{ + [super init]; + self->connectionLUT = [[NSMutableDictionary alloc] initWithCapacity:1]; + return self; +} + +- (void)dealloc +{ + [self stop]; + [self->connectionLUT release]; + [super dealloc]; +} + + +#pragma mark - +#pragma mark ### DELEGATE ### + + +- (void)setDelegate:(id)_delegate +{ + self->delegate = _delegate; + self->dflags.respondsToUnregisterInstance = [_delegate respondsToSelector:@selector(snsController:unregisterInstance:)]; + self->dflags.respondsToRegisterInstance = [_delegate respondsToSelector:@selector(snsController:registerInstance:)]; + self->dflags.respondsToInstanceIsAlive = [_delegate respondsToSelector:@selector(snsController:instanceIsAlive:)]; + self->dflags.respondsToRegisterSession = [_delegate respondsToSelector:@selector(snsController:instance:sessionDidCreate:)]; + self->dflags.respondsToExpireSession = [_delegate respondsToSelector:@selector(snsController:instance:sessionDidExpire:)]; + self->dflags.respondsToTerminateSession = [_delegate respondsToSelector:@selector(snsController:instance:sessionDidTerminate:)]; +} + +- (id)delegate +{ + return self->delegate; +} + + +#pragma mark - +#pragma mark ### START & STOP ### + + +- (void)start +{ + int sd; + struct sockaddr_in sockaddr; + + // create socket + sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + NSAssert1(sd >= 0, @"Couldn't create server socket: %s", strerror(errno)); + + memset(&sockaddr, 0, sizeof(struct sockaddr_in)); + sockaddr.sin_family = AF_INET; + sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); + sockaddr.sin_port = [UD integerForKey:@"SNSPort"]; + + // bind + NSAssert1(bind(sd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) != -1, @"Couldn't bind socket: %s", strerror(errno)); + + // listen with backlog of 5 + NSAssert1(listen(sd, 5) != -1, @"Couldn't listen on socket: %s", strerror(errno)); + + // create NSFileHandle if all is well + self->serverSocket = [[NSFileHandle alloc] initWithFileDescriptor:sd closeOnDealloc:YES]; + + // we're ready to accept connections now + [DNC addObserver:self selector:@selector(acceptConnection:) name:NSFileHandleConnectionAcceptedNotification object:self->serverSocket]; + [self->serverSocket acceptConnectionInBackgroundAndNotify]; +} + +- (void)stop +{ + [DNC removeObserver:self]; + [self->serverSocket release]; + self->serverSocket = nil; +} + + +#pragma mark - +#pragma mark ### ACCESSORS ### + + +- (NSString *)socketAddress +{ + int sockaddrLength; + struct sockaddr_in sockaddr; + + sockaddrLength = sizeof(struct sockaddr_in); + NSAssert1(getsockname([self->serverSocket fileDescriptor], (struct sockaddr *)&sockaddr, &sockaddrLength) != -1, @"Cannot get local port number for socket: %s", strerror(errno)); + return [NSString stringWithFormat:@"localhost:%d", ntohs(sockaddr.sin_port)]; +} + + +#pragma mark - +#pragma mark ### SNSD PROTOCOL ### + + +- (NSDictionary *)_instanceDescriptionForFileHandle:(NSFileHandle *)fileHandle +{ + return [self->connectionLUT objectForKey:[NSNumber numberWithInt:[fileHandle fileDescriptor]]]; +} + +- (void)_unregisterInstance:(NSFileHandle *)fileHandle +{ + if(self->dflags.respondsToUnregisterInstance) + [self->delegate snsController:self unregisterInstance:[self _instanceDescriptionForFileHandle:fileHandle]]; + [self->connectionLUT removeObjectForKey:[NSNumber numberWithInt:[fileHandle fileDescriptor]]]; +} + +- (void)_registerInstance:(NSFileHandle *)fileHandle description:(NSDictionary *)instanceDescription +{ + [self->connectionLUT setObject:instanceDescription forKey:[NSNumber numberWithInt:[fileHandle fileDescriptor]]]; + if(self->dflags.respondsToRegisterInstance) + [self->delegate snsController:self registerInstance:instanceDescription]; +} + + +- (void)acceptConnection:(NSNotification *)notification +{ + NSFileHandle *remote; + + remote = [[notification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem]; + [remote retain]; + + [DNC addObserver:self selector:@selector(availableData:) name:NSFileHandleDataAvailableNotification object:remote]; + [remote waitForDataInBackgroundAndNotify]; + [self->serverSocket acceptConnectionInBackgroundAndNotify]; +} + +- (void)availableData:(NSNotification *)notification +{ + NSFileHandle *remote; + NSData *data; + SNSMessageCode msg; + + remote = [notification object]; + data = [remote readDataOfLength:1]; + if([data length] == 0) + { +#if 1 + NSLog(@"%s remote end did die!", __PRETTY_FUNCTION__); +#endif + [DNC removeObserver:self name:NSFileHandleDataAvailableNotification object:remote]; + [self _unregisterInstance:remote]; + [remote release]; + return; + } + + msg = *(char *)[data bytes]; + if(msg == SNSInstanceAlive) + { + if(self->dflags.respondsToInstanceIsAlive) + [self->delegate snsController:self instanceIsAlive:[self _instanceDescriptionForFileHandle:remote]]; + } + else if(msg == SNSRegisterSession) + { + NSString *sessionID; + + sessionID = [remote _snsGetString]; + if(self->dflags.respondsToRegisterSession) + [self->delegate snsController:self instance:[self _instanceDescriptionForFileHandle:remote] sessionDidCreate:sessionID]; + } + else if(msg == SNSExpireSession) + { + NSString *sessionID; + + sessionID = [remote _snsGetString]; + if(self->dflags.respondsToExpireSession) + [self->delegate snsController:self instance:[self _instanceDescriptionForFileHandle:remote] sessionDidExpire:sessionID]; + } + else if(msg == SNSTerminateSession) + { + NSString *sessionID; + + sessionID = [remote _snsGetString]; + if(self->dflags.respondsToTerminateSession) + [self->delegate snsController:self instance:[self _instanceDescriptionForFileHandle:remote] sessionDidTerminate:sessionID]; + } + else if(msg == SNSRegisterInstance) + { + NSMutableDictionary *instanceDescription; + id tmp, applicationAddress; + int pid; + + instanceDescription = [[NSMutableDictionary alloc] initWithCapacity:3]; + + // Application Name + tmp = [remote _snsGetString]; + [instanceDescription setObject:tmp forKey:SNSApplicationNameKey]; + + // Application Path + tmp = [remote _snsGetString]; + [instanceDescription setObject:tmp forKey:SNSApplicationPathKey]; + + // Application PID + pid = [remote _snsGetInt]; + [instanceDescription setObject:[NSNumber numberWithInt:pid] forKey:SNSApplicationPIDKey]; + + // Application Address + tmp = [remote _snsGetData]; + applicationAddress = [NSUnarchiver unarchiveObjectWithData:tmp]; + [instanceDescription setObject:applicationAddress forKey:SNSApplicationAddressKey]; + + [self _registerInstance:remote description:instanceDescription]; + [instanceDescription release]; + } + else if(msg == SNSUnregisterInstance) + { + [self _unregisterInstance:remote]; + } + else + { + NSLog(@"%s ignoring unknown messageCode:%d Dropping %d bytes.", __PRETTY_FUNCTION__, msg, [[remote availableData] length]); + } + [remote waitForDataInBackgroundAndNotify]; +} + +@end diff --git a/sopex/SOPEX/SOPEXSheetRunner.h b/sopex/SOPEX/SOPEXSheetRunner.h new file mode 100644 index 00000000..585e6a83 --- /dev/null +++ b/sopex/SOPEX/SOPEXSheetRunner.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXSheetRunner.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Mar 29 2004. + +#ifndef __SOPEXSheetRunner_H_ +#define __SOPEXSheetRunner_H_ + +#import + + +@interface SOPEXSheetRunner : NSObject +{ +} + ++ (int)runSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow; + +@end + +int SOPEXRunSheetModalForWindow(NSWindow *sheet, NSWindow *window); + +#endif /* __SOPEXSheetRunner_H_ */ diff --git a/sopex/SOPEX/SOPEXSheetRunner.m b/sopex/SOPEX/SOPEXSheetRunner.m new file mode 100644 index 00000000..6de58058 --- /dev/null +++ b/sopex/SOPEX/SOPEXSheetRunner.m @@ -0,0 +1,70 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXSheetRunner.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Mar 29 2004. + + +#import "SOPEXSheetRunner.h" + + +@interface SOPEXSheetRunner (PrivateAPI) ++ (id)defaultRunner; +- (int)runSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow; +@end + + +@implementation SOPEXSheetRunner + ++ (id)defaultRunner +{ + static id defaultRunner = nil; + + if(defaultRunner == nil) + defaultRunner = [[self alloc] init]; + return defaultRunner; +} + ++ (int)runSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow +{ + return [[self defaultRunner] runSheet:sheet modalForWindow:docWindow]; +} + +- (int)runSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow +{ + int rc; + + [NSApp beginSheet:sheet modalForWindow:docWindow modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:NULL]; + rc = [NSApp runModalForWindow:sheet]; + [sheet orderOut:self]; + return rc; +} + +- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)context +{ + [NSApp stopModalWithCode:returnCode]; +} + +@end + +int SOPEXRunSheetModalForWindow(NSWindow *sheet, NSWindow *window) +{ + return [[SOPEXSheetRunner defaultRunner] runSheet:sheet modalForWindow:window]; +} diff --git a/sopex/SOPEX/SOPEXStatisticsController.h b/sopex/SOPEX/SOPEXStatisticsController.h new file mode 100644 index 00000000..9d283146 --- /dev/null +++ b/sopex/SOPEX/SOPEXStatisticsController.h @@ -0,0 +1,62 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXStatisticsController.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Thu Feb 12 2004. + +#ifndef __SOPEXStatisticsController_H_ +#define __SOPEXStatisticsController_H_ + +#import + + +@interface SOPEXStatisticsController : NSObject +{ + IBOutlet NSWindow *window; + IBOutlet NSTextField *baseURLTextField; + IBOutlet NSTextField *pidTextField; + IBOutlet NSTextField *lastRefreshDateTextField; + IBOutlet NSTableView *applicationStatsTableView; + IBOutlet NSOutlineView *pageStatsOutlineView; + IBOutlet NSButton *refreshButton; + IBOutlet NSProgressIndicator *refreshProgressIndicator; + + NSURL *applicationURL; + NSURL *statsURL; + NSDictionary *natLangDict; + + NSString *currentPageKey; + NSMutableString *characterBuffer; + + NSMutableArray *applicationStats, *pageNames; + NSMutableDictionary *statsForPageNameLUT; + + NSMutableArray *currentStats; // NOT RETAINED +} + +- (id)initWithApplicationURL:(NSString *)url; + +- (IBAction)orderFront:(id)sender; +- (IBAction)performRefresh:(id)sender; +- (IBAction)openApplicationInBrowser:(id)sender; + +@end + +#endif /* __SOPEXStatisticsController_H_ */ diff --git a/sopex/SOPEX/SOPEXStatisticsController.m b/sopex/SOPEX/SOPEXStatisticsController.m new file mode 100644 index 00000000..97f63980 --- /dev/null +++ b/sopex/SOPEX/SOPEXStatisticsController.m @@ -0,0 +1,301 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXStatisticsController.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Thu Feb 12 2004. + +#import "SOPEXStatisticsController.h" + + +@interface SOPEXStatisticsController (PrivateAPI) +- (void)parseXMLData:(NSData *)xmlData; +- (void)setCurrentPageKey:(NSString *)key; +@end + + +@implementation SOPEXStatisticsController + +#pragma mark - +#pragma mark ### INIT & DEALLOC ### + +- (id)initWithApplicationURL:(NSString *)url +{ + NSString *path; + NSData *data; + + [super init]; + + [NSBundle loadNibNamed:@"SOPEXStats" owner:self]; + NSAssert(self->window != nil, @"Problem loading SOPEXStats.nib!"); + + self->applicationURL = [[NSURL URLWithString:url] retain]; + self->statsURL = [[NSURL URLWithString:[NSString stringWithFormat:@"%@/x/WOStats", url]] retain]; + + [self->baseURLTextField setStringValue:[self->applicationURL description]]; + + path = [[NSBundle bundleForClass:isa] pathForResource:@"SOPEXStatisticsNatLang" ofType:@"plist"]; + NSAssert(path != nil, @"Couldn't find SOPEXStatisticsNatLang.plist!"); + data = [NSData dataWithContentsOfFile:path]; + NSAssert(data != nil, @"Couldn't load SOPEXStatisticsNatLang.plist!"); + self->natLangDict = [[NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:NULL] retain]; + + self->applicationStats = [[NSMutableArray alloc] initWithCapacity:20]; + self->pageNames = [[NSMutableArray alloc] initWithCapacity:20]; + self->statsForPageNameLUT = [[NSMutableDictionary alloc] initWithCapacity:20]; + return self; +} + +- (void)dealloc +{ + [self->window orderOut:self]; + [self setCurrentPageKey:nil]; + [self->applicationStats release]; + [self->pageNames release]; + [self->statsForPageNameLUT release]; + [self->natLangDict release]; + [self->applicationURL release]; + [self->statsURL release]; + [super dealloc]; +} + + +#pragma mark - +#pragma mark ### PRIVATE ### + + +- (void)parseXMLData:(NSData *)xmlData +{ + NSXMLParser *parser; + + parser = [[NSXMLParser alloc] initWithData:xmlData]; + [parser setDelegate:self]; + + [self->applicationStats removeAllObjects]; + [self->pageNames removeAllObjects]; + [self->statsForPageNameLUT removeAllObjects]; + + [self setCurrentPageKey:nil]; + self->characterBuffer = [[NSMutableString alloc] init]; + + [parser parse]; + if([parser parserError] != nil) + { + NSLog(@"%s PARSER ERROR! error:%@", __PRETTY_FUNCTION__, [[parser parserError] localizedDescription]); + } + [parser release]; + + [self->characterBuffer release]; + self->characterBuffer = nil; + + [self->applicationStatsTableView reloadData]; + [self->pageStatsOutlineView reloadData]; +} + + +#pragma mark - +#pragma mark ### ACTIONS ### + + +- (IBAction)orderFront:(id)sender +{ + [self->window makeKeyAndOrderFront:sender]; + [self performRefresh:self]; +} + +- (IBAction)performRefresh:(id)sender +{ + NSURLRequest *request; + NSData *xmlStats; + + [self->refreshButton setEnabled:NO]; + [self->refreshProgressIndicator startAnimation:self]; + + // stats = [self->statsURL resourceDataUsingCache:NO]; + // this leads to mayhem, as NSURL's resourceDataUsingCache: method boasts about being + // able to decompress gzip'ed data, but doesn't do it automatically + + request = [NSURLRequest requestWithURL:self->statsURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0]; + NSLog(@"%s retrieving from URL:%@", __PRETTY_FUNCTION__, self->statsURL); + xmlStats = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL]; + + NSLog(@"%s retrieved %d bytes.", __PRETTY_FUNCTION__, [xmlStats length]); + [self parseXMLData:xmlStats]; + + [self->refreshProgressIndicator stopAnimation:self]; + [self->refreshButton setEnabled:YES]; +} + + +- (IBAction)openApplicationInBrowser:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:self->applicationURL]; +} + + +#pragma mark - +#pragma mark ### WINDOW DELEGATE ### + + +- (void)windowWillClose:(NSNotification *)aNotification +{ +} + + +#pragma mark - +#pragma mark ### NSXMLPARSER DELEGATE ### + + +- (void)setCurrentPageKey:(NSString *)key +{ + [key retain]; + [self->currentPageKey release]; + self->currentPageKey = key; + + if(key != nil) + { + [self->pageNames addObject:key]; + + self->currentStats = [[NSMutableArray alloc] initWithCapacity:20]; + [self->statsForPageNameLUT setObject:self->currentStats forKey:key]; + [self->currentStats release]; + } +} + + +- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict +{ + if([elementName isEqualToString:@"page"]) + { + [self setCurrentPageKey:[attributeDict objectForKey:@"name"]]; + } + else if([elementName isEqualToString:@"application"]) + { + [self->pidTextField setStringValue:[attributeDict objectForKey:@"pid"]]; + self->currentStats = self->applicationStats; + } + else if([elementName isEqualToString:@"pages"]) + { + } + [self->characterBuffer deleteCharactersInRange:NSMakeRange(0, [self->characterBuffer length])]; +} + +- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName +{ + NSMutableDictionary *currentStatDict; + NSString *tmp; + NSString *key; + + if([elementName isEqualToString:@"application"] || [elementName isEqualToString:@"page"] || [elementName isEqualToString:@"pages"]) + return; + + key = [self->natLangDict objectForKey:elementName]; + if(key == nil) + key = elementName; + if([key isEqualToString:@""]) + key = nil; + + if(key != nil) + { + currentStatDict = [[NSMutableDictionary alloc] initWithCapacity:2]; + [currentStatDict setObject:key forKey:@"property"]; + tmp = [self->characterBuffer copy]; + [currentStatDict setObject:tmp forKey:@"value"]; + [tmp release]; + [self->currentStats addObject:currentStatDict]; + } + else + { + if([elementName isEqualToString:@"statisticsDate"]) + { + tmp = [self->characterBuffer copy]; + [self->lastRefreshDateTextField setStringValue:tmp]; + [tmp release]; + } + else + { + NSLog(@"%s Suppressing addition of elementName:%@", __PRETTY_FUNCTION__, elementName); + } + } +} + +- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string +{ + [self->characterBuffer appendString:string]; +} + + +#pragma mark - +#pragma mark ### NSTABLEVIEW DELEGATE ### + + +- (int)numberOfRowsInTableView:(NSTableView *)aTableView +{ + return [self->applicationStats count]; +} + +- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex +{ + return [[self->applicationStats objectAtIndex:rowIndex] objectForKey:[aTableColumn identifier]]; +} + + +#pragma mark - +#pragma mark ### NSTABLEVIEW DELEGATE ### + + +- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item +{ + if(item == nil) + return [self->pageNames count]; + + if([item isKindOfClass:[NSString class]]) + return [[self->statsForPageNameLUT objectForKey:item] count]; + return 0; +} + +- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item +{ + if(item == nil) + return YES; + return [self->pageNames containsObject:item]; +} + +- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item +{ + NSArray *statsList; + + if(item == nil) + statsList = self->pageNames; + else + statsList = [self->statsForPageNameLUT objectForKey:item]; + return [statsList objectAtIndex:index]; +} + +- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item +{ + if([item isKindOfClass:[NSString class]]) + if([[tableColumn identifier] isEqualToString:@"name"]) + return item; + else + return nil; + return [item objectForKey:[tableColumn identifier]]; +} + +@end diff --git a/sopex/SOPEX/SOPEXTextView.h b/sopex/SOPEX/SOPEXTextView.h new file mode 100644 index 00000000..8620a52b --- /dev/null +++ b/sopex/SOPEX/SOPEXTextView.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXTextView.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Thu Apr 01 2004. + +#ifndef __SOPEXTextView_H_ +#define __SOPEXTextView_H_ + +#import + +#define SOPEXTextViewNotifiesAboutResponderState 0 + +@interface SOPEXTextView : NSTextView +{ + IBOutlet NSTextField *statusField; +#if SOPEXTextViewNotifiesAboutResponderState + struct { + unsigned respondsToWillBecomeFirstResponder: 1; + unsigned respondsToWillResignFirstResponder: 1; + unsigned RESERVED: sizeof(int) - 2; + } delegateFlags; +#endif +} + +- (void)setErrorStatus:(NSError *)status; + +@end + +#if SOPEXTextViewNotifiesAboutResponderState +@interface NSObject (SOPEXTextViewDelegate) +- (void)textViewWillBecomeFirstResponder:(SOPEXTextView *)textView; +- (void)textViewWillResignFirstResponder:(SOPEXTextView *)textView; +@end +#endif + +#endif /* __SOPEXTextView_H_ */ diff --git a/sopex/SOPEX/SOPEXTextView.m b/sopex/SOPEX/SOPEXTextView.m new file mode 100644 index 00000000..8c1b5212 --- /dev/null +++ b/sopex/SOPEX/SOPEXTextView.m @@ -0,0 +1,102 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXTextView.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Thu Apr 01 2004. + + +#import "SOPEXTextView.h" + + +@interface SOPEXTextView (PrivateAPI) +- (void)adjustStatusField; +@end + + +@implementation SOPEXTextView + +- (void)awakeFromNib +{ + [self setErrorStatus:nil]; +} + +- (void)setErrorStatus:(NSError *)status +{ + if((status != nil) && (self->statusField != nil)) + { + [self->statusField setStringValue:[status localizedDescription]]; + [self adjustStatusField]; + [self->statusField setHidden:NO]; + [[self window] makeFirstResponder:self->statusField]; + } + else + { + [self->statusField setHidden:YES]; + } +} + +- (void)adjustStatusField +{ + NSRect frame, sfFrame; + + frame = [[self superview] frame]; // superview is a clipview + frame = [self convertRect:frame toView:[self->statusField superview]]; + [self->statusField sizeToFit]; + sfFrame = [self->statusField frame]; + sfFrame.origin.x = NSWidth(frame) - NSWidth(sfFrame) + 1.0; + sfFrame.origin.y = NSMaxY(frame) - NSHeight(sfFrame) + 1.0; + [self->statusField setFrame:sfFrame]; +} + +#if SOPEXTextViewNotifiesAboutResponderState +- (void)setDelegate:(id)delegate +{ + [super setDelegate:delegate]; + delegateFlags.respondsToWillBecomeFirstResponder = [delegate respondsToSelector:@selector(textViewWillBecomeFirstResponder:)]; + delegateFlags.respondsToWillResignFirstResponder = [delegate respondsToSelector:@selector(textViewWillResignFirstResponder:)]; +} +#endif + +- (BOOL)becomeFirstResponder +{ + BOOL yn; + + yn = [super becomeFirstResponder]; +#if SOPEXTextViewNotifiesAboutResponderState + if(yn && delegateFlags.respondsToWillBecomeFirstResponder) + [[self delegate] textViewWillBecomeFirstResponder:self]; +#endif + [self->statusField setHidden:YES]; + return yn; +} + +- (BOOL)resignFirstResponder +{ + BOOL yn; + + yn = [super resignFirstResponder]; +#if SOPEXTextViewNotifiesAboutResponderState + if(yn && delegateFlags.respondsToWillResignFirstResponder) + [[self delegate] textViewWillResignFirstResponder:self]; +#endif + return yn; +} + +@end diff --git a/sopex/SOPEX/SOPEXToolbarController.h b/sopex/SOPEX/SOPEXToolbarController.h new file mode 100644 index 00000000..1ada34c4 --- /dev/null +++ b/sopex/SOPEX/SOPEXToolbarController.h @@ -0,0 +1,29 @@ +// $Id: SOPEXToolbarController.h 1 2004-08-20 11:17:52Z znek $ + +#ifndef __SOPEXToolbarController_H__ +#define __SOPEXToolbarController_H__ + +#import + +@class NSString, NSArray, NSDictionary; +@class NSToolbar, NSWindow; + +@interface SOPEXToolbarController : NSObject +{ + NSString *toolbarID; + NSDictionary *idToInfo; + NSMutableDictionary *cachedItems; + NSToolbar *toolbar; + + id target; /* non-retained ! */ +} + +- (id)initWithIdentifier:(NSString *)_id target:(id)_target; + +/* operations */ + +- (void)applyOnWindow:(NSWindow *)_window; + +@end + +#endif /* SOPEXToolbarController */ diff --git a/sopex/SOPEX/SOPEXToolbarController.m b/sopex/SOPEX/SOPEXToolbarController.m new file mode 100644 index 00000000..aeb6e67d --- /dev/null +++ b/sopex/SOPEX/SOPEXToolbarController.m @@ -0,0 +1,166 @@ +// $Id: SOPEXToolbarController.m 1 2004-08-20 11:17:52Z znek $ + +#import "SOPEXToolbarController.h" +#import + +@implementation SOPEXToolbarController + +- (id)initWithIdentifier:(NSString *)_tid target:(id)_target { + if ((self = [super init])) { + self->toolbarID = [_tid copy]; + self->target = _target; + } + return self; +} +- (id)init { + return [self initWithIdentifier:nil target:nil]; +} + +- (void)dealloc { + [self->toolbar release]; + [self->toolbarID release]; + [self->idToInfo release]; + [self->cachedItems release]; + [super dealloc]; +} + +/* accessors */ + +- (NSToolbar *)toolbar { + if (self->toolbar == nil) { + self->toolbar = + [[NSToolbar alloc] initWithIdentifier:self->toolbarID]; + [self->toolbar setAllowsUserCustomization:YES]; + [self->toolbar setAutosavesConfiguration:YES]; + [self->toolbar setDisplayMode:NSToolbarDisplayModeDefault]; + [self->toolbar setDelegate:self]; + } + return self->toolbar; +} + +- (NSDictionary *)toolbarDictionary { + NSString *p; + + if (self->idToInfo) + return self->idToInfo; + + p = [[NSBundle bundleForClass:isa] + pathForResource:self->toolbarID ofType:@"toolbar"]; + if (p == nil) { + NSLog(@"did not find %@.toolbar !", self->toolbarID); + return nil; + } + self->idToInfo = [[NSDictionary alloc] initWithContentsOfFile:p]; + if (self->idToInfo == nil) + NSLog(@"could not load %@.toolbar: %@", self->toolbarID, p); + self->cachedItems = [[NSMutableDictionary alloc] initWithCapacity:[[self->idToInfo objectForKey:@"allowedItems"] count]]; + return self->idToInfo; +} + +- (NSArray *)defaultItemIdentifiers { + return [[self toolbarDictionary] objectForKey:@"defaultItems"]; +} +- (NSArray *)allowedItemIdentifiers { + return [[self toolbarDictionary] objectForKey:@"allowedItems"]; +} +- (NSArray *)selectableItemIdentifiers { + return [[self toolbarDictionary] objectForKey:@"selectableItems"]; +} + +- (NSDictionary *)infoForIdentifier:(NSString *)_itemID { + return [[self toolbarDictionary] objectForKey:_itemID]; +} + +/* operations */ + +- (void)applyOnWindow:(NSWindow *)_window { + [_window setToolbar:[self toolbar]]; +} + +/* toolbar delegate */ + +- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar + itemForItemIdentifier:(NSString *)itemIdent + willBeInsertedIntoToolbar:(BOOL)willBeInserted +{ + NSToolbarItem *toolbarItem; + NSDictionary *itemInfo; + NSString *s; + + if ((itemInfo = [self infoForIdentifier:itemIdent]) == nil) + return nil; + + if ((toolbarItem = [self->cachedItems objectForKey:itemIdent]) != nil) + return toolbarItem; + + toolbarItem = + [[NSToolbarItem alloc] initWithItemIdentifier:itemIdent]; + + if ((s = [itemInfo objectForKey:@"initialState"])) + { + if ([s isEqualToString:@"disabled"]) + [toolbarItem setEnabled:NO]; + } + else + { + [toolbarItem setEnabled:YES]; + } + + if ((s = [itemInfo objectForKey:@"label"])) + [toolbarItem setLabel:s]; + if ((s = [itemInfo objectForKey:@"paletteLabel"])) + [toolbarItem setPaletteLabel:s]; + else + [toolbarItem setPaletteLabel:[toolbarItem label]]; + + if ((s = [itemInfo objectForKey:@"toolTip"])) + [toolbarItem setToolTip:s]; + else + [toolbarItem setToolTip:[toolbarItem paletteLabel]]; + + if ((s = [itemInfo objectForKey:@"imageName"])) + { + NSString *path = [[NSBundle bundleForClass:isa] pathForResource:[s stringByDeletingPathExtension] ofType:[s pathExtension]]; + if(path != nil) + { + NSData *data = [NSData dataWithContentsOfFile:path]; + if(data != nil) + { + NSImage *image; + + image = [[NSImage alloc] initWithData:data]; + [toolbarItem setImage:image]; + [image release]; + } + else + { + NSLog(@"%s cannot open image file at path:%@", __PRETTY_FUNCTION__, path); + } + } + else + { + NSLog(@"%s cannot find image named:%@", __PRETTY_FUNCTION__, s); + } + } + if ((s = [itemInfo objectForKey:@"action"])) { + [toolbarItem setTarget:self->target]; + [toolbarItem setAction:NSSelectorFromString(s)]; + } + + [self->cachedItems setObject:toolbarItem forKey:itemIdent]; + [toolbarItem release]; + + return toolbarItem; +} + +- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar { + return [self defaultItemIdentifiers]; +} +- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar { + return [self allowedItemIdentifiers]; +} +- (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar { + return [self selectableItemIdentifiers]; +} + +@end /* SOPEXToolbarController */ diff --git a/sopex/SOPEX/SOPEXWODocument.h b/sopex/SOPEX/SOPEXWODocument.h new file mode 100644 index 00000000..2c29043f --- /dev/null +++ b/sopex/SOPEX/SOPEXWODocument.h @@ -0,0 +1,37 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXWODocument.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Mar 26 2004. + +#ifndef __SOPEXWODocument_H_ +#define __SOPEXWODocument_H_ + +#import "SOPEXDocument.h" + + +@interface SOPEXWODocument : SOPEXDocument +{ + NSString *componentName; +} + +@end + +#endif /* __SOPEXWODocument_H_ */ diff --git a/sopex/SOPEX/SOPEXWODocument.m b/sopex/SOPEX/SOPEXWODocument.m new file mode 100644 index 00000000..5550a144 --- /dev/null +++ b/sopex/SOPEX/SOPEXWODocument.m @@ -0,0 +1,104 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXWODocument.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Mar 26 2004. + + +#import "SOPEXWODocument.h" +#import "SOPEXRangeUtilities.h" +#import "SOPEXTextView.h" +#import "SOPEXContentValidator.h" + + +@implementation SOPEXWODocument + +- (id)initWithPath:(NSString *)_path +{ + [super initWithPath:_path]; + self->componentName = [[[_path lastPathComponent] stringByDeletingPathExtension] retain]; + return self; +} + +- (void)dealloc +{ + [self->componentName release]; + [super dealloc]; +} + +- (NSArray *)fileTypes +{ + return [NSArray arrayWithObjects:@"html", @"wod", nil]; +} + +- (NSString *)fullPathForFileType:(NSString *)fileType +{ + return [NSString stringWithFormat:@"%@/%@.%@", self->path, self->componentName, fileType]; +} + + +#pragma mark - +#pragma mark ### VALIDATION ### + + +- (NSError *)validateRepresentationForFileType:(NSString *)fileType +{ + id content; + NSError *status; + + content = [[self textViewForFileType:fileType] string]; + if([fileType isEqualToString:@"html"]) + status = [SOPEXContentValidator validateWOHTMLContent:content]; + else + status = [SOPEXContentValidator validateWODContent:content]; + return status; +} + + +#pragma mark - +#pragma mark ### TEXTVIEW DELEGATE ### + + +- (void)textViewDidChangeSelection:(NSNotification *)notification +{ + SOPEXTextView *textView = [notification object]; + NSEvent *event; + NSRange selRange; + + if(textView != [self textViewForFileType:@"html"]) + return; + + selRange = [textView selectedRange]; + event = [NSApp currentEvent]; + + if(([event type] == NSLeftMouseUp) && ([event clickCount] == 2)) + { + NSRange matchRange = SOPEX_findMatchingTagForRangeInString(selRange, [textView string]); + + if(matchRange.location != NSNotFound) + { + selRange = NSUnionRange(selRange, matchRange); + [textView setSelectedRange:selRange affinity:NSSelectionAffinityUpstream stillSelecting:YES]; + [textView scrollRangeToVisible:matchRange]; + } + } +} + +@end diff --git a/sopex/SOPEX/SOPEXWOXDocument.h b/sopex/SOPEX/SOPEXWOXDocument.h new file mode 100644 index 00000000..8275deb6 --- /dev/null +++ b/sopex/SOPEX/SOPEXWOXDocument.h @@ -0,0 +1,37 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXWOXDocument.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Mar 26 2004. + +#ifndef __SOPEXWOXDocument_H_ +#define __SOPEXWOXDocument_H_ + +#import "SOPEXDocument.h" +#import + + +@interface SOPEXWOXDocument : SOPEXDocument +{ +} + +@end + +#endif /* __SOPEXWOXDocument_H_ */ diff --git a/sopex/SOPEX/SOPEXWOXDocument.m b/sopex/SOPEX/SOPEXWOXDocument.m new file mode 100644 index 00000000..5ac4da4f --- /dev/null +++ b/sopex/SOPEX/SOPEXWOXDocument.m @@ -0,0 +1,78 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: SOPEXWOXDocument.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Fri Mar 26 2004. + + +#import "SOPEXWOXDocument.h" +#import "SOPEXContentValidator.h" +#import "SOPEXTextView.h" +#import "SOPEXRangeUtilities.h" + + +@implementation SOPEXWOXDocument + +- (NSArray *)fileTypes +{ + return [NSArray arrayWithObject:@"wox"]; +} + + +#pragma mark - +#pragma mark ### VALIDATION ### + + +- (NSError *)validateRepresentationForFileType:(NSString *)fileType +{ + id content; + + content = [[self textViewForFileType:fileType] string]; + return [SOPEXContentValidator validateWOXContent:content]; +} + + +#pragma mark - +#pragma mark ### TEXTVIEW DELEGATE ### + + +- (void)textViewDidChangeSelection:(NSNotification *)notification +{ + NSTextView *textView = [notification object]; + NSEvent *event; + NSRange selRange; + + selRange = [textView selectedRange]; + event = [NSApp currentEvent]; + + if(([event type] == NSLeftMouseUp) && ([event clickCount] == 2)) + { + NSRange matchRange = SOPEX_findMatchingTagForRangeInString(selRange, [textView string]); + + if(matchRange.location != NSNotFound) + { + selRange = NSUnionRange(selRange, matchRange); + [textView setSelectedRange:selRange affinity:NSSelectionAffinityUpstream stillSelecting:YES]; + [textView scrollRangeToVisible:matchRange]; + } + } +} + +@end diff --git a/sopex/SOPEX/SOPEXWebConnection.h b/sopex/SOPEX/SOPEXWebConnection.h new file mode 100644 index 00000000..956fd4a7 --- /dev/null +++ b/sopex/SOPEX/SOPEXWebConnection.h @@ -0,0 +1,36 @@ +// $Id: SOPEXWebConnection.h 1 2004-08-20 11:17:52Z znek $ + +#ifndef __WebKitTest2_SOPEXWebConnection_H__ +#define __WebKitTest2_SOPEXWebConnection_H__ + +#import + +@class NSURL, NSString, NSData, NSBundle; +@class NSURLResponse; + +@interface SOPEXWebConnection : NSObject +{ + NSURL *url; + NSString *sessionID; + NSBundle *localResourceBundle; + NSMutableDictionary *resourceCache; + NSString *appPrefix; +} + +- (id)initWithURL:(id)_url localResourceBundle:(NSBundle *)_resourceBundle; + + /* accessors */ + +- (NSURL *)url; +- (NSString *)sessionID; + + /* operations */ + +- (void)processResponse:(NSURLResponse *)_r data:(NSData *)_data; + +- (BOOL)shouldRewriteRequestURL:(NSURL *)_url; +- (NSURL *)rewriteRequestURL:(NSURL *)_url; + +@end + +#endif /* __WebKitTest2_SOPEXWebConnection_H__*/ diff --git a/sopex/SOPEX/SOPEXWebConnection.m b/sopex/SOPEX/SOPEXWebConnection.m new file mode 100644 index 00000000..378bdc08 --- /dev/null +++ b/sopex/SOPEX/SOPEXWebConnection.m @@ -0,0 +1,210 @@ +// $Id: SOPEXWebConnection.m 1 2004-08-20 11:17:52Z znek $ + +#import "SOPEXWebConnection.h" +#import "SOPEXWebMetaParser.h" +#import "NSString+Ext.h" +#import "NSBundle+Ext.h" + + +@implementation SOPEXWebConnection + +static BOOL debugOn = NO; + ++ (void)initialize +{ + static BOOL isInitialized = NO; + + if(isInitialized) + return; + + debugOn = [[NSUserDefaults standardUserDefaults] boolForKey:@"SOPEXDebugEnabled"]; + if(debugOn) + debugOn = [[NSUserDefaults standardUserDefaults] boolForKey:@"SOPEXDebugWebConnection"]; + isInitialized = YES; +} + +- (id)initWithURL:(id)_url localResourceBundle:(NSBundle *)_resourceBundle +{ + if ((self = [super init])) { + if ([_url isKindOfClass:[NSURL class]]) + self->url = [_url copy]; + else + self->url = [[NSURL alloc] initWithString:_url]; + + if(_resourceBundle == nil) + _resourceBundle = [NSBundle mainBundle]; + self->localResourceBundle = [_resourceBundle retain]; + self->resourceCache = [[NSMutableDictionary alloc] init]; + self->appPrefix = [[NSString stringWithFormat:@"/%@", [[self->url path] lastPathComponent]] retain]; + } + return self; +} + +- (id)init { + return [self initWithURL:nil localResourceBundle:nil]; +} + +- (void)dealloc { + [self->resourceCache release]; + [self->localResourceBundle release]; + [self->url release]; + [self->sessionID release]; + [self->appPrefix release]; + [super dealloc]; +} + +/* accessors */ + +- (NSURL *)url { + return self->url; +} +- (NSString *)sessionID { + return self->sessionID; +} + +/* session tracking */ + +- (void)_useSessionID:(NSString *)_sid { + [self->sessionID autorelease]; + self->sessionID = [_sid copy]; +} + +- (void)handleNoSessionInResponse:(NSURLResponse *)_r { + if(debugOn) + NSLog(@"%s: NO session-id", __PRETTY_FUNCTION__); +} +- (void)handleInitialSessionID:(NSString *)_s inResponse:(NSURLResponse *)_r { + if(debugOn) + NSLog(@"%s: initial sid: %@", __PRETTY_FUNCTION__, _s); + [self _useSessionID:_s]; +} +- (void)handleChangedSessionID:(NSString *)_s inResponse:(NSURLResponse *)_r { + if(debugOn) + NSLog(@"%s: changed sid: %@", __PRETTY_FUNCTION__, _s); + [self _useSessionID:_s]; +} + +- (void)processSessionID:(NSString *)_sid ofResponse:(NSURLResponse *)_r { + if (_sid) { + if (self->sessionID && ![self->sessionID isEqualToString:_sid]) + [self handleChangedSessionID:_sid inResponse:_r]; + else if (self->sessionID == nil) + [self handleInitialSessionID:_sid inResponse:_r]; + } + else { + [self handleNoSessionInResponse:_r]; + } +} + +/* operations */ + +- (void)processHTML:(NSString *)_html ofResponse:(NSURLResponse *)_r { + NSArray *links; + NSDictionary *meta; + + [[SOPEXWebMetaParser sharedWebMetaParser] + processHTML:_html meta:&meta links:&links]; +#if 0 + if(debugOn) + NSLog(@"%s: meta: %@\n links: %@", __PRETTY_FUNCTION__, + [meta descriptionInStringsFileFormat], links); +#endif + [self processSessionID:[meta objectForKey:@"OGoSessionID"] ofResponse:_r]; +} + +- (void)processResponse:(NSURLResponse *)_r data:(NSData *)_data { + NSString *s; + + if (![[_r MIMEType] hasPrefix:@"text/html"]) + return; + + s = [[NSString alloc] initWithData:_data encoding:NSISOLatin1StringEncoding]; + if (s == nil) + return; + + [self processHTML:s ofResponse:_r]; + [s release]; +} + +- (BOOL)shouldRewriteRequestURL:(NSURL *)_url { + NSString *path; + BOOL shouldRewrite = NO; + + if(debugOn) + NSLog(@"%s testing if I should rewrite:%@", __PRETTY_FUNCTION__, _url); + + if ([_url isFileURL]) + return shouldRewrite; + + if ((path = [_url path]) == nil) { + if(debugOn) + NSLog(@"%s could not get path for URL: %@", __PRETTY_FUNCTION__, path); + return shouldRewrite; + } + + shouldRewrite = ([path rangeOfString:@"WebServerResources"].location != NSNotFound || (![path hasPrefix:self->appPrefix])); + if(debugOn) + NSLog(@"%s shouldRewrite:%@ ->%@", __PRETTY_FUNCTION__, _url, shouldRewrite ? @"YES" : @"NO"); + return shouldRewrite; +} + +- (NSURL *)rewriteRequestURL:(NSURL *)_url +{ + NSString *resourcePath, *urlPath; + NSURL *cacheURL; + + if ([_url isFileURL]) + return _url; + + urlPath = [_url path]; +#if 0 + if([urlPath hasPrefix:self->appPrefix]) + return _url; +#endif + if(debugOn) + NSLog(@"%s [_url path] will be rewritten:%@", __PRETTY_FUNCTION__, _url); + + cacheURL = [self->resourceCache objectForKey:urlPath]; + if(debugOn && cacheURL) + NSLog(@"%s found cached URL for resource:%@", __PRETTY_FUNCTION__, urlPath); + if(cacheURL) + return cacheURL; + + if(debugOn) + NSLog(@"%s trying to find resource:%@", __PRETTY_FUNCTION__, urlPath); + + resourcePath= [self->localResourceBundle pathForResourceWithURLPath:urlPath]; + if(resourcePath == nil) { + if(debugOn) + NSLog(@"%s didn't find resource:%@ in bundle:%@", __PRETTY_FUNCTION__, urlPath, self->localResourceBundle); + /* not cached locally */ + return _url; + } + if(debugOn) + NSLog(@"%s found resource:%@", __PRETTY_FUNCTION__, urlPath); + + cacheURL = [NSURL fileURLWithPath:resourcePath]; + [self->resourceCache setObject:cacheURL forKey:urlPath]; + + return cacheURL; +} + +/* description */ + +- (NSString *)description { + NSMutableString *ms = [NSMutableString stringWithCapacity:32]; + + [ms appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])]; + + [ms appendFormat:@" url=%@", [self->url absoluteString]]; + + if (self->sessionID) + [ms appendFormat:@" sid=%@", self->sessionID]; + else + [ms appendString:@" no-sid"]; + + [ms appendString:@">"]; + return ms; +} + +@end /* SOPEXWebConnection */ diff --git a/sopex/SOPEX/SOPEXWebMetaParser.h b/sopex/SOPEX/SOPEXWebMetaParser.h new file mode 100644 index 00000000..e31b9e23 --- /dev/null +++ b/sopex/SOPEX/SOPEXWebMetaParser.h @@ -0,0 +1,27 @@ +// +// SOPEXWebMetaParser.h +// WebKitTest2 +// +// Created by Helge Hess on Thu Nov 06 2003. +// Copyright (c) 2003 __MyCompanyName__. All rights reserved. +// + +#import + +@class NSMutableArray, NSMutableDictionary; + +@interface SOPEXWebMetaParser : NSObject +{ + NSMutableDictionary *meta; + NSMutableArray *links; +} + ++ (id)sharedWebMetaParser; + +/* parsing */ + +- (void)processHTML:(NSString *)_html + meta:(NSDictionary **)_meta + links:(NSArray **)_links; + +@end diff --git a/sopex/SOPEX/SOPEXWebMetaParser.m b/sopex/SOPEX/SOPEXWebMetaParser.m new file mode 100644 index 00000000..420b3e30 --- /dev/null +++ b/sopex/SOPEX/SOPEXWebMetaParser.m @@ -0,0 +1,117 @@ +// +// SOPEXWebMetaParser.m +// WebKitTest2 +// +// Created by Helge Hess on Thu Nov 06 2003. +// Copyright (c) 2003 __MyCompanyName__. All rights reserved. +// + +#import "SOPEXWebMetaParser.h" + +@implementation SOPEXWebMetaParser + ++ (id)sharedWebMetaParser { + static id parser = nil; + if (parser == nil) parser = [[self alloc] init]; + return parser; +} + +- (void)reset { + [self->meta removeAllObjects]; + [self->links removeAllObjects]; +} +- (void)dealloc { + [self reset]; + [self->meta release]; + [self->links release]; + [super dealloc]; +} + +/* setup */ + +- (void)parserDidStartDocument:(NSXMLParser *)_parser { + [self reset]; + + if (self->meta == nil) + self->meta = [[NSMutableDictionary alloc] initWithCapacity:32]; + if (self->links == nil) + self->links = [[NSMutableArray alloc] initWithCapacity:32]; +} + +/* tags */ + +- (void)parser:(NSXMLParser *)_parser + didStartElement:(NSString *)_tag + namespaceURI:(NSString *)_nsuri + qualifiedName:(NSString *)_qname + attributes:(NSDictionary *)_attrs +{ + if ([_tag length] == 4) { + if ([@"meta" caseInsensitiveCompare:_tag] == NSOrderedSame) { + // TODO: support , http-equiv + NSString *name, *content; + + name = [_attrs objectForKey:@"name"]; + content = [_attrs objectForKey:@"content"]; + if (name) [self->meta setObject:content ? content : @"" forKey:name]; + } + else if ([@"link" caseInsensitiveCompare:_tag] == NSOrderedSame) { + // attrs: type(text/css), rel(styleshet), href(...) + if (_attrs) [self->links addObject:_attrs]; + } + } +} + +- (void)parser:(NSXMLParser *)_parser + didEndElement:(NSString *)_tag + namespaceURI:(NSString *)_nsuri + qualifiedName:(NSString *)_qname +{ + unichar c; + + c = [_tag characterAtIndex:0]; // assume that a tag has at least one char + if (!(c == 'h' || c == 'H')) + return; + if ([_tag length] != 4) + return; + if ([_tag isEqualToString:@"head"]) { + /* only look at HEAD section */ + [_parser abortParsing]; + } +} + +/* high level */ + +- (void)processHTML:(NSString *)_html + meta:(NSDictionary **)_meta + links:(NSArray **)_links +{ + NSAutoreleasePool *pool; + + if ([_html length] == 0) { + if (_meta) *_meta = nil; + if (_links) *_links = nil; + return; + } + + pool = [[NSAutoreleasePool alloc] init]; + { + NSXMLParser *parser; + NSData *xmlData; + + xmlData = [_html dataUsingEncoding:NSUTF8StringEncoding]; + parser = [[[NSXMLParser alloc] initWithData:xmlData] autorelease]; + [parser setDelegate:self]; + [parser parse]; + + if (_meta) *_meta = [self->meta copy]; + if (_links) *_links = [self->links copy]; + [self reset]; + } + [pool release]; + + if (_meta) [*_meta autorelease]; + if (_links) [*_links autorelease]; +} + +@end /* SOPEXWebMetaParser */ diff --git a/sopex/SOPEX/SOPEX_Prefix.pch b/sopex/SOPEX/SOPEX_Prefix.pch new file mode 100644 index 00000000..24373b0e --- /dev/null +++ b/sopex/SOPEX/SOPEX_Prefix.pch @@ -0,0 +1,13 @@ +// +// Prefix header for all source files of the 'SOPEX' target in the 'SOPEX' project. +// + +#ifdef __OBJC__ + #import + #import + #import + + #undef NSLocalizedString + #define NSLocalizedString(key, comment) \ + [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil] +#endif diff --git a/sopex/SOPEX/Version b/sopex/SOPEX/Version new file mode 100644 index 00000000..b19ffd98 --- /dev/null +++ b/sopex/SOPEX/Version @@ -0,0 +1,13 @@ +# $Id: Version 1 2004-08-20 11:17:52Z znek $ +# +# This file is included by library makefiles to set the version information +# of the executable. +# NOTE: This has no effect whatsover on Mac OS X, but is here for the sake +# of consistency. On Mac OS X instead use +# /Developer/Tools/agvtool new-version ${MAJOR_VERSION}.${MINOR_VERSION}.${SUBMINOR_VERSION} + +MAJOR_VERSION=1 +MINOR_VERSION=0 +SUBMINOR_VERSION=9 + +# v1.0.7 requires NGObjWeb v4.2.341 diff --git a/sopex/SOPEX/WebView+Ext.h b/sopex/SOPEX/WebView+Ext.h new file mode 100644 index 00000000..7d447749 --- /dev/null +++ b/sopex/SOPEX/WebView+Ext.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: WebView+Ext.h 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Mar 22 2004. + +#ifndef __WebView_Ext_H_ +#define __WebView_Ext_H_ + +#import + + +@interface WebView (SOPEExt) + +- (NSImage *)pageIcon; + +@end + +#endif /* __WebView_Ext_H_ */ diff --git a/sopex/SOPEX/WebView+Ext.m b/sopex/SOPEX/WebView+Ext.m new file mode 100644 index 00000000..1e7b5305 --- /dev/null +++ b/sopex/SOPEX/WebView+Ext.m @@ -0,0 +1,33 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ +// $Id: WebView+Ext.m 1 2004-08-20 11:17:52Z znek $ +// Created by znek on Mon Mar 22 2004. + +#import "WebView+Ext.h" + +@implementation WebView (SOPEExt) + +- (NSImage *)pageIcon +{ + return [[[self backForwardList] currentItem] icon]; +} + +@end diff --git a/sopex/SOPEX/version.plist b/sopex/SOPEX/version.plist new file mode 100644 index 00000000..10b67d32 --- /dev/null +++ b/sopex/SOPEX/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 2 + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + ProjectName + DevToolsWizardTemplates + SourceVersion + 2960000 + + diff --git a/sopex/Samples/ChangeLog b/sopex/Samples/ChangeLog new file mode 100644 index 00000000..16c9f42f --- /dev/null +++ b/sopex/Samples/ChangeLog @@ -0,0 +1,5 @@ +2004-03-11 Marcus Mueller + + * WOxExtTest: Added some missing resources to the project + + * ChangeLog: created. diff --git a/sopex/Samples/WOxExtTest/AlertPanel.m b/sopex/Samples/WOxExtTest/AlertPanel.m new file mode 100644 index 00000000..69dd5a97 --- /dev/null +++ b/sopex/Samples/WOxExtTest/AlertPanel.m @@ -0,0 +1,49 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: AlertPanel.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface AlertPanel : WOComponent +@end + +#include "common.h" + +@implementation AlertPanel + +- (id)init { + if ((self = [super init])) { + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + } + return self; +} +- (id)countClicks { + int clicks; + + [self logWithFormat:@"+++ invoke 'countClicks' action +++"]; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +@end /* AlertPanel */ diff --git a/sopex/Samples/WOxExtTest/AlertPanel.wox b/sopex/Samples/WOxExtTest/AlertPanel.wox new file mode 100644 index 00000000..a336aca8 --- /dev/null +++ b/sopex/Samples/WOxExtTest/AlertPanel.wox @@ -0,0 +1,25 @@ + + + +
+ + + + clicks:
+ + +
+
diff --git a/sopex/Samples/WOxExtTest/Application.h b/sopex/Samples/WOxExtTest/Application.h new file mode 100644 index 00000000..d3c8eae0 --- /dev/null +++ b/sopex/Samples/WOxExtTest/Application.h @@ -0,0 +1,21 @@ +// +// Application.h +// Project WOExtTest +// +// Created by helge on Mon Feb 16 2004 +// + +#ifndef __Application_H_ +#define __Application_H_ + +#include + + +@interface Application : WOApplication +{ + +} + +@end + +#endif /* __Application_H_ */ diff --git a/sopex/Samples/WOxExtTest/Application.m b/sopex/Samples/WOxExtTest/Application.m new file mode 100644 index 00000000..6219845d --- /dev/null +++ b/sopex/Samples/WOxExtTest/Application.m @@ -0,0 +1,32 @@ +// +// Application.m +// Project WOExtTest +// +// Created by helge on Mon Feb 16 2004 +// + +#include "Application.h" + +@implementation Application + +- (id)init { + if ((self = [super init])) { + WORequestHandler *rh; + + rh = [[NSClassFromString(@"OWViewRequestHandler") alloc] init]; + [self setDefaultRequestHandler:rh]; + [self registerRequestHandler:rh + forKey:[WOApplication componentRequestHandlerKey]]; + [rh release]; rh = nil; + } + return self; +} + +- (WOResponse *)handleException:(NSException *)_exc + inContext:(WOContext *)_ctx +{ + printf("%s\n", [[_exc description] cString]); + abort(); +} + +@end /* Application */ diff --git a/sopex/Samples/WOxExtTest/Browser.m b/sopex/Samples/WOxExtTest/Browser.m new file mode 100644 index 00000000..6bcd9b74 --- /dev/null +++ b/sopex/Samples/WOxExtTest/Browser.m @@ -0,0 +1,148 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: Browser.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@class NSFileManager, NSArray, NSString; + +@interface Browser : WOComponent < NSCoding > +{ + NSFileManager *fm; + + NSArray *currentPath; + NSString *currentPathString; +} +@end + +#include "common.h" + +@implementation Browser + +- (id)init { + if ((self = [super init])) { + self->fm = [[NSFileManager defaultManager] retain]; + + // [self setCurrentPath:nil]; + } + return self; +} + +- (void)dealloc { + RELEASE(self->currentPathString); + RELEASE(self->currentPath); + RELEASE(self->fm); + [super dealloc]; +} + +- (void)setCurrentPath:(NSArray *)_p { + if (_p == nil) + _p = [NSArray array]; + + ASSIGN(self->currentPath, _p); + + RELEASE(self->currentPathString); self->currentPathString = nil; + self->currentPathString = [[_p componentsJoinedByString:@"/"] copy]; +} +- (NSArray *)currentPath { + return self->currentPath; +} +- (NSString *)currentPathString { + return self->currentPathString; +} + +- (NSFileManager *)fileManager { + return self->fm; +} + +- (NSArray *)rootFolder { + return [[self fileManager] directoryContentsAtPath:@"."]; +} + +- (NSString *)bgColor { + NSString *cf; + + cf = [self valueForKey:@"currentFolder"]; + if ([cf isEqualToString:[self currentPathString]]) + return @"AAAAAA"; + if ([cf hasPrefix:[self currentPathString]]) + return @"#FAE8B8"; + + return @"white"; // default bg +} + +- (BOOL)currentIsDirectory { + BOOL isDir; + + if (![self->fm fileExistsAtPath:[self currentPathString] isDirectory:&isDir]) + return NO; + + return isDir; +} + +- (NSString *)currentImage { + if ([self currentIsDirectory]) { + /* directory */ + NSString *cf; + + cf = [self valueForKey:@"currentFolder"]; + + if ([cf hasPrefix:[self currentPathString]]) + return @"folder_opened.gif"; + else + return @"folder_closed.gif"; + } + return nil; +} + +- (NSArray *)dirContents { + if (![self currentIsDirectory]) + return nil; + + return [[self fileManager] directoryContentsAtPath:[self currentPathString]]; +} + +- (id)clicked { + NSLog(@"clicked: path is %@", [self currentPathString]); + NSLog(@"clicked: item is %@", [self valueForKey:@"item"]); + [self takeValue:[self currentPathString] forKey:@"currentFolder"]; + return self; +} + +/* NSCoding */ + +- (void)encodeWithCoder:(NSCoder *)_coder { + [super encodeWithCoder:_coder]; + + [_coder encodeObject:self->currentPath]; + [_coder encodeObject:self->currentPathString]; +} +- (id)initWithCoder:(NSCoder *)_coder { + if ((self = [super initWithCoder:_coder])) { + self->fm = [[NSFileManager defaultManager] retain]; + + self->currentPath = [[_coder decodeObject] retain]; + self->currentPathString = [[_coder decodeObject] retain]; + } + return self; +} + +@end /* TableView */ diff --git a/sopex/Samples/WOxExtTest/Browser.wox b/sopex/Samples/WOxExtTest/Browser.wox new file mode 100644 index 00000000..e7ab8f2b --- /dev/null +++ b/sopex/Samples/WOxExtTest/Browser.wox @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/sopex/Samples/WOxExtTest/CalendarField.m b/sopex/Samples/WOxExtTest/CalendarField.m new file mode 100644 index 00000000..f355744a --- /dev/null +++ b/sopex/Samples/WOxExtTest/CalendarField.m @@ -0,0 +1,44 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: CalendarField.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface CalendarField : WOComponent +@end + +@implementation CalendarField + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"12" forKey:@"hour"]; + [self takeValue:@"30" forKey:@"minute"]; + [self takeValue:@"50" forKey:@"second"]; + + [self takeValue:@"2001" forKey:@"year"]; + [self takeValue:@"5" forKey:@"month"]; + [self takeValue:@"23" forKey:@"day"]; + + [self takeValue:[NSCalendarDate date] forKey:@"date"]; + } + return self; +} +@end diff --git a/sopex/Samples/WOxExtTest/CalendarField.wox b/sopex/Samples/WOxExtTest/CalendarField.wox new file mode 100644 index 00000000..02149406 --- /dev/null +++ b/sopex/Samples/WOxExtTest/CalendarField.wox @@ -0,0 +1,15 @@ + + +
+ +
+ +
+ + +
diff --git a/sopex/Samples/WOxExtTest/CheckBoxMatrix.m b/sopex/Samples/WOxExtTest/CheckBoxMatrix.m new file mode 100644 index 00000000..c8edd342 --- /dev/null +++ b/sopex/Samples/WOxExtTest/CheckBoxMatrix.m @@ -0,0 +1,52 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: CheckBoxMatrix.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface CheckBoxMatrix : WOComponent +@end + +#include "common.h" + +@implementation CheckBoxMatrix + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"3" forKey:@"maxColumns"]; + } + return self; +} + +- (id)increaseClicks { + int clicks; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +- (NSArray *)list { + return [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"12", @"13", nil]; +} + +@end diff --git a/sopex/Samples/WOxExtTest/CheckBoxMatrix.wox b/sopex/Samples/WOxExtTest/CheckBoxMatrix.wox new file mode 100644 index 00000000..ad1ba4e1 --- /dev/null +++ b/sopex/Samples/WOxExtTest/CheckBoxMatrix.wox @@ -0,0 +1,36 @@ + + + +
+ + + increase clicks + +
+ + clicks: +
+ + + + + + + + + + + + + +
MaxColumns:
Horizontal:
+ + + +
diff --git a/sopex/Samples/WOxExtTest/CollapsibleContent.m b/sopex/Samples/WOxExtTest/CollapsibleContent.m new file mode 100644 index 00000000..76a229c9 --- /dev/null +++ b/sopex/Samples/WOxExtTest/CollapsibleContent.m @@ -0,0 +1,54 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: CollapsibleContent.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface CollapsibleContent : WOComponent +@end + +#include "common.h" + +@implementation CollapsibleContent + +- (id)init { + if ((self = [super init])) { + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + } + return self; +} + +- (id)increaseClicks { + int clicks; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +- (id)clearClicks { + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + + return nil; +} + +@end /* CollapsibleContent */ diff --git a/sopex/Samples/WOxExtTest/CollapsibleContent.wox b/sopex/Samples/WOxExtTest/CollapsibleContent.wox new file mode 100644 index 00000000..3070e41a --- /dev/null +++ b/sopex/Samples/WOxExtTest/CollapsibleContent.wox @@ -0,0 +1,77 @@ + + + +
+ + + + + + + + + +
+ content of the first component + +
click
+
+ + + + + + + + + + +
+ content of the second component + +
click
+
+ + + + + + + + + + +
+ content of the third component + +
click
+
+
+ +
+ clicks: +
diff --git a/sopex/Samples/WOxExtTest/CollapsibleContentExt.m b/sopex/Samples/WOxExtTest/CollapsibleContentExt.m new file mode 100644 index 00000000..192290fe --- /dev/null +++ b/sopex/Samples/WOxExtTest/CollapsibleContentExt.m @@ -0,0 +1,54 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: CollapsibleContentExt.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface CollapsibleContentExt : WOComponent +@end + +#include "common.h" + +@implementation CollapsibleContentExt + +- (id)init { + if ((self = [super init])) { + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + } + return self; +} + +- (id)increaseClicks { + int clicks; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +- (id)clearClicks { + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + + return nil; +} + +@end /* CollapsibleContentExt */ diff --git a/sopex/Samples/WOxExtTest/CollapsibleContentExt.wox b/sopex/Samples/WOxExtTest/CollapsibleContentExt.wox new file mode 100644 index 00000000..4dde9b1b --- /dev/null +++ b/sopex/Samples/WOxExtTest/CollapsibleContentExt.wox @@ -0,0 +1,132 @@ + + + some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ + some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ + some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ + some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ some text
+ +
+
+ + + + + + + first collapsible (javaScript: only IE)
+
+ + + content of the first collapsible + some text, some text, some text
+ some text, some text, some text
+ some text, some text, some text
+ some text, some text, some text
+ some text, some text, some text
+ + increase clicks +
+
+ +
+ + + + + + + second collapsible (javaScript: only IE)
+
+ + + content of the second collapsible + some text, some text, some text
+ some text, some text, some text
+ some text, some text, some text
+ some text, some text, some text
+ some text, some text, some text
+ + increase clicks +
+ +
+ +
+ + + + + +
+
+ + + content of the third collapsible + + increase clicks + + +
+ +
+ +
+ clicks: + +
diff --git a/sopex/Samples/WOxExtTest/ConfirmPanel.m b/sopex/Samples/WOxExtTest/ConfirmPanel.m new file mode 100644 index 00000000..aaafe92e --- /dev/null +++ b/sopex/Samples/WOxExtTest/ConfirmPanel.m @@ -0,0 +1,49 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: ConfirmPanel.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface ConfirmPanel : WOComponent +@end + +#include "common.h" + +@implementation ConfirmPanel + +- (id)init { + if ((self = [super init])) { + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + } + return self; +} +- (id)countClicks { + int clicks; + + [self logWithFormat:@"+++ invoke 'countClicks' action +++"]; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +@end diff --git a/sopex/Samples/WOxExtTest/ConfirmPanel.wox b/sopex/Samples/WOxExtTest/ConfirmPanel.wox new file mode 100644 index 00000000..0bebef96 --- /dev/null +++ b/sopex/Samples/WOxExtTest/ConfirmPanel.wox @@ -0,0 +1,28 @@ + + + + + +
+ + + clicks: +
+ + +
+ +
diff --git a/sopex/Samples/WOxExtTest/DateField.m b/sopex/Samples/WOxExtTest/DateField.m new file mode 100644 index 00000000..fc2678fe --- /dev/null +++ b/sopex/Samples/WOxExtTest/DateField.m @@ -0,0 +1,42 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: DateField.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface DateField : WOComponent +{ +} +@end + +@implementation DateField + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"2000" forKey:@"year"]; + [self takeValue:@"10" forKey:@"month"]; + [self takeValue:@"20" forKey:@"day"]; + [self takeValue:[NSCalendarDate date] forKey:@"date"]; + } + return self; +} + +@end /* DateField */ diff --git a/sopex/Samples/WOxExtTest/DateField.wox b/sopex/Samples/WOxExtTest/DateField.wox new file mode 100644 index 00000000..1a675d3e --- /dev/null +++ b/sopex/Samples/WOxExtTest/DateField.wox @@ -0,0 +1,12 @@ + + + +
+ + + + +
diff --git a/sopex/Samples/WOxExtTest/Dictionary.plist b/sopex/Samples/WOxExtTest/Dictionary.plist new file mode 100644 index 00000000..d98e790a --- /dev/null +++ b/sopex/Samples/WOxExtTest/Dictionary.plist @@ -0,0 +1,9 @@ +{ + name = "Brown"; + title = "Doc."; + firstName = "James"; + age = "42"; + street = "Mainst. 1"; + city = "New York"; + zip = "01234"; +} diff --git a/sopex/Samples/WOxExtTest/DictionaryRepetition.m b/sopex/Samples/WOxExtTest/DictionaryRepetition.m new file mode 100644 index 00000000..8161aa77 --- /dev/null +++ b/sopex/Samples/WOxExtTest/DictionaryRepetition.m @@ -0,0 +1,67 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: DictionaryRepetition.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface DictionaryRepetition : WOComponent +{ +} +@end + +#include "common.h" + +@implementation DictionaryRepetition + +- (id)init { + if ((self = [super init])) { + WOResourceManager *rm; + NSString *file; + + rm = [[self application] resourceManager]; + + file = [rm pathForResourceNamed:@"Dictionary.plist" + inFramework:nil + languages:nil]; + + [self takeValue:[NSMutableDictionary dictionaryWithContentsOfFile:file] + forKey:@"dictionary"]; + + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + } + return self; +} + +- (id)increaseClicks { + int clicks; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +- (id)clearClicks { + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + return nil; +} + +@end /* DictionaryRepetition */ diff --git a/sopex/Samples/WOxExtTest/DictionaryRepetition.wox b/sopex/Samples/WOxExtTest/DictionaryRepetition.wox new file mode 100644 index 00000000..43646721 --- /dev/null +++ b/sopex/Samples/WOxExtTest/DictionaryRepetition.wox @@ -0,0 +1,28 @@ + + + +
+ + + + + + + + + + + +
increase clicks
+ +
+ +
+ clicks: + + + +
diff --git a/sopex/Samples/WOxExtTest/DirectAction.h b/sopex/Samples/WOxExtTest/DirectAction.h new file mode 100644 index 00000000..88032247 --- /dev/null +++ b/sopex/Samples/WOxExtTest/DirectAction.h @@ -0,0 +1,21 @@ +// +// DirectAction.h +// Project WOExtTest +// +// Created by helge on Mon Feb 16 2004 +// + +#ifndef __DirectAction_H_ +#define __DirectAction_H_ + +#include + + +@interface DirectAction : WODirectAction +{ + +} + +@end + +#endif /* __DirectAction_H_ */ diff --git a/sopex/Samples/WOxExtTest/DirectAction.m b/sopex/Samples/WOxExtTest/DirectAction.m new file mode 100644 index 00000000..e4948c46 --- /dev/null +++ b/sopex/Samples/WOxExtTest/DirectAction.m @@ -0,0 +1,12 @@ +// +// DirectAction.m +// Project WOExtTest +// +// Created by helge on Mon Feb 16 2004 +// + +#include "DirectAction.h" + +@implementation DirectAction + +@end diff --git a/sopex/Samples/WOxExtTest/DnD.m b/sopex/Samples/WOxExtTest/DnD.m new file mode 100644 index 00000000..97965082 --- /dev/null +++ b/sopex/Samples/WOxExtTest/DnD.m @@ -0,0 +1,73 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: DnD.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface DnD : WOComponent +@end + +#include "common.h" + +@implementation DnD + +- (void)awake { + [super awake]; + [self setObject:nil forKey:@"lastDropOn"]; +} + +- (NSArray *)oneList { + return [NSArray arrayWithObject:@"one"]; +} +- (NSArray *)twoList { + return [NSArray arrayWithObject:@"two"]; +} +- (NSArray *)listOneTwo { + return [NSArray arrayWithObjects:@"one", @"two", nil]; +} + +- (BOOL)droppedOnOne { + return [[self objectForKey:@"lastDropOn"] isEqualToString:@"one"]; +} +- (BOOL)droppedOnTwo { + return [[self objectForKey:@"lastDropOn"] isEqualToString:@"two"]; +} +- (BOOL)droppedOnOneTwo { + return [[self objectForKey:@"lastDropOn"] isEqualToString:@"oneTwo"]; +} + +- (id)one { + NSLog(@"one: dropped %@", [self objectForKey:@"droppedObject"]); + [self setObject:@"one" forKey:@"lastDropOn"]; + return nil; +} +- (id)two { + NSLog(@"two: dropped %@", [self objectForKey:@"droppedObject"]); + [self setObject:@"two" forKey:@"lastDropOn"]; + return nil; +} +- (id)oneTwo { + NSLog(@"oneTwo: dropped %@", [self objectForKey:@"droppedObject"]); + [self setObject:@"oneTwo" forKey:@"lastDropOn"]; + return nil; +} + +@end /* DnD */ diff --git a/sopex/Samples/WOxExtTest/DnD.wox b/sopex/Samples/WOxExtTest/DnD.wox new file mode 100644 index 00000000..3957d63f --- /dev/null +++ b/sopex/Samples/WOxExtTest/DnD.wox @@ -0,0 +1,99 @@ + + + + Drag'n'Drop - only works on IE !
+ + Used elements: +
    +
  • WEDragContainer
  • +
  • WEDropContainer
  • +
  • WEDragScript
  • +
  • WEDropScript
  • +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
DropZone
onetwoone/two
+ + + + + +
+
+ Outside form:

+ + + DragMe + +
+ + Inside form: +
+ + DragMe +
+
+
diff --git a/sopex/Samples/WOxExtTest/English.lproj/InfoPlist.strings b/sopex/Samples/WOxExtTest/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..0439acceed2de44378cdbcdd907bf85b17f92134 GIT binary patch literal 552 zcmbu5%T5A85Jk_Lub8kThKFHi*g)`+ASR5_B^l+R(E&1m0X|+mJs3>L=t9%!uI{Sa zb#LAG4{B71=rQM!gjb%~F=k}$&6u$?GiPRuj1$i*UlZ?D7CC;&%Iu5iZH}tgv*hY< zPMfvpk+?B^`=`c;mb=V7H+0$f`_^peQs%7SU(Azine{ty--=>0nd)Xtf9ZKVM?_ua zjUTu!WLO<0{2#-KsyZrP=u6N!b&lZFsS4^ey$xO0Rs$*(mpIGz;8UnpzjXGAxzx)v X#|%`N=xV}4?ragu-s7UmANW53GyGnu literal 0 HcmV?d00001 diff --git a/sopex/Samples/WOxExtTest/Frame.m b/sopex/Samples/WOxExtTest/Frame.m new file mode 100644 index 00000000..bddf2316 --- /dev/null +++ b/sopex/Samples/WOxExtTest/Frame.m @@ -0,0 +1,68 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: Frame.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@class NSString; + +@interface Frame : WOComponent +{ + NSString *title; +} +@end + +#include "common.h" + +@implementation Frame + +- (void)dealloc { + [self->title release]; + [super dealloc]; +} + +/* accessors */ + +- (void)setTitle:(NSString *)_t { + ASSIGNCOPY(self->title, _t); +} +- (NSString *)title { + return self->title; +} + +- (NSString *)xmlContent { + WOResourceManager *rm; + NSString *path; + NSString *str; + + str = [[self valueForKey:@"title"] stringByAppendingPathExtension:@"wox"]; + rm = [[self application] resourceManager]; + + path = [rm pathForResourceNamed:str + inFramework:nil + languages:nil]; + + str = [NSString stringWithContentsOfFile:path]; + + return str; +} + +@end /* Frame */ diff --git a/sopex/Samples/WOxExtTest/Frame.wox b/sopex/Samples/WOxExtTest/Frame.wox new file mode 100644 index 00000000..2a0dedf5 --- /dev/null +++ b/sopex/Samples/WOxExtTest/Frame.wox @@ -0,0 +1,40 @@ + + + + <var:string value="title"/> + + + + + + + + + + + +
+ +

+ + + + + +
+ [main] +
+ + +
+ + diff --git a/sopex/Samples/WOxExtTest/ImageFlyover.m b/sopex/Samples/WOxExtTest/ImageFlyover.m new file mode 100644 index 00000000..c7926088 --- /dev/null +++ b/sopex/Samples/WOxExtTest/ImageFlyover.m @@ -0,0 +1,49 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: ImageFlyover.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface ImageFlyover : WOComponent +@end + +#include "common.h" + +@implementation ImageFlyover + +- (id)init { + if ((self = [super init])) { + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + } + return self; +} +- (id)countClicks { + int clicks; + + [self logWithFormat:@"+++ invoke 'countClicks' action +++"]; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +@end /* ImageFlyover */ diff --git a/sopex/Samples/WOxExtTest/ImageFlyover.wox b/sopex/Samples/WOxExtTest/ImageFlyover.wox new file mode 100644 index 00000000..6c5242ed --- /dev/null +++ b/sopex/Samples/WOxExtTest/ImageFlyover.wox @@ -0,0 +1,45 @@ + + + + + JSImageFlyover example:

+ + +

+ + + clicks: +

+ + +

+ + + (Note: _ is used for query parameters instead of ?) + + + +
diff --git a/sopex/Samples/WOxExtTest/Info.plist b/sopex/Samples/WOxExtTest/Info.plist new file mode 100644 index 00000000..0aa181ba --- /dev/null +++ b/sopex/Samples/WOxExtTest/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + WOExtTest + CFBundleIconFile + Lori + CFBundleIdentifier + my.sope.apps.WOExtTest + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 0.1 + NSMainNibFile + + NSPrincipalClass + SOPEXApplication + + diff --git a/sopex/Samples/WOxExtTest/KeyValueConditional.m b/sopex/Samples/WOxExtTest/KeyValueConditional.m new file mode 100644 index 00000000..2af8c22c --- /dev/null +++ b/sopex/Samples/WOxExtTest/KeyValueConditional.m @@ -0,0 +1,46 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: KeyValueConditional.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface KeyValueConditional : WOComponent +{ +} +@end + +#include "common.h" + +@implementation KeyValueConditional + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"second" forKey:@"selection"]; + } + return self; +} + +- (NSArray *)list { + return [NSArray arrayWithObjects: + @"first", @"second", @"third", @"fourth", nil]; +} + +@end /* KeyValueConditional */ diff --git a/sopex/Samples/WOxExtTest/KeyValueConditional.wox b/sopex/Samples/WOxExtTest/KeyValueConditional.wox new file mode 100644 index 00000000..86e55753 --- /dev/null +++ b/sopex/Samples/WOxExtTest/KeyValueConditional.wox @@ -0,0 +1,29 @@ + + + + + *** content of first KeyValueCondition *** + + + + +++ content of second KeyValueCondition +++ + + + + --- content of third KeyValueCondition --- + + + + ### content of fourth KeyValueCondition ### + + +
+ + + + +
diff --git a/sopex/Samples/WOxExtTest/Lori.icns b/sopex/Samples/WOxExtTest/Lori.icns new file mode 100644 index 0000000000000000000000000000000000000000..4d1024410cdf2b6083b078bd282c5751afd4e959 GIT binary patch literal 42190 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 literal 0 HcmV?d00001 diff --git a/sopex/Samples/WOxExtTest/Main.m b/sopex/Samples/WOxExtTest/Main.m new file mode 100644 index 00000000..e4868f70 --- /dev/null +++ b/sopex/Samples/WOxExtTest/Main.m @@ -0,0 +1,35 @@ +/* + Copyright (C) 2000-2004 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: Main.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface Main : WOComponent +{ +} + +@end + +#include "common.h" + +@implementation Main + +@end /* Main */ diff --git a/sopex/Samples/WOxExtTest/Main.wox b/sopex/Samples/WOxExtTest/Main.wox new file mode 100644 index 00000000..29e5eb78 --- /dev/null +++ b/sopex/Samples/WOxExtTest/Main.wox @@ -0,0 +1,90 @@ + + + + + WOExtensions / WEExtensions + + + + + + + + + + + +
+ +

WOExtensions/WEExtensions Test (Oeffner)

+ + + + + + + + + + + + + + + +
+

JavaScript Elements

+
  • var:js-validated-field
  • +
  • var:js-alert-panel
  • +
  • var:js-confirm-panel
  • +
  • var:js-modal-window
  • +
  • var:js-img-flyover
  • +
  • var:js-text-flyover
  • +
  • Drag'n'Drop
  • +
  • var:js-shiftclick
  • +
    +

    Misc Elements

    +
  • var:if-key
  • +
  • WORedirect
  • +
  • var:tab-panel
  • +
  • var:table
  • +
  • var:switch
  • +
  • var:collapsible
  • +
  • var:foreach-key
  • +
  • var:threshold-colored-number
  • +
  • var:radio-button-matrix
  • +
  • var:checkbox-matrix
  • +
  • var:rich-string
  • +
    +
    +

    Complex Elements (WEExtensions)

    +
  • var:tableview
  • +
  • var:treeview
  • +
  • var:tabview
  • +
  • var:we-browser
  • +
  • var:we-collapsible
  • +
  • var:pageview
  • +
  • var:table-matrix
  • +
    +

    Scheduling Elements (WEExtensions)

    +
  • var:week-overview
  • +
  • var:weekcol-view
  • +
  • var:month-overview
  • +
  • var:time-field
  • +
  • var:date-field
  • +
  • var:cal-field
  • +
    +

    Standard Elements (NGObjWeb)

    +
  • var:string
  • +
    + + diff --git a/sopex/Samples/WOxExtTest/ModalWindow.m b/sopex/Samples/WOxExtTest/ModalWindow.m new file mode 100644 index 00000000..bb4695aa --- /dev/null +++ b/sopex/Samples/WOxExtTest/ModalWindow.m @@ -0,0 +1,29 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: ModalWindow.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface ModalWindow : WOComponent +@end + +@implementation ModalWindow +@end diff --git a/sopex/Samples/WOxExtTest/ModalWindow.wox b/sopex/Samples/WOxExtTest/ModalWindow.wox new file mode 100644 index 00000000..1fb11950 --- /dev/null +++ b/sopex/Samples/WOxExtTest/ModalWindow.wox @@ -0,0 +1,12 @@ + + + + + + diff --git a/sopex/Samples/WOxExtTest/MonthOverview.m b/sopex/Samples/WOxExtTest/MonthOverview.m new file mode 100644 index 00000000..eb12d35b --- /dev/null +++ b/sopex/Samples/WOxExtTest/MonthOverview.m @@ -0,0 +1,98 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: MonthOverview.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@class NSArray; + +@interface MonthOverview: WOComponent +{ + NSArray *list; +} +@end + +#include "common.h" + +@implementation MonthOverview + +static inline void setDateWithKey(id obj, NSString *key) { + NSString *str; + + str = [obj objectForKey:key]; + + if (str) { + NSCalendarDate *date; + + date = [NSCalendarDate dateWithString:str + calendarFormat:@"%Y-%m-%d %H:%M:%S %Z"]; + [obj setObject:date forKey:key]; + } +} + +- (id)init { + if ((self = [super init])) { + } + return self; +} + +- (void)dealloc { + RELEASE(self->list); + [super dealloc]; +} + +- (NSCalendarDate *)weekStart { + return [NSCalendarDate dateWithString:@"2000-11-06 00:00:00 +0100" + calendarFormat:@"%Y-%m-%d %H:%M:%S %Z"]; +} + +- (NSArray *)list { + if (self->list == nil) { + WOResourceManager *rm; + NSString *path; + + rm = [[self application] resourceManager]; + path = [rm pathForResourceNamed:@"appointments.plist" + inFramework:nil + languages:nil]; + + self->list = [[NSArray alloc] initWithContentsOfFile:path]; + + { + int i, cnt; + + for (i = 0, cnt = [self->list count]; i < cnt; i++) { + setDateWithKey([self->list objectAtIndex:i], @"startDate"); + setDateWithKey([self->list objectAtIndex:i], @"endDate"); + } + } + } + return self->list; +} + +- (NSString *)contentColor { + NSCalendarDate *day = nil; + + day = [self valueForKey:@"currentDay"]; + return ([day monthOfYear] == 11) ? @"#CCCCCC" : @"EEEEEE"; +} + +@end diff --git a/sopex/Samples/WOxExtTest/MonthOverview.wox b/sopex/Samples/WOxExtTest/MonthOverview.wox new file mode 100644 index 00000000..8ba932e3 --- /dev/null +++ b/sopex/Samples/WOxExtTest/MonthOverview.wox @@ -0,0 +1,25 @@ + + + + + + + infos of day

    +
    + + + +
    + +

    +
    + +
    + +
    diff --git a/sopex/Samples/WOxExtTest/PageView.m b/sopex/Samples/WOxExtTest/PageView.m new file mode 100644 index 00000000..95f1e2b9 --- /dev/null +++ b/sopex/Samples/WOxExtTest/PageView.m @@ -0,0 +1,44 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: PageView.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface PageView : WOComponent +@end + +#include "common.h" + +@implementation PageView + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"#FFDAAA" forKey:@"contentColor"]; + [self takeValue:@"#FAE8B8" forKey:@"titleColor"]; + } + return self; +} + +- (NSArray *)pages { + return [NSArray arrayWithObjects:@"one", @"two", @"three", nil]; +} + +@end /* PageView */ diff --git a/sopex/Samples/WOxExtTest/PageView.wox b/sopex/Samples/WOxExtTest/PageView.wox new file mode 100644 index 00000000..7d975e3b --- /dev/null +++ b/sopex/Samples/WOxExtTest/PageView.wox @@ -0,0 +1,178 @@ + + + + Selection: +
    + +
    + Without form:
    + + + first page content + + + + second page content + + + + third page content + + + + fourth page content + + + + fifth page content + + + +
    + Dynamically generated pages (using a var:foreach ...):
    + DO NOT WORK ! + + +
    + With form inside :
    + + +
    + first page content + +
    +
    + + + second page content +
    + + + + + + + + + + + + +
    title color:
    content color:
    + +
    +
    +
    + + + third page content + + + + fourth page content + + + + fifth page content + +
    + +
    + With form (doesn't work ...):
    +
    + + + first page content + + + + second page content + + + + third page content + + + + fourth page content + + + + fifth page content + + +
    + +
    + + + + + + + + + + + + +
    title color:
    content color:
    + +
    +
    +
    diff --git a/sopex/Samples/WOxExtTest/QualifierConditional.m b/sopex/Samples/WOxExtTest/QualifierConditional.m new file mode 100644 index 00000000..a0c125ee --- /dev/null +++ b/sopex/Samples/WOxExtTest/QualifierConditional.m @@ -0,0 +1,57 @@ +/* + Copyright (C) 2000-2004 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: QualifierConditional.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface QualifierConditional : WOComponent +{ + id qualifier; +} +@end + +#include "common.h" + +@implementation QualifierConditional + +- (id)init { + if ((self = [super init])) { + self->qualifier = + @"context.request.clientCapabilities.userAgent like '*Mozilla*'"; + } + return self; +} + +- (void)dealloc { + [self->qualifier release]; + [super dealloc]; +} + +/* accessors */ + +- (void)setQualifier:(id)_q { + ASSIGN(self->qualifier, _q); +} +- (id)qualifier { + return self->qualifier; +} + +@end /* QualifierConditional */ diff --git a/sopex/Samples/WOxExtTest/QualifierConditional.wox b/sopex/Samples/WOxExtTest/QualifierConditional.wox new file mode 100644 index 00000000..d9ab63a2 --- /dev/null +++ b/sopex/Samples/WOxExtTest/QualifierConditional.wox @@ -0,0 +1,29 @@ + + + + + Qualifier matches: name like '*Quali*' + + +
    + + + Qualifier matches: + + + Qualifier does not match: + + +
    + +
    + Qualifier: + +
    + + +
    +
    diff --git a/sopex/Samples/WOxExtTest/README b/sopex/Samples/WOxExtTest/README new file mode 100644 index 00000000..2fa0613e --- /dev/null +++ b/sopex/Samples/WOxExtTest/README @@ -0,0 +1,11 @@ +$Id: README 1 2004-08-20 11:17:52Z znek $ + + +Rapid Development +================= + +In order for "Rapid Development" to work properly you need to open +Xcode's "Project" menu and select "Edit active executable" +(Apple-Option-X). In the following dialog navigate to the "Runtime" +section and select the "Project Directory" as the working directory +when launching the executable. diff --git a/sopex/Samples/WOxExtTest/RadioButtonMatrix.m b/sopex/Samples/WOxExtTest/RadioButtonMatrix.m new file mode 100644 index 00000000..f8fca4d9 --- /dev/null +++ b/sopex/Samples/WOxExtTest/RadioButtonMatrix.m @@ -0,0 +1,54 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: RadioButtonMatrix.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface RadioButtonMatrix : WOComponent +@end + +#include "common.h" + +@implementation RadioButtonMatrix + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"3" forKey:@"maxColumns"]; + } + return self; +} + +- (id)increaseClicks { + int clicks; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +- (NSArray *)list { + return [NSArray arrayWithObjects: + @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", + @"9", @"10", @"11", @"12", @"13", nil]; +} + +@end diff --git a/sopex/Samples/WOxExtTest/RadioButtonMatrix.wox b/sopex/Samples/WOxExtTest/RadioButtonMatrix.wox new file mode 100644 index 00000000..2aa79af4 --- /dev/null +++ b/sopex/Samples/WOxExtTest/RadioButtonMatrix.wox @@ -0,0 +1,34 @@ + + + +
    + + + + increase clicks + +
    + + clicks: +
    + + + + + + + + + + + +
    MaxColumns:
    Horizontal:
    + + + +
    diff --git a/sopex/Samples/WOxExtTest/RichString.m b/sopex/Samples/WOxExtTest/RichString.m new file mode 100644 index 00000000..d006c026 --- /dev/null +++ b/sopex/Samples/WOxExtTest/RichString.m @@ -0,0 +1,38 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: RichString.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface RichString : WOComponent +{ +} +@end + +@implementation RichString + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"richString richString richString" forKey:@"value"]; + } + return self; +} +@end diff --git a/sopex/Samples/WOxExtTest/RichString.wox b/sopex/Samples/WOxExtTest/RichString.wox new file mode 100644 index 00000000..77ed9a0a --- /dev/null +++ b/sopex/Samples/WOxExtTest/RichString.wox @@ -0,0 +1,51 @@ + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    value:
    isBold:
    isItalic:
    isUnderlined:
    isSmall:
    color:
    size:
    +
    + +
    diff --git a/sopex/Samples/WOxExtTest/Session.h b/sopex/Samples/WOxExtTest/Session.h new file mode 100644 index 00000000..8aaa01b8 --- /dev/null +++ b/sopex/Samples/WOxExtTest/Session.h @@ -0,0 +1,21 @@ +// +// Session.h +// Project WOExtTest +// +// Created by helge on Mon Feb 16 2004 +// + +#ifndef __Session_H_ +#define __Session_H_ + +#include + + +@interface Session : WOSession +{ + +} + +@end + +#endif /* __Session_H_ */ diff --git a/sopex/Samples/WOxExtTest/Session.m b/sopex/Samples/WOxExtTest/Session.m new file mode 100644 index 00000000..93ede51a --- /dev/null +++ b/sopex/Samples/WOxExtTest/Session.m @@ -0,0 +1,12 @@ +// +// Session.m +// Project WOExtTest +// +// Created by helge on Mon Feb 16 2004 +// + +#include "Session.h" + +@implementation Session + +@end diff --git a/sopex/Samples/WOxExtTest/ShiftClick.m b/sopex/Samples/WOxExtTest/ShiftClick.m new file mode 100644 index 00000000..75150ff6 --- /dev/null +++ b/sopex/Samples/WOxExtTest/ShiftClick.m @@ -0,0 +1,53 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: ShiftClick.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface ShiftClick : WOComponent +@end + +#include "common.h" + +@implementation ShiftClick + +- (NSArray *)items { + static NSArray *items = nil; + if (items == nil) + items = [[NSArray alloc] initWithObjects: + @"one", @"two", @"three", @"four", + @"five", @"six", @"seven", @"eight", nil]; + return items; +} + +- (BOOL)isChecked { + return [[self valueForKey:[self valueForKey:@"item"]] boolValue]; +} +- (void)setIsChecked:(BOOL)_flag { + [self takeValue:[NSNumber numberWithBool:_flag] + forKey:[self valueForKey:@"item"]]; +} +- (NSString *)scriptCall { + return [NSString stringWithFormat:@"%@(%d)", + [self valueForKey:@"scriptName"], + [[self valueForKey:@"index"] intValue]]; +} +@end /* ShiftClick */ diff --git a/sopex/Samples/WOxExtTest/ShiftClick.wox b/sopex/Samples/WOxExtTest/ShiftClick.wox new file mode 100644 index 00000000..fb3dc33c --- /dev/null +++ b/sopex/Samples/WOxExtTest/ShiftClick.wox @@ -0,0 +1,23 @@ + + + + + + +
    + + + +
    +
    + + +
    + +
    diff --git a/sopex/Samples/WOxExtTest/Switch.m b/sopex/Samples/WOxExtTest/Switch.m new file mode 100644 index 00000000..3d4c6b2d --- /dev/null +++ b/sopex/Samples/WOxExtTest/Switch.m @@ -0,0 +1,54 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: Switch.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface Switch : WOComponent +@end + +#include "common.h" + +@implementation Switch + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"three" forKey:@"selection"]; + + [self takeValue: + [NSArray arrayWithObjects:@"one", @"three", @"four", nil] + forKey:@"selections"]; + + } + return self; +} + +- (NSArray *)list { + return [NSArray arrayWithObjects: + @"one", @"two", @"three", @"four", + @"five", @"six", @"seven",nil]; +} + +- (NSArray *)keys { + return [NSArray arrayWithObjects:@"five", @"six", nil]; +} + +@end /* Switch */ diff --git a/sopex/Samples/WOxExtTest/Switch.wox b/sopex/Samples/WOxExtTest/Switch.wox new file mode 100644 index 00000000..8370398f --- /dev/null +++ b/sopex/Samples/WOxExtTest/Switch.wox @@ -0,0 +1,61 @@ + + + + MultiSwitch:

    + + + content of one
    + content of two
    + content of three
    + content of four
    + content of fifth/six
    + content of default
    +
    + +
    + + SingleSwitch: +

    + + + 1. content of one
    + 2. content of two
    + 3. content of three
    + 4. content of four
    + content of fifth/six
    + content of default
    +
    + +
    + +
    + + + + + + + + + + + + +
    multi selection: + +
    single selection:
    +
    + + content-- + + --content + + +
    diff --git a/sopex/Samples/WOxExtTest/TabPanel.m b/sopex/Samples/WOxExtTest/TabPanel.m new file mode 100644 index 00000000..aad80202 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TabPanel.m @@ -0,0 +1,47 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: TabPanel.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface TabPanel : WOComponent +{ +} +@end + +#include "common.h" + +@implementation TabPanel + +- (id) init { + if ((self = [super init])) { + [self takeValue:@"#777777" forKey:@"nonSelectedBgColor"]; + [self takeValue:@"#BBBBBB" forKey:@"bgcolor"]; + [self takeValue:@"#000077" forKey:@"textColor"]; + } + return self; +} + +- (NSArray *)tabKeys { + return [NSArray arrayWithObjects:@"first", @"second", @"third", nil]; +} + +@end /* TabPanel */ diff --git a/sopex/Samples/WOxExtTest/TabPanel.wox b/sopex/Samples/WOxExtTest/TabPanel.wox new file mode 100644 index 00000000..b3ea3bc3 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TabPanel.wox @@ -0,0 +1,50 @@ + + + + + + + ------------------
    + This is the content
    for the first tab.
    + ------------------
    +
    + + + ******************
    + This is the content
    for the second tab.
    + ******************
    +
    + + + ++++++++++++++++++
    + This is the content
    for the third tab.
    + ++++++++++++++++++
    +
    + +
    + +
    + + + + + + + + + + + + + + + + +
    non selected bg color:
    selected bg color:
    textColor:
    +
    +
    diff --git a/sopex/Samples/WOxExtTest/TabView.m b/sopex/Samples/WOxExtTest/TabView.m new file mode 100644 index 00000000..a3125034 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TabView.m @@ -0,0 +1,98 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: TabView.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface TabView : WOComponent +{ + id bgColor; + id leftCornerIcon; + id rightCornerIcon; + id selection; +} +@end + +#include "common.h" + +@implementation TabView + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"persons" forKey:@"selection"]; + [self takeValue:@"#FCF8DF" forKey:@"bgColor"]; + } + return self; +} +- (void)dealloc { + [self->bgColor release]; + [self->rightCornerIcon release]; + [self->leftCornerIcon release]; + [self->selection release]; + [super dealloc]; +} + +/* accessors */ + +- (void)setBgColor:(id)_col { + ASSIGN(self->bgColor, _col); +} +- (id)bgColor { + return self->bgColor; +} + +- (void)setRightCornerIcon:(id)_icon { + ASSIGN(self->rightCornerIcon, _icon); +} +- (id)rightCornerIcon { + return self->rightCornerIcon; +} + +- (void)setLeftCornerIcon:(id)_icon { + ASSIGN(self->leftCornerIcon, _icon); +} +- (id)leftCornerIcon { + return self->leftCornerIcon; +} + +- (void)setSelection:(id)_col { + ASSIGN(self->selection, _col); +} +- (id)selection { + return self->selection; +} + +/* actions */ + +- (id)increaseClicks { + int clicks; + + //[self debugWithFormat:@"increasing clicks .."]; + + clicks = [[self valueForKey:@"clicks"] intValue]; + clicks++; + + [self takeValue:[NSNumber numberWithInt:clicks] forKey:@"clicks"]; + + return nil; +} + +@end /* TabView */ diff --git a/sopex/Samples/WOxExtTest/TabView.wox b/sopex/Samples/WOxExtTest/TabView.wox new file mode 100644 index 00000000..5f49d459 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TabView.wox @@ -0,0 +1,99 @@ + + + + Clicks:
    + + + + + content of news tab + click + + + + content of persons tab + click + + + + content of projects tab + + + + +
    + + + + + content of news tab + click + + + + content of persons tab + click + + + + content of projects tab + + + + +
    +
    + + + + + + + + + + + + + + + + +
    bg color:
    JS tabs:
    +
    +
    diff --git a/sopex/Samples/WOxExtTest/Table.m b/sopex/Samples/WOxExtTest/Table.m new file mode 100644 index 00000000..ffddf393 --- /dev/null +++ b/sopex/Samples/WOxExtTest/Table.m @@ -0,0 +1,46 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: Table.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface Table : WOComponent +@end + +@implementation Table + +- (id)init { + if ((self = [super init])) { + [self setObject:@"3" forKey:@"maxColumns"]; + [self setObject:@"YES" forKey:@"horizontal"]; + [self setObject:@"1" forKey:@"border"]; + + [self setObject:@"one,two,three,four,five,six,seven,eight,nine,ten" + forKey:@"list"]; + } + return self; +} + +- (NSArray *)listAsArray { + return [[self objectForKey:@"list"] componentsSeparatedByString:@","]; +} + +@end /* Table */ diff --git a/sopex/Samples/WOxExtTest/Table.wox b/sopex/Samples/WOxExtTest/Table.wox new file mode 100644 index 00000000..c6e2f2ec --- /dev/null +++ b/sopex/Samples/WOxExtTest/Table.wox @@ -0,0 +1,42 @@ + + + + + (/) + = + + + + + + + + + + +
    +
    + + + + + + + + + + +
    Config Bindings
    MaxColumns:
    Horizontal:
    + +
    +
    diff --git a/sopex/Samples/WOxExtTest/TableMatrix.m b/sopex/Samples/WOxExtTest/TableMatrix.m new file mode 100644 index 00000000..761933c6 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TableMatrix.m @@ -0,0 +1,29 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: TableMatrix.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface TableMatrix : WOComponent +@end + +@implementation TableMatrix +@end diff --git a/sopex/Samples/WOxExtTest/TableMatrix.wox b/sopex/Samples/WOxExtTest/TableMatrix.wox new file mode 100644 index 00000000..d10a3c2c --- /dev/null +++ b/sopex/Samples/WOxExtTest/TableMatrix.wox @@ -0,0 +1,32 @@ + + + +

    this demo doesn't work ...

    + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/sopex/Samples/WOxExtTest/TableView.m b/sopex/Samples/WOxExtTest/TableView.m new file mode 100644 index 00000000..05799c1d --- /dev/null +++ b/sopex/Samples/WOxExtTest/TableView.m @@ -0,0 +1,125 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: TableView.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@class NSArray; + +@interface TableView : WOComponent < NSCoding > +{ + NSArray *list; + int clicks; +} +@end + +#include "common.h" + +@implementation TableView + +- (id)init { + if ((self = [super init])) { + WOResourceManager *rm; + NSString *file; + + rm = [[self application] resourceManager]; + + file = [rm pathForResourceNamed:@"TableView.plist" + inFramework:nil + languages:nil]; + + self->list = [[NSArray alloc] initWithContentsOfFile:file]; + + [self takeValue:@"4" forKey:@"batchSize"]; + [self takeValue:@"#FCF8DF" forKey:@"evenColor"]; + [self takeValue:@"#FFFFF0" forKey:@"oddColor"]; + [self takeValue:@"#FFDAAA" forKey:@"headerColor"]; + [self takeValue:@"#FFDAAA" forKey:@"footerColor"]; + [self takeValue:@"#FAE8B8" forKey:@"titleColor"]; + } + return self; +} + +- (void)dealloc { + [self->list release]; + [super dealloc]; +} + +/* accessors */ + +- (NSArray *)list { + return self->list; +} +- (void)setList:(NSArray *)_list { + ASSIGN(self->list, _list); +} + +- (BOOL)isGroupCity { + id obj1; + id obj2; + + obj1 = [self valueForKey:@"item"]; + obj2 = [self valueForKey:@"previousItem"]; + + return [[obj1 objectForKey:@"city"] isEqualToString: + [obj2 objectForKey:@"city"]]; +} + +- (BOOL)isGroupZip { + id obj1; + id obj2; + + obj1 = [self valueForKey:@"item"]; + obj2 = [self valueForKey:@"previousItem"]; + + return [[obj1 objectForKey:@"zip"] isEqualToString: + [obj2 objectForKey:@"zip"]]; +} + +- (void)setClicks:(int)_clicks { + self->clicks = _clicks; +} +- (int)clicks { + return self->clicks; +} + +/* actions */ + +- (id)increaseClicks { + self->clicks++; + [self takeValue:[self valueForKey:@"item"] forKey:@"clickedItem"]; + return nil; +} + +/* NSCoding */ + +- (void)encodeWithCoder:(NSCoder *)_coder { + [super encodeWithCoder:_coder]; + [_coder encodeObject:self->list]; +} +- (id)initWithCoder:(NSCoder *)_coder { + if ((self = [super initWithCoder:_coder])) { + self->list = [[_coder decodeObject] retain]; + } + return self; +} + +@end /* TableView */ diff --git a/sopex/Samples/WOxExtTest/TableView.plist b/sopex/Samples/WOxExtTest/TableView.plist new file mode 100644 index 00000000..ebfb55f9 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TableView.plist @@ -0,0 +1,83 @@ +( + { + firstName = "Donald"; + name = "Duck"; + street = "Mainst. 1"; + city = "Hamburg"; + zip = "01234"; + identifier = "object1"; + }, + { + firstName = "Heinz"; + name = "Mueller"; + street = "Hauptstrasse 34"; + city = "Hannover"; + zip = "54222"; + identifier = "object2"; + }, + { + firstName = "Johanna"; + name = "Buttelmann"; + street = "Dorfstrasse 3"; + city = "Magdeburg"; + zip = "39120"; + identifier = "object3"; + }, + { + firstName = "Steffen"; + name = "Kohlau"; + street = "Buchenweg 28"; + city = "Hannover"; + zip = "54222"; + identifier = "object4"; + }, + { + firstName = "Klaus"; + name = "Burger"; + street = "Alleestrasse 6"; + city = "Hamburg"; + zip = "01234"; + identifier = "object5"; + }, + { + firstName = "Dieter"; + name = "Hundertgross"; + street = "Hummelweg 5"; + city = "Magdeburg"; + zip = "39120"; + identifier = "object6"; + }, + { + firstName = "Heidrun"; + name = "Kleinmann"; + street = "Buttergasse 23"; + city = "Magdeburg"; + zip = "39122"; + identifier = "object7"; + }, + { + firstName = "Joerg"; + name = "Zunder"; + street = "Breitstrasse 4a"; + city = "Hannover"; + zip = "54222"; + identifier = "object8"; + }, + { + firstName = "Paul"; + name = "Mann"; + street = "Einsteinstrasse 7"; + city = "Hamburg"; + zip = "01231"; + identifier = "object9"; + }, + { + firstName = "Paula"; + name = "Frau"; + street = "Gareisstrasse 11"; + city = "Hannover"; + zip = "54112"; + identifier = "object10"; + }, + +) diff --git a/sopex/Samples/WOxExtTest/TableView.wox b/sopex/Samples/WOxExtTest/TableView.wox new file mode 100644 index 00000000..3c2c036c --- /dev/null +++ b/sopex/Samples/WOxExtTest/TableView.wox @@ -0,0 +1,120 @@ + + + +
    + + + + + + Folder + Buttons of TableView + + + + + + + + + + + + + + + + increaseClicks + + + + + + + Footer of TableView: + + +
    + clickedItem = +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + javaScriptScrolling (only MSIE): +
    + overflow scrolling (only MSIE): +
    batch size:
    even color:
    odd color:
    title color:
    header color:
    footer color:
    + +
    +
    +
    diff --git a/sopex/Samples/WOxExtTest/TextFlyover.m b/sopex/Samples/WOxExtTest/TextFlyover.m new file mode 100644 index 00000000..b09160ef --- /dev/null +++ b/sopex/Samples/WOxExtTest/TextFlyover.m @@ -0,0 +1,51 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: TextFlyover.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface TextFlyover : WOComponent +@end + +#include "common.h" + +@implementation TextFlyover + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"blue" forKey:@"unselectedColor"]; + [self takeValue:@"red" forKey:@"selectedColor"]; + [self takeValue:[NSNumber numberWithInt:0] forKey:@"clicks"]; + } + return self; +} +- (id)countClicks { + int clicks; + + [self logWithFormat:@"+++ invoke 'countClicks' action +++"]; + + clicks = [[self valueForKey:@"clicks"] intValue]; + [self takeValue:[NSNumber numberWithInt:++clicks] forKey:@"clicks"]; + + return nil; +} + +@end diff --git a/sopex/Samples/WOxExtTest/TextFlyover.wox b/sopex/Samples/WOxExtTest/TextFlyover.wox new file mode 100644 index 00000000..a7829e92 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TextFlyover.wox @@ -0,0 +1,46 @@ + + + + +
    + + + + clicks: +
    + + +
    + +
    + + + + + + + + + + +
    selected color:
    unselected color:
    + +
    +
    +
    diff --git a/sopex/Samples/WOxExtTest/ThresholdColoredNumber.m b/sopex/Samples/WOxExtTest/ThresholdColoredNumber.m new file mode 100644 index 00000000..0d66561a --- /dev/null +++ b/sopex/Samples/WOxExtTest/ThresholdColoredNumber.m @@ -0,0 +1,45 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: ThresholdColoredNumber.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@interface ThresholdColoredNumber : WOComponent +{ +} +@end + +#include "common.h" + +@implementation ThresholdColoredNumber + +- (id)init { + if ((self = [super init])) { + [self takeValue:@"blue" forKey:@"lowColor"]; + [self takeValue:@"red" forKey:@"highColor"]; + [self takeValue:@"0.00 DM" forKey:@"numberformat"]; + [self takeValue:[NSNumber numberWithInt:1] forKey:@"threshold"]; + [self takeValue:[NSNumber numberWithInt:2] forKey:@"value"]; + } + return self; +} + +@end diff --git a/sopex/Samples/WOxExtTest/ThresholdColoredNumber.wox b/sopex/Samples/WOxExtTest/ThresholdColoredNumber.wox new file mode 100644 index 00000000..c08649df --- /dev/null +++ b/sopex/Samples/WOxExtTest/ThresholdColoredNumber.wox @@ -0,0 +1,48 @@ + + + + threshold colored number: + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    low color:
    high color:
    threshold: + +
    value: + +
    NumberFormat:
    +
    +
    diff --git a/sopex/Samples/WOxExtTest/TimeField.m b/sopex/Samples/WOxExtTest/TimeField.m new file mode 100644 index 00000000..3cfbabc3 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TimeField.m @@ -0,0 +1,40 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: TimeField.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface TimeField: WOComponent +{ +} +@end + +@implementation TimeField +- (id)init { + if ((self = [super init])) { + [self takeValue:@"12" forKey:@"hour"]; + [self takeValue:@"30" forKey:@"minute"]; + [self takeValue:@"40" forKey:@"second"]; + [self takeValue:[NSCalendarDate date] forKey:@"date"]; + } + return self; +} +@end diff --git a/sopex/Samples/WOxExtTest/TimeField.wox b/sopex/Samples/WOxExtTest/TimeField.wox new file mode 100644 index 00000000..7f1371db --- /dev/null +++ b/sopex/Samples/WOxExtTest/TimeField.wox @@ -0,0 +1,28 @@ + + + +
    + + +

    + + +

    + + useTextField: +
    + + + +
    diff --git a/sopex/Samples/WOxExtTest/TreeView.m b/sopex/Samples/WOxExtTest/TreeView.m new file mode 100644 index 00000000..6fbe9342 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TreeView.m @@ -0,0 +1,161 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: TreeView.m 1 2004-08-20 11:17:52Z znek $ + +#include + +@class NSArray, NSMutableDictionary; + +@interface TreeView : WOComponent < NSCoding > +{ + NSArray *root; + NSMutableDictionary *state; + id item; + + int clicks; + id currentPath; +} +@end + +#include "common.h" + +@implementation TreeView + +- (id)init { + if ((self = [super init])) { + WOResourceManager *rm; + NSString *path; + + rm = [[self application] resourceManager]; + + path = [rm pathForResourceNamed:@"TreeView.plist" + inFramework:nil + languages:nil]; + + self->root = [[NSArray alloc] initWithContentsOfFile:path]; + self->state = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (void)dealloc { + [self->currentPath release]; + [self->root release]; + [self->item release]; + [self->state release]; + [super dealloc]; +} + +/* accessors */ + +- (NSArray *)root { + return self->root; +} + +- (NSArray *)oneTags { + return [NSArray arrayWithObject:@"one"]; +} + +- (void)setItem:(id)_item { + ASSIGN(self->item, _item); +} +- (id)item { + return self->item; +} + +- (void)setClicks:(int)_clicks { + self->clicks = _clicks; +} +- (int)clicks { + return self->clicks; +} + +- (void)setCurrentPath:(NSString *)_value { + ASSIGN(self->currentPath, _value); +} +- (id)currentPath { + return self->currentPath; +} + +- (NSString *)keyPath { + return [[[self valueForKey:@"currentPath"] + valueForKey:@"key"] componentsJoinedByString:@"."]; +} + +- (void)setIsZoom:(BOOL)_flag { + NSString *key; + + key = [self keyPath]; + + NSLog(@"setIsZoom is %@", key); + if (key) + [self->state setObject:[NSNumber numberWithBool:_flag] forKey:key]; +} +- (BOOL)isZoom { + NSString *key; + + key = [self keyPath]; + + NSLog(@"isZoom is %@", key); + + if (key == nil) + return NO; + + return [[self->state objectForKey:key] boolValue]; +} + +- (BOOL)showItem { + return ([[self keyPath] hasSuffix:@"two"] || + [[self keyPath] hasSuffix:@"four"]) + ? NO + : YES; +} + +/* actions */ + +- (id)countClicks { + self->clicks++; + return nil /* stay on page */; +} + +- (id)dropAction { + NSLog(@"... droppedObject is %@", [self valueForKey:@"droppedObject"]); + return nil; +} + +/* NSCoding */ + +- (void)encodeWithCoder:(NSCoder *)_coder { + [super encodeWithCoder:_coder]; + [_coder encodeObject:self->root]; + [_coder encodeObject:self->state]; + [_coder encodeObject:self->item]; +} +- (id)initWithCoder:(NSCoder *)_coder { + if ((self = [super initWithCoder:_coder])) { + self->root = [[_coder decodeObject] retain]; + self->state = [[_coder decodeObject] retain]; + self->item = [[_coder decodeObject] retain]; + } + return self; +} + +@end /* TableView */ diff --git a/sopex/Samples/WOxExtTest/TreeView.plist b/sopex/Samples/WOxExtTest/TreeView.plist new file mode 100644 index 00000000..717ba5a8 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TreeView.plist @@ -0,0 +1,158 @@ +( + { + firstName = "Jochen"; + name = "Gutmann"; + key = one; + sublist = ( + { + firstName = "Ulli"; + name = "Bauer"; + key = one.one; + sublist = (); + }, + { + firstName = "Herbert"; + name = "Ganghover"; + key = one.two; + sublist = ( + { + firstName = "Traudel"; + name = "Busemann"; + key = one.two.one; + sublist = ( + { + firstName = "Flip"; + name = "Flop"; + key = one.two.one.one; + sublist = ( + { + firstName = "Tura"; + name = "Nabelbauch"; + key = one.two.one.one.one; + sublist = (); + }, + { + firstName = "Gollum"; + name = "Hobbit"; + key = one.two.one.one.two; + sublist = (); + } + ); + } + ); + }, + { + firstName = "Hubi"; + name = "Gubert"; + key = one.two.two; + sublist = (); + }, + { + firstName = "Klaus"; + name = "Fallenstein"; + key = one.two.three; + sublist = (); + }, + { + firstName = "Judith"; + name = "Beckstein"; + key = one.two.four; + sublist = (); + } + ); + }, + { + firstName = "Johanna"; + name = "Strauss"; + key = one.three; + sublist = (); + }, + { + firstName = "Falco"; + name = "Jufert"; + key = one.four; + sublist = (); + }, + { + firstName = "Anja"; + name = "Jungblume"; + key = one.five; + sublist = ( + { + firstName = "Jan"; + name = "Pfitzmann"; + key = one.five.one; + sublist = (); + }, + { + firstName = "Oliver"; + name = "Stein"; + key = one.five.two; + sublist = (); + }, + { + firstName = "Gustav"; + name = "Schaffenbach"; + key = one.five.three; + sublist = (); + } + ); + } + ); + }, + { + name = "Meier"; + firstName = "Hannes"; + key = two; + sublist = (); + }, + { + firstName = "Liesel"; + name = "Rautenstein"; + key = three; + sublist = ( + { + firstName = "Lotte"; + name = "Buchholz"; + key = three.one; + sublist = (); + }, + { + firstName = "Ingmar"; + name = "Rosenherz"; + key = three.two; + sublist = (); + }, + { + firstName = "Helge"; + name = "Schulz"; + key = three.three; + sublist = (); + } + ); + }, + { + firstName = "Dieter"; + name = "Hosenfranz"; + key = four; + sublist = (); + }, + { + firstName = "Inge"; + name = "Meisel"; + key = five; + sublist = (); + }, + { + firstName = "Andre"; + name = "Zerter"; + key = six; + sublist = (); + }, + { + firstName = "Joseph"; + name = "Hedermeier"; + key = seven; + sublist = (); + } +) diff --git a/sopex/Samples/WOxExtTest/TreeView.wox b/sopex/Samples/WOxExtTest/TreeView.wox new file mode 100644 index 00000000..429b5716 --- /dev/null +++ b/sopex/Samples/WOxExtTest/TreeView.wox @@ -0,0 +1,107 @@ + + + + DragMe + + + + + + + + + +
    +
    + + + + + + + tree cell + + + first name + + + name + + + + + + + + + + + + + + + + +
    +
    + + + + + tree cell + count + + + + + first name + count + + + + + name + + + + + + + + + + + + + + + +
    + + +
    diff --git a/sopex/Samples/WOxExtTest/ValidatedField.m b/sopex/Samples/WOxExtTest/ValidatedField.m new file mode 100644 index 00000000..5dee1c57 --- /dev/null +++ b/sopex/Samples/WOxExtTest/ValidatedField.m @@ -0,0 +1,29 @@ +/* + Copyright (C) 2000-2003 SKYRIX Software AG + + This file is part of OGo + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ +// $Id: ValidatedField.m 1 2004-08-20 11:17:52Z znek $ + +#import + +@interface ValidatedField : WOComponent +@end + +@implementation ValidatedField +@end /* ValidateField */ diff --git a/sopex/Samples/WOxExtTest/ValidatedField.wox b/sopex/Samples/WOxExtTest/ValidatedField.wox new file mode 100644 index 00000000..2ce5f8ff --- /dev/null +++ b/sopex/Samples/WOxExtTest/ValidatedField.wox @@ -0,0 +1,41 @@ + + +
    + + + + + + + + + + + + +
    input is required: + +
    text is required: + +
    + +
    + +
    + +
    diff --git a/sopex/Samples/WOxExtTest/VarString.wox b/sopex/Samples/WOxExtTest/VarString.wox new file mode 100644 index 00000000..8163a22d --- /dev/null +++ b/sopex/Samples/WOxExtTest/VarString.wox @@ -0,0 +1,76 @@ + + + + Samples for the <var:string> tag ... + +
    Bindings:
    +value;        // object
    +escapeHTML;   // BOOL
    +numberformat; // string
    +dateformat;   // string
    +formatter;    // WO4: NSFormatter object
    +
    + + + + + + + + + + + + + + +
    var:string on val
    var:string on date (dateformatter)
    var:string on None (nilString)
    + +
    +
    + + + + + + + +
    BindingValue
    value: