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

MacFamilyTree 8.1.3 - Create and explore...
MacFamilyTree gives genealogy a facelift: modern, interactive, convenient and fast. Explore your family tree and your family history in a way generations of chroniclers before you would have loved.... Read more
WhiteCap 6.6 - Visual plug-in for iTunes...
WhiteCap is a sleek and sophisticated music visualizer and screensaver that features futuristic, wireframe mesh visuals with dynamic backgrounds and colors. WhiteCap contains thousands of visual... Read more
VOX 2.8.14 - Music player that supports...
VOX just sounds better! The beauty is in its simplicity, yet behind the minimal exterior lies a powerful music player with a ton of features and support for all audio formats you should ever need.... Read more
Paparazzi! 1.0b2 - Make user-defined siz...
Paparazzi! is a small utility for OS X that makes screenshots of webpages. This very simple tool takes screenshots of websites which do not fit on one screen. You specify the desired width, minimal... Read more
Carbon Copy Cloner 4.1.13 - 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
TrailRunner 3.8.832 - Route planning for...
TrailRunner is the perfect companion for runners, bikers, hikers, and all people wandering under the sky. Plan routes on a geographical map. Import GPS or workout recordings and journalize your... Read more
VueScan 9.5.65 - 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
Adobe Illustrator CC 2017 21.0.2 - Profe...
Illustrator CC 2017 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Illustrator customer). Adobe Illustrator CC 2017 is the industry... Read more
iDefrag 5.1.7 - Disk defragmentation and...
iDefrag helps defragment and optimize your disk for improved performance. Features include: Supports HFS and HFS+ (Mac OS Extended). Supports case sensitive and journaled filesystems. Supports... Read more
Quicken 4.4.2 - Complete personal financ...
Quicken makes managing your money easier than ever. Whether paying bills, upgrading from Windows, enjoying more reliable downloads, or getting expert product help, Quicken's new and improved features... Read more

5 dastardly difficult roguelikes like th...
Edmund McMillen's popular roguelike creation The Binding of Isaac: Rebirth has finally crawled onto mobile devices. It's a grotesque dual-stick shooter that tosses you into an endless, procedurally generated basement as you, the pitiable Isaac,... | Read more »
Last week on PocketGamer
Welcome to a weekly feature looking back on the past seven days of coverage on our sister website, PocketGamer. It’s taken a while for 2017 to really get going, at least when it comes to the world of portable gaming. Thank goodness, then, for... | Read more »
ROME: Total War - Barbarian Invasion set...
To the delight of mobile strategy fans, Feral Interactive released ROME: Total War just a few months ago. Now the game's expansion, Barbarian Invasion is marching onto iPads as a standalone release. [Read more] | Read more »
Yuri (Games)
Yuri 1.0 Device: iOS iPhone Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: It's night. Yuri opens his eyes. He wakes up in a strange forest.The small, courageous explorer rides on his bed on casters in this... | Read more »
Space schmup Xenoraid launches on the Ap...
10Tons Xenoraid is out today on the App Store, bringing some high-speed space action to your mobile gadgets just in time for the weekend. The company's last premium title, another sci-fi game titled Neon Chrome, did quite well for itself, so... | Read more »
Star Wars: Force Arena Beginner's G...
Star Wars: Force Arena joined the populous ranks of Star Wars games on mobile today. It's a two-lane MOBA starring many familiar faces from George Lucas's famed sci-fi franchise. As with most games of this nature, Force Arena can be a little obtuse... | Read more »
Mysterium: The Board Game (Games)
Mysterium: The Board Game 1.0 Device: iOS Universal Category: Games Price: $6.99, Version: 1.0 (iTunes) Description: The official adaptation of the famous board game Mysterium! | Read more »
Sonny (Games)
Sonny 1.0.4 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0.4 (iTunes) Description: Reimagined for iOS, cult-hit RPG Sonny brings challenging turn-based combat that requires strategy and mastery of each new skill to... | Read more »
Towaga (Games)
Towaga 1.0 Device: iOS iPhone Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: "It has been foretold that a masked being would stand atop the legendary Towaga Temple, dwelling among shadows to fulfil The Black Moon... | Read more »
Bubble Witch 3 Saga Guide: How to get th...
King's bringing its fairytale bubble-popping puzzler back for its 3rd outing in Bubble Witch 3 Saga. If you're familiar with the series, not much has changed here on the surface level, though you'll likely be pleased with the improvements. If you'... | Read more »

Price Scanner via MacPrices.net

New 2016 13-inch MacBook Pros on sale for up...
B&H Photo has the new 2016 13″ MacBook Pros in stock today and on sale for up to $150 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 2.9GHz/512GB Touch Bar MacBook Pro... Read more
New 15-inch Touch Bar MacBook Pros in stock a...
B&H Photo has the new 2016 15″ Apple Touch Bar MacBook Pros in stock today and on sale for up to $150 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 15″ 2.7GHz Touch Bar... Read more
Opera Announces Neon Concept Browser For Mac
Opera is inviting users to get a glimpse of what Opera for computers could become with its Opera Neon browser concept. Each Opera Neon feature is described as “an alternate reality” for the Opera... Read more
Tellini Releases TabView 3.0 Missing Tool fo...
Tellini has announced the release of TabView 3.0. TabView has been the first macOS viewer for PowerTab tablatures. PowerTab is a well-known and widely adopted tablature editor for Windows systems and... Read more
13-inch 1.6GHz/128GB MacBook Air on sale for...
Overstock.com has the 1.6GHz/128GB 13″ MacBook Air on sale for $130 off MSRP including free shipping: - 13″ 1.6GHz/128GB MacBook Air (MMGF2LL/A): $869.99 $130 off MSRP Their price is the lowest... Read more
12-inch 32GB Space Gray iPad Pro on sale for...
B&H Photo has 12″ Space Gray 32GB WiFi Apple iPad Pros on sale for $55 off MSRP including free shipping. B&H charges sales tax in NY only: - 12″ Space Gray 32GB WiFi iPad Pro: $744.44 $55 off... Read more
9-inch 32GB Space Gray iPad Pro on sale for $...
B&H Photo has the 9.7″ 32GB Space Gray Apple iPad Pro on sale for $549 for a limited time. Shipping is free, and B&H charges NY sales tax only. Read more
Apple iMacs on sale for up to $120 off MSRP,...
B&H Photo has 21″ and 27″ Apple iMacs on sale for up to $120 off MSRP, each including free shipping plus NY sales tax only: - 27″ 3.3GHz iMac 5K: $2199 $100 off MSRP - 27″ 3.2GHz/1TB Fusion iMac... Read more
Apple refurbished Apple TVs available for up...
Apple has Certified Refurbished 32GB and 64GB Apple TVs available for up to $30 off the cost of new models. Apple’s standard one-year warranty is included with each model, and shipping is free: -... Read more
1.4GHz Mac mini, refurbished, available for $...
The Apple Store has Apple Certified Refurbished 1.4GHz Mac minis available for $419. Apple’s one-year warranty is included, and shipping is free. Their price is $80 off MSRP, and it’s the lowest... Read more

Jobs Board

*Apple* & PC Desktop Support Technician...
Apple & PC Desktop Support Technician job in Stamford, CT We have immediate job openings for several Desktop Support Technicians with one of our most well-known Read more
*Apple* macOS Systems Integration Administra...
…most exceptional support available in the industry. SCI is seeking an Junior Apple macOS systems integration administrator that will be responsible for providing Read more
*Apple* Premier Retailer - Service Technicia...
DescriptionSimply Mac is the largest premier retailer for Apple products and solutions. At Simply Mac we are all Apple , all the time. Same products. Same prices. Read more
*Apple* Premier Retailer - Service Technicia...
DescriptionSimply Mac is the largest premier retailer for Apple products and solutions. At Simply Mac we are all Apple , all the time. Same products. Same prices. Read more
*Apple* Premier Retailer - Service Manager -...
DescriptionSimply Mac is the largest premier retailer for Apple products and solutions. At Simply Mac we are all Apple , all the time. Same products. Same prices. Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.