TweetFollow Us on Twitter

Two Editors
Volume Number:7
Issue Number:5
Column Tag:Jörg's Folder

Two Simple Editors

By Jörg Langowski, MacTutor Editorial Board

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

“Two simple editors”

If you’ve read enough about drawing shapes in windows under MacApp, here’s a little break. In fact, the next feature that I wanted to add to the drawing example was to put text boxes into the document. I soon found out that in order to do that in a clean way, one needs to understand the view architecture of MacApp a little better. In order to do that, we’ll diverge from our previous example and look at two small text editor programs.

Views

A view - in the MacApp perspective - is anything that is displayed on a screen. Thus, a window by itself is a view. Anything that is displayed in that window is also a view. Views depend on each other in a hierarchical way; if you display some editable text, some controls and a list in a window, these items will be subviews of the main window view. Each subview can again display other views, which will then depend on that subview, and so on.

In our example, we display editable text in a window. The view class used for displaying a TextEdit record is called TTEView. Our window will contain one subview of this class. MacApp provides a function which creates a window with its associated view hierarchy from a template which is stored in a ‘view’ resource. In our example (see listing 1&2) NewTemplateWindow (kWindowID, itsDocument) will create a TextEdit window that responds in the usual way to keyboard input, menu commands like Cut, Copy and Paste, and changes the cursor to an I-bar when it is over the TextEdit rectangle in the window. We have set itsDocument to nil because we do not want a document to be associated with the view. We’ll talk about how to add documents next time.

We’ll see soon how one creates the view resource, for the moment look at the program example and see with how little code you can program a functioning text editor in MacApp. It won’t read or write files yet, neither will it scroll or change the text style (functions that we’ll add later), but it will print its text.

The listing shows that all the important functionality of the window (and therefore of the program) is contained in the constructor routine of the TEditor class, of which our application is an instance (yes, we are finally using constructors in C++/MacApp, instead of the initialization methods that were inherited from Pascal). The application’s window is created by NewTemplateWindow, and the TTEView instance is created from its view hierarchy through the MacApp routine FindSubView, which finds a subview by its name.

ViewEdit

So how did we generate the template for our window and the TTEView? MacApp 2.0 provides a wonderful tool, ViewEdit. With this program, you generate a view hierarchy just by drawing it. I cannot go into all the details of that program; the screen image below shows how a typical dialog looks like that is used to change the parameters of a view; in this case, our TTEView.

You see from the dialog which parameters can be controlled through the view template: the upper part of the dialog shows all the attributes of the TTEView, such as fonts, justification, etc., and the lower part controls the superclass (TView) parameters. There, we can name the view template (‘edit’), and determine where it is located in the window and how it responds to resizing of the superview. Through a similar dialog we can control the initialization of the main window. The view resource that we created in this way is added to our program.

Other resources that we may need (size, dialogs, etc.) are contained in the file ‘Defaults.rsrc’ in the MacApp library. The editor.r Rez file takes some resources from that file, and also defines the File menu. The actual C++ program is only about a page long.

Scrolling the text

The template window created in the first example does not scroll the text. We can add scrolling through several different routes: there exists a TScroller class, which can be a subview of our window and in turn contain the TTEView as a subview. We’ll talk about that class in a later column; for a very simple scrolling editor, we can create a window that contains one scrollable view using the function NewSimpleWindow (Listing 4). This routine creates a MacApp window from a WIND resource and adds optionally scrollbars. One parameter to the routine is the view that is to be displayed in the window.

Thus, for the second editor example, we create a simple TTEView template with ViewEdit, name it ‘text’ (why not?) and save it in a view ID=1002 resource which will be copied into our program file. DoCreateViews (Listing 4) will create the view hierarchy corresponding to that resource ID, in our case only one TTEView. Its parameters are the associated document (nil here), the superview (also nil), the view resource ID, and the offset of the view inside its superview (no offset here). gZeroVPt is a (0,0) point in the 32-bit coordinate system that is used by MacApp views.

We then call NewSimpleWindow, with parameters that indicate the window ID, whether or not we want horizontal or vertical scrollbars, the document that is supposed to be displayed in the TTEView (nil, because we are not handling documents in this example), and the view to be displayed.

With these changes, our editor will also scroll the text. It prints already, so all we need to add is file handling. We’ll do that in the next column.

Forth news

A reader who downloaded Yerk (the public-domain NEON successor which I wrote about some months ago), complained about some bugs that seem to have perpetuated from the original NEON. Walter Kulecz <wkulecz@medics.span.nasa.gov> writes:

” Is YERK worth the trouble to learn? Reading the documentation suggested it might be, having source code is a BIG PLUS!, but playing with the command window suggests it might not be.

Problems:

Command window doesn’t update if something pops up in front of it. This I can live with. Backspacing the cursor leaves underlines where it was. Again, no real problem but we’re beginning to look ugly. Zoom to full screen. Note the right hand control border and part of the growbox pollute the new bigger screen. Real Ugly. The real bad news is if your vertical pixel count is not a multiple of your font character height, as once the screen starts scrolling, the characters are clipped and unreadable after scrolling! Presumably this uses the allegedly improved OOPS paradigm in its implementation, so this bug/feature would be inherited by everything else, which of course suggests .... why bother?

I’d like to believe. I don’t have time to dink around. Answer me back with your opinion of the “best” example program I should play with to be convinced that YERK is worth while. I may have jumped to a hasty conclusion, but I always give things a second chance. ”

It is true that the bugs you have discovered make the command window look a little ugly, and they were there in the original NEON from the beginning. However, that should not discourage you from trying out Yerk; the Window class has not much to do with the way the NEON - oops, Yerk - interpreter writes its output into the window. You can define your window’s behavior in any way you like. If you have already a big investment into a development in some other language, you are probably not going to rewrite everything in Yerk.

However, as stated here repeatedly, Yerk/NEON is one of the best ways to study and understand object-oriented programming. It was my first exposure to OOP, and has certainly helped me a great deal in understanding other implementations, such as MacApp. For most of you interested in Forth and OOP, Yerk will be a terrific teaching tool, and for some, a tool to create great applications.

See you next month.

Listing 1: editor.h

class TEditor : public TApplication {
public:
 pascal TEditor(OSType itsMainFileType);
 pascal void HandleFinderRequest();
#ifdef qDebug
 virtual pascal void IdentifySoftware();
#endif
};
Listing 2: editor.cp

#include <UMacApp.h>
#include <UPrinting.h>
#include <UTEView.h>
#include <Fonts.h>
#include <ToolUtils.h>

#include “editor.h”

const OSType kSignature   = ‘JLMT’;
const OSType kFileType  = ‘JL01’;
const int kWindowID= 1001;

pascal TEditor::TEditor(OSType itsMainFileType)
{
 TTEView*aTEView;
 TStdPrintHandler*aStdPrintHandler;
 TWindow*aWindow;
 
 IApplication(itsMainFileType);
 
 aWindow = NewTemplateWindow(kWindowID,nil);
 FailNIL(aWindow);
 aTEView = (TTEView*) aWindow->FindSubView(‘edit’);
 FailNIL(aTEView);
 aStdPrintHandler = new TStdPrintHandler;
 FailNIL(aStdPrintHandler);
 aStdPrintHandler->IStdPrintHandler(
 nil,
 aTEView,
 kSquareDots,
 kFixedSize,
 !kFixedSize);
 aWindow->Open();
}

pascal void TEditor::HandleFinderRequest()  {};

#ifdef qDebug
pascal void TEditor::IdentifySoftware()
{ProgramReport
 (“\pEditor ©J.Langowski/MacTutor March 1991”,
 false);
 inherited::IdentifySoftware();   }
#endif
 
TEditor *gEditor;

int main()
{
 InitToolBox();
 if (ValidateConfiguration(&gConfiguration))
 {
 InitUMacApp(8);
 InitUPrinting();
 InitUTEView();
 gEditor = new TEditor(kFileType);
 FailNIL(gEditor);
 gEditor->Run();
 }
 else StdAlert(phUnsupportedConfiguration);
 return 0;
}
Listing 3: editor.r

/* editor.r 
 Rez file for MacTutor C++/MacApp Editor example
 J. Langowski March 1991  */

#ifndef __TYPES.R__
#include “Types.r”
#endif

#ifndef __SYSTYPES.R__
#include “SysTypes.r”
#endif

#ifndef __MacAppTypes__
#include “MacAppTypes.r”
#endif

#ifndef __ViewTypes__
#include “ViewTypes.r”
#endif

#if qDebug
include “Debug.rsrc”;
#endif

include “MacApp.rsrc”;
include “Printing.rsrc”;

include “Defaults.rsrc” ‘SIZE’(-1);
include “Defaults.rsrc” ‘ALRT’(phAboutApp);
include “Defaults.rsrc” ‘DITL’(phAboutApp);
include “Defaults.rsrc” ‘cmnu’(mApple);
include “Defaults.rsrc” ‘cmnu’(mEdit);
include “Defaults.rsrc” ‘cmnu’(mBuzzWords);

include “Editor” ‘CODE’;

include “editor.rsrc”;

#define kSignature ‘JLMT’
#define kDocFileType ‘JL01’
#define getInfoString“©1991 J.Langowski/MacTutor. Translated from MacApp® 
Pascal.”

resource ‘cmnu’ (2) {
 2,
 textMenuProc,
 allEnabled,
 enabled,
 “File”,
  {
 “Close”, noIcon, noKey, noMark, plain, 31;
 “-”, noIcon, noKey, noMark, plain, nocommand;
 “Page Setup ”, 
 noIcon, noKey, noMark, plain, 176;
 “Print One”, noIcon, “P”, noMark, plain, 177;
 “Print ”, noIcon, noKey, noMark, plain, 178;
 “-”, noIcon, noKey, noMark, plain, nocommand;
 “Quit”, noIcon, “Q”, noMark, plain, 36
 }
};

resource ‘MBAR’ (kMBarDisplayed,purgeable) 
{{mApple; 2; mEdit;} };

resource ‘vers’ (2,
#if qNames
“Package Version”,
#endif
 purgeable) {  0x02, 0x00, beta, 0x06, verUs, “2.0”,
 “MacApp® 2.0, ©Apple Computer, Inc. 1990”
};

resource ‘vers’ (1,
#if qNames
“File Version”,
#endif
 purgeable) { 0x01, 0x00, beta, 0x05, verUs, “Editor”,
 “v 0.8, ©JL/MacTutor 1991”
};

resource ‘dbug’ (kDebugParamsID,
#if qNames
“Debug”,
#endif
 purgeable) {
 {350, 4, 474, 636},
 /* Bounding rect for debug window */
 1,   /* Debug window font rsrc ID  */
 9,/* Debug window font size */
 100, /* Number of lines */
 100, /* Width of lines in characters */
 true, /* open initially */
 “Jörg’s Debug Window”  /* Window title */
};
Listing 4: editor2.h

class TEditor : public TApplication {
public:
 TTEView*fTEView;
 TStdPrintHandler*fStdPrintHandler;
 TWindow*fWindow;
 
 pascal TEditor(OSType itsMainFileType);
 pascal void HandleFinderRequest();
#ifdef qDebug
 virtual pascal void IdentifySoftware();
#endif
};
Listing 5: Changed routines for editor2.cp

#include “editor2.h”

const int kTEViewID= 1002;
pascal TEditor::TEditor(OSType itsMainFileType)
{
 IApplication(itsMainFileType);
 
 fTEView = (TTEView*) 
 DoCreateViews(nil,nil,kTEViewID,&gZeroVPt);
 FailNIL(fTEView);

 fWindow = NewSimpleWindow(kDefaultWindowID, 
 kWantHScrollBar,kWantVScrollBar, nil, fTEView);
 FailNIL(fWindow);

 fStdPrintHandler = new TStdPrintHandler;
 FailNIL(fStdPrintHandler);

 fStdPrintHandler->IStdPrintHandler( nil, fTEView,
 kSquareDots,kFixedSize,!kFixedSize);
 
 fWindow->SetTitleForDoc
 (“\pMacTutor Editor Window”);
 fWindow->Open();
}
Listing 6: Changes from editor.r to editor2.r

include “Defaults.rsrc” ‘WIND’(kDefaultWindowID);
include “Editor2” ‘CODE’;
include “editor2.rsrc”;


 

Community Search:
MacTech Search:

Software Updates via MacUpdate

iFFmpeg 6.4.2 - Convert multimedia files...
iFFmpeg is a comprehensive media tool to convert movie, audio and media files between formats. The FFmpeg command line instructions can be very hard to master/understand, so iFFmpeg does all the hard... Read more
EtreCheck 3.4.2 - For troubleshooting yo...
EtreCheck is an app that displays the important details of your system configuration and allow you to copy that information to the Clipboard. It is meant to be used with Apple Support Communities to... Read more
Carbon Copy Cloner 4.1.17 - Easy-to-use...
Carbon Copy Cloner backups are better than ordinary backups. Suppose the unthinkable happens while you're under deadline to finish a project: your Mac is unresponsive and all you hear is an ominous,... Read more
VueScan 9.5.81 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Hopper Disassembler 4.2.10- - Binary dis...
Hopper Disassembler is a binary disassembler, decompiler, and debugger for 32- and 64-bit executables. It will let you disassemble any binary you want, and provide you all the information about its... Read more
Viber 6.8.6 - Send messages and make cal...
Viber lets you send free messages and make free calls to other Viber users, on any device and network, in any country! Viber syncs your contacts, messages and call history with your mobile device, so... Read more
Viber 6.8.6 - Send messages and make cal...
Viber lets you send free messages and make free calls to other Viber users, on any device and network, in any country! Viber syncs your contacts, messages and call history with your mobile device, so... Read more
Carbon Copy Cloner 4.1.17 - Easy-to-use...
Carbon Copy Cloner backups are better than ordinary backups. Suppose the unthinkable happens while you're under deadline to finish a project: your Mac is unresponsive and all you hear is an ominous,... Read more
EtreCheck 3.4.2 - For troubleshooting yo...
EtreCheck is an app that displays the important details of your system configuration and allow you to copy that information to the Clipboard. It is meant to be used with Apple Support Communities to... Read more
Hopper Disassembler 4.2.10- - Binary dis...
Hopper Disassembler is a binary disassembler, decompiler, and debugger for 32- and 64-bit executables. It will let you disassemble any binary you want, and provide you all the information about its... Read more

Latest Forum Discussions

See All

Eden: Renaissance (Games)
Eden: Renaissance 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Eden: Renaissance is a thrilling turn-based puzzle adventure set in a luxurious world, offering a deep and moving... | Read more »
Glyph Quest Chronicles guide - how to ma...
Glyph Quest returns with a new free-to-play game, Glyph Quest Chronicles. Chronicles offers up more of the light-hearted, good humored fantasy fun that previous games featured, but with a few more refined tricks up its sleeve. It's a clever mix of... | Read more »
Catch yourself a Lugia and Articuno in P...
Pokémon Go Fest may have been a bit of a disaster, with Niantic offering fans full refunds and $100 worth of in-game curency to apologize for the failed event, but that hasn't ruined trainers' chances of catching new legendary Pokémon. Lugia nad... | Read more »
The best deals on the App Store this wee...
There are quite a few truly superb games on sale on the App Store this week. If you haven't played some of these, many of which are true classics, now's the time to jump on the bandwagon. Here are the deals you need to know about. [Read more] | Read more »
Realpolitiks Mobile (Games)
Realpolitiks Mobile 1.0 Device: iOS Universal Category: Games Price: $5.99, Version: 1.0 (iTunes) Description: PLEASE NOTE: The game might not work properly on discontinued 1GB of RAM devices (iPhone 5s, iPhone 6, iPhone 6 Plus, iPad... | Read more »
Layton’s Mystery Journey (Games)
Layton’s Mystery Journey 1.0.0 Device: iOS Universal Category: Games Price: $15.99, Version: 1.0.0 (iTunes) Description: THE MUCH-LOVED LAYTON SERIES IS BACK WITH A 10TH ANNIVERSARY INSTALLMENT! Developed by LEVEL-5, LAYTON’S... | Read more »
Full Throttle Remastered (Games)
Full Throttle Remastered 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Originally released by LucasArts in 1995, Full Throttle is a classic graphic adventure game from industry legend Tim... | Read more »
Stunning shooter Morphite gets a new tra...
Morphite is officially landing on iOS in September. The game looks like the space shooter we've been needing on mobile, and we're going to see if it fits the bill quite shortly. The game's a collaborative effort between Blowfish Studios, We're Five... | Read more »
Layton's Mystery Journey arrives to...
As you might recall, Layton's Mystery Journey is headed to iOS and Android -- tomorrow! To celebrate the impending launch, Level-5's released a new trailer, complete with an adorable hamster. [Read more] | Read more »
Sidewords (Games)
Sidewords 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Grab a cup of coffee and relax with Sidewords. Sidewords is part logic puzzle, part word game, all original. No timers. No... | Read more »

Price Scanner via MacPrices.net

Apple Move Away from White Label Event Apps C...
DoubleDutch, Inc., a global provider of Live Engagement Marketing (LEM) solutions, has made a statement in the light of a game-changing announcement from Apple at this year’s WWDC conference.... Read more
70 Year Old Artist Creates Art Tools for the...
New Hampshire-based developer Pirate’s Moon has announced MyArtTools 1.1.3, the update to their precision drawing app, designed by artist Richard Hoeper exclusively for use with the 12.9-inch iPad... Read more
Sale! New 2017 13-inch 2.3GHz MacBook Pros fo...
Amazon has new 2017 13″ 2.3GHz/128GB MacBook Pros on sale today for $150 off MSRP including free shipping. Their prices are the lowest available for these models from any reseller: – 13″ 2.3GHz/128GB... Read more
13″ 2.3GHz/128GB Space Gray MacBook Pro on sa...
MacMall has the 13″ 2.3GHz/128GB Space Gray MacBook Pro (MPXQ2LL/A) on sale for $1219 including free shipping. Their price is $80 off MSRP. Read more
Clearance 2016 12-inch Retina MacBooks, Apple...
Apple recently dropped prices on Certified Refurbished 2016 12″ Retina MacBooks, with models now available starting at $1019. Apple will include a standard one-year warranty with each MacBook, and... Read more
Save or Share
FotoJet Designer, is a simple but powerful new graphic design apps available on both Mac and Windows. With FotoJet Designer’s 900+ templates, thousands of resources, and powerful editing tools you... Read more
Logo Maker Shop iOS App Lets Businesses Get C...
A newly released app is designed to help business owners to get creative with their branding by designing their own logos. With more than 1,000 editable templates, Logo Maker Shop 1.0 provides the... Read more
Sale! New 15-inch MacBook Pros for up to $150...
Amazon has the new 2017 15″ MacBook Pros on sale for up to $150 off MSRP including free shipping: – 15″ 2.8GHz MacBook Pro Space Gray: $2249 $150 off MSRP – 15″ 2.89Hz MacBook Pro Space Gray: $2779 $... Read more
DEVONthink To Go 2.1.7 For iOS Brings Usabili...
DEVONtechnologies has updated DEVONthink To Go, the iOS companion to DEVONthink for Mac, with enhancements and bug fixes. Version 2.1.7 adds an option to clear the Global Inbox and makes the grid... Read more
15-inch 2.2GHz Retina MacBook Pro, Apple refu...
Apple has Certified Refurbished 2015 15″ 2.2GHz Retina MacBook Pros available for $1699. That’s $300 off MSRP, and it’s the lowest price available for a 15″ MacBook Pro. An Apple one-year warranty is... Read more

Jobs Board

*Apple* Solutions Consultant (ASC) - Poole -...
Job Summary The people here at Apple don't just create products - they create the kind of wonder that's revolutionised entire industries. It's the diversity of those Read more
SW Engineer *Apple* TV - Apple Inc. (United...
Changing the world is all in a day's work at Apple . If you love innovation, here's your chance to make a career of it. You'll work hard. But the job comes with more Read more
Frameworks Engineering Manager, *Apple* Wat...
Frameworks Engineering Manager, Apple Watch Job Number: 41632321 Santa Clara Valley, California, United States Posted: Jun. 15, 2017 Weekly Hours: 40.00 Job Summary Read more
Product Manager - *Apple* Pay on the *Appl...
Job Summary Apple is looking for a talented product manager to drive the expansion of Apple Pay on the Apple Online Store. This position includes a unique Read more
*Apple* Retail - Multiple Positions - Apple...
SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.