wxWidgets/utils/ogl/samples/studio/dialogs.cpp
1999-02-07 23:56:40 +00:00

526 lines
14 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: dialogs.cpp
// Purpose: Implements Studio dialogs
// Author: Julian Smart
// Modified by:
// Created: 12/07/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence:
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
// #pragma implementation
#endif
// For compilers that support precompilation, includes "wx.h".
#include <wx/wxprec.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
#include <wx/resource.h>
#include "dialogs.h"
#include "doc.h"
#include "view.h"
#include "studio.h"
#include "studio_resources.h"
IMPLEMENT_CLASS(csLabelEditingDialog, wxDialog)
BEGIN_EVENT_TABLE(csLabelEditingDialog, wxDialog)
EVT_BUTTON(wxID_OK, csLabelEditingDialog::OnOK)
END_EVENT_TABLE()
csLabelEditingDialog::csLabelEditingDialog(wxWindow* parent)
{
LoadFromResource(parent, "shape_label_dialog");
// Accelerators
wxAcceleratorEntry entries[1];
entries[0].Set(wxACCEL_CTRL, WXK_RETURN, wxID_OK);
wxAcceleratorTable accel(1, entries);
SetAcceleratorTable(accel);
Centre();
wxTextCtrl* textCtrl = (wxTextCtrl*) FindWindow(ID_LABELTEXT);
wxASSERT( (textCtrl != NULL) );
// textCtrl->SetAcceleratorTable(accel);
textCtrl->SetFocus();
}
void csLabelEditingDialog::OnOK(wxCommandEvent& event)
{
wxTextCtrl* textCtrl = (wxTextCtrl*) FindWindow(ID_LABELTEXT);
wxASSERT( (textCtrl != NULL) );
SetShapeLabel(textCtrl->GetValue());
wxDialog::OnOK(event);
}
void csLabelEditingDialog::SetShapeLabel(const wxString& label)
{
wxTextCtrl* textCtrl = (wxTextCtrl*) FindWindow(ID_LABELTEXT);
wxASSERT( (textCtrl != NULL) );
m_label = label;
textCtrl->SetValue(label);
}
IMPLEMENT_CLASS(csSettingsDialog, wxDialog)
BEGIN_EVENT_TABLE(csSettingsDialog, wxDialog)
EVT_BUTTON(wxID_OK, csSettingsDialog::OnOK)
END_EVENT_TABLE()
#define PROPERTY_DIALOG_WIDTH 400
#define PROPERTY_DIALOG_HEIGHT 400
// For 400x400 settings dialog, size your panels to about 375x325 in dialog editor
csSettingsDialog::csSettingsDialog(wxWindow* parent):
wxDialog(parent, -1, "Settings", wxPoint(0, 0), wxSize(PROPERTY_DIALOG_WIDTH, PROPERTY_DIALOG_HEIGHT))
{
m_generalSettings = NULL;
m_diagramSettings = NULL;
m_notebook = new wxNotebook(this, ID_PROPERTY_NOTEBOOK,
wxPoint(2, 2), wxSize(PROPERTY_DIALOG_WIDTH - 4, PROPERTY_DIALOG_HEIGHT - 4));
m_generalSettings = new wxPanel;
bool success = m_generalSettings->LoadFromResource(m_notebook, "general_settings_dialog");
wxASSERT_MSG( (success), "Could not load general settings panel.");
m_notebook->AddPage(m_generalSettings, "General", TRUE);
m_diagramSettings = new wxPanel;
success = m_diagramSettings->LoadFromResource(m_notebook, "diagram_settings_dialog");
wxASSERT_MSG( (success), "Could not load diagram settings panel.");
m_notebook->AddPage(m_diagramSettings, "Diagram");
int largeButtonWidth = 70;
int largeButtonHeight = 22;
wxButton* okButton = new wxButton(this, wxID_OK, "OK", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
wxButton* cancelButton = new wxButton(this, wxID_CANCEL, "Cancel", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
wxButton* helpButton = new wxButton(this, wxID_HELP, "Help", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
// Constraints for the notebook
wxLayoutConstraints *c = new wxLayoutConstraints;
c->top.SameAs (this, wxTop, 5);
c->left.SameAs (this, wxLeft, 5);
c->right.SameAs (this, wxRight, 5);
c->bottom.SameAs (cancelButton, wxTop, 5);
m_notebook->SetConstraints(c);
// Constraints for the Help button
c = new wxLayoutConstraints;
c->width.AsIs();
c->height.AsIs();
c->right.SameAs (this, wxRight, 5);
c->bottom.SameAs (this, wxBottom, 5);
helpButton->SetConstraints(c);
// Constraints for the Cancel button
c = new wxLayoutConstraints;
c->width.AsIs();
c->height.AsIs();
c->right.SameAs (helpButton, wxLeft, 5);
c->bottom.SameAs (this, wxBottom, 5);
cancelButton->SetConstraints(c);
// Constraints for the OK button
c = new wxLayoutConstraints;
c->width.AsIs();
c->height.AsIs();
c->right.SameAs (cancelButton, wxLeft, 5);
c->bottom.SameAs (this, wxBottom, 5);
okButton->SetConstraints(c);
okButton->SetDefault();
okButton->SetFocus();
Layout();
Centre(wxBOTH);
}
void csSettingsDialog::OnOK(wxCommandEvent& event)
{
wxDialog::OnOK(event);
}
bool csSettingsDialog::TransferDataToWindow()
{
wxTextCtrl* gridSpacing = (wxTextCtrl*) m_diagramSettings->FindWindow(ID_GRID_SPACING);
wxASSERT_MSG( (gridSpacing != (wxTextCtrl*) NULL), "Could not find grid spacing control.");
wxChoice* gridStyle = (wxChoice*) m_diagramSettings->FindWindow(ID_GRID_STYLE);
wxASSERT_MSG( (gridStyle != (wxChoice*) NULL), "Could not find grid style control.");
gridStyle->SetSelection(wxGetApp().GetGridStyle());
wxString str;
str.Printf("%d", wxGetApp().GetGridSpacing());
gridSpacing->SetValue(str);
return TRUE;
}
bool csSettingsDialog::TransferDataFromWindow()
{
wxTextCtrl* gridSpacing = (wxTextCtrl*) m_diagramSettings->FindWindow(ID_GRID_SPACING);
wxASSERT_MSG( (gridSpacing != (wxTextCtrl*) NULL), "Could not find grid spacing control.");
wxChoice* gridStyle = (wxChoice*) m_diagramSettings->FindWindow(ID_GRID_STYLE);
wxASSERT_MSG( (gridStyle != (wxChoice*) NULL), "Could not find grid style control.");
wxGetApp().SetGridStyle(gridStyle->GetSelection());
wxGetApp().SetGridSpacing(atoi(gridSpacing->GetValue()));
if (wxGetApp().GetGridStyle() == csGRID_STYLE_DOTTED)
{
wxMessageBox("Dotted grid style not yet implemented.", "Studio", wxICON_EXCLAMATION);
return FALSE;
}
// Apply settings to all open diagram documents
wxNode* node = wxGetApp().GetDocManager()->GetDocuments().First();
while (node)
{
wxDocument* doc = (wxDocument*) node->Data();
if (doc->IsKindOf(CLASSINFO(csDiagramDocument)))
{
csDiagramDocument* diagramDoc = (csDiagramDocument*) doc;
wxDiagram* diagram = (wxDiagram*) diagramDoc->GetDiagram();
diagram->SetGridSpacing((double) wxGetApp().GetGridSpacing());
switch (wxGetApp().GetGridStyle())
{
case csGRID_STYLE_NONE:
{
diagram->SetSnapToGrid(FALSE);
break;
}
case csGRID_STYLE_INVISIBLE:
{
diagram->SetSnapToGrid(TRUE);
break;
}
case csGRID_STYLE_DOTTED:
{
// TODO (not implemented in OGL)
break;
}
}
}
node = node->Next();
}
return TRUE;
}
/*
* Shape properties dialog (tabbed)
*/
IMPLEMENT_CLASS(csShapePropertiesDialog, wxDialog)
BEGIN_EVENT_TABLE(csShapePropertiesDialog, wxDialog)
EVT_BUTTON(wxID_OK, csShapePropertiesDialog::OnOK)
END_EVENT_TABLE()
#define SHAPE_PROPERTY_DIALOG_WIDTH 400
#define SHAPE_PROPERTY_DIALOG_HEIGHT 400
// For 400x400 settings dialog, size your panels to about 375x325 in dialog editor
csShapePropertiesDialog::csShapePropertiesDialog(wxWindow* parent, const wxString& title,
wxPanel* attributeDialog, const wxString& attributeDialogName):
wxDialog(parent, -1, title, wxPoint(0, 0), wxSize(SHAPE_PROPERTY_DIALOG_WIDTH, SHAPE_PROPERTY_DIALOG_HEIGHT))
{
m_attributeDialog = attributeDialog;
m_alternativeAttributeDialog = NULL;
m_generalPropertiesDialog = NULL;
m_notebook = new wxNotebook(this, ID_SHAPE_PROPERTY_NOTEBOOK,
wxPoint(2, 2), wxSize(SHAPE_PROPERTY_DIALOG_WIDTH - 4, SHAPE_PROPERTY_DIALOG_HEIGHT - 4));
m_generalPropertiesDialog = new csGeneralShapePropertiesDialog;
bool success = m_generalPropertiesDialog->LoadFromResource(m_notebook, "general_shape_properties_dialog");
wxASSERT_MSG( (success), "Could not load general properties panel.");
m_notebook->AddPage(m_generalPropertiesDialog, "General");
success = m_attributeDialog->LoadFromResource(m_notebook, attributeDialogName);
if (!success)
{
wxMessageBox("Could not load the attribute dialog for this shape.", "Studio", wxICON_EXCLAMATION);
delete m_attributeDialog;
m_attributeDialog = NULL;
}
else
{
m_notebook->AddPage(m_attributeDialog, "Attributes");
}
// Try the alternative dialog (test code)
wxString str(attributeDialogName);
str += "1";
m_alternativeAttributeDialog = new wxPanel;
success = m_alternativeAttributeDialog->LoadFromResource(m_notebook, str);
if (success)
{
m_notebook->AddPage(m_alternativeAttributeDialog, "Attributes (alternative)");
}
else
{
delete m_alternativeAttributeDialog;
m_alternativeAttributeDialog = NULL;
}
int largeButtonWidth = 70;
int largeButtonHeight = 22;
wxButton* okButton = new wxButton(this, wxID_OK, "OK", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
wxButton* cancelButton = new wxButton(this, wxID_CANCEL, "Cancel", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
wxButton* helpButton = new wxButton(this, wxID_HELP, "Help", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
// Constraints for the notebook
wxLayoutConstraints *c = new wxLayoutConstraints;
c->top.SameAs (this, wxTop, 5);
c->left.SameAs (this, wxLeft, 5);
c->right.SameAs (this, wxRight, 5);
c->bottom.SameAs (helpButton, wxTop, 5);
m_notebook->SetConstraints(c);
// Constraints for the Help button
c = new wxLayoutConstraints;
c->width.AsIs();
c->height.AsIs();
c->right.SameAs (this, wxRight, 5);
c->bottom.SameAs (this, wxBottom, 5);
helpButton->SetConstraints(c);
// Constraints for the Cancel button
c = new wxLayoutConstraints;
c->width.AsIs();
c->height.AsIs();
c->right.SameAs (helpButton, wxLeft, 5);
c->bottom.SameAs (this, wxBottom, 5);
cancelButton->SetConstraints(c);
// Constraints for the OK button
c = new wxLayoutConstraints;
c->width.AsIs();
c->height.AsIs();
c->right.SameAs (cancelButton, wxLeft, 5);
c->bottom.SameAs (this, wxBottom, 5);
okButton->SetConstraints(c);
okButton->SetDefault();
okButton->SetFocus();
SetDefaults();
Layout();
Centre(wxBOTH);
}
void csShapePropertiesDialog::OnOK(wxCommandEvent& event)
{
wxTextCtrl* textCtrl = (wxTextCtrl*) m_generalPropertiesDialog->FindWindow(ID_LABELTEXT);
wxASSERT( (textCtrl != NULL) );
m_generalPropertiesDialog->SetShapeLabel(textCtrl->GetValue());
wxDialog::OnOK(event);
}
// Set some suitable defaults in the attribute dialogs (in the first instance,
// just set all wxChoices to the first element)
void csShapePropertiesDialog::SetDefaults()
{
if (!m_attributeDialog)
return;
wxNode* node = m_attributeDialog->GetChildren().First();
while (node)
{
wxWindow* child = (wxWindow*) node->Data();
if (child->IsKindOf(CLASSINFO(wxChoice)))
{
wxChoice* choice = (wxChoice*) child;
choice->SetSelection(0);
}
node = node->Next();
}
if (!m_alternativeAttributeDialog)
return;
node = m_alternativeAttributeDialog->GetChildren().First();
while (node)
{
wxWindow* child = (wxWindow*) node->Data();
if (child->IsKindOf(CLASSINFO(wxChoice)))
{
wxChoice* choice = (wxChoice*) child;
choice->SetSelection(0);
}
node = node->Next();
}
}
/*
* csGeneralShapePropertiesDialog
*/
IMPLEMENT_CLASS(csGeneralShapePropertiesDialog, wxPanel)
BEGIN_EVENT_TABLE(csGeneralShapePropertiesDialog, wxPanel)
END_EVENT_TABLE()
csGeneralShapePropertiesDialog::csGeneralShapePropertiesDialog()
{
}
void csGeneralShapePropertiesDialog::SetShapeLabel(const wxString& label)
{
wxTextCtrl* textCtrl = (wxTextCtrl*) FindWindow(ID_LABELTEXT);
wxASSERT( (textCtrl != NULL) );
m_label = label;
textCtrl->SetValue(label);
}
/*
* csThinRectangleDialog
*/
IMPLEMENT_CLASS(csThinRectangleDialog, wxPanel)
BEGIN_EVENT_TABLE(csThinRectangleDialog, wxPanel)
END_EVENT_TABLE()
csThinRectangleDialog::csThinRectangleDialog()
{
}
/*
* csWideRectangleDialog
*/
IMPLEMENT_CLASS(csWideRectangleDialog, wxPanel)
BEGIN_EVENT_TABLE(csWideRectangleDialog, wxPanel)
END_EVENT_TABLE()
csWideRectangleDialog::csWideRectangleDialog()
{
}
/*
* csTriangleDialog
*/
IMPLEMENT_CLASS(csTriangleDialog, wxPanel)
BEGIN_EVENT_TABLE(csTriangleDialog, wxPanel)
END_EVENT_TABLE()
csTriangleDialog::csTriangleDialog()
{
}
/*
* csSemiCircleDialog
*/
IMPLEMENT_CLASS(csSemiCircleDialog, wxPanel)
BEGIN_EVENT_TABLE(csSemiCircleDialog, wxPanel)
END_EVENT_TABLE()
csSemiCircleDialog::csSemiCircleDialog()
{
}
/*
* csCircleDialog
*/
IMPLEMENT_CLASS(csCircleDialog, wxPanel)
BEGIN_EVENT_TABLE(csCircleDialog, wxPanel)
END_EVENT_TABLE()
csCircleDialog::csCircleDialog()
{
}
/*
* csCircleShadowDialog
*/
IMPLEMENT_CLASS(csCircleShadowDialog, wxPanel)
BEGIN_EVENT_TABLE(csCircleShadowDialog, wxPanel)
END_EVENT_TABLE()
csCircleShadowDialog::csCircleShadowDialog()
{
}
/*
* csOctagonDialog
*/
IMPLEMENT_CLASS(csOctagonDialog, wxPanel)
BEGIN_EVENT_TABLE(csOctagonDialog, wxPanel)
END_EVENT_TABLE()
csOctagonDialog::csOctagonDialog()
{
}
/*
* csGroupDialog
*/
IMPLEMENT_CLASS(csGroupDialog, wxPanel)
BEGIN_EVENT_TABLE(csGroupDialog, wxPanel)
END_EVENT_TABLE()
csGroupDialog::csGroupDialog()
{
}
/*
* csTextBoxDialog
*/
IMPLEMENT_CLASS(csTextBoxDialog, wxPanel)
BEGIN_EVENT_TABLE(csTextBoxDialog, wxPanel)
END_EVENT_TABLE()
csTextBoxDialog::csTextBoxDialog()
{
}