diff options
Diffstat (limited to 'kstars/kstars/objectnamelist.h')
-rw-r--r-- | kstars/kstars/objectnamelist.h | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/kstars/kstars/objectnamelist.h b/kstars/kstars/objectnamelist.h new file mode 100644 index 00000000..8e819c3a --- /dev/null +++ b/kstars/kstars/objectnamelist.h @@ -0,0 +1,173 @@ +/*************************************************************************** + objectnamelist.h - description + ------------------- + begin : Mon Feb 18 2002 + copyright : (C) 2002 by Thomas Kabelmann + email : tk78@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef OBJECTNAMELIST_H +#define OBJECTNAMELIST_H + + +/**@class ObjectNameList + *This class provides an interface like a QPtrList, but sorts objects internally + *in 27 lists. The objects are sorted alphabetically. List 0 contains all objects + *beginning not with a letter. List 1 - 26 contains objects beginning with a letter. + *The number of the list is similar to positon of letter in alphabet. (A = 1 .. Z = 26 ) + *@author Thomas Kabelmann + *@version 1.0 + */ + + +#include <qglobal.h> +#include <qptrlist.h> +#include <qstring.h> + +class SkyObject; +class SkyObjectName; + +/**Reimplemented from QPtrList for sorting objects in the list. */ +template <class T> class SortedList : public QPtrList <T> { + protected: + int compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2) { + if ( *((T*)item1) == *((T*)item2) ) return 0; + return ( *((T*)item1) < *((T*)item2) ) ? -1 : 1; + } +}; + +class ObjectNameList { + + public: + /** Constructor */ + ObjectNameList(); + + /** Destructor */ + ~ObjectNameList(); + + /**Appends a skyobject to the list. + *@param object pointer to the SkyObject to be appended to the list. + *@param useLongName if TRUE, use the longname of the object, + *rather than the primary name + */ + void append(SkyObject *object, bool useLongName=false); + + /**Select the list which contains objects whose names begin with the + *same letter as the argument. The selected list ID is recorded in + *an internal variable, so it is persistent. + *@note This function is case insensitive. + *@note if no string is given, then the first list is selected, and + *also a flag is set so that all lists will be traversed by the next() + *function. + *@return pointer to the first object in the selected list. + *@param name the name to use in selecting a list. + */ + SkyObjectName* first(const QString &name = QString::null); + + /**Returns next object in the currently selected list. + *@return pointer to the next object in the current list, or NULL if + *the end of the list was reached. + *@note if the "all lists" flag is set, then it will traverse all lists + *before returning NULL. + */ + SkyObjectName* next(); + + /**@return pointer to the object, if it is in one of the lists; + *otherwise return the NULL pointer. + *@note This function is case sensitive. + *@param name name of object to find. + *@return pointer to object with the given name + */ + SkyObjectName* find(const QString &name = QString::null); + + /**@short remove the named object from the list. + *@param name the name of the object to be removed. + *@note If the object is not found, then nothing happens. + */ + void remove( const QString &name = QString::null ); + + /**Define the language which should be used for constellation names + */ + enum Language { local = 0, latin = 1 }; + + /**Change constellation-name language option. + *@param lang the language to use (0=local; 1=latin) + */ + void setLanguage( Language lang ); + + /**Change constellation-name language option. + *This function behaves just like the above function; + *it differs only in the data type of its argument. + *@param lang the language to use (0=local; 1=latin) + */ + void setLanguage( bool lang ); + + /**@return the total count of the number of named objects. + */ + uint count() const { return amount; } + + private: + + /**Sorts the lists with objects for faster access. + *It's needed for find(). first() and find() call this function. + */ + void sort(); + + + /**@return the list index which contains the object whose name matches the argument. + *@note this does not return the position within a list of names; it returns the ID + *of the list itself. + *@param name the name of the object whose index is to be found + */ + int getIndex( const QString &name = QString::null ); + + /**Two modes are available: + *allLists = loop through the whole list if next() is called + *oneList = loop through one list if next is called + *If oneList is set, just check all objects which start with same letter to save cpu time. + */ + enum Mode { allLists, oneList } mode; + + /**Set mode + *@see first() + */ + void setMode( Mode m ); + + /**Hold 2 pointer lists in memory. Number of lists can easily increased for adding more languages. + *First index is the language and second index is reserved for alphabetically sorted list. + * 0 = all objects beginning with a number + * 1 = A ... 26 = Z + */ + SortedList <SkyObjectName> list[2][27]; + + /**Hold status if list is unsorted or not.*/ + bool unsorted[27]; + + /** + *Constellations has latin names and alloc extra SkyObjectNames which will stored in 2 list. + *But second list will not delete objects while clearing it, because most of objects in this list + *are in first list too. We just have to delete objects which are not in first list. These objects + *will stored in this list. + */ + QPtrList <SkyObjectName> constellations; + + /** + *Which list was accessed last time by first() or next() + */ + int currentIndex; + + Language language; + + unsigned int amount; +}; + +#endif |