Page 1 of 1

reading available fonts on system

Posted: Sat Sep 08, 2018 7:49 am
by plantenkennis
Hello,

Is it possible to check what fonts are available on a system. I want to put all fonts in an array, so the user can choose which font to use for printing some data.
I am looking for some function like "aFonts := ReadFonts()"

Re: reading available fonts on system

Posted: Sat Sep 08, 2018 8:19 am
by Enrico Maria Giordano

Code: Select all

ChooseFont()
EMG

Re: reading available fonts on system

Posted: Sat Sep 08, 2018 10:04 am
by Antonio Linares
René,

I am implementing ChooseFont() using Cocoa's NSFontPanel:

https://stackoverflow.com/questions/141 ... l-in-cocoa

Re: reading available fonts on system

Posted: Sat Sep 08, 2018 10:08 am
by Enrico Maria Giordano
Ops, sorry. Wrong forum.

EMG

Re: reading available fonts on system

Posted: Sat Sep 08, 2018 12:15 pm
by Antonio Linares
First try:

Code: Select all

#include "FiveMac.ch"

function Main()

   MsgInfo( ChooseFont() )

return nil

#pragma BEGINDUMP

#include <fivemac.h>

HB_FUNC( CHOOSEFONT )
{
   NSFontManager * fontManager = [ NSFontManager sharedFontManager ];
   NSFontPanel * fontPanel = [ fontManager fontPanel:YES ];

   [ fontPanel makeKeyAndOrderFront: fontPanel ];
   // [ NSApp runModalForWindow: fontPanel ];
}

#pragma ENDDUMP
 

Re: reading available fonts on system

Posted: Sat Sep 08, 2018 12:55 pm
by Antonio Linares
More...

Code: Select all

#include "FiveMac.ch"

function Main()

   MsgInfo( ChooseFont() )

return nil

#pragma BEGINDUMP

#include <fivemac.h>

@interface FontPanelController : NSWindowController <NSWindowDelegate>
{
}
-( void ) changeFont: ( id ) sender;
-( void ) windowWillClose: ( id ) sender;
@end

@implementation FontPanelController
-( void ) changeFont: ( id ) sender
{
   NSBeep();
}

- ( void ) windowWillClose: ( id ) sender
{
   NSBeep();
   [ NSApp abortModal ];
   // hb_retc( [ [ sender font ].fontName cStringUsingEncoding : NSWindowsCP125$sCP1252StringEncoding ] );
   hb_retc( "font name" );
}
@end

HB_FUNC( CHOOSEFONT )
{
   NSFontManager * fontManager = [ NSFontManager sharedFontManager ];
   NSFontPanel * fontPanel = [ fontManager fontPanel:YES ];

   [ fontPanel setDelegate: [ [ FontPanelController alloc ] init ] ];
   [ fontPanel makeKeyAndOrderFront: fontPanel ];
   [ NSApp runModalForWindow: fontPanel ];
}

#pragma ENDDUMP
 
https://stackoverflow.com/questions/923 ... rom-nsfont

Re: reading available fonts on system

Posted: Sun Sep 09, 2018 8:07 am
by Antonio Linares
This function ChooseFont() is working fine :-)

I have implemented it as modal. Its easy to implement it as non modal too.

Code: Select all

#include "FiveMac.ch"

function Main()

   MsgInfo( ChooseFont() )

return nil

#pragma BEGINDUMP

#include <fivemac.h>

@interface FontPanelController : NSWindowController <NSWindowDelegate>
{
   @public NSFont * font;
   @public NSFont * newFont;
}
-( void ) changeFont: ( id ) sender;
-( void ) windowWillClose: ( id ) sender;
@end

@implementation FontPanelController
-( void ) changeFont: ( id ) sender
{
   newFont = [ sender convertFont: font ];
}

- ( void ) windowWillClose: ( id ) sender
{
   [ NSApp abortModal ];

   hb_retc( [ [ ( newFont ? newFont: font ) displayName ] cStringUsingEncoding : NSWindowsCP1252StringEncoding ] );
}
@end

HB_FUNC( CHOOSEFONT )
{
   NSFontManager * fontManager = [ NSFontManager sharedFontManager ];
   NSFontPanel * fontPanel = [ fontManager fontPanel:YES ];
   FontPanelController * fontPanelController = [ [ FontPanelController alloc ] init ];

   [ fontPanel setDelegate: fontPanelController ];
   fontPanelController->font = [ NSFont systemFontOfSize : 10 ];
   [ fontPanel makeKeyAndOrderFront: fontPanel ];
   [ NSApp runModalForWindow: fontPanel ];
}

#pragma ENDDUMP

Re: reading available fonts on system

Posted: Sun Sep 09, 2018 8:16 am
by Antonio Linares
René,

I have added this new function ChooseFont() to FiveMac:

https://bitbucket.org/fivetech/fivemac/ ... d9d06858f3

So simply download the new FiveMac libs and try this example:

https://bitbucket.org/fivetech/fivemac/ ... /libfive.a
https://bitbucket.org/fivetech/fivemac/ ... libfivec.a

Code: Select all

#include "FiveMac.ch"

function Main()

   MsgInfo( ChooseFont() )

return nil
Will users ever notice that we are giving FiveMac for free... ? ;-)

Re: reading available fonts on system

Posted: Sun Sep 09, 2018 8:27 am
by Enrico Maria Giordano
So my suggestion was right, after all. :D

EMG

Re: reading available fonts on system

Posted: Sun Sep 09, 2018 8:33 am
by Antonio Linares
Dear Enrico,

Always :-)

Re: reading available fonts on system

Posted: Tue Sep 11, 2018 7:56 pm
by plantenkennis
Hello Antonio,

Thank you very much for this implementation, it looks very nice and easy to use.
But what I mean is a function that only puts the names of the fonts in an array. Than I can use that array in a COMBOBOX and use the name of the font in a print routine. Simular as in Word where the user can choose the font from a combobox and than the fontsize from another combobox.

Always thankful for all the help you give. If you need some financial support, please let me know.

Re: reading available fonts on system

Posted: Wed Sep 12, 2018 6:55 am
by Antonio Linares
René,

This is function FM_AvailableFonts() that returns an array with all available fonts names:

Code: Select all

HB_FUNC( FM_AVAILABLEFONTS )
{
   NSArray * aFonts = [ [ NSFontManager sharedFontManager ] availableFonts ];
   int i;

   hb_reta( [ aFonts count ] );

   for( i = 0; i < [ aFonts count ]; i++ )
      hb_storvc( [ ( NSString * ) [ aFonts objectAtIndex: i ] cStringUsingEncoding : NSWindowsCP1252StringEncoding ], -1, i + 1 );
}
This is an example of use:

Code: Select all

#include "FiveMac.ch"

function Main()

   local oDlg, cVar
   local aFonts := FM_availableFonts()

   DEFINE DIALOG oDlg TITLE "Available fonts" SIZE 300, 300

   @ 200, 50 COMBOBOX cVar ITEMS aFonts SIZE 200, 20 OF oDlg

   ACTIVATE DIALOG oDlg CENTERED

return nil
Changes already commited to the FiveMac repository:
https://bitbucket.org/fivetech/fivemac/ ... 9b0c0b51d1

FiveMac modified C library already available from here:
https://bitbucket.org/fivetech/fivemac/ ... libfivec.a

Re: reading available fonts on system

Posted: Wed Sep 12, 2018 7:04 am
by Antonio Linares
Image

Image

Re: reading available fonts on system

Posted: Fri Sep 21, 2018 6:02 am
by plantenkennis
Hello Antonio,

Sorry for the late response, I had a small vacation (needed it)

Thank you very much, this is just what I was looking for.