/*  This file is part of the KDE Libraries
    Copyright (C) 1998 Thomas Tanghus (tanghus@earthling.net)

    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 Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.
*/  

#ifndef __KNOTEBOOK_H
#define __KNOTEBOOK_H

#include <ktabbar.h>
#include <kwizard.h>

/**
* KNoteBook is a tabbed dialog where each tab can have multiple pages.
* The widget has the advantages of both KTabCtl and QTabDialog plus some more.
*
* Features:
*
* - Multiple pages per tab with previous/next button and optional arrow buttons in the title..
*
* - An optional popup menu which takes you to a specific page in a specific section (tab).
*
* - Easy additions of Ok, Cancel, Default and Help buttons.
*
* - Automatic resizing/repainting/repositioning of buttons. Not like QTabDialog where
* there is always an Ok button.
*
* - Scrollable tab bar.
*
* - Can be used as both modal/non-modal dialog and a child widget.
*
* @short KNoteBook
* @author Thomas Tanghus <tanghus@earthling.net>
* @version 0.2
*/
class KNoteBook : public QWidget
{
        Q_OBJECT
public:
/**
* Constructs a KNoteBook.
*
* @see QDialog::QDialog
*
* @param parent
*
* @param name
*
* @param modal
*
* @param f
*/
        KNoteBook(QWidget *parent = 0, const char *name = 0, bool modal = false, WFlags f = 0);
/**
* Destructor
*/
        KNoteBook::~KNoteBook();
/**
* Adds a new tab to the notebook and creates a new @ref KWizard to hold the pages.
* The tabs are numbered from 0 to n where 0 is the tab first added and n is the
* tab last added. if you add 4 tabs the last tab will be number 4. 
* Subsequent calls to @ref addPage will add pages to this tab this
* tab until a new call to addTab().
*
* @param title The title of the new tab.
*
* @param subtitle Title of the optional page.
*
* @param w If 'w' is not 0 it will be added as a new page with the title 'subtitle'.
* This is equivalent to @ref addPage(w, title);
*/
        void addTab(const char *title, const char *subtitle = 0, QWidget *w = 0);
/**
* Adds a new page to the last added tab.
* The pages are numbered from 1 to n where 1 is the page first added and n is the
* page last added. Subsequent calls to @ref addPage will add pages to the last added
* tab until a new call to addTab().
*
* @param title The title of the new page.
*
* @param w The widget that will be displayed when this page is selected.
*/
        void addPage(QWidget *w, const char *title);
/**
* Turn to another tab. This method calls @ref showSection to show the corresponding KWizard.
*
* @param tab The tab to turn to
*/
        void gotoTab(int tab);

        QSize sizeHint() { return minimumSize(); };
        void adjustSize() { resize(sizeHint()); };

/**
* Adds a Cancel button to the bottom of the dialog. The text will be a translated
* version of the string '&Cancel' thereby giving it the shortcut key 'c'.
* If any buttons are added a space will be created at the bottom of the dialog
* to fit the buttons. When clicked the button will emit the @ref cancelclicked signal.
* @see KLocal::translate
*/
        void setCancelButton();
/**
* Adds a Cancel button to the bottom of the dialog.
* @param text A user supplied text to write to the button.
*/
        void setCancelButton(const char *text);
/**
* Adds a Default button to the bottom of the dialog. The text will be a translated
* version of the string '&Default' thereby giving it the shortcut key 'd'.
* If any buttons are added a space will be created at the bottom of the dialog
* to fit the buttons. When clicked the button will emit the @ref defaultclicked signal.
* @see KLocal::translate
*/
        void setDefaultButton();
/**
* Adds a Default button to the bottom of the dialog.
* @param text A user supplied text to write to the button.
*/
        void setDefaultButton(const char *text);
/**
* Adds a Help button to the bottom right of the dialog. The text will be a translated
* version of the string '&Help' thereby giving it the shortcut key 'h'.
* If any buttons are added a space will be created at the bottom of the dialog
* to fit the buttons. When clicked the button will emit the @ref helpclicked signal.
*/
        void setHelpButton();
/**
* Adds a Help button to the bottom of the dialog. This button will generate the
* signal @ref helpclicked where the int is the page to which the help was requested.
* @param text A user supplied text to write to the button.
*/
        void setHelpButton(const char *);
/**
* Adds an Ok button to the bottom right of the dialog. The text will be a translated
* version of the string '&Ok' thereby giving it the shortcut key 'o'.
* If any buttons are added a space will be created at the bottom of the dialog
* to fit the buttons. When clicked the button will emit the @ref okclicked signal.
*/
        void setOkButton();
/**
* Adds an Ok button to the bottom of the dialog. This button will generate the
* signal @ref okclicked where the int is the page to which the help was requested.
* @param text A user supplied text to write to the button.
*/
        void setOkButton(const char *);
/**
* @return Returns the Ok buttonwidget or 0L if no button is added.
*/
        QPushButton *getOkButton() { return ok; };
/**
* @return Returns the Cancel buttonwidget or 0L if no button is added.
*/
        QPushButton *getCancelButton() { return cancel; };
/**
* @return Returns the Default buttonwidget or 0L if no button is added.
*/
        QPushButton *getDefaultButton() { return def; };
/**
* @return Returns the Help buttonwidget or 0L if no button is added.
*/
        QPushButton *getHelpButton() { return help; };
/**
* Let direction buttons reflect page.
* @param state If state is true the direction buttons (Previous and Next) will have the
* title of the corresponding page.
*/
        void setDirectionsReflectsPage(bool state);
/**
* @return Returns whether the direction buttons reflects the title of the corresponding page.
*
* @see setDirectionsReflectsPage(bool state)
*/
        bool directionsReflectsPage() { return directionsreflectspage; setSizes(); };
/**
* En/Disable the popup menu.
* @param state If state is true a menu containing the pages in the wizard
* will popup when the user RMB-clicks on the page-title.
*/
        void setEnablePopupMenu(bool state) { enablepopupmenu = state; };
/**
* @return Returns whether the menu is enabled or not.
*/
        bool enablePopupMenu() { return enablepopupmenu; };
/**
* @return Returns the handle of the popup menu.
*/
        QPopupMenu *getMenu() { return menu; };
/**
* En/Disable the arrowbuttons.
* @param state If state is true two arrows will appear to the right of the title.
* @see KWizard::setEnableArrowButtons.
*/
        void setEnableArrowButtons(bool state);
/**
* @return Returns whether the arrow buttons are enabled or not.
*/
        bool enableArrowButtons() { return enablearrowbuttons; };
/**
* Returns the handle of the tab bar.
*/
        KTabBar *getTabBar() { return tabbar; };
/**
* Returns the number of tabs in the notebook.
*/
        int numTabs() { return numtabs; };
/**
* En/Disable a tab in the notebook
*/
        void setTabEnabled(int tab, bool state) { tabbar->setTabEnabled(tab, state); };
/**
* @return Returns whether the tab is enabled or not.
*/
        bool isTabEnabled(int tab) { return tabbar->isTabEnabled(tab); };

signals:
/**
* This signal is emitted when the user clicks on the Ok button.
*/
        void okclicked();
/**
* This signal is emitted when the user clicks on the Cancel button.
*/
        void cancelclicked();
/**
* This signal is emitted when the user clicks on the Default button.
*/
        void defaultclicked(int);
/**
* This signal is emitted when the user clicks on the Help button.
* The int is the page which was showing when help was requested.
* @see setHelpButton
*
* @see getHelpButton
*/
        void helpclicked(int);

protected slots:
/**
* Called by @ref gotoTab to show the appropriate KWizard.
*/
        void showSection(int);
/**
* the menu is enabled by @ref enablePopupMenu this methos will let the menu
* popup at 'pos'.
*/
        void popupMenu(QPoint pos);
        void menuChoice(int);
        void menuChoiceRedirect(int);
        void directionButton(bool, bool);
        void okClicked();
        void cancelClicked();
        void defaultClicked();
        void helpClicked();
        void tabScroll( ArrowType );

protected:
        void init();
        void resizeEvent(QResizeEvent *);
        void paintEvent(QPaintEvent *);
        void setSizes();
        QSize childSize();

        KWizard *currentwiz;
        QList<KWizard> sections;
        QPushButton *cancel, *ok, *def, *help;
        KTabBar *tabbar;
        QWidget *main;
        QPopupMenu *menu;
        int current, numtabs, currentmenu;
        bool enablepopupmenu, enablearrowbuttons, directionsreflectspage;
};

#endif __KNOTEBOOK_H




Documentation generated by tanghus@tang1 on Sun Feb 15 18:01:30 CET 1998