# *************************************************************
#  
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#  
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#  
# *************************************************************
--- How layout / hierarchy should work ---

On-screen:

+-------------------+
| Label:   [Entry]  |
| - - - - - - - - - |                  |
|             [ Ok ]|
+-------------------+

AWT Window hierarchy:
	Window
		+ Label
		+ Entry
		+ Ok

	ie. unchanged, and backwards compatible - a flat
representation.

Toolkit Hierarchy

	WindowContainer [Bin?]
		+ Vbox
			+ HBox
				+ Label
				+ Entry
		+ Alignment
			+ Ok

	the layout process would happen inside the toolkit code
(perhaps eventually genericisd itself), and the result from the
(re-)layout process would be a set of SetPosition/SetSize calls made
to VCL.

--- code pointers ---

** AWT interfaces:
    + offapi/com/sun/star/awt/* - eg. XButton.idl
	+ 'XLayoutConstrains.idl' [ published & mis-named ! ]

    + We can build 'Layout' into the AWT at the toolkit level
	+ this should be fairly easy, and wouldn't touch VCL much.

** Toolkit (awt) implementation:
    + toolkit/source/awt/vclxwindows.cxx:
	+ much of the implementation lurks in here ...
    + The size information is in 'vclxwindows.cxx' ...

    + toolkit/source/helper/unowrapper.cxx
	+ factories / code to associate UNO peers with VCL windows
	+ pWindow->

--- Tests ---

Integration tests:
    cf. http://www.openoffice.org/issues/show_bug.cgi?id=78747


--- more thoughts ---

** Extra Design constraints: [!?]
	+ accessibility
	+ QA test-tool-age ... - tests ~will need re-write (unfortunately)

* New functionality we would like:
	+ ShowAll (vs. Show/Hide) && HideAll ...

Necessary to re- build && deliver svtools/ having delivered toolkit ...
    rm unxlngi6.pro/slo/textwindowaccessibility.* # first ...

** Layout containers:
    + XIndexAccess ? - sorted container (?)

* Consider 'XLayoutRoot' top-level ...
    + inherit from XNameContainer - widgets by name / id ...
    + hack a VCL dialog ?
	+ we need a handle we can pass back of some form:
	+ XWindowPeer getPeer() ... [ can use that I guess ? ]
    + also need a service interface ?
	+ or parameters passed as Anys ? [ugh]

* Decided
    + use 'layout' by itself & small patches
      to toolkit/ in ooo-build.

* TODO:
    + need a 'queueResize' method ...
	+ trigger on show/hide ...
    + allocateSize should take an awt::Rectangle ...
    + impl. XLayoutRoot
    + special cases:
        + radio-button-group
	+ notebook

* svx/source/dialog/zoom*

Michael's Todo:
    + handle MetricField: 'unit' enum etc. - introspection ? or ...
    + make OK/Cancel buttons function as they should ...
    + merge layout-svtools.diff into CWS as last step before inclusion ...
    + FixedLine:
	+ get sizing right ...
	+ hook up new virtual methods into toolkit/ (m225) - i#80754
	+ copy the crud from toolkit's custom vclxwindows.cxx
	  "calcMinimumSize" logic ...
    + get ok/help/cancel buttons working ...

    + fix / rationalise property adding in toolkit ...
	+ simplify it with the new VCLWindow base :-)
	+ simplify it ...
	    + spreadsheet ...
	+ VCLXImageConsumer - can't be instantiated itself
             anyway ! -> bin the 'true' & just add all these
	     props unconditionally ...	

    + switch construction attributes into their own xmlns to
      avoid treading on other properties ...
