summaryrefslogtreecommitdiffstats
path: root/Source/WXDialog/cmWXCacheProperty.cxx
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2002-09-19 13:47:18 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2002-09-19 13:47:18 (GMT)
commitf1d40eef93220d502fca94667a64188f7f9fe094 (patch)
tree6c480cc04fce7b1706ba87c848eb129ae5288e14 /Source/WXDialog/cmWXCacheProperty.cxx
parent0dafd886fc719b5fbb0d56f30262ba09c76a160b (diff)
downloadCMake-f1d40eef93220d502fca94667a64188f7f9fe094.zip
CMake-f1d40eef93220d502fca94667a64188f7f9fe094.tar.gz
CMake-f1d40eef93220d502fca94667a64188f7f9fe094.tar.bz2
Initial import of wxWindows dialog
Diffstat (limited to 'Source/WXDialog/cmWXCacheProperty.cxx')
-rw-r--r--Source/WXDialog/cmWXCacheProperty.cxx358
1 files changed, 358 insertions, 0 deletions
diff --git a/Source/WXDialog/cmWXCacheProperty.cxx b/Source/WXDialog/cmWXCacheProperty.cxx
new file mode 100644
index 0000000..c85a94e
--- /dev/null
+++ b/Source/WXDialog/cmWXCacheProperty.cxx
@@ -0,0 +1,358 @@
+/*=========================================================================
+
+ Program: Insight Segmentation & Registration Toolkit
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Insight Consortium. All rights reserved.
+ See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+
+// cmCacheProperty.cxx : implementation file
+//
+
+#include "cmWXCacheProperty.h"
+
+#include "cmSystemTools.h"
+#include "cmWXMainFrame.h"
+
+static int GetClientHeight(wxWindow* w)
+{
+ wxSize size = w->GetSize();
+ return size.GetHeight();
+}
+
+#define cmMAX(x, y) (((x)>(y))?(x):(y))
+
+cmCacheProperty::cmCacheProperty(cmMainFrame* mf, const std::string& name) : m_Name(name)
+{
+ this->m_HelpString = "";
+ this->m_Value = "";
+ this->m_NewValue = true;
+ this->m_Removed = false;
+ this->m_ItemType = cmCacheProperty::NOTHING;
+ this->m_MainFrame = mf;
+ this->m_Advanced = false;
+
+ this->m_KeyWindow = 0;
+ this->m_ValueWindow = 0;
+
+ this->m_TextControl = 0;
+}
+
+cmCacheProperty::~cmCacheProperty()
+{
+}
+
+int cmCacheProperty::Display(wxSizer* s, wxPanel* win)
+{
+ int maxheight = 0;
+ this->m_TextControl = 0;
+ wxPanel* panel = new wxPanel(win, -1);
+ wxPanel* panel1 = new wxPanel(panel, -1);
+ wxBoxSizer* sizer = 0;
+ wxColor bgcolor = panel->GetBackgroundColour();
+ sizer = new wxBoxSizer(wxHORIZONTAL);
+ wxBoxSizer* sizer1 = new wxBoxSizer(wxHORIZONTAL);
+ wxStaticText* name = new wxStaticText(panel1, -1, this->m_Name.c_str());
+ this->SetupMenu(name);
+ this->SetupMenu(panel1);
+ sizer1->Add(name, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+ maxheight = cmMAX(maxheight, ::GetClientHeight(panel1));
+ sizer->Add(5, 5, 0);
+ sizer->Add(panel1, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+
+ panel1->SetAutoLayout( TRUE );
+ panel1->SetSizer(sizer1);
+ sizer1->Fit(panel1);
+ sizer1->SetSizeHints(panel1);
+ sizer1->Layout();
+
+ panel->SetAutoLayout( TRUE );
+ panel->SetSizer(sizer);
+ sizer->Fit(panel);
+ sizer->SetSizeHints(panel);
+ sizer->Layout();
+ wxControl* value = 0;
+ if ( this->m_NewValue )
+ {
+ wxColor brightred = wxColor(252, 102, 100);
+ panel->SetBackgroundColour(brightred);
+ panel1->SetBackgroundColour(brightred);
+ name->SetBackgroundColour(brightred);
+ }
+ else
+ {
+ panel->SetBackgroundColour(*wxWHITE);
+ panel1->SetBackgroundColour(*wxWHITE);
+ name->SetBackgroundColour(*wxWHITE);
+ }
+
+ this->m_KeyWindow = panel;
+
+ panel = new wxPanel(win, -1);
+ sizer = new wxBoxSizer(wxHORIZONTAL);
+ panel->SetBackgroundColour(*wxWHITE);
+ //panel->SetBackgroundColour(*wxGREEN)
+
+#ifdef __APPLE__
+ wxColor buttoncolor = *wxWHITE;
+#else // __APPLE__
+ wxColor buttoncolor = bgcolor;
+#endif // __APPLE__
+
+ switch ( this->m_ItemType )
+ {
+ case cmCacheProperty::CHECKBOX:
+ sizer->Add(5, 5, 0);
+ value = new wxCheckBox(panel, -1, "");
+ this->ConnectEvent(value, wxEVT_COMMAND_CHECKBOX_CLICKED,
+ (wxObjectEventFunction) &cmMainFrame::OnPropertyChanged);
+ this->SetupMenu(value);
+ if ( strcmp(this->GetValue().c_str(), "ON") == 0 )
+ {
+ static_cast<wxCheckBox*>(value)->SetValue(true);
+ }
+ break;
+ case cmCacheProperty::EDIT:
+ value = new wxTextCtrl(panel, -1, this->m_Value.c_str());
+ maxheight = cmMAX(maxheight, ::GetClientHeight(value));
+ this->ConnectEvent(value, wxEVT_COMMAND_TEXT_UPDATED,
+ (wxObjectEventFunction) &cmMainFrame::OnPropertyChanged);
+ this->SetupMenu(value);
+ break;
+ case cmCacheProperty::FILE:
+ sizer->Add(5, 5, 0);
+ value = new wxStaticText(panel, -1, this->m_Value.c_str());
+ maxheight = cmMAX(maxheight, ::GetClientHeight(value));
+ sizer->Add(value, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+ this->m_TextControl = value;
+ this->SetupMenu(value);
+ value = new wxButton(panel, -1, "...", wxDefaultPosition,
+ wxSize(20, maxheight - 4));
+ maxheight = cmMAX(maxheight, ::GetClientHeight(value));
+ value->SetBackgroundColour(buttoncolor);
+ sizer->Add(value, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ this->ConnectEvent(value, wxEVT_COMMAND_BUTTON_CLICKED,
+ (wxObjectEventFunction) &cmMainFrame::OnPropertyChanged);
+ this->SetupMenu(value);
+ value = 0;
+ break;
+ case cmCacheProperty::PATH:
+ sizer->Add(5, 5, 0);
+ value = new wxStaticText(panel, -1, this->m_Value.c_str());
+ maxheight = cmMAX(maxheight, ::GetClientHeight(value));
+ sizer->Add(value, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+ this->m_TextControl = value;
+ this->SetupMenu(value);
+ value = new wxButton(panel, -1, "...", wxDefaultPosition,
+ wxSize(20, maxheight - 4));
+ maxheight = cmMAX(maxheight, ::GetClientHeight(value));
+ value->SetBackgroundColour(buttoncolor);
+ sizer->Add(value, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ this->ConnectEvent(value, wxEVT_COMMAND_BUTTON_CLICKED,
+ (wxObjectEventFunction) &cmMainFrame::OnPropertyChanged);
+ this->SetupMenu(value);
+ value = 0;
+ break;
+ default:
+ value = new wxStaticText(panel, -1, this->m_Value.c_str());
+ maxheight = cmMAX(maxheight, ::GetClientHeight(value));
+ this->m_TextControl = value;
+ break;
+ }
+ //panel->Fit();
+ this->m_ValueWindow = panel;
+ //panel->Fit();
+ //win->Fit();
+ if ( value )
+ {
+ sizer->Add(value, 1, wxALIGN_LEFT | wxGROW | wxALL | wxALIGN_CENTER_VERTICAL);
+ }
+
+ //s->Layout();
+
+ panel->SetAutoLayout( TRUE );
+ panel->SetSizer(sizer);
+ sizer->Fit(panel);
+ sizer->SetSizeHints(panel);
+ sizer->Layout();
+
+
+ if ( this->m_NewValue )
+ {
+ s->Prepend(this->m_ValueWindow, 1, wxGROW | wxLEFT | wxRIGHT );
+ s->Prepend(this->m_KeyWindow, 1, wxGROW | wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL );
+ }
+ else
+ {
+ s->Add(this->m_KeyWindow, 1, wxGROW | wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL );
+ s->Add(this->m_ValueWindow, 1, wxGROW | wxLEFT | wxRIGHT );
+ }
+
+ this->SetupMenu(this->m_KeyWindow);
+ this->SetupMenu(this->m_ValueWindow);
+
+ int x1, x2, xm, s1, s2, sm;
+ win->GetSize(&xm, &sm);
+ this->m_KeyWindow->GetSize(&x1, &s1);
+ this->m_ValueWindow->GetSize(&x2, &s2);
+ int m = s1;
+ if ( s2 > m )
+ {
+ m = s2;
+ }
+ this->m_KeyWindow->SetSize(x1, m);
+ this->m_ValueWindow->SetSize(x2, m);
+ //std::cout << "Size of panels: " << sm << "," << s1 << ", " << s2 << " max: " << maxheight<< std::endl;
+ return maxheight;
+}
+
+void cmCacheProperty::Remove(wxSizer* sizer, wxPanel*)
+{
+ if ( this->m_KeyWindow )
+ {
+ sizer->Remove(this->m_KeyWindow);
+ this->m_KeyWindow->Destroy();
+ }
+ if ( this->m_ValueWindow )
+ {
+ sizer->Remove(this->m_ValueWindow);
+ this->m_ValueWindow->Destroy();
+ }
+ this->m_KeyWindow = 0;
+ this->m_ValueWindow = 0;
+ //sizer->Layout();
+ //win->Fit();
+}
+
+void cmCacheProperty::ConnectEvent(wxWindow* win, wxEventType et, wxObjectEventFunction func)
+{
+ if ( !this->m_MainFrame )
+ {
+ return;
+ }
+ win->SetClientData(this);
+ this->m_MainFrame->Connect(win->GetId(), et, func);
+}
+
+void cmCacheProperty::ConnectEventTo(wxWindow* win, wxEventType et,
+ wxObjectEventFunction func)
+{
+ if ( !this->m_MainFrame )
+ {
+ return;
+ }
+ win->SetClientData(this);
+ this->m_MainFrame->ConnectEventTo(win, et, func);
+}
+
+void cmCacheProperty::OnPropertyChanged(wxEvent& event)
+{
+ if ( event.GetEventType() == wxEVT_RIGHT_DOWN )
+ {
+ }
+ else
+ {
+ switch ( this->m_ItemType )
+ {
+ case cmCacheProperty::EDIT: this->OnEntryChanged(event); break;
+ case cmCacheProperty::FILE: this->OnFileBrowseButton(event); break;
+ case cmCacheProperty::CHECKBOX: this->OnCheckboxButton(event); break;
+ case cmCacheProperty::PATH: this->OnPathBrowseButton(event); break;
+ }
+ }
+}
+
+void cmCacheProperty::OnFileBrowseButton(wxEvent&)
+{
+ std::string path = cmSystemTools::GetFilenamePath(this->m_Value);
+ std::string file = cmSystemTools::GetFilenameName(this->m_Value);
+
+ if ( path == "NOTFOUND" )
+ {
+ path = this->m_MainFrame->GetBuildDir();
+ }
+
+ wxFileDialog dialog (
+ this->m_MainFrame,
+ _T("Select file"),
+ path.c_str(),
+ file.c_str(),
+ _T("All files|*.*")
+ );
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ std::string str = "";
+ if ( this->m_TextControl )
+ {
+ str += dialog.GetPath().c_str();
+ static_cast<wxStaticText*>(this->m_TextControl)->SetLabel(str.c_str());
+ }
+ this->SetValue(str.c_str());
+ }
+}
+
+void cmCacheProperty::OnPathBrowseButton(wxEvent&)
+{
+ std::string path = this->m_Value;
+ if ( path == "NOTFOUND" )
+ {
+ path = this->m_MainFrame->GetBuildDir();
+ }
+
+ wxDirDialog dialog ( this->m_MainFrame, _T("Select directory"), path.c_str() );
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ if ( this->m_TextControl )
+ {
+ static_cast<wxStaticText*>(this->m_TextControl)->SetLabel(dialog.GetPath());
+ }
+ this->SetValue(dialog.GetPath().c_str());
+ }
+}
+
+void cmCacheProperty::OnCheckboxButton(wxEvent& event)
+{
+ wxCheckBox* widget = static_cast<wxCheckBox*>( event.GetEventObject() );
+ if ( !widget )
+ {
+ return;
+ }
+ int val = widget->GetValue();
+ if ( val )
+ {
+ this->SetValue("ON");
+ }
+ else
+ {
+ this->SetValue("OFF");
+ }
+}
+
+void cmCacheProperty::OnEntryChanged(wxEvent& event)
+{
+ wxTextCtrl* widget = static_cast<wxTextCtrl*>( event.GetEventObject() );
+ if ( !widget )
+ {
+ return;
+ }
+ this->SetValue(static_cast<const char*>(widget->GetValue()));
+}
+
+void cmCacheProperty::SetupMenu(wxWindow* win)
+{
+ this->ConnectEventTo(win, wxEVT_RIGHT_DOWN,
+ (wxObjectEventFunction) &cmMainFrame::OnPopupMenu);
+ this->ConnectEventTo(win, wxEVT_MOTION,
+ (wxObjectEventFunction) &cmMainFrame::OnCacheStatusBar);
+}