Example #1
0
void PaletteSubDialog::ToContainer(BaseContainer &bc)
{
    Int32 i=0;
    bc.SetBool(++i, m_showLabel);
    bc.SetInt32(++i, m_rows);
    bc.SetInt32(++i, m_layout);
    bc.SetString(++i, m_searchString);
    bc.SetInt32(++i, m_paletteID);
}
/*********************************************************************\
	Function name    : CCustomElementSettings::Init
	Description      :
	Created at       : 27.03.02, @ 10:35:40
	Created by       : Thomas Kunert
	Modified by      :
\*********************************************************************/
void CCustomElementSettings::Init()
{
    m_wndListView.AttachListView(m_pSettingsDialog, IDC_CUSTOM_GUI_LIST);

    BaseContainer bc;
    bc.SetInt32('name', LV_COLUMN_TEXT);
    bc.SetInt32('resy', LV_COLUMN_TEXT);
    bc.SetInt32('ceid', LV_COLUMN_TEXT);
    m_wndListView.SetLayout(3, bc);
}
Example #3
0
void PickObjectTool::InitDefaultSettings(BaseDocument* doc, BaseContainer& data)
{
	_lastBaseDraw = nullptr;
	_mouseX = -1;
	_mouseY = -1;

	data.SetInt32(MDATA_PICKOBJECT_MODE, MDATA_PICKOBJECT_MODE_CIRCLE);
	data.SetInt32(MDATA_PICKOBJECT_CIRCLE_RAD, 40);
	data.SetInt32(MDATA_PICKOBJECT_RECT_W, 50);
	data.SetInt32(MDATA_PICKOBJECT_RECT_H, 30);

	DescriptionToolData::InitDefaultSettings(doc, data);
}
void ApplinkImporter::InsertTextureTag(PolygonObject* pObj, String mat, String& name)
{
	TextureTag* txttag = TextureTag::Alloc();
	txttag->SetMaterial(doc->SearchMaterial(mat));
	BaseContainer bc = txttag->GetData();
	bc.SetInt32(TEXTURETAG_PROJECTION, TEXTURETAG_PROJECTION_UVW);
	bc.SetInt32(TEXTURETAG_SIDE, TEXTURETAG_SIDE_FRONT);
	bc.SetString(TEXTURETAG_RESTRICTION, name);
	bc.SetInt32(TEXTURETAG_TILE, 1);
	txttag->SetData(bc);

	pObj->InsertTag(txttag, this->GetLastTag(pObj));
	txttag->Message(MSG_UPDATE);
}
Example #5
0
	virtual Bool InitValues(void)
	{
		SetInt32(1006, Int32(0), 0, 10);

		BaseContainer shortcut;
		shortcut.SetInt32(0, 0);			// qual
		shortcut.SetInt32(1, KEY_F1);	// key

		BaseContainer m(BFM_VALUECHNG);
		m.SetContainer(BFM_ACTION_VALUE, shortcut);

		SendMessage(1004, m);

		return true;
	}
Example #6
0
/*********************************************************************\
	Function name    : TreeView::CreateTreeView
	Description      : Creates a tree view window and attaches it to the parent window
	Created at       : 26.09.01, @ 11:02:27
	Created by       : Thomas Kunert
	Modified by      :
\*********************************************************************/
Bool TreeView::CreateTreeView(Int32 lTreeID, GeDialog* pParent, Int32 lElementType,
		DeleteTreeViewItemCallback pDeleteCallbackFunc, Int32 lTreeViewFlags,
		Int32 lFlags)
{
	m_pParent = pParent;

	SetDeleteCallback(pDeleteCallbackFunc);

	BaseContainer treedata;
	treedata.SetBool(TREEVIEW_CTRL_DRAG, true);
	treedata.SetBool(TREEVIEW_NO_MULTISELECT, true);
	treedata.SetBool(TREEVIEW_CURSORKEYS, true);
	treedata.SetBool(TREEVIEW_ALTERNATE_BG, true);
	treedata.SetBool(TREEVIEW_FIXED_LAYOUT, true);
	//treedata.SetBool(TREEVIEW_HAS_HEADER, true);
	//treedata.SetBool(TREEVIEW_BORDER, true);
	pParent->AddCustomGui(lTreeID, CUSTOMGUI_TREEVIEW, String(), BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, treedata);

	m_pTree = (TreeViewCustomGui*)pParent->FindCustomGui(lTreeID, CUSTOMGUI_TREEVIEW);
	if (!m_pTree) return false;

	BaseContainer layout;
	layout.SetInt32('icon', LV_USER);
	layout.SetInt32('tree', LV_TREE);
	m_pTree->SetLayout(2,layout);

	m_pTree->SetRoot(&m_RootItem, &functable, this);

	m_lTreeID = lTreeID;
	m_lElementType = lElementType;
	m_lFlags = lTreeViewFlags;

	return true;
}
Example #7
0
/*********************************************************************\
	Function name    : TreeView::AddItem
	Description      :
	Created at       : 15.08.01, @ 09:39:49
	Created by       : Thomas Kunert
	Modified by      :
\*********************************************************************/
TreeViewItem* TreeView::AddItem(String strName, Int32 lType, TreeViewItem* pParent)
{
	BaseContainer bc;
	bc.SetString(TREEVIEW_TEXT, strName);
	bc.SetInt32(TREEVIEW_ICON, lType);
	return AddItem(bc, pParent);
}
Example #8
0
		virtual void InsertObject(void *root,void *userdata,void *obj,Int32 dragtype,void *dragobject,Int32 insertmode, Bool bCopy)
		{
			TreeView* pTree = (TreeView*)userdata;

			if (dragtype == DRAGTYPE_FILES)
			{
				Filename* fn = (Filename*)dragobject;
				if (!fn) return;
				((CTreeDialog*)pTree->m_pParent)->OpenDialog(*fn);
			}

			if (dragtype == pTree->m_lElementType)
			{
				TreeViewItem* pDragItem = (TreeViewItem*)dragobject;
				TreeViewItem* pDestItem = (TreeViewItem*)obj;

				if (bCopy)
				{
					if (!pDragItem || !pDestItem) return;

					CTreeDialog* pDlg = (CTreeDialog*)pTree->m_pParent;
					if (!pDlg) return;
					CDialogDoc* pDoc = pDlg->GetDocument();
					if (!pDoc) return;

					CDialogItem* pDlgItemDrag = (CDialogItem*)pDragItem->GetData()->GetVoid(TREEVIEW_DATA);
					CDialogItem* pDlgItemDrop = (CDialogItem*)pDestItem->GetData()->GetVoid(TREEVIEW_DATA);
					if (!pDlgItemDrag || !pDlgItemDrop) return;

					pDoc->ExportMacro(GeGetPluginPath() + String("DragDrop.dmf"), pDlgItemDrag);
					CDialogItem* pNewItem = pDoc->ImportMacro(GeGetPluginPath() + String("DragDrop.dmf"), pDlgItemDrop);
					GeFKill(GeGetPluginPath() + String("DragDrop.dmf"));

					if (pNewItem)
					{
						TreeViewItem* pNewTreeItem = pNewItem->m_pTreeViewItem;
						switch (insertmode)
						{
							case INSERT_BEFORE: pNewTreeItem->ChangeParent(pDestItem->GetParent(), pDestItem, nullptr); break;
							case INSERT_UNDER:  pNewTreeItem->ChangeParent(pDestItem, nullptr, nullptr); Open(root, userdata, obj, true); break;
							default:            pNewTreeItem->ChangeParent(pDestItem->GetParent(), nullptr, pDestItem); break;
						}
						Select(root, userdata, pNewTreeItem, SELECTION_NEW);
					}
				}
				else
				{
					switch (insertmode)
					{
						case INSERT_BEFORE: pDragItem->ChangeParent(pDestItem->GetParent(), pDestItem, nullptr); break;
						case INSERT_UNDER:  pDragItem->ChangeParent(pDestItem, nullptr, nullptr); Open(root, userdata, obj, true); break;
						default:            pDragItem->ChangeParent(pDestItem->GetParent(), nullptr, pDestItem); break;
					}
				}
				BaseContainer bc;
				bc.SetInt32(TREEVIEW_MESSAGE_TYPE, TREEVIEW_STRUCTURE_CHANGE);
				pTree->m_pParent->Command(pTree->m_lTreeID, bc);
				pTree->m_pTree->Refresh();
			}
		}
Example #9
0
Bool LiquidToolData::GetCursorInfo(BaseDocument* doc, BaseContainer& data, BaseDraw* bd, Float x, Float y, BaseContainer& bc)
{
	if (bc.GetId() == BFM_CURSORINFO_REMOVE)
		return true;

	bc.SetString(RESULT_BUBBLEHELP, GeLoadString(IDS_PRIMITIVETOOL));
	bc.SetInt32(RESULT_CURSOR, MOUSE_POINT_HAND);
	return true;
}
Example #10
0
		virtual Bool DoubleClick(void *root,void *userdata,void *obj,Int32 col,MouseInfo *mouseinfo)
		{
			TreeView* pTree = (TreeView*)userdata;

			BaseContainer bc;
			bc.SetInt32(TREEVIEW_MESSAGE_TYPE, TREEVIEW_DOUBLECLICK);
			bc.SetVoid(TREEVIEW_MESSAGE_ITEM, obj);
			return pTree->m_pParent->Command(pTree->m_lTreeID, bc);
			//return false;
		}
Example #11
0
	virtual Bool CreateLayout(void)
	{
		GroupBegin(999, BFH_SCALEFIT | BFV_SCALEFIT, 3, 0, "", BFV_GRIDGROUP_ALLOW_WEIGHTS);

		AddStaticText(1000, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);
		AddStaticText(1001, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);
		AddStaticText(1001, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);

		AddStaticText(1002, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);
		AddStaticText(1003, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);
		AddStaticText(1003, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);

		AddStaticText(1004, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);
		AddStaticText(1005, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);
		AddStaticText(1005, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0, "SubDialog2", BORDER_THIN_IN);

		AddEditNumberArrows(1006, BFH_SCALEFIT);

		if (!weights_saved)
		{
			// set the columns
			weights.SetInt32(GROUPWEIGHTS_PERCENT_W_CNT, 3);				// number of rows - has to be equal to the given layout
			weights.SetFloat(GROUPWEIGHTS_PERCENT_W_VAL + 0, 1);		// weight for col 1
			weights.SetFloat(GROUPWEIGHTS_PERCENT_W_VAL + 1, -250);	// FIXED weight for col 2
			weights.SetFloat(GROUPWEIGHTS_PERCENT_W_VAL + 2, 1);		// weight for col 1

			// set the rows
			weights.SetInt32(GROUPWEIGHTS_PERCENT_H_CNT, 4);					// number of rows - has to be equal to the given layout
			weights.SetFloat(GROUPWEIGHTS_PERCENT_H_VAL + 0, -1.0);		// weight for row 1
			weights.SetFloat(GROUPWEIGHTS_PERCENT_H_VAL + 1, -150.0);	// FIXED weight for row 2
			weights.SetFloat(GROUPWEIGHTS_PERCENT_H_VAL + 2, 60.0);		// weight for row 3
			weights.SetFloat(GROUPWEIGHTS_PERCENT_H_VAL + 3, 0.0);		// weight for row 4
			weights_saved = true;
		}

		GroupWeightsLoad(999, weights);

		GroupEnd();
		return true;
	}
Bool HairGeneratorObject::Init(GeListNode* node)
{
	BaseContainer* bc = ((BaseList2D*)node)->GetDataInstance();

	bc->SetInt32(HAIR_GEN_COUNT, 5000);
	bc->SetInt32(HAIR_GEN_SEGMENTS, 6);
	bc->SetFloat(HAIR_GEN_LENGTH, 15);
	bc->SetFloat(HAIR_GEN_LENGTH_VAR, 5);
	bc->SetFloat(HAIR_GEN_NOISE, 0.2);
	bc->SetBool(HAIR_GEN_GENERATE, false);

	return true;
}
Example #13
0
Bool PickObjectTool::GetDDescription(BaseDocument* doc, BaseContainer& data, Description* description, DESCFLAGS_DESC& flags)
{
	Bool res = DescriptionToolData::GetDDescription(doc, data, description, flags);
	if (flags & DESCFLAGS_DESC_LOADED)
	{
		BaseContainer* bc;

		Int32 mode = data.GetInt32(MDATA_PICKOBJECT_MODE);

		bc = description->GetParameterI(DescLevel(MDATA_PICKOBJECT_CIRCLE_RAD), nullptr);
		if (bc)
			bc->SetInt32(DESC_HIDE, mode != MDATA_PICKOBJECT_MODE_CIRCLE);

		bc = description->GetParameterI(DescLevel(MDATA_PICKOBJECT_RECT_W), nullptr);
		if (bc)
			bc->SetInt32(DESC_HIDE, mode == MDATA_PICKOBJECT_MODE_CIRCLE);
		bc = description->GetParameterI(DescLevel(MDATA_PICKOBJECT_RECT_H), nullptr);
		if (bc)
			bc->SetInt32(DESC_HIDE, mode == MDATA_PICKOBJECT_MODE_CIRCLE);
	}
	return res;
}
Example #14
0
		virtual void Select(void *root,void *userdata,void *obj,Int32 mode)
		{
			TreeView* pTree = (TreeView*)userdata;
			pTree->m_pCurrentItem = (TreeViewItem*)obj;

			BaseContainer bc;
			bc.SetInt32(TREEVIEW_MESSAGE_TYPE, TREEVIEW_SELCHANGE);
			if (mode == SELECTION_SUB) return;
				//bc.SetInt32(TREEVIEW_MESSAGE_ITEM, nullptr);
			//else
			bc.SetVoid(TREEVIEW_MESSAGE_ITEM, obj);

			pTree->m_pParent->Command(pTree->m_lTreeID, bc);
		}
Example #15
0
Bool HairRenderingTag::Init(GeListNode* node)
{
	BaseContainer* bc = ((BaseList2D*)node)->GetDataInstance();

	m_FnTable.init_render = _InitRenderFn;
	m_FnTable.free_render = _HrFreeRenderFn;
	m_FnTable.calc_shad = _ModifyHairShadowTransparencyFn;
	m_FnTable.calc_col	= _GenerateColorFn;

	bc->SetFloat(HAIR_RENDERING_SHADOW, 1.0);
	bc->SetFloat(HAIR_RENDERING_TRANSPARENCY, 1.0);
	bc->SetInt32(HAIR_RENDERING_DEPTH, 1);

	return true;
}
Example #16
0
/*********************************************************************\
	Function name    : TreeView::ExpandItem
	Description      :
	Created at       : 14.08.01, @ 19:28:34
	Created by       : Thomas Kunert
	Modified by      :
\*********************************************************************/
void TreeView::ExpandItem(TreeViewItem* pItem, Bool bExpand)
{
	pItem->m_bIsExpanded = bExpand;

	if (!bExpand && m_pCurrentItem->IsChildOf(pItem))
	{
		m_pCurrentItem = pItem;
		if (m_pParent)
		{
			BaseContainer bc;
			bc.SetInt32(TREEVIEW_MESSAGE_TYPE, TREEVIEW_SELCHANGE);
			bc.SetVoid(TREEVIEW_MESSAGE_ITEM, m_pCurrentItem);
			m_pParent->Command(m_lTreeID, bc);
		}
	}

	Redraw();
}
Example #17
0
Bool DiffDistriDialog::CreateLayout(void)
{
	if (!GeDialog::CreateLayout())
		return false;
	if (!LoadDialogResource(IDD_DIFF_DISTRI_DLG, nullptr, 0))
		return false;

	m_pTreeView = (TreeViewCustomGui*)FindCustomGui(IDC_DIFF_DISTRI_FILES_TREE, CUSTOMGUI_TREEVIEW);
	m_pNewZipEdit = (FilenameCustomGui*)FindCustomGui(IDC_DIFF_DISTRI_NEWZIP_EDIT, CUSTOMGUI_FILENAME);
	m_pDestPathEdit = (FilenameCustomGui*)FindCustomGui(IDC_DIFF_DISTRI_DESTPATH_EDIT, CUSTOMGUI_FILENAME);
	if (!m_pTreeView || !m_pNewZipEdit || !m_pDestPathEdit)
		return false;

	BaseContainer bcLayout;
	bcLayout.SetInt32(0, LV_TREE);
	m_pTreeView->SetLayout(1, bcLayout);
	m_pTreeView->SetRoot(&g_pResEditPrefs->arOldFiles, &funcs, this);

	return true;
}
Example #18
0
Bool MemStatDialog::InitValues(void)
{
	// first call the parent instance
	if (!GeDialog::InitValues())
		return false;

	BaseContainer stat;
	// since this function is slow we have to tell Cinema that we need this information by setting 1
	stat.SetInt32(C4D_MEMORY_STAT_OPENGL_TOTAL, 1);
	GeGetMemoryStat(stat);

	SetString(IDC_MEMORY_STAT_MEMORY_INUSE, String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_MEMORY_INUSE)));
	SetString(IDC_MEMORY_STAT_MEMORY_PEAK, String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_MEMORY_PEAK)));
	SetString(IDC_MEMORY_STAT_NO_OF_ALLOCATIONS_TOTAL, GetNoOfAllocationsString(stat.GetInt64(C4D_MEMORY_STAT_NO_OF_ALLOCATIONS_TOTAL)));
	SetString(IDC_MEMORY_STAT_NO_OF_ALLOCATIONS_CURRENT, GetNoOfAllocationsString(stat.GetInt64(C4D_MEMORY_STAT_NO_OF_ALLOCATIONS_CURRENT)));
	SetString(IDC_MEMORY_STAT_OGL_MEMORY, GetOGLMemoryString(stat.GetInt32(C4D_MEMORY_STAT_OPENGL_TOTAL)) + " / " + GetOGLMemoryString(stat.GetInt32(C4D_MEMORY_STAT_OPENGL_FREE)));
	SetString(IDC_MEMORY_STAT_EOGL_TEXBUFFER, String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_EOGL_TEXBUFFER)) + String(" (") + String::IntToString(stat.GetInt32(C4D_MEMORY_STAT_EOGL_TEXTUREBUFFER_CNT)) + String(")"));
	SetString(IDC_MEMORY_STAT_EOGL_VERTEXBUFFER, String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_EOGL_VERTEXBUFFER)) + String(" (") + String::IntToString(stat.GetInt32(C4D_MEMORY_STAT_EOGL_VERTEXBUFFER_CNT)) + String(")"));

	return true;
}
Example #19
0
Bool PaletteSubDialog::Command(Int32 id,const BaseContainer &msg)
{
	GeDynamicArray<Palette> pals;
    Palette pal;
    Filename fn;
    switch (id)
    {
		case 3:
            switch(msg.GetInt32(BFM_ACTION_VALUE)){
                case ACTION_NEW:
                    pal.SetColor(0, Color(0.f, 0.f, 0.f).SetSource(COLOR_SOURCE_DISPLAY));
                    id = Palette::AddPalette(pal);
                    m_controlsShown = FALSE;
                    LoadPalette(id);
                    SaveSettings();
                    Palette::UpdateAll();
                    return TRUE;
                case ACTION_LOAD:
                    if(fn.FileSelect(FILESELECTTYPE_ANYTHING, FILESELECT_LOAD, "Load")){
                        String s = fn.GetString();
                        if(Palette::LoadASEFile(s, pal)){
                            id = Palette::AddPalette(pal);
                            m_controlsShown = FALSE;
                            LoadPalette(id);
                            SaveSettings();
                            Palette::UpdateAll();
                        }
                    }
                    return TRUE;
                case ACTION_SAVE:
                    if(fn.FileSelect(FILESELECTTYPE_ANYTHING, FILESELECT_SAVE, "Save", "ase")){
                        String s = fn.GetString();
                        Palette::SaveASEFile(s, m_palette);
                    }
                    return TRUE;
                case ACTION_LABEL:
                    ShowControls(!m_showControls);
                    return TRUE;
                    
            }
            if(msg.GetInt32(BFM_ACTION_VALUE) >= ACTION_COUNT){
                m_controlsShown = FALSE;
                LoadPalette(msg.GetInt32(BFM_ACTION_VALUE)-ACTION_COUNT);
                SaveSettings();
            }
            return TRUE;
        case IDC_LAYOUT_DIRECTION:
            m_controlsShown = FALSE;
            LoadPalette(m_paletteID);
            SaveSettings();
            break;
        case IDC_ROWS:
            PaletteLayout();
            SaveSettings();
            break;
        case IDC_LABELCHECKBOX:
            GetBool(m_labelCheckArea, m_showLabel);
            LoadPalette(m_paletteID);
            SaveSettings();
            break;
        case IDC_NAME:
            if(m_nameArea != NULL){
                GetString(m_nameArea, m_palette.m_name);
                Palette::SetPaletteName(m_paletteID, m_palette.m_name);
                LoadPalette(m_paletteID);
            }
            break;
        case IDC_HIDE:
            ShowControls(FALSE);
            break;
        case IDC_SEARCHTEXT:
            PaletteLayout();
            SaveSettings();
            break;
        case IDC_CREATEMATERIAL:
            {
				Bool linkColors;
				GetBool(m_linkColor,linkColors);
                for(Int32 i=m_palette.m_colors.GetCount()-1;i>=0;--i){
                    BaseMaterial *mat = BaseMaterial::Alloc(Mmaterial);
                    String name = "PaletteMaterial";
                    if(m_palette[i].m_name != ""){
                        name = m_palette[i].m_name;
                    }
                    mat->SetName(name);
                    if(mat != nullptr){
                        BaseChannel *chan = mat->GetChannel(CHANNEL_COLOR);
                        if(chan != nullptr){
                            BaseContainer bc;
							if(linkColors){
								bc.SetInt32(BASECHANNEL_SHADERID, PALETTE_SHADER_ID);
								chan->SetData(bc);
								BaseShader *bs = chan->GetShader();
								BaseContainer* data = bs->GetDataInstance();
								data->SetInt32(PALETTESHADER_PALETTE_ID, 1+m_paletteID);
								data->SetInt32(PALETTESHADER_COLOR_ID, 1+i);
							} else {
								// Color Shader ID: 5832
								bc.SetInt32(BASECHANNEL_SHADERID, 5832);
								chan->SetData(bc);
								BaseShader *bs = chan->GetShader();
								BaseContainer* data = bs->GetDataInstance();
								
								data->SetVector(COLORSHADER_COLOR , m_palette.m_colors[i].AsVector());
							}
                            GetActiveDocument()->InsertMaterial(mat);
                            EventAdd();
                        }
                    }
                }
            }
            break;
		default:
			break;
    }
    return GeDialog::Command(id,msg);
}
Example #20
0
//Set our custom values. See the toolsculptgrabbrush.res and toolsculptgrabbrush.h files for where this value is defined.
void ExampleSculptGrabBrush::PostInitDefaultSettings(BaseDocument* doc, BaseContainer& data)
{
	data.SetInt32(MDATA_TOOLSCULPTGRABBRUSH_DIRMODE, MDATA_TOOLSCULPTGRABBRUSH_DIRMODE_MOUSEDIR);
}
Example #21
0
/*********************************************************************\
	Function name    : CCompareTableDialog::InitValues
	Description      :
	Created at       : 09.10.01, @ 21:07:22
	Created by       : Thomas Kunert
	Modified by      :
\*********************************************************************/
Bool CCompareTableDialog::InitValues(void)
{
	BaseContainer bcLayout;
	Int32 a, b;

	bcLayout.SetInt32(COMPARE_LIST_NAME, LV_COLUMN_TEXT);
	bcLayout.SetInt32(COMPARE_LIST_DATA, LV_COLUMN_TEXT);
	m_wndOutputList.SetLayout(2, bcLayout);

	// the tbles are loaded, so write some important information
	Int32 lItemCount = 0;
	BaseContainer data;

	CStringTable* pTable;
	StringTableType stt;

	for (b = 0; b < 2; b++)
	{
		if (b == 0)
		{
			data.SetString(COMPARE_LIST_NAME, GeLoadString(IDS_COMPARE_ORIGINAL_FILE)); data.SetString(COMPARE_LIST_DATA, m_fnOriginal.GetString()); m_wndOutputList.SetItem(lItemCount++, data);
			pTable = m_pOriginalTable;
			stt = m_OriginalDoc.m_StringTableType;
		}
		else
		{
			data.SetString(COMPARE_LIST_NAME, GeLoadString(IDS_COMPARE_NEW_FILE)); data.SetString(COMPARE_LIST_DATA, m_fnNew.GetString()); m_wndOutputList.SetItem(lItemCount++, data);
			pTable = m_pNewTable;
			stt = m_NewDoc.m_StringTableType;
		}

		data.SetString(COMPARE_LIST_NAME, GeLoadString(IDS_COMPARE_STT));
		if (stt == typeDialogStrings)
			data.SetString(COMPARE_LIST_DATA, GeLoadString(IDS_COMPARE_TYPE_DLG));
		else if (stt == typeStringTable)
			data.SetString(COMPARE_LIST_DATA, GeLoadString(IDS_COMPARE_TYPE_STT));
		else if (stt == typeCommandStrings)
			data.SetString(COMPARE_LIST_DATA, GeLoadString(IDS_COMPARE_TYE_COMMAND));
		m_wndOutputList.SetItem(lItemCount++, data);


		data.SetString(COMPARE_LIST_NAME, GeLoadString(IDS_COMPARE_NUM_LANG)); data.SetString(COMPARE_LIST_DATA, String::IntToString(pTable->GetUsedLanguages())); m_wndOutputList.SetItem(lItemCount++, data);

		for (a = 0; a < pTable->GetUsedLanguages(); a++)
		{
			if (a == 0)
			{
				data.SetString(COMPARE_LIST_NAME, GeLoadString(IDS_COMPARE_LANGUAGES));
			}
			else
			{
				data.SetString(COMPARE_LIST_NAME, "");
			}

			String strSuffix = pTable->GetSuffix(a);
			data.SetString(COMPARE_LIST_DATA, String("") + g_LanguageList.GetName(strSuffix) + String("(") + strSuffix + String(")")); m_wndOutputList.SetItem(lItemCount++, data);
		}
		data.SetString(COMPARE_LIST_DATA, String("")); data.SetString(COMPARE_LIST_NAME, String("")); m_wndOutputList.SetItem(lItemCount++, data);
	}

	// search all strings that are in the original table, but not in the new table
	data.SetString(COMPARE_LIST_NAME, GeLoadString(IDS_COMPARE_REMOVED_ITEMS)); data.SetString(COMPARE_LIST_DATA, String("")); m_wndOutputList.SetItem(lItemCount++, data);
	data.SetString(COMPARE_LIST_NAME, String(""));
	for (a = 0; a < m_pOriginalTable->GetNumElements(); a++)
	{
		String strID = m_pOriginalTable->GetElementID(a);
		if (!m_pNewTable->ContainsElement(strID))
		{
			data.SetString(COMPARE_LIST_DATA, strID); m_wndOutputList.SetItem(lItemCount++, data);
		}
	}

	// now, find all items that were added in the new table
	data.SetString(COMPARE_LIST_NAME, GeLoadString(IDS_COMPARE_ADDED_ITEMS)); data.SetString(COMPARE_LIST_DATA, String("")); m_wndOutputList.SetItem(lItemCount++, data);
	data.SetString(COMPARE_LIST_NAME, String(""));
	for (a = 0; a < m_pNewTable->GetNumElements(); a++)
	{
		String strID = m_pNewTable->GetElementID(a);
		if (!m_pOriginalTable->ContainsElement(strID))
		{
			data.SetString(COMPARE_LIST_DATA, strID); m_wndOutputList.SetItem(lItemCount++, data);
		}
	}

	// search for all modified languages
	data.SetString(COMPARE_LIST_NAME, GeLoadString(IDS_COMPARE_MODIFIED_ITEMS)); data.SetString(COMPARE_LIST_DATA, String("")); m_wndOutputList.SetItem(lItemCount++, data);
	data.SetString(COMPARE_LIST_NAME, String(""));

	Int32 lLanguages = m_pOriginalTable->GetUsedLanguages();

	Int32 lBothLang = 0;
	Int32 *plLangIDO = bNewDeprecatedUseArraysInstead<Int32>(lLanguages);
	Int32 *plLangIDN = bNewDeprecatedUseArraysInstead<Int32>(lLanguages);
	Bool *pbChanged = bNewDeprecatedUseArraysInstead<Bool>(lLanguages);

	// check for all languages that are available in both tables
	for (a = 0; a < lLanguages; a++)
	{
		String strLangID = m_pOriginalTable->GetSuffix(a);
		Int32 lLangID = m_pNewTable->GetLanguageID(strLangID);
		if (lLangID < 0) continue;

		plLangIDO[lBothLang] = a;
		plLangIDN[lBothLang] = lLangID;

		lBothLang++;
	}

	for (a = 0; a < m_pOriginalTable->GetNumElements(); a++)
	{
		String strID = m_pOriginalTable->GetElementID(a);
		if (m_pNewTable->ContainsElement(strID))
		{
			Bool bChanged = false;
			ClearMemType(pbChanged, lLanguages);

			for (b = 0; b < lBothLang; b++)
			{
				if (m_bIsCommandTable)
				{
					String str1, str2, strCommand1, strCommand2;
					Bool bFound;

					str1 = m_pOriginalTable->GetString(a, plLangIDO[b], &strCommand1);
					str2 = m_pNewTable->GetString(m_pOriginalTable->GetElementID(a), plLangIDN[b], bFound, &strCommand2);

					if ((str1 != str2) || (strCommand1 != strCommand2))
					{
						pbChanged[b] = true;
						bChanged = true;
					}
				}
				else
				{
					String str = m_pOriginalTable->GetString(a, plLangIDO[b]);
					Bool bFound;
					if (str != m_pNewTable->GetString(m_pOriginalTable->GetElementID(a), plLangIDN[b], bFound))
					{
						pbChanged[b] = true;
						bChanged = true;
					}
				}
			}
			if (bChanged)
			{
				String str = m_pOriginalTable->GetElementID(a);
				for (b = 0; b < lBothLang; b++)
				{
					if (pbChanged[b])
						str += String("  ") + m_pOriginalTable->GetSuffix(plLangIDO[b]);
				}
				data.SetString(COMPARE_LIST_DATA, str); m_wndOutputList.SetItem(lItemCount++, data);
			}
		}
	}

	bDelete(plLangIDO);
	bDelete(plLangIDN);
	bDelete(pbChanged);

	m_wndOutputList.DataChanged();

	return true;
}