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

BusyContacts 1.6.4 - Fast, efficient con...
BusyContacts is a contact manager for OS X that makes creating, finding, and managing contacts faster and more efficient. It brings to contact management the same power, flexibility, and sharing... Read more
Steam 4.0 - Multiplayer and communicatio...
Steam is a digital distribution, digital rights management, multiplayer and communications platform developed by Valve Corporation. It is used to distribute a large number of games and related media... Read more
OmniGraffle Pro 7.19.3 - Create diagrams...
OmniGraffle Pro helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use... Read more
OmniGraffle 7.19.3 - Create diagrams, fl...
OmniGraffle helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use Graffle to... Read more
Hopper Disassembler 5.3.3- - Binary disa...
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
calibre 5.35.0 - Complete e-book library...
Calibre is a complete e-book library manager. Organize your collection, convert your books to multiple formats, and sync with all of your devices. Let Calibre be your multi-tasking digital librarian... Read more
Sound Studio 4.10.0 - Robust audio recor...
Sound Studio lets you easily record and professionally edit audio on your Mac. Easily rip vinyls and digitize cassette tapes, or record lectures and voice memos. Prepare for live shows with live... Read more
Sparkle Pro 4.0 - Visual website creator...
Sparkle Pro will change your mind if you thought building websites wasn't for you. Sparkle is the intuitive site builder that lets you create sites for your online portfolio, team or band pages, or... Read more
Dropbox 140.4.1951 - Cloud backup and sy...
Dropbox for Mac is a file hosting service that provides cloud storage, file synchronization, personal cloud, and client software. It is a modern workspace that allows you to get to all of your files... Read more
FotoMagico 6.0.5 - Powerful slideshow cr...
FotoMagico lets you create professional slideshows from your photos and music with just a few, simple mouse clicks. It sports a very clean and intuitive yet powerful user interface. High image... Read more

Latest Forum Discussions

See All

Best iPhone Game Updates: ‘Garena Free F...
Hello everyone, and welcome to the week! It’s time once again for our look back at the noteworthy updates of the last seven days. I got busted last week for not including the obligatory free-to-play matching puzzle game update of the week, and my... | Read more »
‘Horizon Chase’ China Spirit DLC Release...
Following the release of the excellent reveal of the Horizon Chase Senna Forever expansion, the game will be getting a new DLC on mobile platforms today. Today, the Horizon Chase China Spirit DLC pack will release on iOS and Android bringing in 9... | Read more »
‘PUZZLED’ from SNK and Hamster Is Out No...
Following ZED BLADE ACA NeoGeo earlier this month, SNK has brought over another game in the ACA NeoGeo series to both iOS and Android in the form of PUZZLED. SNK and Hamster originally brought the series to mobile with Samurai Shodown IV, Alpha... | Read more »
A House Full of Covid – The TouchArcade...
It’s been a rough week as both of our young children tested positive for Covid, and since recording this early on Friday my wife has tested positive now too. Thankfully the kids seemed to recover fairly quickly and are mostly back to normal, and I... | Read more »
TouchArcade Game of the Week: ‘Krispee S...
Krispee Street is a new hidden object game from Frosty Pop that is based on their popular and almost painfully sweet webcomic Krispee. This is one of the latest titles to be added to the Netflix Games catalog, which means you’ll need to log into... | Read more »
SwitchArcade Round-Up: ‘Escape Lala’, ‘B...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for January 21st, 2022. In today’s article, we’ve got a lot of new releases. A lot. There were eight on the schedule when I went to bed last night. There were twenty-four when I woke up... | Read more »
Beta Testers Needed for Huge Version 2.0...
Ya’ll remember Dungeon Raid, right? The phenomenal matching RPG hybrid that launched on mobile more than a decade ago, but was more or less abandoned by its developer only to die a slow death on the App Store before the 32-bit Appocalypse finally... | Read more »
‘Ark Legends’ Gives Players a Chance to...
It’s Airpods and Amazon gift cards galore as Melting Games opens pre-registration for Ark Legends. The upcoming mobile RPG is giving away tons of in-game goodies such as gold, energy, iron core, hero summon chest and rare iron core to players who... | Read more »
‘Nickelodeon Extreme Tennis’ Out Now on...
Nickelodeon Extreme Tennis () from Old Skull Games and Nickelodeon is this week’s new Apple Arcade release. Nickelodeon Extreme Tennis features characters from old and new Nickelodeon shows including SpongeBob, TMNT, and many more. The tennis game... | Read more »
SwitchArcade Round-Up: ‘RPGolf Legends’,...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for January 20th, 2022. In today’s article, we’ve got a massive amount of new releases to check out. We’ve got summaries of all of them, from heaven to hell. We also have the lists of... | Read more »

Price Scanner via MacPrices.net

Verizon’s 2022 iPad promo: $100-$310 off any...
Verizon has cellular-capable iPads on sale for $100-$310 off MSRP when purchased with an Unlimited service plan. Sale price is applied to your account monthly over a 24 or 30 month period, depending... Read more
Sunday Sale: Apple AirPods are on sale for up...
Amazon has Apple AirPods on sale for $10-$100 off MSRP today, depending on the model. All are in stock today with free delivery: – AirPods Max headphones (Blue): $449 $100 off MSRP – AirPods Max... Read more
These Apple resellers are offering 13″ M1 Mac...
Apple resellers are offering discounts on 13″ MacBook Pros with M1 Apple Silicon processors ranging up to $150 off MSRP. Here’s where to get one today: (1): Apple’s 13″ MacBook Pros with M1 Apple... Read more
Amazon lowers prices on select 13″ M1 MacBook...
Amazon has select Apple 13″ M1 MacBook Airs on sale for $150 off MSRP this weekend, starting at only $849. Their prices are the lowest available for new MacBook Airs today. Stock may come and go, so... Read more
Apple has 13″ M1 MacBook Airs back in stock s...
Apple has restocked a full line of 13″ M1 MacBook Airs, Certified Refurbished, starting at only $849 and up to $190 off original MSRP. These are the cheapest M1-powered MacBooks for sale today at... Read more
In stock and on sale! 16″ 10-Core M1 Pro MacB...
Amazon has new 16″ 10-Core/512GB M1 Pro MacBook Pros in stock today and on sale for $50 off MSRP including free shipping. Their prices are the lowest available for new M1 Pro 16″ MacBook Pro from any... Read more
Deal Alert!: 14″ M1 Pro with 10-Core CPU in s...
Amazon has the new 14″ M1 Pro MacBook Pro with a 10-Core CPU and 16-Core GPU in stock today and on sale for $2299.99 including free shipping. Their price is $200 off Apple’s standard MSRP, and it’s... Read more
Apple has 24-inch M1 iMacs (8-Core CPU/8-Core...
Apple has restocked a wide array of 24-inch M1 iMacs with 8-Core CPUs and 8-Core GPUs in their Certified Refurbished store. Models are available starting at only $1269 and range up to $260 off... Read more
Select 24″ M1 iMacs are on sale for $100 off...
Sales of Apple’s new 24″ M1 iMacs have been rare since its introduction, perhaps due to global supply issues. However, B&H is offering a $100 discount on select 24″ iMacs, and they’re in stock... Read more
M1 Mac minis are back in stock today at Apple...
Apple has M1-powered Mac minis available in their Certified Refurbished section starting at only $589 and up to $140 off MSRP. Each mini comes with Apple’s one-year warranty, and shipping is free: –... Read more

Jobs Board

Registered Nurse (RN) Employee Health PSJH -...
…is calling for a Registered Nurse (RN) Employee Health PSJH to our location in Apple Valley, CA.** We are seeking a Registered Nurse (RN) Employee Health PSJH to be Read more
Systems Administrator - Pearson (United State...
…and troubleshoot Windows operating systems (workstation and server), laptop computers, Apple iPads, Chromebooks and printers** + **Administer and troubleshoot all Read more
IT Assistant Level 1- IT Desktop Support Anal...
…providing tier-1 or better IT help desk support in a large Windows and Apple environment * Experience using IT Service Desk Management Software * Knowledge of IT Read more
Human Resources Business Partner PSJH - Provi...
…**is calling a** **Human Resources Business Partner, PSJH** **to our location in Apple Valley, CA.** **Applicants that meet qualifications will receive a text with Read more
Manager Community Health Investment Programs...
…is calling a Manager Community Health Investment Programs PSJH to our location in Apple Valley, CA.** **Qualified candidates will be invited to do a self-paced video Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.