You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/kpovmodeler/pmviewlayoutmanager.h

308 lines
8.1 KiB

//-*-C++-*-
/*
**************************************************************************
description
--------------------
copyright : (C) 2002 by Luis Carvalho
email : lpassos@mail.telepac.pt
copyright : (C) 2003 by Andreas Zehender
email : zehender@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. *
* *
**************************************************************************/
#ifndef PMVIEWLAYOUTMANAGER_H
#define PMVIEWLAYOUTMANAGER_H
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <tqstring.h>
#include <tqmap.h>
#include <tqvaluelist.h>
#include <kstaticdeleter.h>
#include <kdialogbase.h>
#include "pmdockwidget.h"
#include "pmviewbase.h"
class KConfig;
class TQDomElement;
class TQLineEdit;
class PMShell;
/**
* Class used internally by @ref PMViewLayout
*
* This class maintains all the information needed to create a docked view.
*/
class PMViewLayoutEntry
{
public:
/**
* Constructor
*/
PMViewLayoutEntry( );
/**
* Copy constructor
*/
PMViewLayoutEntry( const PMViewLayoutEntry& e );
/**
* Destructor
*/
~PMViewLayoutEntry( );
TQString viewType( ) const { return m_viewType; }
void setViewType( const TQString& vt );
PMDockWidget::DockPosition dockPosition( ) const { return m_dockPosition; }
void setDockPosition( PMDockWidget::DockPosition i );
int columnWidth( ) const { return m_columnWidth; }
void setColumnWidth( int i );
int height( ) const { return m_height; }
void setHeight( int i );
int floatingHeight( ) const { return m_floatingHeight; }
void setFloatingHeight( int h ) { m_floatingHeight = h; }
int floatingWidth( ) const { return m_floatingWidth; }
void setFloatingWidth( int w ) { m_floatingWidth = w; }
int floatingPositionX( ) const { return m_floatingPositionX; }
void setFloatingPositionX( int p ) { m_floatingPositionX = p; }
int floatingPositionY( ) const { return m_floatingPositionY; }
void setFloatingPositionY( int p ) { m_floatingPositionY = p; }
void loadData( TQDomElement& e );
void saveData( TQDomElement& e ) const;
PMViewOptions* customOptions( ) const { return m_pCustomOptions; }
void setCustomOptions( PMViewOptions* o );
const TQString dockPositionAsString( );
const TQString viewTypeAsString( );
private:
TQString m_viewType;
PMDockWidget::DockPosition m_dockPosition;
int m_columnWidth;
int m_height;
int m_floatingWidth;
int m_floatingHeight;
int m_floatingPositionX;
int m_floatingPositionY;
PMViewOptions* m_pCustomOptions;
};
/**
* Class used internally by @ref PMViewLayoutManager
*
* This class maintains a named layout. It basically stores all views
* associated with that layout.
*/
class PMViewLayout
{
public:
typedef TQValueList< PMViewLayoutEntry >::iterator iterator;
/**
* Constructor
*/
PMViewLayout( );
/**
* Copy constructor
*/
PMViewLayout( const PMViewLayout& vl );
/**
* Destructor
*/
~PMViewLayout( ) { }
/**
* Assignment operator
*/
PMViewLayout& operator = ( const PMViewLayout& vl );
TQString name( ) const { return m_name; }
void loadData( TQDomElement& e );
void saveData( TQDomElement& e, TQDomDocument& doc ) const;
/**
* Destroy all dock widgets in PMShell and create the new ones
*/
void displayLayout( PMShell* shell );
/**
* Sets the name of the layout
*/
void setName( const TQString& n );
/**
*
* Add a new entry to the layout. By default it adds the entry at the end
* of the list. If a position is given it adds the entry at the indicated
* position
*/
void addEntry( const PMViewLayoutEntry& e, int index = -1 );
/**
* Removes the entry at the given position
*/
void removeEntry( int index );
/**
* Returns an iterator to the first entry
*/
iterator begin( ) { return m_entries.begin( ); }
/**
* Returns an iterator to the last entry
*/
iterator end( ) { return m_entries.end( ); }
/**
* Returns an iterator to the n-th entry
*/
iterator at( int i ) { return m_entries.at( i ); }
/**
* Returns the entry at the given position
*/
PMViewLayoutEntry& operator[]( int index ) { return m_entries[ index ]; }
/**
* Normalizes the column width and view heights
*/
void normalize( );
/**
* Extracts the view layout from the current window
*/
static PMViewLayout extractViewLayout( PMShell* shell );
private:
static void recursiveExtractColumns(
TQValueList< TQValueList< PMViewLayoutEntry > >& cols,
TQValueList< TQValueList< PMViewLayoutEntry > >::iterator cit,
int width, TQWidget* widget );
static void recursiveExtractOneColumn(
TQValueList< PMViewLayoutEntry >& entries,
TQValueList< PMViewLayoutEntry >::iterator eit,
int height, TQWidget* widget );
TQString m_name;
TQValueList< PMViewLayoutEntry > m_entries;
};
/**
* Singleton that contains the view layouts available.
*
* It interacts with @ref PMShell to create the view layouts.
* The class maintains a list of layouts as well as the name of the default
* layout. The layouts are stored in a XML file caled viewlayouts.xml.
*/
class PMViewLayoutManager
{
public:
/**
* Destructor
*/
~PMViewLayoutManager( );
/**
* Returns the manager instance (singleton)
*/
static PMViewLayoutManager* theManager( );
/**
* Returns the list of available view layouts
*/
TQStringList availableLayouts( );
/**
* Sets the default layout
*/
void setDefaultLayout( const TQString& name );
/**
* Returns the default layout
*/
TQString defaultLayout( ) const { return m_defaultLayout; }
/**
* Destroy all dock widgets in PMShell and create the new ones
*/
void displayLayout( const TQString& name, PMShell* shell );
/**
* Displays the layout indicated as default
*/
void displayDefaultLayout( PMShell* shell );
/**
* Loads all layouts from the configuration file
*/
void loadData( );
/**
* Saves the current layout collection to the configuration file
*/
void saveData( );
/**
* Add a new empty layout
*/
void addLayout( const TQString& name );
/**
* Add a new layout
*/
void addLayout( const PMViewLayout& l ) { m_layouts.append( l ); }
/**
* Remove a layout
*/
void removeLayout( const TQString& name );
/**
* Get a known layout
*/
PMViewLayout* findLayout( const TQString& name );
/**
* Returns the list of available layouts
*/
TQValueList<PMViewLayout> layouts( ) { return m_layouts; }
/**
* Sets the list of available layouts
*/
void setLayouts( const TQValueList<PMViewLayout>& l ) { m_layouts = l; }
/**
* Fill the available layouts menu
*/
void fillPopupMenu( KPopupMenu* pMenu );
private:
/**
* Constructor
*/
PMViewLayoutManager( );
bool m_layoutsLoaded;
bool m_layoutDisplayed;
TQString m_defaultLayout;
TQValueList< PMViewLayout > m_layouts;
static PMViewLayoutManager* s_pInstance;
static KStaticDeleter<PMViewLayoutManager> s_staticDeleter;
};
class PMSaveViewLayoutDialog : public KDialogBase
{
Q_OBJECT
public:
PMSaveViewLayoutDialog( PMShell* parent, const char* name = 0 );
~PMSaveViewLayoutDialog( );
protected slots:
virtual void slotOk( );
void slotNameChanged( const TQString& );
void slotNameSelected( const TQString& );
private:
TQLineEdit* m_pLayoutName;
PMShell* m_pShell;
};
#endif