/*************************************************************************** * Copyright (C) 2003-2005 by Carsten Niehaus * * cniehaus@kde.org * * * * 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. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef PerodicTableView_H #define PerodicTableView_H class TQLabel; class TQPixmap; class TQPoint; class TQVBoxLayout; class Element; class KalziumDataObject; class KalziumTip; #include #include #include // A PerodicTableView is ... /** * @short basic class for the specific PerodicTableViews * @author Carsten Niehaus */ class PerodicTableView : public TQWidget { Q_OBJECT public: /** * Constructor * @param parent parent widget * @param name name of this widget */ PerodicTableView( TQWidget *parent = 0, const char *name = 0); ~PerodicTableView(); enum SCHEMETYPE { NOCOLOUR = 0, GROUPS, BLOCK, ACIDIC, FAMILY, GRADIENT, CRYSTAL }; enum NUMERATIONTYPE { NO=0, /// no numeration CAS = 1, /// Chemical Abstract Service IUPAC = 2, /// International Union of Pure and Applied Chemistry IUPACOLD = 3 /// old IUPAC numeration }; /** * if this mode is activated a click on a button will not open * a information dialog */ virtual void activateMolcalcmode( bool mode ){ m_molcalcIsActive = mode; } /** * @return if the molcalc mode is active or not */ virtual bool molcalcMode() const{ return m_molcalcIsActive; } /** * sets the NUMERATIONTYPE @p num of the periodic table * @see NUMERATIONTYPE */ void setNumerationType( NUMERATIONTYPE num ){ m_num = num; update(); } /** * @return whether the tooltips are enabled */ bool tooltipsEnabled() const{ return m_tooltipsEnabled; } /** * if @p enabled is true the tooltips * will be enabled */ void setTooltipsEnabled( bool enabled ){ m_tooltipsEnabled = enabled; } /** * This method sets the colors of the PerodicTableView. * @param nr takes 5 different values: * @li normal view * @li groups * @li blocks * @li state of matter * @li acidic behavior * @li family view */ void activateColorScheme( const int nr); /** * @return the short and descriptive name of this PerodicTableView */ TQString shortName() const{ return m_ShortName; } /** * if @p show is true the tooltip will be displayed */ void setShowTooltip( bool show ){ m_showTooltip = show; } /** * @return whether tooltips will be displayed */ bool showTooltip() const { return m_showTooltip; } /** * @return whether if the SOM is active or not */ bool som() const{ return m_showSOM; } void activateSOMMode( bool som ){ m_showSOM = som; setFullDraw(); update(); } /** * @return if the gradient mode is active */ bool gradient() const{ return m_showGradient; } /** * Defines if the gradient mode will be activated or * deactivated * @param gradient defines if the gradient mode should be activated or not */ void setGradient( bool gradient ){ m_showGradient = gradient; setFullDraw(); update(); } //XXX can't use Element::TYPE here... why? void setGradientType( int type ){ m_gradientType = type; } /** * if false, the user disabled tooltips */ bool m_tooltipsEnabled; bool m_showLegendTooltip; /** * activates or deactivates the legend */ void showLegend( bool show ){ m_showLegend = show; } bool showLegend() const{ return m_showLegend; } bool timeline() const{ return m_timeline; } void setTimeline( bool timeline ){ if ( m_timeline != timeline ) m_timeline = timeline; } int date() const{ return m_date; } /** * load the colours from the config file. This is done * on startup and everytime the user changed the configuration */ void reloadColours(); /** * JH: Draw the full table next time */ void setFullDraw(){ doFullDraw = true; } /** * @param type set the scheme * @param which set the type of gradient * @see Element::TYPE */ void setLook( PerodicTableView::SCHEMETYPE type, int which = 0 ); /** * This method paints the marker around the currently selected * element */ virtual void paintCurrentSelection(); private: /** * if true the tooltips will be displayed */ bool m_showTooltip; /** * the type of the gradient. * @see Element::TYPE */ int m_gradientType; /** * calculates the min and max values to prepare the painting */ void calculateGradient( TQPainter* ); /** * @return true if the mouse is over the legend area */ bool pointerOnLegend(int,int); /** * @param p The painter for drawing * @param e the element which is to be drawn * @param coeff ? * @param value the value * @param minValue the smallest of all the values */ void drawGradientButton( TQPainter* p, Element* e, double coeff, double value, double minValue ); /** * calculates the color of an element which has a value which * is @p percentage of the maximum value. This will be the * color used in the gradient view for an element. */ TQColor calculateColor( const double percentage ); /** * the date used in the timeline */ int m_date; /** * the current colour scheme */ int m_currentScheme; KalziumTip* m_kalziumTip; bool m_timeline; /** * the temperature of the table (for the SOM-feature) */ double m_temperature; /** * if true the State Of Matter will be shown */ bool m_showSOM; /** * if true the gradients will be shown */ bool m_showGradient; /** * timer used for the tooltop */ TQTimer HoverTimer, MouseoverTimer; KalziumDataObject *d; /** * the number of the element the mouse-cursor is over */ int m_tooltipElementNumber; /** * @return the number of the element at position x/y. If there * is no element it will return 0 */ int ElementNumber( int x, int y ); /** * @return the coordinates of the element under the mouseCursor. * For example, H will be 1/1 and Li will be 1/2 */ TQPoint ElementUnderMouse(); /** * the currently selected element (the x/y-coordinates) */ TQPoint m_currentPoint; void mouseReleaseEvent( TQMouseEvent* ); void mousePressEvent( TQMouseEvent* ); void mouseMoveEvent( TQMouseEvent* ); TQStringList m_IUPAClist; TQStringList m_IUPACOLDlist; /** * if the the legend will be displayed */ bool m_showLegend; /** * this is a short, descriptive name of the PerodicTableView */ TQString m_ShortName; /** * true if the molcalc-mode is active */ bool m_molcalcIsActive; /** * the type of the nummeration ( NO, CAS, IUPACOLD, IUPAC ) */ NUMERATIONTYPE m_num; /** * implements double buffering of the widget. */ TQPixmap *table; // The basic PerodicTableView TQPixmap *table2; // Basic PerodicTableView + extra data such as tooltip, etc /** * used for bitBlit. If true the complete table will be drawn */ bool doFullDraw; //I am holding all colours as member so that they don't need to //be reloaded on every reload TQColor color_s;//Blocks TQColor color_p; TQColor color_d; TQColor color_f; TQColor color_1;//Groups TQColor color_2; TQColor color_3; TQColor color_4; TQColor color_5; TQColor color_6; TQColor color_7; TQColor color_8; TQColor color_ba;//Acidic TQColor color_ac; TQColor color_neu; TQColor color_amp; TQColor c_alkalie;//Family TQColor c_rare; TQColor c_nonmetal; TQColor c_alkaline; TQColor c_other_metal; TQColor c_halogene; TQColor c_transition; TQColor c_noble_gas; TQColor c_metalloid; TQColor c_liquid; TQColor c_solid; TQColor c_vapor; protected: virtual void paintEvent( TQPaintEvent *e ); /** * draw the tooltip for the legend */ virtual void drawLegendToolTip( TQPainter *p ); virtual void drawTimeLine( TQPainter *p ); /** * called if the user resized the table */ virtual void resizeEvent( TQResizeEvent *e ); /** * the central place for the drawing of the table */ virtual void drawPerodicTableView( TQPainter* p, bool isCrystal ); /** * draw a gradient of the type @p type */ virtual void drawGradientPerodicTableView( TQPainter* p, const double min, const double max ); /** * draw the state of matter */ virtual void drawSOMPerodicTableView( TQPainter* p ); /** * draw the legend */ virtual void drawLegend( TQPainter* p ); /** * draw the numeration */ virtual void drawNumeration( TQPainter* p ); public slots: /** * This method sets the color for the buttons corresponding to * the given temperature @p temp * @param temp is the temperature to which all buttons will be set */ void setTemperature( int temp ){ m_temperature = (double)temp; update(); } void setDate( int date ){ //These elements have always been known: //6 16 26 29 33 47 50 51 79 80 82 83 m_date = date; update(); } /** * this slot removes the selection of any point */ void unSelect(); private slots: /** * If called this slot will emit the signal MouseOver( num ) * where num is the number of the element the mouse if over. * If the mouse is not over an element nothing will be emited * @see MouseOver() */ void slotMouseover(); /** * start the calculation of the element over which the mouse-cursor * is over. Finally the signal ToolTip( int ) is emitted */ void slotTransientLabel(); /** * this slot updates the currently selected point */ void selectPoint( const TQPoint& point ); /** * this slot updates the element given in the @p num * @param num The number of the selected element */ void selectElement( int num ); /** * sets the current element to @p number * and updates the table */ void slotToolTip( int number ); signals: /** * this signal is emitted when the table is clicked */ void tableClicked(TQPoint); /** * this signal is emitted when an element is clicked */ void ElementClicked(int); /** * this signal is emitted when the tooltip of an element * has to be displayed */ void ToolTip(int); /** * This signal is emited when the mouse pointer is * over an element */ void MouseOver( int ); }; #endif