// Text of project Cardfile Extensions written on 11/22/95 at 6:38 PM // Beginning of file Social Security Stationery // Before Script for "_view000" // Copyright ©1995 Apple Computer, Inc. All rights reserved. _view000 := {viewBounds: {left: 0, top: 0, right: 0, bottom: 0}, viewFlags: 1, viewFormat: 0, viewJustify: 240, name: "Social Security", infoFrame: { checkPrefix: '[true, nil], // single-instance appears in top level of soup entry // no multiple-instance since socsecnum is unique checkPaths: '[|socialSecurity:PIEDTS|], // slot where data is stored formatFunc: func(data) begin // will be an array with one elt, .socsecnum if StrFilled(data[0]) then ParamStr("Soc sec #: ^0", data); // return string to show in All Info view else ""; // must return a string end, }, protection: 'private // only show up in Names, not in IOBox , symbol: '|socialSecurity:PIEDTS|, type: 'editor // so it will show up in "Add" menu , viewClass: 74 }; _view001 := {path: '|socialSecurity:PIEDTS|, viewBounds: {left: 0, top: 0, right: 0, bottom: 40}, label: "Social Security", viewLineSpacing: 32, _proto: @422 }; AddStepForm(_view000, _view001); constant |layout_Social Security Stationery| := _view000; // End of file Social Security Stationery // Beginning of file Cars Stationery // Before Script for "_view002" // Copyright ©1995 Apple Computer, Inc. All rights reserved. _view002 := {viewBounds: {left: 0, top: 0, right: 0, bottom: 0}, viewFlags: 1, viewFormat: 0, viewJustify: 240, name: "Car" // what will appear in the Add menu , infoFrame: { checkPrefix: '[nil, [pathExpr: |cars:PIEDTS|]], // multiple-instances appear in array called 'cars checkPaths: '[make, model], // slots in car frame where data is stored formatFunc: func(data) begin // will be [cars.make, cars.model] for one car ParamStr("Car: ^?0^0 ||^1", data); // return string to show in All Info view end, }, protection: 'private // only show in Names, not in IOBox , symbol: '|cars:PIEDTS|, type: 'editor // editors will show up in Add menu , viewClass: 74 }; make := { path: nil // will be set dynamically by viewSetupFormScript , viewJustify: 8240, viewBounds: {left: 0, top: 0, right: 0, bottom: 40}, label: "Make", viewLineSpacing: 32, flavor: { _proto: newtCustomFilter, recFlags: vVisible + vClickable + vGesturesAllowed + vPunctuationAllowed + vCapsRequired, }, viewSetupFormScript: func() begin if IsSymbol(selectedPath) then self.path := [pathExpr: selectedPath] else self.path := Clone(selectedPath); AddArraySlot(path, 'make); inherited:?viewSetupFormScript(); end, debug: "make", _proto: @422 }; AddStepForm(_view002, make); model := { path: nil // will be set dynamically by viewSetupFormScript , viewJustify: 8240, viewBounds: {left: 0, top: 0, right: 0, bottom: 40}, flavor: { _proto: newtCustomFilter, recFlags: vVisible + vClickable + vGesturesAllowed + vPunctuationAllowed + vCapsRequired, }, label: "Model", viewLineSpacing: 32, viewSetupFormScript: func() begin if IsSymbol(selectedPath) then self.path := [pathExpr: selectedPath] else self.path := Clone(selectedPath); AddArraySlot(path, 'model); inherited:?viewSetupFormScript(); end, debug: "model", _proto: @422 }; AddStepForm(_view002, model); constant |layout_Cars Stationery| := _view002; // End of file Cars Stationery // Beginning of file Sorton Layout // Before Script for "_view003" // Copyright ©1995 Apple Computer, Inc. All rights reserved. _view003 := { masterSoupSlot: 'Names // will be a layout for the cardfile soup , name: "Sorton", viewFlags: 1, viewFormat: 0, forceNewEntry: nil, protection: 'public // show up in IOBox too , symbol: '|sortonLayout:PIEDTS|, type: 'viewer // show up in "Show" menu , viewBounds: {left: 0, top: 0, right: 0, bottom: 0}, viewJustify: 240, _proto: @402 }; _view004 := {viewBounds: {left: 5, top: 5, right: 0, bottom: 28}, viewJustify: 240, _proto: @406 }; AddStepForm(_view003, _view004); _view005 := {path: 'sorton, viewJustify: 8388656, viewBounds: {left: 8, top: 16, right: 24, bottom: 32} , viewFont: userFont18, _proto: @414 }; AddStepForm(_view004, _view005); constant |layout_Sorton Layout| := _view003; // End of file Sorton Layout // Beginning of file Car DataDef // Before Script for "_view006" // Copyright ©1995 Apple Computer, Inc. All rights reserved. _view006 := {symbol: '|car:PIEDTS|, name: "Car" // appears in the "New" menu , description: "Car" // long description of data (unused by Names app) , superSymbol: 'names // stationery for card file , icon: GetPictAsBits("CarIcon", nil), overviewIcon: GetPictAsBits("CarOverviewIcon", nil), MakeNewEntry: func() Clone('{version: 2, class: |car:PIEDTS|});, TextScript: func() // this call works if infoFrame's formatFunc is correct. GetRoot().cardfile:kGenericTextFunc(target);, StringExtract: func(entry, nLines) ParamStr("^0", [entry.carName]);, viewsToDisplay: // this is required only for CardFile dataDefs (same with overviewIcon) ['default, '|carMakeModel:PIEDTS|] // viewDefs to show in Add button. // could use an empty array here, you'd still get all the views, // but the ones that appear in the array will be first in the list, // and in the order the appear in the array. , _proto: @451 }; constant |layout_Car DataDef| := _view006; // End of file Car DataDef // Beginning of file Car Name ViewDef // Before Script for "_view007" // Copyright ©1995 Apple Computer, Inc. All rights reserved. _view007 := {viewBounds: {left: 0, top: 0, right: 0, bottom: 0}, viewFlags: 1, viewFormat: 0, viewJustify: 240, infoFrame: { checkPrefix: '[true, nil], // each car has one name checkPaths: '[carname], // slot in entry where data is stored // don't need suffix in this case, because we control the // entire soup entry (via the 'class slot) formatFunc: func(data) begin // will be [.carname] ParamStr("^0", data); // return string to show in All Info view end, }, protection: 'private // show up only in Names, not in IOBox , symbol: 'default // every dataDef must have at least one 'default viewDef , type: 'editor // will show up in "Add" menu , name: "Name", viewClass: 74 }; name := {path: 'carname, viewJustify: 8240, viewBounds: {left: 0, top: 0, right: 0, bottom: 40}, viewLineSpacing: 32, flavor: { _proto: newtCustomFilter, recFlags: vVisible + vClickable + vGesturesAllowed + vPunctuationAllowed + vCapsRequired, }, viewQuitScript: func() begin target.sorton := target.(path); // Names soup requires a value in 'sorton inherited:?viewQuitScript(); // this method is defined internally end, debug: "name", _proto: @422 }; AddStepForm(_view007, name); constant |layout_Car Name ViewDef| := _view007; // End of file Car Name ViewDef // Beginning of file Car Make/Model ViewDef // Before Script for "_view008" // Copyright ©1995 Apple Computer, Inc. All rights reserved. _view008 := {viewBounds: {left: 0, top: 0, right: 0, bottom: 0}, viewFlags: 1, viewFormat: 0, viewJustify: 240, name: "Car Info", infoFrame: { checkPrefix: '[true, nil], // each car has one make and model, at top level checkPaths: '[make, model], // slots in entry where data is stored formatFunc: func(data) begin // will be [.make, .model] ParamStr("Car: ^?0^0 ||^1", data); // return string to show in All Info view end, }, protection: 'private // show up in Names only, not IOBox , symbol: '|carMakeModel:PIEDTS|, type: 'editor // show up in "Add" menu , viewClass: 74 }; make := {path: 'make, viewJustify: 8240, viewBounds: {left: 0, top: 0, right: 0, bottom: 40}, flavor: { _proto: newtCustomFilter, recFlags: vVisible + vClickable + vGesturesAllowed + vPunctuationAllowed + vCapsRequired, }, viewLineSpacing: 32, label: "Make", debug: "make", _proto: @422 }; AddStepForm(_view008, make); model := {path: 'model, viewJustify: 8240, viewBounds: {left: 0, top: 0, right: 0, bottom: 40}, flavor: { _proto: newtCustomFilter, recFlags: vVisible + vClickable + vGesturesAllowed + vPunctuationAllowed + vCapsRequired, }, viewLineSpacing: 32, label: "Model", debug: "model", _proto: @422 }; AddStepForm(_view008, model); constant |layout_Car Make/Model ViewDef| := _view008; // End of file Car Make/Model ViewDef // Beginning of file Car Bizcard ViewDef // Before Script for "_view009" // Copyright ©1995 Apple Computer, Inc. All rights reserved. _view009 := {viewBounds: {left: 0, top: 0, right: 240, bottom: 160}, viewFlags: 33, viewFormat: 0, viewJustify: 80, bizCardIcon: nil, bizCardNum: 1001 // cardType that corresponds to this format , name: "CarDef Bizcard" // not currently used by Names application , symbol: '|carBizCard:PIEDTS|, type: 'bizcard // means something special to Names app -- small, readonly view , viewClass: 74 }; carname := { text: nil // set by viewSetupFormScript , viewBounds: {left: 5, top: 5, right: 0, bottom: 28}, viewSetupFormScript: func() begin self.text := target.carname; // get data out of soup entry inherited:?viewSetupFormScript(); end, viewFont: userFont18, viewJustify: 8388656, debug: "carname", _proto: @218 }; AddStepForm(_view009, carname); constant |layout_Car Bizcard ViewDef| := _view009; // End of file Car Bizcard ViewDef // Beginning of text file Install & Remove Scripts.f // Copyright ©1995 Apple Computer, Inc. All rights reserved. // use this to guarantee that this package will not be installed on // a unit which does not include exactly version 2.0 of the Card File application. // If the version is > 2, then these APIs are *not* guaranteed to work, so we check for this... SetPartFrameSlot('DoNotInstall, func() not getroot().cardfile or (getroot().cardfile.version and getroot().cardfile.version > 2)); InstallScript := func(partFrame, removeFrame) begin // stationery that takes just one value RegisterViewDef(GetLayout("Social Security Stationery"), EnsureInternal('person)); // stationery that can have multiple values RegisterViewDef(GetLayout("Cars Stationery"), EnsureInternal('person)); RegisterViewDef(GetLayout("Cars Stationery"), EnsureInternal('company)); // add a new layout window to "Show" menu GetRoot().cardfile:AddLayout(GetLayout("Sorton Layout")); // new data type for cardfile (not 'person, 'group) local dataDefSym := EnsureInternal('|car:PIEDTS|); RegDataDef(dataDefSym, GetLayout("Car DataDef")); RegisterViewDef(GetLayout("Car Name ViewDef"), dataDefSym); RegisterViewDef(GetLayout("Car Make/Model ViewDef"), dataDefSym); RegisterViewDef(GetLayout("Car Bizcard ViewDef"), dataDefSym); RegisterViewDef(GetViewDefs('person).allInfo, dataDefSym); // steal AllInfo view from cardfile end; RemoveScript := func(removeFrame) begin UnregisterViewDef('|socialSecurity:PIEDTS|, 'person); // call kXMitViewDefChangeFunc with ('|socialSecurity:PIEDTS|, 'person, 'remove, kAppSymbol); UnregisterViewDef('|cars:PIEDTS|, 'person); UnregisterViewDef('|cars:PIEDTS|, 'company); // don't use GetRoot().cardfile:RemoveLayout('|sortonLayout:PIEDTS|); call kCardFileSafeRemoveLayoutFunc with ('|sortonLayout:PIEDTS|); UnRegDataDef('|car:PIEDTS|); // Removal is currently unsafe. There is no notification to the application that // may be using the stationery that it has been removed. // Newton Engineering is working on a solution, which will be something like this: // call kXmitDataDefChangeFunc with ('|car:PIEDTS|, 'remove, kAppSymbol); UnregisterViewDef('default, '|car:PIEDTS|); UnregisterViewDef('|carMakeModel:PIEDTS|, '|car:PIEDTS|); UnregisterViewDef('|carBizCard:PIEDTS|, '|car:PIEDTS|); UnregisterViewDef('allinfo, '|car:PIEDTS|); end; // End of text file Install & Remove Scripts.f