/********************************************************************************
* *
* A c c e l e r a t o r T a b l e C l a s s *
* *
*********************************************************************************
* Copyright (C) 1998,2024 by Jeroen van der Zijp. All Rights Reserved. *
*********************************************************************************
* This library is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see *
********************************************************************************/
#ifndef FXACCELTABLE_H
#define FXACCELTABLE_H
#ifndef FXOBJECT_H
#include "FXObject.h"
#endif
namespace FX {
/**
* The accelerator table sends a message to a specific
* target object when the indicated key and modifier combination
* is pressed.
*/
class FXAPI FXAccelTable : public FXObject {
FXDECLARE(FXAccelTable)
protected:
struct FXAccelKey {
FXObject *target; // Target object of message
FXSelector messagedn; // Message being sent
FXSelector messageup; // Message being sent
FXHotKey code; // Keysym and modifier mask to match
};
private:
FXAccelKey *key; // Accelerator table
FXuint max; // Largest table index
FXuint num; // Number of entries
private:
void resize(FXuint m);
private:
FXAccelTable(const FXAccelTable&);
FXAccelTable &operator=(const FXAccelTable&);
public:
long onKeyPress(FXObject*,FXSelector,void*);
long onKeyRelease(FXObject*,FXSelector,void*);
public:
/**
* Construct empty accelerator table.
*/
FXAccelTable();
/**
* Add accelerator key-combination into the accelerator table.
*/
void addAccel(FXHotKey hotkey,FXObject* target=nullptr,FXSelector seldn=0,FXSelector selup=0);
/**
* Parse key-combination description and add it into the accelerator table.
*/
void addAccel(const FXchar* string,FXObject* target=nullptr,FXSelector seldn=0,FXSelector selup=0);
void addAccel(const FXString& string,FXObject* target=nullptr,FXSelector seldn=0,FXSelector selup=0);
/**
* Remove accelerator key combination from the accelerator table.
*/
void removeAccel(FXHotKey hotkey);
/**
* Parse key-combination description and remove it from the accelerator table.
*/
void removeAccel(const FXchar* string);
void removeAccel(const FXString& string);
/**
* Return true if accelerator accelerator key-combination is in accelerator table.
*/
FXbool hasAccel(FXHotKey hotkey) const;
/**
* Parse key-combination description and return true if it is in the accelerator table.
*/
FXbool hasAccel(const FXchar* string) const;
FXbool hasAccel(const FXString& string) const;
/**
* Return target object of the given accelerator key-combination.
*/
FXObject* targetOfAccel(FXHotKey hotkey) const;
/**
* Parse key-combination description and return its target.
*/
FXObject* targetOfAccel(const FXchar* string) const;
FXObject* targetOfAccel(const FXString& string) const;
/**
* Parse accelerator from string, yielding modifier and key code.
* The syntax of the string is:
*
* ::= ( ('-' | '+'))*
*
* where:
*
* ::= 'Ctl' | 'Ctrl' | 'Alt' | 'Meta' | 'Shift'
*
* ::= 'Home' | 'End' | 'PgUp' | 'PgDn' | 'Left' | 'Right' |
* 'Up' | 'Down' | 'Ins' | 'Del' | 'Esc' | 'Tab' | 'Return' |
* 'Enter' | 'Back' | 'Spc' | 'Space' |
* 'F'? |
* '#'+ |
*
*
* ::= '0' ... '1'
* ::= 'A' ... 'Z'
* ::= '0' ... '9', 'A' ... 'F'
*
* Case is not significant, but uppercase is preferred.
* For example, parseAccel("Ctl+Shift+X") yields the same value as:
* MKUINT(KEY_X,CONTROLMASK|SHIFTMASK).
*/
static FXHotKey parseAccel(const FXchar* string);
static FXHotKey parseAccel(const FXString& string);
/**
* Unparse hot key comprising modifier and key code back
* into a string suitable for parsing with fxparseHotKey.
* For example, an input of MKUINT(KEY_X,CONTROLMASK|SHIFTMASK)
* will return the string "Ctl+Shift+X".
*/
static FXString unparseAccel(FXHotKey key);
/// Save table to a stream
virtual void save(FXStream& store) const;
/// Load table from a stream
virtual void load(FXStream& store);
/**
* Destroy accelerator table.
*/
virtual ~FXAccelTable();
};
/**
* Parse hot key from string of the form "&Hotkey", yielding modifier and
* key code. If a '&' is to be just plain text, it should be doubled.
* For example, parseHotKey(""Salt && &Pepper!"") yields the same value as
* MKUINT(KEY_p,ALTMASK).
*/
extern FXAPI FXHotKey parseHotKey(const FXString& string);
/**
* Obtain hot key offset in string, or -1 if not found.
* For example, findHotKey("Salt && &Pepper!") yields 7.
* Note that this is the byte-offset, not the character
* index!
*/
extern FXAPI FXint findHotKey(const FXString& string);
/**
* Strip hot key combination from the string.
* For example, stripHotKey("Salt && &Pepper") should
* yield "Salt & Pepper".
*/
extern FXAPI FXString stripHotKey(const FXString& string);
}
#endif