TweetFollow Us on Twitter

Dec 95 Top 10
Volume Number:11
Issue Number:12
Column Tag:Symantec Top 10

Symantec Top 10

This monthly column, written by Symantec’s Technical Support Engineers, aims to provide you with technical information based on the use of Symantec products.

By Craig Conner

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

This month, we are going to answer some questions about using the TCL class CStyleText with Visual Architect. A project demonstrating CStyleText is available on either CompuServe or America Online, or on ftp.devtools.symantec.com.

Q: How do I create a CStyleText pane in Visual Architect?

A: Since this class does not appear in the VA Base Class popup in the Classes dialog you cannot override it in the standard way. You can, however, create a class based on CEditText and use CStyleText as a Library Class.

To review how library classes work: Usually, VA produces x_class classes derived from the class specified in the Base Class popup menu. When you use a Library Class, VA bases the x_class on the library class and assumes the library class is derived from the base class.

Creating a class in this fashion causes VA to generate an x_class derived from CStyleText, which in turn is based on CEditText, so everything is right with the world. You can then assign this class to a panorama created with the normal panorama tool, not the EditText-like tool, which is actually a CDialogText pane.

Note: For the rest of this article, I will refer to this view with the name TextPane (real original, huh?) and the class as CStyledTextEditPano, for short. I also call the document class CStyledDoc, and the application class CStyleApp.

Q: I have problems aligning the pane into the window correctly. What is the best way to set this up?

A: The easy way to set up a pane or panorama to completely cover a window is to adjust the bounds using the edit boxes. You will want to overlap the pane one pixel on each side. For example, when I look in the View Info dialog for my project, it lists the Width as 471 and Height as 443. So my CStyleText panorama is positioned at (-1, -1), and has a Width of 473 and a Height of 445.

Q: How do I set up the Font, Style and Size menus?

A: The Add Menu popup for the Menu Bar dialog box contains pre-created Font, Size and Style menus. Add these menus to the current menu bar. The Style menu has commands associated with each menu item, so TCL will take care of changing styles for the current selection. Both the default Font and Size menus are empty, so we will have to add items programmatically.

To add items we must override CApplication::SetUpMenus(), and then we revert to standard Macintosh Toolbox practices to add items. For example:

 void CStyleApp::SetUpMenus()
{
    // To handle standard initialization.
 CApplication::SetUpMenus();

    // Add the system fonts the standard way
 AddResMenu(GetMHandle(MENUfont), 'FONT');

 MenuHandle sizeMenuH = GetMHandle(MENUsize);

    // I’ve got other things planned, so we might as well 
    // account for that possibility now
 short numItems = CountMItems(sizeMenuH);

 InsMenuItem(sizeMenuH, "\p9", numItems + 1);
 
    // Similarly for other sizes...

    // Now deal with keeping items highlighted and uncheck all items   
    // when Update menus called for ease of dealing with at that time.
 gBartender -> SetDimOption(MENUfont, dimNone);
 gBartender -> SetUnchecking(MENUfont, TRUE);

    // do the same for MENUsize and MENUstyle...
}

These Font and Style menus do not have commands
associated with them because of the generic way TCL handles font and size changes. Look in CAbstractText::DoCommand() and CTextStyleTask::Do() for more information.

Having added and configured the menus, we now have to handle checking the correct menu item when the menus are displayed. We do this in the CStyledDoc::UpdateMenus(), like so:

CStyledDoc::UpdateMenus()
{
 short whichAttributes = doFont | doSize | doFace;
 TextStyle theStyle;
 Str255 itemString;
 short fontNumber;
 long fontSize;
 short count;
 
 inherited::UpdateMenus();
 
 MenuHandle fontMenu = GetMHandle(MENUfont);
 count = CountMItems(fontMenu);
 
 for (int n = 1; n <= count; n++)
 {
 GetItem(fontMenu, n, itemString);
 GetFNum(itemString, &fontNumber);
 
 if(fontNumber == theStyle.tsFont)
 CheckItem(fontMenu, n, TRUE);
 }

 
 MenuHandle sizeMenu = GetMHandle(MENUsize);
 count = CountMItems(sizeMenu);
 
 for (n = 3; n <= count; n++)
 {
 GetItem(sizeMenu, n, itemString);
 StringToNum(itemString, &fontSize);
 
 if(fontSize == theStyle.tsSize)
 CheckItem(sizeMenu, n, TRUE);
 }

    // handle easy case first
 if (theStyle.tsFace == normal)
 gBartender->CheckMarkCmd(cmdPlain, TRUE);
 else
 {
    // Turn on the correct ones
 if(theStyle.tsFace & bold)
 gBartender->CheckMarkCmd(cmdBold, TRUE);
 
    // similarly for italic, underline, etc.
 } 
}

Q: What happens if I want to use a different font size than what is in the menu?

A. Well, we can add an Other menu item to the Size menu in VA, and for correctness there should be a line between this item and the font sizes, so add one of those too. These need to be at the top of the menu, so TCL does not lose track of where it is in the menu. (All items with commands need to appear in menus before items without commands associated with them.)

Create a modal dialog view that has a DialogText item in it, so we can have the user enter the size. The item should be set to be of type CIntegerText. You should also set a range in the Pane Info dialog under CIntegerText, for example from 4 to 256. Also check the showRangeOnErr checkbox to inform the user if they make a mistake. (It’s the Macintosh Way.)

Now to complete the VA part of this, create a cmdOtherSize and associate it with the Other menu item. Have the command generate code to open the newly created dialog in the CStyleText derived class.

Next, we have to add code to handle the size change. We add this to an override of ProviderChanged() in CStyledTextEditPano:

 if(reason == kFontSizeDialogEnding)
 {
 long size;
 size = ((CFontSizeDialogData *)info)
  -> fPointSizeDialog_PointSizeEditText;
 
    // To fake out the CStyleText operations and handle a 
    // non-menu item size, we throw a new item into the menu and
    // call the command, then delete menu item
 long theCmd = (MENUsize << 16) + 3;
 Str255 string;
 
 NumToString(size, string);
 gBartender->InsertMenuCmd
 (theCmd, string, MENUsize, 2);
 
    // negate the command, so TCL knows it does not have an
    // associated command and send it.
 DoCommand(-theCmd);

 gBartender->RemoveMenuCmd(theCmd);
 }
 else
 inherited::ProviderChanged(aProvider,reason,info);

Q: After generating and compiling, why isn’t the cursor in the pane when I open a view?

A: Currently, the gopher is assigned to theMainPane of the window. To associate the gopher with the style text pane, we can re-assign it:

       
       itsGopher = fTextPane_StyleTextPano;

Do this at the end of CStyleDoc::ContentsToWindow().

Q: How do I save and read in a styled text document?

A: Saving a styled text document requires saving the text, and saving the style of that text. An easy way to do this is to use the CSimpleSaver class. In VA, make CSimpleSaver a library class for CStyledDoc. You will also need to override ReadContents() and WriteContents() (they can have empty bodies) in CStyledDoc to complete the class definition.

You can save the text using the CDataFile object member of CStyledDoc, itsFile. To save the style of the text, we need to save it into a 'styl' resource with the ID number 128. This is the standard location for style information. To save into the resource you can create a CResFile object.

Add something like this to

CStyledDoc::ContentsToWindow():

 if(itsFile)
 {
    // Deal with the text first
 Handle text = 
 fTextPane_StyleTextPano->GetTextHandle();
 ((CDataFile *)itsFile)->WriteAll(text);
 
    // And now deal with the style info
 FSSpec theSpec;

 itsFile->GetFSSpec(&theSpec);
 
 CResFile theResFile;
 
 theResFile.SpecifyFSSpec(&theSpec);

 if(!theResFile.HasResFork())
 theResFile.CreateNew('ttxt','TEXT');

 theResFile.Open(fsRdWrPerm);
 
 Handle theStyle, newStyle;
 
 theStyle = GetResource('styl', 128);
 
    // as per IM:Text p. 2-52 with a little TCL thrown in
 long savedStart, savedEnd;

 fTextPane_StyleTextPano->
 GetSelection(&savedStart, &savedEnd);
 
 (*fTextPane_StyleTextPano->macTE)->selStart = 0;
 (*fTextPane_StyleTextPano->macTE)->selEnd = 
 fTextPane_StyleTextPano->GetLength();
 
 newStyle = (Handle)fTextPane_StyleTextPano ->
 GetTheStyleScrap();
 
 (*fTextPane_StyleTextPano->macTE)->selStart =
 savedStart;
 (*fTextPane_StyleTextPano->macTE)->selEnd =
 savedEnd;
 
 HLock(theStyle);
 HLock(newStyle);
 
 if(theStyle)
 {
 long len = GetHandleSize(newStyle);
 
 SetHandleSize(theStyle, len);

 BlockMove(*newStyle, *theStyle, len);
 
 ChangedResource((Handle)theStyle);
 WriteResource(theStyle);
 }
 else
 {
 AddResource(
 newStyle , 'styl', 128, "\ptext style"
 );
 WriteResource(newStyle);
 }

 HUnlock(theStyle);
 HUnlock(newStyle);
 
 theResFile.Update();
 }

Reading in a styled text document is basically the reverse of this, and left as an exercise for the reader.

Q: Why does the application crash when I try to open a currently open document?

A: In x_CStyledDoc::FailOpen(), you will see that it calls Failure() if the file is already open. You will want to override FailOpen() to open a dialog or otherwise handle the situation.

Q: How do I get the document to print?

A: TCL has code to handle this for you. Make sure you have the Print checkbox checked in the View Info dialog for the main window.

Q: When I print, why does it cut lines in half at the bottom of the page?

A: You have the fixedLineHeights checkbox checked in the Pane Info for the StyledText panorama. (I did not tell you to turn it off earlier because I would then have only nine questions.) Uncheck that and TCL will handle printing styled text correctly.

Q: When there is no current selection, changing the Font, Size, or Style menus do not affect what I type next. Why not?

A: TCL relies on the style of the current selection to set the menus when that information is needed. To change this behavior we need to create a data member of type TextStyle for our CStyledTextEditPano to save the menu choices. I called it theStyle. Then we need to save this information:

void CStyledTextEditPano::
 DoKeyDown(
 char theChar, Byte keyCode, EventRecord *macEvent
 )
{
 long selStart, selEnd;
 
 CStyleText::GetSelection(&selStart,&selEnd);
 
// The case we want to change behavior of
 if(selStart == selEnd)
 {
 short whichAttributes = doFont | doSize | doFace;
 GetTextStyle(&whichAttributes, &theStyle);
 }
 
 inherited::DoKeyDown(theChar, keyCode, macEvent);
}

and restore the correct style:

void CStyledTextEditPano::TypeChar(
 char theChar, short theModifers
)
{
 short whichAttributes = doFont | doSize | doFace;
 
 TESetStyle(
 whichAttributes, &theStyle, FALSE, macTE
 );
 
 inherited::TypeChar(theChar, theModifers);
}

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Adobe Premiere Pro 2022 23.1 - Digital v...
Adobe Premiere Pro is available as part of Adobe Creative Cloud for as little as $54.99/month. The price on display is a price for annual by-monthly plan for Adobe Premiere Pro only. Adobe Premiere... Read more
1Password 8.9.10 - Powerful password man...
1Password is a password manager that uniquely brings you both security and convenience. It is the only program that provides anti-phishing protection and goes beyond password management by adding Web... Read more
FotoMagico 6.3 - Powerful slideshow crea...
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
Affinity Photo 1.10.6 - Digital editing...
Affinity Photo - redefines the boundaries for professional photo editing software for the Mac. With a meticulous focus on workflow it offers sophisticated tools for enhancing, editing and retouching... Read more
Vivaldi 5.5.2805.50 - An advanced browse...
Vivaldi is a browser for our friends. We live in our browsers. Choose one that has the features you need, a style that fits and values you can stand by. From the look and feel, to how you interact... Read more
Fantastical 3.7.4 - Create calendar even...
Fantastical is the Mac calendar you'll actually enjoy using. Creating an event with Fantastical is quick, easy, and fun: Open Fantastical with a single click or keystroke Type in your event details... Read more
Adobe Illustrator 2022 27.1 - Profession...
You can download Adobe Illustrator as a part of Creative Cloud for only $20.99/month. Adobe Illustrator is the vector graphics classics in the design industry. It is a digital environment that allows... Read more
Acorn 7.3.1 - Bitmap image editor.
Acorn is a new image editor built with one goal in mind - simplicity. Fast, easy, and fluid, Acorn provides the options you'll need without any overhead. Acorn feels right, and won't drain your bank... Read more
Apple Configurator 2.16 - Configure and...
Apple Configurator makes it easy to deploy iPad, iPhone, iPod touch, and Apple TV devices in your school or business. Use Apple Configurator to quickly configure large numbers of devices connected to... Read more
Bookends 14.1.5 - Reference management a...
Bookends is a full-featured bibliography/reference and information-management system for students and professionals. Bookends uses the cloud to sync reference libraries on all the Macs you use.... Read more

Latest Forum Discussions

See All

Alchemy Stars celebrates 1 and a half ye...
It has been one and a half years since Alchemy Stars launched, and Level Infinite is celebrating in style with a host of new content. There will be a new story mission and even a store to explore, and a whole new mode for those budding idol... | Read more »
Fighting Game ‘Art of Fighting 2’ ACA Ne...
Last week, side-scrolling shooter Pulstar hit mobile platforms as the newest ACA NeoGeo series release from Hamster and SNK. Read Shaun’s review of it here. Today, fighting game Art of Fighting 2 has launched on iOS and Android. Art of Fighting 2... | Read more »
‘Genshin Impact’ Version 3.3 Update Now...
HoYoverse recently revealed the next major update for Genshin Impact (Free) in the form of version 3.3 ‘All Senses Clear, All Existence Void’. | Read more »
SwitchArcade Round-Up: Reviews Featuring...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for December 6th, 2022. In today’s article, we’ve got three more reviews. Siralim Ultimate, Astronite, and Swordship get evaluated and scored today. All interesting in their own ways,... | Read more »
‘Pulstar ACA NEOGEO’ Review – Kiss Your...
As I’ve said more than a few times in the past, the NEOGEO was generally known for a couple of genres more than anything else. Fighting games, of course. And thanks to Metal Slug and to a lesser extent Shock Troopers, it’s also known for run-and-gun... | Read more »
‘The Witcher: Monster Slayer’ Shutting D...
Location-based AR game The Witcher: Monster Slayer (Free) from CD Projekt Red’s in-house studio Spokko Games has been getting updated quite often following its launch on iOS and Android. These updates include new challenges, monster types, stamps,... | Read more »
Get Your Hands on the Power Cosmic in th...
To me, my board! As discussed in our story about the last update to the excellent card battler Marvel Snap (Free), the latest season of the game is called The Power Cosmic. | Read more »
HoYoverses announces inaugral art exhibi...
If you are lucky enough to be in the Paris area in early January, then you should pop to the Galerie Joseph and enjoy a look at the world of HoYoverses’ global smash hit, Genshin Impact. There will be unreleased concept art and a deep dive into... | Read more »
SwitchArcade Round-Up: Reviews Featuring...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for December 5th, 2022. In today’s article, we’ve got a few reviews for you. Square Enix’s Romancing SaGa -Minstrel Song- Remastered, Forever Entertainment’s Front Mission 1st: Remake,... | Read more »
Best iPhone Game Updates: ‘Fire Emblem H...
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. Oh yes, here come the Christmas updates. Quite a lot of the games featured today are doing the holiday thing, with only... | Read more »

Price Scanner via MacPrices.net

Christmas sale at Verizon: Apple AirPods Pro...
Verizon has first-generation Apple AirPods Pro on sale for $159.99 on their online store as part of their continuing Christmas/Holiday sale. Their price is $90 off Apple’s original MSRP, and it’s the... Read more
New Christmas/New Years promo at Xfinity Mobi...
Switch to Xfinity Mobile and open a new line of service, and take $400 off the price of a new iPhone, no trade-in required, through January 10, 2023. The $400 is applied to your account as credits... Read more
Apple iPad Smart Keyboard Folio prices drop u...
Apple iPad Smart Keyboard Folio prices have dropped up to $60 off MSRP at Amazon and Walmart as part of their Christmas/Holiday sales. These are the cheapest prices currently available for these iPad... Read more
Today is the final day for Xfinity Mobile’s $...
If you switch to Xfinity Mobile and open a new line of service, they will take $500 off the price of a new iPhone, no trade-in required. This is the best no trade-in Cyber Monday Apple iPhone 14 deal... Read more
Amazon restocks 10.2″ 64GB 9th-generation iPa...
Amazon has Apple’s 9th generation 10.2″ 64GB WiFi iPads (Silver) in stock and on sale for $269.99 shipped as part of their Christmas/Holiday Sale. Their price is $60 off Apple’s MSRP. Free delivery... Read more
Week’s Best Apple MacBook Air Christmas Sales...
Apple retailers have posted their most-recent Christmas Holiday sale prices on 13″ MacBook Airs. Take up to $150 off MSRP on M2-powered Airs with these sales with prices starting at only $1049. Free... Read more
Open-box 13″ M2 MacBook Pros available for $3...
QuickShip Electronics has open-box return 13″ M2 MacBook Pros in stock and on sale for $300-$350 off MSRP on their eBay store right now, each with free express delivery. According to QuickShip, “The... Read more
Apple is offering $100 iPad discounts to Educ...
Apple will take $100 off 12″ M2 iPad Pros, $50-$100 off 11″ M2 iPad Pros, $50 off iPad Airs, $50 off 8.3″ iPad minis, & $20-$40 off 10″ iPads for all teachers, students, and staff of any... Read more
Midnight Apple Watch Series 8 (41mm GPS + Cel...
Amazon has the Midnight Apple Watch Series 8 (41mm GPS + Cellular) on sale for $50 off MSRP as part of their Holiday sale including free shipping, reducing the price for this Watch to $449.99. Their... Read more
Holiday Sale: Apple Watch Ultra for $50 off M...
Amazon has Apple Watch Ultra models (Alpine Loop, Trail Loop, and Opean Bans) on sale for $50 off MSRP as part of their Holiday sale, each including free shipping, reducing the price for an Ultra to... Read more

Jobs Board

*Apple* Systems Administrator - JAMF - Activ...
…Administration **Duties and Responsibilities** + Configure and maintain the client's Apple Device Management (ADM) solution. The current solution is JAMF supporting Read more
Cashier - *Apple* Blossom Mall - JCPenney (...
Cashier - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Blossom Mall Read more
Omnichannel Associate - *Apple* Blossom Mal...
Omnichannel Associate - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
Sephora Beauty Advisor - *Apple* Blossom Ma...
Sephora Beauty Advisor - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
Operations Associate - *Apple* Blossom Mall...
Operations Associate - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.