summaryrefslogtreecommitdiff
path: root/indra/integration_tests/llui_libtest/llui_libtest.cpp
blob: f8caa7990b3516aa3fe02101827466f42af2641b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/** 
 * @file llui_libtest.cpp
 * @brief Integration test for the LLUI library
 *
 * $LicenseInfo:firstyear=2009&license=viewergpl$
 * 
 * Copyright (c) 2002-2009, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at
 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */
#include "linden_common.h"

#include "llui_libtest.h"

// project includes
#include "llwidgetreg.h"

// linden library includes
#include "llcontrol.h"		// LLControlGroup
#include "lldir.h"
#include "llerrorcontrol.h"
#include "llfloater.h"
#include "llfontgl.h"
#include "lltrans.h"
#include "llui.h"
#include "lluictrlfactory.h"

#include <iostream>

// *TODO: switch to using TUT
// *TODO: teach Parabuild about this program, run automatically after full builds

// We can't create LLImageGL objects because we have no window or rendering 
// context.  Provide enough of an LLUIImage to test the LLUI library without
// an underlying image.
class TestUIImage : public LLUIImage
{
public:
	TestUIImage()
	:	LLUIImage( std::string(), NULL ) // NULL ImageGL, don't deref!
	{ }

	/*virtual*/ S32 getWidth() const
	{
		return 16;
	}

	/*virtual*/ S32 getHeight() const
	{
		return 16;
	}
};

// We need to supply dummy images
class TestImageProvider : public LLImageProviderInterface
{
public:
	/*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name)
	{
		return makeImage();
	}

	/*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id)
	{
		return makeImage();
	}

	/*virtual*/ void cleanUp()
	{
	}

	LLPointer<LLUIImage> makeImage()
	{
		LLPointer<LLImageGL> image_gl;
		LLPointer<LLUIImage> image = new LLUIImage( std::string(), image_gl);
		return image;
	}
};

static std::string get_xui_dir()
{
	std::string delim = gDirUtilp->getDirDelimiter();
	return gDirUtilp->getAppRODataDir() + delim + std::string("skins") + delim + "default" + delim + "xui" + delim;
}

int main(int argc, char** argv)
{
	// Must init LLError for llerrs to actually cause errors.
	LLError::initForApplication(".");

	// Font lookup needs directory support
	gDirUtilp->initAppDirs("SecondLife", "../../../newview");
	gDirUtilp->setSkinFolder("default");

	std::string config_filename = gDirUtilp->getExpandedFilename(
		LL_PATH_APP_SETTINGS, "settings.xml");
	LLControlGroup config_group("config");
	config_group.loadFromFile(config_filename);

	std::string color_filename = gDirUtilp->getExpandedFilename(
		LL_PATH_DEFAULT_SKIN, "colors.xml");
	LLControlGroup color_group("color");
	color_group.loadFromFile(color_filename);

	LLControlGroup floater_group("floater");
	LLControlGroup ignores_group("ignores");
	LLUI::settings_map_t settings;
	settings["config"] = &config_group;
	settings["color"] = &color_group;
	settings["floater"] = &floater_group;
	settings["ignores"] = &ignores_group;

	// Don't use real images as we don't have a GL context
	TestImageProvider image_provider;
	LLUI::initClass(settings, &image_provider);

	const bool no_register_widgets = false;
	LLWidgetReg::initClass( no_register_widgets );

	// Unclear if this is needed
	LLUI::setupPaths();
	// Otherwise we get translation warnings when setting up floaters
	// (tooltips for buttons)
	std::set<std::string> default_args;
	LLTrans::parseStrings("strings.xml", default_args);
    
	LLFontManager::initClass();

	// Creating widgets apparently requires fonts to be initialized,
	// otherwise it crashes.
	LLFontGL::initClass(96.f, 1.f, 1.f,
		gDirUtilp->getAppRODataDir(),
		LLUI::getXUIPaths(),
		false );	// don't create gl textures

	LLFloaterView::Params fvparams;
	fvparams.name("Floater View");
	fvparams.rect( LLRect(0,480,640,0) );
	fvparams.mouse_opaque(false);
	fvparams.follows.flags(FOLLOWS_ALL);
	fvparams.tab_stop(false);
	gFloaterView = LLUICtrlFactory::create<LLFloaterView> (fvparams);

	// Convert all test floaters to new XML format
	std::string delim = gDirUtilp->getDirDelimiter();
	std::string xui_dir = get_xui_dir() + "en" + delim;
	std::string filename;
	while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename, false))
	{
		if (filename.find("_new.xml") != std::string::npos)
		{
			// don't re-export other test floaters
			continue;
		}
		llinfos << "Converting " << filename << llendl;
		// Build a floater and output new attributes
		LLXMLNodePtr output_node = new LLXMLNode();
		LLFloater* floater = new LLFloater();
		LLUICtrlFactory::getInstance()->buildFloater(floater,
			filename,
			FALSE,	// don't open floater
			output_node);
		std::string out_filename = xui_dir + filename;
		std::string::size_type extension_pos = out_filename.rfind(".xml");
		out_filename.resize(extension_pos);
		out_filename += "_new.xml";

		llinfos << "Output: " << out_filename << llendl;
		LLFILE* floater_file = LLFile::fopen(out_filename.c_str(), "w");
		LLXMLNode::writeHeaderToFile(floater_file);
		output_node->writeToFile(floater_file);
		fclose(floater_file);
	}
	return 0;
}