Initial import of Dillo

This commit is contained in:
2025-02-28 13:34:30 -05:00
parent bd4e3eebd8
commit 20fea64cb5
496 changed files with 156174 additions and 0 deletions

5
test/Makefile.am Normal file
View File

@ -0,0 +1,5 @@
SUBDIRS = unit dw
if ENABLE_HTML_TESTS
SUBDIRS += html
endif

64
test/dw/Makefile.am Normal file
View File

@ -0,0 +1,64 @@
AM_CPPFLAGS = \
-I$(top_srcdir) \
-DCUR_WORKING_DIR='"@BASE_CUR_WORKING_DIR@/test"'
AM_CFLAGS = @LIBFLTK_CFLAGS@
AM_CXXFLAGS = @LIBFLTK_CXXFLAGS@
LDADD = \
$(top_builddir)/dw/libDw-widgets.a \
$(top_builddir)/dw/libDw-fltk.a \
$(top_builddir)/dw/libDw-core.a \
$(top_builddir)/lout/liblout.a \
$(top_builddir)/dlib/libDlib.a \
@LIBFLTK_LIBS@ @LIBX11_LIBS@
check_PROGRAMS = \
dw-anchors-test \
dw-border-test \
dw-example \
dw-find-test \
dw-float-test \
dw-image-background \
dw-images-scaled \
dw-images-scaled2 \
dw-images-simple \
dw-imgbuf-mem-test \
dw-links \
dw-links2 \
dw-lists \
dw-resource-test \
dw-simple-container-test \
dw-table \
dw-table-aligned \
dw-ui-test
# Don't run most tests yet, as they require graphical display and human
# intervention.
TESTS = \
dw-imgbuf-mem-test
dw_anchors_test_SOURCES = dw_anchors_test.cc
dw_border_test_SOURCES = dw_border_test.cc
dw_example_SOURCES = dw_example.cc
dw_find_test_SOURCES = dw_find_test.cc
dw_float_test_SOURCES = dw_float_test.cc
dw_links_SOURCES = dw_links.cc
dw_links2_SOURCES = dw_links2.cc
dw_image_background_SOURCES = dw_image_background.cc
dw_images_simple_SOURCES = dw_images_simple.cc
dw_images_scaled_SOURCES = dw_images_scaled.cc
dw_images_scaled2_SOURCES = dw_images_scaled2.cc
dw_lists_SOURCES = dw_lists.cc
dw_simple_container_test_SOURCES = \
dw_simple_container.hh \
dw_simple_container.cc \
dw_simple_container_test.cc
dw_table_aligned_SOURCES = dw_table_aligned.cc
dw_table_SOURCES = dw_table.cc
dw_imgbuf_mem_test_SOURCES = dw_imgbuf_mem_test.cc
dw_resource_test_SOURCES = dw_resource_test.cc
dw_ui_test_SOURCES = \
dw_ui_test.cc \
form.cc \
form.hh

166
test/dw/dw_anchors_test.cc Normal file
View File

@ -0,0 +1,166 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <ctype.h>
#include <FL/Fl_Window.H>
#include <FL/Fl.H>
#include "dlib/dlib.h"
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
using namespace lout::container::typed;
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
static FltkPlatform *platform;
static Layout *layout;
static Fl_Window *window;
static FltkViewport *viewport;
static Style *topWidgetStyle, *widgetStyle, *wordStyle, *headingStyle;
static Textblock *topTextblock = NULL;
static int textblockNo = 0;
static const char *numbers[10] = {
"one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten"
};
static void anchorCallback (Fl_Widget *widget, void *data)
{
layout->setAnchor (numbers[(long)data]);
}
static void textTimeout (void *data)
{
Textblock *oldTop = topTextblock;
topTextblock = new Textblock (false);
if (oldTop) {
oldTop->addLinebreak (wordStyle);
oldTop->addWidget (topTextblock, widgetStyle);
} else {
topTextblock->setStyle (topWidgetStyle);
layout->setWidget (topTextblock);
}
topTextblock->addAnchor (numbers[textblockNo], headingStyle);
char buf[16];
strcpy (buf, numbers[textblockNo]);
buf[0] = lout::misc::AsciiToupper (buf[0]);
topTextblock->addText (buf, headingStyle);
topTextblock->addParbreak (5, headingStyle);
for (int i = 0; i < 30; i++) {
strcpy (buf, numbers[textblockNo]);
if (i == 0)
buf[0] = lout::misc::AsciiToupper (buf[0]);
strcat (buf, i == 29 ? "." : ",");
topTextblock->addText (buf, wordStyle);
topTextblock->addSpace (wordStyle);
}
topTextblock->flush ();
textblockNo++;
if (textblockNo < 10)
Fl::repeat_timeout (1, textTimeout, NULL);
}
int main(int argc, char **argv)
{
char *buttonLabel[10];
platform = new FltkPlatform ();
layout = new Layout (platform);
window = new Fl_Window(250, 200, "Dw Anchors Test");
window->box(FL_NO_BOX);
window->begin();
viewport = new FltkViewport (50, 0, 200, 200);
viewport->end();
layout->attachView (viewport);
for (int i = 0; i < 10; i++) {
char buf[16];
strcpy (buf, numbers[i]);
buf[0] = lout::misc::AsciiToupper (buf[0]);
buttonLabel[i] = dStrdup(buf);
Fl_Button *button = new Fl_Button(0, 20 * i, 50, 20, buttonLabel[i]);
button->callback (anchorCallback, (void*)(long)i);
button->when (FL_WHEN_RELEASE);
}
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.margin.setVal (5);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
topWidgetStyle = Style::create (&styleAttrs);
styleAttrs.margin.left = 20;
styleAttrs.margin.right = 0;
styleAttrs.backgroundColor = NULL;
widgetStyle = Style::create (&styleAttrs);
styleAttrs.margin.left = 0;
wordStyle = Style::create (&styleAttrs);
fontAttrs.size = 28;
fontAttrs.weight = 700;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
headingStyle = Style::create (&styleAttrs);
Fl::add_timeout (0, textTimeout, NULL);
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
topWidgetStyle->unref ();
widgetStyle->unref ();
wordStyle->unref ();
headingStyle->unref ();
for (int i = 0; i < 10; i++)
free(buttonLabel[i]);
delete layout;
return errorCode;
}

128
test/dw/dw_border_test.cc Normal file
View File

@ -0,0 +1,128 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl_Window.H>
#include <FL/Fl.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
#include "dw/listitem.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(200, 300, "Dw Border Test");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 200, 300);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
styleAttrs.borderWidth.setVal (2);
styleAttrs.setBorderColor (Color::create (layout, 0xffffff));
styleAttrs.setBorderStyle (BORDER_INSET);
styleAttrs.padding.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle1 = Style::create (&styleAttrs);
styleAttrs.backgroundColor = Color::create (layout, 0xffff80);
styleAttrs.margin.setVal (0);
styleAttrs.borderWidth.setVal (1);
styleAttrs.setBorderColor (Color::create (layout, 0x4040ff));
styleAttrs.setBorderStyle (BORDER_SOLID);
styleAttrs.padding.setVal (1);
Style *widgetStyle2 = Style::create (&styleAttrs);
Textblock *textblock1 = new Textblock (false);
textblock1->setStyle (widgetStyle1);
layout->setWidget (textblock1);
widgetStyle1->unref();
styleAttrs.borderWidth.setVal (0);
styleAttrs.padding.setVal (0);
styleAttrs.backgroundColor = NULL;
styleAttrs.cursor = CURSOR_TEXT;
Style *wordStyle = Style::create (&styleAttrs);
const char *words1[] = { "Some", "random", "text.", NULL };
const char *words2[] = { "A", "nested", "paragraph.", NULL };
for(int i = 0; words1[i]; i++) {
if(i != 0)
textblock1->addSpace (wordStyle);
textblock1->addText (words1[i], wordStyle);
}
for(int i = 0; i < 1; i++) {
textblock1->addParbreak(0, wordStyle);
Textblock *textblock2 = new Textblock (false);
textblock1->addWidget (textblock2, widgetStyle2);
for(int j = 0; words2[j]; j++) {
if(j != 0)
textblock2->addSpace (wordStyle);
textblock2->addText (words2[j], wordStyle);
}
textblock2->flush ();
}
textblock1->flush ();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
widgetStyle2->unref();
wordStyle->unref();
delete layout;
return errorCode;
}

106
test/dw/dw_example.cc Normal file
View File

@ -0,0 +1,106 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl_Window.H>
#include <FL/Fl.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
int main(int argc, char **argv)
{
dw::fltk::FltkPlatform *platform = new dw::fltk::FltkPlatform ();
dw::core::Layout *layout = new dw::core::Layout (platform);
Fl_Window *window = new Fl_Window(200, 300, "Dw Example");
window->box(FL_NO_BOX);
window->begin();
dw::fltk::FltkViewport *viewport =
new dw::fltk::FltkViewport (0, 0, 200, 300);
layout->attachView (viewport);
dw::core::style::StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
dw::core::style::FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = dw::core::style::FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = dw::core::style::FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color =
dw::core::style::Color::create (layout, 0x000000);
styleAttrs.backgroundColor =
dw::core::style::Color::create (layout, 0xffffff);
dw::core::style::Style *widgetStyle =
dw::core::style::Style::create (&styleAttrs);
dw::Textblock *textblock = new dw::Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
dw::core::style::Style *wordStyle =
dw::core::style::Style::create (&styleAttrs);
for(int i = 1; i <= 10; i++) {
char buf[4];
sprintf(buf, "%d.", i);
const char *words[] = { "This", "is", "the", buf, "paragraph.",
"Here", "comes", "some", "more", "text",
"to", "demonstrate", "word", "wrapping.",
NULL };
for(int j = 0; words[j]; j++) {
textblock->addText(words[j], wordStyle);
textblock->addSpace(wordStyle);
}
textblock->addParbreak(10, wordStyle);
}
wordStyle->unref();
textblock->flush ();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

158
test/dw/dw_find_test.cc Normal file
View File

@ -0,0 +1,158 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
using namespace lout::container::typed;
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
static FltkPlatform *platform;
static Layout *layout;
static Fl_Window *window;
static FltkViewport *viewport;
static Fl_Button *findButton, *resetButton;
static Fl_Widget *resultLabel;
static void findCallback (Fl_Widget *widget, void *data)
{
//switch(layout->search ("worm", true)) {
switch(layout->search ("WORM", false, false)) {
case FindtextState::SUCCESS:
resultLabel->label("SUCCESS");
break;
case FindtextState::RESTART:
resultLabel->label("RESTART");
break;
case FindtextState::NOT_FOUND:
resultLabel->label("NOT_FOUND");
break;
}
resultLabel->redraw ();
}
static void resetCallback (Fl_Widget *widget, void *data)
{
layout->resetSearch ();
resultLabel->label("---");
resultLabel->redraw ();
}
int main(int argc, char **argv)
{
platform = new FltkPlatform ();
layout = new Layout (platform);
window = new Fl_Window(200, 300, "Dw Find Test");
window->box(FL_NO_BOX);
window->begin();
viewport = new FltkViewport (0, 0, 200, 280);
viewport->end();
layout->attachView (viewport);
findButton = new Fl_Button(0, 280, 50, 20, "Find");
findButton->callback (findCallback, NULL);
findButton->when (FL_WHEN_RELEASE);
findButton->clear_visible_focus ();
resetButton = new Fl_Button(50, 280, 50, 20, "Reset");
resetButton->callback (resetCallback, NULL);
resetButton->when (FL_WHEN_RELEASE);
resetButton->clear_visible_focus ();
resultLabel = new Fl_Box(100, 280, 100, 20, "---");
resultLabel->box(FL_FLAT_BOX);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.margin.setVal (10);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *topWidgetStyle = Style::create (&styleAttrs);
styleAttrs.margin.setVal (0);
styleAttrs.margin.left = 30;
styleAttrs.backgroundColor = NULL;
Style *widgetStyle = Style::create (&styleAttrs);
styleAttrs.margin.left = 0;
Style *wordStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (topWidgetStyle);
layout->setWidget (textblock);
Stack <Textblock> *stack = new Stack <Textblock> (false);
stack->push (textblock);
for(int i = 0; i < 10; i++)
for(int j = 0; j < 10; j++) {
Textblock *current;
if(j < 5) {
current = new Textblock (false);
stack->getTop()->addWidget (current, widgetStyle);
stack->push (current);
} else {
stack->getTop()->flush ();
stack->pop ();
current = stack->getTop ();
}
current->addText ((i == j ? "worm" : "apple"), wordStyle);
current->addLinebreak (wordStyle);
}
stack->getTop()->flush ();
topWidgetStyle->unref ();
widgetStyle->unref ();
wordStyle->unref ();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

145
test/dw/dw_float_test.cc Normal file
View File

@ -0,0 +1,145 @@
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
static Textblock *firstFloat;
static Style *wordStyle;
static void addTextToFloatTimeout (void *data)
{
printf("addTextToFloatTimeout\n");
const char *fWords[] = { "This", "is", "a", "float,", "which", "is",
"set", "aside", "from", "the", "main",
"text.", NULL };
for(int k = 0; fWords[k]; k++) {
firstFloat->addText(fWords[k], wordStyle);
firstFloat->addSpace(wordStyle);
}
firstFloat->flush();
Fl::repeat_timeout (2, addTextToFloatTimeout, NULL);
}
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(400, 600, "Dw Floats Example");
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 400, 600);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
styleAttrs.font = core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
styleAttrs.borderWidth.setVal (1);
styleAttrs.setBorderColor (Color::create (layout, 0x808080));
styleAttrs.setBorderStyle (BORDER_DASHED);
styleAttrs.width = createAbsLength(100);
styleAttrs.vloat = FLOAT_LEFT;
Style *leftFloatStyle = Style::create (&styleAttrs);
styleAttrs.width = createAbsLength(80);
styleAttrs.vloat = FLOAT_RIGHT;
Style *rightFloatStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
widgetStyle->unref();
styleAttrs.borderWidth.setVal (0);
styleAttrs.width = LENGTH_AUTO;
styleAttrs.vloat = FLOAT_NONE;
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
wordStyle = Style::create (&styleAttrs);
for(int i = 1; i <= 10; i++) {
char buf[16];
snprintf(buf, sizeof(buf), "%d%s",
i, (i == 1 ? "st" : (i == 2 ? "nd" : (i == 3 ? "rd" : "th"))));
const char *words[] = { "This", "is", "the", buf, "paragraph.",
"Here", "comes", "some", "more", "text",
"to", "demonstrate", "word", "wrapping.",
NULL };
for(int j = 0; words[j]; j++) {
textblock->addText(words[j], wordStyle);
textblock->addSpace(wordStyle);
if ((i == 3 || i == 5) && j == 8) {
textblock->addText("[float]", wordStyle);
textblock->addSpace(wordStyle);
Textblock *vloat = new Textblock (false);
textblock->addWidget(vloat, i == 3 ? leftFloatStyle : rightFloatStyle);
const char *fWords[] = { "This", "is", "a", "float,", "which", "is",
"set", "aside", "from", "the", "main",
"text.", NULL };
vloat->addText(i == 3 ? "Left:" : "Right:", wordStyle);
vloat->addSpace(wordStyle);
for(int k = 0; fWords[k]; k++) {
vloat->addText(fWords[k], wordStyle);
vloat->addSpace(wordStyle);
}
vloat->flush ();
if(i == 3)
firstFloat = vloat;
}
}
textblock->addParbreak(10, wordStyle);
}
leftFloatStyle->unref();
rightFloatStyle->unref();
textblock->flush ();
window->resizable(viewport);
window->show();
Fl::add_timeout (2, addTextToFloatTimeout, NULL);
int errorCode = Fl::run();
wordStyle->unref();
delete layout;
return errorCode;
}

View File

@ -0,0 +1,197 @@
/*
* Dillo Widget
*
* Copyright 2013 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdlib.h>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
#include "dw/image.hh"
using namespace lout::signal;
using namespace lout::misc;
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
class ImageStyleDeletionReceiver: public ObservedObject::DeletionReceiver
{
public:
void deleted (ObservedObject *object);
};
static StyleImage *image1 = NULL, *image2 = NULL;
static Layout *layout;
static int imgRow1 = 0, imgRow2 = 0;
static ImageStyleDeletionReceiver isdr;
void ImageStyleDeletionReceiver::deleted (ObservedObject *object)
{
if ((StyleImage*)object == image1)
image1 = NULL;
else if ((StyleImage*)object == image2)
image2 = NULL;
else
assertNotReached ();
}
static void imageInitTimeout (void *data)
{
if (image1) {
Imgbuf *imgbuf1 = layout->createImgbuf (Imgbuf::RGB, 400, 200, 1);
image1->getMainImgRenderer()->setBuffer (imgbuf1, false);
}
if (image2) {
Imgbuf *imgbuf2 = layout->createImgbuf (Imgbuf::RGB, 100, 100, 1);
image2->getMainImgRenderer()->setBuffer (imgbuf2, false);
}
}
static void imageDrawTimeout (void *data)
{
Imgbuf *imgbuf1 = image1 ? image1->getImgbufSrc () : NULL;
Imgbuf *imgbuf2 = image2 ? image2->getImgbufSrc () : NULL;
if (imgbuf1 && imgRow1 < 200) {
byte buf[3 * 400];
for(int x = 0; x < 400; x++) {
buf[3 * x + 0] = 128 + x * 127 / 399;
buf[3 * x + 1] = 128 + (399 - x) * 127 / 399;
buf[3 * x + 2] = 128 + imgRow1 * 127 / 199;
}
imgbuf1->copyRow (imgRow1, buf);
image1->getMainImgRenderer()->drawRow (imgRow1);
imgRow1++;
}
if (imgbuf2 && imgRow2 < 100) {
byte buf[3 * 100];
for(int x = 0; x < 100; x++) {
int r = 128 + rand () % 127;
buf[3 * x + 0] = buf[3 * x + 1] = buf[3 * x + 2] = r;
}
imgbuf2->copyRow (imgRow2, buf);
image2->getMainImgRenderer()->drawRow (imgRow2);
imgRow2++;
}
if(imgRow1 < 200 || imgRow2 < 100)
Fl::repeat_timeout (0.5, imageDrawTimeout, NULL);
}
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
layout = new Layout (platform);
Fl_Window *window = new Fl_Window(200, 300, "Dw Example");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 200, 300);
layout->attachView (viewport);
image1 = StyleImage::create ();
image1->connectDeletion (&isdr);
layout->setBgImage (image1, BACKGROUND_REPEAT_Y,
BACKGROUND_ATTACHMENT_SCROLL, createPerLength (0.5),
createAbsLength (30));
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
styleAttrs.x_lang[0] = 'e';
styleAttrs.x_lang[1] = 'n';
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
//styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
styleAttrs.backgroundImage = NULL;
Style *wordStyle = Style::create (&styleAttrs);
image2 = styleAttrs.backgroundImage = StyleImage::create ();
image2->connectDeletion (&isdr);
styleAttrs.backgroundRepeat = BACKGROUND_REPEAT;
styleAttrs.backgroundPositionX = createPerLength (0);
styleAttrs.backgroundPositionY = createPerLength (0);
Style *wordStyleBg = Style::create (&styleAttrs);
for(int i = 1; i <= 1; i++) {
char buf[4];
sprintf(buf, "%d.", i);
const char *words[] = { "This", "is", "the", buf, "paragraph.",
"Here", "comes", "some", "more", "text",
"to", "demonstrate", "word", "wrapping.",
NULL };
for(int j = 0; words[j]; j++) {
textblock->addText(words[j], j == 11 ? wordStyleBg : wordStyle);
textblock->addSpace(wordStyle);
}
textblock->addParbreak(10, wordStyle);
}
wordStyle->unref();
wordStyleBg->unref();
textblock->flush ();
window->resizable(viewport);
window->show();
Fl::add_timeout (1.0, imageInitTimeout, NULL);
Fl::add_timeout (0.1, imageDrawTimeout, NULL);
int errorCode = Fl::run();
delete layout;
return errorCode;
}

156
test/dw/dw_images_scaled.cc Normal file
View File

@ -0,0 +1,156 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
#include "dw/image.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
static Layout *layout;
static Image *image;
static core::Imgbuf *imgbuf = NULL;
static int imgRow = 0;
static void imageInitTimeout (void *data)
{
//imgbuf = layout->createImgbuf (Imgbuf::RGBA, 400, 200);
imgbuf = layout->createImgbuf (Imgbuf::RGB, 400, 200, 1);
image->setBuffer (imgbuf);
}
/*
static void imageDrawTimeout (void *data)
{
if (imgbuf) {
for (int i = 0; i < 1; i++) {
byte buf[4 * 400];
for(int x = 0; x < 400; x++) {
buf[4 * x + 0] = x * 255 / 399;
buf[4 * x + 1] = (399 - x) * 255 / 399;
buf[4 * x + 2] = imgRow * 255 / 199;
buf[4 * x + 3] = (199 - imgRow) * 255 / 199;
}
imgbuf->copyRow (imgRow, buf);
image->drawRow (imgRow);
imgRow++;
}
}
if(imgRow < 200)
::fltk::repeat_timeout (0.5, imageDrawTimeout, NULL);
}
*/
static void imageDrawTimeout (void *data)
{
if (imgbuf) {
for (int i = 0; i < 1; i++) {
byte buf[3 * 400];
for(int x = 0; x < 400; x++) {
buf[3 * x + 0] = x * 255 / 399;
buf[3 * x + 1] = (399 - x) * 255 / 399;
buf[3 * x + 2] = imgRow * 255 / 199;
}
imgbuf->copyRow (imgRow, buf);
image->drawRow (imgRow);
imgRow++;
}
}
if(imgRow < 200)
Fl::repeat_timeout (0.5, imageDrawTimeout, NULL);
}
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
layout = new Layout (platform);
Fl_Window *window = new Fl_Window(410, 210, "Dw Scaled Image");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 410, 210);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
styleAttrs.width = createPerLength (1.0);
styleAttrs.height = createPerLength (1.0);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
Style *imageStyle = Style::create (&styleAttrs);
image = new dw::Image ("");
textblock->addWidget (image, imageStyle);
textblock->addSpace (imageStyle);
imageStyle->unref();
textblock->flush ();
window->resizable(viewport);
window->show();
Fl::add_timeout (2.0, imageInitTimeout, NULL);
Fl::add_timeout (0.1, imageDrawTimeout, NULL);
int errorCode = Fl::run();
delete layout;
return errorCode;
}

View File

@ -0,0 +1,151 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
#include "dw/image.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
static Layout *layout;
static Image *image1, *image2;
static core::Imgbuf *imgbuf = NULL;
static int imgRow = 0;
static void imageInitTimeout (void *data)
{
imgbuf = layout->createImgbuf (Imgbuf::RGB, 400, 200, 1);
image1->setBuffer (imgbuf);
image2->setBuffer (imgbuf);
}
static void imageDrawTimeout (void *data)
{
if (imgbuf) {
for (int i = 0; i < 1; i++) {
byte buf[3 * 400];
for(int x = 0; x < 400; x++) {
buf[3 * x + 0] = x * 255 / 399;
buf[3 * x + 1] = (399 - x) * 255 / 399;
buf[3 * x + 2] = imgRow * 255 / 199;
}
imgbuf->copyRow (imgRow, buf);
image1->drawRow (imgRow);
image2->drawRow (imgRow);
imgRow++;
}
}
if(imgRow < 200)
Fl::repeat_timeout (0.5, imageDrawTimeout, NULL);
}
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
layout = new Layout (platform);
Fl_Window *window = new Fl_Window(410, 210, "Dw Scaled Image 2");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 410, 210);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.borderWidth.setVal (0);
styleAttrs.padding.setVal (0);
styleAttrs.backgroundColor = NULL;
Style *wordStyle = Style::create (&styleAttrs);
styleAttrs.borderWidth.setVal (1);
styleAttrs.setBorderColor (Color::create (layout, 0x000080));
styleAttrs.setBorderStyle (BORDER_SOLID);
styleAttrs.padding.setVal (1);
styleAttrs.backgroundColor = NULL;
styleAttrs.width = createPerLength (0.25);
styleAttrs.height = createPerLength (0.25);
Style *imageStyle1 = Style::create (&styleAttrs);
image1 = new dw::Image ("A longer ALT Text to demonstrate clipping.");
textblock->addWidget (image1, imageStyle1);
imageStyle1->unref();
textblock->addParbreak (10, wordStyle);
styleAttrs.width = LENGTH_AUTO;
styleAttrs.height = LENGTH_AUTO;
Style *imageStyle2 = Style::create (&styleAttrs);
image2 = new dw::Image ("A longer ALT Text to demonstrate clipping.");
textblock->addWidget (image2, imageStyle2);
imageStyle2->unref();
wordStyle->unref ();
textblock->flush ();
window->resizable(viewport);
window->show();
Fl::add_timeout (3.0, imageInitTimeout, NULL);
Fl::add_timeout (0.1, imageDrawTimeout, NULL);
int errorCode = Fl::run();
delete layout;
return errorCode;
}

155
test/dw/dw_images_simple.cc Normal file
View File

@ -0,0 +1,155 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
#include "dw/image.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
static Layout *layout;
static Image *image;
static core::Imgbuf *imgbuf = NULL;
static int imgRow = 0;
static void imageInitTimeout (void *data)
{
const bool resize = true;
//imgbuf = layout->createImgbuf (Imgbuf::RGBA, 400, 200);
imgbuf = layout->createImgbuf (Imgbuf::RGB, 400, 200, 1);
image->setBuffer (imgbuf, resize);
}
/*
static void imageDrawTimeout (void *data)
{
if (imgbuf) {
for (int i = 0; i < 1; i++) {
byte buf[4 * 400];
for(int x = 0; x < 400; x++) {
buf[4 * x + 0] = x * 255 / 399;
buf[4 * x + 1] = (399 - x) * 255 / 399;
buf[4 * x + 2] = imgRow * 255 / 199;
buf[4 * x + 3] = (199 - imgRow) * 255 / 199;
}
imgbuf->copyRow (imgRow, buf);
image->drawRow (imgRow);
imgRow++;
}
}
if(imgRow < 200)
Fl::repeat_timeout (0.5, imageDrawTimeout, NULL);
}
*/
static void imageDrawTimeout (void *data)
{
if (imgbuf) {
for (int i = 0; i < 1; i++) {
byte buf[3 * 400];
for(int x = 0; x < 400; x++) {
buf[3 * x + 0] = x * 255 / 399;
buf[3 * x + 1] = (399 - x) * 255 / 399;
buf[3 * x + 2] = imgRow * 255 / 199;
}
imgbuf->copyRow (imgRow, buf);
image->drawRow (imgRow);
imgRow++;
}
}
if(imgRow < 200)
Fl::repeat_timeout (0.5, imageDrawTimeout, NULL);
}
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
layout = new Layout (platform);
Fl_Window *window = new Fl_Window(410, 210, "Dw Simple Image");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 410, 210);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
Style *imageStyle = Style::create (&styleAttrs);
image = new dw::Image ("");
textblock->addWidget (image, imageStyle);
textblock->addSpace (imageStyle);
imageStyle->unref();
textblock->flush ();
window->resizable(viewport);
window->show();
Fl::add_timeout (2.0, imageInitTimeout, NULL);
Fl::add_timeout (0.1, imageDrawTimeout, NULL);
int errorCode = Fl::run();
delete layout;
return errorCode;
}

View File

@ -0,0 +1,109 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "dw/core.hh"
#include "dw/fltkcore.hh"
using namespace lout::signal;
using namespace dw::core;
using namespace dw::fltk;
void solution1 ()
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Imgbuf *rootbuf = layout->createImgbuf (Imgbuf::RGB, 100, 100, 1);
rootbuf->ref (); // Extra reference by the dicache.
printf ("=== Can be deleted? %s.\n",
rootbuf->lastReference () ? "Yes" : "No");
Imgbuf *scaledbuf = rootbuf->getScaledBuf (50, 50);
printf ("=== Can be deleted? %s.\n",
rootbuf->lastReference () ? "Yes" : "No");
rootbuf->unref ();
printf ("=== Can be deleted? %s.\n",
rootbuf->lastReference () ? "Yes" : "No");
scaledbuf->unref ();
printf ("=== Can be deleted? %s.\n",
rootbuf->lastReference () ? "Yes" : "No");
rootbuf->unref (); // Extra reference by the dicache.
delete layout;
}
void solution2 ()
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Imgbuf *rootbuf = layout->createImgbuf (Imgbuf::RGB, 100, 100, 1);
rootbuf->setDeleteOnUnref (false);
printf ("=== Can be deleted? %s.\n",
!rootbuf->isReferred () ? "Yes" : "No");
Imgbuf *scaledbuf = rootbuf->getScaledBuf (50, 50);
printf ("=== Can be deleted? %s.\n",
!rootbuf->isReferred () ? "Yes" : "No");
rootbuf->unref ();
printf ("=== Can be deleted? %s.\n",
!rootbuf->isReferred () ? "Yes" : "No");
scaledbuf->unref ();
printf ("=== Can be deleted? %s.\n",
!rootbuf->isReferred () ? "Yes" : "No");
delete rootbuf;
delete layout;
}
class RootbufDeletionReceiver: public ObservedObject::DeletionReceiver
{
void deleted (ObservedObject *object);
};
void RootbufDeletionReceiver::deleted (ObservedObject *object)
{
printf ("=== Is deleted now.\n");
delete this;
}
void solution3 ()
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Imgbuf *rootbuf = layout->createImgbuf (Imgbuf::RGB, 100, 100, 1);
rootbuf->connectDeletion (new RootbufDeletionReceiver ());
Imgbuf *scaledbuf = rootbuf->getScaledBuf (50, 50);
rootbuf->unref ();
scaledbuf->unref ();
delete layout;
}
int main (int argc, char **argv)
{
printf ("========== SOLUTION 1 ==========\n");
solution1 ();
printf ("========== SOLUTION 2 ==========\n");
solution2 ();
printf ("========== SOLUTION 3 ==========\n");
solution3 ();
return 0;
}

164
test/dw/dw_links.cc Normal file
View File

@ -0,0 +1,164 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
class LinkTestReceiver: public Layout::LinkReceiver
{
bool enter (Widget *widget, int link, int img, int x, int y);
bool press (Widget *widget, int link, int img, int x, int y,
EventButton *event);
bool release (Widget *widget, int link, int img, int x, int y,
EventButton *event);
bool click (Widget *widget, int link, int img,
int x, int y, EventButton *event);
};
bool LinkTestReceiver::enter (Widget *widget, int link, int img, int x, int y)
{
printf ("enter: %d\n", link);
return true;
}
bool LinkTestReceiver::press (Widget *widget, int link, int img, int x, int y,
EventButton *event)
{
printf ("press: %d\n", link);
return true;
}
bool LinkTestReceiver::release (Widget *widget, int link, int img, int x,int y,
EventButton *event)
{
printf ("release: %d\n", link);
return true;
}
bool LinkTestReceiver::click (Widget *widget, int link, int img, int x, int y,
EventButton *event)
{
printf ("click: %d\n", link);
return true;
}
int main(int argc, char **argv)
{
LinkTestReceiver linkTestReceiver;
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(200, 300, "Dw Links");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 200, 300);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
layout->connectLink (&linkTestReceiver);
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
styleAttrs.cursor = CURSOR_TEXT;
Style *wordStyle = Style::create (&styleAttrs);
styleAttrs.color = Color::create (layout, 0x0000ff);
styleAttrs.textDecoration = TEXT_DECORATION_UNDERLINE;
styleAttrs.cursor = CURSOR_POINTER;
for(int i = 1; i <= 10; i++) {
char buf[4];
sprintf(buf, "%d.", i);
const char *words1[] = {
"This", "is", "the", buf, "paragraph.",
"Here", "comes", "some", "more", "text",
"to", "demonstrate", "word", "wrapping.",
NULL };
const char *words2[] = {
"Click", "here", "for", "more..", NULL };
for(int j = 0; words1[j]; j++) {
textblock->addText(words1[j], wordStyle);
textblock->addSpace(wordStyle);
}
styleAttrs.x_link = i;
Style *linkStyle = Style::create (&styleAttrs);
for(int j = 0; words2[j]; j++) {
textblock->addText(words2[j], linkStyle);
textblock->addSpace(wordStyle);
}
linkStyle->unref ();
textblock->addParbreak(10, wordStyle);
}
wordStyle->unref();
textblock->flush ();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

193
test/dw/dw_links2.cc Normal file
View File

@ -0,0 +1,193 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
class LinkTestReceiver: public Layout::LinkReceiver
{
bool enter (Widget *widget, int link, int img, int x, int y);
bool press (Widget *widget, int link, int img, int x, int y,
EventButton *event);
bool release (Widget *widget, int link, int img, int x, int y,
EventButton *event);
bool click (Widget *widget, int link, int img, int x, int y,
EventButton *event);
};
bool LinkTestReceiver::enter (Widget *widget, int link, int img, int x, int y)
{
printf ("enter: %d\n", link);
return true;
}
bool LinkTestReceiver::press (Widget *widget, int link, int img, int x, int y,
EventButton *event)
{
printf ("press: %d\n", link);
return true;
}
bool LinkTestReceiver::release (Widget *widget, int link, int img, int x,int y,
EventButton *event)
{
printf ("release: %d\n", link);
return true;
}
bool LinkTestReceiver::click (Widget *widget, int link, int img, int x, int y,
EventButton *event)
{
printf ("click: %d\n", link);
return true;
}
int main(int argc, char **argv)
{
int MainIdx;
int ww = 200, wh = 300, lh = 24;
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(200, 300, "Dw Links2");
window->box(FL_NO_BOX);
window->begin();
Fl_Widget *Panel = new Fl_Box(0, 0, ww, lh, "CONTROL PANEL");
Panel->color(FL_GRAY_RAMP + 3);
Panel->labelcolor(FL_WHITE);
Panel->box(FL_FLAT_BOX);
Fl_Widget *Main = new Fl_Box(0, lh, ww, wh - 2*lh, "MAIN RENDERING AREA");
Main->color(FL_GRAY_RAMP + 4);
Main->labelcolor(FL_WHITE);
MainIdx = window->find(Main);
/* status bar */
Fl_Widget *Bar = new Fl_Box(0, wh - lh, 200, lh, "STATUS BAR...");
Bar->color(FL_GRAY_RAMP + 3);
Bar->labelcolor(FL_WHITE);
Bar->box(FL_FLAT_BOX);
window->resizable(Main);
window->end();
//
// Create the main Dw and add some text there.
//
window->remove(MainIdx);
window->begin();
FltkViewport *viewport = new FltkViewport (0, lh, ww, wh - 2*lh);
layout->attachView (viewport);
window->end();
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
layout->connectLink (new LinkTestReceiver ());
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
styleAttrs.cursor = CURSOR_TEXT;
Style *wordStyle = Style::create (&styleAttrs);
styleAttrs.color = Color::create (layout, 0x0000ff);
styleAttrs.textDecoration = TEXT_DECORATION_UNDERLINE;
styleAttrs.cursor = CURSOR_POINTER;
for(int i = 1; i <= 30; i++) {
char buf[4];
sprintf(buf, "%d.", i);
const char *words1[] = {
"This", "is", "the", buf, "paragraph.",
"Here", "comes", "some", "more", "text",
"to", "demonstrate", "word", "wrapping.",
NULL };
const char *words2[] = {
"Click", "here", "for", "more..", NULL };
for(int j = 0; words1[j]; j++) {
textblock->addText (words1[j], wordStyle);
textblock->addSpace(wordStyle);
}
styleAttrs.x_link = i;
Style *linkStyle = Style::create (&styleAttrs);
for(int j = 0; words2[j]; j++) {
textblock->addText (words2[j], linkStyle);
textblock->addSpace(wordStyle);
}
linkStyle->unref ();
textblock->addParbreak(10, wordStyle);
}
wordStyle->unref();
textblock->flush ();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

137
test/dw/dw_lists.cc Normal file
View File

@ -0,0 +1,137 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
#include "dw/listitem.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(200, 300, "Dw Lists");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 200, 300);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
styleAttrs.cursor = CURSOR_TEXT;
Style *wordStyle = Style::create (&styleAttrs);
styleAttrs.margin.setVal (5);
styleAttrs.padding.setVal (5);
styleAttrs.backgroundColor = Color::create (layout, 0xffff40);
styleAttrs.setBorderColor (Color::create (layout, 0x000000));
styleAttrs.setBorderStyle (BORDER_SOLID);
styleAttrs.borderWidth.setVal (1);
Style *itemStyle = Style::create (&styleAttrs);
const char *wordsPar[] = {
"This", "is", "a", "normal", "paragraph.", "And",
"some", "list", "items", "follow:", NULL };
const char *wordsItem[] = {
"This", "is", "a", "list", "item.", "Here",
"comes", "some", "more", "text", "to",
"demonstrate", "word", "wrapping.", NULL };
for(int i = 0; wordsPar[i]; i++) {
if(i != 0)
textblock->addSpace (wordStyle);
textblock->addText (wordsPar[i], wordStyle);
}
textblock->addParbreak (5, wordStyle);
ListItem *refItem = NULL;
for(int i = 1; i <= 100; i++) {
ListItem *listItem = new ListItem (refItem, false);
refItem = listItem;
textblock->addWidget (listItem, itemStyle);
textblock->addParbreak (2, wordStyle);
char buf[16];
sprintf (buf, "%d.", i);
listItem->initWithText (buf, wordStyle);
for(int j = 0; wordsItem[j]; j++) {
if(j != 0)
listItem->addSpace (wordStyle);
listItem->addText (wordsItem[j], wordStyle);
}
listItem->flush ();
}
wordStyle->unref();
textblock->flush ();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

103
test/dw/dw_resource_test.cc Normal file
View File

@ -0,0 +1,103 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/textblock.hh"
#include "dw/ui.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::core::ui;
using namespace dw::fltk;
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(410, 210, "Dw Resource test");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 410, 210);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *widgetStyle = Style::create (&styleAttrs);
Textblock *textblock = new Textblock (false);
textblock->setStyle (widgetStyle);
layout->setWidget (textblock);
widgetStyle->unref();
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
widgetStyle = Style::create (&styleAttrs);
SelectionResource *res = layout->getResourceFactory()->createListResource
(ListResource::SELECTION_AT_MOST_ONE, 4);
//SelectionResource *res =
// layout->getResourceFactory()->createOptionMenuResource ();
Embed *embed = new Embed (res);
textblock->addWidget (embed, widgetStyle);
textblock->addSpace (widgetStyle);
widgetStyle->unref();
for(int i = 0; i < 50; i++)
res->addItem ("Hello, world!", true, i == 0 ? true : false);
textblock->flush ();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

View File

@ -0,0 +1,245 @@
/*
* Dillo Widget
*
* Copyright 2014 Sebastian Geerken <sgeerken@dillo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <math.h>
#include "dw_simple_container.hh"
using namespace dw::core;
using namespace dw::core::style;
using namespace lout::misc;
namespace dw {
int SimpleContainer::CLASS_ID = -1;
// ----------------------------------------------------------------------
SimpleContainer::SimpleContainerIterator::SimpleContainerIterator
(SimpleContainer *simpleContainer, Content::Type mask, bool atEnd) :
Iterator (simpleContainer, mask, atEnd)
{
content.type = atEnd ? Content::END : Content::START;
}
lout::object::Object *SimpleContainer::SimpleContainerIterator::clone ()
{
SimpleContainerIterator *sci =
new SimpleContainerIterator ((SimpleContainer*)getWidget(),
getMask(), false);
sci->content = content;
return sci;
}
int SimpleContainer::SimpleContainerIterator::index ()
{
switch (content.type) {
case Content::START:
return 0;
case Content::WIDGET_IN_FLOW:
return 1;
case Content::END:
return 2;
default:
assertNotReached ();
return 0;
}
}
int SimpleContainer::SimpleContainerIterator::compareTo
(lout::object::Comparable *other)
{
return index () - ((SimpleContainerIterator*)other)->index ();
}
bool SimpleContainer::SimpleContainerIterator::next ()
{
SimpleContainer *simpleContainer = (SimpleContainer*)getWidget();
if (content.type == Content::END)
return false;
// simple containers only contain widgets:
if ((getMask() & Content::WIDGET_IN_FLOW) == 0) {
content.type = Content::END;
return false;
}
if (content.type == Content::START) {
if (simpleContainer->child != NULL) {
content.type = Content::WIDGET_IN_FLOW;
content.widget = simpleContainer->child;
return true;
} else {
content.type = Content::END;
return false;
}
} else /* if (content.type == Content::WIDGET) */ {
content.type = Content::END;
return false;
}
}
bool SimpleContainer::SimpleContainerIterator::prev ()
{
SimpleContainer *simpleContainer = (SimpleContainer*)getWidget();
if (content.type == Content::START)
return false;
// simple containers only contain widgets:
if ((getMask() & Content::WIDGET_IN_FLOW) == 0) {
content.type = Content::START;
return false;
}
if (content.type == Content::END) {
if (simpleContainer->child != NULL) {
content.type = Content::WIDGET_IN_FLOW;
content.widget = simpleContainer->child;
return true;
} else {
content.type = Content::START;
return false;
}
} else /* if (content.type == Content::WIDGET) */ {
content.type = Content::START;
return false;
}
}
void SimpleContainer::SimpleContainerIterator::highlight (int start,
int end,
HighlightLayer layer)
{
/** todo Needs this an implementation? */
}
void SimpleContainer::SimpleContainerIterator::unhighlight (int direction,
HighlightLayer
layer)
{
/** todo Needs this an implementation? */
}
void SimpleContainer::SimpleContainerIterator::getAllocation (int start,
int end,
Allocation
*allocation)
{
/** \bug Not implemented. */
}
// ----------------------------------------------------------------------
SimpleContainer::SimpleContainer ()
{
registerName ("dw::SimpleContainer", &CLASS_ID);
child = NULL;
}
SimpleContainer::~SimpleContainer ()
{
if (child)
delete child;
}
void SimpleContainer::sizeRequestSimpl (Requisition *requisition)
{
Requisition childReq;
if (child)
child->sizeRequest (&childReq);
else
childReq.width = childReq.ascent = childReq.descent = 0;
requisition->width = childReq.width + boxDiffWidth ();
requisition->ascent = childReq.ascent + boxOffsetY ();
requisition->descent = childReq.descent + boxRestHeight ();
correctRequisition (requisition, splitHeightPreserveAscent, true, true);
}
void SimpleContainer::getExtremesSimpl (Extremes *extremes)
{
Extremes childExtr;
if (child)
child->getExtremes (&childExtr);
else
childExtr.minWidth = childExtr.minWidthIntrinsic = childExtr.maxWidth =
childExtr.maxWidthIntrinsic = extremes->adjustmentWidth = 0;
extremes->minWidth = childExtr.minWidth + boxDiffWidth ();
extremes->minWidthIntrinsic = childExtr.minWidthIntrinsic + boxDiffWidth ();
extremes->maxWidth = childExtr.maxWidth + boxDiffWidth ();
extremes->maxWidthIntrinsic = childExtr.maxWidthIntrinsic + boxDiffWidth ();
extremes->adjustmentWidth = childExtr.adjustmentWidth + boxDiffWidth ();
correctExtremes (extremes, true);
}
void SimpleContainer::sizeAllocateImpl (Allocation *allocation)
{
Allocation childAlloc;
if (child) {
childAlloc.x = allocation->x + boxOffsetX ();
childAlloc.y = allocation->y + boxOffsetY ();
childAlloc.width = allocation->width - boxDiffWidth ();
childAlloc.ascent = allocation->ascent - boxOffsetY ();
childAlloc.descent = allocation->descent - boxRestHeight ();
child->sizeAllocate (&childAlloc);
}
}
void SimpleContainer::draw (View *view, Rectangle *area,
DrawingContext *context)
{
drawWidgetBox (view, area, false);
Rectangle childArea;
if (child && child->intersects (this, area, &childArea))
child->draw (view, &childArea, context);
}
Iterator *SimpleContainer::iterator (Content::Type mask, bool atEnd)
{
return new SimpleContainerIterator (this, mask, atEnd);
}
void SimpleContainer::removeChild (Widget *child)
{
assert (child == this->child);
this->child = NULL;
queueResize (0, true);
}
void SimpleContainer::setChild (Widget *child)
{
if (this->child)
delete this->child;
this->child = child;
if (this->child)
this->child->setParent (this);
queueResize (0, true);
}
} // namespace dw

View File

@ -0,0 +1,57 @@
#ifndef __DW_SIMPLE_CONTAINER_HH__
#define __DW_SIMPLE_CONTAINER_HH__
#include "dw/core.hh"
namespace dw {
/**
* Simple widget used for testing concepts.
*/
class SimpleContainer: public core::Widget
{
private:
class SimpleContainerIterator: public core::Iterator
{
private:
int index ();
public:
SimpleContainerIterator (SimpleContainer *simpleContainer,
core::Content::Type mask,
bool atEnd);
lout::object::Object *clone ();
int compareTo (lout::object::Comparable *other);
bool next ();
bool prev ();
void highlight (int start, int end, core::HighlightLayer layer);
void unhighlight (int direction, core::HighlightLayer layer);
void getAllocation (int start, int end, core::Allocation *allocation);
};
Widget *child;
protected:
void sizeRequestSimpl (core::Requisition *requisition);
void getExtremesSimpl (core::Extremes *extremes);
void sizeAllocateImpl (core::Allocation *allocation);
public:
static int CLASS_ID;
SimpleContainer ();
~SimpleContainer ();
void draw (core::View *view, core::Rectangle *area,
core::DrawingContext *context);
core::Iterator *iterator (core::Content::Type mask, bool atEnd);
void removeChild (Widget *child);
void setChild (core::Widget *child);
};
} // namespace dw
#endif // __DW_SIMPLE_CONTAINER_HH__

View File

@ -0,0 +1,115 @@
/*
* Dillo Widget
*
* Copyright 2014 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl_Window.H>
#include <FL/Fl.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw_simple_container.hh"
#include "dw/textblock.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(200, 300, "Dw Example");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 200, 300);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
Style *textblockStyle1 = Style::create (&styleAttrs);
styleAttrs.backgroundColor = NULL;
styleAttrs.margin.setVal (0);
Style *textblockStyle2 = Style::create (&styleAttrs);
Style *wordStyle = Style::create (&styleAttrs);
styleAttrs.borderWidth.setVal (5);
styleAttrs.setBorderColor (Color::create (layout, 0x800080));
styleAttrs.setBorderStyle (BORDER_DASHED);
styleAttrs.padding.setVal (5);
Style *containerStyle = Style::create (&styleAttrs);
Textblock *textblock1 = new Textblock (false);
textblock1->setStyle (textblockStyle1);
layout->setWidget (textblock1);
SimpleContainer *simpleContainer = new SimpleContainer ();
simpleContainer->setStyle (containerStyle);
textblock1->addWidget (simpleContainer, containerStyle);
Textblock *textblock2 = new Textblock (false);
textblock2->setStyle (textblockStyle2);
simpleContainer->setChild (textblock2);
const char *words[] = { "This", "is", "only", "a", "short", "paragraph.",
NULL };
for(int j = 0; words[j]; j++) {
textblock2->addText(words[j], wordStyle);
textblock2->addSpace(wordStyle);
}
textblockStyle1->unref();
textblockStyle2->unref();
containerStyle->unref();
wordStyle->unref();
textblock1->flush ();
textblock2->flush ();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

117
test/dw/dw_table.cc Normal file
View File

@ -0,0 +1,117 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/table.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(300, 300, "Dw Table");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 300, 300);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
styleAttrs.padding.setVal (0);
styleAttrs.borderWidth.setVal (1);
styleAttrs.setBorderStyle (BORDER_OUTSET);
styleAttrs.setBorderColor (Color::create (layout, 0xffffff));
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
styleAttrs.hBorderSpacing = 5;
styleAttrs.vBorderSpacing = 5;
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
Style *tableStyle = Style::create (&styleAttrs);
Table *table = new Table (false);
table->setStyle (tableStyle);
layout->setWidget (table);
tableStyle->unref();
styleAttrs.setBorderStyle (BORDER_INSET);
styleAttrs.backgroundColor = NULL;
styleAttrs.margin.setVal (0);
styleAttrs.padding.setVal (5);
Style *cellStyle = Style::create (&styleAttrs);
styleAttrs.borderWidth.setVal (0);
styleAttrs.margin.setVal (0);
styleAttrs.cursor = CURSOR_TEXT;
styleAttrs.textAlignChar = '.';
Style *wordStyle = Style::create (&styleAttrs);
for (int i = 0; i < 4; i++) {
table->addRow (wordStyle);
for (int j = 0; j < 4; j++) {
Textblock *cell = new Textblock (false);
cell->setStyle (cellStyle);
table->addCell (cell, 1, 1);
char buf[10];
sprintf (buf, "cell %c", 'A' + 4 * i + j);
cell->addText (buf, wordStyle);
cell->flush ();
}
}
wordStyle->unref();
cellStyle->unref();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

122
test/dw/dw_table_aligned.cc Normal file
View File

@ -0,0 +1,122 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/table.hh"
#include "dw/alignedtablecell.hh"
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::fltk;
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(200, 300, "Dw Table Aligned");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 200, 300);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
styleAttrs.borderWidth.setVal (1);
styleAttrs.setBorderStyle (BORDER_OUTSET);
styleAttrs.setBorderColor (Color::create (layout, 0x808080));
FontAttrs fontAttrs;
fontAttrs.name = "Bitstream Charter";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xa0a0a0);
styleAttrs.hBorderSpacing = 5;
styleAttrs.vBorderSpacing = 5;
Style *tableStyle = Style::create (&styleAttrs);
Table *table = new Table (false);
table->setStyle (tableStyle);
layout->setWidget (table);
tableStyle->unref();
styleAttrs.borderWidth.setVal (1);
styleAttrs.setBorderStyle (BORDER_INSET);
Style *cellStyle = Style::create (&styleAttrs);
styleAttrs.borderWidth.setVal (0);
styleAttrs.margin.setVal (0);
styleAttrs.backgroundColor = NULL;
styleAttrs.cursor = CURSOR_TEXT;
styleAttrs.textAlignChar = '.';
Style *wordStyle = Style::create (&styleAttrs);
AlignedTableCell *ref = NULL;
for(int i = 0; i < 10; i++) {
//for(int i = 0; i < 1; i++) {
AlignedTableCell *cell = new AlignedTableCell (ref, false);
cell->setStyle (cellStyle);
ref = cell;
table->addRow (wordStyle);
table->addCell (cell, 1, 1);
char buf[16];
for(int j = 0; j < i; j++)
buf[j] = '0' + j;
buf[i] = '.';
for(int j = i + 1; j < 11; j++)
buf[j] = '0' + (j - 1);
buf[11] = 0;
cell->addText (buf, wordStyle);
cell->flush ();
}
wordStyle->unref();
cellStyle->unref();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete layout;
return errorCode;
}

246
test/dw/dw_ui_test.cc Normal file
View File

@ -0,0 +1,246 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
* Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include "dw/core.hh"
#include "dw/fltkcore.hh"
#include "dw/fltkviewport.hh"
#include "dw/table.hh"
#include "dw/textblock.hh"
#include "dw/ui.hh"
#include "form.hh"
using namespace lout::object;
using namespace lout::container::typed;
using namespace dw;
using namespace dw::core;
using namespace dw::core::style;
using namespace dw::core::ui;
using namespace dw::fltk;
int main(int argc, char **argv)
{
FltkPlatform *platform = new FltkPlatform ();
Layout *layout = new Layout (platform);
Fl_Window *window = new Fl_Window(400, 400, "Dw UI Test");
window->box(FL_NO_BOX);
window->begin();
FltkViewport *viewport = new FltkViewport (0, 0, 400, 400);
layout->attachView (viewport);
StyleAttrs styleAttrs;
styleAttrs.initValues ();
styleAttrs.margin.setVal (5);
styleAttrs.color = Color::create (layout, 0x000000);
styleAttrs.backgroundColor = Color::create (layout, 0xffffff);
FontAttrs fontAttrs;
fontAttrs.name = "Helvetica";
fontAttrs.size = 14;
fontAttrs.weight = 400;
fontAttrs.style = FONT_STYLE_NORMAL;
fontAttrs.letterSpacing = 0;
fontAttrs.fontVariant = FONT_VARIANT_NORMAL;
styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs);
Style *tableStyle = Style::create (&styleAttrs);
Table *table = new Table (false);
table->setStyle (tableStyle);
layout->setWidget (table);
tableStyle->unref();
styleAttrs.backgroundColor = NULL;
styleAttrs.margin.setVal (0);
Style *cellStyle = Style::create (&styleAttrs);
// First of all, the resources. Later, they are embedded into the
// widget tree.
EntryResource *entryres1 =
layout->getResourceFactory()->createEntryResource (10, false, NULL,NULL);
entryres1->setText ("Hi!");
EntryResource *entryres2 =
layout->getResourceFactory()->createEntryResource (10, true, NULL,
"password field!");
MultiLineTextResource *textres =
layout->getResourceFactory()->createMultiLineTextResource (15,3,
"textarea placeholder!");
RadioButtonResource *radiores1 =
layout->getResourceFactory()->createRadioButtonResource (NULL, false);
RadioButtonResource *radiores2 =
layout->getResourceFactory()->createRadioButtonResource (radiores1,
false);
CheckButtonResource *checkres =
layout->getResourceFactory()->createCheckButtonResource (true);
SelectionResource *selres[2];
selres[0] = layout->getResourceFactory()->createOptionMenuResource ();
selres[1] = layout->getResourceFactory()->createListResource
(ListResource::SELECTION_AT_MOST_ONE, 4);
LabelButtonResource *buttonres =
layout->getResourceFactory()->createLabelButtonResource ("Run!");
// Note on complex buttons: before any operations on the widget, which
// need a layout, the complex button resource should be created, since
// then, a layout and a platform are instantiated.
Textblock *cbuttontext = new Textblock(false);
ComplexButtonResource *cbuttonres =
layout->getResourceFactory()->createComplexButtonResource (cbuttontext,
true);
cbuttontext->setStyle (cellStyle);
cbuttontext->addText ("Run (complex)!", cellStyle);
cbuttontext->flush ();
// The entry resources are put into a special handler, which is
// also a receiver for the button resources.
form::Form *form = new form::Form();
form->addTextResource ("val1", entryres1);
form->addTextResource ("val2", entryres2);
form->addTextResource ("text", textres);
const char *radiovalues[] = { "radio1", "radio2", NULL };
form->addRadioButtonResource ("val3", radiores1, radiovalues);
form->addCheckButtonResource ("check", checkres);
const char *selvalues[] = { "i1", "g1", "i11", "i12", "i13", "(pop)", "i2",
"g2", "i21", "i22", "i23", "(pop)", "i3", NULL};
form->addSelectionResource ("val4", selres[0], selvalues);
form->addSelectionResource ("val5", selres[1], selvalues);
form->addButtonResource ("button", buttonres, "Run!");
form->addButtonResource ("cbutton", cbuttonres, "cbuttonval");
// Create the widgets.
table->addRow (cellStyle);
Textblock *label1 = new Textblock(false);
label1->setStyle (cellStyle);
table->addCell (label1, 1, 1);
label1->addText ("val1 = ", cellStyle);
label1->flush ();
Embed *input1 = new Embed (entryres1);
input1->setStyle (cellStyle);
table->addCell (input1, 1, 1);
table->addRow (cellStyle);
Textblock *label2 = new Textblock(false);
label2->setStyle (cellStyle);
table->addCell (label2, 1, 1);
label2->addText ("val2 = ", cellStyle);
label2->flush ();
Embed *input2 = new Embed (entryres2);
input2->setStyle (cellStyle);
table->addCell (input2, 1, 1);
table->addRow (cellStyle);
Textblock *label = new Textblock(false);
label->setStyle (cellStyle);
table->addCell (label, 1, 1);
label->addText ("text = ", cellStyle);
label->flush ();
Embed *text = new Embed (textres);
textres->setText("Hi textarea");
text->setStyle (cellStyle);
table->addCell (text, 1, 1);
table->addRow (cellStyle);
Textblock *radiolabel1 = new Textblock(false);
radiolabel1->setStyle (cellStyle);
table->addCell (radiolabel1, 2, 1);
Embed *radio1 = new Embed (radiores1);
radiolabel1->addWidget (radio1, cellStyle);
radiolabel1->addText (" radio1", cellStyle);
radiolabel1->flush ();
table->addRow (cellStyle);
Textblock *radiolabel2 = new Textblock(false);
radiolabel2->setStyle (cellStyle);
table->addCell (radiolabel2, 2, 1);
Embed *radio2 = new Embed (radiores2);
radiolabel2->addWidget (radio2, cellStyle);
radiolabel2->addText (" radio2", cellStyle);
radiolabel2->flush ();
table->addRow (cellStyle);
Textblock *checklabel = new Textblock(false);
checklabel->setStyle (cellStyle);
table->addCell (checklabel, 2, 1);
Embed *check = new Embed (checkres);
checklabel->addWidget (check, cellStyle);
checklabel->addText (" check", cellStyle);
checklabel->flush ();
for(int i = 0; i < 2; i++) {
table->addRow (cellStyle);
Embed *sel = new Embed (selres[i]);
sel->setStyle (cellStyle);
table->addCell (sel, 2, 1);
selres[i]->addItem("item 1", true, false);
selres[i]->pushGroup("group 1", true);
selres[i]->addItem("item 1/1", true, false);
selres[i]->addItem("item 1/2", true, true);
selres[i]->addItem("item 1/3", false, false);
selres[i]->popGroup();
selres[i]->addItem("item 2", false, i == 1);
selres[i]->pushGroup("group 2", true);
selres[i]->addItem("item 2/1", true, false);
selres[i]->addItem("item 2/2", true, false);
selres[i]->addItem("item 2/3", false, false);
selres[i]->popGroup();
selres[i]->addItem("item 3", false, false);
}
table->addRow (cellStyle);
Embed *button = new Embed (buttonres);
button->setStyle (cellStyle);
table->addCell (button, 2, 1);
table->addRow (cellStyle);
Embed *cbutton = new Embed (cbuttonres);
cbutton->setStyle (cellStyle);
table->addCell (cbutton, 2, 1);
cellStyle->unref();
window->resizable(viewport);
window->show();
int errorCode = Fl::run();
delete form;
delete layout;
return errorCode;
}

264
test/dw/form.cc Normal file
View File

@ -0,0 +1,264 @@
/*
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "form.hh"
#include "dlib/dlib.h"
namespace form {
using namespace dw::core::ui;
Form::ResourceDecorator::ResourceDecorator (const char *name)
{
this->name = dStrdup (name);
}
Form::ResourceDecorator::~ResourceDecorator ()
{
free((char *)name);
}
Form::TextResourceDecorator::TextResourceDecorator (const char *name,
TextResource *resource):
Form::ResourceDecorator (name)
{
this->resource = resource;
}
const char *Form::TextResourceDecorator::getValue ()
{
return resource->getText ();
}
Form::RadioButtonResourceDecorator::RadioButtonResourceDecorator
(const char *name, RadioButtonResource *resource, const char **values):
Form::ResourceDecorator (name)
{
this->resource = resource;
int n = 0;
while (values[n])
n++;
this->values = new const char*[n + 1];
for (int i = 0; i < n; i++)
this->values[i] = dStrdup (values[i]);
this->values[n] = 0;
}
Form::RadioButtonResourceDecorator::~RadioButtonResourceDecorator ()
{
for (int i = 0; values[i]; i++)
free((char *)values[i]);
delete[] values;
}
const char *Form::RadioButtonResourceDecorator::getValue ()
{
RadioButtonResource::GroupIterator *it;
int i;
for (it = resource->groupIterator (), i = 0; it->hasNext (); i++) {
RadioButtonResource *resource = it->getNext ();
if(resource->isActivated ()) {
it->unref ();
return values[i];
}
}
it->unref ();
return NULL;
}
Form::CheckButtonResourceDecorator::CheckButtonResourceDecorator
(const char *name, CheckButtonResource *resource):
Form::ResourceDecorator (name)
{
this->resource = resource;
}
const char *Form::CheckButtonResourceDecorator::getValue ()
{
return resource->isActivated () ? "true" : NULL;
}
Form::SelectionResourceDecorator::SelectionResourceDecorator
(const char *name, SelectionResource *resource, const char **values):
Form::ResourceDecorator (name)
{
this->resource = resource;
int n = 0;
while (values[n])
n++;
this->values = new const char*[n + 1];
for(int i = 0; i < n; i++)
this->values[i] = dStrdup (values[i]);
this->values[n] = 0;
}
Form::SelectionResourceDecorator::~SelectionResourceDecorator ()
{
for(int i = 0; values[i]; i++)
free((char *)values[i]);
delete[] values;
}
const char *Form::SelectionResourceDecorator::getValue ()
{
valueBuf.clear();
int n = resource->getNumberOfItems ();
bool first = true;
for (int i = 0; i < n; i++) {
if (resource->isSelected (i)) {
if (!first)
valueBuf.append (", ");
valueBuf.append (values[i]);
first = false;
}
}
return valueBuf.getChars ();
}
void Form::FormActivateReceiver::activate (Resource *resource)
{
form->send (NULL, NULL, -1, -1);
}
void Form::FormActivateReceiver::enter (Resource *resource)
{
}
void Form::FormActivateReceiver::leave (Resource *resource)
{
}
Form::FormClickedReceiver::FormClickedReceiver (Form *form, const char *name,
const char *value)
{
this->form = form;
this->name = dStrdup (name);
this->value = dStrdup (value);
}
Form::FormClickedReceiver::~FormClickedReceiver ()
{
free((char *)name);
free((char *)value);
}
void Form::FormClickedReceiver::clicked (Resource *resource,
dw::core::EventButton *event)
{
form->send (name, value, event->xCanvas, event->yCanvas);
}
Form::Form ()
{
resources = new lout::container::typed::List <ResourceDecorator> (true);
activateReceiver = new FormActivateReceiver (this);
clickedReceivers =
new lout::container::typed::List <FormClickedReceiver> (true);
}
Form::~Form ()
{
delete resources;
delete activateReceiver;
delete clickedReceivers;
}
/**
* \brief Adds an instance of dw::core::ui::TextResource.
*/
void Form::addTextResource (const char *name,
dw::core::ui::TextResource *resource)
{
resources->append (new TextResourceDecorator (name, resource));
resource->connectActivate (activateReceiver);
}
/**
* \brief Adds an instance of dw::core::ui::RadioButtonResource.
*
* This method has to be called only once for a group of radio buttons.
*/
void Form::addRadioButtonResource (const char *name,
dw::core::ui::RadioButtonResource *resource,
const char **values)
{
resources->append (new RadioButtonResourceDecorator (name, resource,
values));
resource->connectActivate (activateReceiver);
}
/**
* \brief Adds an instance of dw::core::ui::CheckButtonResource.
*/
void Form::addCheckButtonResource (const char *name,
dw::core::ui::CheckButtonResource *resource)
{
resources->append (new CheckButtonResourceDecorator (name, resource));
resource->connectActivate (activateReceiver);
}
/**
* \brief Adds an instance of dw::core::ui::SelectionResource.
*/
void Form::addSelectionResource (const char *name,
dw::core::ui::SelectionResource *resource,
const char **values)
{
resources->append (new SelectionResourceDecorator (name, resource, values));
resource->connectActivate (activateReceiver);
}
/**
* \todo Comment this;
*/
void Form::addButtonResource (const char *name,
dw::core::ui::ButtonResource *resource,
const char *value)
{
FormClickedReceiver *receiver =
new FormClickedReceiver (this, name, value);
resource->connectClicked (receiver);
clickedReceivers->append (receiver);
}
/**
* \todo Comment this;
*/
void Form::send (const char *buttonName, const char *buttonValue, int x, int y)
{
for (lout::container::typed::Iterator <ResourceDecorator> it =
resources->iterator ();
it.hasNext (); ) {
ResourceDecorator *resource = it.getNext ();
const char *value = resource->getValue ();
if (value)
printf ("%s = %s; x=%d y=%d\n", resource->getName (), value, x, y);
}
if(buttonName && buttonValue)
printf ("%s = %s\n", buttonName, buttonValue);
}
} // namespace form

164
test/dw/form.hh Normal file
View File

@ -0,0 +1,164 @@
#ifndef __TEST_FORM_HH__
#define __TEST_FORM_HH__
#include "dw/core.hh"
#include "dw/ui.hh"
namespace form {
/**
* \brief Handles HTML form data.
*
* Add resources by calling the respective add...Resource method. Furthermore,
* this class implements dw::core::ui::ButtonResource::ClickedReceiver, the
* form data is printed to stdout, when the "clicked" signal is received.
*
* \todo wrong comment
*/
class Form
{
private:
/**
* \brief Decorates instances of dw::core::ui::Resource.
*
* This is the abstract base class, sub classes have to be defined to
* decorate specific sub interfaces of dw::core::ui::Resource.
*/
class ResourceDecorator: public lout::object::Object
{
private:
const char *name;
protected:
ResourceDecorator (const char *name);
~ResourceDecorator ();
public:
inline const char *getName () { return name; }
virtual const char *getValue () = 0;
};
/**
* \brief Decorates instances of dw::core::ui::TextResource.
*/
class TextResourceDecorator: public ResourceDecorator
{
private:
dw::core::ui::TextResource *resource;
public:
TextResourceDecorator (const char *name,
dw::core::ui::TextResource *resource);
const char *getValue ();
};
/**
* \brief Decorates instances of dw::core::ui::RadioButtonResource.
*
* This class has to be instantiated only once for a group of radio
* buttons.
*/
class RadioButtonResourceDecorator: public ResourceDecorator
{
private:
dw::core::ui::RadioButtonResource *resource;
const char **values;
public:
RadioButtonResourceDecorator (const char *name,
dw::core::ui::RadioButtonResource
*resource,
const char **values);
~RadioButtonResourceDecorator ();
const char *getValue ();
};
/**
* \brief Decorates instances of dw::core::ui::CheckButtonResource.
*/
class CheckButtonResourceDecorator: public ResourceDecorator
{
private:
dw::core::ui::CheckButtonResource *resource;
public:
CheckButtonResourceDecorator (const char *name,
dw::core::ui::CheckButtonResource
*resource);
const char *getValue ();
};
/**
* \brief Decorates instances of dw::core::ui::SelectionResource.
*/
class SelectionResourceDecorator: public ResourceDecorator
{
private:
dw::core::ui::SelectionResource *resource;
const char **values;
lout::misc::StringBuffer valueBuf;
public:
SelectionResourceDecorator (const char *name,
dw::core::ui::SelectionResource *resource,
const char **values);
~SelectionResourceDecorator ();
const char *getValue ();
};
class FormActivateReceiver: public dw::core::ui::Resource::ActivateReceiver
{
private:
Form *form;
public:
inline FormActivateReceiver (Form *form) { this->form = form; }
void activate (dw::core::ui::Resource *resource);
void enter (dw::core::ui::Resource *resource);
void leave (dw::core::ui::Resource *resource);
};
class FormClickedReceiver:
public dw::core::ui::Resource::ClickedReceiver
{
private:
Form *form;
const char *name, *value;
public:
FormClickedReceiver (Form *form, const char *name, const char *value);
~FormClickedReceiver ();
void clicked(dw::core::ui::Resource *resource,
dw::core::EventButton *event);
};
lout::container::typed::List <ResourceDecorator> *resources;
FormActivateReceiver *activateReceiver;
lout::container::typed::List <FormClickedReceiver> *clickedReceivers;
public:
Form ();
~Form ();
void addTextResource (const char *name,
dw::core::ui::TextResource *resource);
void addRadioButtonResource (const char *name,
dw::core::ui::RadioButtonResource *resource,
const char **values);
void addCheckButtonResource (const char *name,
dw::core::ui::CheckButtonResource *resource);
void addSelectionResource (const char *name,
dw::core::ui::SelectionResource *resource,
const char **values);
void addButtonResource (const char *name,
dw::core::ui::ButtonResource *resource,
const char *value);
void send (const char *buttonName, const char *buttonValue, int x, int y);
};
} // namespace form
#endif // __TEST_FORM_HH__

57
test/html/Makefile.am Normal file
View File

@ -0,0 +1,57 @@
AM_TESTS_ENVIRONMENT = env \
TOP_BUILDDIR='$(top_builddir)' \
TOP_SRCDIR='$(top_srcdir)' \
BUILDDIR='$(builddir)'
LOG_COMPILER = $(srcdir)/driver.sh
EXTRA_DIST = \
driver.sh \
manual \
render
TESTS = \
render/b-div.html \
render/div-100-percent-with-padding.html \
render/float-img-justify.html \
render/github-infinite-loop.html \
render/hackernews.html \
render/img-aspect-ratio-absolute.html \
render/img-aspect-ratio-div.html \
render/img-aspect-ratio-mix-border.html \
render/img-aspect-ratio-mix-margin.html \
render/img-aspect-ratio-mix.html \
render/img-aspect-ratio-relative-inside-fixed.html \
render/img-aspect-ratio.html \
render/main-style.html \
render/margin-auto.html \
render/max-width-body.html \
render/max-width-div-clamp.html \
render/max-width-div.html \
render/max-width-html.html \
render/max-width-nested-div.html \
render/meta-refresh-0-no-url.html \
render/min-width-body.html \
render/min-width-div-extend.html \
render/min-width-div.html \
render/min-width-html.html \
render/min-width-nested-div.html \
render/span-padding.html \
render/svg-current-color.html \
render/table-max-width.html \
render/table-missing-width-in-one-column.html \
render/table-td-width-percent-img.html \
render/table-td-width-percent.html \
render/table-thead-tfoot.html \
render/table-thead-tfoot-open-tag.html \
render/white-space.html
# To be fixed
XFAIL_TESTS = \
render/div-100-percent-with-padding.html \
render/float-img-justify.html \
render/margin-auto.html \
render/max-width-html.html \
render/min-width-html.html \
render/span-padding.html \
render/table-td-width-percent.html

107
test/html/driver.sh Executable file
View File

@ -0,0 +1,107 @@
#!/bin/bash
#
# File: driver.sh
#
# Copyright (C) 2023-2024 Rodrigo Arias Mallo <rodarima@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
set -e
set -x
DILLOBIN=${DILLOBIN:-$TOP_BUILDDIR/src/dillo}
if [ ! -e $DILLOBIN ]; then
echo missing dillo binary, set DILLOBIN with the path to dillo
exit 1
fi
magick_bin="convert"
if command -v magick 2>&1 >/dev/null; then
magick_bin="magick"
fi
function render_page() {
htmlfile="$1"
outpic="$2"
"$DILLOBIN" -f "$htmlfile" &
dillopid=$!
# TODO: We need a better system to determine when the page loaded
sleep 1
# Capture only Dillo window
winid=$(xwininfo -all -root | awk '/Dillo:/ {print $1}')
if [ -z "$winid" ]; then
echo "cannot find Dillo window" >&2
exit 1
fi
xwd -id "$winid" -silent | ${magick_bin} xwd:- png:${outpic}
kill "$dillopid"
}
function test_file() {
html_file="$1"
if [ ! -e "$html_file" ]; then
echo "missing test file: $html_file"
exit 1
fi
ref_file="${html_file%.html}.ref.html"
if [ ! -e "$ref_file" ]; then
echo "missing reference file: $ref_file"
exit 1
fi
test_name=$(basename "$html_file")
wdir="${test_name}_wdir"
# Clean any previous files
rm -rf "$wdir"
mkdir -p "$wdir"
# Use a FIFO to read the display number
mkfifo "$wdir/display.fifo"
exec 6<> "$wdir/display.fifo"
Xvfb -screen 5 1024x768x24 -displayfd 6 &
xorgpid=$!
# Always kill Xvfb on exit
trap "kill $xorgpid" EXIT
read dispnum < "$wdir/display.fifo"
export DISPLAY=":$dispnum"
render_page "$html_file" "$wdir/html.png"
render_page "$ref_file" "$wdir/ref.png"
# AE = Absolute Error count of the number of different pixels
diffcount=$(compare -metric AE "$wdir/html.png" "$wdir/ref.png" "$wdir/diff.png" 2>&1 || true)
# The test passes only if both images are identical
if [ "$diffcount" = "0" ]; then
echo "OK"
ret=0
else
echo "FAIL"
ret=1
fi
exec 6>&-
rm "$wdir/display.fifo"
if [ -z "$DILLO_TEST_LEAVE_FILES" ]; then
rm -rf "$wdir"
fi
return $ret
}
test_file "$1"
exit $?

View File

@ -0,0 +1,25 @@
<div lang="ru" style="text-indent: 0.7cm; text-align: justify">
<p>Все счастливые семьи похожи друг на друга, каждая несчастливая семья несчастлива по-своему.</p>
<p>Все смешалось в доме Облонских. Жена узнала, что муж был в связи с бывшею в их доме француженкою-гувернанткой, и объявила мужу, что не может жить с ним в одном доме. Положение это продолжалось уже третий день и мучительно чувствовалось и самими супругами, и всеми членами семьи, и домочадцами. Все члены семьи и домочадцы чувствовали, что нет смысла в их сожительстве и что на каждом постоялом дворе случайно сошедшиеся люди более связаны между собой, чем они, члены семьи и домочадцы Облонских. Жена не выходила из своих комнат, мужа третий день не было дома. Дети бегали по всему дому, как потерянные; англичанка поссорилась с экономкой и написала записку приятельнице, прося приискать ей новое место; повар ушел вчера со двора, во время самого обеда; черная кухарка и кучер просили расчета.</p>
<p>На третий день после ссоры князь Степан Аркадьич Облонский&#160;— Стива, как его звали в свете,&#160;— в обычный час, то есть в восемь часов утра, проснулся не в спальне жены, а в своем кабинете, на сафьянном диване. Он повернул свое полное, выхоленное тело на пружинах дивана, как бы желая опять заснуть надолго, с другой стороны крепко обнял подушку и прижался к ней щекой; но вдруг вскочил, сел на диван и открыл глаза.</p>
<p>«Да, да, как это было?&#160;— думал он, вспоминая сон.&#160;— Да,
как это было? Да! Алабин давал обед в Дармштадте; нет, не в
Дармштадте, а что-то американское. Да, но там Дармштадт был в
Америке. Да, Алабин давал обед на стеклянных столах, да,&#160;— и
столы пели: <span lang="it">Il mio tesoro</span>, и
не <span lang="it">Il mio tesoro</span>, а что-то лучше, и какие-то
маленькие графинчики, и они же женщины»,&#160;— вспоминал он.</p>
<p>Глаза Степана Аркадьича весело заблестели, и он задумался, улыбаясь. «Да, хорошо было, очень хорошо. Много еще что-то там было отличного, да не скажешь словами и мыслями даже наяву не выразишь». И, заметив полосу света, пробившуюся сбоку одной из суконных стор, он весело скинул ноги с дивана, отыскал ими шитые женой (подарок ко дню рождения в прошлом году), обделанные в золотистый сафьян туфли и по старой, девятилетней привычке, не вставая, потянулся рукой к тому месту, где в спальне у него висел халат. И тут он вспомнил вдруг, как и почему он спит не в спальне жены, а в кабинете; улыбка исчезла с его лица, он сморщил лоб.</p>
<p>«Ах, ах, ах! Ааа!..»&#160;— замычал он, вспоминая все, что было. И его воображению представились опять все подробности ссоры с женою, вся безвыходность его положения и мучительнее всего собственная вина его.</p>
<p>«Да! она не простит и не может простить. И всего ужаснее то, что виной всему я, виной я, а не виноват. В этом-то вся драма,&#160;— думал он.&#160;Ах, ах, ах&#160;— приговаривал он с отчаянием, вспоминая самые тяжелые для себя впечатления из этой ссоры.</p>
<p>Неприятнее всего была та первая минута, когда он, вернувшись из театра, веселым и довольным, с огромною грушей для жены в руке, не нашел жены в гостиной; к удивлению, не нашел ее и в кабинете и, наконец, увидал ее в спальне с несчастною, открывшею все, запиской в руке.</p>
<p>Она, эта вечно озабоченная, и хлопотливая, и недалекая, какою он считал ее, Долли, неподвижно сидела с запиской в руке и с выражением ужаса, отчаяния и гнева смотрела на него.</p>
<p>— Что это? это?&#160;— спрашивала она, указывая на записку.</p>
<p>И при этом воспоминании, как это часто бывает, мучало Степана Аркадьича не столько самое событие, сколько то, как он ответил на эти слова жены.</p>
<p>С ним случилось в эту минуту то, что случается с людьми, когда они неожиданно уличены в чем-нибудь слишком постыдном. Он не сумел приготовить свое лицо к тому положению, в которое он становился пред женой после открытия его вины. Вместо того чтоб оскорбиться, отрекаться, оправдываться, просить прощения, оставаться даже равнодушным&#160;— все было бы лучше того, что он сделал!&#160;его лицо совершенно невольно («рефлексы головного мозга»,&#160;— подумал Степан Аркадьич, который любил физиологию), совершенно невольно вдруг улыбнулось привычною, доброю и потому глупою улыбкой.</p>
<p>Эту глупую улыбку он не мог простить себе. Увидав эту улыбку, Долли вздрогнула, как от физической боли, разразилась, со свойственною ей горячностью, потоком жестоких слов и выбежала из комнаты. С тех пор она не хотела видеть мужа.</p>
<p>«Всему виной эта глупая улыбка»,&#160;— думал Степан Аркадьич.</p>
<p>«Но что ж делать? что ж делать?»&#160;с отчаянием говорил он себе и не находил ответа.</p>
</div>

View File

@ -0,0 +1,56 @@
<div style="text-align: justify">
<p>In den al&shy;ten Zei&shy;ten, wo das Wün&shy;schen noch
ge&shy;hol&shy;fen hat, leb&shy;te ein Kö&shy;nig, des&shy;sen
Töch&shy;ter wa&shy;ren al&shy;le schön, aber die jüng&shy;ste war so
schön, daß die Son&shy;ne sel&shy;ber, die doch so vie&shy;les
ge&shy;se&shy;hen hat, sich ver&shy;wun&shy;der&shy;te so oft sie ihr
ins Ge&shy;sicht schien. Na&shy;he bei dem Schlos&shy;se des
&shy;nigs lag ein gro&shy;ßer dunk&shy;ler Wald, und in dem
Wal&shy;de un&shy;ter ei&shy;ner al&shy;ten Lin&shy;de war ein
Brun&shy;nen: wenn nun der Tag recht heiß war, so ging das
&shy;nigs&shy;kind hin&shy;aus in den Wald und setz&shy;te sich an
den Rand des küh&shy;len Brun&shy;nens: und wenn sie
Lan&shy;ge&shy;wei&shy;le hat&shy;te, so nahm sie eine
gol&shy;de&shy;ne Ku&shy;gel, warf sie in die Hö&shy;he und fieng sie
wie&shy;der; und das war ihr liebs&shy;tes Spiel&shy;werk.</p>
<p>Nun trug es sich ein&shy;mal zu, daß die gol&shy;de&shy;ne
Ku&shy;gel der Kön&shy;igs&shy;toch&shy;ter nicht in ihr Händ&shy;chen
fiel, das sie in die Hö&shy;he ge&shy;hal&shy;ten hat&shy;te,
son&shy;dern vor&shy;bei auf die Er&shy;de schlug und
ge&shy;ra&shy;de&shy;zu ins Was&shy;ser hin&shy;ein roll&shy;te. Die
&shy;nigs&shy;toch&shy;ter folg&shy;te ihr mit den Aug&shy;en nach,
aber die Ku&shy;gel ver&shy;schwand, und der Brun&shy;nen war tief, so
tief daß man kei&shy;nen Grund sah. Da fieng sie an zu wei&shy;nen und
wein&shy;te im&shy;mer lau&shy;ter und konn&shy;te sich gar nicht
trös&shy;ten. Und wie sie so klag&shy;te, rief ihr je&shy;mand zu „was
hast du vor, Kö&shy;nigs&shy;toch&shy;ter, du schreist ja daß sich ein
Stein er&shy;bar&shy;men möchte.“ Sie sah sich um, wo&shy;her die
Stim&shy;me kä&shy;me, da er&shy;blick&shy;te sie einen Frosch, der
sei&shy;nen di&shy;cken häß&shy;li&shy;chen Kopf aus dem Was&shy;ser
streck&shy;te. „Ach, du bists, al&shy;ter
Was&shy;ser&shy;pat&shy;scher,“ sag&shy;te sie, „ich wei&shy;ne über
mei&shy;ne gol&shy;de&shy;ne Ku&shy;gel, die mir in den Brun&shy;nen
hin&shy;ab ge&shy;fal&shy;len ist.“ „Sei still und wei&shy;ne nicht,“
ant&shy;wor&shy;te&shy;te der Frosch, „ich kann wohl Rath
schaf&shy;fen, aber was gibst du mir, wenn ich dein Spiel&shy;werk
wie&shy;der her&shy;auf&shy;ho&shy;le?“ „Was du ha&shy;ben willst,
lie&shy;ber Frosch,“ sag&shy;te sie, „mei&shy;ne Klei&shy;der,
mei&shy;ne Per&shy;len und Edel&shy;stei&shy;ne, auch noch die
gol&shy;de&shy;ne Kro&shy;ne, die ich tra&shy;ge.“ Der Frosch
ant&shy;wor&shy;te&shy;te „dei&shy;ne Klei&shy;der, dei&shy;ne
Per&shy;len und Edel&shy;stei&shy;ne, und dei&shy;ne gol&shy;de&shy;ne
Kro&shy;ne, die mag ich nicht: aber wenn du mich lieb ha&shy;ben
willst, und ich soll dein Ge&shy;sel&shy;le und
Spiel&shy;ka&shy;me&shy;rad sein, an dei&shy;nem Tisch&shy;lein
ne&shy;ben dir si&shy;tzen, von dei&shy;nem gol&shy;de&shy;nen
Tel&shy;ler&shy;lein es&shy;sen, aus dei&shy;nem Be&shy;cher&shy;lein
trin&shy;ken, in dei&shy;nem Bett&shy;lein schla&shy;fen: wenn du mir
das ver&shy;sprichst, so will ich hin&shy;un&shy;ter stei&shy;gen und
dir die gol&shy;de&shy;ne Ku&shy;gel wie&shy;der her&shy;auf
ho&shy;len.“ „Ach ja,“ sag&shy;te sie, „ich ver&shy;spre&shy;che dir
alles, was du willst, wenn du mir nur die Ku&shy;gel wie&shy;der
bringst.“ Sie dach&shy;te aber „was der ein&shy;fäl&shy;ti&shy;ge
Frosch schwätzt, der sitzt im Was&shy;ser bei sei&shy;nes
Glei&shy;chen und quackt, und kann kei&shy;nes Men&shy;schen
Ge&shy;sel&shy;le sein.“</p>
</div>

View File

@ -0,0 +1,39 @@
<div style="text-align: justify">
<p>In den alten Zeiten, wo das Wünschen noch geholfen hat, lebte ein
König, dessen Töchter waren alle schön, aber die jüngste war so schön,
daß die Sonne selber, die doch so vieles gesehen hat, sich verwunderte
so oft sie ihr ins Gesicht schien. Nahe bei dem Schlosse des Königs
lag ein großer dunkler Wald, und in dem Walde unter einer alten Linde
war ein Brunnen: wenn nun der Tag recht heiß war, so ging das
Königskind hinaus in den Wald und setzte sich an den Rand des kühlen
Brunnens: und wenn sie Langeweile hatte, so nahm sie eine goldene
Kugel, warf sie in die Höhe und fieng sie wieder; und das war ihr
liebstes Spielwerk.</p>
<p>Nun trug es sich einmal zu, daß die goldene Kugel der Königstochter
nicht in ihr Händchen fiel, das sie in die Höhe gehalten hatte,
sondern vorbei auf die Erde schlug und geradezu ins Wasser hinein
rollte. Die Königstochter folgte ihr mit den Augen nach, aber die
Kugel verschwand, und der Brunnen war tief, so tief daß man keinen
Grund sah. Da fieng sie an zu weinen und weinte immer lauter und
konnte sich gar nicht trösten. Und wie sie so klagte, rief ihr jemand
zu „was hast du vor, Königstochter, du schreist ja daß sich ein Stein
erbarmen möchte.“ Sie sah sich um, woher die Stimme käme, da erblickte
sie einen Frosch, der seinen dicken häßlichen Kopf aus dem Wasser
streckte. „Ach, du bists, alter Wasserpatscher,“ sagte sie, „ich weine
über meine goldene Kugel, die mir in den Brunnen hinab gefallen ist.“
„Sei still und weine nicht,“ antwortete der Frosch, „ich kann wohl
Rath schaffen, aber was gibst du mir, wenn ich dein Spielwerk wieder
heraufhole?“ „Was du haben willst, lieber Frosch,“ sagte sie, „meine
Kleider, meine Perlen und Edelsteine, auch noch die goldene Krone, die
ich trage.“ Der Frosch antwortete „deine Kleider, deine Perlen und
Edelsteine, und deine goldene Krone, die mag ich nicht: aber wenn du
mich lieb haben willst, und ich soll dein Geselle und Spielkamerad
sein, an deinem Tischlein neben dir sitzen, von deinem goldenen
Tellerlein essen, aus deinem Becherlein trinken, in deinem Bettlein
schlafen: wenn du mir das versprichst, so will ich hinunter steigen
und dir die goldene Kugel wieder herauf holen.“ „Ach ja,“ sagte sie,
„ich verspreche dir alles, was du willst, wenn du mir nur die Kugel
wieder bringst.“ Sie dachte aber „was der einfältige Frosch schwätzt,
der sitzt im Wasser bei seines Gleichen und quackt, und kann keines
Menschen Geselle sein.“</p>
</div>

View File

@ -0,0 +1,14 @@
<p style="text-align: justify">In den al&shy;ten Zei&shy;ten, wo das
Wün&shy;schen noch ge&shy;hol&shy;fen hat, leb&shy;te ein Kö&shy;nig,
des&shy;sen Töch&shy;ter wa&shy;ren al&shy;le schön, aber die
jüng&shy;ste war so schön, daß die Son&shy;ne sel&shy;ber, die doch so
vie&shy;les ge&shy;se&shy;hen hat, sich ver&shy;wun&shy;der&shy;te so
oft sie ihr ins Ge&shy;sicht schien. Na&shy;he bei dem Schlos&shy;se
des Kö&shy;nigs lag ein gro&shy;ßer dunk&shy;ler Wald, und in dem
Wal&shy;de un&shy;ter ei&shy;ner al&shy;ten Lin&shy;de war ein
Brun&shy;nen: wenn nun der Tag recht heiß war, so ging das
&shy;nigs&shy;kind hin&shy;aus in den Wald und setz&shy;te sich an
den Rand des küh&shy;len Brun&shy;nens: und wenn sie
Lan&shy;ge&shy;wei&shy;le hat&shy;te, so nahm sie eine
gol&shy;de&shy;ne Ku&shy;gel, warf sie in die Hö&shy;he und fieng sie
wie&shy;der; und das war ihr liebs&shy;tes Spiel&shy;werk.</p>

View File

@ -0,0 +1,10 @@
<p style="text-align: justify">In den alten Zeiten, wo das Wünschen
noch geholfen hat, lebte ein König, dessen Töchter waren alle schön,
aber die jüngste war so schön, daß die Sonne selber, die doch so
vieles gesehen hat, sich verwunderte so oft sie ihr ins Gesicht
schien. Nahe bei dem Schlosse des Königs lag ein großer dunkler Wald,
und in dem Walde unter einer alten Linde war ein Brunnen: wenn nun der
Tag recht heiß war, so ging das Königskind hinaus in den Wald und
setzte sich an den Rand des kühlen Brunnens: und wenn sie Langeweile
hatte, so nahm sie eine goldene Kugel, warf sie in die Höhe und fieng
sie wieder; und das war ihr liebstes Spielwerk.</p>

View File

@ -0,0 +1,650 @@
<p lang="de"><a href="#unten">Nach
unten</a>. Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung.
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung.
<span id="unten"><b>Hier ist unten.</b> (Nicht ganz.)</span> Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung.
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung.
</p>

View File

@ -0,0 +1,477 @@
<!-- HTML header for doxygen 1.8.7-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.10"/>
<title>avr-libc: AVR Libc</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="dox.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">avr-libc
&#160;<span id="projectnumber">2.0.0</span>
</div>
<div id="projectbrief">Standard C library for AVR-GCC</div>
</td>
<td> <div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</td>
</tr>
</tbody>
</table>
<table>
<tr>
<td align="left"><a href="http://www.nongnu.org/avr-libc/"><h2>AVR Libc Home Page</h2></a></td>
<td align="center" colspan=4><img src="avrs.png" alt="AVRs" align="middle" border="0"></td>
<td align="right"><a href="https://savannah.nongnu.org/projects/avr-libc/"><h2>AVR Libc Development Pages</h2></a></td>
</tr>
<tr>
<td align="center" width="20%"><a href="index.html"><h2>Main Page</h2></a></td>
<td align="center" width="20%"><a href="pages.html"><h2>User Manual</h2></a></td>
<td align="center" width="20%"><a href="modules.html"><h2>Library Reference</h2></a></td>
<td align="center" width="20%"><a href="FAQ.html"><h2>FAQ</h2></a></td>
<td align="center" width="20%"><a href="group__demos.html"><h2>Example Projects</h2></a></td>
</tr>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.10 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">AVR Libc </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="avr_libc_intro"></a>
Introduction</h1>
<p>The latest version of this document is always available from <a href="http://savannah.nongnu.org/projects/avr-libc/">http://savannah.nongnu.org/projects/avr-libc/</a></p>
<p>The AVR Libc package provides a subset of the standard C library for <a href="http://www.atmel.com/products/AVR/">Atmel AVR 8-bit RISC microcontrollers</a>. In addition, the library provides the basic startup code needed by most applications.</p>
<p>There is a wealth of information in this document which goes beyond simply describing the interfaces and routines provided by the library. We hope that this document provides enough information to get a new AVR developer up to speed quickly using the freely available development tools: binutils, gcc avr-libc and many others.</p>
<p>If you find yourself stuck on a problem which this document doesn't quite address, you may wish to post a message to the avr-gcc mailing list. Most of the developers of the AVR binutils and gcc ports in addition to the developers of avr-libc subscribe to the list, so you will usually be able to get your problem resolved. You can subscribe to the list at <a href="http://lists.nongnu.org/mailman/listinfo/avr-gcc-list">http://lists.nongnu.org/mailman/listinfo/avr-gcc-list</a> . Before posting to the list, you might want to try reading the <a class="el" href="FAQ.html">Frequently Asked Questions</a> chapter of this document.</p>
<dl class="section note"><dt>Note</dt><dd>If you think you've found a bug, or have a suggestion for an improvement, either in this documentation or in the library itself, please use the bug tracker at <a href="https://savannah.nongnu.org/bugs/?group=avr-libc">https://savannah.nongnu.org/bugs/?group=avr-libc</a> to ensure the issue won't be forgotten.</dd></dl>
<h1><a class="anchor" id="avr_libc_general"></a>
General information about this library</h1>
<p>In general, it has been the goal to stick as best as possible to established standards while implementing this library. Commonly, this refers to the C library as described by the ANSI X3.159-1989 and ISO/IEC 9899:1990 ("ANSI-C") standard, as well as parts of their successor ISO/IEC 9899:1999 ("C99"). Some additions have been inspired by other standards like IEEE Std 1003.1-1988 ("POSIX.1"), while other extensions are purely AVR-specific (like the entire program-space string interface).</p>
<p>Unless otherwise noted, functions of this library are <em>not</em> guaranteed to be reentrant. In particular, any functions that store local state are known to be non-reentrant, as well as functions that manipulate IO registers like the EEPROM access routines. If these functions are used within both standard and interrupt contexts undefined behaviour will result. See the FAQ for a more detailed discussion.</p>
<h1><a class="anchor" id="supp_devices"></a>
Supported Devices</h1>
<p><a name="supported%20devices"></a></p>
<p>The following is a list of AVR devices currently supported by the library. Note that actual support for some newer devices depends on the ability of the compiler/assembler to support these devices at library compile-time.</p>
<dl class="section user"><dt>megaAVR Devices:</dt><dd></dd></dl>
<ul>
<li>atmega103</li>
<li>atmega128</li>
<li>atmega128a</li>
<li>atmega1280</li>
<li>atmega1281</li>
<li>atmega1284</li>
<li>atmega1284p</li>
<li>atmega16</li>
<li>atmega161</li>
<li>atmega162</li>
<li>atmega163</li>
<li>atmega164a</li>
<li>atmega164p</li>
<li>atmega164pa</li>
<li>atmega165</li>
<li>atmega165a</li>
<li>atmega165p</li>
<li>atmega165pa</li>
<li>atmega168</li>
<li>atmega168a</li>
<li>atmega168p</li>
<li>atmega168pa</li>
<li>atmega16a</li>
<li>atmega2560</li>
<li>atmega2561</li>
<li>atmega32</li>
<li>atmega32a</li>
<li>atmega323</li>
<li>atmega324a</li>
<li>atmega324p</li>
<li>atmega324pa</li>
<li>atmega325</li>
<li>atmega325a</li>
<li>atmega325p</li>
<li>atmega325pa</li>
<li>atmega3250</li>
<li>atmega3250a</li>
<li>atmega3250p</li>
<li>atmega3250pa</li>
<li>atmega328</li>
<li>atmega328p</li>
<li>atmega48</li>
<li>atmega48a</li>
<li>atmega48pa</li>
<li>atmega48pb</li>
<li>atmega48p</li>
<li>atmega64</li>
<li>atmega64a</li>
<li>atmega640</li>
<li>atmega644</li>
<li>atmega644a</li>
<li>atmega644p</li>
<li>atmega644pa</li>
<li>atmega645</li>
<li>atmega645a</li>
<li>atmega645p</li>
<li>atmega6450</li>
<li>atmega6450a</li>
<li>atmega6450p</li>
<li>atmega8</li>
<li>atmega8a</li>
<li>atmega88</li>
<li>atmega88a</li>
<li>atmega88p</li>
<li>atmega88pa</li>
<li>atmega88pb</li>
<li>atmega8515</li>
<li>atmega8535</li>
</ul>
<dl class="section user"><dt>tinyAVR Devices:</dt><dd></dd></dl>
<ul>
<li>attiny4</li>
<li>attiny5</li>
<li>attiny10</li>
<li>attiny11 <a class="el" href="index.html#supp_dev_footnote_one">[1]</a></li>
<li>attiny12 <a class="el" href="index.html#supp_dev_footnote_one">[1]</a></li>
<li>attiny13</li>
<li>attiny13a</li>
<li>attiny15 <a class="el" href="index.html#supp_dev_footnote_one">[1]</a></li>
<li>attiny20</li>
<li>attiny22</li>
<li>attiny24</li>
<li>attiny24a</li>
<li>attiny25</li>
<li>attiny26</li>
<li>attiny261</li>
<li>attiny261a</li>
<li>attiny28 <a class="el" href="index.html#supp_dev_footnote_one">[1]</a></li>
<li>attiny2313</li>
<li>attiny2313a</li>
<li>attiny40</li>
<li>attiny4313</li>
<li>attiny43u</li>
<li>attiny44</li>
<li>attiny44a</li>
<li>attiny441</li>
<li>attiny45</li>
<li>attiny461</li>
<li>attiny461a</li>
<li>attiny48</li>
<li>attiny828</li>
<li>attiny84</li>
<li>attiny84a</li>
<li>attiny841</li>
<li>attiny85</li>
<li>attiny861</li>
<li>attiny861a</li>
<li>attiny87</li>
<li>attiny88</li>
<li>attiny1634</li>
</ul>
<dl class="section user"><dt>Automotive AVR Devices:</dt><dd></dd></dl>
<ul>
<li>atmega16m1</li>
<li>atmega32c1</li>
<li>atmega32m1</li>
<li>atmega64c1</li>
<li>atmega64m1</li>
<li>attiny167</li>
<li>ata5505</li>
<li>ata5272</li>
<li>ata5702m322</li>
<li>ata5782</li>
<li>ata5790</li>
<li>ata5790n</li>
<li>ata5831</li>
<li>ata5795</li>
<li>ata6612c</li>
<li>ata6613c</li>
<li>ata6614q</li>
<li>ata6616c</li>
<li>ata6617c</li>
<li>ata664251</li>
</ul>
<dl class="section user"><dt>CAN AVR Devices:</dt><dd></dd></dl>
<ul>
<li>at90can32</li>
<li>at90can64</li>
<li>at90can128</li>
</ul>
<dl class="section user"><dt>LCD AVR Devices:</dt><dd></dd></dl>
<ul>
<li>atmega169</li>
<li>atmega169a</li>
<li>atmega169p</li>
<li>atmega169pa</li>
<li>atmega329</li>
<li>atmega329a</li>
<li>atmega329p</li>
<li>atmega329pa</li>
<li>atmega3290</li>
<li>atmega3290a</li>
<li>atmega3290p</li>
<li>atmega3290pa</li>
<li>atmega649</li>
<li>atmega649a</li>
<li>atmega6490</li>
<li>atmega6490a</li>
<li>atmega6490p</li>
<li>atmega649p</li>
</ul>
<dl class="section user"><dt>Lighting AVR Devices:</dt><dd></dd></dl>
<ul>
<li>at90pwm1</li>
<li>at90pwm2</li>
<li>at90pwm2b</li>
<li>at90pwm216</li>
<li>at90pwm3</li>
<li>at90pwm3b</li>
<li>at90pwm316</li>
<li>at90pwm161</li>
<li>at90pwm81</li>
</ul>
<dl class="section user"><dt>Smart Battery AVR Devices:</dt><dd></dd></dl>
<ul>
<li>atmega8hva</li>
<li>atmega16hva</li>
<li>atmega16hva2</li>
<li>atmega16hvb</li>
<li>atmega16hvbrevb</li>
<li>atmega32hvb</li>
<li>atmega32hvbrevb</li>
<li>atmega64hve</li>
<li>atmega64hve2</li>
<li>atmega406</li>
</ul>
<dl class="section user"><dt>USB AVR Devices:</dt><dd></dd></dl>
<ul>
<li>at90usb82</li>
<li>at90usb162</li>
<li>at90usb646</li>
<li>at90usb647</li>
<li>at90usb1286</li>
<li>at90usb1287</li>
<li>atmega8u2</li>
<li>atmega16u2</li>
<li>atmega16u4</li>
<li>atmega32u2</li>
<li>atmega32u4</li>
<li>atmega32u6</li>
</ul>
<dl class="section user"><dt>XMEGA Devices:</dt><dd></dd></dl>
<ul>
<li>atxmega8e5</li>
<li>atxmega16a4</li>
<li>atxmega16a4u</li>
<li>atxmega16c4</li>
<li>atxmega16d4</li>
<li>atxmega32a4</li>
<li>atxmega32a4u</li>
<li>atxmega32c3</li>
<li>atxmega32c4</li>
<li>atxmega32d3</li>
<li>atxmega32d4</li>
<li>atxmega32e5</li>
<li>atxmega64a1</li>
<li>atxmega64a1u</li>
<li>atxmega64a3</li>
<li>atxmega64a3u</li>
<li>atxmega64a4u</li>
<li>atxmega64b1</li>
<li>atxmega64b3</li>
<li>atxmega64c3</li>
<li>atxmega64d3</li>
<li>atxmega64d4</li>
<li>atxmega128a1</li>
<li>atxmega128a1u</li>
<li>atxmega128a3</li>
<li>atxmega128a3u</li>
<li>atxmega128a4u</li>
<li>atxmega128b1</li>
<li>atxmega128b3</li>
<li>atxmega128c3</li>
<li>atxmega128d3</li>
<li>atxmega128d4</li>
<li>atxmega192a3</li>
<li>atxmega192a3u</li>
<li>atxmega192c3</li>
<li>atxmega192d3</li>
<li>atxmega256a3</li>
<li>atxmega256a3u</li>
<li>atxmega256a3b</li>
<li>atxmega256a3bu</li>
<li>atxmega256c3</li>
<li>atxmega256d3</li>
<li>atxmega384c3</li>
<li>atxmega384d3</li>
</ul>
<dl class="section user"><dt>Wireless AVR devices:</dt><dd></dd></dl>
<ul>
<li>atmega644rfr2</li>
<li>atmega64rfr2</li>
<li>atmega128rfa1</li>
<li>atmega1284rfr2</li>
<li>atmega128rfr2</li>
<li>atmega2564rfr2</li>
<li>atmega256rfr2</li>
</ul>
<dl class="section user"><dt>Miscellaneous Devices:</dt><dd></dd></dl>
<ul>
<li>at94K <a class="el" href="index.html#supp_dev_footnote_two">[2]</a></li>
<li>at76c711 <a class="el" href="index.html#supp_dev_footnote_three">[3]</a></li>
<li>at43usb320</li>
<li>at43usb355</li>
<li>at86rf401</li>
<li>at90scr100</li>
<li>ata6285</li>
<li>ata6286</li>
<li>ata6289</li>
<li>m3000 <a class="el" href="index.html#supp_dev_footnote_four">[4]</a></li>
</ul>
<dl class="section user"><dt>Classic AVR Devices:</dt><dd></dd></dl>
<ul>
<li>at90s1200 <a class="el" href="index.html#supp_dev_footnote_one">[1]</a></li>
<li>at90s2313</li>
<li>at90s2323</li>
<li>at90s2333</li>
<li>at90s2343</li>
<li>at90s4414</li>
<li>at90s4433</li>
<li>at90s4434</li>
<li>at90s8515</li>
<li>at90c8534</li>
<li>at90s8535</li>
</ul>
<p><a class="anchor" id="supp_dev_footnote_one"></a> </p><dl class="section note"><dt>Note</dt><dd><b>[1]</b> Assembly only. There is no direct support for these devices to be programmed in C since they do not have a RAM based stack. Still, it could be possible to program them in C, see the <a class="el" href="FAQ.html#faq_tinyavr_c">FAQ</a> for an option.</dd></dl>
<p><a class="anchor" id="supp_dev_footnote_two"></a> </p><dl class="section note"><dt>Note</dt><dd><b>[2]</b> The at94K devices are a combination of FPGA and AVR microcontroller. [TRoth-2002/11/12: Not sure of the level of support for these. More information would be welcomed.]</dd></dl>
<p><a class="anchor" id="supp_dev_footnote_three"></a> </p><dl class="section note"><dt>Note</dt><dd><b>[3]</b> The at76c711 is a USB to fast serial interface bridge chip using an AVR core.</dd></dl>
<p><a class="anchor" id="supp_dev_footnote_four"></a> </p><dl class="section note"><dt>Note</dt><dd><b>[4]</b> The m3000 is a motor controller AVR ASIC from Intelligent Motion Systems (IMS) / Schneider Electric.</dd></dl>
<h1><a class="anchor" id="license"></a>
avr-libc License</h1>
<p>avr-libc can be freely used and redistributed, provided the following license conditions are met.</p>
<pre class="fragment">Portions of avr-libc are Copyright (c) 1999-2016
Werner Boellmann,
Dean Camera,
Pieter Conradie,
Brian Dean,
Keith Gudger,
Wouter van Gulik,
Bjoern Haase,
Steinar Haugen,
Peter Jansen,
Reinhard Jessich,
Magnus Johansson,
Harald Kipp,
Carlos Lamas,
Cliff Lawson,
Artur Lipowski,
Marek Michalkiewicz,
Todd C. Miller,
Rich Neswold,
Colin O'Flynn,
Bob Paddock,
Andrey Pashchenko,
Reiner Patommel,
Florin-Viorel Petrov,
Alexander Popov,
Michael Rickman,
Theodore A. Roth,
Juergen Schilling,
Philip Soeberg,
Anatoly Sokolov,
Nils Kristian Strom,
Michael Stumpf,
Stefan Swanepoel,
Helmut Wallner,
Eric B. Weddington,
Joerg Wunsch,
Dmitry Xmelkov,
Atmel Corporation,
egnite Software GmbH,
The Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of the copyright holders nor the names of
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
</pre> </div></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.7-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Mon Feb 8 2016 23:59:10 for avr-libc by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.10
</small></address>
</body>
</html>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Floats And Absolute Positions</title>
<style type="text/css">
div.main {
margin: 0 0 0 100px;
top: 3cm;
position: absolute;
}
div.margin {
position: absolute;
top: 3cm;
width: 120px;
}
</style>
</head>
<body>
<h1>Floats And Absolute Positions</h1>
<div class="main">
<img style="float: left" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Library_of_Ashurbanipal_The_Flood_Tablet.jpg/218px-Library_of_Ashurbanipal_The_Flood_Tablet.jpg" />
<p>Sed ut perspiciatis, unde omnis iste natus error sit
voluptatem accusantium doloremque laudantium, totam rem
aperiam eaque ipsa, quae ab illo inventore veritatis et quasi
architecto beatae vitae dicta sunt, explicabo. nemo enim ipsam
voluptatem, quia voluptas sit, aspernatur aut odit aut fugit,
sed quia consequuntur magni dolores eos, qui ratione
voluptatem sequi nesciunt, neque porro quisquam est, qui
dolorem ipsum, quia dolor sit, amet, consectetur, adipisci
velit, sed quia non numquam eius modi tempora incidunt, ut
labore et dolore magnam aliquam quaerat voluptatem. ut enim ad
minima veniam, quis nostrum exercitationem ullam corporis
suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur? quis autem vel eum iure reprehenderit, qui in ea
voluptate velit esse, quam nihil molestiae consequatur, vel
illum, qui dolorem eum fugiat, quo voluptas nulla
pariatur?</p>
<p>Ἐν ἀρχῇ ἦν ὁ Λόγος, καὶ ὁ Λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν
ὁ Λόγος. Οὗτος ἦν ἐν ἀρχῇ πρὸς τὸν Θεόν. πάντα δι' αὐτοῦ
ἐγένετο, καὶ χωρὶς αὐτοῦ ἐγένετο οὐδὲ ἕν ὃ γέγονεν. ἐν αὐτῷ
ζωὴ ἦν, καὶ ἡ ζωὴ ἦν τὸ φῶς τῶν ἀνθρώπων. καὶ τὸ φῶς ἐν τῇ
σκοτίᾳ φαίνει, καὶ ἡ σκοτία αὐτὸ οὐ κατέλαβεν.</p>
</div>
<div class="margin">Margin, actually on the left side.</div>
<body>
</html>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Floats And Margins</title>
<style type="text/css">
</style>
</head>
<body>
<p>
<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Library_of_Ashurbanipal_The_Flood_Tablet.jpg/200px-Library_of_Ashurbanipal_The_Flood_Tablet.jpg" style="float: left; margin: 1cm 1cm 1cm 0" />
Ἐν ἀρχῇ ἦν ὁ Λόγος, καὶ ὁ Λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ
Λόγος. Οὗτος ἦν ἐν ἀρχῇ πρὸς τὸν Θεόν. πάντα δι' αὐτοῦ ἐγένετο,
καὶ χωρὶς αὐτοῦ ἐγένετο οὐδὲ ἕν ὃ γέγονεν. ἐν αὐτῷ ζωὴ ἦν, καὶ ἡ
ζωὴ ἦν τὸ φῶς τῶν ἀνθρώπων. καὶ τὸ φῶς ἐν τῇ σκοτίᾳ φαίνει, καὶ
ἡ σκοτία αὐτὸ οὐ κατέλαβεν.
</p>
<p style="margin: 0 3cm">
<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/26/GilgameshTablet.jpg/200px-GilgameshTablet.jpg" style="float: right; margin: 1cm 0 1cm 1cm"/>
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa,
quae ab illo inventore veritatis et quasi architecto beatae
vitae dicta sunt, explicabo. nemo enim ipsam voluptatem, quia
voluptas sit, aspernatur aut odit aut fugit, sed quia
consequuntur magni dolores eos, qui ratione voluptatem sequi
nesciunt, neque porro quisquam est, qui dolorem ipsum, quia
dolor sit, amet, consectetur, adipisci velit, sed quia non
numquam eius modi tempora incidunt, ut labore et dolore magnam
aliquam quaerat voluptatem. ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam, nisi
ut aliquid ex ea commodi consequatur? quis autem vel eum iure
reprehenderit, qui in ea voluptate velit esse, quam nihil
molestiae consequatur, vel illum, qui dolorem eum fugiat, quo
voluptas nulla pariatur?
</p>
<body>
</html>

View File

@ -0,0 +1,24 @@
<p>Demonstrating how to include floats into width extremes.
<table>
<tr>
<td style="border: 1px dashed black">
<div style="float:left; border: 1px dashed black">Somelongwordwhichmustnotbebrokensotakingmuchspaceinatablecolumn</div>
Some short text.
<td style="border: 1px dashed black">
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa,
quae ab illo inventore veritatis et quasi architecto beatae
vitae dicta sunt, explicabo. nemo enim ipsam voluptatem, quia
voluptas sit, aspernatur aut odit aut fugit, sed quia
consequuntur magni dolores eos, qui ratione voluptatem sequi
nesciunt, neque porro quisquam est, qui dolorem ipsum, quia
dolor sit, amet, consectetur, adipisci velit, sed quia non
numquam eius modi tempora incidunt, ut labore et dolore magnam
aliquam quaerat voluptatem. ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam, nisi
ut aliquid ex ea commodi consequatur? quis autem vel eum iure
reprehenderit, qui in ea voluptate velit esse, quam nihil
molestiae consequatur, vel illum, qui dolorem eum fugiat, quo
voluptas nulla pariatur?
</table>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Floats and iterators: search for "worm" and pay attention
to the order.</title>
<style type="text/css">
.float1, .float2 {
padding: 0.5em;
border: 1px dashed #404040;
width: 30%;
}
.float1 {
float: left;
margin: 0.5em 0.5em 0.5em 0;
}
.float2 {
float: right;
margin: 0.5em 0 0.5em 0.5em;
}
</style>
</head>
<body>
<div class="float1">1: apple apple worm apple apple</div>
<p>2: apple apple apple apple apple apple apple apple apple apple
apple apple apple apple apple apple apple apple apple apple
apple apple apple apple worm apple apple apple apple apple apple
apple apple apple apple apple apple apple apple apple apple
apple apple apple apple apple apple apple apple</p>
<div class="float2">3: apple apple worm apple apple</div>
<p>4: apple apple apple apple apple apple apple apple apple apple
apple apple apple apple apple apple apple apple apple apple
apple apple apple apple worm apple apple apple apple apple apple
apple apple apple apple apple apple apple apple apple apple
apple apple apple apple apple apple apple apple</p>
<div class="float1">5: apple apple worm apple apple</div>
<body>
</html>

View File

@ -0,0 +1,46 @@
<div>First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First
paragraph. <div style="float: left; border: 1px dashed black">Left
float. Left float. Left float. Left float. Left float. Left
float. Left float. Left float. Left float. Left float. Left
float. Left float. Left float. Left float. Left float. Left
float. Left float. Left float. Left float. Left float.</div> First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph. First paragraph. First
paragraph. First paragraph. First paragraph.</div>
<div><div>Second paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph.<div style="float:
right; border: 1px dashed black">Right float. Right float. Right
float. Right float. Right float. Right float.</div> Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph. Second
paragraph. Second paragraph. Second paragraph.</div></div>

View File

@ -0,0 +1,17 @@
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
ab illo inventore veritatis et quasi architecto beatae vitae dicta
sunt, explicabo.
<div style="float:left; border: 1px dashed black">Some text in a
float.<br /><img src="https://dillo-browser.github.io/old/dw/html/not-so-simple-container.png" /></div>
nemo enim ipsam voluptatem, quia voluptas sit,
aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,
qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit,
sed quia non numquam eius modi tempora incidunt, ut labore et dolore
magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut
aliquid ex ea commodi consequatur? quis autem vel eum iure
reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae
consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla
pariatur?

View File

@ -0,0 +1,16 @@
<p>Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
ab illo inventore veritatis et quasi architecto beatae vitae dicta
sunt, explicabo.</p>
<div style="float:left; border: 1px dashed black">Some text in a
float.<br /><img src="https://dillo-browser.github.io/old/dw/html/not-so-simple-container.png" /></div>
<p>nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit
aut fugit, sed quia consequuntur magni dolores eos, qui ratione
voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem
ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non
numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam
quaerat voluptatem. ut enim ad minima veniam, quis nostrum
exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex
ea commodi consequatur? quis autem vel eum iure reprehenderit, qui in
ea voluptate velit esse, quam nihil molestiae consequatur, vel illum,
qui dolorem eum fugiat, quo voluptas nulla pariatur?</p>

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Floats 4</title>
<style type="text/css">
.border {
background-color: #e0e0ff;
padding: 1cm;
}
.float1, .float2 {
margin: 1cm;
padding: 1cm;
border: 1px dashed red;
background-color: #f0fff0;
float: right;
}
.float1 {
float: left;
}
.float2 {
float: right;
}
.wide {
margin: 1cm 0;
padding: 1cm;
border: 1px dashed red;
background-color: #ffffd0;
width: 40cm;
}
</style>
</head>
<body class="border">
<div class="float2">Some text in a float.</div>
<p>Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa,
quae ab illo inventore veritatis et quasi architecto beatae
vitae dicta sunt, explicabo. nemo enim ipsam voluptatem, quia
voluptas sit, aspernatur aut odit aut fugit, sed quia
consequuntur magni dolores eos, qui ratione voluptatem sequi
nesciunt, neque porro quisquam est, qui dolorem ipsum, quia
dolor sit, amet, consectetur, adipisci velit, sed quia non
numquam eius modi tempora incidunt, ut labore et dolore magnam
aliquam quaerat voluptatem. ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam, nisi
ut aliquid ex ea commodi consequatur? quis autem vel eum iure
reprehenderit, qui in ea voluptate velit esse, quam nihil
molestiae consequatur, vel illum, qui dolorem eum fugiat, quo
voluptas nulla pariatur?</p>
<table class="wide"><tbody><tr><td>Ἐν ἀρχῇ ἦν ὁ Λόγος, καὶ ὁ Λόγος
ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ Λόγος. Οὗτος ἦν ἐν ἀρχῇ πρὸς τὸν
Θεόν. πάντα δι' αὐτοῦ ἐγένετο, καὶ χωρὶς αὐτοῦ ἐγένετο οὐδὲ ἕν ὃ
γέγονεν. ἐν αὐτῷ ζωὴ ἦν, καὶ ἡ ζωὴ ἦν τὸ φῶς τῶν ἀνθρώπων. καὶ
τὸ φῶς ἐν τῇ σκοτίᾳ φαίνει, καὶ ἡ σκοτία αὐτὸ οὐ
κατέλαβεν.</tbody></tr></td></table>
<body>
</html>

View File

@ -0,0 +1,16 @@
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
ab illo inventore veritatis et quasi architecto beatae vitae dicta
sunt, explicabo.
<div style="float:left; border: 1px dashed black"><img src="https://dillo-browser.github.io/old/Icons/ProgramIcon16.png" /></div>
nemo enim ipsam voluptatem, quia voluptas sit,
aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,
qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit,
sed quia non numquam eius modi tempora incidunt, ut labore et dolore
magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut
aliquid ex ea commodi consequatur? quis autem vel eum iure
reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae
consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla
pariatur?

View File

@ -0,0 +1,3 @@
<div style="font-size:10em" lang=de>
Wei<EFBFBD> kurz&nbsp;und&nbsp;knapp www.dillo.org
</div>

View File

@ -0,0 +1,6 @@
<p>Abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde&shy;abcde</p>
<p>Abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde-abcde</p>
<p>Abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde&#x2010;abcde</p>
<p>Abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde&mdash;abcde</p>
<p lang="de">Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen&mdash;Nordrhein-Westfalen</p>
<p lang="de">Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen&mdash;Nord&shy;rheinwestfalen</p>

View File

@ -0,0 +1,27 @@
<p>Bla bla bla bla bla bla bla bla bla Bla bla bla bla bla
bla bla bla bla bla:
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung</p>
<p lang="de">Bla bla bla bla bla bla bla bla bla Bla bla bla bla bla
bla bla bla bla bla:
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung</p>
<p lang="en">Bla bla bla bla bla bla bla bla bla Bla bla bla bla bla
bla bla bla bla bla:
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung</p>
<p lang="es">Bla bla bla bla bla bla bla bla bla Bla bla bla bla bla
bla bla bla bla bla:
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung</p>
<hr />
<p>Bla bla bla bla bla bla bla bla bla Bla bla bla bla bla
bla bla bla bla bla:
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung</p>
<p xml:lang="de">Bla bla bla bla bla bla bla bla bla Bla bla bla bla bla
bla bla bla bla bla:
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung</p>
<p xml:lang="en">Bla bla bla bla bla bla bla bla bla Bla bla bla bla bla
bla bla bla bla bla:
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung</p>
<p xml:lang="es">Bla bla bla bla bla bla bla bla bla Bla bla bla bla bla
bla bla bla bla bla:
Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung</p>

View File

@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<title>Test min-width and max-width CSS properties</title>
<style>
body {margin: 20px; min-width: 400px; max-width: 600px; background: lightgrey}
.min {width: 400px; background: lightgreen}
.max {width: 600px; background: lightgreen}
</style>
</head>
<body>
<div class="min">
<p>By resizing the window, the content below in gray should stay
within the limits of minimum and maximum width.</p>
<p>Minimum width 400 px</p>
</div>
<div>
<p>This is a rather long text to increase the maximal paragraph
width. Sed ut perspiciatis, unde omnis iste natus error sit
voluptatem accusantium doloremque laudantium, totam rem aperiam
eaque ipsa, quae ab illo inventore veritatis et quasi architecto
beatae vitae dicta sunt, explicabo. nemo enim ipsam voluptatem,
quia voluptas sit, aspernatur aut odit aut fugit, sed quia
consequuntur magni dolores eos, qui ratione voluptatem sequi
nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor
sit, amet, consectetur, adipisci velit, sed quia non numquam eius
modi tempora incidunt, ut labore et dolore magnam aliquam quaerat
voluptatem. ut enim ad minima veniam, quis nostrum exercitationem
ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur?</p>
</div>
<div class="max"><p>Maximum width 600 px</p></div>
</body>
</html>

View File

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html>
<head>
<title>Test min-width and max-width CSS properties</title>
<style>
body {margin: 20px}
.min {width: 400px; background: lightgreen}
.max {width: 600px; background: lightgreen}
.test {min-width: 400px; max-width: 600px; background: lightgrey}
</style>
</head>
<body>
<div class="min">
<p>By resizing the window, the content below in gray should stay
within the limits of minimum and maximum width.</p>
<p>Minimum width 400 px</p>
</div>
<div class="test">
<p>This is a rather long text to increase the maximal paragraph
width. Sed ut perspiciatis, unde omnis iste natus error sit
voluptatem accusantium doloremque laudantium, totam rem aperiam
eaque ipsa, quae ab illo inventore veritatis et quasi architecto
beatae vitae dicta sunt, explicabo. nemo enim ipsam voluptatem,
quia voluptas sit, aspernatur aut odit aut fugit, sed quia
consequuntur magni dolores eos, qui ratione voluptatem sequi
nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor
sit, amet, consectetur, adipisci velit, sed quia non numquam eius
modi tempora incidunt, ut labore et dolore magnam aliquam quaerat
voluptatem. ut enim ad minima veniam, quis nostrum exercitationem
ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur?</p>
</div>
<div class="max"><p>Maximum width 600 px</p></div>
</body>
</html>

View File

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html>
<head>
<title>Test min-width and max-width CSS properties</title>
<style>
html {max-width: 600px; background: lightgray}
body {margin: 7px}
.min {width: 400px; background: lightgreen}
.max {width: 600px; background: lightgreen}
</style>
</head>
<body>
<div class="min">
<p>By resizing the window, the content below in gray should stay
within the limits of minimum and maximum width.</p>
<p>Minimum width 400 px</p>
</div>
<div>
<p>This is a rather long text to increase the maximal paragraph
width. Sed ut perspiciatis, unde omnis iste natus error sit
voluptatem accusantium doloremque laudantium, totam rem aperiam
eaque ipsa, quae ab illo inventore veritatis et quasi architecto
beatae vitae dicta sunt, explicabo. nemo enim ipsam voluptatem,
quia voluptas sit, aspernatur aut odit aut fugit, sed quia
consequuntur magni dolores eos, qui ratione voluptatem sequi
nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor
sit, amet, consectetur, adipisci velit, sed quia non numquam eius
modi tempora incidunt, ut labore et dolore magnam aliquam quaerat
voluptatem. ut enim ad minima veniam, quis nostrum exercitationem
ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur?</p>
</div>
<div class="max"><p>Maximum width 600 px</p></div>
</body>
</html>

View File

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html>
<head>
<title>Test min-width and max-width CSS properties</title>
<style>
body {margin: 20px}
.test {min-width: 400px; max-width: 600px; background: lightgray}
.min {width: 400px; background: lightgreen}
.max {width: 600px; background: lightgreen}
</style>
</head>
<body>
<div class="background:lightblue">
<div class="min">
<p>By resizing the window, the content below in gray should stay
within the limits of minimum and maximum width.</p>
<p>Minimum width 400 px</p>
</div>
<div class="test">
<p>This is a rather long text to increase the maximal paragraph
width. Sed ut perspiciatis, unde omnis iste natus error sit
voluptatem accusantium doloremque laudantium, totam rem aperiam
eaque ipsa, quae ab illo inventore veritatis et quasi architecto
beatae vitae dicta sunt, explicabo. nemo enim ipsam voluptatem,
quia voluptas sit, aspernatur aut odit aut fugit, sed quia
consequuntur magni dolores eos, qui ratione voluptatem sequi
nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor
sit, amet, consectetur, adipisci velit, sed quia non numquam eius
modi tempora incidunt, ut labore et dolore magnam aliquam quaerat
voluptatem. ut enim ad minima veniam, quis nostrum exercitationem
ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
consequatur?</p>
</div>
<div class="max"><p>Maximum width 600 px</p></div>
</div>
</body>
</html>

View File

@ -0,0 +1,21 @@
<table>
<tr>
<td>Short, <span style="white-space: nowrap">then some more text,
which must not be broken.</span>
<td>This is a rather long text to increase the maximal paragraph
width. Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
ab illo inventore veritatis et quasi architecto beatae vitae dicta
sunt, explicabo. nemo enim ipsam voluptatem, quia voluptas sit,
aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,
qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit,
sed quia non numquam eius modi tempora incidunt, ut labore et dolore
magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut
aliquid ex ea commodi consequatur? quis autem vel eum iure
reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae
consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla
pariatur?
</tr>
</table>

View File

@ -0,0 +1,37 @@
<table>
<tr>
<td lang="de">Grundstücksverkehrsgenehmigungszuständigkeit ABC
<td>Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
ab illo inventore veritatis et quasi architecto beatae vitae dicta
sunt, explicabo. nemo enim ipsam voluptatem, quia voluptas sit,
aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,
qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit,
sed quia non numquam eius modi tempora incidunt, ut labore et dolore
magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut
aliquid ex ea commodi consequatur? quis autem vel eum iure
reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae
consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla
pariatur?
</table>
<table>
<tr>
<td>Grund&shy;stücks&shy;ver&shy;kehrs&shy;ge&shy;neh&shy;mi&shy;gungs&shy;zu&shy;stän&shy;dig&shy;keit ABC
<td>Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
ab illo inventore veritatis et quasi architecto beatae vitae dicta
sunt, explicabo. nemo enim ipsam voluptatem, quia voluptas sit,
aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,
qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit,
sed quia non numquam eius modi tempora incidunt, ut labore et dolore
magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut
aliquid ex ea commodi consequatur? quis autem vel eum iure
reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae
consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla
pariatur?
</table>

View File

@ -0,0 +1,9 @@
<table border=1>
<tr>
<td>W d<whatever>aaaaaaaaaaaa*<br>
<td>WW d<whatever>aaaaaaaaaaaa*<br>
<td>WWW d<whatever>aaaaaaaaaaaa*<br>
<td>WWWW d<whatever>aaaaaaaaaaaa*<br>
<td>WWWWW d<whatever>aaaaaaaaaaaa*<br>
<td>WWWWWW d<whatever>aaaaaaaaaaaa*<br>
</table>

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<title>one</title>
<title>two</title>
</head>
<body>
<p>Duplicated title</p>
</body>
</html>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<p>Empty title</p>
</body>
</html>

View File

@ -0,0 +1,8 @@
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>Missing title</p>
</body>
</html>

View File

@ -0,0 +1 @@
<b>Hello World</b><div>Hello world</div>

View File

@ -0,0 +1 @@
<b>Hello World</b><br/>Hello world

View File

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<title>Test padding in 100% width div</title>
<style>
body {margin: 0px}
.test {
width: 100%;
margin: 50px;
padding: 50px;
background: lightgreen;
border: solid 1px;
}
</style>
</head>
<body>
<div class="test">
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the works.
By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public
License for most of our software; it applies also to any other
work released this way by its authors. You can apply it to your
programs, too.</p>
</div>
</body>
</html>

View File

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<title>Test padding in 100% width div</title>
<style>
body {margin: 0px}
.test {
width: 800px;
margin: 50px;
padding: 50px;
background: lightgreen;
border: solid 1px;
}
</style>
</head>
<body>
<div class="test">
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the works.
By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public
License for most of our software; it applies also to any other
work released this way by its authors. You can apply it to your
programs, too.</p>
</div>
</body>
</html>

View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<title>Test floating image in paragraph with br</title>
<style>
body {width: 400px}
img {width: 40%; float:right}
p {text-align: justify;}
</style>
</head>
<body>
<i>The text below should be readable:</i>
<p>
<img src="pic.png" />
This is a rather long text to increase the width.
<br>
</p>
</body>
</html>

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<title>Test floating image in paragraph with br</title>
<style>
body {width: 400px}
img {width: 40%; float:right}
p {text-align: justify;}
</style>
</head>
<body>
<i>The text below should be readable:</i>
<p>
<img src="pic.png" />
This is a rather long text to increase the width.
</p>
</body>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>GitHub infinite layout loop</title>
</head>
<body>
<div style="display:inline-block">
<form style="float:left">
<input type="hidden"/>
<button type="submit" style="white-space:nowrap; float:left">Hello</button>
</form>
</div>
</body>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>GitHub infinite layout loop</title>
</head>
<body>
<div style="display:inline-block">
<form style="float:left">
<input type="hidden"/>
<button type="submit" style="white-space:nowrap">Hello</button>
</form>
</div>
</body>
</html>

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Hacker News table test</title>
</head>
<body style="margin: 0px; width:600px">
<table width="50%" cellspacing=0 bgcolor="#f6f6ef">
<tr>
<td bgcolor="#ff6600">
Hello world.
</td>
</tr>
</table>
</body>
</html>

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Hacker News table test</title>
</head>
<body style="margin: 0px">
<table style="width: 300px" border=0 cellspacing=0 bgcolor="#f6f6ef">
<tr>
<td bgcolor="#ff6600" border=0 cellspacing=0>
Hello world.
</td>
</tr>
</table>
</body>
</html>

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio with height larger than viewport</title>
<style>
body {
min-width: 16px;
}
img {
width:100%;
height:100%;
}
</style>
</head>
<body>
<img src="pic.png">
</body>
</html>

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio with height larger than viewport</title>
<style>
body {
min-width: 16px;
}
img {
width:755px;
height:755px;
}
</style>
</head>
<body>
<img src="pic.png">
</body>
</html>

View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio inside an unconstrained div</title>
<style>
div {
/*border: 1px solid black*/;
}
div.out {
width: 300px;
height: 600px;
background: lightgreen;
}
div.big {
min-width: 16px;
}
div.small {
max-width: 64px;
}
/* Even if we are specifying the image to have 100% height, the image
* must not extend to all the available height of the div.out container.
* It should continue to keep the aspect ratio as the width is constrained
* to 64 px, so it should be 64 px tall. */
img {
width:100%;
height:100%;
}
</style>
</head>
<body>
<div class="out">
<div class="big">
<img src="pic.png">
</div>
<div class="small">
<img src="pic.png">
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio inside an unconstrained div</title>
<style>
div {
/*border: 1px solid black;*/
}
div.out {
width: 300px;
height: 600px;
background: lightgreen;
}
div.big {
min-width: 16px;
}
div.small {
max-width: 64px;
}
/* Even if we are specifying the image to have 100% height, the image
* must not extend to all the available height of the div.out container.
* It should continue to keep the aspect ratio as the width is constrained
* to 64 px, so it should be 64 px tall. */
img {
width:100%;
height:100%;
}
</style>
</head>
<body>
<div class="out">
<div class="big">
<img style="width:300px; height:300px" src="pic.png">
</div>
<div class="small">
<img style="width:64px; height:64px" src="pic.png">
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio while constrained</title>
<style>
body {margin: 20px}
div {width: 640px; height: 640px; background: lightblue;}
img {border: 10px solid green}
</style>
</head>
<body>
<div>
<p>All images should be 32px by 32px like this one:</p>
<img src="pic.png" style="width:32px;height:32px;">
<p>Only one max-* constraint</p>
<img src="pic.png" style="max-width :32px;">
<img src="pic.png" style="max-height:32px;">
<img src="pic.png" style="max-width :5%;">
<img src="pic.png" style="max-height:5%;">
<p>One max-* and fixed size constraint</p>
<img src="pic.png" style="height:32px; max-width:256px">
<img src="pic.png" style="height:5%; max-width:256px">
<img src="pic.png" style="max-height:256px; width:32px">
<img src="pic.png" style="max-height:256px; width:5%">
<p>Two max-* constraints</p>
<img src="pic.png" style="max-height:32px; max-width:256px">
<img src="pic.png" style="max-height:5%; max-width:256px">
<img src="pic.png" style="max-height:256px; max-width:32px">
<img src="pic.png" style="max-height:256px; max-width:5%">
<p>Both min-* and max-* constrained</p>
<img src="pic.png" style="min-width:32px; min-height:16px; max-width:32px; max-height:64px">
<img src="pic.png" style="min-width:5%; min-height:16px; max-width:5%; max-height:64px">
<img src="pic.png" style="min-width:16px; min-height:32px; max-width:64px; max-height:32px">
<img src="pic.png" style="min-width:16px; min-height:5%; max-width:64px; max-height:5%">
<p>Bad constraints</p>
<img src="pic.png" style="max-width: 16px; min-width: 32px;">
<img src="pic.png" style="max-height:16px; min-height:32px;">
<img src="pic.png" style="max-width: 16px; min-width: 5%;">
<img src="pic.png" style="max-height:16px; min-height:5%;">
</div>
</body>
</html>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio while constrained</title>
<style>
body {margin: 20px}
div {width: 640px; height: 640px; background: lightblue;}
img {border: 10px solid green}
</style>
</head>
<body>
<div>
<p>All images should be 32px by 32px like this one:</p>
<img src="pic.png" style="width:32px;height:32px;">
<p>Only one max-* constraint</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>One max-* and fixed size constraint</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Two max-* constraints</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Both min-* and max-* constrained</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Bad constraints</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
</div>
</body>
</html>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio while constrained</title>
<style>
body {margin: 20px}
div {width: 640px; height: 640px; background: lightblue;}
img {margin: 10px}
</style>
</head>
<body>
<div>
<p>All images should be 32px by 32px like this one:</p>
<img src="pic.png" style="width:32px;height:32px;">
<p>Only one max-* constraint</p>
<img src="pic.png" style="max-width :32px;">
<img src="pic.png" style="max-height:32px;">
<img src="pic.png" style="max-width :5%;">
<img src="pic.png" style="max-height:5%;">
<p>One max-* and fixed size constraint</p>
<img src="pic.png" style="height:32px; max-width:256px">
<img src="pic.png" style="height:5%; max-width:256px">
<img src="pic.png" style="max-height:256px; width:32px">
<img src="pic.png" style="max-height:256px; width:5%">
<p>Two max-* constraints</p>
<img src="pic.png" style="max-height:32px; max-width:256px">
<img src="pic.png" style="max-height:5%; max-width:256px">
<img src="pic.png" style="max-height:256px; max-width:32px">
<img src="pic.png" style="max-height:256px; max-width:5%">
<p>Both min-* and max-* constrained</p>
<img src="pic.png" style="min-width:32px; min-height:16px; max-width:32px; max-height:64px">
<img src="pic.png" style="min-width:5%; min-height:16px; max-width:5%; max-height:64px">
<img src="pic.png" style="min-width:16px; min-height:32px; max-width:64px; max-height:32px">
<img src="pic.png" style="min-width:16px; min-height:5%; max-width:64px; max-height:5%">
<p>Bad constraints</p>
<img src="pic.png" style="max-width: 16px; min-width: 32px;">
<img src="pic.png" style="max-height:16px; min-height:32px;">
<img src="pic.png" style="max-width: 16px; min-width: 5%;">
<img src="pic.png" style="max-height:16px; min-height:5%;">
</div>
</body>
</html>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio while constrained</title>
<style>
body {margin: 20px}
div {width: 640px; height: 640px; background: lightblue;}
img {margin: 10px}
</style>
</head>
<body>
<div>
<p>All images should be 32px by 32px like this one:</p>
<img src="pic.png" style="width:32px;height:32px;">
<p>Only one max-* constraint</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>One max-* and fixed size constraint</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Two max-* constraints</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Both min-* and max-* constrained</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Bad constraints</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
</div>
</body>
</html>

View File

@ -0,0 +1,41 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio while constrained</title>
<style>
body {margin: 20px}
div {width: 640px; height: 640px; background: lightblue;}
</style>
</head>
<body>
<div>
<p>All images should be 32px by 32px like this one:</p>
<img src="pic.png" style="width:32px;height:32px;">
<p>Only one max-* constraint</p>
<img src="pic.png" style="max-width :32px;">
<img src="pic.png" style="max-height:32px;">
<img src="pic.png" style="max-width :5%;">
<img src="pic.png" style="max-height:5%;">
<p>One max-* and fixed size constraint</p>
<img src="pic.png" style="height:32px; max-width:256px">
<img src="pic.png" style="height:5%; max-width:256px">
<img src="pic.png" style="max-height:256px; width:32px">
<img src="pic.png" style="max-height:256px; width:5%">
<p>Two max-* constraints</p>
<img src="pic.png" style="max-height:32px; max-width:256px">
<img src="pic.png" style="max-height:5%; max-width:256px">
<img src="pic.png" style="max-height:256px; max-width:32px">
<img src="pic.png" style="max-height:256px; max-width:5%">
<p>Both min-* and max-* constrained</p>
<img src="pic.png" style="min-width:32px; min-height:16px; max-width:32px; max-height:64px">
<img src="pic.png" style="min-width:5%; min-height:16px; max-width:5%; max-height:64px">
<img src="pic.png" style="min-width:16px; min-height:32px; max-width:64px; max-height:32px">
<img src="pic.png" style="min-width:16px; min-height:5%; max-width:64px; max-height:5%">
<p>Bad constraints</p>
<img src="pic.png" style="max-width: 16px; min-width: 32px;">
<img src="pic.png" style="max-height:16px; min-height:32px;">
<img src="pic.png" style="max-width: 16px; min-width: 5%;">
<img src="pic.png" style="max-height:16px; min-height:5%;">
</div>
</body>
</html>

View File

@ -0,0 +1,41 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio while constrained</title>
<style>
body {margin: 20px}
div {width: 640px; height: 640px; background: lightblue;}
</style>
</head>
<body>
<div>
<p>All images should be 32px by 32px like this one:</p>
<img src="pic.png" style="width:32px;height:32px;">
<p>Only one max-* constraint</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>One max-* and fixed size constraint</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Two max-* constraints</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Both min-* and max-* constrained</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<p>Bad constraints</p>
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
<img src="pic.png" style="width:32px;height:32px;">
</div>
</body>
</html>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio when both dimensions are relative and container is fixed</title>
<style>
div {
border: 1px solid black;
width: 64px;
height: 256px;
}
img {
width:100%;
height:100%;
}
</style>
</head>
<body>
<p>The image must fill the complete div even if that means distorting it.
The image specifies the size as 100% of the container in both dimensions and
the container has a fixed size.</p>
<div>
<img src="pic.png">
</div>
</body>
</html>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio when both dimensions are relative and container is fixed</title>
<style>
div {
border: 1px solid black;
width: 64px;
height: 256px;
}
img {
width:64px;
height:256px;
}
</style>
</head>
<body>
<p>The image must fill the complete div even if that means distorting it.
The image specifies the size as 100% of the container in both dimensions and
the container has a fixed size.</p>
<div>
<img src="pic.png">
</div>
</body>
</html>

View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio</title>
<style>
body {margin: 20px}
</style>
</head>
<body>
<img src="pic.png" style="height:100px" />
<img src="pic.png" style="max-height:100px" />
<img src="pic.png" style="width:100px" />
<img src="pic.png" style="max-width:100px" />
<a href="#"><img src="pic.png" style="max-width:100px" /></a>
</body>
</html>

View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>Test image aspect ratio</title>
<style>
body {margin: 20px}
</style>
</head>
<body>
<img src="pic.png" style="height:100px; width:100px" />
<img src="pic.png" style="height:100px; width:100px" />
<img src="pic.png" style="height:100px; width:100px" />
<img src="pic.png" style="height:100px; width:100px" />
<a href="#"><img src="pic.png" style="height:100px; width:100px" /></a>
</body>
</html>

View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<title>Main should behave like a div</title>
</head>
<body>
<div style="margin-left: 20em; background: lightgreen">
div
</div>
<main style="margin-left: 20em; background: lightgreen">
main
</main>
<header style="margin-left: 20em; background: lightgreen">
header
</header>
<footer style="margin-left: 20em; background: lightgreen">
footer
</footer>
</body>
</html>

View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<title>Main should behave like a div</title>
</head>
<body>
<div style="margin-left: 20em; background: lightgreen">
div
</div>
<div style="margin-left: 20em; background: lightgreen">
main
</div>
<div style="margin-left: 20em; background: lightgreen">
header
</div>
<div style="margin-left: 20em; background: lightgreen">
footer
</div>
</body>
</html>

View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>Test CSS margin auto</title>
<style>
div {height:100px}
.container {width:300px; background: lightgreen}
.child {width:100px; background: brown; margin:auto }
</style>
</head>
<body>
<div class="container">
<div class="child"></div>
</div>
</body>
</html>

View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>Test CSS margin auto</title>
<style>
div {height:100px}
.container {width:300px; background: lightgreen}
.child {width:100px; background: brown; margin-left:100px; margin-right:100px }
</style>
</head>
<body>
<div class="container">
<div class="child"></div>
</div>
</body>
</html>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width in body</title>
<style>
body {margin: 20px; max-width: 400px}
</style>
</head>
<body>
<div>
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the works.
By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public
License for most of our software; it applies also to any other
work released this way by its authors. You can apply it to your
programs, too.</p>
</div>
</body>
</html>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width in body</title>
<style>
body {margin: 20px; width: 400px}
</style>
</head>
<body>
<div>
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the works.
By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public
License for most of our software; it applies also to any other
work released this way by its authors. You can apply it to your
programs, too.</p>
</div>
</body>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width CSS properties</title>
<style>
body {margin: 20px}
.test {max-width: 1000px; height: 100px; background: lightgreen}
</style>
</head>
<body>
<div class="test">
</div>
</body>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width CSS properties</title>
<style>
body {margin: 20px}
.test {width: 100%; height: 100px; background: lightgreen}
</style>
</head>
<body>
<div class="test">
</div>
</body>
</html>

View File

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width CSS properties</title>
<style>
body {margin: 20px}
.test {max-width: 600px; background: lightgrey}
</style>
</head>
<body>
<div class="test">
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the works.
By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public
License for most of our software; it applies also to any other
work released this way by its authors. You can apply it to your
programs, too.</p>
</div>
</body>
</html>

View File

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width CSS properties</title>
<style>
body {margin: 20px}
.test {width: 600px; background: lightgrey}
</style>
</head>
<body>
<div class="test">
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the works.
By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public
License for most of our software; it applies also to any other
work released this way by its authors. You can apply it to your
programs, too.</p>
</div>
</body>
</html>

View File

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width in html tag</title>
<style>
html {max-width: 400px}
body {margin: 20px}
</style>
</head>
<body>
<div>
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the works.
By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public
License for most of our software; it applies also to any other
work released this way by its authors. You can apply it to your
programs, too.</p>
</div>
</body>
</html>

View File

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width in html tag</title>
<style>
div {width: 360px}
body {margin: 20px}
</style>
</head>
<body>
<div>
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the works.
By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public
License for most of our software; it applies also to any other
work released this way by its authors. You can apply it to your
programs, too.</p>
</div>
</body>
</html>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width in a nested div</title>
<style>
body {margin: 20px}
.test {max-width: 400px; background: lightgray}
</style>
</head>
<body>
<div style="background:lightblue">
<div class="test">
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the
works. By contrast, the GNU General Public License is intended
to guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its
users. We, the Free Software Foundation, use the GNU General
Public License for most of our software; it applies also to any
other work released this way by its authors. You can apply it to
your programs, too.</p>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width in a nested div</title>
<style>
body {margin: 20px}
.test {width: 400px; background: lightgray}
</style>
</head>
<body>
<div style="background:lightblue">
<div class="test">
<p>The licenses for most software and other practical works are
designed to take away your freedom to share and change the
works. By contrast, the GNU General Public License is intended
to guarantee your freedom to share and change all versions of a
program--to make sure it remains free software for all its
users. We, the Free Software Foundation, use the GNU General
Public License for most of our software; it applies also to any
other work released this way by its authors. You can apply it to
your programs, too.</p>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<title>Test meta refresh 0 without URL</title>
<meta http-equiv="Refresh" content="0">
</head>
<body>
<p>Should be ignored.</p>
</body>
</html>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title>Test meta refresh 0 without URL</title>
</head>
<body>
<p>Should be ignored.</p>
</body>
</html>

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Test min-width CSS property in the body</title>
<style>
body {min-width: 2000px; margin: 50px}
.test {background: lightgrey}
</style>
</head>
<body>
<div class="test">
<p>Hello</p>
</div>
</body>
</html>

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Test min-width CSS property in the body</title>
<style>
body {margin: 50px}
.test {width: 2000px; background: lightgrey}
</style>
</head>
<body>
<div class="test">
<p>Hello</p>
</div>
</body>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width CSS properties</title>
<style>
body {margin: 20px}
.test {min-width: 100px; height: 100px; background: lightgreen}
</style>
</head>
<body>
<div class="test">
</div>
</body>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Test max-width CSS properties</title>
<style>
body {margin: 20px}
.test {width: 100%; height: 100px; background: lightgreen}
</style>
</head>
<body>
<div class="test">
</div>
</body>
</html>

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Test min-width CSS property</title>
<style>
body {margin: 20px}
.test {min-width: 400px; display: inline-block; background: lightgrey}
</style>
</head>
<body>
<div class="test">
<p>Hello</p>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More