mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-29 02:19:18 -05:00
Initial checkin new wx dialog
This commit is contained in:
@@ -0,0 +1,856 @@
|
||||
/*=========================================================================
|
||||
|
||||
Program: WXDialog - wxWidgets X-platform GUI Front-End for CMake
|
||||
Module: $RCSfile$
|
||||
Language: C++
|
||||
Date: $Date$
|
||||
Version: $Revision$
|
||||
|
||||
Author: Jorgen Bodde
|
||||
|
||||
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
|
||||
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html 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.
|
||||
|
||||
=========================================================================*/
|
||||
|
||||
/* for compilers that support precompilation
|
||||
includes "wx/wx.h" */
|
||||
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#include "PropertyList.h"
|
||||
#include "app_resources.h"
|
||||
|
||||
#include "../cmCacheManager.h"
|
||||
#include "../cmSystemTools.h"
|
||||
#include "../cmake.h"
|
||||
|
||||
BEGIN_EVENT_TABLE( wxPropertyList, wxGrid )
|
||||
EVT_GRID_CELL_LEFT_CLICK( wxPropertyList::OnSelectCell )
|
||||
EVT_GRID_CELL_CHANGE( wxPropertyList::OnCellChange )
|
||||
EVT_GRID_CMD_CELL_RIGHT_CLICK( wxID_ANY, wxPropertyList::OnCellPopup )
|
||||
EVT_MENU ( ID_CACHE_DELETE, wxPropertyList::OnDeleteCache )
|
||||
EVT_MENU ( ID_CACHE_IGNORE, wxPropertyList::OnIgnoreCache )
|
||||
EVT_MENU ( ID_CACHE_BROWSE, wxPropertyList::OnBrowseItem )
|
||||
EVT_SIZE ( wxPropertyList::OnSizeGrid )
|
||||
EVT_CHAR ( wxPropertyList::OnKeyPressed )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
#if 0
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxGridCellPathEditor
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxGridCellPathEditor::wxGridCellPathEditor()
|
||||
{
|
||||
m_maxChars = 0;
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::Create(wxWindow* parent,
|
||||
wxWindowID id,
|
||||
wxEvtHandler* evtHandler)
|
||||
{
|
||||
m_control = new wxTextCtrl(parent, id, wxEmptyString,
|
||||
wxDefaultPosition, wxDefaultSize
|
||||
#if defined(__WXMSW__)
|
||||
, wxTE_PROCESS_TAB | wxTE_AUTO_SCROLL
|
||||
#endif
|
||||
);
|
||||
//
|
||||
// m_button = new wxButton(parent, id+1, _("..."),
|
||||
// wxDefaultPosition, wxDefaultSize);
|
||||
//
|
||||
|
||||
// set max length allowed in the textctrl, if the parameter was set
|
||||
if (m_maxChars != 0)
|
||||
{
|
||||
((wxTextCtrl*)m_control)->SetMaxLength(m_maxChars);
|
||||
}
|
||||
|
||||
wxGridCellEditor::Create(parent, id, evtHandler);
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::PaintBackground(const wxRect& WXUNUSED(rectCell),
|
||||
wxGridCellAttr * WXUNUSED(attr))
|
||||
{
|
||||
// as we fill the entire client area, don't do anything here to minimize
|
||||
// flicker
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::SetSize(const wxRect& rectOrig)
|
||||
{
|
||||
wxRect rect(rectOrig);
|
||||
|
||||
// Make the edit control large enough to allow for internal
|
||||
// margins
|
||||
//
|
||||
// TODO: remove this if the text ctrl sizing is improved esp. for
|
||||
// unix
|
||||
//
|
||||
#if defined(__WXGTK__)
|
||||
if (rect.x != 0)
|
||||
{
|
||||
rect.x += 1;
|
||||
rect.y += 1;
|
||||
rect.width -= 1;
|
||||
rect.height -= 1;
|
||||
}
|
||||
#else // !GTK
|
||||
int extra_x = ( rect.x > 2 )? 2 : 1;
|
||||
|
||||
// MB: treat MSW separately here otherwise the caret doesn't show
|
||||
// when the editor is in the first row.
|
||||
#if defined(__WXMSW__)
|
||||
int extra_y = 2;
|
||||
#else
|
||||
int extra_y = ( rect.y > 2 )? 2 : 1;
|
||||
#endif // MSW
|
||||
|
||||
#if defined(__WXMOTIF__)
|
||||
extra_x *= 2;
|
||||
extra_y *= 2;
|
||||
#endif
|
||||
rect.SetLeft( wxMax(0, rect.x - extra_x) );
|
||||
rect.SetTop( wxMax(0, rect.y - extra_y) );
|
||||
rect.SetRight( rect.GetRight() + 2*extra_x );
|
||||
rect.SetBottom( rect.GetBottom() + 2*extra_y );
|
||||
#endif // GTK/!GTK
|
||||
|
||||
wxGridCellEditor::SetSize(rect);
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::BeginEdit(int row, int col, wxGrid* grid)
|
||||
{
|
||||
wxASSERT_MSG(m_control,
|
||||
wxT("The wxGridCellEditor must be Created first!"));
|
||||
|
||||
m_startValue = grid->GetTable()->GetValue(row, col);
|
||||
|
||||
DoBeginEdit(m_startValue);
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::DoBeginEdit(const wxString& startValue)
|
||||
{
|
||||
Text()->SetValue(startValue);
|
||||
Text()->SetInsertionPointEnd();
|
||||
Text()->SetSelection(-1,-1);
|
||||
Text()->SetFocus();
|
||||
}
|
||||
|
||||
bool wxGridCellPathEditor::EndEdit(int row, int col,
|
||||
wxGrid* grid)
|
||||
{
|
||||
wxASSERT_MSG(m_control,
|
||||
wxT("The wxGridCellEditor must be Created first!"));
|
||||
|
||||
bool changed = false;
|
||||
wxString value = Text()->GetValue();
|
||||
if (value != m_startValue)
|
||||
changed = true;
|
||||
|
||||
if (changed)
|
||||
grid->GetTable()->SetValue(row, col, value);
|
||||
|
||||
m_startValue = wxEmptyString;
|
||||
// No point in setting the text of the hidden control
|
||||
//Text()->SetValue(m_startValue);
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
void wxGridCellPathEditor::Reset()
|
||||
{
|
||||
wxASSERT_MSG(m_control,
|
||||
wxT("The wxGridCellEditor must be Created first!"));
|
||||
|
||||
DoReset(m_startValue);
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::DoReset(const wxString& startValue)
|
||||
{
|
||||
Text()->SetValue(startValue);
|
||||
Text()->SetInsertionPointEnd();
|
||||
}
|
||||
|
||||
bool wxGridCellPathEditor::IsAcceptedKey(wxKeyEvent& event)
|
||||
{
|
||||
return wxGridCellEditor::IsAcceptedKey(event);
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::StartingKey(wxKeyEvent& event)
|
||||
{
|
||||
// Since this is now happening in the EVT_CHAR event EmulateKeyPress is no
|
||||
// longer an appropriate way to get the character into the text control.
|
||||
// Do it ourselves instead. We know that if we get this far that we have
|
||||
// a valid character, so not a whole lot of testing needs to be done.
|
||||
|
||||
wxTextCtrl* tc = Text();
|
||||
wxChar ch;
|
||||
long pos;
|
||||
|
||||
#if wxUSE_UNICODE
|
||||
ch = event.GetUnicodeKey();
|
||||
if (ch <= 127)
|
||||
ch = (wxChar)event.GetKeyCode();
|
||||
#else
|
||||
ch = (wxChar)event.GetKeyCode();
|
||||
#endif
|
||||
switch (ch)
|
||||
{
|
||||
case WXK_DELETE:
|
||||
// delete the character at the cursor
|
||||
pos = tc->GetInsertionPoint();
|
||||
if (pos < tc->GetLastPosition())
|
||||
tc->Remove(pos, pos+1);
|
||||
break;
|
||||
|
||||
case WXK_BACK:
|
||||
// delete the character before the cursor
|
||||
pos = tc->GetInsertionPoint();
|
||||
if (pos > 0)
|
||||
tc->Remove(pos-1, pos);
|
||||
break;
|
||||
|
||||
default:
|
||||
tc->WriteText(ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::HandleReturn( wxKeyEvent &event )
|
||||
{
|
||||
#if defined(__WXMOTIF__) || defined(__WXGTK__)
|
||||
// wxMotif needs a little extra help...
|
||||
size_t pos = (size_t)( Text()->GetInsertionPoint() );
|
||||
wxString s( Text()->GetValue() );
|
||||
s = s.Left(pos) + wxT("\n") + s.Mid(pos);
|
||||
Text()->SetValue(s);
|
||||
Text()->SetInsertionPoint( pos );
|
||||
#else
|
||||
// the other ports can handle a Return key press
|
||||
//
|
||||
event.Skip();
|
||||
#endif
|
||||
}
|
||||
|
||||
void wxGridCellPathEditor::SetParameters(const wxString& params)
|
||||
{
|
||||
if ( !params )
|
||||
{
|
||||
// reset to default
|
||||
m_maxChars = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
long tmp;
|
||||
if ( !params.ToLong(&tmp) )
|
||||
{
|
||||
wxLogDebug(_T("Invalid wxGridCellPathEditor parameter string '%s' ignored"), params.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_maxChars = (size_t)tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// return the value in the text control
|
||||
wxString wxGridCellPathEditor::GetValue() const
|
||||
{
|
||||
return Text()->GetValue();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// wxPropertyItem
|
||||
|
||||
// returns true when this property item is a filepath
|
||||
bool wxPropertyItem::IsFilePath()
|
||||
{
|
||||
return m_nItemType == wxPropertyList::FILE;
|
||||
}
|
||||
|
||||
// returns true when this property item is a dir path
|
||||
bool wxPropertyItem::IsDirPath()
|
||||
{
|
||||
return m_nItemType == wxPropertyList::PATH;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// wxPropertyList
|
||||
|
||||
wxPropertyList::~wxPropertyList()
|
||||
{
|
||||
WX_CLEAR_ARRAY(m_PropertyItems);
|
||||
}
|
||||
|
||||
int wxPropertyList::AddItem(const wxString &txt)
|
||||
{
|
||||
// TODO: Add the item to the grid!
|
||||
|
||||
//int nIndex = AddString(txt);
|
||||
//return nIndex;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// order = 0 sorted (not supported yet)
|
||||
// order = 1 add to top
|
||||
// order = 2 add to bottom
|
||||
int wxPropertyList::AddPropItem(wxPropertyItem* pItem, int order)
|
||||
{
|
||||
m_PropertyItems.Add(pItem);
|
||||
if(pItem->GetAdvanced() && ! m_ShowAdvanced)
|
||||
return 0;
|
||||
|
||||
// disable in progress editing
|
||||
HideControls();
|
||||
|
||||
return AddPropertyToGrid(pItem, order);
|
||||
}
|
||||
|
||||
int wxPropertyList::AddPropertyToGrid(wxPropertyItem *pItem, int order)
|
||||
{
|
||||
int row = 0;
|
||||
if(order == 1)
|
||||
InsertRows(0,1);
|
||||
else
|
||||
{
|
||||
AppendRows(1);
|
||||
row = GetNumberRows() - 1;
|
||||
}
|
||||
|
||||
// initialise the type of renderer
|
||||
if(pItem->GetItemType() == wxPropertyList::CHECKBOX)
|
||||
{
|
||||
SetCellRenderer(row, 1, new wxGridCellBoolRenderer);
|
||||
SetCellEditor(row, 1, new wxGridCellBoolEditor);
|
||||
}
|
||||
|
||||
#ifdef __LINUX__
|
||||
// fix to make sure scrollbars are drawn properly
|
||||
wxGrid::AdjustScrollbars();
|
||||
#endif
|
||||
|
||||
// the property display is read only
|
||||
UpdatePropertyItem(pItem, row);
|
||||
return row;
|
||||
}
|
||||
|
||||
void wxPropertyList::AddProperty(const char* name, const char* value, const char* helpString,
|
||||
int type, const char* comboItems, bool reverseOrder, bool advanced)
|
||||
{
|
||||
wxPropertyItem* pItem = 0;
|
||||
|
||||
// add or update the property item
|
||||
for(size_t i = 0; i < m_PropertyItems.Count(); i++)
|
||||
{
|
||||
if(m_PropertyItems[i]->GetPropName().IsSameAs(name))
|
||||
{
|
||||
pItem = m_PropertyItems[i];
|
||||
if(!pItem->GetCurValue().IsSameAs(value))
|
||||
{
|
||||
pItem->SetCurValue(value);
|
||||
pItem->SetHelpString(helpString);
|
||||
pItem->SetAdvanced(advanced);
|
||||
|
||||
// update the property item
|
||||
int row = FindProperty(pItem);
|
||||
if(row != -1)
|
||||
UpdatePropertyItem(pItem, row);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// if it is not found, then create a new one
|
||||
if(!pItem)
|
||||
{
|
||||
pItem = new wxPropertyItem(name, value, helpString, type, comboItems);
|
||||
pItem->SetAdvanced(advanced);
|
||||
|
||||
AddPropItem(pItem, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void wxPropertyList::UpdateGridView()
|
||||
{
|
||||
// make sure all items are shown, remove items that should not be shown
|
||||
bool keepItem;
|
||||
int row;
|
||||
for(size_t i = 0; i < m_PropertyItems.Count(); i++)
|
||||
{
|
||||
// to begin with, does this item fit the query?
|
||||
keepItem = m_strQuery.IsEmpty() || (m_PropertyItems[i]->GetPropName().Find(m_strQuery) != -1);
|
||||
if(keepItem)
|
||||
{
|
||||
// when advanced items are allowed to be shown, keep when ok
|
||||
if(!m_ShowAdvanced)
|
||||
keepItem = !m_PropertyItems[i]->GetAdvanced();
|
||||
}
|
||||
|
||||
// find the item, if not present but keep is true, add, if
|
||||
// present but keep is false, remove
|
||||
row = -1;
|
||||
for(size_t j = 0; j < (size_t)GetNumberRows(); j++)
|
||||
{
|
||||
if(m_PropertyItems[i]->GetPropName().IsSameAs(GetCellValue(j, 0)))
|
||||
{
|
||||
row = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(row == -1 && keepItem)
|
||||
AddPropertyToGrid(m_PropertyItems[i], (m_ShowAdvanced ? 2 : 0));
|
||||
else if(row != -1 && !keepItem)
|
||||
DeleteRows(row, 1);
|
||||
}
|
||||
|
||||
#ifdef __LINUX__
|
||||
// fix to make sure scrollbars are drawn properly
|
||||
wxGrid::AdjustScrollbars();
|
||||
#endif
|
||||
}
|
||||
|
||||
void wxPropertyList::HideControls()
|
||||
{
|
||||
DisableCellEditControl();
|
||||
}
|
||||
|
||||
void wxPropertyList::RemoveProperty(wxPropertyItem *pItem)
|
||||
{
|
||||
HideControls();
|
||||
|
||||
// look for property in grid, delete it when present
|
||||
for(size_t j = 0; j < (size_t)GetNumberRows(); j++)
|
||||
{
|
||||
if(pItem->GetPropName().IsSameAs(GetCellValue(j, 0), false))
|
||||
{
|
||||
DeleteRows(j, 1);
|
||||
|
||||
#ifdef __LINUX__
|
||||
// fix to make sure scrollbars are drawn properly
|
||||
wxGrid::AdjustScrollbars();
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// delete the item from the list
|
||||
m_PropertyItems.Remove(pItem);
|
||||
delete pItem;
|
||||
}
|
||||
|
||||
wxPropertyItem *wxPropertyList::FindPropertyByName(const wxString &name)
|
||||
{
|
||||
for(size_t i = 0; i < m_PropertyItems.Count(); i++)
|
||||
{
|
||||
// we have an advanced item, go through table and if not present, show it
|
||||
if(m_PropertyItems[i]->GetPropName().IsSameAs(name, true))
|
||||
return m_PropertyItems[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
void wxPropertyList::OnIgnore()
|
||||
{
|
||||
if(m_curSel == -1 || this->GetCount() <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
wxPropertyItem* pItem = (wxPropertyItem*) GetItemDataPtr(m_curSel);
|
||||
pItem->m_curValue = "IGNORE";
|
||||
InvalidateList();
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
void wxPropertyList::OnDelete()
|
||||
{
|
||||
if(m_curSel == -1 || this->GetCount() <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
wxPropertyItem* pItem = (wxPropertyItem*) GetItemDataPtr(m_curSel);
|
||||
m_CMakeSetupDialog->GetCMakeInstance()->GetCacheManager()->RemoveCacheEntry(pItem->m_propName);
|
||||
m_PropertyItems.erase(pItem);
|
||||
delete pItem;
|
||||
this->DeleteString(m_curSel);
|
||||
this->HideControls();
|
||||
this->SetTopIndex(0);
|
||||
InvalidateList();
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
void wxPropertyList::OnHelp()
|
||||
{
|
||||
if(m_curSel == -1 || this->GetCount() <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
wxPropertyItem* pItem = (wxPropertyItem*) GetItemDataPtr(m_curSel);
|
||||
MessageBox(pItem->m_HelpString, pItem->m_propName, MB_OK|MB_ICONINFORMATION);
|
||||
}
|
||||
*/
|
||||
|
||||
void wxPropertyList::RemoveAll()
|
||||
{
|
||||
WX_CLEAR_ARRAY(m_PropertyItems);
|
||||
m_generatedProjects = false;
|
||||
|
||||
if(GetNumberRows() > 0)
|
||||
DeleteRows(0, GetNumberRows());
|
||||
|
||||
m_strQuery.Empty();
|
||||
|
||||
#ifdef __LINUX__
|
||||
// fix to make sure scrollbars are drawn properly
|
||||
wxGrid::AdjustScrollbars();
|
||||
#endif
|
||||
}
|
||||
|
||||
void wxPropertyList::ShowAdvanced()
|
||||
{
|
||||
// set flag in the control
|
||||
m_ShowAdvanced = true;
|
||||
UpdateGridView();
|
||||
}
|
||||
|
||||
|
||||
void wxPropertyList::HideAdvanced()
|
||||
{
|
||||
// set flag in the control
|
||||
m_ShowAdvanced = false;
|
||||
UpdateGridView();
|
||||
}
|
||||
|
||||
int wxPropertyList::FindProperty(wxPropertyItem *pItem)
|
||||
{
|
||||
if(GetNumberRows() > 0 && pItem != 0)
|
||||
{
|
||||
// find the property the traditional way
|
||||
for(size_t j = 0; j < (size_t)GetNumberRows(); j++)
|
||||
{
|
||||
if(pItem->GetPropName().IsSameAs(GetCellValue(j, 0)))
|
||||
return j;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
wxPropertyItem *wxPropertyList::GetPropertyItemFromRow(int row)
|
||||
{
|
||||
if(row < GetNumberRows() && row >= 0)
|
||||
{
|
||||
wxString str = GetCellValue(row, 0);
|
||||
// find the property the traditional way
|
||||
for(size_t i = 0; i < (size_t)m_PropertyItems.Count(); i++)
|
||||
{
|
||||
if(m_PropertyItems[i]->GetPropName().IsSameAs(str))
|
||||
return m_PropertyItems[i];
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool wxPropertyList::UpdatePropertyItem(wxPropertyItem *pItem, int row)
|
||||
{
|
||||
wxCHECK(row < GetNumberRows(), false);
|
||||
|
||||
// reflect the property's state to match the grid row
|
||||
|
||||
SetReadOnly(row, 0);
|
||||
// TODO: Make this a UpdatePropItem where ADVANCED, and new edit values are reflected
|
||||
SetCellValue(row,0, pItem->GetPropName());
|
||||
|
||||
// boolean renderer
|
||||
if(pItem->GetItemType() == wxPropertyList::CHECKBOX)
|
||||
{
|
||||
// translate ON or TRUE (case insensitive to a checkbox)
|
||||
if(pItem->GetCurValue().IsSameAs(wxT("ON"), false) ||
|
||||
pItem->GetCurValue().IsSameAs(wxT("TRUE"), false))
|
||||
SetCellValue(row, 1, wxT("1"));
|
||||
else
|
||||
SetCellValue(row, 1, wxT("0"));
|
||||
}
|
||||
else
|
||||
{
|
||||
// for normal path values, give bold in cell when
|
||||
// the NOTFOUND is present, for emphasis
|
||||
wxString str = pItem->GetPropName() + wxT("-NOTFOUND");
|
||||
if(pItem->GetCurValue().IsSameAs(str))
|
||||
{
|
||||
wxFont fnt = GetCellFont(row, 0);
|
||||
fnt.SetWeight(wxFONTWEIGHT_BOLD);
|
||||
SetCellFont(row, 1, fnt);
|
||||
}
|
||||
else
|
||||
SetCellFont(row, 1, GetCellFont(row, 0));
|
||||
|
||||
SetCellValue(row,1, pItem->GetCurValue());
|
||||
}
|
||||
|
||||
if(pItem->GetCurValue().IsSameAs("IGNORE"))
|
||||
{
|
||||
// ignored cell is completely dimmed
|
||||
wxColour col(192,192,192);
|
||||
SetCellTextColour(row, 1, col);
|
||||
}
|
||||
else
|
||||
{
|
||||
// we colour paths blue, filenames green, all else black
|
||||
wxColour col;
|
||||
if(pItem->IsDirPath())
|
||||
col.Set(0,0,255);
|
||||
else if(pItem->IsFilePath())
|
||||
col.Set(0,128,0);
|
||||
else
|
||||
col = GetCellTextColour(row, 0);
|
||||
|
||||
SetCellTextColour(row, 1, col);
|
||||
}
|
||||
|
||||
if(pItem->GetNewValue())
|
||||
{
|
||||
// new cell is red
|
||||
wxColour col(255,100,100);
|
||||
SetCellBackgroundColour(row, 0, col);
|
||||
}
|
||||
else
|
||||
{
|
||||
// old cell is grey
|
||||
wxColour col(192, 192, 192);
|
||||
SetCellBackgroundColour(row, 0, col);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void wxPropertyList::OnSelectCell( wxGridEvent& event )
|
||||
{
|
||||
this->SetFocus();
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void wxPropertyList::OnCellChange( wxGridEvent& event )
|
||||
{
|
||||
int row = event.GetRow();
|
||||
|
||||
wxPropertyItem *pItem = GetPropertyItemFromRow(row);
|
||||
if(pItem && row != wxNOT_FOUND)
|
||||
{
|
||||
// write propery back, and set as new
|
||||
pItem->SetNewValue(true);
|
||||
|
||||
// write back bool
|
||||
if(pItem->GetItemType() == CHECKBOX)
|
||||
{
|
||||
if(GetCellValue(row, 1).IsSameAs("1"))
|
||||
pItem->SetCurValue("ON");
|
||||
else
|
||||
pItem->SetCurValue("OFF");
|
||||
}
|
||||
else
|
||||
pItem->SetCurValue(GetCellValue(row, 1));
|
||||
|
||||
UpdatePropertyItem(pItem, row);
|
||||
event.Skip();
|
||||
}
|
||||
}
|
||||
|
||||
void wxPropertyList::OnCellPopup( wxGridEvent& event )
|
||||
{
|
||||
wxPoint pt;
|
||||
int row = event.GetRow();
|
||||
|
||||
//pt = ::wxGetMousePosition();
|
||||
//ScreenToClient(pt);
|
||||
|
||||
//row = YToRow(pt.y);
|
||||
if(row != wxNOT_FOUND)
|
||||
{
|
||||
wxPropertyItem *pItem = GetPropertyItemFromRow(row);
|
||||
|
||||
if(pItem)
|
||||
{
|
||||
// select the row first if already in selection, don't
|
||||
// this will clear the previous selection
|
||||
if(!IsInSelection(row, 0))
|
||||
SelectRow(row);
|
||||
|
||||
// show popup menu
|
||||
wxMenu *menu = AppResources::CreatePopupMenu();
|
||||
|
||||
// enable when it is browsable, and selected one only
|
||||
wxMenuItem *item = menu->FindItem(ID_CACHE_BROWSE);
|
||||
if(item)
|
||||
item->Enable(IsSelectedItemBrowsable());
|
||||
|
||||
PopupMenu(menu);
|
||||
|
||||
delete menu;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wxPropertyList::OnIgnoreCache( wxCommandEvent& event )
|
||||
{
|
||||
HideControls();
|
||||
|
||||
// ignore all selected items
|
||||
for(size_t i = 0; i < (size_t)GetNumberRows(); i++)
|
||||
{
|
||||
if(IsInSelection(i, 0))
|
||||
{
|
||||
wxPropertyItem *pItem = GetPropertyItemFromRow(i);
|
||||
if(pItem)
|
||||
{
|
||||
pItem->SetCurValue("IGNORE");
|
||||
UpdatePropertyItem(pItem, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wxPropertyList::OnDeleteCache( wxCommandEvent& event )
|
||||
{
|
||||
HideControls();
|
||||
|
||||
// convert selections to prop items
|
||||
wxArrayPtrVoid items;
|
||||
for(size_t i = 0; i < (size_t)GetNumberRows(); i++)
|
||||
{
|
||||
// if selected, query for removal
|
||||
if(IsInSelection(i, 0))
|
||||
{
|
||||
wxPropertyItem *pItem = GetPropertyItemFromRow(i);
|
||||
if(pItem)
|
||||
items.Add((void *)pItem);
|
||||
}
|
||||
}
|
||||
|
||||
// now delete all prop items in cells
|
||||
for(size_t i = 0; i < items.Count(); i++)
|
||||
RemoveProperty((wxPropertyItem *)items[i]);
|
||||
}
|
||||
|
||||
void wxPropertyList::OnBrowseItem( wxCommandEvent& event )
|
||||
{
|
||||
BrowseSelectedItem();
|
||||
}
|
||||
|
||||
bool wxPropertyList::IsSelectedItemBrowsable(int row)
|
||||
{
|
||||
// when there is only one selection, and our current item
|
||||
// is browsable, make sure it can be selected.
|
||||
wxPropertyItem *pItem = 0;
|
||||
|
||||
size_t count = 0;
|
||||
for(size_t i = 0; i < (size_t)GetNumberRows() && (count < 2); i++)
|
||||
{
|
||||
if(IsInSelection(i, 0))
|
||||
{
|
||||
if(!pItem)
|
||||
pItem = GetPropertyItemFromRow(i);
|
||||
count ++;
|
||||
}
|
||||
}
|
||||
|
||||
// if we found nothing, take row (because the event EVT_GRID_CELL_SELECTED
|
||||
// deselects the cells first before selecting the new one again
|
||||
if(row != -1 && !pItem)
|
||||
{
|
||||
pItem = GetPropertyItemFromRow(row);
|
||||
count ++; // needed because of next loop
|
||||
}
|
||||
|
||||
// only one item allowed to select
|
||||
if(pItem && count == 1)
|
||||
{
|
||||
if(pItem)
|
||||
return pItem->IsDirPath() || pItem->IsFilePath();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void wxPropertyList::BrowseSelectedItem()
|
||||
{
|
||||
HideControls();
|
||||
|
||||
for(size_t i = 0; i < (size_t)GetNumberRows(); i++)
|
||||
{
|
||||
if(IsInSelection(i, 0))
|
||||
{
|
||||
// browse for file or directory
|
||||
wxPropertyItem *pItem = GetPropertyItemFromRow(i);
|
||||
if(pItem)
|
||||
{
|
||||
wxString title;
|
||||
wxString str = pItem->GetPropName() + _("-NOTFOUND");
|
||||
if(pItem->GetCurValue().IsSameAs(str, true))
|
||||
str.Empty();
|
||||
else
|
||||
str = pItem->GetCurValue();
|
||||
|
||||
// browse the directory path
|
||||
|
||||
if(pItem->IsDirPath())
|
||||
{
|
||||
title = _("Select path for ") + pItem->GetPropName();
|
||||
str = ::wxDirSelector(title, str, 0, wxDefaultPosition, this);
|
||||
}
|
||||
else if(pItem->IsFilePath())
|
||||
{
|
||||
title = _("Select file for ") + pItem->GetPropName();
|
||||
str = ::wxFileSelector(title, str, _(""), _(""), _(MC_DEFAULT_WILDCARD), wxFILE_MUST_EXIST, this);
|
||||
}
|
||||
else
|
||||
str.Empty();
|
||||
|
||||
if(!str.IsEmpty())
|
||||
{
|
||||
pItem->SetCurValue(str.c_str());
|
||||
UpdatePropertyItem(pItem, i);
|
||||
}
|
||||
}
|
||||
|
||||
// only allow one item to browse
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wxPropertyList::OnSizeGrid( wxSizeEvent &event )
|
||||
{
|
||||
int width, height;
|
||||
|
||||
// make sure the grid's cells are equally adjusted
|
||||
GetClientSize(&width, &height);
|
||||
SetDefaultColSize(width / 2, true);
|
||||
|
||||
wxGrid::AdjustScrollbars();
|
||||
}
|
||||
|
||||
void wxPropertyList::OnKeyPressed( wxKeyEvent &event )
|
||||
{
|
||||
event.Skip();
|
||||
}
|
||||
Reference in New Issue
Block a user