CMake/Source/WXDialog/cmWXCacheProperty.cxx

359 lines
10 KiB
C++

/*=========================================================================
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);
}