632 lines
18 KiB
C++
632 lines
18 KiB
C++
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
// dfn_dialog.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "georges_edit.h"
|
|
#include "georges_edit_view.h"
|
|
#include "georges_edit_doc.h"
|
|
#include "dfn_dialog.h"
|
|
#include "left_view.h"
|
|
#include "action.h"
|
|
|
|
#include "nel/misc/path.h"
|
|
#include "nel/georges/type.h"
|
|
|
|
using namespace std;
|
|
using namespace NLMISC;
|
|
using namespace NLGEORGES;
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
CDfnDialog::CDfnDialog () : CBaseDialog (IDR_MAINFRAME)
|
|
{
|
|
//{{AFX_DATA_INIT(CDfnDialog)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
View = NULL;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CDfnDialog)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
BEGIN_MESSAGE_MAP(CDfnDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CDfnDialog)
|
|
ON_WM_SIZE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CBaseDialog::OnSize(nType, cx, cy);
|
|
|
|
// TODO: Add your message handler code here
|
|
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
BOOL CDfnDialog::OnInitDialog()
|
|
{
|
|
CBaseDialog::OnInitDialog();
|
|
|
|
RECT viewRect;
|
|
View->GetClientRect (&viewRect);
|
|
uint virtualWidth = std::max ((uint)MinViewWidth, (uint)(viewRect.right-viewRect.left));
|
|
|
|
// Refresh sizes
|
|
CBaseDialog::resizeWidgets (virtualWidth, 0);
|
|
|
|
// Get first item coordinate
|
|
RECT currentPos;
|
|
getFirstItemPos (currentPos);
|
|
|
|
// Create the type combo
|
|
setStaticSize (currentPos);
|
|
LabelParents.Create ("Parents:", WS_VISIBLE, currentPos, this);
|
|
initWidget (LabelParents);
|
|
getNextPosLabel (currentPos);
|
|
|
|
setListSize (currentPos, SmallWidget, ParentHeight);
|
|
Parents.create (WS_TABSTOP, currentPos, this, LtParents);
|
|
Parents.insertColumn (0, "Parent Dfn");
|
|
Parents.Dialog = this;
|
|
Parents.recalcColumn ();
|
|
initWidget (Parents);
|
|
getNextPos (currentPos);
|
|
|
|
|
|
// Create the type combo
|
|
setStaticSize (currentPos);
|
|
LabelStruct.Create ("Structure:", WS_VISIBLE, currentPos, this);
|
|
initWidget (LabelStruct);
|
|
getNextPosLabel (currentPos);
|
|
|
|
setListSize (currentPos, Width, DfnHeight);
|
|
Struct.create (WS_TABSTOP, currentPos, this, LtStruct);
|
|
Struct.insertColumn (0, "Name");
|
|
Struct.insertColumn (1, "Type");
|
|
Struct.insertColumn (2, "Value");
|
|
Struct.insertColumn (3, "Default");
|
|
Struct.insertColumn (4, "FilenameExt");
|
|
Struct.Dialog = this;
|
|
Struct.recalcColumn ();
|
|
initWidget (Struct);
|
|
getNextPos (currentPos);
|
|
|
|
registerLastControl ();
|
|
|
|
resizeWidgets ();
|
|
|
|
UpdateData (FALSE);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::OnOK ()
|
|
{
|
|
Parents.UpdateData ();
|
|
Struct.UpdateData ();
|
|
|
|
CWnd *focusWnd = CWnd::GetFocus ();
|
|
if (focusWnd)
|
|
{
|
|
focusWnd = focusWnd->GetParent ();
|
|
if (focusWnd)
|
|
{
|
|
if (focusWnd->m_hWnd == Parents.m_hWnd)
|
|
{
|
|
Parents.onOK ();
|
|
}
|
|
else if (focusWnd->m_hWnd == Struct.m_hWnd)
|
|
{
|
|
Struct.onOK ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::OnCancel ()
|
|
{
|
|
CWnd *focusWnd = CWnd::GetFocus ();
|
|
if (focusWnd)
|
|
{
|
|
focusWnd = focusWnd->GetParent ();
|
|
if (focusWnd)
|
|
{
|
|
if (focusWnd->m_hWnd == Parents.m_hWnd)
|
|
{
|
|
Parents.onCancel ();
|
|
return;
|
|
}
|
|
else if (focusWnd->m_hWnd == Struct.m_hWnd)
|
|
{
|
|
Struct.onCancel ();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
CBaseDialog::OnCancel ();
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::getFromDocument (const NLGEORGES::CFormDfn &dfn)
|
|
{
|
|
if (View)
|
|
{
|
|
// Add the parents
|
|
Parents.ListCtrl.DeleteAllItems ();
|
|
uint parent;
|
|
for (parent=0; parent<dfn.getNumParent (); parent++)
|
|
{
|
|
// Add the label and value
|
|
Parents.ListCtrl.InsertItem (parent, dfn.getParentFilename (parent).c_str ());
|
|
}
|
|
|
|
// Add the struct element
|
|
Struct.ListCtrl.DeleteAllItems ();
|
|
uint elm;
|
|
for (elm=0; elm<dfn.getNumEntry (); elm++)
|
|
{
|
|
// Add the label and value
|
|
Struct.ListCtrl.InsertItem (elm, dfn.getEntry (elm).getName ().c_str());
|
|
switch (elm, dfn.getEntry (elm).getType ())
|
|
{
|
|
case UFormDfn::EntryType:
|
|
Struct.ListCtrl.SetItemText (elm, 1, dfn.getEntry (elm).getArrayFlag () ? "Type array" : "Type");
|
|
Struct.ListCtrl.SetItemText (elm, 4, dfn.getEntry (elm).getFilenameExt ().c_str());
|
|
break;
|
|
case UFormDfn::EntryDfn:
|
|
Struct.ListCtrl.SetItemText (elm, 1, dfn.getEntry (elm).getArrayFlag () ? "Dfn array" : "Dfn");
|
|
break;
|
|
case UFormDfn::EntryVirtualDfn:
|
|
Struct.ListCtrl.SetItemText (elm, 1, "Virtual Dfn");
|
|
break;
|
|
}
|
|
Struct.ListCtrl.SetItemText (elm, 2, dfn.getEntry (elm).getFilename ().c_str());
|
|
Struct.ListCtrl.SetItemText (elm, 3, dfn.getEntry (elm).getDefault ().c_str());
|
|
}
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::setParentsToDocument ()
|
|
{
|
|
CGeorgesEditDoc *doc = View->GetDocument ();
|
|
if (doc)
|
|
{
|
|
// Build a vector of string
|
|
vector<string> vectValue (Parents.ListCtrl.GetItemCount ());
|
|
|
|
// For each string
|
|
uint parent;
|
|
for (parent=0; parent<(uint)Parents.ListCtrl.GetItemCount (); parent++)
|
|
{
|
|
// Add the label and value
|
|
CString str = Parents.ListCtrl.GetItemText ( parent, 0);
|
|
vectValue[parent] = str;
|
|
}
|
|
|
|
// Modify the document
|
|
if (!doc->modify (new CActionStringVector (IAction::DfnParents, vectValue, *doc, "", doc->getLeftView ()->getCurrentSelectionId (), 0)))
|
|
getFromDocument (*doc->getDfnPtr ());
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::setStructToDocument ()
|
|
{
|
|
CGeorgesEditDoc *doc = View->GetDocument ();
|
|
if (doc)
|
|
{
|
|
// Add the entries
|
|
vector<vector<string> > stringVector (Struct.ListCtrl.GetItemCount ());
|
|
uint elm;
|
|
for (elm=0; elm<stringVector.size (); elm++)
|
|
{
|
|
// Resize the array
|
|
stringVector[elm].resize (5);
|
|
|
|
uint subElm;
|
|
for (subElm = 0; subElm<5; subElm++)
|
|
{
|
|
// Get the name
|
|
CString name= Struct.ListCtrl.GetItemText (elm, subElm);
|
|
stringVector[elm][subElm] = (const char*)name;
|
|
}
|
|
}
|
|
doc->modify (new CActionStringVectorVector (IAction::DfnStructure, stringVector, *doc, doc->getLeftView ()->getCurrentSelectionId (), 0));
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
LRESULT CDfnDialog::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case LC_CHANGE:
|
|
if (wParam == LtParents)
|
|
setParentsToDocument ();
|
|
else
|
|
setStructToDocument ();
|
|
break;
|
|
}
|
|
|
|
return CDialog::WindowProc(message, wParam, lParam);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
CEditListCtrl::TItemEdit CDfnEditListCtrl::getItemEditMode (uint item, uint subItem)
|
|
{
|
|
if (subItem == 0)
|
|
return CEditListCtrl::EditMemCombo;
|
|
else if (subItem == 1)
|
|
return CEditListCtrl::EditFixedCombo;
|
|
else if (subItem == 2)
|
|
{
|
|
string type = ListCtrl.GetItemText (item, 1);
|
|
if (type != "Virtual Dfn")
|
|
return CEditListCtrl::EditMemCombo;
|
|
}
|
|
else if (subItem == 3)
|
|
{
|
|
string type = ListCtrl.GetItemText (item, 1);
|
|
if ((type == "Type") || (type == "Type array"))
|
|
return CEditListCtrl::EditMemCombo;
|
|
}
|
|
else if (subItem == 4)
|
|
{
|
|
string type = ListCtrl.GetItemText (item, 1);
|
|
if ((type == "Type") || (type == "Type array"))
|
|
return CEditListCtrl::EditMemCombo;
|
|
}
|
|
return CEditListCtrl::NoEdit;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnEditListCtrl::getComboBoxStrings (uint item, uint subItem, std::vector<std::string> &retStrings)
|
|
{
|
|
if (subItem == 1)
|
|
{
|
|
retStrings.reserve (5);
|
|
retStrings.push_back ("Type");
|
|
retStrings.push_back ("Dfn");
|
|
retStrings.push_back ("Virtual Dfn");
|
|
retStrings.push_back ("Type array");
|
|
retStrings.push_back ("Dfn array");
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnEditListCtrl::getMemComboBoxProp (uint item, uint subItem, std::string ®Adr, bool &browse)
|
|
{
|
|
if (subItem == 0)
|
|
{
|
|
browse = false;
|
|
regAdr = GEORGES_EDIT_BASE_REG_KEY"\\Label MemCombo";
|
|
}
|
|
else if (subItem == 2)
|
|
{
|
|
browse = true;
|
|
|
|
// Get type string
|
|
string type = ListCtrl.GetItemText (item, 1);
|
|
if ((type == "Type") || (type == "Type array"))
|
|
regAdr = GEORGES_EDIT_BASE_REG_KEY"\\Type MemCombo";
|
|
else if ((type == "Dfn") || (type == "Dfn array"))
|
|
regAdr = GEORGES_EDIT_BASE_REG_KEY"\\Dfn MemCombo";
|
|
}
|
|
else if (subItem == 3)
|
|
{
|
|
browse = false;
|
|
regAdr = GEORGES_EDIT_BASE_REG_KEY"\\Default MemCombo";
|
|
}
|
|
else if (subItem == 3)
|
|
{
|
|
browse = false;
|
|
regAdr = GEORGES_EDIT_BASE_REG_KEY"\\FilenameExt MemCombo";
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnEditListCtrl::getNewItemText (uint item, uint subItem, std::string &ret)
|
|
{
|
|
if (subItem == 0)
|
|
ret = "new";
|
|
else if (subItem == 1)
|
|
ret = "Type";
|
|
else if (subItem == 2)
|
|
ret = theApp.DefaultType;
|
|
else if (subItem == 3)
|
|
ret = "";
|
|
else if (subItem == 4)
|
|
ret = "";
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnEditListCtrl::getBrowseInfo (uint item, uint subItem, std::string &defExt, std::string &defFilename, std::string &defDir, std::string &filter)
|
|
{
|
|
if (subItem == 2)
|
|
{
|
|
// Get type string
|
|
string type = ListCtrl.GetItemText (item, 1);
|
|
if ((type == "Type") || (type == "Type array"))
|
|
{
|
|
filter = TypeFilter;
|
|
defDir = theApp.RootSearchPath;
|
|
defFilename = "*.typ";
|
|
defExt = "*.typ";
|
|
}
|
|
else if ((type == "Dfn") || (type == "Dfn array"))
|
|
{
|
|
filter = DfnFilter;
|
|
defDir = theApp.RootSearchPath;
|
|
defFilename = "*.dfn";
|
|
defExt = "*.dfn";
|
|
}
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnEditListCtrl::onItemChanged (uint item, uint subItem)
|
|
{
|
|
if (subItem == 1)
|
|
{
|
|
// Get type string
|
|
string type = ListCtrl.GetItemText (item, 1);
|
|
if ((type == "Type") || (type == "Type array"))
|
|
{
|
|
CString str;
|
|
str = Dialog->Struct.ListCtrl.GetItemText (item, 2);
|
|
char ext[MAX_PATH];
|
|
_splitpath (str, NULL, NULL, NULL, ext);
|
|
if (stricmp (ext, ".typ") != 0)
|
|
Dialog->Struct.ListCtrl.SetItemText (item, 2, theApp.DefaultType.c_str ());
|
|
}
|
|
else if ((type == "Dfn") || (type == "Dfn array"))
|
|
{
|
|
CString str;
|
|
str = Dialog->Struct.ListCtrl.GetItemText (item, 2);
|
|
char ext[MAX_PATH];
|
|
_splitpath (str, NULL, NULL, NULL, ext);
|
|
if (stricmp (ext, ".dfn") != 0)
|
|
Dialog->Struct.ListCtrl.SetItemText (item, 2, theApp.DefaultDfn.c_str ());
|
|
|
|
// Clear default value
|
|
Dialog->Struct.ListCtrl.SetItemText (item, 3, "");
|
|
}
|
|
else if (type == "Virtual Dfn")
|
|
{
|
|
// Clear the value
|
|
Dialog->Struct.ListCtrl.SetItemText (item, 2, "");
|
|
|
|
// Clear default value
|
|
Dialog->Struct.ListCtrl.SetItemText (item, 3, "");
|
|
}
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::onOpenSelected ()
|
|
{
|
|
Parents.UpdateData ();
|
|
Struct.UpdateData ();
|
|
|
|
CWnd *focusWnd = CWnd::GetFocus ();
|
|
if (focusWnd)
|
|
{
|
|
focusWnd = focusWnd->GetParent ();
|
|
if (focusWnd)
|
|
{
|
|
if (focusWnd->m_hWnd == Parents.m_hWnd)
|
|
{
|
|
// For each selected
|
|
POSITION pos = Parents.ListCtrl.GetFirstSelectedItemPosition();
|
|
while (pos)
|
|
{
|
|
int nItem = Parents.ListCtrl.GetNextSelectedItem(pos);
|
|
|
|
// Get the string
|
|
CString str = Parents.ListCtrl.GetItemText (nItem, 0);
|
|
if (str != "")
|
|
{
|
|
// Look for the file
|
|
string name = CPath::lookup ((const char*)str, false, false);
|
|
if (name.empty ())
|
|
name = str;
|
|
|
|
// Open the file
|
|
theApp.OpenDocumentFile (name.c_str ());
|
|
}
|
|
}
|
|
}
|
|
else if (focusWnd->m_hWnd == Struct.m_hWnd)
|
|
{
|
|
// For each selected
|
|
POSITION pos = Struct.ListCtrl.GetFirstSelectedItemPosition();
|
|
while (pos)
|
|
{
|
|
int nItem = Struct.ListCtrl.GetNextSelectedItem(pos);
|
|
|
|
// Get the string
|
|
CString str = Struct.ListCtrl.GetItemText (nItem, 2);
|
|
if (str != "")
|
|
{
|
|
// Look for the file
|
|
string name = CPath::lookup ((const char*)str, false, false);
|
|
if (name.empty ())
|
|
name = str;
|
|
|
|
// Open the file
|
|
theApp.OpenDocumentFile (name.c_str ());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CBaseDialog::OnSetFocus(pOldWnd);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
CWnd* CDfnDialog::GetNextDlgTabItem( CWnd* pWndCtl, BOOL bPrevious) const
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::onFirstFocus ()
|
|
{
|
|
View->SetFocus ();
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::onLastFocus ()
|
|
{
|
|
View->setFocusLeftView ();
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnDialog::resizeWidgets ()
|
|
{
|
|
RECT viewRect;
|
|
View->GetClientRect (&viewRect);
|
|
uint virtualWidth = std::max ((uint)MinViewWidth, (uint)(viewRect.right-viewRect.left));
|
|
|
|
// Refresh sizes
|
|
CBaseDialog::resizeWidgets (virtualWidth, 0);
|
|
|
|
// Get first item coordinate
|
|
RECT currentPos;
|
|
getFirstItemPos (currentPos);
|
|
setStaticSize (currentPos);
|
|
getNextPosLabel (currentPos);
|
|
setListSize (currentPos, SmallWidget, ParentHeight);
|
|
getNextPos (currentPos);
|
|
setStaticSize (currentPos);
|
|
getNextPosLabel (currentPos);
|
|
setListSize (currentPos, Width, DfnHeight);
|
|
getNextPos (currentPos);
|
|
|
|
// Refresh sizes
|
|
CBaseDialog::resizeWidgets (virtualWidth, currentPos.bottom);
|
|
|
|
// Get first item coordinate
|
|
currentPos;
|
|
getFirstItemPos (currentPos);
|
|
|
|
// Create the type combo
|
|
setStaticSize (currentPos);
|
|
LabelParents.SetWindowPos (NULL, currentPos.left, currentPos.top, currentPos.right - currentPos.left,
|
|
currentPos.bottom - currentPos.top, SWP_NOZORDER|SWP_NOOWNERZORDER);
|
|
getNextPosLabel (currentPos);
|
|
|
|
setListSize (currentPos, SmallWidget, ParentHeight);
|
|
Parents.SetWindowPos (NULL, currentPos.left, currentPos.top, currentPos.right - currentPos.left,
|
|
currentPos.bottom - currentPos.top, SWP_NOZORDER|SWP_NOOWNERZORDER);
|
|
Parents.recalcColumn ();
|
|
getNextPos (currentPos);
|
|
|
|
// Create the type combo
|
|
setStaticSize (currentPos);
|
|
LabelStruct.SetWindowPos (NULL, currentPos.left, currentPos.top, currentPos.right - currentPos.left,
|
|
currentPos.bottom - currentPos.top, SWP_NOZORDER|SWP_NOOWNERZORDER);
|
|
getNextPosLabel (currentPos);
|
|
|
|
setListSize (currentPos, Width, DfnHeight + AdjusteHeight);
|
|
Struct.SetWindowPos (NULL, currentPos.left, currentPos.top, currentPos.right - currentPos.left,
|
|
currentPos.bottom - currentPos.top, SWP_NOZORDER|SWP_NOOWNERZORDER);
|
|
Struct.recalcColumn ();
|
|
getNextPos (currentPos);
|
|
|
|
// Resize the current view
|
|
View->setViewSize (
|
|
virtualWidth,
|
|
currentPos.bottom+CGeorgesEditView::WidgetTopMargin+CGeorgesEditView::WidgetBottomMargin);
|
|
}
|
|
|
|
// ***************************************************************************
|
|
// CDfnParentEditListCtrl
|
|
// ***************************************************************************
|
|
|
|
CEditListCtrl::TItemEdit CDfnParentEditListCtrl::getItemEditMode (uint item, uint subItem)
|
|
{
|
|
return CEditListCtrl::EditMemCombo;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnParentEditListCtrl::getMemComboBoxProp (uint item, uint subItem, std::string ®Adr, bool &browse)
|
|
{
|
|
browse = true;
|
|
regAdr = GEORGES_EDIT_BASE_REG_KEY"\\Dfn MemCombo";
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnParentEditListCtrl::getNewItemText (uint item, uint subItem, std::string &ret)
|
|
{
|
|
ret = theApp.DefaultDfn;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
|
|
void CDfnParentEditListCtrl::getBrowseInfo (uint item, uint subItem, std::string &defExt, std::string &defFilename, std::string &defDir, std::string &filter)
|
|
{
|
|
filter = DfnFilter;
|
|
defDir = theApp.RootSearchPath;
|
|
defFilename = "*.dfn";
|
|
defExt = "*.dfn";
|
|
}
|