summaryrefslogtreecommitdiffstats
path: root/examples/chart/chartform.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/chart/chartform.cpp')
-rw-r--r--examples/chart/chartform.cpp531
1 files changed, 531 insertions, 0 deletions
diff --git a/examples/chart/chartform.cpp b/examples/chart/chartform.cpp
new file mode 100644
index 000000000..4317b8f0b
--- /dev/null
+++ b/examples/chart/chartform.cpp
@@ -0,0 +1,531 @@
+#include "canvasview.h"
+#include "chartform.h"
+#include "optionsform.h"
+#include "setdataform.h"
+
+#include <qaction.h>
+#include <qapplication.h>
+#include <qcombobox.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qfont.h>
+#include <qfontdialog.h>
+#include <qmenubar.h>
+#include <qmessagebox.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qprinter.h>
+#include <qradiobutton.h>
+#include <qsettings.h>
+#include <qspinbox.h>
+#include <qstatusbar.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+
+#include "images/file_new.xpm"
+#include "images/file_open.xpm"
+#include "images/file_save.xpm"
+#include "images/file_print.xpm"
+#include "images/options_setdata.xpm"
+#include "images/options_setfont.xpm"
+#include "images/options_setoptions.xpm"
+#include "images/options_horizontalbarchart.xpm"
+#include "images/options_piechart.xpm"
+#include "images/options_verticalbarchart.xpm"
+
+
+const TQString WINDOWS_REGISTRY = "/Trolltech/TQtExamples";
+const TQString APP_KEY = "/Chart/";
+
+
+ChartForm::ChartForm( const TQString& filename )
+ : TQMainWindow( 0, 0, WDestructiveClose )
+{
+ setIcon( TQPixmap( options_piechart ) );
+
+ TQAction *fileNewAction;
+ TQAction *fileOpenAction;
+ TQAction *fileSaveAction;
+ TQAction *fileSaveAsAction;
+ TQAction *fileSaveAsPixmapAction;
+ TQAction *filePrintAction;
+ TQAction *fileQuitAction;
+ TQAction *optionsSetDataAction;
+ TQAction *optionsSetFontAction;
+ TQAction *optionsSetOptionsAction;
+
+ fileNewAction = new TQAction(
+ "New Chart", TQPixmap( file_new ),
+ "&New", CTRL+Key_N, this, "new" );
+ connect( fileNewAction, SIGNAL( activated() ), this, SLOT( fileNew() ) );
+
+ fileOpenAction = new TQAction(
+ "Open Chart", TQPixmap( file_open ),
+ "&Open...", CTRL+Key_O, this, "open" );
+ connect( fileOpenAction, SIGNAL( activated() ), this, SLOT( fileOpen() ) );
+
+ fileSaveAction = new TQAction(
+ "Save Chart", TQPixmap( file_save ),
+ "&Save", CTRL+Key_S, this, "save" );
+ connect( fileSaveAction, SIGNAL( activated() ), this, SLOT( fileSave() ) );
+
+ fileSaveAsAction = new TQAction(
+ "Save Chart As", TQPixmap( file_save ),
+ "Save &As...", 0, this, "save as" );
+ connect( fileSaveAsAction, SIGNAL( activated() ),
+ this, SLOT( fileSaveAs() ) );
+
+ fileSaveAsPixmapAction = new TQAction(
+ "Save Chart As Bitmap", TQPixmap( file_save ),
+ "Save As &Bitmap...", CTRL+Key_B, this, "save as bitmap" );
+ connect( fileSaveAsPixmapAction, SIGNAL( activated() ),
+ this, SLOT( fileSaveAsPixmap() ) );
+
+ filePrintAction = new TQAction(
+ "Print Chart", TQPixmap( file_print ),
+ "&Print Chart...", CTRL+Key_P, this, "print chart" );
+ connect( filePrintAction, SIGNAL( activated() ),
+ this, SLOT( filePrint() ) );
+
+ optionsSetDataAction = new TQAction(
+ "Set Data", TQPixmap( options_setdata ),
+ "Set &Data...", CTRL+Key_D, this, "set data" );
+ connect( optionsSetDataAction, SIGNAL( activated() ),
+ this, SLOT( optionsSetData() ) );
+
+
+ TQActionGroup *chartGroup = new TQActionGroup( this ); // Connected later
+ chartGroup->setExclusive( TRUE );
+
+ optionsPieChartAction = new TQAction(
+ "Pie Chart", TQPixmap( options_piechart ),
+ "&Pie Chart", CTRL+Key_I, chartGroup, "pie chart" );
+ optionsPieChartAction->setToggleAction( TRUE );
+
+ optionsHorizontalBarChartAction = new TQAction(
+ "Horizontal Bar Chart", TQPixmap( options_horizontalbarchart ),
+ "&Horizontal Bar Chart", CTRL+Key_H, chartGroup,
+ "horizontal bar chart" );
+ optionsHorizontalBarChartAction->setToggleAction( TRUE );
+
+ optionsVerticalBarChartAction = new TQAction(
+ "Vertical Bar Chart", TQPixmap( options_verticalbarchart ),
+ "&Vertical Bar Chart", CTRL+Key_V, chartGroup, "Vertical bar chart" );
+ optionsVerticalBarChartAction->setToggleAction( TRUE );
+
+
+ optionsSetFontAction = new TQAction(
+ "Set Font", TQPixmap( options_setfont ),
+ "Set &Font...", CTRL+Key_F, this, "set font" );
+ connect( optionsSetFontAction, SIGNAL( activated() ),
+ this, SLOT( optionsSetFont() ) );
+
+ optionsSetOptionsAction = new TQAction(
+ "Set Options", TQPixmap( options_setoptions ),
+ "Set &Options...", 0, this, "set options" );
+ connect( optionsSetOptionsAction, SIGNAL( activated() ),
+ this, SLOT( optionsSetOptions() ) );
+
+ fileQuitAction = new TQAction( "Quit", "&Quit", CTRL+Key_Q, this, "tquit" );
+ connect( fileQuitAction, SIGNAL( activated() ), this, SLOT( fileQuit() ) );
+
+
+ TQToolBar* fileTools = new TQToolBar( this, "file operations" );
+ fileTools->setLabel( "File Operations" );
+ fileNewAction->addTo( fileTools );
+ fileOpenAction->addTo( fileTools );
+ fileSaveAction->addTo( fileTools );
+ fileTools->addSeparator();
+ filePrintAction->addTo( fileTools );
+
+ TQToolBar *optionsTools = new TQToolBar( this, "options operations" );
+ optionsTools->setLabel( "Options Operations" );
+ optionsSetDataAction->addTo( optionsTools );
+ optionsTools->addSeparator();
+ optionsPieChartAction->addTo( optionsTools );
+ optionsHorizontalBarChartAction->addTo( optionsTools );
+ optionsVerticalBarChartAction->addTo( optionsTools );
+ optionsTools->addSeparator();
+ optionsSetFontAction->addTo( optionsTools );
+ optionsTools->addSeparator();
+ optionsSetOptionsAction->addTo( optionsTools );
+
+ fileMenu = new TQPopupMenu( this );
+ menuBar()->insertItem( "&File", fileMenu );
+ fileNewAction->addTo( fileMenu );
+ fileOpenAction->addTo( fileMenu );
+ fileSaveAction->addTo( fileMenu );
+ fileSaveAsAction->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ fileSaveAsPixmapAction->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ filePrintAction->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ fileQuitAction->addTo( fileMenu );
+
+ optionsMenu = new TQPopupMenu( this );
+ menuBar()->insertItem( "&Options", optionsMenu );
+ optionsSetDataAction->addTo( optionsMenu );
+ optionsMenu->insertSeparator();
+ optionsPieChartAction->addTo( optionsMenu );
+ optionsHorizontalBarChartAction->addTo( optionsMenu );
+ optionsVerticalBarChartAction->addTo( optionsMenu );
+ optionsMenu->insertSeparator();
+ optionsSetFontAction->addTo( optionsMenu );
+ optionsMenu->insertSeparator();
+ optionsSetOptionsAction->addTo( optionsMenu );
+
+ menuBar()->insertSeparator();
+
+ TQPopupMenu *helpMenu = new TQPopupMenu( this );
+ menuBar()->insertItem( "&Help", helpMenu );
+ helpMenu->insertItem( "&Help", this, SLOT(helpHelp()), Key_F1 );
+ helpMenu->insertItem( "&About", this, SLOT(helpAbout()) );
+ helpMenu->insertItem( "About &TQt", this, SLOT(helpAboutTQt()) );
+
+
+ m_printer = 0;
+ m_elements.resize( MAX_ELEMENTS );
+
+ TQSettings settings;
+ settings.insertSearchPath( TQSettings::Windows, WINDOWS_REGISTRY );
+ int windowWidth = settings.readNumEntry( APP_KEY + "WindowWidth", 460 );
+ int windowHeight = settings.readNumEntry( APP_KEY + "WindowHeight", 530 );
+ int windowX = settings.readNumEntry( APP_KEY + "WindowX", -1 );
+ int windowY = settings.readNumEntry( APP_KEY + "WindowY", -1 );
+ setChartType( ChartType(
+ settings.readNumEntry( APP_KEY + "ChartType", int(PIE) ) ) );
+ m_addValues = AddValuesType(
+ settings.readNumEntry( APP_KEY + "AddValues", int(NO) ));
+ m_decimalPlaces = settings.readNumEntry( APP_KEY + "Decimals", 2 );
+ m_font = TQFont( "Helvetica", 18, TQFont::Bold );
+ m_font.fromString(
+ settings.readEntry( APP_KEY + "Font", m_font.toString() ) );
+ for ( int i = 0; i < MAX_RECENTFILES; ++i ) {
+ TQString filename = settings.readEntry( APP_KEY + "File" +
+ TQString::number( i + 1 ) );
+ if ( !filename.isEmpty() )
+ m_recentFiles.push_back( filename );
+ }
+ if ( m_recentFiles.count() )
+ updateRecentFilesMenu();
+
+
+ // Connect *after* we've set the chart type on so we don't call
+ // drawElements() prematurely.
+ connect( chartGroup, SIGNAL( selected(TQAction*) ),
+ this, SLOT( updateChartType(TQAction*) ) );
+
+ resize( windowWidth, windowHeight );
+ if ( windowX != -1 || windowY != -1 )
+ move( windowX, windowY );
+
+ m_canvas = new TQCanvas( this );
+ m_canvas->resize( width(), height() );
+ m_canvasView = new CanvasView( m_canvas, &m_elements, this );
+ setCentralWidget( m_canvasView );
+ m_canvasView->show();
+
+ if ( !filename.isEmpty() )
+ load( filename );
+ else {
+ init();
+ m_elements[0].set( 20, red, 14, "Red" );
+ m_elements[1].set( 70, cyan, 2, "Cyan", darkGreen );
+ m_elements[2].set( 35, blue, 11, "Blue" );
+ m_elements[3].set( 55, yellow, 1, "Yellow", darkBlue );
+ m_elements[4].set( 80, magenta, 1, "Magenta" );
+ drawElements();
+ }
+
+ statusBar()->message( "Ready", 2000 );
+}
+
+
+ChartForm::~ChartForm()
+{
+ delete m_printer;
+}
+
+
+void ChartForm::init()
+{
+ setCaption( "Chart" );
+ m_filename = TQString::null;
+ m_changed = FALSE;
+
+ m_elements[0] = Element( Element::INVALID, red );
+ m_elements[1] = Element( Element::INVALID, cyan );
+ m_elements[2] = Element( Element::INVALID, blue );
+ m_elements[3] = Element( Element::INVALID, yellow );
+ m_elements[4] = Element( Element::INVALID, green );
+ m_elements[5] = Element( Element::INVALID, magenta );
+ m_elements[6] = Element( Element::INVALID, darkYellow );
+ m_elements[7] = Element( Element::INVALID, darkRed );
+ m_elements[8] = Element( Element::INVALID, darkCyan );
+ m_elements[9] = Element( Element::INVALID, darkGreen );
+ m_elements[10] = Element( Element::INVALID, darkMagenta );
+ m_elements[11] = Element( Element::INVALID, darkBlue );
+ for ( int i = 12; i < MAX_ELEMENTS; ++i ) {
+ double x = (double(i) / MAX_ELEMENTS) * 360;
+ int y = (int(x * 256) % 105) + 151;
+ int z = ((i * 17) % 105) + 151;
+ m_elements[i] = Element( Element::INVALID, TQColor( int(x), y, z, TQColor::Hsv ) );
+ }
+}
+
+void ChartForm::closeEvent( TQCloseEvent * )
+{
+ fileQuit();
+}
+
+
+void ChartForm::fileNew()
+{
+ if ( okToClear() ) {
+ init();
+ drawElements();
+ }
+}
+
+
+void ChartForm::fileOpen()
+{
+ if ( !okToClear() )
+ return;
+
+ TQString filename = TQFileDialog::getOpenFileName(
+ TQString::null, "Charts (*.cht)", this,
+ "file open", "Chart -- File Open" );
+ if ( !filename.isEmpty() )
+ load( filename );
+ else
+ statusBar()->message( "File Open abandoned", 2000 );
+}
+
+
+void ChartForm::fileSaveAs()
+{
+ TQString filename = TQFileDialog::getSaveFileName(
+ TQString::null, "Charts (*.cht)", this,
+ "file save as", "Chart -- File Save As" );
+ if ( !filename.isEmpty() ) {
+ int answer = 0;
+ if ( TQFile::exists( filename ) )
+ answer = TQMessageBox::warning(
+ this, "Chart -- Overwrite File",
+ TQString( "Overwrite\n\'%1\'?" ).
+ arg( filename ),
+ "&Yes", "&No", TQString::null, 1, 1 );
+ if ( answer == 0 ) {
+ m_filename = filename;
+ updateRecentFiles( filename );
+ fileSave();
+ return;
+ }
+ }
+ statusBar()->message( "Saving abandoned", 2000 );
+}
+
+
+void ChartForm::fileOpenRecent( int index )
+{
+ if ( !okToClear() )
+ return;
+
+ load( m_recentFiles[index] );
+}
+
+
+void ChartForm::updateRecentFiles( const TQString& filename )
+{
+ if ( m_recentFiles.find( filename ) != m_recentFiles.end() )
+ return;
+
+ m_recentFiles.push_back( filename );
+ if ( m_recentFiles.count() > MAX_RECENTFILES )
+ m_recentFiles.pop_front();
+
+ updateRecentFilesMenu();
+}
+
+
+void ChartForm::updateRecentFilesMenu()
+{
+ for ( int i = 0; i < MAX_RECENTFILES; ++i ) {
+ if ( fileMenu->findItem( i ) )
+ fileMenu->removeItem( i );
+ if ( i < int(m_recentFiles.count()) )
+ fileMenu->insertItem( TQString( "&%1 %2" ).
+ arg( i + 1 ).arg( m_recentFiles[i] ),
+ this, SLOT( fileOpenRecent(int) ),
+ 0, i );
+ }
+}
+
+
+void ChartForm::fileQuit()
+{
+ if ( okToClear() ) {
+ saveOptions();
+ qApp->exit( 0 );
+ }
+}
+
+
+bool ChartForm::okToClear()
+{
+ if ( m_changed ) {
+ TQString msg;
+ if ( m_filename.isEmpty() )
+ msg = "Unnamed chart ";
+ else
+ msg = TQString( "Chart '%1'\n" ).arg( m_filename );
+ msg += "has been changed.";
+
+ int x = TQMessageBox::information( this, "Chart -- Unsaved Changes",
+ msg, "&Save", "Cancel", "&Abandon",
+ 0, 1 );
+ switch( x ) {
+ case 0: // Save
+ fileSave();
+ break;
+ case 1: // Cancel
+ default:
+ return FALSE;
+ case 2: // Abandon
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+
+void ChartForm::saveOptions()
+{
+ TQSettings settings;
+ settings.insertSearchPath( TQSettings::Windows, WINDOWS_REGISTRY );
+ settings.writeEntry( APP_KEY + "WindowWidth", width() );
+ settings.writeEntry( APP_KEY + "WindowHeight", height() );
+ settings.writeEntry( APP_KEY + "WindowX", x() );
+ settings.writeEntry( APP_KEY + "WindowY", y() );
+ settings.writeEntry( APP_KEY + "ChartType", int(m_chartType) );
+ settings.writeEntry( APP_KEY + "AddValues", int(m_addValues) );
+ settings.writeEntry( APP_KEY + "Decimals", m_decimalPlaces );
+ settings.writeEntry( APP_KEY + "Font", m_font.toString() );
+ for ( int i = 0; i < int(m_recentFiles.count()); ++i )
+ settings.writeEntry( APP_KEY + "File" + TQString::number( i + 1 ),
+ m_recentFiles[i] );
+}
+
+
+void ChartForm::optionsSetData()
+{
+ SetDataForm *setDataForm = new SetDataForm( &m_elements, m_decimalPlaces, this );
+ if ( setDataForm->exec() ) {
+ m_changed = TRUE;
+ drawElements();
+ }
+ delete setDataForm;
+}
+
+
+void ChartForm::setChartType( ChartType chartType )
+{
+ m_chartType = chartType;
+ switch ( m_chartType ) {
+ case PIE:
+ optionsPieChartAction->setOn( TRUE );
+ break;
+ case VERTICAL_BAR:
+ optionsVerticalBarChartAction->setOn( TRUE );
+ break;
+ case HORIZONTAL_BAR:
+ optionsHorizontalBarChartAction->setOn( TRUE );
+ break;
+ }
+}
+
+
+void ChartForm::updateChartType( TQAction *action )
+{
+ if ( action == optionsPieChartAction ) {
+ m_chartType = PIE;
+ }
+ else if ( action == optionsHorizontalBarChartAction ) {
+ m_chartType = HORIZONTAL_BAR;
+ }
+ else if ( action == optionsVerticalBarChartAction ) {
+ m_chartType = VERTICAL_BAR;
+ }
+
+ drawElements();
+}
+
+
+void ChartForm::optionsSetFont()
+{
+ bool ok;
+ TQFont font = TQFontDialog::getFont( &ok, m_font, this );
+ if ( ok ) {
+ m_font = font;
+ drawElements();
+ }
+}
+
+
+void ChartForm::optionsSetOptions()
+{
+ OptionsForm *optionsForm = new OptionsForm( this );
+ optionsForm->chartTypeComboBox->setCurrentItem( m_chartType );
+ optionsForm->setFont( m_font );
+ switch ( m_addValues ) {
+ case NO:
+ optionsForm->noRadioButton->setChecked( TRUE );
+ break;
+ case YES:
+ optionsForm->yesRadioButton->setChecked( TRUE );
+ break;
+ case AS_PERCENTAGE:
+ optionsForm->asPercentageRadioButton->setChecked( TRUE );
+ break;
+ }
+ optionsForm->decimalPlacesSpinBox->setValue( m_decimalPlaces );
+ if ( optionsForm->exec() ) {
+ setChartType( ChartType(
+ optionsForm->chartTypeComboBox->currentItem()) );
+ m_font = optionsForm->font();
+ if ( optionsForm->noRadioButton->isChecked() )
+ m_addValues = NO;
+ else if ( optionsForm->yesRadioButton->isChecked() )
+ m_addValues = YES;
+ else if ( optionsForm->asPercentageRadioButton->isChecked() )
+ m_addValues = AS_PERCENTAGE;
+ m_decimalPlaces = optionsForm->decimalPlacesSpinBox->value();
+ drawElements();
+ }
+ delete optionsForm;
+}
+
+
+void ChartForm::helpHelp()
+{
+ statusBar()->message( "Help is not implemented yet", 2000 );
+}
+
+
+void ChartForm::helpAbout()
+{
+ TQMessageBox::about( this, "Chart -- About",
+ "<center><h1><font color=blue>Chart<font></h1></center>"
+ "<p>Chart your data with <i>chart</i>.</p>"
+ );
+}
+
+
+void ChartForm::helpAboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "Chart -- About TQt" );
+}
+