jgoodies-forms-1.6.0/0000755000175000017500000000000012052333511013204 5ustar tonytonyjgoodies-forms-1.6.0/LICENSE.txt0000644000175000017500000000323212003555436015037 0ustar tonytony The BSD License for the JGoodies Forms ====================================== Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: o Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. o 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. o Neither the name of JGoodies Karsten Lentzsch nor the names of its 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. jgoodies-forms-1.6.0/README.html0000644000175000017500000001331012003555436015035 0ustar tonytony JGoodies Forms :: README
:: JGOODIES :: Forms

:: Readme :: Forms 1.6.0 ::

The Forms framework helps you lay out and implement elegant Swing panels quickly and consistently. It makes simple things easy and the hard stuff possible, the good design easy and the bad difficult.

The JGoodies Forms requires Java 6 or later and the JGoodies Common library. Library versions for older Java versions are available in the JGoodies Archive.

Open Issue

There's a weakness in the FormLayout that may require an API extension. Components that span multiple columns or rows do not affect the column width or row height resp., but can in some cases expand the container.
I'm looking for a means to let the layout grid honor these components that is both powerful and easy to understand. See the FAQ for details and a workaround.

Acknowledgements

The Forms project has been financed by Johannes Riege, and customers of the JGoodies Swing Suite. It is only with their money that I can provide, maintain, and improve this library at no charge.

FormLayout has been inspired by Mullet&Sano's grid system, Daniel Barbalace's TableLayout, Daniel Michalik's HIGLayout, and Doug Stein's GridBagLayout. The concept of dialog units stems from Microsoft user interface implementations.

(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/RELEASE-NOTES.txt0000644000175000017500000010220512003555436015723 0ustar tonytony JGoodies Forms Release Notes CHANGES IN 1.6.0 ----------------------------------------------------- This version is binary incompatible with previous releases. The vast majority of client code isn't affected, because primarily internal interfaces and their implementations have changed. However, some changes may require a migration, for example if you have used the deprecated ButtonBarFactory in the past. VISUAL INCOMPATIBILITIES o Since 1.6 the PanelBuilder's opaque state is false by default, where it was true before. You can get the old behavior with: PanelBuilder.setOpaqueDefault(true); o Since 1.6 the DefaultUnitConverter's default test string is BALANCED_AVERAGE_CHARACTER_TEST_STRING where it was "X" before. It is recommended to use the new default, because it scales better with new typefaces on modern windowing systems. You can get the old behavior with: DefaultUnitConverter.getInstance() .setAverageCharacterWidthTestString( DefaultUnitConverter.OLD_AVERAGE_CHARACTER_TEST_STRING); OTHER CHANGES o Since 1.6 the PanelBuilder's label-for-feature is on by default. The new behavior is recommended. You can get the old behavior with: PanelBuilder.setLabelForFeatureEnabledDefault(false); o Overhauled the ComponentFactory interface: - merged ComponentFactory and ComponentFactory2 - removed ComponentFactory2 - added #createHeaderLabel(String) - DefaultComponentFactory implements ComponentFactory o Overhauled the I15dPanelBuilder: - merged it with its superclass AbstractI15dPanelBuilder - supports a general StringLocalizer for the String resource access - sets the initial "opaque" property value to false o Renamed FormFactory to FormSpecs. o Removed the deprecated ColumnSpec.MIDDLE; use CENTER instead. o Added ButtonBarBuilder - builds button bars in a platform-independent order - can add sequences of related buttons o Marked ButtonBarBuilder2 as deprecated; use ButtonBarBuilder. o ButtonBarBuilder, ButtonStackBuilder, and ButtonBarBuilder2 build focus traversal groups for the contained buttons, if the JGoodies FocusTraversalUtils class is available. o Removed LayoutStyle#isLeftToRightButtonOrder() and its implementations in MacLayoutStyle and WindowsLayoutStyle. o Overhauled the ButtonStackBuilder - removed #ButtonStackBuilder(FormLayout, JPanel) - removed #addButtons - added configuration methods - changed superclass to AbstractButtonPanelBuilder o Changed names in Borders from DIALOG_BORDER to DIALOG, DLU14_BORDER to DLU14, ... o AbstractBuilder#setDefaultComponentFactory has been renamed to #setComponentFactoryDefault. o Fixed and added JavaDocs and JavaDoc comment examples. o Fixed the broken artifact id in the pom.xml. JGoodies Forms 1.5.1 ------------------------------------------------------ o Marked the ButtonBarFactory as deprecated. This class will be removed from the next Forms version. o The javadocs, main and test sources are delivered as JARs. JGoodies Forms 1.5.0 ------------------------------------------------------ o Requires Java 6 and JGoodies Common 1.3. o Generified several members. o Removed the deprecated ButtonBarBuilder that has been replaced by the ButtonBarBuilder2 before. o Removed DefaultComponentFactory#setTextAndMnemonic that has been marked as deprecated and replaced by MnemonicUtils#configure before. o Marked ColumnSpec#MIDDLE as deprecated; use CENTER instead. o Minor implementation improvements. JGoodies Forms 1.4.2 ------------------------------------------------------ o Declared methods as static where possible. JGoodies Forms 1.4.1 ------------------------------------------------------ BUG FIXES o Fixed missing synchronization of the lazy LayoutMap creation. OTHER CHANGES o Requires JGoodies Common 1.2.0 JGoodies Forms 1.4.0 ------------------------------------------------------ INTRODUCTION This version requires Java 5 and the new JGoodies Common library. Make sure that you include jgoodies-common-1.1.1.jar or later in your classpath when using this Forms version. INCOMPATIBLE CHANGES o Added LayoutStyle#getLabelComponentPadY(). o Added ComponentFactory2#createButton(Action). o The handling of text with mnemonic markers ('&') has changed. However, the changes are minimal and most marked text won't be affected. Nothing changed for single mnemonic markers The difference is how ampersands are handled that shall not mark the mnemonic character. In version 1.3 all these markers needed to be quoted - before and after the mnemonic marker. Since version 1.4 only the ampersands before the marker shall be quoted. Version 1.3 Version 1.4 Comment Save Save unchanged &Save &Save unchanged Save &as Save &as unchanged Look & Feel Look & Feel unchanged R&&D department R&&D department unchanged R&&D d&epartment R&&D d&epartment unchanged A&&B &GmbH&&Co KG A&&B &GmbH&Co KG change In the last line the ampersand in "mbH&Co KG" does not mark a mnemonic. It must be quoted in version 1.3, it must not be quoted in 1.4. NEW FEATURES o Added ${label-component-gap}, $lcgap, and $lcg as row variables. o Added AbstractBuilder as new builder superclass. It holds a ComponentFactory per instance, that is initialized using the global default ComponentFactory2 instance. o ButtonBarBuilder2 methods return the builder to allow cascades, e.g.: builder.addButton(...).addSeparator().add(...) etc. o Added DefaultUnitConverter.MODERN_AVERAGE_CHARACTER_TEST_STRING. o Added DefaultUnitConverter.BALANCED_AVERAGE_CHARACTER_TEST_STRING. OTHER CHANGES o Moved to Java 5: uses varargs and generics where appropriate. o All classes now use the Common class Preconditions to check preconditions on method state and parameters. o Adjusted and extended tests for handling mnemonics. o Moved tutorial sources and tutorial docs to the upcoming JGoodies Showcase application. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms Version 1.3.0 Release Notes INTRODUCTION This update adds a PanelBuilder feature to automatically associate an added focusable component with a previously added label, see class PanelBuilder. The component factory mechanism and the builder classes have been extended to create JLabels that are intended to label read-only components. BUGS FIXED o Issue 66: Potential out of memory in DefaultUnitConverter. o Fixed a parse problem with commas in prototype strings, e.g. new FormLayout("pref, 'a,b', pref", "p"); OTHER CHANGES o Added builder methods for labels that label read-only components, see PanelBuilder#addROLabel and #addI15dROLabel in the AbstractI15dPanelBuilder. o Introduced the ComponentFactory2 interface for the creation of JLabels that label read-only components. o DefaultComponentFactory implements ComponentFactory2. o Added convenience methods #addButton to the ButtonStackBuilder that add given JButtons or JButtons created from given Actions. o Added the CC factory class that vends CellConstraints. It allows to remove a line from typical builder code. This code: FormLayout layout = new FormLayout(...); PanelBuilder builder = new PanelBuilder(layout); CellConstraints cc = new CellConstraints(); builder.add(..., cc.xy (1, 1)); builder.add(..., cc.xyw(3, 1, 3)); can be replaced by: FormLayout layout = new FormLayout(...); PanelBuilder builder = new PanelBuilder(layout); builder.add(..., CC.xy (1, 1)); builder.add(..., CC.xyw(3, 1, 3)); o Changed the Mac button minimum width from 39 to 54 dlu. o Changed the FormSpec parser to accept bounded sizes with constant lower and upper bound. o Changed the FormDebugPanel to paint dashes. o Added tests for the labelFor feature. o DefaultComponentFactory creates JLabels that remove the trailing colon (':') - if any - from its accessible name. This in turn leads to improved accessible names for components labeled by FormsLabels via {@code #setLabelFor}. o Added tests for the accessible name in FormLabels. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms Version 1.2.1 Release Notes INTRODUCTION This maintenance release fixes bugs when using multiple class loaders to use multiple Forms versions in a single application (where most applications load only a single Forms version). This version also comes with improved tutorial sources, and it ships a new feature in the source code extras that can automatically associate added components with labels that have mnemonics, see the PanelBuilder2. BUGS FIXED o Issue 63: Class Leak due to UIManager.addPropertyChangeListener() o Issue 64: ClassCastException when using different ClassLoaders. OTHER CHANGES o AbstractFormBuilder#add(Component, CellConstraints) can be overridden in subclasses. o Added PanelBuilder2 to the source code extras. It provides a feature that shall be moved to the PanelBuilder in the next major version: associate a focusable component with a previously added label that has a mnemonic. This feature will be moved to the core PanelBuilder in the next release. o FormUtils#clearLookAndFeelBasedCaches is public. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms Version 1.2.0 Release Notes INTRODUCTION This update fixes bugs and brings several major improvements. It is binary incompatible with previous versions of the Forms; however the API changes don't affect typical application code. Version 1.2 is visually compatible with previous versions. Layouts specified with 1.0.7 or 1.1 are the same in 1.2. The Forms 1.2 offer syntax extensions, layout variables, and rarely used code has been removed. CHANGES THAT AFFECT THE COMPATIBILITY o Removed the deprecated FormFactory#createColumnLayout methods. o Added #encode() to the Size interface. NEW FEATURES o New syntax for encoded column and row specification: - layout variables, see the LayoutMap class comment for details. - bounded sizes [,] // lower bound [,] // upper bound [,,] // lower and upper bound for example [30dlu, pref], [pref, 30dlu], [10dlu, pref, 30dlu] - multiplier "5*(p, 3dlu), p" - prototype strings "p, '123-456-789', p" - accepts string encodings with whitespace before a comma, for example "pref , pref" o Sizes#setDefaultUnit(Unit) allows to set the unit that is used for constant sizes without explicit unit, e.g. "21". As of the Forms 1.2 the default is still ConstantSize.PIXEL. Sizes.setDefaultUnit(null) sets it to Dialog Units (DLU). o Borders#DLU21_BORDER, Sizes#DLUX21, Sizes#DLUY21. o ColumnSpec#createGap(ConstantSize), RowSpec#createGap(ConstantSize). o Added DefaultFormBuilder#setDefaultRowSpec. o DefaultComponentFactory#setTextAndMnemonic is public. o ColumnSpec#encode, RowSpec#encode, and Size#encode return a parseable encoded string specification. o ButtonBarBuilder2. It builds betters button bars and has a simpler API than the ButtonBarBuilder. o FormLayout can honor or ignore the component visibility. Added FormLayout#setHonorsVisibility(boolean) for the container level and FormLayout#setHonorsVisibility(Component, Boolean) for a component-specific setting that overrides the container default. o ButtonStackBuilder(FormLayout, JPanel) LAYOUT VARIABLES Layout variables are intended to improve the layout consistency in GUIs with many views. And they can improve the readability. Variables are used in the encoded column and row specifications. They start with the '$' character, for example you can write: new FormLayout("pref, $lcgap, pref, $rgap, pref", "p, $lgap, p, $myGap1, p, ${my gap}") where $lcgap, $rgap, $lgap are default variables, and $myGap1 and ${my gap} are custom variables. LayoutMaps build a chain; each LayoutMap has an optional parent map. The root is defined by LayoutMap#getRoot(). Application-wide variables should be defined in the root LayoutMap. If you want to override application-wide variables locally, obtain a LayoutMap using new LayoutMap(), configure it, and provide it as argument to the FormLayout, ColumnSpec, and RowSpec constructors/factory methods. BUGS FIXED o DefaultUnitConverter ignores changes of the default dialog font when computing the global dialog base units. o BoundedSize constructor accepts null lower and upper bound. o Borders#createEmptyBorder accepts null values. o Parser accepts column specs without commas. OTHER CHANGES o Borders#createEmptyBorder returns a Border that benefits from the optimization in JComponent#getInsets(Insets). o Added tests for the new syntax. o Updated download address. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms Version 1.1.0 Release Notes INTRODUCTION This update fixes minor bugs and comes with a few API changes. It is binary incompatible with previous versions of the Forms, however the API changes won't affect typical application code. This version is primarily intended to deliver the API changes and tiny improvements that have been made since version 1.0.7. I've decided to make smaller steps, and to release updates more frequently. On the other hand, some changes planned for 1.1 have been deferred to future versions. CHANGES THAT AFFECT THE COMPATIBILITY o Removed deprecated builder constructors: AbstractFormBuilder(Container, FormLayout) PanelBuilder(JPanel, FormLayout) I15dPanelBuilder(JPanel, FormLayout, ResourceBundle) DefaultFormBuilder(JPanel, FormLayout) DefaultFormBuilder(JPanel, FormLayout, ResourceBundle) NEW FEATURES o Added PanelBuilder#setBackground and #setOpaque. o Added AbstractI15dPanelBuilder to reduce the effort required to build internationalized builders for ResourceMaps. o Added a debug feature for broken localizations, see the class comment in AbstractI15dPanelBuilder. o Added CellConstraints#rc, #rcw, #rchw o Added the constructor FormLayout(ColumnSpec[]) o DefaultComponentFactory is non-final. o BoundedSize is public, as well as its sole constructor. o Added BoundedSize#getBasis, #getLowerBound, #getUpperBound. o Added ConstantSize#getValue, #getUnit. o Public ConstantSize(double, Unit) and ConstantSize(int, Unit). o FormLayout.Measure is public. BUGS FIXED o Issue 38: Layout ignores default size if it is bounded o Issue 46: DLU size not updated on look&feel changes o Issue 54: Utilities#computeIsLafAqua uses name not id o Added a missing 'I' in I15dPanelBuilder#add15dTitle(String, String) OTHER CHANGES o ANT build creates a Maven bundle. o Improved DefaultComponentFactory#createSeparator(JLabel) docs. o Slightly improved the DefaultFormBuilder tutorial examples. o Source code improvements. o Marked the FormFactory#createColumnLayout methods as deprecated. These will be removed from version 1.2. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms Version 1.0.7 Release Notes INTRODUCTION This maintenance release fixes a bug in Turkish environments. The fix and other changes do not affect the layout. Hence, this version is binary and visually compatible with previous versions. BUGS FIXED o Issue 37: String encodings parser fails in Turkish locale. DISTRIBUTION CHANGES The sources now ship in the directory structure used by the CVS. This makes it easier to build the distribution using ANT. If you want to attach the library sources in an IDE, point to folder 'src/core'. OTHER CHANGES o Issue 36: Some DefaultFormBuilder methods lack return value. o Source style improvements. o The FAQ is now online. o Added references to the Explicit Table Builder, Matisse, Packer. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms, Version 1.0.6 Release Notes INTRODUCTION This maintenance release is primarily a documentation update. It also contains minor bug fixes that do not affect the layout. Hence, this version is binary and visually compatible with the previous version. NEW FEATURES o Added an empty FormLayout constructor. o PanelBuilder#getComponentFactory is public. o DefaultFormFactory#createSeparator(JLabel) is public. BUGS FIXED o BoundedSize#toString wrong if lower and upper bound exist. o Issue 19: DefaultFormBuilders *I15d methods don't use setLabelFor. o Issue 33: DefaultComponentFactory may set wrong mnemonic index. OTHER CHANGES o Docs: Removed several JavaDoc tags to improve readability. o Docs: Added examples to FormLayout constructors. o Docs: Corrected JavaDoc @throws texts in ColumnSpec and RowSpec. o Docs: Corrected and extended JavaDocs regarding the mnemonic marker in ComponentFactory, DefaultComponentFactory, PanelBuilder. o Docs: Refreshed the list of visual builder tools. o Docs: Added a bunch of TODOs for future versions. o Dist: Fixed broken package information in the JAR manifest. o Build:Set 'build.compile.source' and 'build.compile.target' to '1.4' in the default.properties; build.xml honors the source setting. o Tut.: Main methods use the new JGoodies Looks 1.3 package names. o Test: Added tests for the DefaultComponentFactory. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms, Version 1.0.5 Release Notes INTRODUCTION This maintenance release fixes bugs, adds features, and brings minor improvements for the code, documentation and tutorial. NEW FEATURES o Added FormLayout#setColumnSpec(int, ColumnSpec) o Added FormLayout#setRowSpec(int, ColumnSpec) BUGS FIXED o Titled separator on Aqua not aligned along the label's font baseline. o Button minimum width too wide on MacLayoutStyle. o Related gap too narrow in MacLayoutStyle. o DefaultFormBuilder ignores the current row span set by #setRowSpan. o AbstractFormBuilder#createLeftAdjustedConstraints(int) ignores the current row span. o DefaultComponentFactory can register L&fChangeHandler multiple times. OTHER CHANGES o Code: Builders avoid the creation of obsolete FlowLayout instances. o Code: Overhauled builder constructors; marked some as deprecated. o Code: Changed separators created by the DefaultComponentFactory to be opaque. o Code: Renamed DefaultUnitConverter#LAFChangeHandler to LookAndFeelChangeHandler. o Code: Removed unused code in class BoundedSize. o Code: Minor code cleanup: removed unused else. o Tut.: Added pitfall example for vertically non-filled component. o Tut.: Added pitfall example for the ever-growing text area. o Docs: Improved FormDebugPanel's constructor JavaDocs. o Docs: Added overview information to the JavaDocs. o Docs: Refreshed links to visual builders that support the FormLayout. o Docs: Refreshed some FAQ items. o Docs: Added FAQ #2.6: How to remove a component from the layout? o Docs: Added FAQ #3.6: Why do some text areas grow and never shrink? o Docs: Added a reference to the SWT port by the SwtForms project. o Docs: Added a reference to Gerald Rosenberg's JFormComposer. o Docs: Clarified the semantics and use case for CellConstraint insets. o Docs: Indicated that FormFactory factory methods may be removed. o Dist: Corrected implementation title and vendor in the JAR manifest. o Dist: Added project name tag to the ANT build file. o Dist: Overhauled the README.html. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms, Version 1.0.4 Release Notes INTRODUCTION This maintenance release fixes bugs, comes with a simpler API, and provides more JavaDoc examples for frequently used methods. API INCOMPATIBILITIES o ColumnSpec and RowSpec are now immutable. This won't affect the typical Forms usage, but may affect visual builder tools. o Removed method ButtonStackBuilder#addGriddedNarrow(JComponent) VISUAL INCOMPATIBILITIES o In rare cases the container size may be smaller than before. Bug #4 has been fixed (see below). In 1.0.4 the container will be expanded only if components span cols/rows that can grow. In 1.0.3 the container could be expanded if *any* col/row grows. So some wrong 1.0.3 container expansions won't happen in 1.0.4. NEW FEATURES o Added the CellConstraints#xyw method set. o Added FormLayoutUtils to the Extras. BUGS FIXED o DefaultUnitConverter#setDefaultDialogFont throws NPE. o DefaultUnitConverter#setAverageCharacterWidthTestString throws NPE. o Invalid sample code in PanelBuilder JavaDocs. o (Bug #4) In some cases components that span multiple columns/rows can expand the container size, although none of the spanned columns/rows are allowed to grow. OTHER CHANGES o Extended and corrected JavaDoc class comments. o Added examples to the JavaDocs of frequently used methods. o Refreshed README and FAQ o Refreshed whitepaper to demonstrate CellConstraints#xyw. o Added two HTML pages: Visual Builders and References. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms, Version 1.0.3 Release Notes INTRODUCTION This maintenance release contains new core classes, adds methods, and comes with improved JavaDocs and an extended tutorial and FAQ. The DefaultFormBuilder has been moved from the extras to the core. Also, the support for the Mac OS X has been improved significantly: the DefaultComponentFactory has been adjusted for the Aqua look&feel, the new MacLayoutStyle describes the Mac and Aqua styles guide lines, and the ButtonBarBuilder and ButtonBarFactory now honor a button order. VISUAL INCOMPATIBILITIES On the Mac OS X platform Forms 1.0.3 changes the button order; other platforms are not affected. In most cases this will improve the user experience of your applications. It is recommended to check your ButtonBarBuilder invocation to use a fixed left to right order where necessary. ButtonBarBuilder methods that create sequences of buttons now honor the LayoutStyle's button order. On Mac OS X this is right to left. Builder methods that add individual buttons are not affected. See the ButtonOrderExample in the tutorial for details on how to use or ignore the LayoutStyle's button order. API INCOMPATIBILITIES o Removed deprecated methods from the ButtonBarBuilder class: #addGriddedNarrow(JButton) #addGriddedNarrowButtons(JButton[]) #addGriddedGrowingNarrow(JComponent) NEW FEATURES o Moved DefaultFormBuilder and I15dPanelBuilder to the core. o FormLayout is serializable. o AbstractFormBuilder#appendLabelComponentGapColumn() o AbstractFormBuilder#appendParagraphGapRow() o AbstractFormBuilder#setComponentFactory(...) now public o I15dPanelBuilder#addI15dLabel(String, CellConstraints, Component, CellConstraints) o LayoutStyle#getTabbedDialogMarginX() o LayoutStyle#getTabbedDialogMarginY() o LayoutStyle#getButtonBarPad() o LayoutStyle#isLeftToRightButtonOrder() o FormFactory#LABEL_COMPONENT_COLSPEC o MacLayoutStyle o AbstractFormBuilder#createLeftAdjustedConstraints(int) o ColumnSpec#decodeSpecs(String encodedColumnSpecs) (final) o RowSpec#decodeSpecs(String encodedRowSpecs) (final) o FormSpec.DefaultAlignment now visible (final) o Borders.EmptyBorder provides methods for the 4 sizes. BUGS FIXED o PanelBuilder fails to build right-to-left if column span > 1. o DefaultFormBuilder fails to build right-to-left if column span > 1. o Deserialization fails in 1.0.3 preview. KNOWN ISSUES o In some cases components that span multiple columns/rows can expand the container size, although none of the spanned columns/rows are allowed to grow. See the FAQ for details. OTHER CHANGES o Code: Added safety check for invalid constraints in PanelBuilder #add(JLabel, CellConstraints, Component, CellConstraints) #add(String, CellConstraints, Component, CellConstraints) o Code: DefaultComponentFactory#setTextAndMnemonic(JLabel) now private o Code: DefaultUnitConverter refers indirectly to ToolKit#getFontMetrics o Code: Marked ButtonStackBuilder#addGriddedNarrow as deprecated o JavaDocs: Extended and corrected o JavaDocs: Clarified some semantics o Docs: Fixed spelling and grammar errors o Docs: Extended and reorganized the FAQ o Tutorial: Improved alignment texts in custom row and custom areas example o Tutorial: Added ButtonOrderExample o Tutorial: Added ComponentOrientationExample o Tutorial: Added OrientationUtils to ComponentOrientationExample -------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms, Version 1.0.2 Release Notes INTRODUCTION This release is a maintenance update that fixes bugs, comes with a new example and a slightly improved and extended documentation. DISTRIBUTION CHANGES o Added a list of FAQ. o Added JavaDoc version tags to all class comments. NEW FEATURES o DefaultUnitConverter provides bound Bean properties for the default dialog font and the average character width test string. BUGS FIXED o Fixed broken button font lookup in DefaultUnitConverter that failed to find a font for GTKLookAndFeel, and more generally, SynthLookAndFeel subclasses. o Fixed #minimumLayoutSize that measured components that span multiple columns/rows with the preferredSize, now the minimumsize. o Patched the container expansion forced by components that span multiple columns/rows for the case that no column or row can grow. This expansion shall be performed if and only if the component spans an area that can grow. The old behavior performed this action ALWAYS; the patch check whether A column/row can grow; the upcoming fix will check the growing behavior of the spanned area. This problem is reflected by the FormLayout unit tests, where currently one out of three tests fails, see FormLayoutTests.test*ExtraExpansion* OTHER CHANGES o Main: Removed the final marker from FormDebugPanel; see the class comment for details o Main: Removed FormDebugPanel features that are available in the FormDebugUtils o Main: Extended JavaDoc for the DefaultUnitConverter o Main: Extended JavaDoc for the DefaultFormBuilder o Main: Border.BUTTON_BAR_GAP_BORDER uses dlu only. o Main: Faster conversion of sizes with a 0 value. o Tutorial: Added example for custom areas with DefautFormBuilder o Tutorial: Changed some text field widths from 'default' to 'min' o Tutorial: Corrected frame titles o Tests: Added tests for components that span multiple columns o Tests: Specialized some exceptions in catch clauses o Docs: Improved grouping diagrams o Docs: Fixed invalid link to a tutorial pdf o All code: Documented empty blocks. --------------------------------------------------------------------------- Find below the change history for older releases. JGoodies Forms, Version 1.0.1 Release Notes INTRODUCTION This release is primarily a documentation and distribution update; it fixes a bug (with maximum sizes) and contains no API changes. DISTRIBUTION CHANGES o Added tips & tricks o Added a tutorial o Added a programmer's reference o Library sources ship as a single ZIP file BUGS FIXED o Main: Fixed broken maximum sizes that had the same effect as minimum o Main: Fixed FormFactory.BUTTON_COLSPEC to use a lower, not upper bound o Tutorial: Corrected FormDebugExample.main OTHER CHANGES o Main: Added sanity checks for invalid CellConstraints alignments o Main: Minor code cleanup: removed obsolete casts and semicolons o Main: Minor improvement: parameter names made more consistent o Main: Library compiled against 1.3 but with Sun's javac 1.4.2 o Main: FormFactory.GROWING_BUTTON_COLSPEC honors LayoutStyle o Main: All FormFactory specs are now unmodifyable o Tutorial: Added Quick Start example o Tutorial: Added example for component sizes o Tutorial: Added example for custom rows and DefaultFormBuilder o Test: Added tests for invalid CellConstraints alignments o Test: Added tests for bounded sizes o Docs: Removed comparison with HIGLayout from the whitepaper o Docs: Some throws clauses added to the JavaDocs o Build: process reflects the distribution changes --------------------------------------------------------------------------- 1.0 (July-18-2003) o Compiled with Sun javac 1.3.1_08 o Distribution changed: + forms.pdf renamed to whitepaper.pdf + demo removed + build overhauled + readme.txt simplified 1.0rc (June-20-2003) o Code is now available under the BSD license o Fixed bug in DefaultFormBuilder.appendI15dTitle o Corrected JavaDoc for ButtonStackBuilder o Improved whitepaper o Packaging reflects the new license o Library jar is unobfuscated o Library jar is unsigned jgoodies-forms-1.6.0/docs/0000755000175000017500000000000012003555436014144 5ustar tonytonyjgoodies-forms-1.6.0/docs/visualbuilders.html0000644000175000017500000001466112003555436020077 0ustar tonytony JGoodies Forms :: Visual Builders
:: JGOODIES :: Forms

:: Visual Builders ::

Find here a list of visual builder tools that support the JGoodies FormLayout. These vary in price, concepts, general features, visual feedback, and support for additional Forms features like factories and non-visual builders.

Commercial Builders

JFormDesigner is an advanced visual designer that supports the FormLayout and other layout managers. It supports several Forms helper classes. Plug-ins for Eclipse and IntelliJ IDEA are available, plug-ins for NetBeans, JDeveloper, and JBuilder are under development.

Mindsilver's GUIDE is an advanced GUI builder for Swing.

Intellij IDEA includes an advanced GUI designer that support the JGoodies FormLayout and other layout managers.

JAXFront generates dynamic user interfaces based on an XML schema.

The Jigloo GUI builder is a plugin for Eclipse and WebSphere Studio. It supports the FormLayout and other layout managers. Jigloo is free for non-commercial use, but commercial use requires purchasing a Professional License.

Free Builders

Google's WindowBuilder Pro is an advanced visual designer for Swing and SWT that supports the FormLayout and the Forms helper classes, as well as a bunch of other layout managers for Swing and SWT. The WindowBuilder Pro comes as an Eclipse plugin.

Abeille Forms Designer is a GUI builder that supports the FormLayout.

Form Layout Maker supports the FormLayout and generates XML files that contain all constraints.

The Mogwai FormMaker is another visual form editing tool for developing Swing forms using the JGoodies FormLayout.

(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/references.html0000644000175000017500000002010112003555436017145 0ustar tonytony JGoodies Forms :: References
:: JGOODIES :: Forms

:: References ::

Find here a list of references useful for Java layout.

Layout Systems

ExplicitLayout complements the FormLayout when it comes to non-rectangular layouts and other complex non-form-oriented designs. It is a powerful general purpose layout manager that provides many features to specify the location and size of a component.

ExplicitLayout offers other useful features: styles, external UI specification and layout reuse. ExplicitLayout is licensed under the GNU LGPL and ships with a user guide and well chosen examples.

The Explicit Table Builder adds a few things that the pure ExplicitLayout is missing such as builders, layout styles, support for Dialog Units (dlu), and a nice debug panel.

The Matisse visual builder (integrated with Netbeans) makes it easy for many people to get layouts done quickly. It seems that Matisse has been designed for visual building, but the underlying GroupLayout can be used without Matisse.

Although the FormLayout is intended to replace the GridBagLayout, the latter is still a resonable choice, if you cannot add a third party layout manager like the FormLayout to your project. The Packer simplifies the use of GridBagLayout.

SwtForms is an SWT port of the JGoodies FormLayout and some Forms builder done by Florian Fankhauser.

JGoodies Forms Cheat Sheet

Robert Blixt provides a Forms cheat sheet that summarizes information about Forms' sizes, units, constraints, and the string encoding syntax.

Articles

Microsoft's Design Specifications and Guidelines - Visual Design describe how to layout on the Microsoft platform. Since the dimensions are specified in a non-pixel size dlu it is quite useful for multiplatform screen design.

The Apple Human Interface Guidelines provide a lot of tips & tricks for good design.

I provide articles and presentations about Swing, apperance, and layout.

Books

A recommended reading is Designing Visual Interfaces by Kevin Mullet & Darrel Sano. If you read 100 pages of this book, you will learn the most valuable basics of user interface design, and more generally, design. It is useful for the daily work of every GUI developer.

If you either need an introduction or reference about do's and don'ts in GUI design, read Jeff Johnson's GUI Bloopers. If you are busy and can't find the time to read 500 pages, just look at the book's contents and check whether you have an idea what all the topics are about. In this case, I guess, a medium skilled GUI designer will read about 50 pages.

There are several tutorials and books that can help you get started with the Swing widget toolkit, widgets, and basic configuration. The Swing book by Robinson and Vorobiev is one of the better books.

(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/style.css0000644000175000017500000000154312003555436016021 0ustar tonytonybody, p, td, li, h1, h2, h3 { font-family: Verdana, Arial, Helvetica, Geneva, sans-serif; } body, p, td, li, h2, h3 { font-size: 12px; } h1, h2, h3 { font-weight: bold; color:#323777; margin-bottom: 11px; } h1 { font-size:14px; } h2, h3 { margin-top: 17px; } .header { font-weight: bold; color:#323777; margin-bottom: 11px; } p { margin-top: 14px; } a { text-decoration: none; color:#323788; } a:hover { text-decoration: underline; } a.nav { text-decoration: none; color:#000000; } a.nav:hover { text-decoration: underline; } pre { font-family:Courier New, Courier, monospace; font-size:12px; } ul { list-style-type: square; margin-top: 2px; } td.header { color: #FFFFFF; background-color:#323777; } td.cell { background-color:#FFFFFF; }jgoodies-forms-1.6.0/docs/reference/0000755000175000017500000000000012003555436016102 5ustar tonytonyjgoodies-forms-1.6.0/docs/reference/componentsizes.html0000644000175000017500000001344712003555436022061 0ustar tonytony JGoodies Forms :: Reference :: Component Sizes
:: JGOODIES :: Forms

:: Reference :: Component Sizes ::

The component sizes min, pref, default are used to set column and row sizes that reflect the minimum or preferred sizes of the contained components.

If you specify a column size as min sized, FormLayout will ask all components in that column for their minimum width and chooses the largest width as the column width. The same applies to rows and the pref component size.

The default size aims to give a column the width of the largest preferred width. If container space is scarce, it shrinks the column down to the largest minimum width.

String Representations

I recommend to specify column and row sizes in the FormLayout constructor using string representations. These strings will be accepted by the FormLayout, ColumnSpec, RowSpec and Borders classes.
componentSize ::= MIN | PREF | DEFAULT | M | P | D 

Examples

new ColumnSpec("min");
new ColumnSpec("m");
new ColumnSpec("default");
new ColumnSpec("d");
new ColumnSpec("pref");
new ColumnSpec("p");

new RowSpec("min");
new RowSpec("m");

new FormLayout("left:pref, 4dlu, fill:default", 
               "p, 3dlu, p, 3dlu, p");
(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/reference/constantsizes.html0000644000175000017500000002152612003555436021705 0ustar tonytony JGoodies Forms :: Reference :: Constant Sizes
:: JGOODIES :: Forms

:: Reference :: Constant Sizes ::

Constant sizes are used to set the size of gaps and other fixed layout elements. They can also be used in bounded sizes as lower or upper bound.

Units

Constant sizes are specified by a value plus unit that is one of: Pixel, Points, Inches, Millimeter, Centimeter and Dialog Units. In string representations the units are abbreviated as: px, pt, in, mm, cm and dlu.

Constant Non-Pixel Sizes

Constant sizes are constant for a given dialog font, font size and screen resolution. Pixel sizes map to a fixed dimension in pixels - even if these parameters change. This is undesired in screen design, especially in multi-platform environments. Therefore you should favor non-pixel sizes over pixel sizes.

If you move an application from Windows to Mac or Linux, you want to retain the overall appearance and layout propertions. And if you just change your Windows desktop font settings, you want all layout elements grow appropriately: labels, fields, buttons, but also: gaps, borders, minimum sizes and dialog dimensions.

Layout managers have been designed to address this issues. Nevertheless, most of them fail to retain proportions if you specify dimensions in pixel, which is often the case for gaps, borders, dialog sizes, and custom minimum and preferred sizes.

For example, a well designed OK button shall have a minimum width; 75px is appropriate for an 8pt Tahoma font on Windows with 96dpi. But on 120dpi and 10pt Arial, 75 pixels are perceived as quite narrow. Dialog Units allow to specify such a size in a way that it grows and shrinks with the environment. For example, the MS layout style guide suggests a command button minimum width of 50dlu, which maps to 75px in the first context and to 100px in the second.

Points, Inches, Millimeters and Centimeters are intended for sizes that shall grow with the screen resolution but that are independent of the font and font size.

Unit Conversion

Class Sizes provides methods to convert non-pixel sizes to pixels. The actual mapping is performed by a customizable Unit converter.

Prototype Sizes

You can describe a column width or row height by providing a string prototype, for example new FormLayout("right:pref, 3dlu, '+49-89-32168'"). Prototype sizes scale better than Dialog Units if the content consists only of special characters, for example digits.

Logical Constant Sizes

Logical sizes can be used to specify a size that changes with the current platform or style guide. For example, if you want to specify a button's minimum width, you may want to use 50dlu on Windows and 68px on a Mac. Or you define the gap between two related text field rows as 3dlu on Windows and 4px on a Mac.

The Forms layout system supports logical sizes in builder classes, via the Layout Style and the FormFactory constants. Since version 1.2 you can use logical sizes in encoded column and row specifications too, by means of layout variables. For example new FormLayout("right:pref, $lcgap, pref") uses the short name of the variable $label-component-gap that describes the platform-specific gap between a label and its associated component.

The ButtonBarFactory, ButtonBarBuilder and ButtonStackBuilder use logical sizes and in turn style guide-specific logical sizes for frequently used gaps and minimum widths and heights. For example the ButtonBarBuilder uses logical sizes to honor style guide settings for button minimum width, and gaps between related and unrelated components.

If you develop a custom builder class, you can refer to the logical sizes using the current Layout Style or the FormFactory constants.

String Representations

I recommend to specify column and row sizes in the FormLayout constructor using string representations. These strings will be accepted by the FormLayout, ColumnSpec, RowSpec and Borders classes.
constantSize ::= integerUnit | doubleUnit
integerUnit  ::= PX | PT | DLU
doubleUnit   ::= IN | MM | CM

Examples

new ColumnSpec("50dlu");
new ColumnSpec("75px");
new ColumnSpec("'xxx-MMM-000-xxx'");

new RowSpec("2in");
new RowSpec("100px");

new FormLayout("100dlu, 4dlu, 200dlu", 
               " 14dlu, 3dlu,  14dlu");
(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/reference/cells.html0000644000175000017500000001571612003555436020104 0ustar tonytony JGoodies Forms :: Reference :: Cell Constraints
:: JGOODIES :: Forms

:: Reference :: Cell Constraints ::

Each component managed by a FormLayout is associated with an instance of CellConstraints that specifies a component’s display area and alignment. The column and row origins are mandatory, but as we will see later, often a non-visual builder will automatically create the CellConstraints for you.

By default the column and row span is just 1, and the alignments are inherited from the related column and row. If possible you should specify the aligment for the column and row, not for the component; this way you can reduce the amount of alignment specifications significantly.

CellConstraints objects can be constructed in different ways using a mixture of ints, objects and strings. I recommend to specify the origin and span using ints and the alignment with strings - just to increase the code readability.

Reusing CellConstraints

You can reuse CellConstraints objects because they are cloned internally by the FormLayout. Hence you can write a condensed form
CellConstraints cc = new CellConstraints();
builder.addLabel("Name", cc.xy(1, 1));
builder.add(nameField,   cc.xy(3, 1));
builder.addLabel("Age",  cc.xy(1, 3));
builder.add(ageField,    cc.xy(3, 3));

Spanning Multiple Columns/Rows

You can let components span multiple columns or rows, for example by using the CellConstraints method #xywh where you specify the x and y position of the leading cell and the width and height of the display area.

Note: these components do not affect the size of the spanned columns or rows, nevertheless, they may expand the whole container. See also the FAQ for details and how to handle this situation.

Examples

1) Creation methods intended for use by humans
 CellConstraints cc = new CellConstraints();
 cc.xy(2, 1);                          // second col, first row
 cc.xy(2, 1, "right, bottom");         // aligned to right and bottom
 cc.xy(2, 1, "r, b");                  // abbreviated alignment
 cc.xywh(2, 1, 4, 3);                  // spans 4 cols, 3 rows
 cc.xywh(2, 1, 4, 3, "right, bottom");
 cc.xywh(2, 1, 4, 3, "r, b"); 
 
2) Constructors intended for builders
 new CellConstraints();                // first col, first row
 new CellConstraints(2, 1);			
 new CellConstraints(2, 1, 4, 3);
 new CellConstraints(2, 1, CellConstraints.RIGHT, 
                           CellConstraints.BOTTOM);	
3) Constructors intended for building UIs from XML
 CellConstraints cc = new CellConstraints();
 new CellConstraints("2, 1");
 new CellConstraints("2, 1, r, b");
 new CellConstraints("2, 1, 4, 3");
 new CellConstraints("2, 1, 4, 3, r, b");
 
(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/reference/colsandrows.html0000644000175000017500000001300612003555436021326 0ustar tonytony JGoodies Forms :: Reference :: Columns & Rows
:: JGOODIES :: Forms

:: Reference :: Columns & Rows ::

Columns and rows are specified by three parts:
  • a mandatory initial size
  • an optional default alignment
  • an optional resizing behavior
For example, you can specify that a column is left aligned, has an initial size of 50 Dialog Units and grows: new ColumnSpec("left:50dlu:grow");

Resizing Behavior

Columns and rows can grow if the layout container becomes larger than the preferred size. By default, columns and rows won’t resize. The extra space is distributed over the columns and rows that have a resize weight larger than 0.0, where each column gets a space proportional to its weight.

String Representations

String representations for column and row specifications can be used in the FormLayout constructors as well as in classes ColumnSpec, RowSpec.
columnSpec     ::= [columnAlignment:] size [:resizeBehavior]
rowSpec        ::= [rowAlignment   :] size [:resizeBehavior]
resizeBehavior ::= NONE | GROW | GROW() | G()

Examples

new ColumnSpec("16px");
new ColumnSpec("left:16px");
new ColumnSpec("left:16px:grow");

new FormLayout("right:max(50dlu;pref), 4dlu, max(100dlu;min)", 
               "p, 3dlu, p, 3dlu, fill:200dlu:grow");
(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/reference/boundedsizes.html0000644000175000017500000001425712003555436021477 0ustar tonytony JGoodies Forms :: Reference :: Bounded Sizes
:: JGOODIES :: Forms

:: Reference :: Bounded Sizes ::

Bounded sizes are used to restrict a layout element's initial size. They add context related layout information that the element does not or cannot provide. To use a bounded size, you typically combine a component size (min, pref or default) with a constant size as lower or upper bound.

For example, a well designed command button honors the button's label and icon size, but also uses a minimum width. The latter increases the design consistency and often makes it easier to click on buttons with short labels. A Swing JButton is used in different contexts: form, button bar, button stack, toolbar with icons, toolbar with texts, toolbar in large button mode, etc. Since the JButton (or the ButtonUI) can only provide a single preferredSize that often lacks the context. And so, the button lacks information about context-related layout requirements.

String Representations

String representations for bounded sizes are used in the FormLayout constructors as well as in classes ColumnSpec, RowSpec and Border. The string encodings allow to set only a lower or upper bound, where the related Java objects allow to set both bounds at the same time, which is needed rarely.
boundedSize ::=   [constantSize,componentSize]               // lower bound
                | [componentSize,constantSize]               // upper bound
                | [constantSize,componentSize,constantSize]  // lower and upper
                
                | MAX(constantSize;componentSize)            // lower bound (old)
                | MIN(constantSize;componentSize)            // upper bound (old)

Examples

ColumnSpec.decode("[50dlu,pref]");     //  pref size with lower bound 50dlu

RowSpec.decode("[pref,80dlu]");        //  pref size with upper bound 80dlu

new FormLayout("[50dlu,pref], 4dlu, [100dlu,min]", 
               "p, 3dlu, p, 3dlu, [200dlu,p]:grow");
(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/reference/alignments.html0000644000175000017500000001475012003555436021140 0ustar tonytony JGoodies Forms :: Reference :: Alignments
:: JGOODIES :: Forms

:: Reference :: Alignments ::

Column alignments are: left, center, right, fill.
And row alignments are: top, center, bottom, fill.

The fill alignment expands a component to span its display area, so that the component's left-hand side is left-aligned, and the right-hand side is right-aligned. The same applies to top/bottom for rows.

Applying Defaults

FormLayout aims to minimize the effort to specificy alignments. Therefore it 1) tries to reuse alignments, 2) provide good defaults for form oriented layouts.

1) The column and row alignments are applied to all components that are located in a single cell of that column/row. A component can override its column/row alignment by setting an individual alignment via a CellConstraints object.

2) By default, the column alignment is set to fill. The implicit alignment for rows is center. And so, if you don't specify column and row alignments, your components will be horizontally filled and vertically centered. This is a good default for most text fields, combo boxes, buttons and it works fine with labels too.

Alignment Constants

The classes ColumnSpec, RowSpec provide constant values for the alignment values mentioned above.

String Representations

I recommend to specify column and row alignments in the FormLayout constructor using string representations. These strings will be accepted by the FormLayout, ColumnSpec, RowSpec and CellConstraints classes and by many builder methods.
columnAlignment ::= LEFT | CENTER | RIGHT  | FILL | L | C | R | F
rowAlignment    ::= TOP  | CENTER | BOTTOM | FILL | T | C | B | F

Examples

ColumnSpec.LEFT;
ColumnSpec.FILL;
new ColumnSpec("left");
new ColumnSpec("f");

RowSpec.BOTTOM;
RowSpec.CENTER;
new RowSpec("bottom");
new RowSpec("c");

new FormLayout("left:pref, 4dlu,    fill:pref", 
               " top:pref, 3dlu, center:pref");
               
new CellConstraints(2, 3, ColumnSpec.LEFT, RowSpec.TOP);
new CellConstraints(2, 3, "left, top");
new CellConstraints(2, 3, "l, t");

CellConstraints cc = new CellConstraints();
builder.add(component, cc.xy(2, 3, "left, top");
(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/reference/variables.html0000644000175000017500000002105312003555436020741 0ustar tonytony JGoodies Forms :: Reference :: Layout Variables
:: JGOODIES :: Forms

:: Reference :: Layout Variables ::

Layout variables are used to use improve the design consistency.

Predefined and custom variables start with a dollar sign ($) and can be surrounded by braces ({ … }). For example $lcgap, ${label-component-gap}, $myvariable1, ${myvariable1}, ${my variable with white space}. If surrounded by braces the variable name can contain hyphens and white-space.

variable ::= $<alphanumeric> | ${<string>}

Predefined Variables

Predefined variables provide access to logical sizes in the Forms' string language. Their values are requested from the current Layout Style.
columnVariable ::= ${label-component-gap}  | $lcgap    | $lcg
                   ${related-gap}          | $rgap     | $rg
                   ${unrelated-gap}        | $ugap     | $ug
                   $button                 | $b
                   ${growing-button}       | $gb
                   ${dialog-margin}        | $dmargin  | $dm
                   ${tabbed-dialog-margin} | $tdmargin | $tdm
                   $glue

rowVariable ::=    ${label-component-gap}  | $lcgap    | $lcg
                   ${related-gap}          | $rgap     | $rg
                   ${unrelated-gap}        | $ugap     | $ug
                   ${narrow-line-gap}      | $nlgap    | $nlg
                   ${line-gap}             | $lgap     | $lg
                   ${paragaph-gap}         | $pgap     | $pg
                   ${dialog-margin}        | $dmargin  | $dm
                   ${tabbed-dialog-margin} | $tdmargin | $tdm
                   $button                 | $b
                   $glue

Custom Variables

Custom variables further reduce the costs to achieve consistent design in teams and when implementing many screens. Let's say you want right-aligned labels in all your screens. You would repeat "right:pref" in every individual FormLayout construction. If you introduce a custom variable $label by setting it in the shared root LayoutMap you could later refer to it in the FormLayout constructor
LayoutMap.getRoot().columnPut("label", "right:pref");

new FormLayout("$label, $lcgap, pref", …);
	
If you setup custom variables, you can honor the platform, locale, and other context information. Let's say you want to ensure a consistent width of all label columns using "right:[85dlu,pref]". The 85dlu will likely waste space in Chinese.
String width = <compute width per Locale>; // e.g. "85dlu" vs. "25dlu"
LayoutMap.getRoot().columnPut("label", "right:[" + width + ", pref]");
	

Overriding and Changing Variable Values

You can change a predefined variable value globally or locally. Layout variable values are requested from LayoutMaps. There's a shared root LayoutMap available via LayoutMap.getRoot() that is used by default by the FormLayout constructor and other methods that use encoded column and row specifications.

If you re-define a variable value in the root LayoutMap, the change will affect all layouts that use the default LayoutMap. For example: LayoutMap.getRoot().columnPut("lcgap", "1dlu");.

As an alternative you can create a child LayoutMap and use this change locally.

LayoutMap childMap = new LayoutMap();   // has the root map as parent
childMap.columnPut("lcgap", "1dlu");
new FormLayout("&hellip", "&hellip", childMap);     // uses the child map

Examples

LayoutMap map = LayoutMap.getRoot();
map.columnPut("label", "right:[85dlu,pref]");
map.rowPut   ("table", "fill:100dlu:grow");

new FormLayout("right:[85dlu,pref], 3dlu, pref, 3dlu, 50dlu",      // no var
               "p, 3dlu, p, 3dlu, fill:100dlu:grow");
               
new FormLayout("right:[85dlu,pref], $lcgap, pref, $rgap, $button", // vars
               "p, $lgap, p, $lgap, fill:100dlu:grow");
               
new FormLayout("right:[85dlu,pref], $lcg, pref, $rg, $b",          // short
               "p, $lg, p, $lg, fill:100dlu:grow");
               
new FormLayout("$label, $lcgap, pref, $rgap, $button",             // custom vars
               "p, $lgap, p, $lgap, $table");
(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/reference/groups.html0000644000175000017500000001140312003555436020306 0ustar tonytony JGoodies Forms :: Reference :: Groups
:: JGOODIES :: Forms

:: Reference :: Groups ::

Column and row groups are used to specifiy that a set of columns or rows will get the same width or height. This is an essential feature to implement symmetric, and more generally, balanced design.

Example

In the following example it is ensured that columns 2 and 4 get the same width, rows 1 and 4 get the same height as well as rows 2 and 3:
FormLayout layout = new FormLayout("p, d, p, d", "p, p, p, p");       
layout.setColumnGroups(new int[][]{ {2, 4} });
layout.setRowGroups   (new int[][]{ {1, 4}, {2, 3} });
(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/docs/images/0000755000175000017500000000000012003555436015411 5ustar tonytonyjgoodies-forms-1.6.0/docs/images/quickstart-grid_sm.jpg0000644000175000017500000001230612003555436021731 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀ|ØÿÄ•  !AQ1"aq‘¡Ñ2BRáðbr’¢Ò#$Á‚²CT±3ÂâòS“D4”%!1AaQ¡2ÿÚ ?ýB®¡[{Ä×òƆoQeÞë‹+¨ñuÀë.õæþXPó¨~õÂølÞ¼_O7Ú÷C§Qr.õÃÅî…€3oaâ俆j¤×'40*&F߸ø¹9¡‚…Doý¯t0$©O{{Äo…€5Ô÷cÊ!VtÈw¯òóE‚–¢_º2&•EôÆô¶Ù>^h¶T\í½p¿Ÿ’wS—Ä/÷B 5Gí{ %* E߸Y?t,:穽x¶|ƒ’-_¨žµîˆ…ê/Ÿí{¢‡ê%í×îˆtóý¯tΧcõû ä­mæó`^k9ËœœcPl-œæ „¶Þo8Å -¿¶ìLÍ`¶üL\KoÚ=‘Œ-· ÌZÛÍmøœ"˜f[q¼á.ãÓ{n7œ"È,8·¬ÄŒ7­ñÌZÄÜo< ©6Þ/8ˆA`€võ˜‚)0ôŸÞq‹C ¾ÖÜ/<°°Ý·Ä/0‚‹‰zÏdA(ãÓ[|"ó‡4(HÛÕ-ñ Î+Uy†ÉõžÈŒŒÜ½g²Ì6Ϭö@0óÃrõ˜‚TØÖÞo1F-9»q8óF °Löõ·d@ÔÙ·ÛhP§¿´ìÅ»  –ß‹vBPÌå´ô·d@’y§`½»"Ðs5§n-‡4=å´ß{aͪO#ZvÛ²3;-#ù›² I=ëNÓ{vE¡Ûœ ™ËÙª’s;E툄 žÓÒÝJy½m4(`œæÓ°^ܼ ÏvÓÞŰæ„M†ÓÒÝ‘B}5¶á{a͉C¼öžö-€äƒWÃIœOKvDd­Äô·d™åénÈ[v@TÏ/I숨Bs8»1óEF½*¾§¤áý&Èäf 0”Äåtk0•¨-òÍq×↻E£ ™õf©&l2¥%ÌNËm Fç–þÞ²;œç˜y£ ¦-g?΀D™Õ$ò/0ó@y›Ÿça˜œËíó@IFæ>hAVÈÍB±¾‘óFƒžø¶ãæˆRr{G›*gåši7á‹«²0NsnnXäî[âŰ0‚‰26ÿTŒr/0óa 6óóüì¾ <ÿÍI—ýPgåšü³@<Çêˆ3V™¨&Dɦ"—íw¥§¦‡‰jUé—!©EßD”–Yfq$㻯hçõüºœ¾¿XÁÙ~%E "å*H”Ãm1>߈}5ÏÂ?l~¨Ò:kjW¡¥§¨¦©UNaë”$†P6}q}žïå,Îùú8úóËÐ^¤V2«©Ù~¢¹ÿŠ8cª5©Ã´4=}MzÔ¨« »U®Öž@I†Eâ¿·]s.¶»)WdAt¸‡ȲÖj%,u= øÎY¿;©ϪÚSÀ&¿œÕûWüÚŽ)±Í^õõ}ƒC[„JÝf°ræÕv@dºŽ¤ƒ®ÕÌ“a}WdZà*ÒÞö €…[ájâr¶ÎFˆ„\rô4.9z‡½ ó–hŠÊ™™3K\q",E¿tÙ…ÇExW…~à«ÄßUõtôáÍT¨ˆ§Neèä–\®Ç1`gtɬá¼Zµ txÅ…j¨Z–PÈ WÍm¦uj4_¸iÑyñ¯R·¥M:23®ù;¹fyâŽþ5J£h"=L••E,ò”íÛcsäËðz’e)š,TEÑCÕP¿“ÔlÛé8Ø nµHgˤ¯3)“J¤öcÒõkfákãÜ©„ Mg¨Èß‘«°ÚQÿÖÒ+YÀOY@ÂH†— ?—¬Lͦ‹“Ó8´Ñèf(T-#g£P†¦£W f–¨$©P_ÉÔW®¶ü5yòS©?ãÐšš¾–’±l}'þ"-G¬Õ3ŠUÁ ¢“Jÿ›C×`P6–±3Úi>æ@Öf¥pÎÇOY·X)ZUgh²á׭‘“†iÕ•Ö0ÊCL£lZË¡;Ïaï`ØUª¿aèh <Ç¡ ÌzÞ†ˆþ㊪–3[fn8Å”[(ÊlÂã<%|Qµ4éQøZdµJÈ•_#ÔÉL̳dÝ’äœá£Í^9«¨•>ªJŪS£QÔŠE”™MÅ X-Ë)ôÅ´qWãœpéI§áz…â Eg©ª¬b¹CM°Ñìñz&¦‹ON¤Ñžµ1SÓ.äI‚¦S5cÌ#FWyLOׯ·ëD\Házeª×Ì}Zæß­Å/ Ó¶yšâFÉT¯3gÓ‹SS†QV}BÌ Jß~ †ÒKV¯9îUžPŠ…AÿsQíjÄ{wᢓJ‚ÆjÀÌÏz¾7oEµ1^…2ö5q!ç­ÒŒßEDí¯©S1fjØý(E1OL¬TW¯P³zýz&˜Ïôꌡ—W¨™3+š´¥õ¢Ú4ý>©~*´ä65YÏëD8b¨SSQ¨c;A©ZÛ9 PUÐÐ(ÙQ<¬Y}jÃ`;7¢jcÚá ¤$Ms$1=Á|âë-颿}ÓÞÁ°±mj«"Ϻz¶&² ,»§¡»a È¾SÐݰÐYwOCvÃEd\CvÄÑ• Å›œÝËÏ[‚ë®8óÅŠ ù:lDB.›lZ(+»`¸öÀg©ÒÒÔSë tÌ ˆ"Ñ}†œð^oà‹v÷þô§Â´AT@°yþô/ ÒfoŸ‡Ò… ðý6eü1ŸïDS†hÍ6l>½wôÍ —á}ÿ½Há:9ÑOŸïBx?e& °ÔûÐ~¢Ê ¥;GЦ?J<@vÑûU>ôG„hr RÚ<Õ>ô.úF„»~6 ­Wï@Kðn4üš¦çB`g‚pòtM ƒ½Wg×€ë¡IiѦˆ¡Q*¨S`@m…¡Ó 7³Åå8X¶­ì¬­€ú§¶&  Ë`ú§¶­€ú§¶õOl4VS‡Q퉣5*™7]³år³ fdH²ŠWÌh¿vÔÓÑôx­:]Î}5@”Ç«HË!Ý!fIÙuñë¿çßêãÇÛÚqÜáÒ“é)Ö§Auަ¡§&JlÆ'Fwü½›ÙépÞ1SWV•&ÐÖÓú”MrÕÊ0Ì™ìº9û=yå¾<·Ã£WÄWM\'ÂjkMAÏFŽuì&qÉпTC/Éj…·Ð#øÄÔ6âj,ø-Q˜Ú(¬4$âi”~SR6`öÀ!ÄéÍ¿)ª°ÿŽØsÃT7¦ þWT6ÙðïPÛ‰Ó4Éø]NÏû E~£Oü]Oþ‰ N#HÏòÚ§û @x¥!P†Ôìÿà&¯¢Wÿ©ýwÆ,¢‡¡þ>£ÿ®ñ4*\Nˆ@ Gþ‹jÄ´ùÚT5ëÔ송?ÓÍÓê;ßãÔÀòBQ£q8ì׿û; :)²µ4! Šƒjòr˜›îž÷—rµW!>áú¾øŒ‚»§êûá¡Ùå?Wߢ~¯¾Ù>ïÙ÷ÁYSg¸Õè´Úª+N­=Ôdt AG %íQãÊÊ—Ž¸¸Ÿ££Ô6ž¦Ž­VÚ¸(¨T¥1™Úe·eó¶‘ñAð•ª%JÔ©-l•@z„…)>[esTýŧ%ii½=N­¨šùVkLÓE,\NRFQË †¶½dÓS©I@ve˜  7Á^Rq}sfžYE´€ÿŠ3-\3ĵÙC+Rœ¶dôÛi‹øÎ)i ™IÛé9L6˜±©âd©f¦¢~ŸüДÇWÔW¬5Të€Zƒ…WU 0ȯ°³4XŽ}oî >‡‹.‹WKÑ¡QTÓÕ ͧ,ÃbÚ¤mꉨ±û“€-W¤utýE‘+)ØòÊl¸ÌJ-q."º*ž”襕«4¦ÁP¨ÝQ9è=WîK¬]% "«&WÕLådGzkM€‘žS¨Â ¸¶·[F²RÒ S1“¤\ˬ1xÇUÊE%aw§9ý¸–ÕçÅ8ù,‰O§)}¸iŠn1ÄÈOöŽðÙLŽ"é¿UâeIü!a°ÒÛgÓ‰¦= C_E§¬è3Ô¤ŽÒQ)²‚e3ÖZ }ßË Õ^UŸwìŽØŒ”‡—ìŽØ%òõØ.íœÃ¶å^¡Û Ó YìÚÆV YX:†1U¨ij=jjÀÓd¨Jƒ:fÒ¦[DMR×àÚþWX“ôj £Q‚P(3A‰Ï~bË⋯Ãx}-;ºÒ4˜Óš½ (júlI+”)¼Ùd¦½´ç‡R«L³S,Ié*3E„ JQ5^MÚJÈJ¶ åݶ•!³ù¢J½Uêè@PË^r²tiÛö¡N¨jÚ@KeÕ¥hÓ˲ýèiÔ&§HÚ•·g¥D[ìhiÕêp¿†dÕT¥™œz­P 9‚(ÊeÝ”kŠ;«ht:‚ }=:¥J•.ŠH*f»p1‚éxE*ƈ¥§§Z¬ÛÒËMY´ç—i“E­-;kèM˜UùU@ÊË5žk ò¼CF|N •Õ¸¤Zª 6äÎÊÀª™á? ²8¿p ÔSWø…¨Rdé©#ÉsY2v[µc˦º@Z¦¹€Ú ݳ…kkd©ÃCµ)É’üì`Záè•ëM„Ó¢I°ì¶p‡Pߦ.ͨ Ýô©Ù1¶V˜_A JC¦·©ŠH)± 2¹D‰öF™jг{äJŽ*ÙHϘi‰´¢«•ÿm-,4šK×Ñõµ/‘I–˜uÕÑê¨p.žšúõèŠjÀd²®V;ÅDEp½·Ž™× )YÌñ1u¥=&¸ø5Mž#Kïà 'ÒkY]WOR`Ù3F[>œ\5ÏWEÅCáwIé œÏ©¯K†i«Ò¥©jÔ½#QÃ9ÁMWh'×z*¾ÏbÀyºÎ [YÄSRu+N…< ÒZ(jž^©&@°¹}±*:5šµªåZI‘G«HªTS˜0ËaÛ+bŽWÔÓ”ÖWªª5Z¨“"¸`¹r·T èâZ}SjsRFt4ÕIP’˜bm™Ä«‰§×äÓ4¥…3üg «¨m6¹Xšz2û-9¿ªqÅP4Ó¶tIG„5¢â5Ô};)Ë"¥pºFÈö´4šž‹OM„)"°’XB€b²ÙE­g‹ÀAj¥nΤ‚£ä"ßrÄ{–‚ü¤°!Ü3#åÆIœ”°òãÁKS“­b`†[GZÀ,ÛæË‡–{VËþl02ÂFεˆ%X\/X¸¶óYÍÂ.H̶cåˆØei ¾l$Uf]’þˆŽ-²ózc óïl»æÄÁ5HY+G—²1‡ôãIíß6-‚•†brí—–&Ä–x¾f )ݸ۹#€«eÂô…#‰µž,S j¬¸²Î´ˆÈ.%³­ ã´†0í +8žÏé† ¹ Ì-$ÎcH¬ÙÔƒ¼6â1‹‚³,öŽ•†!«.^ð¾ñ ™sá°^!‚³.îõøˆ`¢Ë#¼:V& ÅD„刋+¨,Iq\"Ø,²]á}ëå2áÒ! e“Ì:V&®‚{Ãi½båR̦§xJ[f°Ä2Hgh¼c+2ù‡JÄÁ4ÙB®ðÙŠÅ¢ƒ.c¼.½b`–e,–Žö+Š:å;Ãa½a jÉo ‚õ† FI¼Øw±\1j³¡=áÒ±1 <Ã¥a”/Q<Ã¥a‡O0éX`yÒ}áҰʬ§y¼cY"w‹Æ1¡b[gÖ"!)}ãµJC9æŽX15¿UFP¤LLŒD$ E£f"*)¹ñB‡5ζ‹ï9\h6b!É_‘dmM㢖Y’ÄDB²¢ñŒ &1ë…r D刋CfkE׈9Y¤ˆ–lF,År›FÃx‰€R2­· ÇdV]ëG{€‚Õ& ÇHì‚V[GHì„+Xì†ÄtŽÈîÏoX€I)Y›iÃ+:—÷îÃÔ mñõDì1ß2ͰaË&™sN|‘Dã<ó¾r‚)%”w¶ !@½æïmäÀB¨nò÷¯ÂÜ=ýœ‚ŒçãꈈM¶ç–c„Z43ÏâÙÉSS`ïmc!ý~¨ŠšsÈ;Û9"ÐüMÞ»!©ÞÛÉ‚™Ø{û9 €O(ïì䈤ž.ÿ{“¨?TÛgªï—dÏÕþ·TEÿÙjgoodies-forms-1.6.0/docs/images/quickstart-drafts_sm.jpg0000644000175000017500000001522712003555436022274 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀžÎÿÄ™ !1AQq‘"Òa±ÁÑ2Rr’²3¡B‚¢Â#Ss4TtbâC“³$Dñc£áòƒAQ1aq!"2ÿÚ ?ûFwTêXž´ú»Ò°ý_=+ýc©.+0…¤B1¶H£gÚFy·j²;vÞYÍÏì½pÀ¾˜ÑìF£Þ£;Ïrƒ§àq>‹ðPÞ{Xab yýU6žÀáay’{v/ÁQvžÖîxcüú"†óØœlѯQ6žÀâã“ök¢í"1 ýj†Ò×ôkä¡´ÂÄ'XPßÔPÞ{A…ˆ8BƒðE ç·„þ¢záÓ½I‡¨?J‡93zˆÂtiµîrd—R#”»~`…@.Å´×BjsËóõîGOÁµ¹€x¢Œï—aü·§ŸøñètóGåÚãp‰hm=¡ÃÆ#XÖ†òË„¢†óØwKÜľJÏb0ñG”PÞDâbž1©ö¨o=‡sÅ?á/’†ÓÚ6&1ÐÆ*›Ï`0±D¾J&Ò±Çƒä ‹´³Ï› ÀíüÛq¢ÆR~ûž=ÿDŸTUL¼É†¬2·edWzü¡åªQÁ’3"ÌŠ‚þsº w ÛÍöiIkœì]ñ ‘]¤$.Ö ÕÜI±ÓJQfócùkå9Ñ|µòн>PòŠÙq¯²(  ”±>ß0ÿÝ·þ4£Yxƒå–8¢yd`±Æ¥ÝϪ.O’Œ¹‘zÕêû«_:(™-ÌŽV Ë~íö+ZÊm u®Ÿ<ÑC‹2d´’4Lb`Á !sºÞÀ©E´Œˆ H„ƒcç5nt_-mã™|¢€‡N!‡–‚s#ùKåàðÔPJ TJó±¿XÓz«¦ÀÆsk´Q“ã*(¹y“­®µY',ÛKx?ëRFI³p"Ë’ `ÚNhŒ°$‹ÛÍSacÇçeA‘qýOÇ) GNw ”Y™µï&·ókS”¦°Ù/CÇšYà†$š$2JÑ€]u6Ó[“‘ML¦ ËŠ¶` {ÔT-—û´~ÜŸÜ ÈýÒøcРCÅ.'zH)ï`VÀ‚$Øu èÜ z ˜,ZlëöOaâå!£YqðùÙV ÐȪ¬Y¹`¢Ý·ªË94D«.:ã¸å˜ŽÑ°ýëmÚ@¶•,¥qóý_Ià0Ç·Ïw °ê¿€¾ÙVÊjŸ!·ÁP ŒÊÏv;ªÆêMÎî•g#\xG±ºÿ‘@gìÆ…½Ö÷R¨p£öÙ> ‚¥&à0`·²ãЫBø²°•àhUm¸Ä|Õ· @Ñ{_ ¢Ôõ$"b9°xwŸ¨ÕV°Æ·Tz~¢åæNªÉYZãIóMfB›ªâ&L˜òÉÊd¹´ n#Ø€Ö Äý_£'R˜ÌàL#7²³+-Ét#‹ö{ÔÄŸ °3'†2щ'ç+\d%M÷¥–ÃÀ(° ÷b ¸sNŸv‚d¿Ø7µ3|4ö°ïúãðÐ-Y¦«"Fa渃ÍÜöëA¾ÚÐJ xmüIÿM(Ö\|iš^TO%·l°âOec“«b4,„—r É«/µõÛÀxh+_NœâãÆ È¯hÁV²4qî[Üx<>õòNéãŒB$r¬×.RÀ;½ï@ -ÄÃ/Íéõ…05þÊQâ˜úTã7bÏןJ‚½ß'´L±8>èÅŒ&L’A+ 󤓙uRxk¦¦¬ •D ”›í`ùçê5ÿ±Æ·è£ú¢‹—™:ÚÚŒ«0-¨¸ÐT˜dqîäýµ¨ yÏ-ãu÷¨I)R‡²µ÷ Éc~7Ö‚‚ÙBøÜrô»Ý¯àüá £Ù?|4•gäbÇ©*Gœ¶xcìøh7PKÐdÁûLÏâúiF²ãã]Ÿ Òôx¡{oEb8/j ÷|ÑŠ´ãB Æå¿Ûá¨'wåIôÛá«@÷xµó¤ñsá¥<(û×qr6ݘ¶—½µ4 ÃV –ðÒ§Çö$?éµE…0°1‡‚Ç⊫—™?¶Œ„¬R7aÅT›x…ê ’dcÂÈ™YaYÀ¢-¦š }#ÖÜb¦õH´’Æ’DF®Å• Yll¾&ý»¸f¥»¤ágt¸„Yï–Ò܉²K?Ê&û‡ÎSdE:Aåµ÷KþZû–½e¤`‡#c“`Žª¬Nœ·„PY²"¼y£ ©Ø Ç”PF¡ Ò†®Ð8›q½A NŸ¬™¿Ä7ÔJ5—'FxŒlÊBºÚà‘¡iZ†^u&õÎíŽ05Ãe–e7ÚX Ü 75¿åé§Ö±’^Y±¹R:4 ïb˹bo;û™œV-Ò™åV·5Vú¨³›{F²Ò‚Y/®HÃDËî‘KŽbÌgŒ±6i¹·Ú“{nŠç€³k÷i`ròìnÑcïŠX¼bP<ò­ì¨#Ý&¬P PKÒ‚åûH~yúE…:y¿OÅ=¦ͼh(¹y“ª²¬âðÈ?²}ÊÌÈÁŸ>åF™Ñ*ÃaÊÊ‘€]å ì\A£ ;§N8’«r–Â5¸²­—@{;(&^ó<+“&×!ÁQ`6‚àÜoPQW¨q7#Á½¹l‡éŠÖêó'bÊ ¯4ìºn>hPJÐt0Ù$ÆÑ hE‘µ”h=« *‹d‹F|kõ…@ÚTeÀ>~gñ õ£Yqñ¢R‚6g@ qkèº ¬¹˜pôxa9jÃ{¹ ªÞ×'çÔ8äW[© 545d&S É´W$ Þ, …͵%j ÈzøHíÝ`~ãP 6[dÆ™'jà[^ë­˜;m·ŠÑác&LRs]™Aå£6àX&Âþí:ÐmÖ‚„U€EPh TŸ/Ÿù E‚ºY?Ë0ÿQÔ…ÏýKOm%•2  øŸ ¨2Í>RJÁ±{ÌCG° Û¯À†6öé"˜yc`›Âu^gæÀÞ±6>í 7-Iš6vØ»[]xÜipE(%£ÿäH£þß4{„ÔÅ3BaGÉŒ±nsÉfÔo;^Ê ñ³”»¦Æí[ƒ÷Eò.SÆËõ…h2ôóçæÿUhÖ\|jrÁIAwê °'Ç­p%~”c‘çéŸîìªÑr݃[âÛlt ßÓspÙ†,˜v†dBŒ‚Ûµ¶àºër(0s˜Û% h×}È‹[ïIðöÐU„äþÔ¶ðndæG"Ÿ‡VUóˆuøª ðP3zlr…Lj¤…mrŽ<ÑÙ¹…»(:Šhi3ÎAúÃþ›Ñc’úhÛӰǂǑ?õ-L..’£$ϸãK¥ÎÆ·’’2ˆ²#j¬Ná* ˶‡Å@&Å’[«gmQP0e «\îáogRÍ ³Ô†ö\›yÄ ŽÊ€l¶«#çHH÷()ä5'†v<°»Æ­{ƒt÷*pÈB–TwJù ûDš€I*–T†%À ð¹÷¨V€õlæÿQ(Ö\|7'¼\cXM÷„Ú×öÁªÉ)'VE<ÈRRØ£…¹·Ÿ£}Ê‚²IÕ ¡’ªÚ<‚Äénû4Äo—'4ت§,lVã{êT“AF‹RKÿ”= $RÇF‘ʱ1ìXÏeµ*ží¨&É@ðø 7ú,Ô 'Jz Õ€T°©2AìHOâ59LE¶8ãhÐ~(« —™8K#¥«"¢5[íP/®‚­1Ö}èÝ#&L|ÌyÕ¡qäuTe£óœ±]À ×ì¨ÿQý]Œ³?1qÖCœ¥¼à·±CùÀoæØ­ûxkAI?©~«#À LÉ”~• c´99ºIô£ôªÇ`2§íÄ“éGéPÖ;XdNâÉí´~• cµGŒ‹ ”f*¦0 1,ÇFâI$ÐÖ;A“—Øäñï‹ÒªTv=ç'÷W…¥P¨ìDÓž8ì? >¦±Ø‰gýݾ’|5Mc´3äÛöf¿`ÞŸ ŽÕävã0ü4>ýI*;*y¥ßxX-€Üšþmýš‹¿®#z§ßzßHëüÜwîx±ÃÈÊÆï –müÜY9‘ò$kívÚÛ€ ¼¦~eê,I¨Èí MÐB ëA7Ö€EjÌÖ‚½X×QG­ð$=ê,^å™’û¦Çï?mŒØû£üä\¹cæïõÚÀT–òããÔËÕúv$±áÍ’«0 «Ík&ÀOfov1^'‘¬ìŠX¯4êO»RBŸ«â£¤e&/ %TE!6R6µþúðæÅ,æ ½T;ÝH °ú‚m ¨“Ìí/çãŒ,ŒŠ…n@]>Pã@ÑÎíž6>¶üªÉ‘{óãæz‚Œ“_ö”€=* Îi¥G‘$U TªØÝ¯ÇSà qB èÓ—\¿âÜZ7ŸÊéØro±cšp§nåRÄ ¹«rçPÊSdý$)V*6ÂŒ¦Öó–× ËÓi*ƒ?¦ò]£VHc,ÅŒlÜ’ÅI:ø*+CH]âD‰m*3“ µ€¶„Z÷;¨u×ì1ϵýÚ rp‚á·ÿZ°-ïÈŠþ×£Av?wŒù> wxøwxý«z‚ð2¼(Ê» V)"¦ \ o‡õŸôXå:}ûŽ?ê“êŠÒåæO°£(4¤„då!Ëw6Öd¶Ž6´Ô —:x\Fïºë½crË{ Z×íñP[ e‘ç) DŒV@Ì6—.€’AÔÂÕS$Ï-„ $Œ]nÇmµ$ wvíLòÏÃ@F7ö`'ÃÊÿæ€'ìîë~ÞH?•A|%håš6dko1|n; ¿ ƒIÕp49_Ä?¸(Þ||i-FŸ64Ÿ–×-©Ö×µ…ûYŸ?¦BbÇ+lp9¨Û `Û…¬8ÜÞ ahò„-Ë ¹Y”–d \Íu ·&@t@ˆ¥ ÷lb5‰>ˆ¥pðøòRþ!JŠb¿*5MÚ¶Ðíâ¥Þ É‚uÊþ!ýê´Þ||=š«»Á@Å[J xâky¶"ö Ú×ñR€Xbàn|lß Aa ßFuö~ôh˜ð•ÇÑ÷ÅX€-o:yÑâÐS_I¤ñ]}P1 DT^ ,/ƨ½© ÚÈTßÖ~CQalP;¬6ù aíV‰òm/@{5©#>lsËŽÉ7&Sm’X0ë¡¿eÄ‹)"Û‘(•¬¾pko;€µìûäæÇžvì[®ÞËy¦–+"DEŒ™7ð(`~âŠÆýY $[šÀ,ò¸Ü7jK-¾ó…ªŽ‰> ° j¸T¡—ÜäÿþõV²ãão«ùÒõ:†uÈeT è%Œ‹Y·cØ6Øèjìç_¬ôþµš‰üÇ«¦<ÊÁ×TxÙKhÇqÜv°òUŒ¢8J™u ‹““¨<Ÿ{Îsœ×ãÃîV&[ƒ„o±²Ô5¯µ‚o¹P]]ü”ööü4 ]T°6-`@ö÷PU–SªÊ¥O6ÿ•T,óÇø‘ûj}*€Û(ðtú-éU‰_hßbݤ ¶.EK5¥øðüóõ‹ Óß~3ÚÛ¢F·A­.^dꬥ*¬¤0º> ÌŽv6KîùŽ1чš…v¨[·µÅè6c)H€æ´ãˆ‘¬IĠǵD“nXe-#ÄP$`‹NÃ"ŸxÔ,I›<‘£jl>ø+ènOoeûT¶¨*A­XÇÓ ™~Ì©@ò-H–óãã ¦“ 1OÓdÉ‘dR'\µˆ½—€6· MA„t¾š#QÌìIæÌã‰/´4qÊvŽB¬È›Ç$È×oå j»aöòä ¾2#Å1; •Î
ó@Q¡ÖãmF†Ì}þXÒ _fåóT›Üér(?MŠ8RY²ª.ÕyÔlUkè8Xf©Êas#©Ô2É´â*}Ú 5v¤§j¡i å£ ,Ôxmz f¨¡ãP*_Ï?Q¨±ÈtÐW§b/‚Áú´¹y–‹Q‘á@¾ó˜BM¤k•R¶Ðð5$!ºf;;º¼¨%7‘ÈS~:vT IŽÎQÔÙÅ¿›PV"ïå®äi®Tñ,oÚ;h_3@[Åýêcᩈ³I!vgݵ™@%ÀÐj‰ PIµ‰cå4 µ+Aƒ¥«Ë-Ų¦:x.£ôãã`«`^E‘Ð4Š «v€x㬅ÿ)é¼°ƒ…ƒgð?Æ¿³Aa„¨×ŠWER ©Aañ<(#Å~.IxQI÷¨$iÊ@…·{µ­rMɰ L¸PNÌÒ_{)M×à§¼t Ééù<%äUq·ã³8f$qÖê™èªª!âYN‚Þ ´ 2™Z`ªîÀ€„°°P8¾ °5«"¦²/LJ矨ÔXžÛº~+- gñisÿRÓFB3aâO~tK%þV¿ôáRF|·è¸Œ§.XqÚC½9²ˆ÷È%†æÚH¥ ôþ£Ð¤Šy:vF3Ã[!àt(¯ý¢¦× ÓŽÃ,sïMÕY [“ÆÃÃ~5y$‹_ñ~ ,cö‰Ì7'sqÔß²Þ´qÆ»cP«ÆÂ ½è "ƒOnNŸòeúÔo>>4*à ¥eu^™†ÛròáÇm.ÙdD<´°g³æ­ÅÍ@«tÙ{2¢nlM‘œk mÝ'ÍÖçÙ gyÆî™¸hnG¼hüǧ´äÂÒ( È$[…bÊ àJ0ö9˜a£C2™ ‘yÃÎE¶æ7-_©tèž4“*$iC˜ƒ:Ü»oµÎ»o­4lYQÃøÀHÔ}°jÄ êMh\X ’*Nµ™¾Öž~£Qc’zt²›‰h\þb.>@ðµjÎ?©úÑÏ—÷y<±úuX¯aÞ%½»´¾;ÇéÑkØó¥?àH=´÷š¢W·Ö©=Qçt¯ýŽ!ÌïQÿ,æ_íù‰³ìÛ‡3e÷y¼/I)ÁGþ˜ÉêïS\4ž.œ@ÒEÏ.<øö•ÞXßvËX{õ•¯n—©úœ¹=A½Z‡!¦i ËY —V½˜{¾:“sൠöõ=â{\cKâ¼wúõJöæ~ÜI|±zt5ŽÐdÏÙe·Ž/N…{XdKû´¾X½: È›·QíÅéÔ*;#§Ï.Üöò÷öÇò¾}Î<~ðÐÓÉoÙäòÇéÑšŽÃžÿ»ÉåÓªTvàúÓ?«;bþ}-¹3òìZü¯3ö/ó}ŸB½¼ÿMŸúWÉÌîÍÊî3w͆oÙ¹£›{¿Ús-o¿ù4+Û²ÿH3K §‚ÙGxØ#ä7vîÝìT+ÛKÏý-þgÌÇ—¾ó+œr>Óœß{í¿6÷ÝíéT¯m™óNÿ—ôæ¹À1ÈzGzæmò8›wÄ·Ç×ÁB½¨eþ™wLl3÷~õ7qæ÷»÷éÎøíºüͷݦëöî¢W·gÕi}S¾Wþ» mÛyåïåñ“gÚ6Íÿu¼ëm¾›jÁNø•¿Dÿ‰éP¥Œo²qô}*¥*$oÑ¿âúU’‹–FæAù¶øçäü†þÕ!ÿÙjgoodies-forms-1.6.0/docs/images/quickstart-grid-details.jpg0000644000175000017500000017445212003555436022670 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀuÿĶ!1AQaq‘¡Ñ"2R’#3SáBC±Ábr¢$‚cÂÒ%ð²s45ñƒDTdEÓ£t&6!1aAQ2q‘"Rr¡B±Á#ábÑ‚’¢3ÿÚ ?ý6ë³­¥Hðâäýñªu6Q‰@jí𞣅u@‰ê0¡ ƒzUÔbÐRÜšÛðœ Üy"Ä*åÁ³*½“C³Ú•aÌa@ês6`bPZÜ:­œ¦C4ð<‘¨€Í^D«Ù1šPïJ¥Ða@k`FE{&§¸IʯDî<¢5\‡yP©ÿ)ŒÐ%Ù~uP£rUÔaAYÿ¹R²«ÐyLj¸ /cè«Ù1šÖC*½“ ¼áW²aA ºCî’…G鯦8Sõ€ü*öLfuǨ¯dÂcè«Ù0 –^ªÅCðŸTE˜ Ëð«Ù1(dúªöL(ø8eW²aC=;™K§*±p†70z*öLb€óNiT¿”Å¡5Gª© ž‚i^BæŠÕ¸òÆóŽCÃøz*?é1ŠY>¢½“ ¼™`•{&FîV$R¢f¯Âw“Î9†U{&1BÁá…^É… —ÓŒ’¯d‚éž±%z;r˜¹G!ÚÀEX ‰BºãnU{&Rð,9$¨M'ðžHÖ1È«NÉ„$L$ å'Lë§‘^ÉîŒÐ!ñê«oª{¡AŽN™Ñ#ˆ–ÃÆ9 KÂC¬?„Ę̦r’½“Ý„/ƒøUìžèPUS ²|*Ú? å¬#í`Å{&% ®éW²{¢Pé…^Éî…Õ:’ÚD•‚Ð}¸ˆÖ0G*¶z¦3BkU]9L(Maê«›ÂaA.ä• 8“èÆ7„y€eáW7„Æ(O0ŸQGý&‰®éW²aK Õ3Nr«ÒTü'Õ1¨ŽǤµk' ½“§8êàgáW²{¡BǪ®œ¦&¸Ÿ¢¯d„ÖŠÛê˜PЍHü*öL5];‚½“Ý ]9§%{&,_Hü*öL( dŸÂ¯d„/¤L©)…Lö+gªaBÚÈä>Ɇ ê¦[Q‰B7+Ù0 5“ˆ‘ê0¡5N3ê0¡×¹¦9H>òSÔŸî… £ÔWQ‰JÙ~LóèÕ"º¤EX™l…'bUÔaBŽ85rŸ ;¹¢Ä*ú“ü*ê‰H!Á³"¹ð… ©ü —D(-nMÖÈIžìbÄg—àWTJTïBºŒ( B ¶rBq [ŸÜ¦HV 8KœF«€ðîÈ®¨Î£ÎTýGák±µ»Tèª-P)h¦©]:jꔵNª”6ªtº¢â|y±Ù…ÔÞÍV—j_¤4tÏÖººº*ÊT.žM÷Y[ì¶—ÒØÅZEXBƒl\o÷ˋôÖ×Ýqö˜CÚNÓ¿NVÊÔB^k]¶õZ$KQ¼Éçzö®>‚ºtMDmðª\ÀÃQ³ü ê0Ô)·$û‡"¤BwtƦ8SƒØz Ã|ŒgTSꯨÃPu¿}F„4è¼r,ø†ÄŸTF§µÇ¨¿dÆu\z‹öL5¼6äWQ†¡î„—NU΂I–Ì#SÚÃÔWQÍ_w·Û¨Ý®¸<š:6™ê§Ôi Ù5­rJDùa¯qÊwê'³nnäïÛ›·:½&ëWVÀeNe È— òdPT§°Î& »Æœ#mi ¸^(¨ÑRRãú†š!â­%#:“˜/)ÊFÙaϨïĦ©cÔl=uj°”ò¯¨Â‚©\ÊÀ'ˆz4k8ä;^gÑWQŒê&´¿ úŒJSÂRʯd÷EŒBéž™ (W¢7¹Gê×þsàbj}2ôW쫺Œw{­¶¢²½ôQѲ‚^©|†Ú@Ù5-rJDùbÄOþáð#¶n/q ¹»{Š "µUl%•9/"\*ÈU•ARœäa#]ð¹,ªáy¢£EB[[¢¥¦ƒˆzzJFu ÁyNR6ËšŽÀy$%c°ÈÃPš×¶pªdHxOtky ‰•[=UwFha/E^Ék ¥Sè0Ô*©Ų̈ICÈÈòŽhÖ8ò®=E{&_²3@”N)T·`GÚâd”«Ù=ÐÔ&©ÐPœñ¦SIåѬ`4>=Uû*îŒÐ:ÃnU{'ºˆL½ËùOt(&©Éé‰+â$ì1¼1 ×I öOtc^Kˆžl‹ŸA‹BÚÃÔ_²bj°Îû³¨§ð«ÒVãêÆ£Ǥ´‡¨¾£œ\ÓXmȾ£ Aת½“ @×ôUÔbê¸õUÔbjª}Uó`{¢ÐšÃÕ_Qá›ÐXÃÕ=ÐÔð;¯µ'º. ëÉT¿”÷DÔ`p)W²{¢P®¨Ÿ¢­œ‡º- Gª®‰ ¬ôUìžè” ]žUuPÉÌpWQ…ª9ÔaC+®•TÓx+&`ìÈbÐzj<#À¾¢aJ {$+¨Å¤ö‚º¡@åøÔaAn:JÛ9Ná-¸F¢Ís/†®¨”‚3ŵOùL(ùÙ‘]P¡U¼u›:jðæžf!‹ùƒò×Õ Aóí¯¨Äœ;‰®¯–¼y¡§p¥<|ÊNEà“»ѽx &_ ~ÉŒ}¾ãâwD^™½£„­ì·[NïRßâQXš¶ÛUÁ»B\A§úmx²»®f$œ¹¢kÜa¿}8ã*nºÜnM7U]E`¿ÓÖÜ|å]e]ÁêÊBZq †áøHVÀbœGÐ8ZÓÄ•OIÄ—ªF(Ÿôº::g—R§5Ýiç^qkjŸ ] BdO¥>HÖ¼u®gðÔ>ÃNâ¾`‰I¥OùL4qNí5Ol€‹¯p¦Þ!×T[Yž\2žC˜S¼ÁùköLcN膤Ë_²a§pMOûKöL4îËþ7NšæT?ðˆ³‡pÓT6i¯Ù1>ßq_6>[žÉ‡Ûî'š˜øKûRa¥z„S¿“T鬕8£‚ODnqób ~ÉŒý¾ãÅ}Q. -Ä2fÑw¦®©¡uƘ(Ji-¡u iD¸ê@ZÀ*@ÆpÓ¸ùýЧŠ.× µÎ×A^ÕŠ¿ˆ«Ý®E©T ¬Qý>…†’š‡VY Zu/©— ÌÍ LMF.·ÞlWl•\3Qu»ÿˆRPª•³H´²§+®##θê\Æe#0ÃfÀYb>ÛÂt•6~²Ú*ÔºŠ»u 5%Cà(ê8Ã)mKÇ“8¿o¸êбò×ì˜}¾â ©ím~ɇÛîOQ• œ‹#‰<¦5–<‡y¹~Rý“û}ÁóSÇM~ɉöûŠ*¤H͵ÊXxLXø];ä2‘gÂò˜¹cȘ‹öLcNày´ÎZköL_·ÜxªáÇ-VŠðÒ^fÓu§­©¢yƘKn´–к…4΢\u -` c8ºPù÷¿Å:»ÆÙC\ÝŽ·ˆ+œ¯E©T «QúJjYd4]i伦VN`ibPG Ð^lWÙ*¸b¢éwÿ¢ ]+f•a¥9[q:ã¨Hms”ŒÃ€f£í\'EUgáK5¦­j¨ª·PSRTT¯xã ¥µ¯|JLâéÜt*ŸÍNàʬGªbã!žd,‹éÊa0š¢úŒM;ˆ*vøÔa§pªš€¦HÈ¿Hn;ˆa‡=C Z}G:2˜šƒæÇË_FSí÷S-¨å2„áÜ.¡üÉOx-'Ñ;Œâá‡=CMRÔ/ ž DcÔ\¿”Äû}ÄóIÜÚý“·Ü&¡ð ÙȰBÒ}Œ£XáÜ8U`’ý“û}Àó_í9Ê<0û}ÀóbcݯÙ1~ßu‚^©CM~’¿ õLj0ã«xý'ùŒ=Ïg¢cwsŽ¢*pøkä–X}¾ây¤üµáü&o¸i3ž›“fS·ÜO46–×ì˜}¾ây”Ìx—ò˜šwÍr6¿dÅû}Äó “$/Ù0û}Á5 [sÙ0ӏЫH? Ãþ“·ÜO4:köL5î™$6¹ïð˜j,*D¾ý“ @)— ¿dÃPEROà_²a¨>a8øV:Raª¨L½{&…:³æVS4çÿLJF€¿9NÈŠÜG]Qhe®¹ÓPÑÔÖÕMªJVÖõC¤%¶ÒTµc‚DâÐóMýVàE3QP»‚˜b•„U8õE=E;j§qIJ—ÚS¨@y­E¥%mæH$LĪú«ÀÍyw—^½'Uo&š¥m²ÑZ™Kµ+Ke4í©m¨%o¤Ê`˰9–ï«ô߯4õmšk]²­VÚd&ž±êÚª´% :M6É Ÿ¼“mæ\“ŸÑ8Dv“õOÈ¢?¨€«tѲZt:³Nèeäiê%m¸¬«B’œf02T5õk*X/R\Z3†ÐÝ%5MK«Q %-4Ën8á@iEa 9%â”*/?T¸VŽÚÍu%Jë\¨£v¶šjzŠ•Ð uKqL6NE)Ð â QÕ·ñu+œ3e¼ÜÇ”ýaº €Š<Åp@m°Dý' I1šž¿ê RÑU¼Í[o½Ný]iEir……Ô>ÊÔ”¸Q‘¶”¥+)åÙ Èâß«¶›-÷骫»4ÌTšV˜©~¯0¦Ãõ 7¦ÎdªhÕ(*¢L@æÔ}nµù†ÖÕ+Í¥›ÒìÕz¬Ô|$ê fäÚs-JjA´ÍXƸ¡ï¬¨ð"*—L«³:¨a5n˜¡4ëcÌ¥å8D¶¦|IQ2;8CX!úÉe ·»QkmÚ‹ƒ•”t’ª–¶™mÂr<ë+gÌiäJÔŒ¨÷…9Ry,ÄR»–ß©œ5Pý=õ_õšZÑORšEÕ0Ù]C,Ô8ÚZSäTÚϨ$f™ƒ¨BQõéÊé©ê‘wBØ«Ò--<­Y$-InH9Ô¡4§²S}7ÔŽ¨®r¥+m¸*iæ©\M,üÁf©Ä¢í)úkVYì…@æð÷ÔŠçªÑlaåЮޫ‡™~š¢•J!ÖÚN˜¨CZ)+Ì™ƒ¸Å˜Üsxm§ OU¥·EÅr•%I>}ÆÒê)ñ’›ZT7HÄÖ8ýKá±UVWRÒm”T«¨~´©À ¦ªÜ£qe¹(š(IJÉR° ÞZ7QõÎ×O|z‘Ê £B*èiqt•¬TVÓÎ8·)Ýd;àÐSfœÆÈPèð·ÕK-º²ßYžš¨Ýªmôr§¨ÒYBˆi>¤i6ó‰I!µ((îªîõwé«¢Q5 ©E5S*bª”>ʽ&@Z ŒÄÒ©ˆj ªvPÍ;,¶$†Ð€”¤r0u ¤KHqÇÃùeIS¡9HY!%[d ŽÊ b¾ñ•ŠÂå+W5¼ŠŠÝAGLËT¼ñh$¬6ÓuÅ0 œMFþ©ð+ŽP4‹šTõÍ r‰¬ŽgZé`’œ³FGP¤/4²â”(roßZxJ‡‡®W;yzº¢Š“ÍÒÓ*ž¥„Ô¶¥†›u—fN±¨´…<Öt‰ŽQ5X¾§Ø5%%Ö¨&æëˆeõÓÒÖ Fž¨_öí:ó­°ã‰R2¡å%Dœ".CKŸW>ž¶ZîèiõR:¬ŽeMBV¶Ë*9d™µxvŸ´Nj4Ó}Làêªêj&*ÜSµjCL¸iªƳ­‡PªØe”(%,/øg s‡Õ+MwÙ¬Öt®²žäå[oVšz†Ø"™•9:j…¡,>3£*‹kPb"Çb«ŒønÔÅ`¸V¦›ô¦©¸)Ĩ‘Xµ7N¥áÅ¡IÞ"È¥OÙ™½‹b^fLš¤\]qkl°ºF©XŵÓéRÉq9Awf y ß×[=bÕMESUmn…aÕÒÖS8âݬj™½VS¢—³¥%&RT n}UájË…îÕvh¢ÞÁ¥E3QÔ­5L¥i]XSE4éÕXJK¹A1b9ö• ÓÓ4Å;m6”!´ 6$ ˜Hd>_ Iå$!N„Œå)$„• d Ž5 Ö>¢úŒM`"±Óå–Uˆ‘$èÖò<ÕÕ~©f½e²ËÏ·Rªj”0âiP\|4úÛKN-´$©HBŠ€#2þìð*©QTÅs•m9¨[ò”µU+RJã¡¶qe¤S™Ùd”çXŸýãµ/‹*([[Mðý-5MMÍh©Y|×!J`SÛSD¦5’áT&1T_Õ>M_~àª`º³E¥SOQNújP}ÓºÛo!e¯R¤ŒÓœÄk‹ OÕžRênã¨õ2²<Ël¾ãÌél4”)JuKq!-¤gVá 8ýMàÿ"ÅZj_s̼å34RU¹X^chÒª’[æle´DÖøoêw§‹n£ÉQ$T¹PàK… µNûgP#8ð·™Xa `m¯ã>j¦¢‰ÚÄŠªª*j¶$¢¶Þ¯RE*™»˜ec8Ï}Y±±ÃÌ×»5Ü*¨Ý­bЉªªàÙRC‹S,6ÉZe¨âžxƒÿ¿Tj±×TŠ·p·³lyжßòêóèaoM0”ƒç,×â”ÄgQô YoÞd[VòܤRQTËÌ=Lóei΂¦ªÓ™V“™*Ë% „ňªœQÒð({ÄœG߯ <º©ú êŒÐšÇ嫫^ÿm}PÕ`‡>bŸÝ¨b­ßÃŒb›Ç¤ž§ˆüµu}ñ)Î>v×ÕH=?Ë_T]DÕ9§‘]PÔ0&£»dÿ|M mží]PÒ¶¾¨j·‹á¯g$5€u —]P¨¼g‚Õ Mb¹6kkÇÀ¾¨ºÀ:ÿÀ¾¨šØ2,tƒ `ïð+¨ÃXTc諨„.U^É‹AkQS¬¨¡@§6Ùz¦†‡/A]ñ(UN=Õ•çøíN;ÁBÛm-N9l¬JPÉ&`)=¬àn2âë]ª¢¾šŽÙúm±š;{)¨qòñv¦Š¡çQa­0¡ B2¨æQ™b¡»‹¾œ\k¸ªérnØÅê†úÃL½MUq¬·VËE•¢™.¡öœl‚A@Ìb…¡K¿ÒËÂÉ«§mš•Ó_jn´Öï5QH—i*hÓJ[5,FN\ÂY’v¸JnàJëWP^¿O§¶Sµo¸ÓÔеUQZ瘮«¥}.k>„)sE2µ ””d&1…CÿKolØxA!–«ë¸qªºjªVTдóuªB”¶êXHp-µ2’‘%LìÀÂ…)¸ŠìÏU*Ãk·2ÕîÔmõt.×T­o¦¢©íFß[8ú\óËR攜ãábª¸p…ʧé{<.•6›­%¾•ªgÉV€­¢KkeeYs䲓<³–éÄ¡åÇÒ³O¾©mtïØªi–‡3.ùWN)]­Q !ÆS%HO›t(R·éßµfâ·3@ýùG×_SPënSºÍ%=+Í顇5|¢Kg2e˜Ïf2‡A®â´ÞÐÒš¥Ú~$sˆZ«Ö^ªÚx/3%)%hS»u$G&ÈÕ[ÂV:û;·åÔ„­7K«× }2I :ÓH \Âd©¶vLsÄ¡èu•òÕÔ;âPšŠùjêð E•‡Ðœ¦7\)šª8i«¨wÆi:¾½ÅlýQ}뭊ǰ4É]cë¦eµy·ˆTÐËùå?p2…e·èåƒoü2*ÐSp¤¶SÐÕÉ`ê[išl—’’…%+uˆY!'láBôO.®Õ5V«=-¦µ‹…ª¥çβäã¬Pº·]Fz†Ó”¿vó9²Å˜U,¿Kn6úÃHõªž¶™šººÊ+Ë—*Ô­¡n¸ÜíùTƪ Ù "jÚrĤwø{‚.öÖø/IáKRí÷‚£åÒ°Æff‘™9™V*Êeº&úes»qEæìÃèfž®·íÍ«6f¯l„!šµ€=Û§h *~–¡Ê¬úMÄi¢¡4nÓ.ºÝnµ„‡´´ýÊßrýIíI!D0û“ô„ý"ÐÓ]ÁÜ{[zªâW(¨®ýB×]KkESªJ› j¡—åA§HJÔ*s&H# s†êN¿.ݤ^QüµtÈw„ÖQ2È©K :eðÕÑ(PE#…-/À£ãYœ‡/Lo8äx¾8~üßpMžÚš÷ÙfèÓï*™¹-¶.¥·äpÀ㥘s¸sé}â‘û³·'Úùm­¦­U6s¥Ur¯©¬t2”M¦ÅPJTH$‰”ˆR8ìý(½½ÃÕ6·m4T×&íª·ÒÞ Î¾¨8¢ã%Eï6¤Ó¶âÌ  ˆVT‰8PÚ¯¦ÕÈîu ´±wµÝî ÜïÜ«i 9 l- ¤e+eüªg;g ú*”³F³Ç‘Õ·ðæšÅ` qL­|EUz©P+ʦ«¬} DÐ p&©0qÙ<Ðæ1ô¾±®!¬ó¶®6ê»»—†nn\«Xrœ¼ÿš P¥+§[Œº}ÑÌÀ«f*8[ƒøÞ‰î £¹1@Ý·ƒXz”US¾êÞªA¥U+.K(Kg.U,3—=ˆ¸›éÙâ>&¶×<¡ú*¨œ£¾R…Ô%f'ÂAJ¨qfdb¶f.qÈóÏýâJî§·\«Ù]Éú[ãw{ƒzžò¢ê„´ÃˆILÊP†˜N3CUÿ‚þ¡ñ*ê+«é-´I´·CMLÅKÏ%u,×1Y5(Ó·¦Òü¹HQLÁ‘Ù /<Ä—K7*©´5|JŠE0βÝm“LÂXuÝ$oo ©1b"g£èì¼tÒAHÆ\ИN¼Jµ¬°GŽš&­“Q'†±ÆràÐê¥è(ò˜S%Ö:M:üÉÂ9°ð‡ñOÓëª¢ŽžÛAlbµêZ…>êß~¡úJª6RãZÑB|Ú”ç‰g3œf‡¤â§×g.V[=wEQZ‘i« 5õvÀ d-4ý2TT3fJ´l‘‰ u¿Hî.Ûk©èÙ¥¢N[¶ësOÔ†å£1vO„¡ô¶¼ù[q>1é„¡CU¿éíÁ»µ’ïúU5 ÐÜÜ­¯dWÕ\^yµ[Þ£l—jOŒ-ááØ6ÏÃÆ9¼ý6»ÕY_eOU³Ä•CKL~™·Ú{UT2ëKÒ|ø’€Ú#4kàŽ%²^¨¸ŽÉc¢§«•{ S×§ÂÓZ)rÔùÇXqz©4(JÓ’Y6ŒT=' ðU/Ó¥p­ð!Çjš­f´Óg[Yk]ud ¸”(ø–"<›éUúŠ·…îÆžª¦yOñINr*žd­t$¥8S©Ò<@M<ó‹Ž"–o§¼wÃÔŽÓÛ™ ¯]ÎÈÕ¢¹OÔ<ÊiÞ§v¥mºÑK)ÆÔŠÓ™2IÌ‘¸á(ý8ã&muöV›£ržåMdÔ­Sî ´õ¥ 6êZ*ΕŠy¡Y†Ü@…yh³WRq‡^Êin­P·N„ÏQ&‘¥yÁ ê ²'ì…-;55ÌÂ)Zœ 2Ë,bâc”Yú¤~vwÄ¢"Ð<£ùkìï…"k*rÓ_g|)a÷æiΚ¶«þìj¸o¦Z5U?A]‘šsŽ©¬©ü5„ÖTþ‡Ù÷€.œÞ‚Áåþ-­!ðÕÕ :¬NEuB„~º¡@)âðÕ³’²Žjê…¬}EuB„ÖWËW> §7 ®¨P¶©õÕ :}EuB„Õ>¡ê…ÄøUÔa@êÿºŒJRÜY kÂ'« CŠÛöB‚ÝR½EvwÂÀX „ª|¦]ñªY\¸­è=ñ)[‡Q¿ß-œ1¨€ÝUÀ{;âj&¢¦<²% ¨¯Pöw‚–µk6r°Â5^3i]øšˆWËWô÷ÄÔX:viž}˜ .+̦H3ÈpðòŽxµÀn¢½C‡ý¹bjz"_š”“4úCDþØ”P—WêÎøPÆŠ´.­ä·â[iHZAI)Û·Ý5–Ý <©ü% tDÕ”,†®Èj pŸËPŸG|MBÚZƒÎ‚}NN˜Ô›ª¯–­¼ÝñPuW?†®Îøj!uYO»Wg|5 aÅ÷j™V;=QÏœCµ•½µ®øÎ ë+rÙß DÖQÓWg|5§qCVM¨ÍÅc‡|\± /(~Zº‡|HÄ÷`µ\ê*“R^mDµRë(ÂÚ¤§lLbeÛÍ„cUëݪ£ùjìïjâU#„4 £5®FCÖ<ñsŽG6Ïtª¨ºÞs2š¥} ²™-‚GYŽXÜÌÃÕçñF8c>øÛ±¬¿–¾ÎøÞ¯,Àëz ìE#…,¤dQÛŽ§ž.xòªO嫳¾3¨ÕnB»;ᨢÝ%'À­üœ1cZU‘NØ «Ñœ1rŽCuU½µvwÆhSê+§þÆ9õJW Öx2”*|ÙÄöHÆxðöÿññ列j…e4Œ$!D‘#‡«Ó"8y|³úœ®0Z•kd‘ýÕ?&ÍA¼¸ËÓðbó›ý²í¥Å¨éOÇ2Uc¤°à(V#l¾øÖ1ÈpuRöwÆh韠®¨j qB~ujRâ”×¢¡ŠïxÖ8òª¬}Ú»;ã:÷Tïm]C¾‰¬~Z¹°ûá¨MK‡*&…e‡?LkÖT½uøÍ ¬¯Q]ðÔê¾Z»;âÆ+î÷o¶GÒ…0ë¥g …²Œë6ïàÊ#Å”~î²¥ð—Ùß§ž¹Mu|µÿO|5<¯”¿éÁ¸¯4ÁÓVXaêôÆ£Ãé–‚ò¾Z»#:¹ú¦º¥ðÕÿo¶. )Ũ_ý¾ØkÜBò‚¾»;âj y[4×Ùß {‰ª¯”®¯¾ÜMUzŠêûᨚ¦ [?í¾‚QÇ"‡ýºa¨š¦~‚ýºa¨ÊÛ¦®‰}ðÔDºs¿íöÃPuU?A]ðÔMSòÕÕ÷ÃPuIü êûá¨ÉÏÀ®¯¾$À9ÿ„õ}ñ(guåj25 çäÜ“ Ä¼ä¾»!CÄ5µLÙk§JÐúZ›pr¨ ˆ“ïññŒ¼”ÒÃïšvŠÚZ–P’£ 1–;âã9gW4¾²åðWÙß™-n¬ºÑÒP#1N˜±Ú®ïe]‘5p5Ü?’¾Èj }ͺ*â*§®ÙÒT’ †å…ËÎü¥ôáX÷]ͺ+âG¸!÷ø+ì‰8÷.¨>¤¯D‰aË×…7YÉ|%vFutˆr­O?ú…ÕJmDÒ°¤B1z<±ø:šÎ`tU?³¾¼ðàX¿Ô¯ÉRª2Èmœqç«Ùò¾Œ)Ý×wr®MÝñ½#ÝãO0¹r³Õß #ÜMg –Šû!¯p¦Ýp:â´•‰H–F¦àû¿%}‘cÝÌ9?‚¾Îøiây—ÆWÙßH÷ eçÜ:J9•<%‡„³Œ{†‡>Jû"iâ&©Íì/¨wÄœ#ÜO0²$Y\þÈiÜ.çq¢² Ôf%¼ôÅË÷ SËá/³¾$c܈â\»>«)«+id®©ç€Ø¥tóDÃÇ^®þ|®»béy•K௨F´îà]+„6@idfQžÏL\£‘Í´¶ã7ºË+›õ XÀlÒHåŽXxù™¾¯OÈÏl1liÕóNÉ_6Îøé>ï2y—%=á»øiátï-,¤i-@O9bå‡=C|Êöh¬ußNà‡×ò—Ùß ;€_YB½Òû;á§qFZX@ (È pï„áᢡd¢¾Îøšw̯{+êðÓ¸Çwi5öÊŠWZRâdU†Ç–n'Õ×Þ™ÆG´âÚ\’pØ¡¤9s=Y®lŠÖÊÛXJ\mÙË{j 忉—Ž&:ºxü“ŒÿIk¯å,n”£Z±%U¼¥0´é,O~c(nºöVyðpCîK௳¾3¤{‹y…ìÑ_Pï†Âª^*jZK$ã†â k9êæTA:+ÃnÎøÎÁó+ù+êðÓ¸žex{•õ}ðÓ¸Sï%¶¡%¤Î\†5Žê®¯”çWß„ó*ùKꉧp|Ê¥=ÌsøiÜå–ª½õ3N—–¼Í ÈeÈ}±¨Â/«QŒÌLÇHj×\§¢¾ÈÆœõH€5 ÜÊðæñ­; ù…ü•öwÄœ;¬3¾úüÃ'I_‹ '²5qÕ¼>™í}PÔ%JRh”Sœîõe `9 \¾Ù·šÂ²×²ªšG©‹g+‰‘8l?l'˜oÖ¹_sBÔN™Ã ©ÝöÅŒ!Ϩê/n‘ìâ—ªÑÈHÔB™¨çÊ<ØŽøÎ°‰¨çÊWg|5€RµãîÔ:»á¬ ©Nk ä8rsEŒ`_Q{›2é55çÖÔr_ õˆšÀQZõÁÓ3Êp˜å½b”ÝEãîÏdgXIæ¦ÓBê I̵97q/(Ão$¢F0é—¡ú‹”´ÈêßHÎ…]Z’&§”PÂb{'Œ!×É•Æ0Ú_ËVéïŒÔ8Žuü£Ùß €uÜÙìÚܸt‰žYìäé‹8œs嫳¾&°‰¨¹|3Ùß `MG%ðFðÖ™qao5WŽÌ0ñg ÔpþR»;áP qÉü5O|IˆU-_Óß"©\\œ“j#Qgw/Lk,`7UrøjìïŒë0Û.+«e×%:oºÐ”±ÓYLþÙC‡_.:Ì~ º®cîÕý=ñª‡"iZ[P 3«¬yâåŒ ³qaç_m‘ÖúFY¥DL!ŒÆ1+–òv«‡%aü½ñu„XºáŸºT÷z=ñ*iX¦@ ¨ŒqšyzcYDXpuÍí+ú{ã2tÕÖžøT§û³ý=ñb RÅ›µÆiäé‹8ÀnuüµO|f MUÊzjèð÷¡\Ž*¯ª¦²>ëISkšSŸÃ€R€=‘'ŽGÆÂ2ΧÙѧ}z 5Ç péÓ†qú©Äâ꺪jgYS(Õ2‚AܵHƒŽøå刈{>–U?µÝJÉüµaÐ?|n¡á.­j4ËjNøÖ1—\—ÃTÀþøT¬±ùJì ª²e¤®œ;á¬T­e¬P¡âO«ëxÖņ‡VÂWô÷Æu€uWòÕÙß Eáî•Ùß €š•¨„M 4òrôƱˆ//嫬wÆu5òÕÖ;áP*\\ñm]ñuƒÖ[µ ÕËMhI Òsz8—FÞ˜‘‡ê·£Ãåˆñå­Ã´s/ÂTÿÓßXpB㛚TþÎøkk9ò•Öžøk;Î,ÕSͲÍ!áäéF1MaôËF«Ÿ)]ñ5†e5ùJþžøšÀ×>R»;á¬YTô”=žøšÂ"œ_ËWG‡¾j¯¤®ÎøT ª¿”®ÎøT ¨¬ÓÒW'áª¾Z»;ᬪ¹ü%O|55\ùJì¡ª¼ß [9»âë‡ò•ÙßX:äϺWg|5€uòÕÙß `ê±÷jìq^¢§ÿnxk*Zõ›IAÎg‡«Ð¥ËÏ\*½{´vÊŠ¤#ÄÒf'"6Æsž|mwhCË(¶qíþØÔE¹åp¹Z€!ì‹H[ŠYq£¦p͆‘b5ùg¬FhëõX…•®_ õˆT•¹®œ•!†;#UÇ%ðÏXŒÐ:ŽaîÏd(B·>Yì…@YZüÀ9 ò&9cU¨°-žÈÍrO«›f.‡nD œÕ‹–ÍÈ@ýÑœ#«Óò?ÇøÇûºy×,P{#Tó¼å;ï+Žk¬‰¡fi˜ÚV©åþovqõñþSþÏA¨½šg¬Gjx..^ì‰B¬þÖ!PÊÜÕté™™LLrF¦!OÔrCÝž±¤âå=3Ù ¸¼}Ùì…²âž!³Šç´rÔÀhugòÏZc4u,Ë¥=ð¡ ‹;Z= ªe,ø ÷ŠÞ9b庋—Ã=‘&sìÈzž™ä-³5T<±³bœ$DÇo>W1ø:‹—Â?ÓßœJ¤RÃdd$fQœÇ)g«ƒÃŠtÝoë-™ì£gám#ÇÕ“Ûó'þZù-­ t%#Làð7tÆ¢!Ë.²°[Ÿ,öE¤-ŹªÙ(#HaÉ(8¸ïË=b%@ÇgðÏX…ÙâÞ"+ZõÛ!½RÄo”Xˆ wåž±¡V p@õˆ“‰™Â>ë8 Ì¿4I‡ ŽQâ”Ù¹!àíš‚h¦Y J>õeÅìôˆþÈ‘Œ5–{Wc5/„zÄZb\:VŸÿ,¬©() ¥epÜ¥±y·«<ãìÄ{M»ZŽÏᱨyD¸ìþèw„Ôv_ õˆT´ãš¯33,&9#S)ÅǤdÑæÄFjKXï‰P!qß”qç¨ aKÌô}ÑßWéT°Ö$fQ8XóÅʆz:Jýc©A>mÝU,PŸÝlj¿w_/“hˆöŠkÔp${³Ö#ZÊj»ò•Ö;âPUŽdŒq˜åég!ÚŽ|³Ö;âP!×~ZºÄ5U¸æUû³°ã1 ¦qÍÀA–QŒÇ'L&!MÕsåž±ß UÁµ¥vw‡:ûvfÝmr¢¥ ÁR™+2â\G.¾/ç5 ­º½$Ù”†ñßW9OW6ÿy¨¶Ó0ò Ô}¶–w,Ë ÆsPïñ¼1ä™íŒºiu{~Ãáæª.±ÅùeMŽXÖ1ÈhuÒ~—,ÄIÄ_;›Û=c¾%@«ùjëñu ©[…±™²$Ï¥=ðÖ=Âi–òBýÑ3ZŒ¦9cyD)Úïü“Ö;ãÅu!Êáµ¼ŠdãSPv1†OGÉú£ð‡WYó†‰ëñ½cÝçR™ÇRÜ’ÑTÔ¬f9båIwMS•(e•æ¥sEÙËÒ8cÏÇY™‹èéäðÎ>±mÏ|•uŽøÖ±îç"§Þ‘÷$}£¾GºJë©a 2Hq±rÆ/¨¾»óø$ý£¾&‘î"_zƒË1ß #ܼñB†‰9ˆ±Œ{Š0ëÁ–Àh‘”f9!1 f»ÛtLúG|M#ÜMgå‹*ìî<ÿ¡ú‹ ÒZ\mD€ ü`oéŒy0Šêöü&žKí.ã.<m:*2H™Ã’7O&TË™ÄL=WKNʦÝK+ÂG±8Îx\=É\ϬL:¡×„äÊ¥>Q¨yfJªqÕ0°ZPc1ËÇ´0>ü„˜W>#¾1¤{‹‡_—Á=bG¸ç·²®´ÃH÷ ©uÒØ›J2NѹCž5Žî®ñü…tÍ=ñ#Üw¥ðUÖ!¤{ˆ*ù ]ðÒ=ŸyÂZ›JX;FÜyãXááºï|•µ=ñ#Üw䫬CH÷TÖw䫬CH÷'¥¼Ç×ïÖzB…&†§YIIÊVeI˜œs×—·ãTxç/òk§á{M:³5DàPÂz«?ñF±ñcêÆ3É>®£¬‡iô§QjR–ylÙˆ3ie{sÿŠGºï>¦”æAlÒ’“´;á¤{³8÷JË-­ûk5TÎ!˽X¡£ $ÍâËÉRV# Æ&˜ºO›?v„Þ-ìßÑcE;‚àºEW%;S¢‡Ñ9‰Û™ciîyg3Õµúvª7胄Å”á× #ݬ<™cÒiЉ»Ekn9MoPKN»N¼í©“¨ÊËkXARs$åPð¨b’F0ûqîéÿgÉû¥-÷{b¯uöJV+íÌÓTU' ¡º²èh…ŒÍ:çÉ #ÝÆr™=‹ÅƦá@ÊuŸ¶¸†+Ùùn8ÒBLð3mÔ«XiäLªµÒ(ŸíVð¸SûH÷u6Pc6ÚVå–‘xoRó~ÕDÒ=ÉóçîÒ´¶[U9È­©Â_¶G»žÄ*ÜÁŸ¸s²qCþ(iíÇ–Mj™¶ŒÐÓçY?´ÃH÷g,æz´\—ÂWd5v¨*ÎÙËëïþˆ­éõE¨Î*«¨¦°Õ¼ÜжÒPV#Ä#ÄD=ËÉJÞ8™›M O>Úœ¨x%4ôÈ3qÇ0HHçŽÞ?ܼÞ\ã˜k·UWÔQ¶õ]'–¨X›Œg Êy3™ã=LfâÌun—š›~´¼C’¦j?½¯ê* sõB ·=Oê‰P¥:léã%K͈ç~¤×¹IÁ·|2êI^o]@‡4z>7äˆsóOélàºcGÃæ[jCE+8ŒJ„ÏíŒ|™‰òI⊇p8ô½êŽ……»æAÓÇ!Â|ñ©ˆ Ð·pðtø¢TêæÙó~À|uލcÑüqþ/OÈ›×øÇûºaNl(Ǧ714¸ˆxq}ÍÜ“I¥§H²çÿ'·Ë?ðcü§ýÐãò3lûB:TìõÌãÅÇ~Y?h†°£¿(õŽø• 5µM&ª ÖáÑÁ4¾È¿¦Ûñá3>zŽÏáž± ‰sˆ¨ãÓøGâ!P¨µ>eà ‚ ÁP¨5ú¸í°ßøÊUÔÚWq«Me*r¤:Ó*HJÙe+ZÑšEC)ô°œZŠXú^W‡¸6çpâ$i¬¥áÔÑßáÊgÃôÔìÕÑš$8Ñ) ¤©.ºÓ ŽA— Ô#ƒEÁÕUÝ=zÒºEHæ} SDxÄÇ­Š }€m4´Q8¦¢®Ò닊éjé+TÃ+§U¾™?—HT…æIVi¯¦™÷G¬wÅÖ³¹òÏX‰¬ Éü3Ö!¬¨çË=bÀ©ucòÌɔֳ¯åž± `-â²ã^™÷ÿ )µ,áí‹C›Å ºõŽ© Üæ”ïäP1'—§âe¯’%áÙ¹^ܧ¬ãèÓXí;ʧ¥¦qRÓ§oÂâ}r®Èú:ãÇú¾fSÆÎ¥Ën pµ=Ñ‹réê«^ Ó´ïŠdþ,7ÑÏÇñ±œêz7——-nêh[¡ )×XÚPÒá #rÊ72šÆR|Õ©µ¾?¥}‹›ŒS,ùKè* 7·hŒOĘ˜‰j<ñ0ÍdãKåmš¦à«p}HRtÑ) Îvòo”<ßf9¦pòÜp6þ?¹ÔÝÍ©Ë:ÑTÊJª²®y0˜ÂXƒÏâaÞÆ>iºx¶8ÿŠS+Ý]Å”S)å4Õ°¥%eyU€å1êÿ«ã­\~ìĽÕêõ;¶ð„áWRÑLˆ3ð’?lyþ F>IuóÌe{oK­PÓ¶[Г"@u´×»¾1Póu|_Ä­ÕºÕ? ­æHmâúPW-ùrŸÛ墓ÆL_ümayH#Ì#—ùbÌð­Œ8ˆ‰Žr[&AÆ|€D³(*Œ¯®ȱ-A©$¥æÄŠe4™ŒLHtòcUø7'Š.Êú+€ó¼Ø9³·~¹ ÇýAÒ„N¡­‰ÌGíƒS”×'+Šnøå²­XOã´"2°â{¾Óe\ÿ´`â{Ħ,êæ¡¸·ÅlïhPQ"c]½Ãš5!ãŠî'iPÃn»F2þQq?þ©xm÷ÍÀ/ü¦îA³¨Å/¶LšâÊä©ÉYÞ3Y&N#sƤ1\cZ&?F|‘ÛßöÆBÕÆwÁd|Žwÿ1»N_¡;È=û#fìLãªR±úA!J&N³†?ÍÓÆ·3 l3Þã]ñ=©Íá¾&¹1BâQd¨^z‡–£¨Øñ)ÂHÄîŒa;üœ¶Ê'³²ßÜLÁ°Õ6øÚþ¨ÛΫW\†Ž[-Rä¥×)þ(d2Ûï× EÕ¸›Q0[BSzÜш‡_'“jm<_Z#d«Ê7…4â9+þiR¢@±×a˧·ìT˜ã„2,Õ„bBŽA¿ù¢åÔ1,²è4—Jz¯ü²÷.U“/Xõ=N¸ID’É$aiˆ©`ÛipPÌÇû‰ï†Ðí ç¤[ŸÄ¶¾¼·N»ý==KmN]\†Wrê#3%y˜ ¡p˜øsÊj1–úKÕ›Mºz7˜ ¶ÛM4¤„¥)JR‘€lZËâùq댵;Z†Z.¼RÛCjÔ YˆqÇÊj‹jñ@â½Ûì®{2ºƒûáÃsá˜ô¦Ÿ22±‰^a)t™©FªÛwáå_ò¨Ù 'ƒ3¸66zÄJdÜ™%¼yf!P¢V³ùg²„¾§µÙR\ñþ #kzX {Qª…YedIM‚ÐLgˆXºã«Ã¯€.¯V;LíÁC†ÖúªOoµ)jÌ[RýIóÇ»þÆ1U<ÑâôôzKÇÒÝ-BÚãe–PZS*ʤ)³4”žhóø¼³†[C¦~8˜¦wøbÚíéî°\CÈÈë«\Ý^\ARöÎ:Gžbm>ÜU5~ƒ@–ÂF”€Á¥ÁR÷*Ú’Ê<³w2±„D2pß &ÄÊšeN<ˆ.,”ò$GO/›~©‡Ž!ºžÑLÅÆ¢âÓUÕ%(yy§0!„sœî)­bíÂ?Nøi5õ&„)ÚÀáp)x½¥2Ù¶=ö²ã³áÆeËâ§µ5<8;ÜëŠr™ä8γ™ä‘1$ôN:x~Tor矋ŽæmQ°Ó©ÎãhJV¼Þ‘DÇ‹)‰™§¢" üÏKTg…*nùrãá>x¼R™Ñø0þhÍE_)ij\rƒ:ÇÉ3þ)Fpz~OXþ0é—^"aRzÉæT<α×]‘“5L*Àcó/_š?â‰õwBÝÇÝ:c¥<ˆ¥ºð3‡ŠÍÜ¿ N|°¨ gWUßĦxóE𛳖˜æÆ3À9ù`ý¢KÓž—Hî‡,—Bž’'ã3Çf50 ˜Í±Ö;£<ïÖÇX‡Íd|!× é‡Re'Æ©â9z#SÞðÊlŽlDf¡.Ч¦M;yhe™;FÕžÓœ¶3ųDöwE¤&™'Oà¤ø”A×¢.PEVÝbª)À,:YTòã ûc11.™øç ¿X¶¬‡u:§º-C˜Æöy¼=Ј ¥h%„å¦N;è¹DXyAÃûtáÎ"T¦¯J éþèP §i-®T¨NÝ´†[•:$99:"Ì“µ„àpÄwD B7Ó‡tJnô ÕQ8ÈJPC“DÊqu‰oÇž³minIA'ŒÇt*!‹åÈâ;cՌ҆Xj©§W,¾ŠN1Ï´¥U64Í„úIÇ ÊÑq€Ð• ”éhÆ3BŸþÝ8ÿ,Z„ 39ùtŽ **𵙄üA/DãŒk…3Aµ*f‘Ó¨ 7ÿÚ K† :(Íÿ—L÷lî…$ÏG.åZšk¶4É[‹š°À!²vsÃh‰§‹lg/gâ§kâê›=KV*[u›õ…>Ókr¥Õ<ãyª¦ž@i È.d^1â*û¹WYx¶>¡ñrì–ëíµú….Š’Â»ãz6Öm¥û›Tî8ÙIkέkEHWºZ™Œˆ…C3œÏYz:n+ãD©«Ó·e?NçÔpò,z4Á…Ò~¤í9Ã~`ºËiÔÌË•&i8˜JCéî7*¶}ÂF ääèTS¤e:´|á³gtf¡‰Éiº ¸¼3<ªKÒ'HO¦ l²K§k{½a™M yq¨[•Aplj_h‰PXç{å῵¥¿ô?³º r>ð‰„¹&!P‘ÀG¢ÊGD»¢jM‰Î­­LÄÅHŠ’<.¡W’h«ÖʉõÊŸs/sò‚Ùl°2$Q†YtJQ5†E äÁ¶R9$?tfÌÌ¿S´B…BÝ™÷}¢&w~_Û1 €—Ë¥öNOa?á‹Â"Kò–˜žübð®_TT5dqa%%.5ˆ"x¸˜Ç’©éø‘:É]FQîñ–ÙˆÜD<ùušÏü¾Ñ „‚\5­’Þ"xOn¨ ÌõšÔJ„€ ©Ù¤=¡ …ÏSò‡NaB_ÖA-‰ÈËÅÑà\ª«åÍ8ÌÄz‚S½¯êáG=OËíà,õæË 'ÏŠ Îü±o´wFf“Ñšš•Tí) µ0·ê¦@ñ,ÌŨtÏ-š3=9–öèpļewW[o—w),ï\O—!•¡9Q’yŽyr욈uËÉxF>ÅS}F¿T†xNµK‘)Fv)S‘0rnOq9N%Y?âuûLTXqgOø«éŠªbH«|UÄÚË— ¸fFoî™Ã³ÑN¸µÅB’áÿ|Íd«ß³†Ïâ‹%šxªÿ,8n¤¤mVµ<°Ûø¢T%¡â»üÿÿ[©=3ÿ4Êøˆ™'†ªçyŽOæ‚’Ïq³þ4üŠÕùìm'¦,†¯Š¸‹,¿Ç*3°>Ìÿlf:,q“—¼M¥JÈýBCÎ@óCñ™§ÄÈÆþVW”~±âŽ!I'ür¡Ctžcþhèó—IÄœG£˜pû¹s*Sy¡„Ì÷ÅÉl÷~%`Õe°ºæ¥CŠø­§iN&1ŒSÓò3Û^ØÓ¢®$â0™ÿŽ>:_dtï<èx“‰ ððë†R'ß³€åÛÙâ›ú >êÒ„Ìó=ñfRÖOñ"’ᚃ<¾gíÚ¨*â¾!JN~¨H®5ÿ4@³ÆW…¶¡ú ґĺØ}¦(Ç^i ½ Ž«XîÙš*ï“á÷fwë46sf‰e,xÚü Rl.fVß|Ô¿l aº}B¼1J­[ ¡*ðg. €I–ãé¿M5£ïE ~rÃÞ6|%ÏÕqÆ÷¼?ÿ©¾ñ½‡í‰=-¨ÆâýWÿ3¼?ñú™l>6çÕ8$s%Ôq}áÆ²ž¨HY©mãtãX”r¸«ˆärØVà§›äé‰|”¨âÎ)Å`"{y÷Ä@Wñ2Ï`YÆG+¨=XÅŸã>"-„«‡ÜIÌ%ÔJ`‰E‰Qÿ6âœáÒG }”d¤kÅEYÆ—²x>Ü[)qÆœLpW º’vûö¥ûae ¼SÄÎøúÇ$Mö¶ãüQ¬d¦…ñ?¥8pò•ÎkÓ²ˆGqdä«Ç5>ݰ)tñ_æ3°¨1“ÈõÂJºq¯ëñí‚§‰Ÿ§mêŠPâP颠¬R ’¬9R•©— OÚ0„ÌA‡‚ã¬C}¿ƒ8L"…µp‹.ÝLÅ-E[TiRÈ+VbJ|'h‹ eâ¯X2ÃôúÃÃÕu—†m,ÕÞj+kküú›gÌ¥Uï­å¡.J~æ@våÂ/ c3N‹—úñTÑU¢¨+Ô;ºbmV Æyͱ«ÝkŸþ®¥<ê ~Ømyx+ü±üÛSSTY+òÊ †ÉNcÛ‡býj°«/éu ìüý±.>Ïxl¥©ªpi”Že”ƒÙ8¼KžXÄ.õEKhR¼¹\„ò¤‚OD5vq‹`MéòeúuP#yGßhwŸ?»Í±Šª—S˜S-¾eøOTX˜sË õ†j»Âé]ʺGÖ%é¶‚´õ‰Âi¬<3—I…¿¡Â¤©ò´¾è›Csñæ=qüÛVúZ.©…H 嫨E˜ÅÆ0¹¦4ßÒ³!Jÿ'Â_tM¡Ö~<Ǭ~mlÕ<è%,(?„öƪ%Êq¦gïéeÒÚé_$a™-©Ië13Œ{ºcà™õÌâà˜£¨-‘ágãÌzãùœýä2Ϋ”î„ÎX$“ÔI¤ÇÃ35pµÝ“ÑiÁ/]*Gýà"ÄC9øç´Õíítb"Ô9ªêœ54‰É{ù„D)ì<¯îŠ9\XU‰ðP=6÷ÏóÈ#9ÇWÃÿúGàë$¿ 2 ƒýÑjyê°/¨cºSªwY¿ŸŠXótF 2ozƒ¯î‰PCÄCãG™¶»åì6ed¬2]é[™¹¡XLÇ[ª.[™©eÊæ„ܦK‰+s~ØV#Y[¦¥*s%*šB‡6Ü#Q9ÜCÅvî¦n¢â¢”¼¬¥:” 6H ÑšÄRÛÆ6++•LÕ4–™!/ê«IM•l ”áX«¬š¢¶µ’P¦ˆžt¨Ëlól‰Qè3ÓVµT´?Jão4¤œªBÂ’d¬dDoÐ-ÛÝ+F°-HÏ@J–óIIN\ÀÈâ$ÂUÁ\9Ä)¾Û™…4Ú”¤dqC0Êdc16éäÃZ‡P—çèŒÃº5rðå×?ÍohJFu5Lü§&*?dIt˜¨tièÐAa²4A›ªJ€*<„Êq+¸h4¨H)AT’¬AXQÇp˜…b·¦¬Šð«€¬?dIŒNQDó Hƒé,0>ŒYŒix=.<•eJG Q3æAšhh>r•! Ær>Ü!QêRÀ))§IžÂyÙ ‚‹¥¥yNq3ý”ÅÀŒˆPR†âf0Û²77Ò¦è”I%íQå;båÑx4ªè&BR³‰#4Œûã%”µÖTê‚‘2¹J JµUY"€¶ä äT{bÁDygjl¹™IÂRæYN|›a+ÂÆŽ©e¨RRä§3>Ѷ%bpº¸”eN#tã.iCD¸UtU%$ZÊL•"dX.§§¬  %¦T’‘ ]‹0\4d¯NFñŸ„™ž†%"e«^¤)rÈŽHƒ‘ʼn¸;gS~]%ÆÕ™ Š‘2ŽŸ‹5Ÿô—]§ëÒ1e$1âß¾/Hpžf\ž-~¨1G™9BêÚJ‚IœŠ§ˆû㟖j¿…Œe9Gþ®êR$6#»lº#§£ÇéùqÆ ´Ó%JjQô‡(cÕ 4ϨDÈÛ˜Ø"W""‘fS—óD×ÌOņét5Åîl2‚âå%£xÛ1ÇH(h’JTgøŽ`Mqµ<0%ái;}$퉮"yb²|)åž`L5Ä%ëx+fypq2§l cŽ6-å)ß› ŽÈÌ㊼Á ¥!²µ,àu6Kt+šsZËù‘NŽ)*Í2aÇ¢Ìpåq•ÎUÖgÛÊûÕaM€d$ÛÕ½¡5,õ}ÐáÊb'¬ UL¾}¯º,ÒÐ穜ôǵ÷DHˆp¸“ŠmV ŠÝ-*±n3JÓmºûŽº–Ë™m”8µ+" wF¸¦âµaOÕ. RhçrB\®Õò´ëCÈ}J§q,¼…2¦Ãˆqµ¬¡I H18s¨öd¹}bá*[=ÖãLêë ¶û“L†jM[4âJ]+Î4}Ô”—*Jf 2‰ÂÌAVOªÖ¥[i\¾¾Û•! sËS×)ò‹my§d lËJ‚Tö@­©Â îýWàJwjš~îÊ 뤫QeiöÝ,)¥«&T«PJDóìÆ,Ä-A§êw¦)Ea+¨S ‡t*t[r¨$°Ûïéi0ã¹Ó‘©*3ˆÍB9õÿTí¿¯Yí”ÕÜ.‹¶TÔhÔ&™ªz‡Òª-ŠwVÛ”á J\$c=‘xJfŽ!ú‹OÃüVÍ¢âÉM¶×kì5QTöfžCdiS¶êò(©JËá”ÎXˆj«ú“Â4S¡êà¤T6Ãɨe·ß§mª¯€åECM­št»øê’ * GÔË`¢µRªU]u+4”(ª¸:¤Ûê ;®©¶. $¨Jr ™g;Lá*=Ü–þ´ðßë5Ô;+#vú •ͦj^JÙ¬5n½¦ÒôZl0“¨æP3bb•̓ê¾óÅ7Îa‡Wey — -º•0ÓÊXp¶™²€U5K0ÀÃꟙ:cÚ‚Ô&wþXö¡P•c™ÿPu‡3ÓôºaÂú SÓø}°à„Îôþë‰Púœól £8N;ÀO|)Aw “T*•´Êª¥S ¾ªýÑ)¯zågè p¦=VÌì½× €—u5›ÀLfžÜ"ãJa5¨ëû¢T#æ|5Ä,Ø×]ÕŒT‹Ëµ¬é²¥%iy~íÀ %,²Š<åšÁÅ6뎫Wõ™çªª«V–+ÓN!o‰*o—W)Pn´—v똦qj,;t~‘M¥•-´çKlÒIK!3QÁ28f‘Ç úE~O ×XžµÐ·pE޶ÏE|7J÷Ò·*i2VšGP´S¡bEÀ’¬» )/J®o^îo¹k¥½ÐߥMKU:Ú0å=3t‹J™§BÐûKCAB`*s Á]V~Ÿ_QljK¥ÕG½Ä*Vuå4Î\\¬J=ŠXÙ?Å,bÐÁUôÆãþSu¨rÕMw¶^. Üuß¹ÖÒrÐq ¥e+eüªg;g Á[3D¤ZÕÀÜuL8ZÐûVÿÒ8Vìízn¥ÓQTÊ™ªi±¡¡•63ÍÉ ¡ên\7vªãÞ›Ñʳ?kRÕ©ªóÈp*A$d’1Æ|Ñi_:·}½[éQEYm£¿1[m¶Ñ×%Ë¥u,½CBÍ £I”Ô2´°œÉJ§0p8J¶^þŸ_¾h_~ìíàŠg|ê’–j.K¯em®š™üΤTe[$'9ôWá… ðÓ+oéåÞßR¥­¿p…–ZÂØªfš± óP¬© ¬G£˜à¬6NÐöœ)ÃÜIdâ{ãÎ3Lõ®òi*SR—”mÚj(”Ñd·%y|áyÆÙJ=€Só>=øÂ Ï̃®9ßõµ ßõµ {ëû¡Pg½Q×÷D¨{TÖÓ™ Ýž?Ë(•<°scˆ… ŠÁLÞ£å)ARQšgjŒ†îXÌÔBã„ç5Çÿ"zþèpÌ ßõS×÷ERÜ.ê¶d3x¥7DXª*¨Þ”û_tNB3% Ì0žoº/f{{_t* {]Hœ•,yÄ÷Eàr¸ªËSz´;BÙCN©HSNd… áÍtÛCá )$'>hp'½Q×÷C…PLò¦y%´òÅš¡ç\´]«øÔ\+ ·Û[ËBs`·&¥Kš34“OH€òFT¡ mÛËöEáW÷ÒžQ×÷Dày:þâ?×+kíUTÌùÄ6—ÐòJ€HJB,ÓS<mœrn[•î×.HÍ3k"ÙÆÓšªh0iR…)·q¢Î*hA”¾¶n…Z-\b·ÜR«)I˜ðä2ÙÉ(³ÑmglÜbæ¶•' ÒB·c(”–bmÜh€j¨Ô7ÙÂ{aE˜)xÕ$ʦŽ[½ÙßÑ aŽ5“Å·èfV}&×·~øÜ‡èq¡ÅK¡œ½UF8EENjv‰JÝàT»aKbªN/R‚‚èØNU"Ä¥5',!td¯<Ò¼I&.E˜(8™-„ÿdS9¨åTûc"l(yB±:ËvB °¨cˆJSžŽ•) NP—U¶}q„³K|UIMÈFª»¢W%«¡Å@… Jiï÷Ê—Ù Eÿ–ÉTËà_?¼B‹e¨Xt§AH pJo+q‚Ú[W!Sý.–c~¹ýâ%rYjG8ê”môà+•à@è‰E†‡¥eBÙK3Èþ'²-5ŒòçÜí¼GWr³®¦•† U9ð4ä' $7©NÇ߸öéiº [67n•ÂUϳDëSf(£YÅ>YH@„¥$­R2I”fÝkÇï?—þXÖ™£´Üj¬õ,ÙníQ¾ÅÔ¹M¤”ׄs4]MJˆÔH^›J ‹s«OþëS9Y Í¦°R››¶Aut4ŠO>Óê¦Ñ$8^’ÝFT¬5–dAÂ,¦1ŒÏ3Në—!óÿÒÑ‚U—ûŽÏáŒÜÓ×ů×ý›Ø«º«¨Ò×8t+þ|ñÂ:eý‹Umè:´"Þ•!$dsX ÀóeÂ#Xáã®rþǵQrP9郻ÞNgÙŠÄÆ™fGkïáÃ’Ø•$ NºDú0‰n˜áã˜ç/ìc÷¥yn üdŸÝgîþÍÙêrÏM!RÙ›Tk‡.-ÏýJöÊmd§Ö7ûå™uŒ1®­Í¹T ¶Â Ú’©Ë¨F¸s˜c]í ¼Zy§PØV…eWB€"%ïٙŽ%G¯o‡R–h_¨FÕ:ÚFY¨¦ ‡‚㜱|«˜•ª¬å@ýª‰kÿ_ÿ|Z¸>¦”é¥u~Z²ç=vÆœgºÛÌ•_*eúmYçI÷£6ëýØþk·yydAP‰ïZ$l"Lþ>¿ç‡æÜ‡Rg·îSÏÀ…=½® !Ozƒ¯î‰P°ö«j! „¬må—74^_î3 dG/ÝŠW3‰QVå©@!3´­§sƒš1œD½?*òv§T’2éû£QO4õ[5Oª™ôžèpç˜ÕniNašXžH±T/:­¹í}Ðý(ª—Y<Oµ÷B±R«>Z=¯º,F"…U:É%) ‘žG48 ÍRqÊž‰˜—f«”²&_Ì{¡À[uN;-i¸¦Õ‘À•Ì¥\ŠÀÃ… ÔëO*sdÙ3²q©ª®­T´ë¨©-²Ãbkqk’@œ±$F. ‹c±ÕÖ?Jë€%c]ä¤ç˜Y”ˆtL*aÛÍL~–j¹z ötk‡ x¿ò›ú8šíCGl5ÉaMÍzÈBS4 UŽýÑž-Û8áuq—¥Íaš÷Ê¡³ r¥ÿÊxÂDªÃ³`5‡õADqGœS`$aùÍwÂFtqOçs-ˆç$f­™a-ÆÑ Oqp™rĶÍ擳¤ÂÊ1WÅe` Òq˜}þØXiâž$$ÐÕ9oy±ûLâN&y,ED¬•ûXM±©ü·ˆ¦è žÃ:†‡ïŒðR*âb’@RH2™©h~ø\#‹8… pó„ï•C;záe)MÅWÝ%e±¹é(™¼ÞÙãˆ1r)òÛéL¿Bs1Øfÿy„R–ž#¿Ò´–Ú°,úJ2}­¤Î[c5 –S3ÊèâëñÅv'- ¼ØÃí1xeJn0»i –GT’TA/4‘' ˜¹H”ÜcssX1cqJBÈZCí› 11˜˜oÉ•´)â ¢Àá#Òþáù¢Í1+$âŸýÑ=ÚÍwÂ)¦â+øaXœ”°ÌÿÍC¿É/ò±¬Ï¥æï‡ @8’üDÕbq)åÕhþÂaÁJ»Ä÷IÿFx’“2o t±E(×]Ú@³>@Hš³£d&ŠY|[pH'ô—\Bi›‚”<]u••Ðy5ï‡Å|Eq®´­…Z@ çÕlŒ 1œ¢áéø¾]2¾Òë'ŒnIHA²¿0ÁÆÏï‹<ãÌˑĜU[SOJ•Z_h"¥¥L©r;6Æ|œôz¾QŒÏx§küºç–bÉSÑ™=±»‡*8ªâ“–J”¤È• ÈÓ&SÇÏæ§òìžd œÓ‰9AF8«˜Ðö;&´N,Ž4¬+Ê-NLÿ?|. ¸¦¸¥9­å+I AßÓÆ`£œâ««i+]’ 6‘58TŒ¿¶3p3Ž<¨À~”é3”‚ÐLápP«êJˆý%ó-¤)ÚŠŒê)µ¼Hp&²”£Xå GµÅ×w"ÇPD½dŽmñ›‹ÿ4¹•@H9A+lOlœ[€ÜòúHÇyNÈp<íûk‘Äö;h¨m¤©Ã€µ´ä*HA>ˆ1Ï,ªmëðaxL]K™Æ—{¹¾¹xáʯ®¶›mkBÚj›[M¸· RŸ¥Ñu+}É-Ah‘Å8Eû˜Ï»9üL£ü£óa²ý¼TZ)©Þz•‡WAf§«¨ª¡SõL.ÐË,Ò>]l!—UO˜Œ›T£¿ x¸çãœf®¬+¨yúK»J§±Sñ=uñšDQ¹æ^RnNÕRæ¨.©EeàÔÈyI›C¶?f.ñêúŠ+ªŸªh¦•h9UñO&ùGXœi'Ç1„ó u5•TÍg, À%¹¨þÁ™‡,pÛÙ‰¾"qk(òo%Ch(Wí”M±îë?(õÅ­ªê—L…:‡óÝáÊ|S§ƒW9é¦Ì{¡Ãø—UYQLÖ¢ÙÌ',¨šŽ?d8k ''4ñR‚éj©ÈÊöý‚1¾=ÞŸúsïæ»|I¨<¯rÖ?h‹c>ìÏŘõÍ©ºêçÇ»¥(>³§(f&/SâÆ:Ë;× Új¥%tN½€“¨9’IäutÇ{7 —?úgÊ„jñsËÅ^Ív­~‹2þc(~—=jH®¸½CN_u’ Q5˜ œaÓÇãŸ&ZÅ1³ÅV÷˲= ædˬF7Áß/…åŽÚÅÙ5†JG"tj5yçÅ8´¥u›ÛL¿›î‹8âÂÁus>è{_t5ÇÜBª­¥´ûQ5ÄVæ»i b•§h—7mŠ;Õ÷ëe¾áKM]TÍ=EH)§ij3Q$saöÀtCŽf)ðfÛ—62唡C çˆ),ÈeÛ-0òŠ5ÂV¦Ð@˜ÔRAÊã(;À×#Kx¹‡™KoÖ¸ã¯)YF@A3æˆ=wËcŒ.âŠÆDÛ~:„¬ +˜Ô«Æñß´ýéÔôNÕRÖ†ÔÕ{D*Ôx“·0"DÌÇ9;Ürr®ÔëBê0ÃË>’œÉ*2Ê@ݰÆqèíçËi‰ìõ3z[͉î8<ªž¥Î/â2œ¹’ëy¦¢0È%²$uz<“E êRˆ@oo¥ºQiÅ`  ”öœ;"T¸¶J2¨$Lbf¡û¢L@ÏNò5]J"a$’0#SÐ]ÚFÖæ-¥Åm!DòoœMq .8”!!2’Fc/Ù(Tz--¨áI÷hZŽåO²MæNªÐH+$ÍSì”jzÔª7ÀœÑÌ Ù<}Xθ¢žL¢sÈâ”T•LóJâ(åÓ%$ÏÒI9°¨ôÙ§yL8A5¨'1ÞUŒjz»RÆA¦8ÌÌá˜Å¬z²Ùij^¡/!aj*ZTÈ"1‰èß–5št[¡ªRTÚdÄ×ȱÚq„‚@% b±´Kf‘o(ødÔIžÐ;p D¡?Mybi8(ÌŒÛq†±ê¶]U¤ùe¡ (H•c„ÆüA‹Ç¡±È¶W% !´% lœçϳlI‚fȬ¶Ö8–á!q* ªIŸª:Ït8HîæÝï6ëKŒ¿t¬¥ `¥Ì®Ô¼†QáNux—”`”’y£q1MãëÑâ›”´õHºÐ*š­½ZgÓRÑmÖƒyÛP2Rs­)˜Þ@ŒpÅC Çê ÐÛ¯5¦íEP›T]iéªuöRØ$¥M¤Í+QR•JgpQ?¨–[… µêú»}¶®ïÿ¦Ð¹_Lë‰å÷Y%«<ÒR™ÉBPá]eq5•–—r¡K©*B›5-…%eµ$‚g0âJO>x <]ƺ’‡õ{wž¯@] /›kUôŠe¹æX<©á!κ}D°Ðß­–ªéknõõÂÚ*[SôÄÓ½Q¨ó@•¥2§ËˆÚDNêeç-^"nÑw¨¦·6å«E}]Cl1ƒÈ`572ŒÊRðÆ…gÙ(«©(«nt4Õ· y gª›m׿d4P¢äϪ ^¨f#¾T)†ÈRi*u Î"ržÝ±ÏÉ<=_œòþ.“uµ8"™‰æü;†ÆÞHéêÃLJiü Ï6Ù€f$vcǨÖjªñ+h'dB¾ÙýR€Ie*Îp;6ô€¡n&rÊ%9™œÚ Ec¥(&GÄœÉ <¸nb.š§Él}ª{º"z‚ÙªZ‚Â$óÌÎH‰yöýÆÝ¤Žè?ZúôF–U%sÀá„ãXõVw—XãÀ–m)ô& '–rœbz‚+\˜µoÛ<£vñ9¨ ”‘Òì'^CÑíE<ùuX‰c—¬Ã„Qeífç–~)mä‹A„ÔY‰ÀÌ¡=gºüö'¬÷Bà%aÒò}„™måÑ®}ÿðöĨD§Õë0kO ½fGXÔÎIÍ“žRŸD^)M÷§n^ØÌÑW/‡ J­³T‰/=´™üEsFp˜§“pê}ùzÏtk‡Ï­Lßâ®!©¢§aé>–γª@H”¤•OˆÆ3oGŸ cõÆ%ÛÒã‘ý`wT¹¿¥¸Õ<ö‰g‹ÂÂÍÆÁæ\ßͧ ,Åÿ™?!C³ÿ¸sÿã…[IãæzJ)?=ÃŒ¿’5= 9 qP6ú-¤>çÿÆ"²ât’E PØîHÿL \*H?ÙP‘ɪ½ÿèe´®(!Ï쨦Vs‚ó’ÔÕ²â2h¨Q33'œ=‚2YÀq0TÍ%#aÕ_ü°-8ˆŒhhÉžÍU~ô g¦MýM)&†” -D eÅü±¬¨µË\@‚àu•ÿ,d‰Uº{ómÛ·Òåž>ù{ÌÎÄDŠk,¦z¨i¸…Xª†*f^ùGö¢5 Ú”ñ4t¤LåQ}BxÁš,òx¤Ÿ %;0yCìô"DÁ^âÊ š¨(ÕÊCÊÿD@ß•aCHË®¿ù"ÁlÌÒñ"ܨ©Jd RŸ\û ëe˜¦x ‚‘AI”ƒ®pç”ZhqYIJ¨©”7‘P¡ÿ8,ƒIĉiJ]ºjÂURpÂ^±EœÂx£EôºSà#R£„¿Åš,ô/ŠÒ6ÊN‘P­¾Äd±Rø˜¦FÕJ}aæd?î@·‰XâWí¥+¶°€\A›o•&A(wøùë•ötrñ1H µÓ¨,jq#ØqNYO<8×ÛeñÔRå³0…&¥µj%üÆ`ÿ(—LsÏåŒ&}æU'‰Â¤›Kn•Jpë@D<×J¹þL*6ÆÀ˜ÃÌ#yˆâYÙ¸©*µµ3´ù”ÈÿLBÏ âYIVÆva*‘ÿ$ Pž$Oé,©#aó#÷¢•Vçú;^šqIÛ=þ°ZÓâE~ŒÊeˆ•Reɹ @®*ÚmLãû %ý-þN ű wÿr%ÚˆUIâe-¢«Sy‚ÆYU§#·ÁÍÍÅZÃüÐ?ðF}VÔ[¼RFTÙY8à¯6ŸÙ’–ñB€ ±²'éV §Éà‚ĸWº^&{‰lu®ZB¤S“ ¼˜–ÿ dc:ÔÛÑãÊ2Ã[ˆü^±›ÝÍr ´Ô·Î ‰Þ‹¼àÆ?ËÍÓiʵ¢j@AÜ•N}“póÌrçÕ^®m8´7jyä¤B—$Ìg,¢œ<Ìs•2þ¥[Q[LãÖwãAjeK-’’¡”g‘#¸å }ŒcªÝ¶«X™l#™JŸì‹ÃË–>Î}MÖòÍF›v¥¾ƒ±Ô¸:Ž1™—‡ ŽsþßùY»íd…ZÔÊ]D-'ŇîmKµ¥9‹IJ¤d‚£ûe¨pœb'êþÌ·‰ÂÏý9…'ð‘P{fˆç2ôFúçÿÇÿ'5W}WÄ¡i=ÏþÓ‡÷ÿúÿ奧.*6õ•æ#ÒoûJî iJ§i·Ü•,¥=yL&a¬#æjª¦îU…ºÉIU¤s4\ZW”é΃(Í»iáýóùåÑb¦æ±ï)CGù¿djáÊq†‘æNäƒÒ{¢ðç0MC•èA,4‡ðæ)ýКkÆg™¦_Ô/©ÛnIÕxO´F]tñþïìsU—%DPò´ŸÙ†'÷lùlHûOt8sI¿3áOYî‡þàž³Ýê¢ysÜ”§/Ã)hÕS·ìp¬—¶*^£JR¢i@ ‹1L;ü|£¯´ºkÀ"]*ÄÃŒÏ"<Üÿl8E*5<¥XÈLÀÏîçø6r˜œ ýçðKí‡éù¹ã“¶¨T‡£9çdÄ^Ȫݓ¶ƒÍÿY…À„UKðO¤Âà,ŠŸ2}Ù,¥3ŠS¬™ÁÄý)Ä~DQ³PË! é”ÍJÚv©D˜‘«§“+“œÀŽ|L_ÒÃÏpËu(¹ß•$æU`&sÜ|qS/w˘œp¯Ûë/A*½Á¹}±Úáà@йâ–ûapJ¬pDÏ9…À[B¤8ì²Nc0ÇnQiM>opD·âc7ŸÝÊrGDÌ[%U/Á>“ €¶5ýæ\³ 3Äí‹4.|ܧ$u˜—ÿw=Ϥ÷D¸þ÷)¶Ffc²tÞgK×ÒV$ž^ˆÖT¦7,BûbqKS•Ã57íÅkRVuNe9™ ›£LSÑòðŒrˆg\оDs˜ÝÃÌM0©-¤¤"^)byq†U•°þp™ª¡Õ'13–l7Fq¨vùŽ÷³ô[ë=Ñ«‡&²Fagº0)N*‹))–˜³1aŸÞ‰Žs¸y½’GYî…À«¢§M`¥Hƒ‰Ù.ˆ±B5æ´Ñ”"RIÙ(LÀg÷|ˆæÄ÷Dà*÷u˜· Ea}4Îä—ˆ“°uEZÆ.hĪªXcÎbM1pç_+ëèéZZ2$¸ûmÏn TŽÑË(‡§ãøã9žÐèÿtg$£¬÷F¢aæ’ê|։̖cyå¬f,7û½áf%À UìÊŽ³ÝàîýTsb{¡x…TŠ‚”f :v¶}¬f'X$r¢Gœ÷FJ¤êåè¦}?t^¯iJzþè—Uóh«(’ÆYò<Ѭh6U›d޳ݼ@þóÕDºOt.TŽë=и+¥Æ½¾&´Ð…%-<—\XžÒ@'Þ#*zü^(ûS—¬Lãch¹&Öͺ¦ë^)•]PÅh–)R¬šÎª¡ÚtH¨(%)%j‘’L£w%¹Oý[¢b’ÓqzÛV‹5áš7éîªò©i)¸‚š5¥Dj$/M•„òÂñHˆ5Ÿª4o\N-ÕPªæí“õwÒi{OªŸKâ—¤·Q•+ d™p…⾯X¯7æÚžBr®[y£W7jÑýÞð‰}±ŸÒç0ŸÞò#¬Âu•o"'Ò{¡úDs6ÄN[f{¡x­G°Ê³ Ö{¡x‰*ÎDužè\ Ÿ87#¬÷Cô€|æl{9Ot?HƒÎò7ÖaÀ‡Îò#¬÷B5Z„wÕGYî…âpÎ$ sžè^ ÿ{;ЫÇé4´Õöô<å šž­÷hÕUTÂí °‚Í-Au°†\U>càÚ¥øNÑá¾âêÂówéé,”üQ_{bˆS¬U¼Qrvª”©òꑤ¥äwˆ’yI±Cé*>u©äÁ+åæqMãôKIóü=±8a™Ÿàí‰Â5²Oí‹À¨ÍøvsÀ¸#ðOí‡J£ø;aÀŸÜæü±‡q˜ú®<ÇðvÄàBj%µ±xy¬}Øœ ýÄÏ¡Û'Sü½Ñ8þã‘=½Ðàî?‡¶<Çðõ˜p!5‰ë=ÐáI¨k·2'¦æÉÿ HAiHz2ä‘Xæñ+µ,Ð4¶×‘^aœS·ìŽyågÃÂ')¿Û—ú:“vroÜc|SÇ1 {á½=°âBœÔ.£ÎJ–ذܩ툃²Úž¨±Eås-–³¼ØÖ^›XÏ2¶ÈK¢5Ú\Bä9æ23e2ëŸñhÏ}ʞ؈’{•=±AÐ1)ŸÛ$‡|Æ9²rX³ÑM“Òħ¶$‘Õ–ÕFõ%YšpR”vã™Dþø‘éåÊ娇¥µ=±§' ‡Oš»ç) óGqØŽ~8{~]VÆ?Ö]Ù?ÊžØÛÄ2xoOl!éþضÔvY}!ËÈ#R§IùH”ôã@í“Ol(?Ã.ƒ §Õ›¥9AΩÎ{cR|ÆÉ§oªiÖþ}±žJ"iRûbBuåø{`L]ÑJwíŸ,o>£-’¶®ªå8RVÛî60ÂIV9£–3nÿ#ÇË CÓÚžØÓΞúFy{bŠS‡K‘L¥Ï º‹y~Ø” Ÿ>¯l/h¨xe”Ïo$X€YÕÒD²Ë(”çÉEÈx‰øgöÀOü=°W/‰(¸YjèÔR”¼‰‰Þ"N6ëáÏL­®™—Øa¦S—+iJFÝÂQ¨ˆc<®lªúki*)·æÿÂg(kÇäœ&¡¬keÊ:áNETë òÊb{yDkä8¶ø{c4,5eøaB+[øeÉŒZ ï‚e8­"XòƱ€ðjd= zbp'÷3œÑÑŒJo9ø{aAZ¹™ž_LqÛ#ÅMÌÿ*>Âc ¤=·Ã=ûa@’÷*{aCw[‰¸Ñ6Ƙ¸¸ :âT¤!!33²‰3ìïâˆÖg+®Ê¶Çƒã©·‘ü-:?ãŒVMN^lÿ6ÚD_e:—©Ìö„6 {VcPå–XŠ•Íq – ´¨Oû¨Y=†_£^,¼qõÆWÙ‰Mqo›o3ÔD”ª@6à–"Š\ºíàÒxÉÒ¥MìaRå:‡ûiXý¦-<ùNâ×ïùQÛ‡:£ü˜Ô9åÍ&ˆôÌÛ9DfoÑ×ñ×ê»Q'ŠJ±CœjÄå©û^–Ð×럜)åü9ÿ|X–&0k¤ ͱ§:åÌ,ñ"Z™U*’¥MIËpÂ3/FÞ:æ×Aâ`fà¤<ÈÔûL!›ñz[c?¨‘7RÒy’T¯Ü"¹åœG*göÅá…W沜¹3Ë ÎS‡ ÀÉgà‡ åͱ™—X­˜Ñ¿ïE0ÂVg× IŸvÔù™x²Ošq\É©ýPKË¥•Ä*°A¼c[V‘Ûª°©a¶Ç*VUû„ £I–“¯/Ã?¶ 3º—KS)™mÀ0<©ç‹Â€øõøp®Sݱ†è”Uª¡ÚˆœŽp'$1ËåÛÜÄÍ{KÇWPÞ,¾v¨ñ;ïÜèKëaÑî\ Øœ¤ï”}'¢µáófâz¾‹CQRõ=C¥S­¥kN2@#ÔDL½XÏé1zšè¦rT°<Üñ"ªÚ£G˜õ“-øø—N®gVÕPØ«ªP´¥Ä4BaJðƒ·ø£¯ƒË8‰÷cÉ5<½¶•fýd J‚š¢£5J&r.ºdÞ˜õe1e=éüž·Ï²ni£ y ‚t\7N¨ç‹4Cãñ'¶%À€TK‰rÈÃ?¸ÞSÔaÀE>©.H§â+qïHy²{c<ýƦ]uùSöNRê鶃ËÈ4—öM=F35G¬¹\2º•ÚP¢RI[“œöç<ñŒ*ž¯—ŒG’¡Ö"¢X”á³"žR©ƒÚIÊS,w^˜¹L =OPÍ3éð‚j8ÏU°ˆ‡£åM˨EG*{c§<¾–%ûaÂJòíÉI‘ðʬ0yŽTKí‰P,s½ûbM¼ /Ÿ åä‹X,ô‘"™eÛÉ ¥^UÚŽØœ ýĶ£›l8«¼Ç—\Ê%/ÙËš5ZÄY©ڞ؜ZL8¼WQVŵµ!A*]K $Nr. Æ<“Põü<#9þŽÐ©íÅ<…Ukh’e,Éœ§ëÖ5aÿÜfžŒc53ÊŽØœýƧŸl8ªKÒl’™j'—–5{þTõœ5÷”óm‰À Tlš{aÂU­‰åÅxmä1¼h1:ó(Ìq–1žqæeµ=±8ЉKÁÛ¤—à‡ÿÊm¦bZnì[#úžßQögñ‡t‡Æ §¨ÇN)šO‰±‘‡ 2©—¤™ôøœòÜ_Ä×[5ÚÃCCBÝÆá{}úJd-ãLÚÕ3•%N/#§.V ä’yÙ¸¦¢KϱõvêåÌZAÒë»!5(,S~šëuaÕ% uµ"¥+A Ø 2— ¸u^««xzëSi£¤EQ²VÝ­.7V*\hÒ´ËZÎ’RË™(JÜJ²”•àV›ë G R®ÝtB+k-haÛ相êVN¥ t &ÓN<Á -’ØYRTD.èú­yJ¨c†Üz‘«Ë¶ wEK)SõMV*Žm¡DeI(Í5”Ëg9\ËUõÀÒÝ×o©·Ó6hªéè.ŒùÐjÐûúyÍ58h‡ÚgXgQqeJ¥Šà…ê8óЮ׬¢¤nƒ†î·ÕÒ3UæJê*˜n’´Z`ÖVÛqL'”¬À…ÀèqGqu»êT¶ªf® Ec´OTVš©lj†ßQ^RR,q c …pë?ÿ íŒ¡4´¬9HÕ% msoÔèÖ„WÓ·T”RÓ%·|ÂÛeä©@­œ’TbÌÂ:¶O¨|Ep¸ÔÙm4)ºÜ˜¬ºª¡uÕ¤iŠZ;ƒ”m¥+b¢¢‚InrOsÄË…p-¿W8¢¡w®'¤¶¦®ÅOö»íEÕA£JÓ‰­qý4æ««C#•'/¤7Îë¸7Џ²ñÆUCSNÇè¶Ú¦¡¨{Ä!Úz„£L6 ³ë’Wáž\e8¼lTÎ(ê0¸TËQ,J;ap,HSÔapMFòž£ ~dø;ap¿åOlNSæs9”™Ü”þÕÀzQS)æLº KGé]y) )9T6íb$ÔÃXeOœ'ƒèø¢û|¬¨qCF±¶‚B”RÚfpñÂ>¬ü·Ž8Äz<3†÷=Üêz›¢íBЪ‡‰®¯[eÕ“˜2€ÀžiÑ#vÞ=œæj)µW*ëÅ]®Â+ÖËi5•m(¡N6ÁÊ“˜É8DçMÇ<vâ^ ýßH_)Cî:…V(ä.6Ú¤œËçßñx°ÞØÏË”ã^®Ú×Urà:º:wMR™¦)5xœËGŠI$ã)m4k‡š&}Ýæoqø~¦§üŽßTËilRI[YLŽùÇlñ'¾NxåYØn÷Qú’ë’ÅJÔ· ŒÎfY’æIäÙ‘æÆ+ápÂg#/Ô¡¥¤ÊŠH—ƒÆè?l&ƒüïÔMTRÿÄp“Ñ„Nœ|ú*ógpáöC€—ë>¡UIBA`'(Eµpú‹‘ PQH'ng1™…;õ¨“ÿÓh¥Îã“ê”NóÿPƆˆŽ@]Ÿh‡—ÅW.;jÇRê©éÚ@ šÚ++!èÏ–3”Ô;ülvÎ&+¸Ô  Á Æek8œw“¾²žX/Ÿæ•ôm´å½•æÖ2)Sš3Ý8¸vøÞM2íNšîlTÄá„Ü—LãW:•.1-x­ôûFK;ð‹ŒÀ&åÇ`áo¦È­¸¸LK€Ãqã0ö4óÿæJ~©Æ‰™ý9•n+™—Ù ž¦ñÆE(±‘ãLŽe㎣XÌ ·ËÿM§åô–?tfâÀ7n6ÊÙLyuÝ _Ö8àOþ—L¢vâÇî…ÂõÛËg·S&KðøÖq‘æq¡­›¯þ•þ%Ý%­úÏÏk Åjî…À­qQ?úJd6M°¸\` Êøåu2ž¶%$(¤8ôf’NâÅ.35NùMi)¤· Âׯß>ˆ¶ZÜ *©íGl8UdmGl8а0(í‹p(ò’U˜f P\²çæ‰h»EòœT:¾ø\)5ÕÈ¢m }`%kK`„“ŠŒ†øÎSPÞ=ç‚-¶f-Æ¡TÒ©Õ>ñTÉ+WÛ³òlåŒDpÏ|ájÅ;lÔM°ÒŠÐã^¬)ûã^?<áÊeã‰yEYéé~¡Û©)nžžˆ¡¶e0AžiDz|³—†eçÖ³§³ª²PÕÓ"–¢§)‘"†”—&1àÇË1/Lá ÒY 2–Ûe"Il&I’S‰9LÍ­CŸQÃ4ÕÒÕ„%·¨ótÆQ%bFÝ‘Ò<ÓTÄøá¦š…ªgB)ÐÛA@¨„&X’9ãäÚ-¸ÂŽr”-ÆÜZ[RÛ$´¥&e;Œ±Â3´ú&IïY<ø}ðµ;9Ìläûáa^óÌ‘1<‚xn™ç‹3.¤½1âLÆÌ>øž‰3VÅc¦¨bØËG*%ši‘ÚTO,c‡£äåy̺zBjOQïÛ„ô—†iÞn¦íâOެŸDòtÇ?=¿/(ýÅݓ޲z|t¸xB£z|.¤ô±RgÐ{â\7¯Ü¥3˜œÁ–ÁÏ™€T*†Å"}¾%À TÄž||,_+òÀ§¨÷Âà*Ÿ[Þx“ñ<Þ¸³0RöÌÉê=ñ,L¯ÊY“Ô{áp÷¬žl|[€ªpîC•I2·S=ñr Ãæ%2SÔ{ã1KrÇe¯«® ¸PT´@ð¨ŽXÎ3péæñé4ßïýdõø×EÓ´R’g!#ËÓ*ë  ÓT…(OÍ:qyéŽ^8§§ååUû]Y>G¤™oÀ÷Æî`“Ü©ÙÈ{âÄÀ­0{AZ@–|&`7+òô“Õ÷ĸ‡âOQï…À£áí&S,¦x’é‹2ÒA L¤$$y:bÍ €÷*OØ{âp Ÿž*OQï‡ÅÔõ/Ø*›Ì’I 9§ž3”\=?*òDº¨KÁ fNÁ¸÷Ÿˆyò›˜sx޶®ŠÛ¬ÚÂV^eËÖq í<‘œò¨wø¾-³®Î‘鑿;#q1O=S«¥‰'qõ„j(:U²:|g€@z^’pÛÛØH§¨Ã€šöVæS,é––5i ©=G¾3À\ã4õ¼'ç9§¶ ÏSªcéóí‘çE€úW0´ãº\ý1ž?¸õ“Ô{áÀªËéüIÚ¤{áÂËy¸½Mt¢RŽf—RP’¥ IÄäõx¼;a/ ÇÕ—ñËý‚—gé¨ÜtxÖ“˜ø‡TQ…ë]3—F+–„š¶¤6îð“)ˆÜy+„Œ[r9ë¨ÅŠ”»³0˜Ûï…¨et«ÒG¾-…,9®ŸžS,9úbĆIÿ]=G¾"1Ýî*¶ÛݬX.i i(DÎò`2ÚïÅd¨·?D½¡N©t¥Sˆ:>0ù%@‚fXJq©è®Eë‹híU µTŠ…¶ê5Pà y¬³‘̦óJQ"W­\7p755k/‡šy$¡Ù@Q±˜kÉÕÓ:²™ZeÐ{â¹¼«•W~«bнŒ!¦Ý[k`9™j$L©2”„Ê&gq\K¨Cw¶U"þTaÊ —Ò•ó$õø*•‰§qJPÊ¢p;鋇jã+5qi¶_RsÉ(S-(R¶H,á ï~7‰îÀ÷Ä@ w&p´¨’Ÿlãªþ¦p£”•#Í•-¥ÖÂÙu ÌÂjGÚbÜCXEËײ§\m+BÒR S°‰òļe2yï¨.Ô±Ã>Œª[.4°$v¥SåŒgÑéøsYöË™Uvãdýõ¹¤‡ 3ê"r'PF­æõdrùǯm°Œ!‡¦¬Dˆ‚,IMbïÆÊÀ\-¡À Êiží÷‘‹äÕ_ÕxðÊUöÉ™~K²Ç^djÊUWN>šÛjˆË»z3ZÄ3Ô]øøi%ÚÊxÓ)² Ièϲ,IGß§Ü(6NB™ÏÛ©(ÅòQí^8ÝX ª>K˜“иե›—$œõvÑ!<¥—¿æ‰e#ÕÜbVÏ¿¶ªK˜9]ÈóÆâJX\¸×^µ€1*“ò—Lã7ÉF¦åÆeX;lPBCÆ}0²”76Íãv€¦r#¿¶p²˜k븢žéj«}4Ng|R„·¨“7Rdf©ÐˆæÝ±ÏŠ—níÃ.qIMª¶9ËÌQU-¦ÝmÉf ÓPžABJ±\²t£6ÔSRÛèÛM5+)§` Ù@ Kh™ô@H c†3©cáÊ;+u"…®¦¦µå,g^¥[ê¨tOÑÔp7Bñb ÄÔÖª½ [ O…RQ "SŠ‹´S¾˜è×Rªä5™”¥Õ“蟗Y‰8DOUiÕsQÈm|‰T(¨]D¼¶’½b¼Â]‰2a¡l&÷˜k*Ÿ.ü¡sí0µË_F—¥é§Ù=ñ\å2ToZz|6„ŠÊOQï†Ø–¢sΞ¯ß i=½C¨÷À¯zéê=ð¸‡çé'¨÷ÂàWûëO²{áp Ÿ”ód÷ÂáVËQ?I=G¾%ÂKûÔž£ß +Øø‡Q—¤ž£ßÔªœá9s ”«w$¢ ´—BqXæÂ43Ý(žªi–óO+͹9z¦q™ˆ—“[˜õ‰mÊôˆu}ñbœÝëèûâð(¤¯UPœ•,:!U=Kô®²ÛÚKq J]Hñ ‘ ¡Ñ¸GÎx†×Eæޚꛭ}U^pšºw\[‰y 4°öF¸WÜn¼4›ÝíçéîÔL>ªu%JiE¬TØ}()ña<"MŸZ¡¯vèûÍÔÓUHñÔ RäpZ‰V1aZ¬·jž$¿·QSšš‘ÖšbžC*&ŒÅ@íñDáã0¿Ò¹ƒPÄ€‹Àyâ d\¢uZkeÖ™A‘:‹u9¤”‚O‡|8W®4òuQÝW:²*ôžS¨”¡B{HÙËáøVž¡žd)D‡)t'€àR€íŒð´ÓÀ :ÏZ’4sËz”O(‰,½ K» Ä7ßQàøl®·àá¥iÿ2£žogËÆ¦#³]É%9YN‰$I@c)ã#Ñáæ´¥ÒRË\¶çJЧ²Brœ8-© ùO¼’yˆ!#vï‡*ÙSjqÇ¡2çáäž©ªSS[N´€ TF3 ž#nøÏ `ãëË”i ÊfG03‡œË¥(m‘°ì&ƒi«RDTVsI8J}1©Ž @ÓÍæ>\¸@éÝ(Ï­,å)PI\æFBvtC„µÑH3MNY í3ë2‹Z­!€’LšÊ¢&S°æ3ØbÌD–z PÈùHÀå‘ÇŸl8#»™ÂoSÝoéÔMZPD¦&ZIžÞx†ssoS'å,égߊdª`ñe2X–?‡Ÿ¦.T<6Ý•íaB]¹WÜdèq!J\¦ÒT¬ÙR¢#11+äÂqRŠþý‹ˆœUé ÛUsH)¶S l¥?œæS$Ì2 ËÛÓ]é*k aô®¡–ÐòÂRe‘ÏD…NF58IãÚJ6KU¬ºÅKoù,”j,¦Y’è‘‘8M çÖ%·P¦*µUN…,'MHŒÅ(R¤’c;@íZ+¸[i«’4ÓR€àB„È ÆFF«ÜQPº ”…&ji`a¼¤óÅŠ^ RÑÂTj* 6¼ÞèR§¾#—ôöõw­Ö¤Z éiÔâªx@·T„%'ðåß…ø¢ŽÂýÞÛPîGØ/ÖS6AÊR¡Ÿ(Tð%G&žÖê>”WÔ>©¸!uµ3’¥®bs>¨„Ó~9©{Û9tZhHq!†²Ìèñb™õs8衾«UJÁD’!‰QP ß(ŠoÅ9mqìΖ í6âÜ ð$'Lg†I¨´¶´©)\ˆÄ“9Ë D\il´ÚBó.•g)$”³—¨²Ö,!i(KE¡‰H Ï—|^ Q»{_¸pØ©(sø†ÂaÁk.[FtŒêL‰3ÃN,DÒÝ ”ÏUµo3 b#5X¹Eï$^H(H (ÇÑx,£t$©º¤aéLa9óbpYu´N¯IK{1*Åg)˜ÔQk†]Ji K”)표I¢Ì‹ Ä6)8ËgL8-2! 92‰c,²'ˆvÂia†ôO˜²æZ3ªâÎFÀǬvîDÅ$Åãofüþ"}Ÿ¾/ BÁωmô~ø—ÂÙ*ø‰Ÿ._¾1ì8\CÄÖžª¢UÒ¬²ªÒ¶im‡_q×R‚æFÛe.-JÈ‚@Ñ­¢º7C ~§ðZ“G;Ëir¿WËS­‡Òú•NêZy eI!ÆÖ°…$(m"@ĸöbX®_WxR–Íu¸ÒÖ.±VÚîM2)ªZM[4âJU#Î 6ú3©).4T”Ìe ±E,ŸTík¶R9}­jž¶¤!nŠjJå1L‡•¦×šuÆ’)³-* SÙ¶§›AMÏýRàjwª›~ú 뤫%·rµPÛÅ…4µK*T‘<û1‹´{)ƒêWš¶)…Ìç¨S ‡<¥V‹nU–}üšL8îtäCªJŒÄ†"&Ð0\>§Û¿^³Z-.åÜ.«µÕTùj”Ó#Jž¡ÇtªŠ;«C”á B$LÏd6ÇØhâ¨,X8±›EȔѻmv¿YŠzЧ³´ò 5N—W!EJVY&Xá dj«ú‹Â4Ž°Û·D©5 °òja÷©Ûj«ÿ.åECI[,%ßÀ§TapßÔ{#`¢º¤ £Y]HÅ% 5WT‹}A§qÕ6Ã:ˆ 2Ô%9L³¥´S_Yxp^kZ¨«ÆÝ¾‚çEsfž©ä­šÓQǴн› $—Ê‘› aÙ°ñí çŠo¼:ÀqVWÐΪ™{MÐiÚyK ) ¦Eì MRÌ00¸öW¨ ~~˜êûáp K»3ޝ¾'½qÕ÷ĸ½qÔ{áp€Ó>!Õ÷ÅT“Þ²z|*÷†jȼeÊS mù|A=Æ_|[e—Q”©À3 ¤îÛ ‚½N ÊNþŸ¾ é½)gÏßáUR]ÕDÖ3IRãž/á·çñ³÷Âà·õf¸Ôßì•í)*f…O¦%—:$ϲ%Â6_­ÕÕ¶ZêFœIv¡…¡‚óáid~ª ¦ÀÅR\ç(ÔL$®ÝUyRÐ¥l HÙd%—-‰zä0Úg9šVÀ¥’4Ö0íÇ–%Ç¡êóÿOê+*^¾­ÇBUq%dm ñ1˜tóá®Tö:uR™q8߸qR e9VÚ0çé†SÌ7ÃuW:f2Ô%“Cq]Bs «0JñwÇ/=_2y+‹x6ù]vóöÇ)ó¾Ðb¡o4}6äN%&Rðòž¿§™MM5΢•ô0†gÂ’¶’…¨oÙèìDÂ9ÊúkWWF‡êkÃ÷%¾uò•6Þ\º~4‰rBhwo‹‡½haMRr©!²B%5 gˆ‰°ë[-¯PPSдêKtí¥´Í'¢SÛ €n^e»}RÉJ‚ZYʧ$žx· äðv_ñúF[}¥/L©Æ“%•’dDùâ\#m/ÓÓ<ËôþíÖP[ LüH&yWˆ²{!p¬×Þ ½1RÝ[hÕ6]J'Rs&F{Œ. ŠïV›U‚·‡Öµ¥lÒ†Nƒ¹(>òE;9áÄQef Z(‚Vœº áþÏâ7ŽiÜs†*î&C!L’} ±-ñœ¦)×Á?ª¡”iZÇ›BTL '8œ0[·Tiå]NdH€™ÊGž.3 B\£Kª­ÓžXNSåØvĸ²Š5@-E—RœVÞ™‚K)ϦVqÊ¥#ÃÌIœ8(ÄÖ/#EÀ–”¥È !)îÆ5XÜÕ@W…N4FÙéJ[ñÆ%Å”EVBš ™)I˜ç"%ÁJ%\B“PÐPHüæb¨*5[ z^)$¤ìÀí7óM¤eì ‰3ŸÝ(µ'•eCgDŒg…¤]Y&ÀrÊpàpïíÕ·Äœ>‡JóÔ·%€}#20û"GWn>×õ}%GÌÏß"ž[ ÔËâgï‹p£§U°º=Ÿ¾$Ì/õ»úx»j-T¨¯«b¾±ZN-L4muH%n¥dô¼3N*Âs‹|5þ,–¥üDßÔÞîµT­ªéGvn½Še-e‡noÒ©´²¥¡iC4ž%œ³VÄÈá›bÜj£¼Bž®±½C@Ýj,•–zÚ®Uï…®¦˜Ó¥B‘Ô)èX‘s)V]‰ …ÀÙyúMuz÷ryt4·º ãT©ªn¢ã[B†Å3t«J™§JÐûJCAXÉS˜8‡ìÇÓ»òmQšš]DqSÜB¢52šw..U¥3É=\‹R”ÿ±‹p\9õŸK.¿å7J…ÐÒÝ­—‹ƒw wî5´†A-¥tŒ¥l½•Lælá<¥,Ñ. ^ÓÀyL®´?úèü-ur¹󦢥•3TÓ~ãD%63ÍÉ =UÇ….õ\^»ÊdS*Ìý°!Yƒš®¼‡©HŒ’F'4ù¡p>sAôJûALÝ ]õŠËu¶’½\«¨™eê*h]L ¦¡•¥€¤æJU9ƒ)ิ_¾Ÿß]½ùªß»;xþÝÔÖ©)b¢âºöVÚ©éª3:FU²BsŸE~Xô¯‹QôöíAP¦)+/Ü!Adfâ°¶jY¦¬BÅFT«*A¬N)ÌpV ¬{>á~(²q=í×<³¶»Á¥©IqaÖÞ¦¢b‰MJ$ |¾p¼ûå(±0¶õ᪲O½Éï…À:UsøƒÙûáp•WÌO³÷Â౩‰öO|K€4ê‰>ñ#ì1nÉR?1=Fui\€ÍŽUnçLH”Òæ>ȶ®_ƒ4j mLËœÇ<ç—¯áÕå·/ôuÂ\õñž8Fíãˆá \xû"Ú–¤9¬ŸÉXtsŰìŽzý‘›DÈï¯Ù +ž¾Þh–´¬>)rÆfV9–¾aÔpݽÌÊSˆÇDµäŠ—bN ª2‹nrñ–êk­âés­§¯E*âX %ÂC`ÉY”¡#‰ŒFw/WÉðO8¿\[ÇñÁW†åÿöÉÍöø¢ÓÍf'‡ø „ÞPÙ*T`}¨Qk*ÅÄ„Þ@Çí‘/Û‹U‹?…9+º&ŸöÈ"yD¥˜álåÚx‘Io)INÕyTÿT),Ÿˆ’Oýn`â¦n_¶!hmYšuæYR²áá0§L¾EÅkäòÏ}WâUÐÚ/4µ T!TVz›Å±Š¥†UtC*P]~²XiR2[Z²Ê{gÜ·wÚã¾4P'Õ@,‡‰á£LÛ.ùÉ~ »{U!âî˜!a%M鉜ÃdKgg½f†©ªÔV8çFjï¨èí9Æ­U4o¾”2¦À390ŸL.±Î ÖØ¨HˬHÈ™‰p“0ÍWkr¥y•Tâä å†$Ä:øüÚÅTIMÙªTÓ^ùæQPÖ^x˜úa¹¶*™Ê)H‹ne¶GÏæf ¦W§‹ƒÙ…À.æ3XŸD.(w×ìûá`†Þ˜'Ñ ¡ï˜:¡p Pð'Þfåwn~ÈX!úãªdæf»#ãP¸MÓ#Ÿg4K…"¥ Αšj-¯w:b hrCÞcÑc¼S-æ©ÒW‚j8x“ôülªgøË äð_dj^Lz@äsævDhµ¡Ítx÷+tE€Ì®üÎÈÍÀ9ŸÄì…À«ëÑen­~ÒV©&fI8£ÄQqõemZê[µº›KH̺¢¤ë%¥+tÌS†è¨ö4îk°‡™x8Ó© mi)'a‚ùz À-¹RýJÊa¤‰’Î$Ëd­—×´U¦õ:Ó‚›}¢‚:¢GD€‡<€^!£”Ƨ åÞn—jG”ËVºŠÚbÙ*¨`µÄ”-ITú"JáÄÇâW\˜¸XÚK RJO4âR¶F|ÑŒ]¾NWä—|!Ùb¿¶B5.ù¥•\R.WtÛn,0Â]M¿OªI$‰¦KL£‹ÕïùÿTçî\qL¼Ž]èÔ©fÒHÊ|…Ámá£é®<`ú¤nÔh“F®Ù9 )¬ÔqPAËy¢Y–Ê,}¸.%”GžâÄ8°›æA*ëœä7gLðPª¿‹’¥ÜèÛÊ^\Î\¸®%”¡»q:TSú*ÎïíÔ?≱B»xOŸ¦H”Ì©ÔgýPØ¢_ƾ Ým1J–@P§V'¤™cœŠÔøå·R•Õ±-†Lù„K)o?ÆŠ-Ò”†_.f'öÂÊ15|he©u¤ˆòç·Å (¦î\`R+XÁGm1åÝ%c8¹O7·SÅŠÊŸÔéÙã`‚yv.Q,¦ž­¹Ö~¢jêPö•VF–„§.D’?ÄbÁ–4ïä{yý"4Ét©p°™.\Ùyá’°pó;KS7&ªy"iÇÒŽ~9z>f51ü€‡%éöFžpR]ÇǺ["ÂN—4uð‰ øJ®C’ž}»å„D—ÄÈŠ\µ³Dû«\ÐÛjZäœdIßûõ74##/±™9Û.¶2)2˜RV\DY‘Ø-½ó1—ª"m ·§=A?å&`y¾,»Úœ±V±ú•9X! F¢3 ¤ŒÓœg*˜áéø™Dy"eè›K¥#+‚YDŽQߎ>SÌ9\_æÃu¯6¤ê²Vó‰§2™óLD–üyk/,›ßÔ0Â\Ï@RBT2¡ÉãÍ8ͱv.Þþ¡-¢Í³)ñeZe2%µQ¬d¦„Þ8ÿTR &_G®F3·%ëG½[HHÈÒ¼JP|†1vŠn>‡!¿«VW*ièÅ5È\\MQ¨ òÈS”ÆÖÚ¨MBâšFMd«>r‚Š3— 9×O­T-Ø.W }a}»MUÞÊjPÂY­j•jRCo-ÖÒ´­Iy(^I”¤ÊBʶ߫ ¶ZÓþBkª*)’Ó×Ê¿/INоF³b¤­c'½÷!Å% R„L#¦÷Õ«#J©W•º8Å-ÅËBª¢*Bë[©4¥¦¤©ºJÓ†@p瘋´(»õjÌÕ^‹´Õí0ÓìR\jÖÕ:[£©ªÓeô—µ‰ÈΦ›ZQ?†2ÍÂ2V}J¯«¼pãjJ¤Ú.——-˼T4À¦¨mšj¥8)Æ©¨ø´ã*ÔÒR¤ƒ”˜»@ÛÄ|ix²ñ«6Æé*®”*´=^å5 lBÚ¨B Êßq„¥µ3Ì€œ!´ÕýbáŠvÑVѪ«¶&ž–²ºäÊ Ò1ZÚ^eo%×Zy^éiZƒM¬¥&j.ÐCõ'Z¡Ú)ªïWDÖ\šò¶æhµMo¬U!qÕUT!¼2Ì/3†e(Ú=‡“ë6¥mÎäš:êÎbÍm½6í; jRÓÔù¥>õN£¨˜JIÈŒÊÁR\I¼mq½ñgÙUBótvz†š¥¸„7¤´9HÅGŒêfYx©D²Jr8ChÀ6ôϽìÚ »½ÎÁhMß™Ø!´‘ß›Ø!´–ßÇÞÿOß £ÙGMß™Ù÷ÃhßmÉ€\$”(l©Æ-‚†^—Å=B-ŽW¥ä¢„OŠ©´™ ØÆ2ž^¿‹Î_ƒ«¦ñüßéÒáä»Ó¤bï`‰´ )§5P5 ÈQCt£[_”õ¤Fv€t_ùǨChö4÷Í유s‘fi»Ó÷¸¢ýS mÐ@)“g Ë8Z)l°®Øº„Sԫɺ½FiŠFVбXAõIÆ[¢\+¢µ‹…²¹ ;RÓ Xx2€¥¤-2,öE°]áËÊÔ½M”6ÚÒÛ%`%ÜU™ñN#E Z(ÞY„!M¥ HVP””xg³Ã·–-«ŸXßÚ‘RÛQÒ: „¬åñ KnÝ‘2Éq§'éU;ÎÚêî«UÊÊ¥•«ÒW‡ &{âc›YÅM{=àeéb÷ôƶ†Y§”®!».™ô¤„0…¬¦S) ˜û c{èé–3KHURñ]P<Ào…²[¬>IZT¥¸œ0aݶ -¢­(—3$€Lùù>ØT,¢ªw<õ3£!›`ä‹P¦ gZHÓR†]„¦s=pá“ * fâÊg°dg¦pà4Ó<âfIœ„ÈC€ªzGHVO ” L¦ ¹cSIj=ERV¥8°R7ì~ž졲¥c蜄lϦJ9( .É’@î3†Å3•8)I Äå@ÄœLùD2ª)ª‘hÓW2ve¥\†%Á<²p+ÍSÜšÔ‘óŠ8'•)<±qš†þFWœÌz½`iù|^ n2q.§TÊT—rƒ9 £—¦,ä,Ók äx(ƒ 0;ÆØ›BÏu´j ½öÏáðÚƒKOKâÏ—— ò\VŽ5zŠ¢’ÙGMYo¨`%>2Ûé$ Î~ «G5<'Æ\JZOT&‚ÖÎQúe9Ì\˳Q@þøÏÜ5FãHKHXJRœ¸0åDŒ·úw—d®F|ÓafYyáp9ôtvû÷1J먩¥[Mk6‚0)È”œ%(p1½ôÒÂë¯8¥-%çRì’r„ÈH¥2ü*D]•Ò·p}¦I,¶…8†ÔÊV´CjQVNIxŒ6‹(ø«=rí讀ô¤%¶BV€T“)àxÆrˆü}_D±2âlTð ×á †95äú¿;ê 3Îpt L!ó$ñO+­¥ ëJYS3“KlÆ8e×’„….¡ s ÏnLãXÐsŠ\°x91áPDûâqh`ÕB|Oå9pNYáö˜p"à2K˜ŽT˜±0¤½QT2iÌ‚À POXž1¨È4T:&”);ˆÛÐLfâÖ—Ec„œ®€H˜IIôNÂRéªu>=T()33åœ7‚•zº©Ji*#™ œržCŒ ¢T^Ïî—³ ¹T%ׄcnJ.¡&«LºêÑ’e%Iz6vBf!ŸË”R*T¤ï*@ij”¢p¶]Ɖ¤ÖY꣭æÐ€³êåQÂ_¾,Q9N´ö aù~Då†QÙÍ =GÏ>È‹´{%¬~_û"$åËǶN'¬â¾ ¨²-°õeSÏUT2]a”.ßPÖg‡Q SJÀqÙg†¿Ä,ŸJ\¢½;x¸]|íUu-É‹¢ÆŠræõ;‹S^ñe´6ŠD¶”œÄí*žÜÛ]Ñzª~¯áõUÚ[¤~ÕSh¦¹SÚPÕÀ¦¡’Â]¨y/¬¡'Ä”ç8Í0±ª¿éоÔÜèݵT~¤Šd×þ«kEsˆr™”S‡)תÞ\Í6P©‰‰ò‚±Ñk髨 nõBtø…Þ"ÔЗkWY¡-MÚ™sý¹wE.ÞúRë|O]u¤rÔí5έÕ_¨ÚÑWVÓC‚ž£U¹%z`ŒÉ9IÙ -[gÒÞ ¤zÃF»ó+°ðÕÅË…²˜QŸ2¤­ª†’ÓÏ—ò{´Õ–ñ–8IJގ»ƒÞªâU^üþB«[Ö½ ~3©wS6a³$²Ëí‹cÅ[¾†¹k4飩µWQPQ×=uµ&­ÌöúVèÃÔþù:z2™¶¢ œÎ3–+qàΠ᢮ö ªººû“—EÕ{suMéVVª¹¶²ªªœ¶êú’‡IR9’0…†p·ÑË×Ú+îib²÷Ã4\?V„4M3”ìT¶¥…gN¨aÃÃèíÇSÃüx²ñÖ¹››NÛnÂÚŠuSúj)©Z¤2é©¶H(œ÷űêÓøûãìˆmÂëdChö2ÿÎ>ȆÑì!aÿý"G²ˆj¢s/H†Ð iß›Ùh q¥š¤ ç*±°m I‰hnEîYêm\»Û Y¡šðMJÁÈc9O/OÅʦŒº ŸÄ=B7o.=!m5ÈxÏP…ª‹BËȆd+pæ‹.¼}é—@‰h°BÏæ¡Õkù‡¨BÂò¨¾rSŒ·#WÀ¾››Ü=B%€´“5™m8X mDO1æ°°…y…¹‚gSg–çl£¨e×^m·Ckqm¡JGa1™–¼qÌ~,Ü%mE-‚‰-…­¤©Â”€T©m2‰Œº|ˆ¯$»E+Óìf\¡àlœ?p¯­¹V1vz‡5AmM¶ÛK ˾kï1Ï_ÌŠ˜þ.×øµðÔo,1/û±Òž;0påí)_žÇì…¿è7¹a}}?ü–å¢ÙÑc¿(8Ÿ×$*Y´‡4jalÅXoƒÖÝ#ÿ®èÍ%¬,W¹c{z\¡–Gî…¹±^¥!}|c3î™ßöD¡ž—‡ï~5~½P|jiµËÎ#R®¼œ\~r–-5#Ó„J,£Ãr™*úù;Éi®Éˆ”Zƒ…n³9oÕ žßt×t)lšn¸©œÉ½ÔI-µ´£(-dp}sr*»¸¹a‹-ìŒÌ‘Ì­ÁTµÈ¢¬z©ð·^ªpç )’A苎\:ù°Ök³Ñä^ÍNÁ‰q.· I!Â2±¬¤b±k­š‚¥ì¨vBCfhç†OOɨ˜ü@…íÔ3è©——ŠC˜C€äµV™+4è:‡‚Q §”04³#¨pæ,5üÎÁ ªi~]Ù¹4ä3bQbFZ ¾‡©C)2Qm3q”'!·I0õZ†“ƒóOP…Œ›cU6ê†Ü ^tŒÈNÓðʲ‰h¦¤[T¬³©ðДÈøD¢LÑžW”¹¼YASWÃõ4­U6ÂÜ ד4#aU! “¤&ÏÅeªéMžBcÊá9rç„K<—Sfâ]ê\iB¦Ji'¼ ë‹›þ=Ä)$¢êÀŸÿˆ6mõã5ÉiúêTäóÒí#ýqh´Î%I2®§˜–!‚?báE“]gâTÑr¹™§,˜#ß\`‰Gxs‰àPº2™a$°Dǵ–Õs…¸…•*æÖq†,Ï·ñD¢Õ<#~) 6’ ¦RĈ˲^(QlÏpuùµ3ÿTiJ+*eRâAm)á~#ÿUloÁµÚ¨ÍrY¿ã7Ý ƒtBå¹L¨Œ× -tðýñ±•5”ÒÝî?ûñabmĺÐñ¼[h£vàØ }%¶r¤Oð•*13Í=^,b|S—w¸aФ¦NTgß‚Ln8ys©q²„Ô­²BgÚ"í ŽQ³my±ÿœ}{üDݶ§8öGpÕ¥ÊÅ¥c„Æ"7|.3XªÕ¾±¹e¯uC‘iB»e'89êzÅ4Õ@JÎÕ”†ù³,ã”2~™uœÅÑÁ¾E¶Èý‘šuû˜zâ&Žóèùô =-!?Û™ÛÚWè÷|å_¬½üºmËìÂ%7÷ñý®‹4ï¡+¨SŠˆ¥ ž¡· ²‰_IÏšz„-‘ ¹3ïOP…‚[sæž¡ [od9\š·…ˆw{§¨BÄKnF©ê±m'>aê±4ÜÞéê,LŽnpõ¶ C˜û÷’ C›–z„K w0©jJ3s“•0°Âƒ/LöBÔ·)ÄfQ9HRpqʃEÉüC.I¶Ì.¹zgª¥-]9œ”FÎh±!¥úæ}-¡X²>ÈZ¦I~3ÙÂòûð3å8áËg€ÜªõdKS$‰àv‰¶ AΔ’ú€Q(3å1g h ¦t­g(Bа3ŒLÄ5„ó‰Vt¥VÊRÒΑm90%2‰èßž?\þ-… ”õ æ[“…”«j’¦k3]BÕ>bpŒxú=;=²‰ÿÕÜ-«æ¡-äM5ËP‰`”G¦{!a- æsÆgšGŽ53ÀhB½cÙ°r,Hö@B…ŸÌ=B(U: Jä³é¨œ±d86³øÉ2i0õ¢¥OÓ8s¡t¨QdIDbwS ƒ´–G¦z„Eެ6j©¨PÒœ#$0’6ÄÆ)ÓÍ–ÒÜ_®{"¹J•RBÈœ°å‹”´Ja.¸dµ©gøŒã-gœRæ÷ º[†@¡Éxz„"`R™ 4í²&‘„‡$&Cò.~™ê¡"þg`……Ô¥Zûy9#Q*³hQBd²‡$L¤M'>a D¸MÍΡ;ˆvšÇXú\9Ñ)‚4ëàÇlñŽí4 ¼(Ø t•„'12$™cŒ-/Õ?‹•ÅͺlŽ%.Të#`ÞêcÏßëçÙÚ ¹/LõÜtp•*P°ÜÊæ3' XF±ê†é¹ó;AbÒþg`‰b¥¥ÎZ‡¨BÂjP±¥5™¸oœoòÒÏæ™ÈšNñPŒÜ i»€.¡)ô+U™¬’W† D†—¼=B3`]—Å=2TK.áïOP„JÇ-ÂÓÄÖêTR–ÝJ––#Ûõ·§Çä¯ãÝÜ /ælt[y…-¯æ+¦BB›Ÿ4õ›@̦×ç“ãWÃV2¢5E7CF“Ÿ1]B&ÐÂi¹óÔ!´ ¤áüÕumd^oˆvrm”/×WP‰´ i®_õ»@šKùŠêÚ /1:ŠêÐÚÒ_ÌWP‰´ ¦¿˜z„6€tœù‡¨Ch 93ïÔ"íÚn|ÃÔ"m %·>aêÚ4×óP†Ð ”/¸z„6lªõÏdWRMr|dÊ»VœbÚ4̽2:¡j¥oq]±@Ó’ÅÓÙ DüÅvEØ)m’ò&â¦BŒðÃd[ Ó?1]Ñ66­º‡¨wDØX ‘髲R øñ«Ð<œ±¯@ÒÙ– =‘, 3óÙ  ÈøÏÛ(N¡C9(ÇSz\ÛWéõ9VIÒ^ÒcžYvtðýqídØ©ÔÝšÕƒI$L'†¾DÞrèi(Èê+“tog"ž-©ÆÐ²’í§·ÃYLÏSô—ódM™BÒ§ñÔ!°:j÷Š—Ù iµ:5<[pä©K â(óáØX6°IÔ=B¤8RdáÍΧ ¦BŠï9Õ9K–5!¡·>ôŽl#6m[ÜQéiR>ð™ã°E‰ ¥l–¾"€ñl—)‹!ºne>ðá³²Ùmn»UBËëtçZ|Rlå2·o>ç1y6¸©ô±.%R¶¢Âq@³X³#5¡ÊšŠB·]9õƒ`Q–áÇ'o>T7©¥‘-SÔ#Q—gJ-C0‹v§B´ušD¥.HN]ƒtWóUÔ"mØX!0Ÿ°D¾ÁU-«Ë¹7 N‘bymµdI00Â"Úkù‡¨CnÀÖ?0õXæ_©^¨´U2••¢A$ qDž]|9k”Kc,¸@ÎA R‘¨áÏ)¹¸&âªv©Šª–K9™‰J=¦19Er߆2¾=š‚/ˆz„khrˆ¨*¥+žsé&XXEÆTàÚçñUÔ"Xškù¤ò`!°! ž.tlR…M¯ø‰!‹ŽAÅ¥áïO(2, 5“ñOP†Ý€Ó^÷NÂò¬Ç¼'Äe€õLkà9M8GÅWPŒì’Á‘tõlmxIÃÔ!c-VTÍ—Nuìü)™‹· cÒÚCgæ+³º&ÌŽŠ¾j§þžè»v4½šªì‰·a™M«Ï j+á«“”F¶ã£qô4é+櫲3·f2©üUvCnÂÚ*Üâ°è†Ý€-+7ÄWd6슩µ$]PnºvUƒ*𮡠»Y\¾*º„6ì€^oŠ®¤ÃnÀ†WóTz@†Ý-(ïÙ »¢¹üUumØMcïUÔ!·`CK÷Šì†Ý”tÖ6¸®È›vDÓ_ÌWd6쪥µãïT~Á » d_Ì=±æ”*P¢²}ÚÆ2õ’bÚYލZ¸×Ç*¨¶¡§”5ªR…JX¦S áÏ*—«ãaŽ]¡ÔÐYüÕuèé³Ëê‚Á޲ú‡t6 [*/¡:¦e*‘Ú5h9ŒžT¾Î蛈)ÜùÊêÐØX0±ùÊ=Pœ…tΨdœ³ž±fx /æÈΕ³Q]Birø‡ˆXXl—”E”áÊbÌðTÈM;¥×Ô 9̇£,wDœøk ¼b:‘gJÞ iI+iœ 2RJ¢£†#6üñYKj™RR¢^VÎA»ì‹³“ÃU7*u⩃Í:þzÿ§º3³ å\2÷Ëìî†Å—^÷—ÙÝ » u•|eõèl"˜Vù]Û²–YüåvwCbÓË9ó×ÔžèlåÜž//ú{¡·`|²þr»;¡·a<ºå-evwCnÀyw%-eôÈwCa<³˜ûåuèl–sç/¨wCe.¿œ®¡ÝdÈUvC`4ùÊêÛ²¡a9Såú ¾|fyÉʘ–†¥µHxÕÙ W"õF§j­ª W»© 'TóDË—§ÁcŸñtôUóÙÝ·šUÒ zjìî…¢Šl‡Õ°ã‡74X•04~b»;¢Z!hüÅvwB$@ÒŽ‹ìî…ŠÕæÎ¯Dã‡,YžàÑ”‚ÕÙÝ´M#óÙÝ PÓ?1]cº|ÂÓX b%=§š53ÀÏ{J“i¬Pq@†W.®ˆÆSú]~?9âµ™¥ U&e™é"}]‰á|óúå©m+!÷Šìî‹n.Síî¦jIÖY;7ý‘œ'‡»ÿŸù?¤=iGóÙÝ·…4•óÙÝ °©üEvwBÂ[eEnE7 æL‚PÃQXtwD±mnq]б4Uóý=Љ ¦A!^5†åèe!Á¥|ÅvwFl@Ñ8ê+³º!ixûÅvwBÂé[%ŒPÄòrôF³žC Jϳº3jM"¶¦^R›#ÀpÙÕ×(£ÃJõÕÙÝ d¦Q§AÔVÍ‚]ÑrŸÔ1YyËaJÝZIS‰J“”’£-¢1Œ½&£7E ( «T„³³=‘«y¤TÒŠO¼T¾Îè±"”í(°ƒ¨¡4ŽNNˆL†h«æ+³º%‹i+æ+³ºP…h97èžNNˆ±<‹¶ÙÈ™8©HrwD™U´•óý=Ñ-ymu@2N^è±*æÞ¨Me¥öBÕïJg-¡@òEëç‹=r·Eºu¤ª¬·nû!3”ܲިÜ~ÚêJÖœ«BpÅHPWîŒåÌ7áγmi²¦Ð ê¤¡1³|[r˪•MÚNuFïXsF±”4´¯˜®Œ;¢Z m[ÜWô÷D´´¸£Õ ©d‚Ô–£ï'!æc!Ú*ùŠìîŒ_h¨Нéî‹`i+z®ÎèXKèPuFj>¯ªy£xÏá¥Kâ+³º1`é+æ*gt,ʧñý=е†:š4šúw³«:BÒ ÆŽˆ±îÖ9þškÒQaÑ&Y.¯š¾ÎèZ'—PüÕöwBÖ”Ò¼òF¢þ¹9G4jøn>†óWÖ;£6Àè«x®ÎèZ‘j/³º+¢¬ÇÞ/³ºš'ê N#Ý UÃ*Z‹ìî… UóÙÝ 2sz¹ýбd´gñÙÝ °£ù«ìî…‰ ©|UvwBÀK ™÷Šìî…‹h>"»;¡bÌWgtKÒWÌ_gt,T4¬}â»;¡biŸ˜®ÈZ–ã~ù³˜ú ¿‡š–̽%vwBÂÜmN=˜Žè»RÅúoøÕÙÒP5†+TþÎèZ¶ýúeO)ÇQÍ%M K êëÑ-HHøÕÖ;¡`†ðôÕÖ;¡b¡| Ê>g>qÍg…0·?Æ®±Ý±4ÜWgt-H Õ"váÝ ÓB†e`péè_ EÊŒÔ[êJÔJÛR@ÃxèŒÌºxs¬ñÈmÔ«j†µ8°¤!)#ây²¼¦ZtŒ¾*Wt&X†j$Ò¨:ªg&ÞiM'âÝËí¬ï¤¶ÌT·b;£6ÂIüÅvwBÀÒþ5vwE°–›9œšÕ‚¥<1ÀsF¦EÊ0ôÕÙÝÄÒ1XtwBÐ4̽5aÑÝ §k2TBÔ$µ %ËÑ)SôÌWgtK@R2‰ç_@‘ý‚%¨éŸ]]Ñl*™¹´u NrôE™ ÑžÅöwD²g’éh…3 e.(„ì8oû!me–Óf–Œ§¨®Îè[%Ò·6ñ¨Llú#=¥äUÓ+m qh 9qÊ¢'³|câ]|Øk—-š'æ«åîD¹›9I+Oáî‹b´íÍ†äµ ¤a‡'D&EôOÍ_ô÷D±&_GÙî…¡U NéÔV <œbyCg"IqB`rwBeM ¹Õ³›º3aSqZˆß9Ú#Q(]K2§Q+T„¥³dú"ã<‡écñUÙÝÕm#?ˆ{;¢X“€ T¾Îè¶RÑ Q9’2ÌKÒqÝõWÙÝÀØuU·ø{¡h°AùŠìî……U Í“_ xy4\d80¡ù«>ÏtfÔtO®®Îè–Š–É2 T¾Ãû¢ØK­ÉÖ|jôˆžxO4j'€ý/ˆ£ì÷FlÑùŠþžèXš$OÞ(áÍÝ R^G¾dªdœpäèDðÂYÖ4»£3 蘾±Ý`C_î+¬wE±™MÔ3«áœpåè_ ÇÐ~‡û‹ìîŒÛ£/Ì_Xî…¢hÏóÙÝ Ò?1]Ñl@ÑÏñ/³º¦pø‹ëÑ›EtÍEõŽè¶ dÌûÅvwBÁÒÿq]б4ÜWgt,ÉŸÅWgt6,ªfn+o7tM…´ˆüj?hî…¨hïή±Ý HúêëаÖ'Æ­¼ÝаKg×WXî……ea´f$äY Ó§‡¤®¸¶8—Ä(VZ‚J±©‘3”†SóË—¯ãDk—àéåJ§%« Oë³ÇKÿCí‰ajG¿@ÎdB±'f"7jak‘jŸLcd@Ï*ÕÖ;¡°²ZôÕÖ;¡bšÜT¬PqŸLk)†—9 –©ËfÑfYŽ®´¤Û\J” ­eƒ?º¥Ë1·œ×…^ñ[9GtX•U†¦Â=â„Ò0˜äè„ä.1]cº% éùŠëÐØ"©²)œñ¨“ÉÉѹ i¥eQRðáÝ,”Õ!).(¾cº% &=5O¤wCaž­’TÖ¬%¼rôF±ËÝ,>"úÇt-GLÊYÕÙdL˜zjìî†ÁUM” ê>4òzÚ5Ž@©ƒï‡AýÑ"E|¿ûŠ™ß1Ý K8ȸ®±Ý }¿…ãV+œ‡šäݨ®±ÝÙQMŸˆ®ÎèZ(–ˆÇ:±èî‹9<ß¾dgV*;ÆŒ¸Ò—æ+¬wF6Ko¼WXî‹`¿ÜWXî†ÁN45Úš”vã>nˆÖÜé üEõýÑ›2%ñ×÷CnÂhã鯯î†Ëlå¡çÀί†wóˆÖÜ:GÐ~ˆŸ¦®¸ÎÎi£þâúþèmÙGýÅõýÐØÈâ/¬wCa`Î>šºÇtM,‚>"úþèX…œ>"°çбRÖ'Þ+¯î‹`é†uuÃ`4Ü_X`M8ŸÅ_Xî‹·aÉ™›«ëÐÛ°:#æ+¬wDÙGHoq]cº&ñ¯¬wC`Öß¶òýаtçµjëû¡°O—Bj‚ó¨©M©3'pP?¾"噌V©tŵeª¢aÒÐ[Š B³·âÆiä‹97ŽsÜÃL%=Eý‡î‹»)Æ>ñrÿtIÍ ¨4ìíCúM%%Juk Jqp_ —˜ø‹ŸOÝt,0÷«ö¾è›Š) %Ô2ª‚p)M´V”,Ä ¦Y„á°:C^YÕè9óˆLðåÓ,W\MçØ.'ñ×~Áiêyl¢£3­HºØX*HW£™#9a ­@05Ô3«ƒç1©ž[å Ÿ´Õ²…-J[J âpŒg7ÿ=|‘”ô‰6ÛM* tê,ÒAØ@ÐŒ¦!,ÞS-^\nZÏIÑvse¡·¥€âµ˜«?Ÿ$Hâ<™íù6h |E˦örÇû‹ë†ý€Sî+¬Ca™¶A[ž5‰*X`y#S*g–ø‹ëÐÞQª»[¬¡ö®q¥¸Cˆu Ip™0*æ†áÌè>ØuŠVÌÀZ•##ˆä"Q6Ró0Ó u÷ô[JÈRÖ°”‚U”LžRe™ÀþjúÄg~ÀùO÷\é˜î†ý4ø|UõŽèmØ.¦Î¡· óôEË$4Óƒù«ë7ì'–ÙïWÖ;¡¿a<¼±Ô__Ý˰[ fa ,0ÙÙ,¹V.aÃA•Ç\+KŽI™ôÌcz>LF×¥ÛïW>‘ÝÙç’Û <Ƴ­™åZ•$”’# ”Xϰ,Sæa:±0aÙ ÈUä2Â5©-¢iNu­)Q H™ÞT@7싊÷Ö;¡¸£Ì°µ@I$KgDj3ä5 øS'2ñÝœ•–ãl¹Q•lj 6¥$)e"g(8™ p‰¿d3Ëÿ¸¾±Ý ‚ª˜“*9Ôva‡/Dk¹Óÿ¸½óÄwDµ/³Þ/¬wCtO/°j+¬wEÜ&¥ –ÔR¼I$o rEÇ!cO³Þ¯œÌwFvËËUƒÓ÷EÜ]4ØüUžS1Ý †Wê¨ÿ—óˆSÌ”©ö‹‰ÎÚJgiÚ‘-æ.9°ºZ‚Cz¥)JÔZU$¸&ƒ†å G,g`åS$]_Xî†ÁTéeæÃÌT—™Xð8…%I=a ÌY“­ E¢wìÀóF£.¼·+«ëÑ„§z¾¿ºöʺ¼vâ;¡¸SŒûIÔ^9·ã€oÇ@ß*>júã;öË |Uû_tMû)“?оA⋼ûΦ'\¢þÞ9z#[ñÑ×üOòÃæ¯¯îŒïÙÍ 8Ùª¿kû A/ˆ¿kî‹¿a<¯‹â¯¯î†ý…ü°ù«ëû¢oØCL'=UŸ·î†ý€4Ãæ/Úû¢ïØWËMGÞ®]?t7ì,)¾*úþèoØO*ί¬wDÞ}„M(ù®uýÐÞ}„ÀÏÞ¯¯î†ý ~júþèoØO*>júþèoØO-þët6ì"i¥?z¾±Ý ûiÆÝEõŽèoÙEHN¢Ìò«yþ–ƒ¥?Ä©s VJËn»ÔÎ…¨VTFcÉ(’éã΢¤ÝNj_´cväøcœWÅôöâÛ•SWšº“s«¥¡­·¤hí‚[Zs9í4¥Ja0Æl'Žn¼B›=E®«ˆÕybéÂï]œÎÕ*PÝBjè›mLùvÚ^‰KëÊ•©GøŒjÆþ6Šʧ‡â‡Eß…*©î j™§õƒ¬¸ÞT6†Ëm­„­’U¹JP‰cßñÕ}uŸ‡í”¬\. »×Õ1o¦z~f¡òÚÖ¯üÚM+AIikRŠ$%$‰ÈBÇÉoC}­¡v¦ð¤Õ\m6N8¤RŸ º~L >–Ò–eá^T«Õ‰cÐÔqþY|føh…¾õAe¦±¡ªm%4åU# ­òã<·Q‘iðá8ÔÏ °ã^4¡´Zøë£—«ï›Zìz,!rS Bú³· O>R£[ƒ_¢ðõ-Z¥i侪‹~¢ƒËrs@qY²åÇa2Â3dÌÉÕ¼UÅÕ^|]+iâê~Mˆ7LZ4¿¨·Hµ-KmUçZ%ÐRàHJ‡‡|[n¨âKwðû Þ]ò9ÖPAôD"G²úuPíŸè•ªït»>ûLØX¯UImµ.”P!„% N¦žRFy©[Ì,x+ßq]E ]¦ôýc´ŽŽºQ¦äh<Ú5¯´íþœ†šJTJ³(ÅÑÛákÕâçÄ7 WqôTµwê÷ªiY¥K–/°5 ºÞT%9ÞVLÊ*0ßlrm¼sÇ׎ ¼^¿]U+¶^ ¿èµML¤TU>Íc®¥ÝFÖCJò©(Êy7¢Gb‹‹þ¦]îµ— K/ª†Ùtj‰ÛrWoM"©S¥­©¨|öºÐá[E'Љ)•[‡jï›çÓN#¹Þ×ZíõºÊßÓRŠtSÒmëYi‚Ûi|éæÓV«‹ÄnÙÑõ'êo¼5JÕ¹NÛ–vãæNC#†‰Õ°uÂLjµñ-ýwÔÛ¬µ+âÞÔ-Ö]ÖÚiÅI!@V$!ŠÒ$äi¼Éüj1¬g‘ômºâZªXêë…ˆô•× Bjš …(øÓ„ÿˆF°‘u´B J”T™O›dKWϸˆ/·$j›Š+Ãuj\6–ÒSS”+qXZ*¼#6F2)2ñÑ,{-Mæ©·r·ªÚ´G˜müàŒLÐ¥% ¦¢ª¡Kõ"¹ÛŸñ=;®½ONG”¥¹§:Jæe„$zRJ|)’p„Hmªý~µTÑQÙC¢÷KÃT.T0ií£ôª§äÉ«þÜ8²ÈJ5ú$ÈFlzû=Óê%uò…¯WGlo"ž¾»õ&Úê–u†ØC’CôhRC佑É$N;?J¼ÓI,oÒ!Uµ ¥%¦‰h8uøÈÊ9bÚ‡Þî”lÚêEÁË?=ªáÐÒn¢¨%Rø,>pËïZRŒÞ9Æ¢G©áª‹ÝuŽ–®ùBm7GRME^Kúr$_‘œ¶LíŒÚ:ÚXzjëû¡`G®®¸XSIöFebU¼òF¢x ‰zJöŒfdBÂvg_´aj>ºý£ $‚Ò|ð•ðÎ9(_Ÿâ~ŠOãW´c6æš ?~Ñ…¢ påüÆŠsK:ðþ# в½£ÄѺý£ °™K:ý£ âgÆ¿hű õ×íX‚œzËöŒ,X2=uûFX>5ûF-¢=uûF%‰¢=uûF dzÊöŒ,ÈÇÆ¿j!køÕ× P(Ntâg•@cË(X¸mJg®iyë1l-L¤ïWY„Hç7öVÙ¥ešFXÍ»#H™N!M©L‰I¡Å$Èb  [K‡>‘põ¦êõ]Rië•SJºE°ŠJJrÛŽ!×JÙa KŽ8¶T¥z¢@c¶»†8zâŠÄW[éê“pm¶«µ›BËͲ¢¦’á •Ôµ)ôI˜…‰[ÂÜ;]hjÏY@ÅE©„¶–hœ@SH ‰7‘'äÃ-‘,%® ái¼«Vj&é´ßgA4ì„iU„Іò„Ë+Á Ô!9Ê#ÎÞ~•YîüXÝÖ±Öô]3é§n’•J‰H[,šÀ}-VÒ²œßÃ<¸Eµ¾±¶Ý;h¡a Ò>ººT%´µPîrãÍ€<./YÌÊœÊå1,sXúuÀlyÝ ?Qml×NضⳭµ‰b•/Ĥì'°ì¼-Ãv48‹5ºžÜ—²ëyVÐÑp¦yJÊ@+#1ô¹acae¥¾¤,f%Bfx…Lmä"qfx ÓHÞyñ‰`iå]p±4“)æWY…Š´„ê¸ $$gÍg€ý1Ê®³°„Š•Öb¡*i$“˜ý„ۆiÚ.:¼Bóe;X±©•6ªÝEYJõ%[i©¤¨mMTS¼Ûqµ‚•¡hTÒ¤©&D±›Feðå…uatꨛX´‚¹Ò•sšS÷%j-ú³2ÛÕ†ãÀr§§¦¯²PÔ±JViÚq†ÊQªJ dŠ3XØ£¶-…«€ø*¶·õ» õ¨“h}Êv– –Lš‘)8 `“¸l†R=ÒWY‰`&´Ï)#1™‘”Éߺ-¦ŸXõʼn ¦l’fFÝç–!Á¤úÊë‰`Òºáb) RFc×$* YI%S#”Âdf¨áû%Ku­ÔQ2ów$„\RãhP¨HN@@áñO "Xò÷¥6»—7ÄÕqMU1X„"’•º….”¥L!ÊÄ·®¶ÐâÂsmNXA¡œ[oMS7Li¨ÃÏÔä4u_ÜT¨-u(×mZog̬ãÒ$•N¥mà~´p÷é4Ô-*ŒP7mx:„8§éXmHCU )÷© qx+¹L"C]à~©º1x~ÑHíÒŸH±X¦[. ³ðˆQ›€þЙQ·p/Ûn ¹[ìÔT·µ¹ça¤<ìó”¬'0Í™Y¤q™åˆ;Yë+®ó-·O•J€@€c<‡'ÖW\,Ò}euİ4G¬gÓК–Óx‰ñ§ñh¸È¹e3ôÕɶ%€¦T³¬¦iž2#xÂm$úJë…Žcü7` ý>˜Rëà›Á꤬>èðà·C‹ VÕf3ÚbÄ‹Tpo ÔÑ=Býª‘ÊJ†ÚeöËE nœI„¨eØÐø~®éFldséß¹AOnrÅBºGõ=2©Ú-¡Ç>"‚Jv¯ñúÛçÚ¡¶Ð[飡e”ŒŒ¬Ó°”¶ÚÈ”$ÑAæó +¢H͈ÞyLjnƒ4“/Hõ˜–!i3Ú©t˜m"h§•]fH[l ¸à$á-ç’,ÌÐj’Ú§üÆ3a%´¨úJö|kdÊeé+Ú0ÚBØi%NU‚¥éA›S´P6)XŒZ eÅJöŒ,@ДŠY†Ál6’•L«ÓVóËd7Mô•ÖbX¤zÊžï…‰¤€%5u˜±!T­¤²Ÿ·þ#ÊbåaºHõ•Öc6 e²ºÌ6´‰zJöŒX•*•¤¬ÊÄzÆ2YO¬¡ö˜› h£ne{F*ëI-¨fVÃø$Xºv’YA*VÁ±G’°i8IJÇøŒ6 E:F9•3üF&µ-¤0²¬wžHDò«6Òr™[â1' KH‰^ц݄ §×W´a}’ɪi:D…+ o<±¬råM ¦~’¹üF&À–RN Vq16M²ºÌ6”g¨l™SÎçÖ¬r ,§ÖW´a°¡i#j•íl i$¥üÆ Ô6cÄ£7óÈaŒ‡é'ÖW´bX©eRZý£`C(^щ9ºÐÖdMX“øŽäÅŒ¸ ÑO¬¯hÄœ„ÑO¬¯hÃ`C(æW´bL©N²f¼JüSñHÔeÀºšIÞ¯hÄØNžUõ+¾ åÛÄ+¾%wÅØ%L£Î„Í_ þ#ËÓnŸ¤ýe–e{G¾3ni Y\Þ# €ÐFõ+Ú1vT ´U,êÃø•ßiÑn~’½£ ¤ÏâW´bm"tįhÅÙÑDÈ̯hÃa4Q<¯hÂÅ´½JŸó›XDlj~Ñ‹°!”c5+o¬a°:(õ•í–£¤Y^Ñ…ƒ¤žU{G¾*G¬¯hÃ`t“ë+Ú0Øe^„“ñ%”úÓ”Ätç².<¼Ä—ú¢sØOíåùŸÕ{«ËOóyåž5ÏeWûYþtÿ×{ «Ëê&z›­=¢,_adùYþl÷úQžA:î}™¢óÙhKó9½(“b¾çWñË/<á7J±ÐŸæT9ì òÿîT9ìЖ¿ÕlWÜê«âl³‹7Bm?Íþ¨¼öûyá«ýPç°ŸÛÿ»ÍéD›÷STõ2ÌJY§²,ôV„ÿ6ê‹Ïdå厬ÿÕ{ §Cv¯õ~ø“bèæ_Äœ÷f‹6«û‰‹?õJ'=‘=ÆýYÿ«÷CžÂÃCýÞØsØ)­ êúGfnXÔß`ÏíÿÝŸú£<öènÕ—ú¡Ïac£/Íí‡=‚™ÒËŽ¦ý™¹a¿¸ŸæÿT9ì'¸Ý­ýPç°ƒB›öæ”9TkOM9µ3KNQ&Ä:üßë‹ÏdOsþïõCžÀ9£”ËWfùÅ‹ìÎŽš~,ä',Ò„ß`Såæ3kT¡ÈxÒÿz[½(Ï=‚ÞÒÓWÅÙ¾r‹ß¢Š4pø³—ñC+ì.4¥ù¿ÕžÈ¯ºÿw¶öOHåÔžg-±¬ný†Œ±Öœ¹áÏeDéO o¶qž{ )Ÿ‹Û{!OéåÔô†ÙòƱ¾ÂÞë‹/¶'=…W¡?Íþ¨±`£G/æóúQ9s'»–HNsä‹/îò‹öN3ÈFCãsm‹Ïa”¿;¶}€wO3sÕ”ÌöÎR‹Ø0i»Ûo°©Òÿ{¶öÜËó»bsÙTVž¢%©—ÎsE× ²¼¼„õyý(œö[ýßê‡=>^xêÏýpç°Oöþt|IiïÍËæ'é;ûyþoõFyìä©òßîÿT^{ §ËÈü^J'=•„̵eþ¸sØCå¿Ýþ¨œ‚t&~/Ùž€<·ûßמ‡ËLünNöAoËOó§þ¸sØYÏ/#ñ§/ã‰Øí·ë\^{<¾3Õþ¨sØAå±ø¼þ”N{ oþïõCžÀ/,5ªöÜÿ»ýp粉җæ}¹¿|9ì?ÿÙjgoodies-forms-1.6.0/docs/images/banner.gif0000644000175000017500000000721212003555436017347 0ustar tonytonyGIF89a´.æQQQŽŽŽ;::²±±………FFF“’’DDD¹¸¸‰ˆˆnnn˜˜˜III€€¯®®000fff‘}}}\\\VVVpppŸžž[ZZ«ªªzzzhhhµ´´—––www¥¤¤^^^£££$$$›šš¡  /..yxx~~~cbbjjjlllONNÙØØ×ÖÖÕÔÔÛÚÚÓÒÒÑÐÐÍÌÌÏÎÎØ××ÌËËÖÕÕÔÓÓÈÇÇ¿¾¾ÓÓÓÊÉɽ¼¼»ººÒÑÑÎÍÍÐÏÏËÊÊÀÀÀÆÆÆÅÄÄÂÁÁÉÈȼ»»À¿¿ÆÅž½½ÇÆÆÁÀÀÄÃú¹¹ÃÂÂuttrrrrqqsssttt¸··´³³•””¦¥¥§¦¦©¨¨uuuoooœ››srr‘‘‘ŸŸŸGGG¯¯¯gggµµµ“““iii¬««–••PPPTSStss€ˆ‡‡·¶¶™™™®­­Œ‹‹žœœ¡¡¡EEE­¬¬{{{eddfee¨§§[[[ÚÙÙÜÛÛÝÜÜ!ù,´.ÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼¹~¿ÀÁ½ÄÅÆÇÂÉÊËÌÍÎÏÐÁ’Ê.ÕÖ.ÊÇÚÛܪÑßàáÀ×äåÖÎŒÂÕ}ìíîÕÃÝòóô”ÔÖîùúûìåüÿ<Ï:íàI«Ç°¡ÃdëJœÈn…Å‹-öÉȱ#F~  q£E(id|‡Mœ8‡0cz¢–cÊ›sڼɓ…ÏŸ½+h4eû·ò ·–3kþ«£³g0t€íùóèÓ¨G—¾xîá>×ÜEfÁ÷h¸q«¾,xnР@ƒvÜwÕããó šÓgÑg_Ñ£sçN}Zºõë¸chßν»÷ï@€|ßî´Ö®_C–̆@fÈŸ/>FylÑŠ…»-Qº‡…„Ü€Ú¨ãÕ>{µ Ú{ÚÅ7߃á…÷à„VHáf¨á†2t(†z¨!„ÚÝ×a5ÍV ðýâ‹òiwZi4š¦šh4²ÖP+$õ @òb @IÆB ¶½'Ÿÿ‹/6édˆ5D)e”Niå•XFÄ–AhÉe—WŠ£‰-¤W‘Š ²8ƒ 5±Ã›pîÐe‡ò…7Þw–·[k,ÔuW€ÞBR^)bd$_:(Ye›paDœFºƒ£Žâ`)¥˜fj馜vºé‚ê)޾9ç‡3Øoé©V¢1¬™bÔj«­ÈYCˆ?TÈ¡ˆnX'y浕J ýè²±$›¡`ñ…$‹@üPB d;ÀCt» µ¢°€ctk®ÔÊ…I$AÄ»í‚pF­g€Ðn»@¡ï¾r8ñî¿úV!pD@!°ÀûBÁ¼c€+F à â•ÇêÿO+*Ä\¼ð‚¿M4B/ ª©`f9å—_ZÉ+Ū^6X°)Ëìͬàu¦‘DI{ƒh±²/Ð/MXQ@rá”'ÐÚðÙA±<@o{çL)ÄQzDÂ^p"òX ê°d\†à c0B ~ºØàÀ!]°š!ÑàŠ<:îiÐ’ªDÍ™bØ–<|¬¨…%V`yÖ3ƒzä¡ḞÁ™¢…³©IÅ%”j\h¾¸Y q7³Àƒ½ ¡ $sÀɨäcíÌ™M,¬ð^@¼ZBÀ|…}Ö7]7ØrºŽ<`ô$>%@qÏGèAÑt¾2¹‡Ys™ÏÿŒ`‘®ùÙŠh3Já—2É«k˜iMiiKÃ&±½ï5§‹+;—8ÂP/ ÛB§·‰KDæzCÀÌ3œÛ|æ¼pà hï5ð‚ŠÀÁ‚Y¬ÚZ%7á` =ôž‡„ï ŽµÄ¥ó„XTâuÛ‚}…çD¯V`Éu, ·†/Í †¶Ì!íÏÖFÔîyÏiOÖT¸[+ÂĵG‚îá0yÔÓžì>ôÙ!|WA` u©Sý{»ÌA­{ÄôZ¹ë<µC‚h/> /3·P„î6§fÐ0µ'TŽÈÊ“›öY¹N€Mx‚à;þ¼ÿ2DQ|8â^-P€0As/XÃÄRW&šÅ|æÐ®¹sð‚Üæ/8Á„éð%„n Y×Lð¶Ê ^c½ 䯿 `ã(í'0<ãψ­.ØÈù<ÎCÀènØÞú¢—¿á ïz ²»+¯> >«&þ† À\|×ä4`?+<@VëÛàÀ{Åám‚/ç£ð¼ï´ È›€æ@ð‚)È>€˜ål˜‡y&E(*Âyž wðá 2  Ðk À-C0A pP þò/r bgð€S2ƒôúòpSÓFä1yTÿl€‚'xKã1àxnóUytƒX€À{gÀ€få!Ö·«æ¦«„Y`£³ÜÒ!ðLxN°9CP8 @:8t\p/gðXÓ5ÇVh 4Þ‡@.·*gÖ#ŸT€8JÍq$uBª”sÛÑVL@{à&o¢…œ2pG0*–‰pÀ…˜˜‰8p °=‰˜AÝÂ…¢Aíò/÷r/£xp Jp*>h@z²wÀ ÈpWˆȊpÐ)Ž˜A_ò&bŠDÀq@†C0­Ø%?àQ2C3Øà‡~¨3&1kAˆÕvj‹Ò&)Ã2àŽÿŽÃ()æ)•r)žc*T‚*õ¡¡ápv ÒVò"X’2Rò$+ÓˆŽ¸)¥B`»òŒ¸:–G€Ô˜y£4;´cBÆ"r6 ò$Y‘y‘ü¨2ˆ“p §'ámÁp†‹æ ö˜!Á2"!r’øØ&Sâ!c"€¬Ó‡ 9s²ó`A;ÒòÑ‘wÂ’x2”È’b”Hi!b!õa©#ÆÒia;ÔAD©'©”¹(‘½B%ÂA5é:7)sEÂ3ã6R•lÙ–nù–ô(x¤¡#½á;Ù3ü$'T# ’oQó”Óa¬Â:5ƒcùleYç(Ђ–h±—’9™”¹—™á—ž˜Œ„¡7a<9•þš´Ñ“|™;Ò'4“˜Š¹˜k6$D²ŸIš´Y›¶ šú‘›F …›:ñ˜¿‘¿hI;d"v!–®‰“ƒrRq&ÃÒ9²œ¼Ù›Ï™&±š1ùp­¹œŒi T¡æyžÚ9±ñaèYâ™.¡VqŸø™ŸúéÏYõùŸáÀŸvq É0Ÿ®  š  º  Ú Ì` ºÐ¡Z¡z¡š¡º¡Ú¡ú¡ ¢":¢$š ;jgoodies-forms-1.6.0/docs/images/quickstart-shot.png0000644000175000017500000000567112003555436021275 0ustar tonytony‰PNG  IHDRR¼¥Ž±þgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe< KIDATxÚb¼ráÃ(£`$€b ‚Q0 F Ñl? FÁˆ4šíGÁ(q €F³ý(#Ðh¶£`Ä€Íö£`Œ8@£Ù~Œ‚h4Û‚Q0â@fûQ0 F Ñl? FÁˆ4šíGÁ(q €F³ý(#Ðh¶£`Ä€Íö£`Œ8@£Ù~Œ‚ˆ…Huf!‹àìSkâèã8ˆ¥t³nŒ‚ˆ‰¤ìÉÈEÀ(£`È€b!>ÏcVõ˜M¸b4]¸Tâ£`Ð Ù:‘36 DÈ™’óá \*Ñ´ÀÙÈ\4°fÃŽÑh£B<ÈÐ@,ddu‚µ1u5ñ݇úúúÑÈ£®^¡ÅV¦Jbân4~Ó MvjÞ/€ˆ ³G#¦Aø3'V•ÄÄÎhü, ª§Ê{‰£±>P +üÁÏ™ÈÊ0Ëâóü((@´êÛShÈhʾ=}ôŽÆï€€b´ ׬ÏhЍè@n–cFI}õÑøX@ôÎöÄù`íXŽ&ºerÂàÄ«ßAˆ…ºÉ… 8ÁxŪ˜$F屆)ˆ+ ˆ\1¿ƒ Ð`Ù)øIòÑI ¡FãwP€Ùžì~´fº ŠÑø@@£[qFÁ(q €F³ý(#Ðp>]gxŸ-3 Fã—l@£—a‚Q0â@6òGÁ(q €F³ý(#Ðh¶£`Ä€Íö£`Œ8@£×c s0z=Æhüb€½c8ƒÑë1Fã+ ÑFþ(#Ðh¶£`Ä€Íö£`Œ8@ß·§äø½Ñë?ßAˆ…žÏ@ô¡D‚ÑëUÆß¡ˆNµýèIiÃŒÆïÐ4¸&ðÐŽUÄ,ïÑÄGÁ Ìÿxrþhü@,ƒ0Ý WȶbC±]0¿ ˆNÙ~tlfŒ‚ÁˆNxðk0GÁ(ˆ®óöïTCŒ6· z÷íG/B®¹}´7„@±Ð'«ãáb•Bcàƒ£ñ;H@ Š‘|²çlF» C¨-0¿ƒÐÀg{:_·: FãwÐèVœQ0 F Ñl? FÁˆ4z=Æ(ßhôzŒQ0 F ÑFþ(#Ðh¶£`Ä€Íö£`Œ8@£Ù~Œ‚h4Û‚Q0â@fûQ0 F Ñl? FÁˆ4šíGÁ(q €F³ý(#Ðh¶£`Ä€Íö£`Œ8@£Ù~Œ‚h4Û‚Q0â@fûQ0 F Ñl? FÁˆ4šíGÁ(q €F³ý(#Ðh¶£`Ä€Íö£`Œ8@£Ù~Œ‚h4Û‚Q0â@fûQ0 F Ñl? FÁˆ4šíGÁ(q €F³ý(#Ðh¶£`Ä€‡Ÿ“&#ÌIEND®B`‚jgoodies-forms-1.6.0/docs/images/quickstart-grid-specs_sm.jpg0000644000175000017500000001624612003555436023053 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀ{ØÿÄ›!1AQ"a2q¡ÑB‘áRb#$±Ár’¢ð‚Ò3CcÃD²ÂS4Td%!1AQqðaÁ2‘"BÿÚ ?ú…i<ÛÎÿF5]†“Íëû1bˆa÷½f€Œ´<ÛÎÿFuù÷qû0ÎvÛÆÿ³ ,7¿õ}˜`°Ð¼û‡½öa``ÃSsð÷‡FÝu/>óïŒ$Øin}ÇÞ=² ´ÿÔ=˜™@FZ·?¼}áìÂÁ ލç÷NñÄxaœ # '›x÷‡FWú‡³ÆÃ@ç¦ßxqôbØjHÜû‡¼<|0Îv§?½Äp>H°¡çþ¡ìÄÀªÃJþfá–¡ÃÑ‹`°Ôüþ÷ÀxacTúÇßþ¡ìÄÆP°ûÿÔ=˜`:‡ßþ¡ìà >ÿ¬{0Àu½ëÌ0’œ÷“·ìįcšk)â‚co4‘²G=5b(¯¤ÒºNtƇ—›å™åîw3™%ŽÍ«ðq(rÈ$—¨ÊÄ:TT×êË]ÿm|Ï=µÔS|Ç$m4²tÌ1¢ÕP•&µ!ÐÔP9õa`ôích£mM*A9n(rôà<Ý·ËúÚîÖåþb’^šÃ Êñ“ÖH¤ÖA&B2òêÄÔç„W§ú}få÷»í{golîÛ¤š}=Bc¸Ò,õ•;w}P{Oi¼´¿½¹ºî2^‰è¶ñȈP;¸E§›•ÕKS§3Áƒ¦ÞeÏyßáèÀyÏ™¾^¾ï"qgÞ¦° Š7Hõ²Ž›4’¼y¾¨óݦ™†#¸êöXo-íZÞöÿãîbj<ú[T4‚Û³Ûf<ÝÏÊ5Üéþæ–$Œ–iÑXHîS¦F•u ¹³ Ôø-#kv™ŸºÜÍÿp<6®TÚÛÇcƒj´…ªN—5×à àhîªî/—,ì îrÛ\Û›h¾=CHîêU*Ê\W[yµ1ñ® uëmà>\í϶Jmn;«ßC»èd*k;©^vyèé¶ß½·3w#ò ýf5QÆî}§¾Ý÷i%µîícf-ºk vë°”ujh9KFÔκi–ùƒok°šÂÎ8'»{ÉŒ²I%Ì™3œT ¤¹e–@l ²È6sRI œ…rË“R' 0$P@&‡1èÀ±ÌùûÜ|†*ÓW=¾¿³”Ý·×ö`Óëû0zO×öbO_Ù€¦USœªÀµNB†¸«<Âi:ŽÌ±a|¬ÓŸ˜ÿ1Á@#ÌvçŽ'˜ùxœ’d„AdK0U’>ždš²•ZýxκMÚ×§/1þc9kùkÌvxáD™¹óG2óþcÃDj+t@)ÎjunEæÙôaÕ®Þ’Op©Uep$:ŽgBœ¾‚1%^Òä߇î¶5ós1÷Ž-`tþh”ûLjÀW{¬DºGP™#I&ƒX«}qé…Œ¹½™NH ½MI%ª+ᇲÏõ‹b‹Ì˜âÖÌnc°{ÇÇ@¸Nc·ïÁÌNMTérIÓ#ôb,ò‘é&§«i!ˆ©¦ÜU¾A3ó7Þ<ô²œXÿ1Äd)øó§â?ÌpĘà¦ñ?ÌqTÅDskÿf‹ævP׺ùáJO ¨â"!^…F›6çã;Êþð[Ùˆ1Í~mïlí4{Æ—=DiX”±jS<è>œnuÙoÁ-æFʰ$íåÙVÆ=5§zÃlÏæ’:(-ÊNóv2ÜœßÕ§žŸk{1§4Œ6…Û°ol(€6¦ú7·F6­Kžó½¸z0A®·UmU51 Ð¹bFûzùË:ªé1¸Wj·1Ц»8bJv™!аշÌw·³¬7Tgž“½¸ W«pbN“èa,eNhjãÓ¦o?,r‹‡¹(Ê¡R­@A5;7× fÙ’"Ý1Ÿ­½˜µ‘º­èÛÇõS3·‹p>ºVkY—#©å´š©óxqÆk]|Å6±]‹TV¸«éRV€ l ˜­ví7ÉsóMä]ÖòÆÛµÞÜüƲ\B•‰ÚEˆéVj @MSàŽ×mšöæÂÖæáLÍ I5¹Ô nê &`Riž Ã@IÂe$‘‘ÌSÕ‚Û>‰2ƒªRü+•>¡l¾àWTņáJ~ìÙð:, óI«ë».+™”E1˜V×JÖ”5ÃÑÖs1‡åc˜Oî C3«B΀P¢ŠK ûÌw’N=?Ýψåý›@ù{óÞþíÃ4L¿›"‘Ó"«J‡ß–'öþPþ¿ÍŸ´|®{uÕ¬©{,ðÛ%Â*L jÎP’SgO׋÷>÷Õ/q:ý¼­ßÙ-b²\ÖŸü›¿KcÏŽ±šú kKygžhÐ:,ÌÓLÙPê¦g†ÜÍ¥K¾Á*U/ge#"çÙƒ !›³hZ^\¿qì‚´Ãã.FÏ~㇣Œ{6¥?u´ÿ¼¹áèÀUný “ÝÕzŒ$Ô÷m#Ãщí¼-ŠNÚ^oÔ\¥ Zî9¹F{>Œ 齬3½¹ S–»ŠþÌZÈ ¾Î¯OîïÏÇÑ€ªîë±´h¸ÜÔ…Z|È`@Íq8k­³ÂÈî»_ÄHÿÜg*Ê .©ê)Z›ëoñÝö°Š íÆÍÍqû—ØÉ?¸vq#ú;ûÀ?ÚÙ—MýÉÏïOÃøp˜æóµ5´Õ½ºzFõJÎ5PlòâVºùý­ h¢1ÜË 1¡Xž´PTC¤¬áïòý^ºÛ|ãqݤ=›ºÃ hÙ œ¸:Ó6VÓ%a«â3½¥ÏGÛ>)í¿W0k²XB\Ƥ“ä,ªrF _’Ñ$-(¸z&m-N¡éå§«úl¾ ²ÛÐÍñLÑùs'M—n eñ†Yà…PItıԥ¶‘ô(Ëúmñ¥Ä2;,n”­P Þ¶UVIUΕ`ÁŽy Åpôu¹x;(PW`óbÄpû¿lù‚Nâ×=²â8I¨yK#Ff’0šHüÂA-ZåL’ï¶üêóD!î±€D‡¨”E"”WJ¾ºî9S‹î-~gŽÚBÝÀM<‹q,0iÓ+¥ëSÉJ±®Ì¯¼Úܽ…ª yZ9¢2²†f* †joÏ­åBÅ Œ©¶˜µ)Sû1BÞ)QGéfØ)DpÐ05¥I€·”Ö•ªI]œiŠiOSRþžmùi“†P§X¸Óc !Ù\üÇHÏ å®Þ‹wR4ªöò*«ÑYÓ¤8‡làÿZž„„ÔŠ˜ä'oZΈµ`õ¹49h”¸¦ðš må dNR}CHËÇ®–ú4m2^Ný‰)(B@³>œOm^ßë?_Ù|sËÒR-%-ÄÆÿ¼cUÍÌÓÌ ˆš›ÿ pIˆdÞV5̘ßüAžvŸ¥9ʯґREŽ\‰SC±wâ,¼ºÝ¬Ó·ÚÆÁú‰ aõ+P‚¹ìÅÔí;¼wcmß{€¸ù–[ZH:)läÄŒ"Bî)BÉ ;Tj΃ ^Ý/YÚ$··ívP¬ïv±B‘ ²ž¡Œ,|Ù’7œ4+q‘ªsjl×))õìk8I/-”æçxÈHvmØ&µ>Ý©ñvà€XÕ³²{0Óúí_·?õ`Ê©#WŽ–[n×XK”Å(”¦YS#íÅ”fîfí O…J»Êˆï¡ŸBÌÚË/^&£›|¹w–íw (’H¡‘ÔˆY58ÍAË=4õâèÁ?|ïÆÎKH»dËÜ…½~"Ea`•b¥A«°lý˜Z²º=ê ZÇ·F[C|D+)BÀF­ TÒ¸KÍQý²+íæêËþ¬D"öø•AQ(`W©6Ú(±,•µU¥^yªrþ, +ÙV’Lµ®×—†ß6¢Øß¹oÃü,[eF%ug™¹@®+7¶—á È$Wjm9xWúøÌ‹‚»ÔÞÜ5–yâiRhÍue&‡*‚8áéz\²­*Â:e•7n,KMFðþSíÄB(jlÞw>œ[@‘X®Í9ävgã†ð³Ì`î©qoGPc£ ‚iSaÆo§^¿õòýâïít?’óÿ«áÄcí–ƒïðþ,.;}¶¦ü­‡ñðþ,k5/åÿ‡ñ`)^Þ…gêÂ(ˆ¨5 ü\k„òßlãGÛc‹ ·%ä´n8ŒÔNÙiaM|ûñbÜD²ÐK” Tn×Çø°ßÙY$(ÒÅ©z‘…ÍüÌà)óq8œ7Ò]à©Ûí ìËÐ Õù™Ô·â݉ƭþ2ü×CÛíô E´ÄÿV5\Çû}³Hÿ—ZR¹Éãø°ôvëj§åoÿ‰Àþ,& oûu°²¹n†ºE')2ÐÑN^}øÍðßÛ›Ú|Ú,í,£EVUhÔR®iÊ2µF*öíËÜÛçn® ívI=“h1ÌX™+©5«u'OwQ@íÞñ]®Ö·“Ø#_Z5¤î_]¹s!P„çWaÌ Ž3õÝÖÅ‹H¢¬1ý­‚mD€Gåô‡?µ°˜·µ©Ðõká¬~ÆÀú–Q¸IöàŠ."’kkˆÓ'•]Šä s¯K–W˜´ùºkXZ.í+µm$ƒ«4CÊÚAf7TW»ÿŸêóÏ»žV÷šL£Y¬Ñ$w+Ĩa'‰ú°éö2óð;}σ¥Û;Ô—’Ųš¬MpE ¨Ì™®ÍØåßíý>õÓ¯}ôÓ{ܳÖóÌ4T´Qk]ù\q­Æi{»ü3=­Ò`Â:shl¶ýÚáÃsyƆî€eð—[6ˆ· `º‹ú[­ƒýÃpôâ…þì¡›ô—E³Þœ4ï Iw¿þ™øa¡ºÈRc%­ÐOôÎ9()ûñ%[œb[÷%GŸô÷M®MTøw4åQL"ö¾>KcîÈkú[¯1ÿ¦“Ž-`OwŒJ?Kušî¶ïÄô*»ï0{K¢¥Ðmœf\·Ç o¬¶ð)Ý?U 6×-)¤ü3ÔµZ¿» ä²}3â²ëŒ~EÎ_ýy1k ;¬=Gü‹ƒþšO ~ñ d ‘žûiØ|0®;”mo*$s«”`¬mä44;1ëæ.¶·bM0­£¢•¨Î¹á:÷{o—•ºù›¸X÷›ÛK^Ýj-ã¸ŽÚ ‰gŽ#,Ò$NcÑR‹#ÓÝÃÝ­òô½²žÂÖkØT_<1µÖ•z¥AzÄSUv2'×~-RA^*‘%7}xa;X° #HRü?n K(©c¡âíÃö´Á¹p¼Í´éûpMS?PÅ:ÅQ!RŠZe¿ á®™³|òÊÞêØC2r†FQƒ }+uíebÉY{—v“ôÎIµ#È¥B+ äÕ¹@ÙÍ¿PØYäXY%†Ÿ§ ZR]ZUÝÏc›æ8‹kfŠâþHZTA¨DQ`s:ytúp#WsÒÚÅ‘BË$È#%A J19W…F2ß]ç?°'uî¬Z²-#8ÿφ³‰ýǺi ²ÂÎcbÚ¸·â»Öl%IßÐËg‹bjbuûÙ*Zx‚çŸGùñv˜ÕÚžèÇx·,ÒcGU ²+lÔÔ¥qz¯káEǵ±î¯meôDrÄý¢ï·Mr*-Êt¤m\ <£I½ì²ÅÕ «d°‘âVŠA‘q)ÖÒÙ‘§I¦­ãN w©ã^ßÛ¥YÕæˆÆÑ*3ÿ³b †*>¼fÖúõß«òŸ¼`Šò)AÒ/œ³‚«Ï†±ÉÅ͸T;‘–_§„×ú°´å[][ê-¢ì(;E¼ZvoæÃNAo`Ô7`V™Aß¡°Ó—W²ˆ:‘ÚI‹JdTS«¦ƒ ¤€c]WµðÛµ”ï8xÊÊ kDnu Aá»÷ÇlŽSˆy*Â1‡eV­tí 6-¬T¶nç,ëp"}( id¨®¼ˆÛMø »²ZôàÑXψWMH‘rÈCÀ剭u“Û—ó…{ Önµºí¢G ÖÙ±',J²ðÁµ*¥Þý€é0%='› NWÇ=˜rª÷H2Ë¥ÛÆ®qmNV©µ]%Zr*s0Âk–îjá)É.ZÀ[Êò=Àˆ#kNŒc"¦»ÉÙŒµ×v;ý¾=6åZIc¦Ibº@)C¶o§’îÖ?2EÝnn{w`µ½yoIn¥Kq$GTRÏ%TëJ-ZA¥pJõ}¡e{ I/„Õ dÙ*Äcˆè–¥2*» 0-˜ÞGáõ. &‘ÃÔ¸§—Ô¸¤}ßRáªÍt&[k†ŒÒJ6Œ—hÙ‡¦ºI³V6­x}Þ8¬Km¯©q1;,VöwÚ¶;õˆ`¤u5êfʇš˜£ß.¤ò5½ÍÛÊŠ^%’åôƒC–ü³Ù‰VNV^Áqlí$pÈ3XÛSU¨6W·Ö^Ôµ§sj±µuË5 =†1£·q ?O!oh¿×‹‹išÖýƒ¨¶|ˆ"­ ?‹Öilû³¡®t¤‘—ù±1u·²Ã2E}ÕC4ä”:ÈÐmðÅê½ý|;|Þ]#MŒh¹#<·¦ÎÏ=íúNn8# (±/Tè}`uK)a¸V^XO=ÁÓ+B ¥‰•$S¬0*h~œQ†ÿ²Ý•…¢½ÊKMÕ”idYU´” ¤ú±ëä×Ð]·u‘áBá ‰H<ˆ’C˜,8â‰ÀÆ+lÔ éª¸¶&”[÷‘ŠÚÙBL`Òž/†cýÔiÛöûÚ¡$dÖkÛKÖ‚âk‹vôŸ¨ªbò…5ÓC‘ı¾—™ž]Ë.ªØÛQ¡‡§QÊ7׋9qgùA.ûµíô÷× \º†–8£¬Y(êcl71ôâ–:Ö=‡o·²‚ +H’µuB‚H Vƒ~™ñmÊ‚yIÚŒ¾¬VhÜ}Iˆ‚qõ.€5Ûê\Oз–g¬z˜¦´ÄÖºuú® ±Òrá½xãQ «³Ö¸¤éÙë\(ªáˆŠm܇:Œ²9á|5×Ì$’ÆÐ:’Îô‹Ë‘ÐMOÑ\N’óøöÐI¡ËÖ¸9‘é½xbàŠÍ©²ßÅxaD'rã½x`Khš©Nf¥4æ8œ#]½6z¸4<ÇM d(2>8‰M5/¼w¯Z†©êy}Þ+Çfî¢%HÆZvëõáôóÂ#–‘ѺiWªæ j£iŒ[0‰yk—ŬбÖü¼7®’u/.þ+Ã%ÁÓo)hõ(F¨ªæ(rÄk¯˜h˜ô“–ƒHÊ«Ã/”dËß;׀­=OZâ"j4ÙëLu»ë\ ~ï­pSpõ®"¨º•ÒgaÔZ #:nÁ®žb<ŠTæ6ãŽ7#&Ö+´}c ¬¡|Ãëpݼ} ˵¦Úˆ šP× á¾›õL,®ší2×Ï“Tròÿv#SÅü{jf]'˜lâ0sR²-¨Ø7ŽŒkWPX–Xá€bÊYy†ýãÒèõ&§2040 6j?0ÒŒ¦¼£3ã‰íëä±$P0ëÇ 2ä”â8᜘#Q‰UwÇCƒ­@€ÄPšƒ 5\r€‹˜Èg˜Å±#‚ìK é½q,º–^a´ï0äHÔ6ã GP£˜l×Ù†)cqªNaç;Çá…‹Ld-Cë_fÉ‹¯ÞZû10¢ýáõ¯³ :ÓÌ>µÃÖ¿x}c Rº‡FPÚk^`EG«ŠÞ HßãèÆ °6_höb"+rý¾>Œ[Uµ+TŠNÐkáˆhšŒ©^?f(yŠFò8f$ˆ®?"æ6 ãÙ‹C.LÞÑÃÑ…T'~ãÙ€2ÓoGìÂA"–Òë:š„fvWf&•PÿÞ8ú1lC/ž¾GF"Œ¬4Œ÷㎠þ‘ìÀU.{¸f5PèÜìO†ñìÄ ’5)ÃÑ‚‹7#g¸ïÌD@ü£=ÃxöaŠHÛÏŸ¼wŽÃÅì°8¯Ú=˜˜ÊÿÌ0M^>±ìà þ*=˜˜ ÅG³ T]þm¸"©v>ïÛ‹xyðDMžþÿÛ…Q÷Ÿ`ÀF¯/Ÿo†!­[ÏôÓ<‹çØ0¡†Öóÿ€ ]iç߀’W¦|û7ášþ?V ©+_ÌxqÅ¢Ã^§¿³ÃŽ' $­ŸÌ8qÂÏñú±Rצ¾lj ­u7Ÿw gUóíðá€-]-çÙáˆW/>ÍØªXö¿ŸÌ`¯cóâ šÓßõ` ®ŸÕ‚¯ãÄ Ÿãõ`?ÿÙjgoodies-forms-1.6.0/docs/images/quickstart-groups.jpg0000644000175000017500000015615112003555436021633 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀuÿĶ!1AQ‘Ñaq¡"2BR’#3SábC$±Ár¢‚cðÂÒ²s4%5ñƒDTdEÓâ£t&6!1aAQ"2q‘¡BRr±Á#áb’Ñ‚¢3ÿÚ ?ý6ë³­¥HÚ¤ý±ªq4ã€ÅÓÝ;ŒZÅxNã ¸5¥[ŒZ [“[}Óa:ŽÈ± ¹phº¯tĤìô¥VtP8Í”·+fé½;ÈÔ@f.Ä«Ý1šëJ¥Ôa@cXEÅ{¦§0“u^¨íªà4;µ Ÿô˜Í]—ª­Æ(Ô•n0 «ÿ™R®«À í1ªà4½o…^éŒÐ®0Uî˜P%à}U{¦Û¤>é(QðØÕ8ÔÇ ~0ª½Ó¤qì+Ý0 CÖøUî˜PK/ GÕZ¡êŸdE˜ ËÕWºbP8ÉöUî˜Pðlº¯t†zw.—MÕZá: n`<<ð«Ý1ŠÌ9¥Rþ“„Åʤ4wLJ ¥x! ˜U«V£¶7œr³Â£þ“ q“ì+Ý0  É•‰WºaA4nÝbE*&jõN²cyÇ!ÁÐ,º¯tÆ(X<-î«Ý0¡Rúm’Uî˜P]3ÀS¶$¯›¦.QÈv0#«>é‰B¸ãMÕ{¦Rð,9$¨M'Õ;#XÇ"­;&0't›a0ŽŠ÷OÍÊ´û'„("±ÉÓ:$mÐcXÇ!©xHwUgÝ1&ó)œ¤¯tð‰BÁõUîž ª§Ad÷U¤z§ha‡c4+Ý1(LtkJ½ÓÂ%Ž‘ê«ÝÉ…ª„U^醠c§PWºxB„ÇMéÉ^é… Ò=U{¦2Oª¯t„/¤L©I…Lô+G²aBØÈØ}Ó AÅL´Æ%^@Ô¯t€ÆM¢Gq… Œ‚mžã Ýwó4ÆéâJ`ûþP¡£{ ÜbRv^ª¦zÕ"¸¤ ­2Ñ 8N„«q… 8àÄAº{¤êè‹«âOÕV蔂.+¦ÈP˜ŸqRꅭɺ٠2ÕlX€ëòõº%Šu¡[Œ( B}UhÙ Ä-n~e2B¬I²]"5\‡lÅnŒê/ÜVã AÄð+q‰0ˆCê7U+‚Ét˜Õp/‹o[šˆÓÝTº†¢gê/q†¡M¹'Ü7"«®51œ³À«5ÈÆuAÅ>Ê÷j7Ü^ã Bt^7{ÃBO²#SØãØ_ºc:‰Ž=…û¦€^n+q†¡î„—MÕÎbI–‹#SØÃØVãÂ& c7Ña† ‡†‹‹³ ÄÔ&‘Áq}ÅH­GAÛÎ91‡°­Æ3¨˜Öx¸ÃP1„§u{Œ(*•ˬ"m6€u¨ôF³ŽC±æ|*Üc:‰/U{ŒJSÂRº¯tð‹…Ó<2P¯ÔbåPv?ÝWM†& Ó/ ýÕp†¡u/Âê­IõNÈ¸Ç 2ðÂGuGº&BNΨLãeRê15JÔ«q†¡5®þYÀ©‘!Ý<#XãÈ`|H ªÑì«„fÆð«ÝàŠ“ô×î˜iÜsô׸ÄÓ¸Qtã•\Qš@”ºãzð«ã™üµAŒéÝóJM*Òa¤{ˆ*uaªzd]{…6ñº¢ÚÌîÙtì1©…;̦¿tÆ4îˆjHü5û¦wÔÿ´¿tÃNál¿ßtá®eCÕû¢,áÜ4Õ k÷LOÇÜWͦçºaøû‰æ¦>Rý)0Ò½B)ß¹ŠpÖJœQ±'ª78‡ù±?”¿tÆp T¿ ~é‡ãî'š‘ùk‘û¦¸U5EÔ¬a¬ÍÅvÅËãT$>žé‰øûˆ*ÇÓ_ºaøûˆ*§¥µû¦¸M=EÖ‚n,‹t$í1¬±ä;ÍËð—î˜Ïãk÷LOÇÜQU"Fm®R³ºbÆÂéß!” ‹=Ð'tÅËCüÀÜ_ºcwͦrÃ_ºbþ>áUL¸.,“ê‘c º€–›‹˜X“²- &¤hÃ\Ý1;‹š)Ü^ã ;„Õ?zÁuVdÅÇC<ÈW×tÂ`4=…î14î ©ÓÜ^ã ;…TÔ2EÅø†£¨ˆÖsÔ0Õ§Øsªé‰¨>l}5õ]1?qU9Úþ“(NÂê¼”÷bÒ|'Qœ\0ç¨iª@Ò…Ù£ºa¨‚¬{ —ô˜Ÿ¸ži:›_ºaøû„Ô>7ZO„Û(Ö8wV„¿tÆp<×ûNmØ~>ày±1ð×ºÁ/TΡƒ†¿½Sì˜ÔaÇVñûOóx=Ó»œuSgË^É]‡ãî'šOÓ]ŸtÃñ÷Í&sÃr`hºaøû‰æ†’ÚýÓÇÜO2™Žã’þ“Nây­¯Ý1q<È$É ÷L?pMHÖÜ÷L4î"ªÒËpÿ¤Ãñ÷ÍnýÓ {æDÉ ®zû¦‹ ‘/–¿tÃPJeà_ºa¨"©'Ô_ºa¨>a6÷V:Òaª¨L¼*÷L5 ugÌ0«¦i¿!þ˜”}Ðn ¶Žâ·E¡Lc2.¯¶-‰lî*}_l(Q×>#fá°Ÿá× 3àQô1):©üµnbj!qDx¸q†°(µœFä•YzÉ q¨€Å:­jè?ðc¦Ô}l*.«é«®BJq^a*¸¯ ²]#¦5QA¡åK嫳ŒgHý5nûa¬\?M[¡¬)Õù•Šð %n“ÓÖ(3ý5nûc:Âx’dÚº,†°!uZpÕoGÛ aJmÕc¼nVÉtuƧ ÜUOåªZ¬c!Ó§ [¾ØT  þZ·}°¨ iÈïÃUªwGLjbqŒ­mZvFu Çé¯t]DÅ$O [¾Øj3Ó8@w¸¢ Š:#SŒâëÃWT£:Ž~š÷CPqޤ+t]B))B¾ŒÖ³`Ú®¸e4Ó^蚉Œeò׺€^ÿm[¡¨M+·Y⎛@³Lk(Æ•¸kÝÔiþ·DÖTñ‘jè³í‹tÎÃbât[/¶50ŠeàVèÅ@¦!úkÝ R¥ÏË»ÜP%*Ò:"Är#nI &@L 4E˜KÒ>n‰¨¶1ö¸ÄÖ+>Y`%V‰AáÃCRü’ÅuÈĘý5û¦&°xý5DM`"©Óƒ"•x“l¾ðcaØçé¯tJû Übi¾âÎË 5€ª—Š‘q_1:ŽØÖ8Àpx踽Ñ(o¸½Ñ5¼}…N(áw>"M£íã]Tü Ý¡1ÓVï¶&{ýµî†«<éóÿ BÕjû±¨Æ)¼zIêxÃVï¶%9Â΂Ú÷DÒOð׺.¢b›Ó¸­ÐÔ0&£«DÿœM m [¡¤ÿm{¡¨Ýï–½!¬ˆL»ŠÝ Æv![¡¤ ŒO¨­š 5€1ãÜ^èºÀ8ÿq{¢h {@¸±Ö 5€C¿q[Œ5…@õ¾n0¡ £ÙWºbÐZÔTë*(P)½¦^É…!¡ÅKÀ®Î1(UN<tZRñŒü ·¢- —?»!AkR‹÷“³dX€ââåàWFŽ1š ŠöoWP…ÅKÀ­ÃŒ()Åëd¥VlÖ:ãQ·×ì:¸Æj¨aª^Ž0 K„þ»8Â… ׿n+Âvm1ªà\8¹|µvqŒÐ¶2¾š·1(LE}5naAŠ5*7€lÚcuÂ™Š£f·1š@Å3ùjÜ8Å qTL°Õg@ã‚áºn(ÎîÍq©ŽìE{pã¤LUKå«pã ZÛWgPSã²mSRôHY$Ž˜ÔÀv*þš·1šº¯¦®Î0  ¦_-[¾ØPU2È‹Š3Z’Û×( /(þºä8Ä¡1”L®*R°Â„™|µuJHáKKî(÷Ög!·®7œr4ÓWgÅ-!uRùjÝ @™xºHé $\V½[Ig†â™üµu‘¡1Uì+t(:©â´l‹Já 6d¨¹Ç!ÅãôÕ.¨Í]:­Ð Š·@¦ròJEÓ5,‹É3Ñf^8i ¤[.ˆLx•j+Ya4L$)Z&£ "O cŒåÁ¡ÕKÀ£´Â™.±Òi×Ü6‘¬#‘péN·D KÆô°Õº% ŠfEÅn…U,–epø“«ïÖ1Èn<¬¸«:#42¾š·B„Å?M{Œ(&¥ÂRŽâ‡}$YÓÆƒÊúj#ª3BcŸa[¡@cê+wÛ Rjjy„Rµ8 d •¦VÅÄÆ'(³ñHõÙÆ%åÃ_gR&2§,5öq…,3¾â¼Í9ÃV•ÙW áöËF*§àWdfœãªc*-p¡1•?–¡èûa@MïÁÛgP¶4‡ËVèPÕZn+t(@ñ'å«t(·B„ÆWÓWM ¦÷[¡BاØVèPÓì+t(LSìР–žê·P8¿q[ŒJRÜY kº}mžÌ) +MÃÙ uJöÙÆÁ%SÚeÆ5K+—­³ŒJEáÄo¸uËFθÔ@n*¨{8ÄÔLELwdJ^Áìã ZՌٸl ²ÈÔ@`uvÍ¥uwxÄÔ@⾚¿·ŒMEƒ§FéÑ €²â¼Êdƒ;†ÎîÑÓ¸ ÄW°lÿ±5=/ÍJHIš|BÂDý1(¡.¯Ø=œaC*к·’ßym¥!i$§N›ctÖXLWv€ò§ò”%ÕVP<°~Z»!¨Â B}\bjÒÔt„áÙ³®50¦â«é«OGΨ8«ŸËWgj!uWOÃWgjÊ=ðÕ2«t{#¦58‡c+[j¸ÆuZ®Î0ÔLe<5vq†¡î(bɵ¸«lã,CKʆ­ÃŒHÄ÷`ʳ:Š¤Ô—›Q-TºÊ$î¶©'IÓ™vóaÕzÅ·b¨þ»8Ƶq*‘ÂPQš×#!혹Ç#›“æ•U®pÓ—”Õ+èm”ÈwAl7˜åÌÌ=^c†3ï»ËúkìãÕå˜c/»8ÅÔ"‘–R.(é¶Í§¦.xòŠO᫳ŒgQªÔ…vq†¢‹t”žâµìÙ×1¥Yí€Ú¼#fθ¹G!¸ªÖÚ»8ÆhSì+¯þ 5s÷JW*Öw.”*}Äô‘Œñáíÿùñ列j…e4Œ$!D‘#g³×"8y|³õ9\àµ++d‘ùª}š1ròã/OÁ‹ÎoûeÛKŠª£¥†–¦Üªb$Å;ü|c/%4°û梶–¥”$¨È en¸¸ÇYÕÍ/Œ¹|•öq‹L–·V]há(xfθ±Ø®ëe]‘5p1Ü?‚¾Èj }Í8*³ª*§ŽÙÂT’ …šå…ËÎý%õÙX÷Í8+³ªG¸!÷ù+ì‰8÷.¨>„¯ ³lk^Üg%ò•ÙÖ=Ò!ÊÊžõ ÕJmDÒ¬¤B1z<±ú:˜ÎXpU?GjóÃ)©gÉRª.Èiœqç«Ùò¾Ì)ÝÇvß‚­š¸Æôw<Âæ> Îî0Ò=ÄÆp™`¯²÷ m×®+ V”‰ YdjaN»ôWÙÖ=Ñ<Óù+ìã #ÜO2àÐÊû8ÅÒ=ÂÙyÀ·åNÉYÝ,ãᆡϢ¾ÈšG¸‰ªs[ Ü8Äœ#ÜO0²$Y\ýÓ¸];Î ãd¨ÌKYë‹–1î§–Ê_g‘r#‰rò|VSVVÒÉ]SÎ&Á¡Jëè‰‡Ž½]üù]vÅÒó*—É^áÓ»t®Ù¥‘yFvk=qrŽG7)mÆsÝe•Íú„¬X4a$mŽXxù™¾¯OÈÏl1liÕóNÁ_FŽ1Ò<}Þdó.Jx ³Uœa¤{…Ó¼´²‘„µ;lÛ,9êæW£cpþq4î}I}œa§p ë(WÂ_giÜQ‡V–J2Û8ÂppÑP²Á_gšw̯[+Ü8ÃNãnÒkòÊŠWZRâdUe’·l?O«¯‡=3ŒiÅ!´$4¹%! Ù  CHræz³flŠÖÊÛXJ\mÙË[j ÛÑ/Lutñù'þÖ_ÒXÕ)FµbJ«yJaiÂXž»%ÇPÜuè ¬ôÙÆ&½Á¹/’¾Î1#Ü[Ì/F ÷0Ó¸UKÅMK c¼›lÔAc‡=C<ʈ'viÑÆ3§p|ÊþŠ÷0Ó¸žev|îûa§p§Þ*JmBKIœ¶Ö8W¨f:¾“›¾Ø”'™WÒ^èšw̪SÁ\Ç@ã ;œ²ÕW²¦iÀRò×y¤«¢ÙLj0‹êÔc31Ò±×)௲1§=R Bõ2»:ÖÐ|ÂþŠû8Äœ;¬3¾úüÃ' ^µ–ODj0ã«x}²x¨rß‚¾ÈšG»š×/’¾Î15î˜pØ_gkÜCP»ß%sôq†½À5Hü™õq‹¤{ƒæWgÁ\ÏWšw̯è¯pã ;ƒæOÉ_Uœa§pq×gÁXÝ ;‰Ž¿¤¾Î0Ó¸žaEsôq†À ŸÉ^ŽŽ0Ó¸>a_E}œbiÜuý%öEÓ¸‚¡I{¢iÜ@ù™øKÝ ;‚6ü5*R”ëD ‚›çW³(kÈZåòÎ6DÖ–½•TÒ=L[7\L‰³AôÂq‰†ü9k•÷4-@á›,Ò^˜±„9õEéÂ=œa¬¸¥â´nXfÈÔB™ˆçÒ=Ž1aϤ®Î0ÖJ×oÃPÝÆÀª”æ: Ã`VΈ±Œ â/Sf]b&°&"Ϩd:D5€q—Ë;ÄM`(­xàá™Ý6Lm½b”ÜEÛðÏdgXIæ¦ÃBê I¼µ97m.è³NÉDŒaÓ/Cñ)a‘»Œ5†úFp*êÔ‘5< â…“Ñ8Üa¾L®1†Ðâþš¬éOÍCˆß_Ò=œaP#š›=œa¬¶·®"gvz6uÅœaN9ôÕÙÆ&°‰ˆ¹|³ÙÆÀ˜ŽKå«8ÃX eÅ…¼pÔI]º,°tÅœ`7ÃøJìã ŽOå«ûxĘ€qWôÕý¼bD@U+‹“’mDb,êÛ×Ë Å\¾Z»8Æu‚˜rÌÅulºàd§ ÷Z•¸k)Ÿ¦PÆ!×ËŽ³£n+–ü5oÕC‘4Ž--¨‰ÕowÚ=1rÆYÌXy×Ûd_u…>‘viQÛ°Æc•Ë Œy;Ãn¬þž1u„XºáŸÂTõxxĨ ¤qb™6¢-¶iÛ×Ê"îki_ÛÆ1P qs' [ÓÆ)ÅÜ? ÿo±)NâƒM€Út[4ìë‹8Àmõý5oÍ@˜«”ðÕÕÝã …r9ª¾ª›$}Ö’¦×4¦ÿvÀ¥{"O„eO³£Núð8j=Ñm–Ù×§ ãê§›ªê©¨ieN4£TÊ RÕ" ºã—–"!ìø8FYTÿkº•“øj³¨8ÝCÂ]ZÔi–0Ô›8Ʊˆ°äºä¾Z¦Ýã €q–? ]œbkb¬™a+®Î0ÖªV²Õ¨Pï'Ùö‡Lk bÃC«å+ûxÆu€qWôÕÙÆ%@8‹³á+³Œ*jV¢4(wÓ³o\k€âòþš·Ž1`LEý5oaP*\\ím]œbë¬8¹µ ÕæSZCt…ÛÞK‰#O\HÃê·£Ãåˆñå­Ã´rïÊTÿÓÆ.°à…Ç54©ú8ÃXϤ­éã `gyÅšªy¶A¤;»:ãQŒSX}²ÑŠçÒWgšÃ2˜Ž}%ošÀ×>’»8ÃX:²©á({¼bkŠqM]]Þ0¨v%vq…@˜«úJìã 1zxJÙêñ†°*¾š»8ÃXsùJþÞ0ÖÅsé+³Œ5… UÞùJÑÑÆ.°qI]œbk‡\™øJìã `Eý5vq†°uVü5vq†°q^§ÿ0ÖTµã6’‚'|ÎÏf-!¡K•ð¨sz÷hòÊŠ¤#¼Òf'"4Æsž|mwhCË(¶méý1¨‹sËárµÃÙ·²ãG ÙzË6Eˆ Äséâ3@ß_°wˆP‰ZåòÎñ €²·1ÑÜ3’¤,·Dj 08ä¾YÞ#4#–|3Ù ­Ï¦{!PV¿0 Ã;†É±ªŠ ÄX–Ïdf¹'ÕÍÉ‹¡ÜÈ”z±rÑ©Ê3„uz~GôÿŒ»§}rµ²5O;ÎS¾ò¹æ¹*¸šf™%j‘Ž_Ö÷gÿ_òŸöz EèÃ;Äv§bâåà=‘(@µŸPï¨ enbºpÌ̦&6F¦!OÄrCáâ3HÅÊxg²!qvü3Ù eÅ…ŒÄG³¥ŒïÒPôŽ1uq.•K X‚EåhöL\¨g£¡4¯Ö:”æÝÅP°Ý þQœpˆ›÷uòù6ˆh¦¼GGÃ;ÄkXqLW~’·Ž1(*Ç ²E¶Ìmëg!ØŽ}3¼q‰@‡]újÞ!¬ ­Ç.¯áÙˆP¥3Ž`6 ®‹f6uÂbÜW>™Þ8„Åpii]œaCžæÌåÙk•(PEˆ”ÉY×â9uñx§9¨mmÕá$†Ì¤5Ž0õs˜ôõssüæ£-¦aä2ˆûm,(êY•’1Œæ¡ßãxcÉ3ÛtÒêõ ú o‡š¨ºÇå•4z¶Æ±ŽCC®“ò̶ÌDœEï¹­³¼q‰P*þš·Ž1u ©[…±y²;ÉÖ=¡ Åsé(ôYÆ3¨8®ÂQ'ª-@×~’·Ž1*j]Y ͵úN‘Æ7Œc9ô•¼qŒj&3ŸI[ÇT-!uϤ­ãŒZ‚|Ç,[ÙæY™*iaÔYipŸ»Œ>«·l<‘)ÇÞaÖ“9"}Jbðå8Ì+€L ïi?@ÇQ° ŸH‰K¬’êÜ5lwñk#Q.Éêy`  ïY©žƒŒ½M“éaE^p›[#Ò8ÅÔ W'òÕÑhã JET,Y†gªÑƤD¬wéãŒJ…˜îÅëlSêIµF²?™…)¨Q6 ïÈ ¥±V}C¼CUÔ1–4¶@ëaHÕOÀukÕuG'òÎñ f»‚ên ­"`NcI°CUŒfV¬‰†ÉÝ IŠUÌ͵vq‰H˜ªúg³Œ5Rž[ÆŽõΑìÂë÷Dš;Äj¡Ejuh)[ƒªcŒ*ÅèãŒ5re\gÁ?Ë­±Ò=À5Ø;ÓÆG¸˜ÏŸÁ3ëOká4Ëy!™­FScyD)Øïý¼qŒkÔ‡+–Öò(“mMAÒ5º®˜ÆE='îÒ\g͘'xãÖ=Þu)œu-É-MJ¶cl\¢©3tÕ9R†Y]êW0]œ¼RËzcë31}<žÂ"gÖ-£ãŒkX÷s‘SïHü=#Œ4t*•×RÂ@d¢6Å˾¢øïÏä“ébiâ%÷§ò;f8ÃH÷o/’0¹ŸX˜uC¯ É•J{Dn¡å™*©ÇTÂÁi@YlÆØÖ8Å¡÷ä$ºmcG¸¸uù|“¼CH÷<ö¶U½0Ò=ª]t¶&Ò€¼“¤jPéc„{†c¼]sOΑî;Òù*Þ!¤{ˆ*ú ¸ÃH÷ }ç jm(I`éméc„{†ã½ôT=)ãÒ=ÁÇxþ ·ˆiê˜ÎýoÒ=Ééo1ÌÆµüû'¤(Rhjq‘T”›¥`6T‘x9Ç=y{~5GŽrþ¦º~WÊiÕyª'…“ÅYÿš5‹V3ùžIõud;O€å:‹R”¯ËF‹AœkHyã9‰fk)¤iah¤X#AÄ'þhŸŽ'Ï”´ºë¢©„e%HLlÆ1]XÆ~’ËéžY[”ŠQ&dÞûcBÇ—(軨§5N±°_ŸñQ„aé>Y•–ÈZÊÕL©í½/àbééÊ‚•´ží2½ùÿÍ #ÝwŸSJo ¶iIIÒ a¤{³3Œº–Ò)'÷ÿþ¨ŸwIógî{m†­E1÷þ&G»žYÌõUúvª7胄Zé³|4v°òeI¢ŽYC«/Hê ÇîŸö|ŸÝ- 2†>U1N­ ÿ8iî3”ÊΕ:‚‡)”¤)%ð‰P±q)Œ]Ô7–ù£6¾ñ9B‚‰íê©ט›R¡fœvŒd3ü£1?þ©viøÍÀ/ü§7 äê#QK퓦¹²¹*rY;Æk$ÉÄl1© W8։џ$XEöõúc!jç<ÇÔÉ#¥ÆÄÌsiËô'vŽÈѪӆ9Ç5JV?@¨$)DÉÖl·ú£Ry×32 ©ž´‡ãÑjœÞ[ælÉŠŒ’¡wêZŽ#c¼§ "Óª1„pïòrÛ(žÎË|ߘ™ƒÕ4÷ÚþèÛΫ×\†Ü–©rR‹kiûÐÈeËóì‘un'#ª"¡âå‹hJ`k¢1ëäòmM§›ëBärJ»£XSGþhÓ’¿æ•*$ ŽºÍ¸z} €SãP†RMXE¤(Üÿª.]CÎÊŒ’ªÃ`¼Ý½±ÿ1¬$Ñ*†£%5ÿTà,®p¨¹#“UÈ‚ øfÉTXžnt2ܲŠÅ&@-³® çE¥$œ¢¶Ëd’L¶w¢žvq@’צfV¡?õ@ry»›TîL¶“—Õ°µ-°´€’/Z& ŒåÑéø“õÿ ušç"–Ó{)­º¦މÆã£†\̱füöë-2ã9}Ržm*RÛ)Q”…ºcI¨tøøc”ÏèèŽl\¿ôªÐ?¡mKSe3­<­a.$ÿ±8³—‡8ë‹HqÔ¤• -&ð‹4çÎs™ÞZ^i~aé’âvm…ãODx3˜ék'™2… Æÿ5êy£Åéèô™Ç/Òæ™PË\l²Â JeWT…6f’“Ñ–pËhtÏÇÎÿ,e®Ñ~žëÄ<‹ŽºµÍÕÝ´/Lã¤yæ&ÓñÅSWè4 l!4iH [/‚­) Y£Ë7s+DC'-òÂr&TÓ*qäèAq`„§bDtòù·ê˜xâ©òŠf3ŒÅ¦«ªJPòïNaBÈç9ÜSZÅÛ„nùi5õ&„)ÚÀáp)v½%2Ѧ=ö²ã³áÆeËæÛÚšž\g/ËqNS<‡Ærü’&$ž©ÇOÊî\óñqÃÜÑ¢­ª6u7Üm J×{Ä@‘1âÊbfi舨>óÒµÝáJ›¾d¶Ü6O¦/¦_tz–Tf¢ˆ‡/—”âY®7Acä™ýéFpz~OXÿt˯0‹©;ÉèT<ÎXëÇš3d\± S ¬…Æ<Ë׿ø¢}]зmø@¸éO")n€;€LÙÞ…@3vïËžØT3‹ŠïpZS;z"ÍMÙË t[àÎý0}"KÓž—XáY.…=$O¾gn‹j`8-›cxáàˆt¶7ˆp ÖGÊáC=0î*L¤÷Õ;FÞ¨ÔÀwÄ2›#¢Ñ¨K¢©é“NÝÆÚfN‘¥Fg´Ã†§-ŒïhÁz8E¤&™'ä¤÷”A³oT\ &Š­ºÅT$S€Xt²©Ý¶@öÆbb]3ñÎ~±mWªtÿoµ`[ØIèîð„@M+A,&í2tiîð‹”E‡”?.›:DJ€Ââ§BºÀ?Ê©ÚKk•*a´ð„NÚC-Ê 6uE˜ )'K °ÙháÔXO]œ"PÛÐ3UDPã!)AL])´EÖ%¿z͵¥¹$›³!Q _.G1åV3J`Mª¦\®øRmŽyãoWÄòÆ1>ÎÀJ´à¤:£¥<¤Ö&tê› ”ü6w„\cëŸþ:·„J Ïÿ“=>þ:zv-)UM§ 3a>$Ûf¥ˆ¸ÀhJ†ŠtH¶3BŸþÝ6ÿLZ„ 39ùtŽžì**šµy„üÁ/ ¶ØÖ1 fjTÍ"?¶3P.oÿµ@–¾ì@pQ{ÿ™êÑ“=¼Êµ4Ùž[FšdέÅÍVXÙ::a´DӿŶ3—³hÊèA* L™žâ4íѡ˕u“˜§K_.™¶Éönà!PÌç3ÖdÒ^ú`úbÍ$S+Ê­Ÿ€‘b¶lê‹QN‘”êÐeòf#5 NKMÐ,ho‹Ã3ʤ½"p„úáPÖË$ºt·«Úá‘QY”Úm¢ r¨. KÒ"T7Þúvk¶-@©o½<ÏÑ r?‰„¶LB¡#€ )RáRlMõij`ê&*DT‘äiq ¼“E^ÕÔO|¡Péù2÷>è-–Ë Ã"E]—T¥XdPÝËe)d‡ò‚LÙ——ìvˆP¨[³?´B„¾ïÓôÌB %òé}“s¼–OîÅá%ùK O]±xW/›**ÉXIIKZ®&1äªz~$DçN²WQt|;e¦b7>]f†óÿO´B¡ — F+d·h“Ódj(2ýF¦‡½¡ êtaxB¡d/Ôý!×xC„P—ñKbr2ïuF¸*ªú@ôN31‡ …Ôëkû„8Q¿SôûD8 üy„nÈ ôÅâƒ/¿+[í#3IèÍMJªv”†Ú˜[‹uS w–fbÔ:g–ÍžœËz>ö¨pļew3We¹ænå&Nö`ò|¸q ­ º‹“¼oËn¨‡\¼—„cìU7î6}PJå:Õ.D¥Ú¤NDÁɹ<áÌå6r•dþó¬âb¢Ã›9¬‚Å_HÔUPÈÓE[æ®fÆ\¹mÃ2/~i›,‹=ãÍœÆ%.Z}Dê³)oˆ.žkæ™ÿ¾?ùìÿÕ €G4ó Mäòëó•€¾Äç¾-sG0¤¸Ç3Y*øìÙ£ïE’Í<ÕŸÊÎ[©)UO+4úÑ*Ðó^?ÿæêOSÌÿÕ_ò¾b&I媂:^cgõAIgš¹ Yÿ~Ejüv4“×CWÍ\Åv_㕈ÐfÆ38ÉËå^fÏÆT©dÔ$<éÄ4=s4÷«¢1‡G••壬y£˜RIÿ¨PÕ'˜ÿª:<åÒs'1àÞ¾íÛÊ”ÞhY3=qrF\Ÿ7æV UÜ…×1*WÍm:H’m1ŒbžŸ‘žÚöÆs'1„ÏüqñÖû#¯\içCÌœÈOw—\2‘?›Ý0žiÏÐØHå÷V”&d‡™ãe-dó_2) ŽY¨3°|f}:UÅ\×Ì)I¿Ë• kÕ,ó–p¶Ô?AzR6—[I„ 1ΙÀm#ô¤‘ÅjÝZ/Be@ó¾y9_vg^3CGEè–RdzàR“¹yZ~3Rþ0)‡4ýÂÎ¥V.BèJ»—ˈ e¨ÅºodžÓMhç|è¤ËïÎV|FÏó„¹ú®9ß;³ÿõÚ‘·â7 úbOKj1¸¿UÿÌó€'þ?S-¾Ü÷N ÄIußœ8ÕÓËõ "Õ-±¬jœkŽW5sÜ…`ê y½q/’•ÙÍ w²' ?œDs3 ùͲ7]AÝlQ™þsæ"ØJ¹}Ä›À‚]D¦”X•óni°Ž]$l¢rŒ”ƒy¨ªïøÒôNÇÛ‹e.9Ó™Šå·RNŸŽÔ¿Œ,¡wšy™ÀÑÿX契¾Ö›~ôk)¡|ÏÍ)Mœ¼¥t‡Ú³´Æl¢Í\Ù9+#6Ø"§L ]<×Ì·Œò²yÝ𒮜l瘹\Á‘T?’®™yM’·B±pS ‹Úã3Œ]½yuÂq÷zç³ìÁ§‹c(ªpóp¤ÿtYÊ ñø.9˜††3Zç•/Óžl¥jlaCx«ÖŸ¨«m¢´Ó DÃiRoñ©¦1ˆ™qœÏëÅSEYEP2W°uuÆv‡«ã<ÇîØÖwZçÿ«©OJ‚FŸL6‡<¼ýXþí©©ª,•ùeÃd¦ñí‹Ã1~µXUwôºtz’þ1.?xl¥©ªpi”Ž…”ƒÙ8¼KžXÄ.õEKhR¼¹\„OT5vq‹`Ntù2ý:¨¬£í‰´;ÏÇŸîÇ÷lbª¥ÔÞËo¡}Óº,L9å…zÃ5^pºWn®‘õ‰xÛAZw‰Âi¬<3—I…ÏÐáRT‚v´¾6†çãÌzãû¶*­ô´]S º-VácÂæ˜ÓŸ¥fB•ýŸ)|"m³ñæ=c÷kf©çA)aCúû§¶5Q.S3?Ÿ¥—Kk¥|‘eä¶¥'x‰œcÝÓϬ~àÏ0‡Å@ëlˆ· ?c×ÜçóË8®Sº9X’Nà"M&>™«…¨³tVO§½´©ö€‹ çãœzÓU÷µµÕh‹P櫪p<ÔÒ'%ë觬î ÿdQÊæÀò²'Á@ñ·®ˆ‚3œpõ|?ÿd~޲KòàÐ-ŸÙ¡çž«ùÒ¼p…BêÆo¸'Þ•½Q¨ ›ÞÀßöD¨G‡¡æaÏùÑær×|¾C“*åa8ïH‚ÜÈÕÑ Äzf9ƒ.¨ÌË™©eÊæ„ܦK‰+tV#Y[¦¥êo%*šB‡F›#Q9ÜÃÍyw/Ó7Q˜¨¥/*ãi@¾¥( Tf±ËyÇ"Ìi\ªf©¤´É XJl«@XXL§ Å]dÕµŒ’…4Dï¥@¦Zg{DJAžšµª¥¡úWy¥$ÝR“%["#~nçt­Àµ"ý1*[½%%7o"5ˆ“ Wrç0§=ËaLšmJR.8¡x]21˜›tòa­C¨Kóð«Ã„jåáË®šçhJEõ5L»¦åª>ˆ’é1PèÓÑ ‚Ãd`ƒ7T•Tv)ĬRá Ò¡ ¥RJ­aFÝBbŠÜ"˜JB®+º«J¬þ&18eECÎ<"ˆ‰YaðŘƗƒÒãÉUÔ¡l &}È3M ÍÒ¤!6ÎCG¦ÈTz”° Jd)Òg ‡Ñ ‚‹¥¥yNfÀC(..RZ53¬qÄ‚† $¥F~±¼‰®6§†»­ 'O‰:bkˆžX¬žêvÎð&âö^ ÙÛL€)Ó#°F±Çò”€Žçxk½dÇdfqÆÅ^`†ÒÙZ–l8š%ªˆM9­eûȧ ¶Ô•^™0ãÑf8r¹Ë3•vCLûw_z¬)° „bÃQãš·´&£éƒþ¯²9LDõ” ©—ËO½öEšZõ3ž÷¾È‰ î—¼Û&àœ—ëuF¸§Hç€_#åz'UÉyÿ¦=èœ,ÄHMùZØ÷¢ð"ôäP-ûÄ&!j!e¥c`úc5­çþ˜—\^£Ù/?+÷ÙˆŽ‚ôüΘ,T,Tö¤ ñ*£ÝR§‰ {Â)Pݼ@@œ¶ý¨)ù“†=è-B_éz V7ŸöøpPÞz~.¸p¾ˆôþ_l8!/½?–7Ĩ }Ny¶Ñj&Ý`'Œ)AvË'¨U+i•UJ¦ ):}•ü¢S^<õÊÎÐ$7˜õZó²ðð¨ w»Åé é².1¦QìÿdJ„|Ï–¹…œuܹXÅHÎ]¬}g •)+KËøn)]”Qç2lƒšrìÇŒ•Ľ“<õUUjÇ~©J˜C-i ÎQ$v_äw©|æ fžV¶½‚ý[ajI PShõ@°˜³Ð#3Ê9‹—2ªÊš¤ŠÚß9KWHû†ûx·P±§V¶ §.sNpмî«,J+q‚ÞWxImµ©rñHÛËü‘ÌÍSWÒ<à¤c5Bt4®ã*KæR¢m™Yÿnsæjžfš¥,Pѽ沆²•)E@’⺄£SÐuyòÂå1eXuÙ©n…æ’AJÛI¾I×ÝÑÕ áaßål½Ú µté@º—ݹ3ªù²1†/GȘ™ŠövAzV O®7O;ÂÓ¦©|íÌ•!„©`ÚË%¦3.™tviØK+–(J|&fÉF¸´ÃSa )ªÒ©ž»,… :ê[ ÑtkÞ"L+ Rœvó@&baFÝQg ÖÓΤËË÷O¬iëœ) UK·A ÜI²Ò æßPÒ‚U¢Ó£²%5PòVàBëêš§`³ª5=MRл¡J”æLìÝ T³0¤€£ ^²b *ÜPMÔØ³èB‚©rèõÔI™Rí:$\º+0m>¨™Ò™÷dHˆˆj¹¢˜ÍÓTÕön–‰ ]VÃ"4m‰XN+ õ¢HÂ!FÁ3=SÕe‘š§ðŠ›’@*¨›Eî¨d0d•Õ·+ruNÉJV™¨åƒÕò¢.?ÁÒRßuI[Ì6l²d(â6óÉí©õ¢Æœ´YÓo—BZCjH( z»°‘Sú’> i_õ {d"YÍiJReaA۲љÍäÌBŠHK^ر=V–’‹‰H•¦z4Ù Jª„À¬ñ$™ƒÔGL(TÔ"ñR.ÎvÈŸDfB*ëU"Éi*n]éMšâãÕ`æ«qJRdm YŽió1@’y5Œ¨a¨Ç,\=Ÿ (Ç,£ÿWhÔ¹¦Aj3"};%c£Åé T¼*J®÷ˆ “+gª5XÒÝBHHRe-&ð²X²ª 1eŠ}1 gGx«¼' &‰0U5+ÌaºØPQHP*6‰ˆ¸ÄXÎrú&d¬ ²bñ¶Èj¡*êÉ ѺåÊ0’|º”t÷¯ ÛÕ ~²–ó$0/‚ ȶG¢.0QRÂÚ q-:Nz"TXÆ*²B¾'j{Öo”M`>÷qDφdèê„p±=ÎÌT½Ìü·PåÕ6RSwÚ°Û¹uŒ¿ã˜î÷È[Æ}Ð4JØÕC„­7ý¿ì…Bê™øS¾CŠ{ͳݯª5QMãöyùxøÍC(ý½Äï…B!SäxøT*¡O^ð€záP/}ùøøT"-oê@>˜TWQôǽöB¡@*¢~ïB X©Û Á1Ó € Þö@=p¨óú™õ @§æ{‚zí…@7Ÿ˜7øT ߨô* Øô8)ë{ƒÙ €o=ìÿdJ€‡±Mm9mÙÛý2€‰SÁZE±¨ˆP¨¬Íâ>R”%¦t¨ÈjÛšˆ\pœæ£Øà_Øÿd8foû)ßöERÜ.â¶d/w¥oGTXª*¨Ö”ûßdNB3% ¼,ï²/^{`÷¾ÈT ö:$‘9*Vô‰ê‹ÀåsVKSeжPÓªRÓ„™!ABvtD6ÐøBAJI Ï¢Iïdoû!¨ƦwS;’ÒvÅš¡ç\Ê3jþu…cA9~ZÝÚzŸ±5*]™¤šzD’.¥ N¾ˆ¼*ÿSº7ý‘8N¿—¹õÊÚüªª™Ÿ8†ÒúIQî HEšjgƒYÏ æè©_ rÙ¦mdeœí9ª¦€t•(Qbœ»åñSB ¥òÕ£T(²Ñ•sŠßqJ¬¥&c»pËFÉEž‹k;“s‹–ÚT›/I Õl¢RY‰Ë¹ÑÕQ¨j³dô‹0RóªI•Mµ|3¯ªÃë'‹oÐ̬ø›^zãrΆÕ.†röUá|á9©Ú%+WqRí…-Š©9½J ¢A7Tl‹Z”Ԝ԰…ÑV»óJí$˜¹` æd¶ù"™ÍFê§Ûâ–&vqùg-æA—M §ÅvASŸÌ:öFqˆ§“•壮2þf|Jbv÷´lÄCÏeSÑs2[±H¡2 7§¤Åȶ|¯.æD%ü4ÑÝÆraiU¦vú#ÄC¿Ÿ+ý©ÑM75ȵBF /׆—š ™iê ÿá(²éiy¤2™2‰wO|0’×4¼ØLŠ(Ô=©¸`‰Áb)ù¡)ùt“°L-ÀbpXË›ÒÓ‡F™T”½ê‹‹hæ…²‰³DEм¹è³T$²Ëyˆ¬¨7KxÛbÜÄà±]1.³KzzK‹•žˆp[—Ÿ;Ìq}Új[¥A°PâŠ2Ñ!¢1þç5ÙÐ49úÓ1GK= ã,›z…™q™ôdÍ›Ð0Úê(iÖ•º†ÓuÅ}FIÒ"g1NÞ g,æqþÖµQs2tò>®2ˆôÍ0§ŸÌý'3ÈU 5ÀG-رŠÛP¥æ©HRÒKIø‡FŸf–.Ï«ËéT@±X¦ÃèL*e˜£æ&‡‘¤!ZŒ°d* †9„¥7èéR¤Ý uZgÕK4·ÍW”ÛÅW•ÉjàsP!B’šzþ2¥è‡¢ÿËdŠ*e‹l/Ÿæ!E²Ôl8S ¤¸%7•m†È¸Ám-«š©þ—K1¯ÿ1¹,µ#›œuJ9}8 Úð uHD¢Ã™Ò²¡–RÌì~ÓÙšÆysó<·˜êó,u4¬0Z©¿c÷§!9!¨ELzvzsUÌ ›´ ¨LÛæ5{‘›u¯¬Ïíÿ–†ÍÕ í3HéÏþXDÜÆ&T;^†Ée”8è„”ƒé”ja0ŒfyšrœÌy‡Î7ÿ•¢Äªïæº>ìfæž¼|~-~ÿäÞÅ^j«£K]!ЯùDXyóÇé—ò-U¹ÐuhF^•!$\s Àô]²#Xáã®rþGµQ™(ôÈAÕñ'3îÅbcL¿“#µùøpÜˤiÇHŸU‘-Ó÷Ù ÄQJ¬úh÷¾È±ŠTã$”¤*FBvià6õI¶êz¦b\ z®R¸™QáÛªqÛék Å6«Ž®e*Ø© 8PN4î¦õÍ:'š¡*êÕKNºŠ’Û,6&·¹$ ÊÒDbਸ਼<Ž®±úW\+ï%&üĂ̤@:¢aSÞljcôt¯UËÀŸxðpá/þSŸ£™³j<°×%…75ã! LÐ, UºõFx·lã…ÕÎ\Ò—0FC5ë•CfåKÿ”ó„‰VC£@5g÷ADsG8›S,üf¸ÂFtsO7ßrîDo’/ V̬–£ 膧›9¸L¹‘-3y¤èë0²ŒG5óYX šM³ Ÿã <ÓÌ„ú§-o6?‰€£ÉÌÀ®æDTJÉPµaÙ¦5 ÿ–óÀýsÐgPÐþqž AÍ\ÌROè IS5-ç ‚„sg0¤®^pr¨gNøYJSsV{„«¹ž%7›Ó;m.E/þ[ž”Ëô'/ Æoù˜E)iæ<þ•¤¶Ö@³âQ“íi&rÓ¨\²™žWG7gÆÕäN&ZAy±g¤Åá•)¹Ã6Â2GT’TA/4‘&ɘ¹H”Ü㙹ŒÈÜR²û@Þ²ËLf&òDÇímšyBhÈ$x¿0ÇýQf˜•‡2sOþ€èž¬f¸Â)¦æ,ü0€2'%+3?õEïòLþByÌíš^hÿ8p´™3â&¬‰Ä§n+Gø UÞgÍ$[ýâJLÈq»%ÔbÅ£\Õš%´“>@Hš¯£D&ŠY|Û˜$úK€‹H.!?ĈÍÁJnÍG‹%t˜ñ‡Í|Ř×e+aYCˆÄø­‘aØ g(¸z~/—L¯´ºÉçÉ)9+ólÿ8±PóÎ<̹ÉÍUµ4ô©VRûA-*eH3‘Ѧ3äç£ÕðòŒf{Å;_åÙÙŒ’§ªò&{cw TsVb“™%JRdJ‚dë‹)ççŠo ©ûº'yGDâNPQƒž*æÊ·DÖ‰Â॑Ε…wFTäÏßGó…Á@÷4צöPýÒ´ ¤}q¬f 9ÎjÍ[IZòJ€ÚDÔáR.ÿÍÀÎ9ò¢ÁúS¤ÎR A3…ÁB®w©*#ô—Ì´¤ChZ)þs¨Pl§+xàM:e)F±Êk›³w##¨"^ÒGF¸ÍÅŠÿšfA%G"¨ è%m‰Û-‹pç|Îà?¡T‹u”è‡ÎçÜë\ŽgÈTîQPÛIS†áj!i¸T‚| Ç<²©·¯Á…á1u/V×8´äÃy}eí…‡ñ.=Ö~_ßÿ'^“2ª©LÅ2Û5x÷y³ñÎ3S0Èy…ðâh*l7oÕtôÎ$åw|~,Õíîº+ªŸªh¦•h7UóNÍrŽ‘8Ó3ã˜Ây†ºšÊªf¯– „ØÜÔ€ŒÌÖ8mìÄß18µ”y7’¡¤+øÊ&Ø÷uŸ”zâÖÕuK¦BCú‚‡ò‹på>)SÁ«œðÓ?ê>)Aö7@ôZbðå>,c¬³½˜VÓU)+¢uëA¼’NÁ`'WHñ\q'³˜T¹ÿÓ8¡VF¯<¼UìЇj×áf_Ôe¥ÏZ’+³¨iËî²Tê&£3¢À!3Œ:xüsäËX¦6y«/pL¸#ļ™oðwËáyc¤6±›& ÉBÈØ£Â5¼óâœZRºÍm¦_ÕöEœqa`º¹Ÿ„=ï²ãî!UV’Ú}èšâ«s´-JΓ¤K£¦"Æ$ 'ÐOª4·[(XII”ÄΣ=‘mc*›3ã`ODÉáQ_—x&}Ëø@UeÜfæ;eiÙ‚俱;Ï‚]‰ÞxA%º¾cæh{ÉV+.Ê2wpÞºMCÂD¤Ìì´Åêüû,Ëó Zjê¦iê*AM;KQš‰#¢ÏLD8åâžåí7o[-²”(aÎy‚“&C.æ´ÃÊ(Ç Z›AcIè:Œ <ï#f4F—8ÌÃÌ¥·ë\q×”«¢à ™ôD¼ó,q…æ(¬atM·ß¨JÁ@’­™J¼o=ó»OÐ~ODíU-hmMW´B©ÝAWy :o$AŒÌpc“½È“•yS­ 7¨Ã,úJo$¨ÊéVƒÇ£·Ÿ-¦'³ÔÍéhOE§„iÁà2ªz—9¿˜ÊnÞK­Þšˆ²à–ˆ‘ÕèòLT=©H!½>-R‹N+ÀX˜@L§¤ÙÙ 5ŲQuA"bÓ5åbzw‘ŠêP@™ $‘`Ñž‚îÒ6·-m.+I 'f¹ÄײãˆB)$^2þ…G¢ÒØŽŸ†…¨êQ”û QTÞdâ¡-‚²LÕ>ÉF§¡MJ£| Í·ÙŒëŠ)äÊ';Ž)@ÝIQ”ÏD¡®"ŽP-2R@LüI&õ‚ƒ;4ï)‡¸&µÞ:Ê­O@•,\ øÃ†Ù™›#µV\––¥êò¢¥¥@,ÝQ"Ø‘^ùcY§Eº …%M¦@LMs· cPçj1FòiÂÒ™ªj´¯¤Ù2#YB9ùN_Xâ«.‹Õ šŒì”­åOȨ¯ðÿêØŒ®¥›Á¹¡ÑáV #M²˜<ûB¡5¨Q.ð*˜½/ùDâÁvcL¼) Ê`Nw޽bB5‘F%º‹ôDä ¦’w qšÅïI \ NÕ™L¡Xˆë.%¥]¸©‚¥ çg¢,D¶‡a H¬iÑd$[Ê>1g`tn›(OÓ^XšEÃmŠ3"ö›d!¬z­—U”Ÿ,´$ «l˜×h1cô69erRBR‰Î}:4Ę&lŠÌ¶±Ä¶ C‰QéRLúbL:xó©i(|&Ò-™º’·D§\ç«-bêÖÅФw3IHh‹RNWR©’†ÆÔè$õˆ•ÊÜ2¿”Ô!å†ÐT&P££ªm ù Ô§¼&•"ƒx°i1 €¨¥ª(BTB[ LÍ Ït£X—•.·) /Ó-q˜ê\*Œ¹Ð–î¶Ìé¶ËbÑ´57DÚSuÆ[ HÐ’e¢Ë% ,ÅS8ÒBfÝñu:­ÑÓª,Bé©J’ÐnúJ®‹¦À%2LõÌu)uS¨‰-´Í^´öhÓ\P‡1R±ÜI¼ @Q²s¶%bÖ.G0SÖ²¢xT’”ê$OgDkq‚2¼iì§Q- ô¨ð‹Äóè´ê,’S¼ð‰Áî™öQ¼ð‡ ÉsͳÝLî®VžŽˆÜLSxÆ:ôhùhLúÏÄÓ ùS¼ð‡!/{)>“Â* Ô^ð§G´xEàyƒmÔï³Â' ^ÀUQd’ŸxðCz¢~ï< +7Ìû©ÞxEIˆõUm¸D”Úé·ùC…‰®²PêdÒÔû#5Ší+Sì'ÞHÕ‚Њ]) IQ•Г²5=h¿#%!Éè–›6茂|Ò͉Jm&rþpJÞJn-@’Ñ;-”¤]P..êÈ.x§;5J5=…®¥I) VÂI^Ë4ÆBîÕNËn‹u^RŸlD¢ZJ¯XÝ`g¦rêMË—¦®ô×)¨žˆ¹tB.…ƒg…26Ì 1Šá¨—?!/3—H]’œvSž›çL…±0èïòfòÑÒ/)#¿qbÙ*î­ñ¸yЧSÊe7R•¦fj™#I³D\º `Ô6V–Ô€ ¯Ýš¬QÓ G:tœí{õ7•u-©DH¥7ÉôÎËcPÂè]J„ÐÃfÃÞ¾8¨¥1Ìʆ„¥Ñxèô$h†_p>r±]Ô¥*P&ÀN³"ØÈºŸ¯RnR$™¥DÎ`Ë¢.&­¶¯a!Ç.‘+æS–ɸõau i -„L „Û`³HȲ ]H$%›AOl¬OLdSÍצEmÛ÷&R:삱ógVÎV·n’R/Ø•U¢ÐŒIšwðcyWgDæ5ÁÖ‹€x€U‰1©›‡Ç«‡ÌyåB˜a …!aö’§P¡¬Ú')éÓü“ÃÕñ0‰Ï/ñt›­©´áÌN÷«¨XmœmäŽa®¬4ĦŸº ïi˜bGE±¬zfª®Ò¶‚m¶D+Ó0 €_ªP ,¥W͇Fž¡-ÄÎWD§33`ôˆQXéJ ‘ï&òBŽÛ5F±MSäÈ6>ªzº¢z‚ÙªZ‚Â$ôÌÍ‘óíøt’8@)ú×ׂ0®©+†Ë'Ǫ³¼ºÇ°iO‚`’vÎSŒOPEk“¶­zgtjÖ ‚‡1’’'jI"Ó°Ê,CPâsî5Ìœ»J„¥A׈ÓeÑ`¶vB)¬púm퇚#B¤ð‹PãFu.³Â 3©Øç„*!xÞm«0•k=ªŠo²OüÆÄéÚxFx`A¨Øç„*?1ì£yá €>9>o„™iÚ:#\ü»Û¡bŸgy€ƒv]Þ`qLä›×:e)õEâ”ߊtÝíŒÍõrùpÔ«-š¤Iyí$Ïæ+¢3„Å;ü˜ˆË‡Tã뻼ðpàùöTÎ|ï5s M;Iô¶qR’D¥$ªvuF1›z<øk×®1.Þ8„ÈÑ^UKšúÛSÏh–y¼,,ÑQÌheÍ}p¢Ì_ù‘3ò:?û‡?þ8Qe´žpqn_¤¢#ñÜ6Ëú#Sг×5 —Ð i!÷?þ1µ×3¤’(h‚†€rGû`ZàóRAü• 1W¯ý,¶•Í9ù*)•›à¼ä‡Wr55E¬†ù Lš*LÌÉçW©,à9˜*f’Œ‘ â¯þ˜ŠÄE´4dÏF*¿ša³Ó'?SJI¡¥( QcÖþ˜ÖTZå®`AH ì8Êÿ¦2DªÝ>|ÛE¶òú[³·ã/Y™Ðˆ‘Me”ÏU 70ªÕPÒLËã(ÿF¡›R‘¾cC &Ž”‰›ª/¨NÓ¨"EžO4“ݤ£'E(z<"`¯q?åÍTjÚCÊÿd@ß4•YCH·ôE‚Ù™¥æE!¹QR”È¥>¹ö&ÖË1LóA"‚’è3ÙÒ;‘(´Àæ²’•QS(k"¡CþHpY“™Ò”¼ºjºURl²]ȱEœÂy£ôºSÜãR£d¿ Åš,ô/šÒ9e'X¨VŸr2X©|ÌS#•RŸhy™û-ÆæV9•ü´¥ykĶùQì¸"eÿ=r¾ÎÞf)Y]:€¶¦Ò=È×å”óÞå™ã¨¥»“0…&¥µb%ûÆ`ÿH—\sÏåŒ&}æU'™Â¤œ¥‚5J¥6o@D<×J¹þL*9c`LY欈âY×¹©*ÊÚ™Ò|Êd¶!g…ó,¤¬±J¤ÑÔ'™“úK*HÐ|ÈþheU¹ÌD#ÿ'kÆ›ERtÏ_v,´ù‘F_£2™Z%T™lÔˆ… W5i9SXüÐþȉÿ'c,h™íD *¤ó2–ÑVTÝà±vUi´ÈéîEijosD€C6[ÿŠþHϪڋwšHºœ•“mŠóiþ!I`4(¼‘?5`Ê{;X— ;¥æg¹—#­s)n‘NL2ðvbZû©‘ŒëSoG(Ë n#õzÆs¼Ír Êj[éPD¿íEÞ ðcÕîé´åZÑ5 êJ§>ÉÆ¸yæ9s곬ͧ†ò§žJIÄ)l™Œå”CÓ‡ƒŽr¢œfnU4U•¼Ñº©^R:4Û¢a¯ÁŒa?U» ;V±2ØGB•?ᇗ,}œúœ×9f£ ¼©o èu.$ ÆØÌ˿ÄÇ9ÿ/ü¬Þg¬¬­HK¨…¤ø°þæÔ»ZSx´”ªFH*?ÆQº‡ Æ"~ïäÀkyœ,ÿåÌ)>©¶hŽs/Da᯾øÿäæªóÕ|Ê“Ôüÿå18xÿ¿ÿÇÿ--9˜¨wÚB?ÖUÿ,8r˜I¿ä+ÌÒ•NÓn;©*YJwÝ0™†°Œo™¨b¼Æ •—4zRÿÆmÛO÷Ïíÿ––*s5‰J?Öü#WSŒ42u$³Â/sÔ9^„ÃHq@ŽíâŸå ¦°ŒfyšeýC=Nœ¹$eá>ÑuÓÇýßÈæ«3%DP²´Ÿá†'÷lùhHôžáÍ&üÏu;Ïp!/ê ÞxC€‡Ãø¨ÛÁ·%)ËÕ‹Š4j‡±Ûèp¬™Û/Q¥)Q4 Î…ƒΦþ>QŽWÚ] µ€Ø.µFâaÆg‘n~§l8E*1;¥VÈLÀÏÍÏÔÑ´ÄàOÎ}Ézaô€|Üí¹ÛÔ* ÃÃ9gDÄ^ȪÕs¶ƒÍýÍæU/R}fdTù“á½pm”¦bñJ`“6#ªØŸJq±lÔ2ÈCxe3R´*Q&$jéäÊäãç,#¦Óéaç¹eº”fyò¤›Ê¬Îz#Ž*eîùsŽý±þ²ô«Ô—¦;\<W;Rßl.¹Umˆ™é0¸ hT‡•ÉÌ^éº"Í)§Íê–»Lfáórœ‘Õ3àIUKÔŸY…À[ÿíÙ…™ÚtÅš>nS’7˜—þnzŸYáàWó·Hî 233¸ ¦ó8]Û¾%ZIÛÕÊ”ÃæåhA˜œRÇÜårÍN`þ\Vµ%gÔÞQ3YѪ1„Å=/Ç(ˆöuȫ؎ƒ3¸y‰¦%´”„K½+NÛa•@Ç’£1Kß šªRo9^³Tg‡o‘1èèþv~÷ž«‡&²FaÏDÀ¥8ª, ¤ ¦VZbÌņ~pú¨˜é1››Ñ$o¿²/W¤¥;þÈ—Uóhªè’ÅÙr=¬h6Ušdç„fñóžÊ%ÖxBàÕHØç„. 4ÌkÛæl¦„))iäºâÄô‚Ñ8ÆñS×âñG✽baÝs@¸:I1»‰y.Çó¶Næó¥" kƒ l´Âñ_RUæüÛS¸MÕËODjñ¦ñ­Z?7¬"^˜ÏÒç0ŸØæ¨¬«v"}g„>‘œ½¡–™ž¼V£ØeYeˆÞxBñU›¼ð… óƒR7žú@>rõ½O}";±½æ|îÄo”Aæç¡Ï}*$Ô‰™'yáŸÅó(‹Zr]sDH”U ìµl± à‡n‰ÝéÓ8µ=± 'J{`°î2 ÒzZz"Ü Qµ±.›£ZfzápÇû½°¸ Xx>›S;¤;Djâƒ%PF”öÆlI?µ=abÒx ›¶uÂÂdïš6¦õα«à4cÏJuOLfz×ø9<°º…esQI*yûmú¦3‡G§åÄFn·Æ•·mѦ4óOG([Žf¢‘p$>¡#;ÉHÎ0õ|Œ~œ?Æ?Ö]‹¯J˽VÂÞTùz½°±$øœÊlë…„´ÅzW'1·L„jfïÌX;³ôÆmUîYצô­»Û$"œ=7nÝùŠž1© ãµ=±‹¨ûvŸã“êöÀš@ö )"ò´ÏÚ1¬æ,;ãêöÆOKcÊhŸ£¤ÁHHÖ -õ”LHŠvòç´ßfÂ*>ïl^ФÇÁnÊfSžÓά4 W;c<$ħægêJ[LçºýÙ÷;aatØþ]¹\•ÝÃ)‹ ›ÿs¶ñçmÉm¶%Àcá.wetÏNȱ0*ÊŸ¸Ø2)6è”&aOøÃR{bp€q¾îó às¹|rÍtÊR”¤U ­#dg9áêøQ~XvÆ@7lHõÔO.]cø¸Üևܥ£OwÿÑ™œŒãHáíøv_âí‚ùQîóÂ7CÃè¥P{Þ»)ghèá1aŸ™û6žž‡˜×wyá8ò>ç„8ê”õÔ^»ãLˆž™õF± ñ)›³ôÆxù‹$.³Â%ˆ<Äí ÞxE°ŠœkìÌ'Ç`™Ó#Ñƃÿ1-—Yáàæ%êϬðŠ$ª6#yáOgšÍÙ}\ë’,€BZ|ÎÙxOç?{èxgþ ÿÊ?ÝéeU÷5펼>~"|Ùö%é‰ô¨Re<;4i‡¡SçZ˽½®)¼~Éi>b^¯lNCægêvÄášW'é‹À¨½êèé‡þ`R~˜p$ª>çl8ó7½IVÃ?1xøøpós¶'Q-(í‹ÀÍ[àí‰ÀŸ˜™ðvÅàIÔýÎÞ8üÆÄöð‡þcîöÀ˜û»Ì8š‰ÞxC…& 9ŽÜÈžš'÷bB HzCÃ-’1«Þev¥š–Úî+Ì3jtÚ½Ï<¢!ìøxDå7ý¹£©7g F½F7ÅcDÓ§¦3@üs­°ã]>ØR…áø•=ñ¼ú©§îËÓà©Ò&• LB¨N<½^ØÓpEÒzg¶7ŸQ—$­«ª§yN•¶û‹,’UfŽˆåŒÛ¿ÈñÆ2èôô§¶4ó§Æ‘ÞØ¢”áÒÂ$S)tÃ.¢ã^¯lJOŸg¶°T;²ºg§dX€YÅÂD®Êè”ç²$‹ñîÏÓ>?Ý킹|É@îa’ÕѨ¥)y&Ó¬Dœm×Þ™[]3/°ÃL¦íÖÒ”:„£QÆy\ÙUô.Ö6ÒTR n!Í~©œL¡¯’pš†±vBèß r*§0gvSÓ´F±ŽC{Ow¶3BÃ^¬(Ec}Ùl¶-Pw¹2›V‘+vƱ€ðjd<õÄàOÌÎsGU±*¾<çÝí…UbÞfw|`ƒn™Ö*mçö£ÐLd‡´÷g¯L(^ÚžØPãæëq9laŒÅÀàa×¥! ™˜i”IŸgF³9]vU¶9ÔýN^GÝiÑÿ:ú®ÔIæ’«Eé±9j¥´5úçã y}ÛÿÎ,K5RæŽØÓræy‘-Lª•IRŠŽ&$å¨Y—£osk ó03pR„b úL!›ñz[c?¨‘7RÒzT¯ä"¹åœFÔÏÓ†_šºnÜ¿+'9N,Cÿ%ŸpR5—4Æf]b<^¶cG>'âŠ`>éYžøZLø»¶§Ì˽r}ŠæMOê‚^],¨zÁ¡üÆ1õµiÍUeK ¶6¥e_È@Ê0ô™i8òõgé…C î¥ãRÔÊf[p ÔôÅá @|jw0á\|§ÍÈÃt J*ÕPÈmDNFø·d1ËåÛÜÄÍ{KÇWPç/ª<Îûùi}l:> ztr£„ã”V¼>lÜOWÑhj*^¢§¨t¡ u´­i¶@¨Dxrˆ‰—«úL^&:)œ•+GLHª¶¨Ñæ=¤Ë]‡ŒKƒ§W3™«j¨r*ê”-)q ‚˜R» éûÑ×ÁŒeœDû±äšŽ_-¥YϲJ¨)ª*3T¢g"ë¦@éëVS†SÞœ1‹Éë|û'3M¨k̓ë]³TãÇN·/Dg$ÊêôPSš·Ó !%d*7R,:ÉŒãMGUÊb!¨bRH=ŒK…ÖS¸ñ‰3R{Ì™ÞØtO®5ÅIí©Üc<ª뉼ÚФN_Æ0³ >O‰;¼3$ÓÓ–Ÿ|µt)½&j"ÖyÎU~ -;Œtáâ ©÷‘ªÙp£*™x“>£Æ'âj<ã]äÎ굈ÔU7d*‘ë'qã†UäîÒwp*ƒë#q‡U3j7\*]¨•¥°¸¤ )ÜapMF²ÆüÉîvÂàµ=±8O˜ÌÞRdrRîÆ®ÒŠ™NòeÔb\ ?JëÉHYIº ¡§H3&¦Ã*|á<ŸGÍîyYP↠cm…($¥´ÌØ5Ûd}Yùqˆôxg î{¹Ôõ9¢ò¡”*¡âk«ÖÙudÞ ° ,'¢DõGHÇ·g9šŠmVe]œUåy¯[-¤ÔbU´¢…8ÛêMàFÈÄxñÂ':n9àŒÛ™yƒô<¾¾R‡Üu ¬Q¸\mµI7—Ó®7âña½±Ÿ—)ƽ]µ®«2ä:º:wMR™¦)5v›ËGzI$Û)i4k‡š&}Ýæoqù~¦§ü/ªeÀ´ŒšÔ’DÖÕàS#®qÛ¡æ/ÕrÎ_ª«5®Ô –ŸWA¿TèÐN¸ž,ðÖr¸Î2é/¤¥ &C Ç˸¹zã¢Ò¨œ¯"]F+Ìfßט(åQ0ÀOw•º²&ÝH‹—A–ºw‚KÙz‡µåÔÿû±‰¢êY¹}ÏÜål*t!‚Tö–UbÈ6‡1˜vóÅeRêýŘ›™~8.×p–³1çÊç*°——‚ø+%·LÊuØ«"FVïåðë~®˜ÿÜ>þ^£¨ÜtÍžÿÜ‚¿†æ\”ÿÝ»ÆK÷ is.=7õN¬î÷fæ_2A=DzëLp•~à ^4 žÄº?øÄÄýà ´eå:û®ñ‡Ëw÷$ÝM Ž®ë£ùÀf§{÷â]k-µJ½´¦\ŸÜ Z42Ý=j!XÖëë„T:ù³Û)–¯3û„& l–(‹eS=û‡†$Æ]‡mÙ—AÓ×ff§Ÿ.¯Ÿ. ,‚Bñkƒ)¯%úûY‰÷ïzž€è wøÂ˜U~ᄟËP}§tEŠE)ë?pÒÒeE@¤K¹ßtL&ƒüïî ¦ª )Þ8Iê²'ŠÎ~?ý z/¸lôC€—ë?pƒ *¤¡ ƒ0 “”"‚ÚÌ?qn$ )é¼å¢0§~¡û‰?ý6Š].9=Ò‰Àž÷hhˆØ ³íàrù«2ç¶²:—UONÒLÖÑYXï öÆrš‡ŽÙÓ¤Åw:„ä!VÌ­fÓn²cWÖSËyþi_FÛNeì ¯6±qJœÐ mž¨™Å÷Æòi—jtטs°QSe“r]s\<êTf\âZïeôúEK:싌À'2ç°lËé®+M®à0æ<æü<ÿù’…Àªs¢fNeZ¤ æeè…ÀÏSœs‘J'–2;鑼»m³Tk€á›s¬¿ôÚ}¾%帰mÎÀ™e”Ça¾±ü¡p+úÇ< ÿåtÊ'@,(\!/fÜî\jþ]L™/»ßY¶G EƆ¶s^ný+:û˺ŒK…[õžk¹k Ejá €?Zæ¢ô”Èh8šap¸ÀË‘.UÊw‘gA‰À—*åâFã „@šÉéFã k'j‘.£¥Ríg´ÆYí z /¬™‘¸ÂhнjFã€nÕûHé°Ã%U=(í‡J¬(í‡V…±nC²J¯ Á*Ëlºz"Z.Ñ|¦Õ ßl.šêäQ6…¾°µ¥°BIµFC\g)¨oóÁnLÆ\jM jSïL’µzc¶~Mœ±ˆŽóÎV¡Î)Ûf¢m†”V‡î¨X©Hë×ñùçS/KÊ+'§¥ýÃË©)nžžˆ¡¶e0AéDz|³—†eçÖ³§³ªÉ(jé‘KQNӔȑCJGtKe±àÇË1/Lá ÒY 2–Ûe"Il&Id§r™›Z‡>£–h«¥«KoQÞ á‹¢J´:#¤y¦©‰ñÃM5 T΄S¡¶‚QL­$tÆ'É´[q…å([¸´¶¥¶IiJLÊu[dgiô&"L“ÞÒzlûaj2vs˜Ñ³í……|O2DÄî Ùªg¦,ÌPº’ôÇy3,ûbz$Í[GMPÆXËFê%zi‘ÒTNØÆ3GÉÊó™t$ô„ÔÇŒnÜ'¤¸<³Nóu9·y=ú²|'g\sñÃÛòò£ü]Ù=í'qã. P¨³¼ÇŒ.¤ô­RgÔxĸoû·Jg19ƒ-¦53¨U Dú—P}dôØxÂÅî¿+ w0¸ §ÆøäüÅNç|Y˜ ){EäîG‰2×aã¸y‚OmN‡ŒX˜¦`"KH²cí„ÌÝ~^$îûb\ÃÖNãÆ‡°\™L®™ØtK®,LÈ{ )2‘Ù×h\¶¤úœ'çj“¸ñ‡ÍÔõ/äMÞI$œ‚ÓÓÊ.Ÿ‰•y"]T%à/'@ÔxŸˆyò›˜sy޶®‹-Æma+/2€eí8t‘œò¨wø¾-³®Î‘i‘è:#q1O=S‹…i'Qö„j(:UÒ71žéx“f›˜pƲE;Œ8 ©]ne2¾™XvƱ Ó!5'qãàŽmšw¼'ç9§¶ ÏSŠbÑãéÓ#ÓŠ ô®ai·Tºzã<~cÚNãÆ ¬¾ŸY:@”p°âç9‹ÔÙ¥”o4„¸â’„•(÷HH6Æ''«ÅáÛ u¬ c´êJ=i¤‰u‰Æ¢aæËÇ1 ÅJê Ây'ý Ĉ·øæ«Ì|«‰iŲ&l¸»4[vq™ÊÃÅ·(Óî½PÒ’d âB‘¬j1¸Ê)gqZªµÚe”­ÉÛðÚRÀë ÆfS-v*\|÷w¡m­'´ˆDÃ3ã¥jªkY± )õ`BlÞ¥ ˜\0‰ž´ÎÕfvâÄèCiÖV´ƒ¹%P¶òÃõ·A"¤‰•$bGŒ.+‘" JJFãÆ]¨>²w0¸Š€lRw0¸íIõÓ¸ñ…À—j=´îOÚËÿ¶\ʬÛGç²æB’H4Ϫ@‰ÈœA·›Õ‘Ìóž ]úܰ‹!‡¦«Dˆ‚,IMc7çeX3 ´87M3Àú~$bù5Wõ^|2•~Y3/ÁvVÙíÏѲ•ViÏÁÂ[–¨` »§ªñ…¬C=FoÏà .ÖP£¾™M•OUýbJ8ç|î›W˜Phœ…3ŸÇQ‹ä£ÚÎ9ÝV ª>‹–“Ô¸Õ¥œË’Mú¼´HNéeïú¢YHõw8•³ñòÕIsë¢Ù˜ÜIK Ël%ì¬iTŸ”ºç¾J59—9•XîX 4„‡Œú¦ae(sv½ßv€¦rã¿Æp²˜kë¹¢Ÿ4ʪßM—ß¡-â$ÍÔ™ªcT"9·lsâ¥íi\¶þ;a•ÎÑbÇ ƒË%j]Ìu!¶±Që*Ä˪fØ\5Ž8ÌrÐL§x r»?ç ÅŠ`MMj«Ð•°¤÷U%’%1±QvŠwÓêU\†¯2”º²|'º%¼Ä‰‡"'ª´êÌÔF2@×"UÊ0„ª¨—–ÂW´WxKªQ&L4-„çw†2©îëº>Ó \µôl)z^4û§ŒW9K•ÖÇŒ6„ŠJNãÆbÚ‰Îút{?l.¤öµ ÇŒº÷¶ÇŒ.!ùø“¸ñ…À¯æ5­>éã €dü§|{§Œ.kµñ'qãá%ýjNãÆ×­ï ÇŒ¸ô¼IÜxŵ*¦øMÛÂe*Õ²QZK¡6¬tYóJ'ªše»ÓºónN^Éœfb%ßÃäÖæ=b[n½#޾رN u}±xRWЉ¨NJ•PŠªž¥úWYmì%¸…%.¤wHPêŒÜ#ç<ÕÑréËÓ]Sš×ÕUß «§uŸ— CAZdk€årþcšòÒs¼íçéój&U:’¥4¢Õªl>”÷¬‘&‡O“2¼Õ4Ô5îæ¼ÝM0uT@•.FŨ•Y׫ ­Íªy“?n¢¦õ5#­4Å<…ÔMŠÓÞ‰ÂÎa¤ )s¡‰ ½ñ€óÌÈÌ¢uXkeÖ™A‘8‹u7¤”‚Ow\8W®tòuQæ«YxO‚)ÔJP¡=$hÛáùVž¡žCd)D‡)t&Ù€àR€íŒð´ÓÈ :Ï'eHI 7‚e­J'h‰,½ Kº ÄGÛQàùl³\ø8A)ZE¿Ô¨ç„ÛÙòñ©ˆì×™!ä¦ë)Á$‰( e;dz£\<Ö”¸J@Xqk–›éQTôHNS‡µ4)ø’OA$j²Ýpà…[*mN8â’&@œû»'djj”ÔÖÓ­ •lÂghÓ®3ÂX8úÂ.ÝBÂ.™‘Ð áÁg2éJEähƒü …A`ÚjÔ‡$›ÒM’Ÿ\jc‚Ð4ów—j$:õJ3ÁkJùJTW9‘pPá-tR ÓBvBzL÷™EŠ-VÀI&M]Q)Ðoè1f"K= (\|¤XnÈÛÓ¦ÝÌå 7©ó\ý8‚i«J”ÄËI3ÓÓÎnmêdü¥}#ÑöÆ¢™*˜©ÌºÚ™‚IR×19ŸdBi¿Ô½îN]M $ °ÕÙƒ­¦,S>®g=7Ëj©X(’Bd-**:âeMø§-®=™ÒÁ}¦Ü[=Ä€mÙ×á’j2–Ö‚µ%+‘€Rg9Yh‹-–œ¡Ä.òéVn’IH6Úc5ZÅ„-% h´- ©íׂÔo/kæ š•%žðÐL8-eÑ¢ëh¾‘}I‘&v[#)ň‚Ú[Ê Lñ[V³2¢3Qe‹”_Eä‚„€’‹mÕ‚Áº7BJ›ªEž)‹'>’ N .¶‰Õá)o^%V  [ Lå3Š-pË¡ @m$ wR‚%=23‰4Y‚‘av€…&Ùh뇥Ä!&åÑ+evBDëïØM,0çDùŒ–òÑ}Y‹7Û­Óª5“½˜Cóù‰÷~ؼ1 ?;V%§Ãöĸö¹PÌLöÝûa3Ã:ð­G|NâµtŽ˜ÖÑ]°ûµQ>ïÛãÙ‰@Љ|Äû¿lM±åD¼cÝûa¶)@Qz×£Ùûa¶*—j>¢}ß¶b!EDþb}ß¶cì ED§ˆŸwí‹xû"½2/ßlK€pßöÆï¶@^ŸŒ{¿l6a _Ó};¾Ø\{*¿?ÝöÂà—t_¾Øp žöÆï¶%À =íÇŒ.zg¼7}±U$÷´ÇŒ*÷vj¸»e´¦@6Ûòù‚zŒ¾Ø·Ë.¢éS€^2IÕ¦z&A”œý?l.ÃzR¾=ß¶%ª¤»Š‰¬^’¥gWL^ÃoÏæwí…Ánu“f59þI^Ò’¦hTñzbWo¢A]:"\#f}—WVäµÔ8’íC Bw”’³…À®QCWIACJâ’b ®É€Rßá\ÊJ*únu¯RD©«éZ{'»ŠÑ(P=2”H˜C9Á*fj üÕ9Nˆ4ÂáXZäÜÆ˜_Ï©j›v¢¡Ò\a䛡¥HŠÒ…³L8Îhý»Ì3lⲪž­ ‡Ñi):R,”8G±]¦Ê•N §i‚߇Õ» …èÅÉ©©_+妸 ]Ô "af]œ:¨7E¸f^3—)^¥æ,òòÀ¼¦ÔEÙé+"1ŒD=_+=²‰íuËn-몹$ÚS9z'áÁW”ñrèÌH+õBàT4êÅÕ™÷¦;§Ñ®,(Ý=S‹p¤€«Tee–ØbÍRšXÌÒ‘qI&Rä¥ÓdNWËf ñ@{&þ¡¬Ñ JäT´é’M¢}0¹ŸÄQIB•9‰[8³Ð]u/ø\™DŒúu˜Ï K#õP™6ª’ç9F¢a%vê«Èš–…+@JFˆ»!,¼élKÛ Ùf“9Ìè„Ò¶,‘†°¡gm»b\z¯?ûQYRöz· uUÄ•‘¤5ÄÆaÓφ¹SØáÕJeÄÙ÷~ØÝÊ”è¨S)º°‘gO\2˜a¾[ªÌ阻P–Mbº„ÞAUà•Ú4ëŽ^:z¾dòW6òny]›yü±Ê{ï´¨[ÁAM$r&Ò“)FøyO_íåÇ“SM™ÔR¾†Ð,÷RVÒBPµ z<:#Q0Žr¿mjêèÐýMx2[á÷_)SaMÝ»‡Ý3H–ÈMîqɨÌ9uì¡…5H]º¤8†ÉX”Ô- J&í–e¯PPSдêKtí¥´Í&Û¢SÓ €s/2Þ_T²R ––n)É'¦-¹˜—ÛKËôôÏ2ý?Ãu”“>ò ÕÛÞ螈\+6{ÊÓ-Õ¶€íSaµÔ¡2p%&òdg¨Âàp¹¯:Êr¬‚·—Öµ¥lÒ†N·(?E::aÄQ’³P2Š •¦î`w~àé‹q›Ï4î9Ëa×!p¦I> ±-qœ¦)×Á?UC(.Ò´ 6„ ©˜Nq8`·sTaÝ]MäH€™ÊG¦.3 B\£Kª­Ó~VNSÛ é‰qej€Z‹.,¥6­=r&'*–S ¬ÛuJGw “8pQ‰¬]Æ‹-)KBSÕlk±¹ª€®êœh3”µÛlK‹(Š«„4(2R“1!ÒDK‚”K ¸…&¡  $úL.ÅPTb¶ô»ÒIIÑaÒ n(5æ*›Hºý³Ðf?4 JÔ«*:¤c<-#øê¸ ðîÙ0 ƒl§?n­¾dåô8âW~¥¹,â3"ÏDHêíÇâþ/ Ü¨úƒÝûc¤SËp!º™|Ñîý±npê´G»öÄ™‚$…·Qçø‚wmÞ‘Ó¾´àÕOÕ}ß¶3pçbªú©÷~Ø\*\©ú£Ýûap›@%5$üÑ?éûbÌÁp8uSù©÷~Ø›AhZªæ¦_ÓöÂálpêu¸Ÿwí…Â*ª™›£Ýûa´ ê~ ÷~Ø\ZªÔè÷O\-¦\¾j}ß¶€j¬“ñGºxÂà*¹üÁîý°¸ «ê'ÝûapX„T‰ŒDû§ŒK€0ê‰?#ÐbÜr¤~"w\Õ¥rõ·U«¥1"P[K–wû"Ú¹|È Ѩ.@Uµ3.“óž^¿‡W•ÿn_è넹íÛ;lÛǸïöEµ-Hs=ù’ ¬êé‹a×öû#6‰qßo² ×=½=,!iX|wíºegHÄð«]xgÛàg¬ E]3”µ2q—RRâÒ¦&QËÍåW…=KëmZyeħªvÂÆà—<ÁïÈÜˤřŠ,ÿ“Í*œ¬2«i«†™•Ükºz[c3+Ë_)0ê9o/@rIJ”Ú-²-y"¥Ø“ƒJ‡\¢Ûœ¼f]Mšç¦g[O^ŠT%İK„†Á’¯)BFÓŒî^¯“àŸq~¸·Ž]æ3b³†åÿøÉ½éïE§šÌO/óA ÎPÑ*TX}èQk+"æ Bs-³òÈ—ñ‰EªÆOÌ!NK7DÁü²Ñ#âLp¶ròždREÜå))Ò¯*ƒ?î…%€Éù‰$ÿçsÐ 3rþ1 C”ó!Qžw!¨yfì;àY4ùG0ÉùÔûê¼ ;DtÊØÜÁhž]Ïf3ÁJßÅ-‰Èsõ*÷ëBÁ`òÍñ…%ªys˜ ·;"ÙÌS6?œZ-)²Lô³ns4Ì÷M3[L\ µÇ/fáSýaDÏ»ùv¤5J$G 3×ø'*dne´• S·ÞªyNº«²·Â4LâcÿÈÊó—t¥ÙH¬nD¸©H•à¦K¶VtÅÊE)i”ÒVX)RÔ£!¬™q˜¦ü™[ICÞØ=2„L1`¤=t÷†è±0(Ê,"KHJÈL†ÜpzãtK@º÷¶¢u(qL8’ AJ³TŒX˜l¿“9~ƪ©iPËÈï%i+fÛ{Öé‹2;wöÆè–ªÜài–˜\w4=SIVT2¤â6‹ÉšA˜ÔbmNžHû:s•ÛaR†®™|‹ŠŒqýšWCP]JÅ[‚蔀=q\÷Š=lT)²œy%x$LuÂØŒ¡…š¦«PXãŨ¬EŽŽÓœjÕSFûéHó*l3rÉõÂáËâ mŠ„‹¸Ä¬‰˜— 3 Õy[•+¼ª§5%èì1&!×ÇæÖ*¢Jo&¨mSM{ç¡DECYyâcí†æØ¨Bd_*;JD[pË(•®>{°¸e.½;\ì. vñšÄú¡p!C¾ßgÛ 6ðüA>¨X}Aº¥~ ÷ap ×tßì…‚ï¶7Bà ýAîÂà@—d{ãt.ÃtÈßÑÑáH©Bï¤^š‹kÕÒ˜°‚Úø–õAXóŠe¼Õ:JìMCfÁÓbÞŸ•LÿŒº.NÅöF¥äǤ Ç>§dF‹ZÇGR­—TX ºïÔìŒÜqÙüÎÈ\ ¾¼Vê×Üm%j’fd‘3`ŠymÔ¥ulKA“þ¡Ê[Ï󢻚R‚l»åÌÄý0²ŒM_:bf´ƒQ\ö÷¡eÞeÎ%"µ‹tÓº¤«g)à¦öêy±WSú :;ìNÝ ”K)§•«s:ÏÔM]Jª¸ÒЂ”ݸ’@ï°e;÷³âh2]*\,&K—EÞ˜d¬¼ãÎÒÔÍɆêžHšmñG?½3˜ÿ`!Éxû#O8).ÛßÕ-a §K˜8€wD„‡J®C’ý:ådD—ÌèŠ\µ³Dû«\ÐÛjZä›dI×ü=Nf„\eö/&ûeÖÅÅ&S JÁ»h‹2;·¾¥²öDM¡@6ôçˆ'ý"$Ì7Í™¾TæEZÇêTå`„)ˆ¼&’/Nqœªc‡§âe䉗¢m.”‹® ]7GÜtyòžaÊæÿ0Ž[­yµ'”b·|M7 ¤Ï¢b$·ãËYydç¸a„¹~€¤„¨]C“·¢q›bì]Îÿp–ÑHfÙ”÷®­2™Ò¨Ö2SBsŽ·¨ —¨£¾F3·%ë<òP§¦Uß 9£lÉ‹e,ŒçœHQ¨¥l¨Êî É5ÂÊUÜ㙊›I­¢$8>ç8ÔIG~§ÌáwNgArV÷Tfù)¡¦|E™ ¶a· ôÛ )dÔó[ªªÊEmŒ¹£¬˜YHûœÖ`.¶ˆ*ôÀ(\Á‘Õz7öc͈p ;L¤é JIzg¾J194„ËšgA(PÓ£\K(]Ì9•±yNÒHf:L„Ž\w¹›8O2eôÎùu-îêP’ $ «flà#'|p.^â›õ'ã¢Ë.Û rËX8¶ø;l¬˜b±xÙ 7ššëgd’DWI×ÑZ†«MB/%.aªÒ™"/¢á1¯+´Þh,uöÏRc ΋¾Þap`:€½w’H;ŒTÇRÚNoø‹kÐ ª¼>"g®ÍQ\æcÐËŽû~™D ë¿7£Ãá íNv-ÀLÍÏí…À¶³ù‘.ºïÔìAºç·ÙàU(vg¿f®ì[kŽýNÈî§?¶&ÐCÓùƒÝ…À[ßuE¸!ÝkŸ¢¤¾…⤕èmbrÖJLHÈв<}VF€t$\,w–.ÏÚÒ!Âá{M{.äþg`‰3 Â׿dM ,¥ÀûcR­—TjÃ0ÝŽKÐ"má»õ{M ‡•Ìl…Àùo5û,æJÿÑ)ÅB—6ÍJæa•(›é@µR·F¨¨÷<µD)2 vªÍ´Â]H˜U“˜è‹Â°ç”î»Ì™T¾âëº$JbNQÂr2‘˜:Ë¥ÄP¢òF`SÜRÐ@P é[¦Bžß>d*URÙ¨S…™6ÒBmxÈ‘‡´tÅÞ¤ýÀÉj›¥¸âË• KO¶”…`)V|C¢SÖ#;AÂü­J)óœú•¥]BjX°zÍèôEÚ)¹·§(v_3ûbmðü³BãyŽvÚʃaiÛ¥J1㨗³åçe£¦îWŒAp¡iYHSÍhƒ€á šÛMž=:­‡Ž9IZP¤ƒ¦èI‘ê‡ O%N99&J¶`l¢ð«,²¤°ƒlÓ4…jÐ"p–ºÚI‘J•¤ÍºÌ8-D¶Á ¢EBР 8,ÊRØK‡_P š¢Ê}§ÔUyÕú  NqŽ ,PÝEÕ­eHÉD›}0¸-TR´Ñ)¼{ÖÛ#o¢0[1 4œE NjX :'ª.UE´°ÃO””Ê´¨D­žq8'ÒYo ®Sæ’rÁX¢ „ŒÒ˜¸å ü˜¬æ=ž¸¡ã1³íÆPâ]*^, ‡.ƒªCl'(ò*WÙb¡%r½Pâ´mW\sÆb“œeûS«uß©ý±©ÊqRº{þ™}°Œ ynÊ—˜r]RKŒÛ‚ßuD§@$fbщ̖·–r„æY^béf•¤¹UAR«í8™»¤Ú•l‰Àõ”ΚŠvŸmφòâ,Ô¡1  fæú2:õà Õ-"Qv\©MPòõ#޼–iÙ¦B–µH% $ZLá4 0åÔþf—1im©fr A’‰I‘”M£ÙYóiÊ(¨›¬5aô<€¶N1âO¬”ƒ¢.Ñì<ï3?ÈõY-]RWFí]KNá/ ÒåËÆgHTޏ›b±Ö¯$K§'¡XviÀl¦`NWL6ƒH‰§;÷×Yå õ_ñ%Ñ/‰be-xâå¡M5å› t%IJADŒ¼=8¢Al­kMå)"Dt‰[8Ö5eŸú{Ê6¬$æLN--uRT%’ïu#»`혉ÁlÎ3f"ŠV@7’æe¢Záq lÕ”¬¾ÚÃ-4¢âDÊÁÓlŒ\f&K5RÒ©($ôÛHÒfbW%œ¬´(€¥(âü .ÏE d’­–“)o„N%”þJKŒ’å·åÞ‹{#¤Qm)Êœ”ƒ­OÚ Õ¢ÙkéTÚWR¹ÈÛ{¢Q™ˆX’§¬q"Gáa˜êÐI‹¸£A<é’$  (&`h*1ˆšÉé˜ÿƒøÃè©iéŠeý":íá?õìþ‘h'•°Þ³âž›6„¢‡¼ê>'áªÙtˆ»E:D}a>H8ǧº"mt8Oýcîˆm ˜ok{°Bà Â~÷Í;E‚@¶ÿWûDM¡-Ô}oíve@ÛßW°ChDzñ½>  '¾±Ü!´{[{êö›B mé|ÞÁhD ½3ñ{6€Cnës°DÚÃwêvmÜwêöm%·íø¿ÛöÃhöQÃwêv}°ÚwÛr` % ÔÛÁC/KæÂ-ŽW0¥ä¢„Oz©´™ VÆ2ž^¿‹Î_£«†ñü_íÒáä»Ó¤Zï`‰´ )§1P1 ÈQCT£[_”ñ´Fv€p_úÇp†Ñìiï«Ø!9@ç#&i¼éüÅ.(¿TÂ[t dÙ²@íœ-Ë2勨E=J¼›«Äf˜¤]hªÕ„d›eª%°ó +XÌ2Êä4íKL)aàÊ–´È³ÑÁw”r<ËÊÔ½Mt6ÚÒÛ%`%ÛUyÖœ6FŠ.XÊ(ÞY„!M¥ HUД”wg£»§l[W>±¾QÊ‘RÛQÒ: „¬Ýï KN2Éq§'öªçrº¼ÀÕb¹YT²µx•ݰIž¸˜æÖqS^ÏxzV½ý±­¡‡–iå+˜seÓ>”†µ”Êe!SƒÞú:eŒÇÒT»WT@ál–ë’V•)n&ËÐuiˆ h«@ %ÅLÉ $>ž˜T,¢ªvüñ/£!{@Ù¡L䑆¥ º LæwÆL(¨)›‹)žpž¹Ã€ÓLó‰™&r Y©é!W;²R2˜2Û˜ŠKQê*’µ)Å‚‘¨§@:ìŒð¬è/] •*ß ¸Flúát£qÒ€²ì‘)($£8lS9S‚” «MÔ I´Ïh†UE5R-`bÞN‚« «a‰pO,œ…JóTù“X’>qFÄíJNظÍC#+Îf=^°4ü¾oWv78—NÓªe*K·Aœ…Ñ·®,ä,Ók Üx(ƒ ,:Ƙ›BÏu°j ¾6º8Ãhf -=/›=¶D¸W’æ´s«ÔU™e5f_PÀJ{å·ÒHœû¦VŽjyOœ¹”´žd¨MVÍÑúe9¼\»£@ÿ8ÏÜ5FãHKHXJR›¶,Û‰súw—’W"ýé°³+»áp9ôty~}ËŒRºê*iVÓXÍ ‹ @2%&ÉJ o~Úd.ºóŠRÒ^u.É&èL„ŠS/UCH‹²ºYw'å4 Ie´)Ä6¦Rµ RŠ®l—xÃaày²Éë——¾–kÒ–Ù ZRL¤€ ÛË.ñõ}"eÄäT€×ª= rkÉ÷~Žwî 3Îrt  !õ$ñO+­¥ ãJWS3s`–™‹"pË;¯% ]B@$$ÞAž›4™Æ± ç¹Xðrcº ‰ñ‰Å¡ƒ ï?tݱ7gg¤Ã§’\´ n¤Å‰…%ꊡp»NdR‚w‰ÛŒƒEC¢aWB“ H=DÆn-itV8Iºè‰„”OTá¼%.š§SßÅB‡ô“3=³†ðR¯WU)M%DZ¢4mÓ°Æ£((•¯ü%è²íÕ o²1·%P“U†]uh¹2’¤=Z;!3 ÏåƒJ)*Ru• Z™ÊQ8[/1¢i5™=BTq¼Ú}›ª6KùÅŠ')ÖžÁ,?!ñÈœ¬º#[9¡§¨úçÝvdµƒ/ËçŸtDœ£Ù`’ËÞyüµ[tm­¸n'èh,½?š}Ñ·;ËÖMâ?Ò!²¦ÿXû¢†óùÇÝn ÁëŸtBá- xû¢&Å¡aÿ­ý¢v,TóϺ!´Y¨˜“¦ZìÚ,TNxÿÚ!´*`TýíÚRÓöücîˆmÂãtChö2ÿÖ>è†Ñì!aÿ­ý¢G²ˆj¢s/h†Ð iß«Ùh q¥š¤ æê± i I‰hmÅêYÜ"Ú¹yÛ Y¡šìMJ°Ærž^Ÿ‹•LÿŒº ŸÌ;„nÞ\zBØkïª- / b­C¢,H¸Bíø¦]B%¢Á ?ˆw–¨_Ô;„,.ê‹à_ Ý6ËP"5| ṭøD°‚f³-&Á -¨‰Þ"}¯0 #pLÙ´Å™àeÌòÊ:†]uæÛqä6°‡Ú $t™kÇÇêÍÊYj)r $¶B¶’§ RR¥¤Ê&2éò"¼’í¬`‹2å’rþa_[™V1›=Cz ¶¦Ûm¥…]×5‚u˜ç‡G¯æEL‹µþ-žæ:ƒ-e†%ÿf:SÇf\ÎÒ|ð•¶0ÈŸd(µÿAÎåfzúù,ÿÒ!E³£#Ï”OëÎ’+Ø C¢50¶b²ðYúÛ¤ܵÂ3Ik ‹;•¹ÛÒÚd(Qkœ‹:”†zø¶gá3¯Ñ†z^_Îûêýz ÷ÔÃkoHHr¹96þ¸üå+ZjG®È”YG–3r™+=|d´×dÄJ-Aʹ¬ÍÜú¡3Óðšá [&›”ó3y9Ý@$‘"ÛZA6øb嬎O®nEY»‹•–²ÞˆÌÉÊÜ•K\Š*ǪŸ uê§ ðR™$¨¸åï› f»=ÅèÄ쨗éÛp´’ [!!¶5”ŒY:Ù¨*^Їd$4^Žxdôüš‰ÑÔ^œC>¡™yqé¤9hÄ6 ‚ªÓ%fÚ@º!”ò†–dq %ƒ†¿©Ø!a5M/Ë»7&›†b@ÌJ,HËA‘eô„=HÊqI’‹h ˜Ól¡9 ¸Kú‡p…¨a8?9˩˪p%wÐR/!:LÃ*Ê%¢š‘mR²Î'ËBS ª%fŒò¼¥ÍæÊ š¾_©¥j©¶àH¼™ wÒ©L˜u!9?5”¬Òšü„Ç•²rÛ|N,Lò]NM̸ ÄÌiB¦Ji'¬ k‹›þ=Ì)$£5`OÿÄ4ûqšä´ý ˜Ç{õ*rzit‘þ¸´Z ³™RL«©æ%h`à¸Qd×düÀêš.W3 ´Ý“ZAÓÞ‹Œ(ï.s"Ü £)•’KL{Ñ)mW9[˜\)R³6¯‹-fv>´J-SÊ9ñHHÌÚH2™K"î‰w¡E³=ÉÙójgÿ4iJ+*eR½‚ÚSÊüÆþªØ×cj?ÅQšä³ÆsÜ ƒš!rÔ¦TE¿ë…ºy¡Ü!ba¹­Ó¸D±.9©Ã¸E±·â;!`”9©gp‰aNÞ-IFalÚ˜XaA—ŒöBÔ·)Ä^Q7HRlqʃÉüÃ-’m˜\%rñе)h8èÌä¢4tE‰ /Û3ê‰h% °‘è…ª\—®{"X]ߎã;¦Û6Å™à6ê½£ÙÅTÉ"Ev"B-ˆD…óg@……¥$¾ Aº ä6˜³Ð ´Ó:V³t!EV Æ&bÂyÔ¬)VYJZYÂ-¦åƒD¢FQ=óÇ×?«aB¥_ÎÏl¢õw jú‡pŽ–ò&åk‡p‰`”GŒöBÂ[A¼ç|Îô‚Ûjg€Ð…{G²3`ÜY#Ù îB©ÐJW%ŸѶ,‡Ö}rGPŒ€Z_Ô;„Q@Ò§ã6t¡t¨QdIDZu ¦a,Ü",uaɨ^¦¡CJp‹T@°HÓ§O6[Kpi~ÙìŠä]*TYI Jr³l\„¥¢S p%Ã%­K6XÎ2ÖyÙÅ.kp˨E¸d ‘ø‡p„L S!f²DÒ,Ù û‹ŸŒî¡âþ§`……Ô¥XúvlDªÍ¡E ’È"e"a9õB%Ànjpî`s¹‰×i²:ÇÒἆ‰L€è™§_;gŒwi eáFÀS¤¬!7‰‘$ÊÛaly~éý\®nmÓ’8”¸IS¬[©Œg<;|?¿Ÿgh6ä¼gpÇG R¥ Ì®bòlö„k¨nŸS°D-/êv–*Z\åˆwXMJ0¦³"âu sâZYüC×! Â~aÜ#7nØ ‡pŠúŠÌÖI+²ÁgtÆ¢C K·âÂ3`]—Í=rTK.ÙñNᕎ\ÂÓÌÙuH*)Kn¥KJÑgñŒúÛÓãòWŠqîî—õEƒ„[y…-¯ê+®BBŸTî6™M¯Ï'¾¯–«d6ˆÔeÜ}N}En6† Ϩ­Â@˜NÅVá  K‹½ó‚@% öÕ¸DÚ0×/˜w»@˜KúŠÜ!´]âq¸p†Ðþ¢·›@˜kú‡p†ÐŸPîÚCNLüEnvl7>¡Ü"m %·>¡Ü!´"a¯êÂB‚P»fáÜ!´ ]W¶{ 2º’k“ß UÚ´ÛÑ 6eã#t-@´­n+²(rVº{!`àŸ¨®È»-²^DÜTÈQ–h‹a˜gê+³„M„ «N!Ü8DØX ‘ãWd,pX¬ÿ:'wÊŒ¯ÎâHâbyŒ)NwnÝè‹c¾[2±g²úŠì…ˆPd{çÓ(N¡Bùè¶Í¦,ô ÌÛWéõ7VIÂ]’ÒcžYvtðýñídäTêo&£EõXÒF²&Ã_"o9t0”dq³Tog"ž-©ÆÐ²’­&Ø·ÃYLÏSð—õdM™BÒ§ó¸C`pÔ'ñ/D,!¦ÔTèÄPïi³`H²XX?1G¦ÈÎÂÁµ‚N!Ü!° C…&NÝ Jp±ç¹/0¯Ìžyº‚³I›ÕR±$¡7ZníÔØåxÚm‹cÑÜüR:,‰`†Õ­Å°!`•#ñ ºXªVÉkæ(ö‰m1d7 ˧â4X#6[.VëµT,¾·Mõ§½ 4ÎQ#+vóá®sè×qCKŠŸP‹âU+j, ‡,ÛdfÊ©¨¤+uÓiÐ4jŒrvóá•CzšYÅ;„j2ìâ©B‚eˆmèc.´èV!H”¥²—`ÜýUn6ì,¿¨O D¾ÃŸÌUÑd•kK¼å-+Ï6•‰¤©¶Ô  ¤e1¶,Hœ¿SQ_‘eÕî®ãµt¬¾âP$§ !3™”ÎØNC~þ¡Ü!·` kˆwXægÔ¯TeL¥eEhIÛE‘'—_ZåØË.P/B@”†ÈÔpç”Üܘªªbª¥’Íä&DÞR€OiŒNQ\·áŒ¯f …KæÂ5´9DTR•„Nùñ&VhEÆTàÚçóU¸D±0×õIÙ`†À„.v¸eÔ!°UJ6»çæ$h \r-.ÏŠvƒ!ÀÃY?4îÛ°kÖé³ BÇœç<Ã1ËÜÈM%AA«Í©i_î ÞiÛÁC¼ §-"Ø·ÀôŠiÂ>j·›„°d];„66»$áÜ!c-U•TÍ—MõèõS3nÇ¥´†ÏÔWg›28*úªŸúxEÛ°!¥èÅWdM» Êm^}_-[6ˆÖÜtn>Æœ%}UvFvìÀU?š®ÈmØ[ZœUPÛ°¥^ùŠì†Ý‘U6¤‚Kªi°p†Ý•`ʇâ«p†Ý„,®_5[„6ì€]ïš­É†Ý ¯ê¨õ »ZQâ+²vsùªÜ!·a0UoÅVá »\‡ÄWd6죆±¥ÅvDÛ²&þ¢»!·eU-®ßŠ£èÛ°µÅýCÙ ÞiB¥ +'á¬[/i&-¡Á•‘óÝ W²÷Ø‚ éªùj¶Í£¢5· ÇØy§_×_öðŒìÂyW ¾2û8CbÇ˯[Ëìá » u•|åî!°ŠaV|evCnÊ>Ygñ•ÙžYÏ®½Éá <»“µåÿomØ,¿¬®ÎÛ°ž]r–2»8CnÀyw%,eõÈp†Âyg-øÊÜ8C`|³ŸY{‡l£å×õ•¸p‰²äF*»!°}enÛ²¡aYSÛgl*ú;Éï™Ü^Í©‰hj[T‡}]µr3ª5;U–¨-_¤(›=“Ñ.^ŸuŽâéà«ê+³„nÞiWãWgZ(¦Èy-Z ¶ttE‰SGê+³„KD-¨®Î‰4£f"û8BÅjó_W„Ûfس<)Á£)«³„fÑ0ÔWgZ°WòîI˜:®¢b±ä¦â\}¦ÝPH$„Íi&S&ÈXóKý©äìRšV¡}»Ž3WNû¡ÖÖ•^ AYZA³glYˆ ¬Ï“¹ƒ/¤«w.æºß,Y›Ì×%5ªQMï ‹)¸2î§Ó¢XË£§†&sŠê¦\ŸÝ:²M »5§néKWœf©ÖŠ´LÜa =ž±Óbx<·´ÛKœßÌô®漫^Ó.%Xk¡qºõ_I--¥!GI=CL­¹¹\­ûƒÊ.1_Zí N2Ë”î²éq&r’°Ð´ÎÍŒãÄ=_/Íåqì÷T9ÎK˜©Âª¼þ-J”¶Š*aRm¼¥š€•$èÐdv uÅd~ÚÓ»N–³\ï5ÍY)f–¢©^]Õ9–Çx¾òEû,´Âœ«öç“i*g+ee䤯>c@>lKº}X¼DÍl4Û,œ&ZHCM %)JR$€D,7 _Q]œ!aUV“q^³gTXžEÛlÜLœT¤6p‰2«a+ê+ûxD´!ä¥ÕÉ7xE‰W7:¡5™Kì…«â”ÎZBÙ¯ž,õÊÝéÖ*¬Õ«Ñᜦå—:£qüµÔ$•­7V„Ùj ¯å˘oÃf5y¦U@Û*¯Ìš£‚Zó¶ÕéJr¾Då18¶å—WœÌ¿sù.¥9¢ª`Ze¥ªùA´!wjœ¬7®²‹ «œóú§RÖQÊÙ›ªº¥½çðè ‹XZTLôL»e-TŸîåe;‹B2¬·øi§”ë´ !$©°ã*P3”¶P´<òG2Uº•fÜÝZë-¥A´P6ݯ(‹T¦ÊÂĆ‚ž£¦rÂ]ý©åb¼Zÿ5šU<êq*«*§Jn„„Þl·0l˜œk–‡–ò\½âõ=#ÊMÅ8Ã-6¢’A)*JA”ÀŒßv €ùªþÞl %YñUÙÂú`_Qš³ìžˆÞ3ÀxiRùŠìá°p•õ?GX•Oæ+ûxBÖêhÒkéÞ¾«é H3:¢Ç»XçôÓ^ˆù«ôÂ$Ë#åÕõWÙ‰åÔ?}œ!k Êi^y#-[6ŽˆÕðÜ}'ê¯xá¶VüEvp… áf"û8BÅpUxüEöp…€¦‰îâ¨h´p…ªá•,Eöp… UõÙÂdÞ?sôp…‹%£?˜¾Î° ?оα0/š®Î°¦~"»8BŰH1]œ!bÔWg–-„¯¨¾Î±PÒ­øŠìá  ýEvBÔ·øÍ›ÇÀ±«îôBÃRÙ—‰]œ!an6‰€§ž‹G»RÅúo﫲-¤ jËV©ú8BÐ¥·ñÐ/*wM¶mbTÐÔ¬¾­ã„KDÂ=õo!`†ìñ«xá ›à^Qî“9ôŽˆ³<)…¹úêÞ8FlL÷Ù„…j‘:lá ÃB…åXlëê_ FeFj2ú†Rµ¶Ô,Ö:£3.žëZò”té uêXÏú×î=jEg/µ™–I_™ ªKHRBº–K)BÝVèn¦d1¹Y]:›9ž_›eTÎ(£ÎVR\h*éPLÒV¢MÛIÝÇF‡ž92µ•<Îx•\“î&SðmD[¦R†Èî4¦Ÿe·™—ÛˆRT•%BaI"`‚"Ø­;W’¢¡%¨Y-½Qr•g®Î2L½ÐÍvhÅ#ÊHZ[}æšQI$^’È2˜6ÆmyßÝNK ’¶¢¾¥jJ£§§wÅ-A - ¤›}®ØXƒœ9š±å §•kÝe´¤¸º÷ UåbàPX’t…uZ©H?t«Z½ÿ–eL<µ¦ê˯Õ0‚¢›ÝÒYqi‹duËDY™ ÿ æ:·Rsnm®u”%A¡mº^Q­M•…‰ =GLá2«?´|£ß]x©ÌêV©ª¦©õ—$HLÛ-‰5‰À™·¢¢åÜ“/t¿ADÅ#ÊMÅ8Ã-4¢’A)% Sȱ#U+sa¾ú„Æ‹8Bdxæÿn9;iú¯ÓÍ3Ž)m2²ØIGp-IÂ'áëŽqœK¯› r¦‡95aH{,æ¼Õš–Õ2ªÇXÑII`« 3¶Âg-“´jTî­*mœÏ,̘æêjÚq—dR&œ6Àœ­'ø r¥Só_8ÑÓÒ«5åj¯. ëù{ÍU.õÂo&¨$¨z˳i:S#GþårËÌÕÊìž ÚŠZêWâ‘©ÀK‚é3tƒ j.iåzÀÀ§Îéœ]MÐË8í%ÅøS†©,(ÎWHœáhéT4E;§V$ìÙÕ'‘t6n$—&ΙW+1çSËòªóªt.œÜy”:‡J‚®”á7yɃ¤]³\fÇ ÏÜ®Y¨y,åI¯Î)RÜn†•KR’Ö—CVÚDúuEÙ {˜9꺔œ¿–ÕJË b¯0¨mK—o½LÑ «Úìe#HÊÿtjÞH©Îrü­”¥Fý ¨RÔHRj@;R¯AÕ.U?ö×Î5w<æ Ï2Ä^%U>6 +²røN½u:,Jº¥d ÙEûgÉ4OYËRŠJN9UBdH6!â´ƒf™N(ì§.¥¢¥ChM=;jí%(l^\Ì’™3c#V x«ìáÀÐqU§îð…¢Áê+³„,*©l›êù€K»°ôEÆCƒ гîðŒÚŽ öÕÙÂ%¢¥²L‚Õ/AþQl%Öäë=õxˆ–wODj'€ü/˜£îðŒØ£õý¼!b`‘?ˆ£gGZ’ò>3 ­S$ÛfΨÔOÁ‹%}`tK„fdõ¼p‰°!¯÷¼p‹c2šÿÌ/«å›lÛÕ¾°ü÷ÙÂ3l ¿{ÇZ& ÿ]œ!b¸Gê+³„[4oüÅKѦlù‹Þ8FmÀ:1¼p‹bLÏÄWgX8_î+³„,L÷ÙÂdÏæ«³„6,ªfn+OG› aë¨úGZ†»êÞ8BÁÂ>Ú·Ž°Õ§¾­=!`–϶­ã„,*èó ¢ñ&âÉ꘰Ü;Ú¥¶b5o8-®ê¾"´m"ά56ñ&‘dÆÎ¨NBá¡õ¼p‰háÕr&ÔÓ©‡2šd¡r™i¤2»68ØBÆF%;žþÞdù>O™æ9%e~T¶iuLRT­-:¶µ¤¹zòÕ¦^(X¶AûqæùMk½Y›UUÑÓ¸M]KŠÃ¾ŒB–ÊJ ٬آŒ&Uéh9'”rÔ2i²ÚvÍ:‚Ú}m¡ÇR «ÁX®90­õš¡hì–&õ|³¯¤F¶áÒ>ÃðDüjßÙÍ0Ü^ÿ²vDÁÿq{þÈldó¼p†ÂÁ›|jÞ8DØÈ#æ/Ù ³gÌU#„,TµiøŠßöE°p²ú·Ã`0Ü^ñÂ&Ý4â5{Ç»v,™™º½ã„6ìúŠÞ8DÙGkq[ÇX˜?}{ÇlZÓßV¿d,9éZ·ýØ'Ë¡5AwÔT¦Ô™“¨(ç ‘rÌÅ«TºâÚ²ÕQ0éh-Å!WÛï[4ì‹97ŽsÜÃL%bç×öDÝË >*ýï²&âyaõ¼Ca\!+êð9ôˆLðåÓ+Vø›Ï°\Oæ+|]ûåÒ[ᵩaŽ¡}V$ILð2ç”*)«e Z”¶”A´ÙÎnþ6zù#)én[M* tâ,ÒAÐ@Œ¦!,ÞS-^\jZÏY"ìæËC—¥€âµxªÂ=c=‘#ˆtòg·ìÙ€%ó.¸oÙÈCî/|7ì˜ÿq[Ä6›d¹ßX’¥aèdjeLòÂ_1{Ço(ªÂÖ´" ©ÆäBT’S=€Ñ8n/þâú¦"l®nEÒåɯòîºMucÕ_RLœt€ ™$w{¶N,ަñW¼Dß°>Sý×:æ8C~Àš{>j÷ŽÛ°];!M}CM“éê‹–Hi§ñW¼Dß°ž[GÅ^ñÂöËÊÜEïû!v a‹Ì!AÅ‚E‚z;"å—*ÅËì8h.¸ë…iqÀI3>3Æ^“µÃ itüUϬplóÈ.žH'v é"Æ}…X§¼Âub`³²&˜2ò嬕 ¢oÙe <€ëUÆÕ¡hPP22°ˆn3æ™cUyUe#θ¨eÆœ) ® ¤Ê`Û#k ËrÖ¨rêJ&]pµLËl¶TEë­ $N@ Èl‰9+_––"åÖ8Dß²*RÈp2ju@©-ÞˆHa°­SeFúŽ‹,ÛÕÇ.D4ÿî/\í"Z—Ññ¼p†èž_@ÄVñÂ.á5-´"•ÞH‘#Yd\r4ú>*úLÇÎÀyy[аzþÈ»‹¦šßš³´Ìp†Â²…ñ©¬ OA·D\ròÇê/ÙØES$]^ñÂ)JIø«”¶ŽœÂfN´1J‰×¢ÃÑŒ¸òÛ]^ñÂ3°‚”ÛñW¿ì†ý„òŸî®Ý6ŽÜ)Æ}¤â.ÛÚí°F·ã o•U{ã;öË |ÕûßdMû)“?š½ƒ½yö%LN¸ Eü³¬mêoÇG_é?˪½ÿdg~ÎhiÆŒUûßdM§ÙÒ |Åûßd]û å{ß5{þÈoØ_˪½ÿdMûi„犳éû!¿` 0ú‹÷¾È»öòÓQø«—_Ù û A/š½ÿd7ì'•N§W¼p‰¼ûšQõ\ßöCyöS?нÿd7ì¥ñW¿ì†ý„ò£ê¯Ù û å¿ÝsÙ »šiOâ¯xá ûiÆœEï!¿e!8ˆ3º­gîÄ´)úÊ‘é0µd¬ËqÞ¦t-@2²¢/’‰.ž<ê*MÁ”æ¥ûÆ7nB”¯xıE c ^W„ÊÓ´Fï€ÀÐö•ïÍ‹D¼j÷ŒK4%b•ïX ly W‚s™Ûg…3:Ô¯xÄ´BÇßW¼aj˜ZÊ•¾õ Ÿ™ŸI‹è,ZJ•¼Ä²Á,'@R‡úŒ,I oªCLÌ,•-É(Ý2‘¢52‚±J÷ŒbÐpF›ê÷Œ,QÄ x•1Ó‘•†ÁS¢ò¼zo‚:L«Ï~çÔfT?·œÁW•ºóu¬Ð¼¶Ýh’ã`'¾â´„MC¤F-›å~L M,ä4ìT~™Urÿ3Ó­¥•9O—9UyÙ ïÜ— ‚ºac¬ÍO;Õgg%ªæ•P2vóÅf,ÒÓ!+[î)¬—ÓP0)ðo.Fù¾;â®.UûÌÕ¼‡Ì™û®¦Š¶’*ª¢bên´ºêfp¹•­j»zvF§!Ó{™9½–ªóßÖ–¶©9¥9>D§ ?Lî`ŠB’»…òòéZT•Ýï%V˜ÍŽ÷ï6ZËÜŽûëuô®šª‰m¥·Ýiªµ”âRRà‘ð¬¯L,{È”¯+®p°ªF™• ÎËÇig<‡G¶­ñ›D mS0°K#ÛVøXU3`°‚T­‰‹œò¦™]R­´Û‰&f@1®ú·Å±W’OyFÍ‹;c²T¡4ƒ)ôBdxܦ)ª3^QÊóG åÜÇ3[9“N*L¼âi]r’éØPãÉÃb”N™hòµY“Ùg15Ëü¯–1Ê9•nsEGš<Ú¨eêwè+ŸC‰e¼4%ÁåEºtNbÈXоgææ2úŒõÜåoŠ.aG/+!,Ó¥·ÚóÐ)Ù„c‡ÜJÍJn¹p&˲¶,H[¿¸\ÌŽMåœÉ5©óù•qQWÜo¼º7h„ÊËŽ6™Ë¨Ä™W¡åŒ×™™æ¬.Ìs‡3†sì•üÒ¥¥³NÏ“y…Ó–°…a;æ”™:Vf›¤D´Wœùk&Îù¦Š‹' cüªÚÇ8æ¶Œz*jGâ_þ-BÂCsð)J"^%R‰0£xê×ÓÆyÀÖVø–ª–¶ú·ÂÄ x•¾„Õ4A Qï¦ÉýáÂC0lñ¨zbZ† g;ÊŸ\,ÑÔµo…¡u-ȵÞU®)ôÖ24D§}VôÆ,!!ßU0±_.â,¸Z’ëRy‘yFj#OÝ1¨ž‹|ÅoŒÚ-…g[þÈX‘í«|,)Ƥû"ò­*ÖvF¢x ‰x•ïÌÈ…„辿xÂÔ:}µûÆI¤ùà/+å›o¢5|:Iø)>º½ã·4ÀIõ×ïZ §×\¿¨ÂÁÁMé_]ŸxÂŰ´¯xı0G¶¿xÂÀ,&R¾¿xÂÅE8™ï¯Þ1lBÂ}µûÆ §Òýã  m~ñ…€–Ï}~ñ…‹`m~ñ‰b`m~ñ…ˆÒ½ã 2-ï¯Þ…ˆZûêß P(MôÚgu@[¶P±pÚ”ÎøX¤gy‹aje'Z·˜DŠ¡¤Y[Ì[R_@™•Ó33ÑÓ$04Ÿi^’bX¶}¥o0°0’=eo1&Bî'Ìxøg§¦7|†‘í+yŒØ8iÔ¥o1,4ûGy……% ó L͉OI‹3À¾F³ÓlK k*ß  2åo0±VœW$€DŒú"Ìð†6«yŒØ B@µJÞb£M˜e•µ•´”µ8ÕzÒÝbPTpÖ´‡…*R½qAWg0ž‘Ùi%NÚG~ZNÁÓ™Uh«rÊ÷*Ú¥¨®…ãKX„’Koa¡Ü5O]ÇR¯LfÑʦý¹ä*W]?/Ð4ª–Üaðšf€SO—["ì®8 – ×8ŠÓœòo+gmÓ·œeT¹ƒt“òÉ©i†Á¦ð2I˜Ðuűž£’9?4«óÙ–KEYVØ,¥çØmÅ$›©š±32Ù3¶HÉ‘~Ùò¶UšÕç>Qšœâª¶¢¹‹#£R¢JR¹Ý¤+L¬ˆ:9†CÉÜ×FÙÌi(3ê6q,š†Ù¬i¶¢Ó¡7ÂÒ•¡HT­abQç<¡I™5Ê´uôtõôÍ%ù3.6…¶Óh(C •ЖÀ! X›tE‰ks\›(Ëa›W³–жBWWVòXi%JºVâ’‘2d-„ÈË–ó&ænS#+Ï)+üÛŽ1LºJ„>ÚÞe×6TŒD¶ »“Ûe(–;E´ŸY[áb) REã¾,HU;@²’J¦FÓ Ìûj÷ŒK₵¸B@š”U`\áhÍ—×åÙ®XÖc—ÔyŠ*¤_§}3 Z I˜IÔu‹E‘bC„Š@êÖ¤!¼³3 ™6BeX×KËüË’4§PÎk’æM6ûiu)u‡™pUÕ‚"J-òþIå,­N]”ÒÓá¼*[Âe° úP¦ÃÁWo_ ­H ÒHÑ ¨äîW9¢³õåtÊÎÒ“,Ä´‚ø!Ä»zw;³œåfˆ±<Œu¶¼˜ý&b)rºJìÍŠ†\̧h>“TÒÛqiT™*vÛ3=&$«=&]ûoûs—´V¼¿"5 C ªV 3•*e)wDÕtX&N؃eO#þÜçµ=©ÈòœÖ¦©-¼œÕÊZj…º€X}HQPJn™è”¡c^[Ìœ·ž3R¬—5§Ì¼¢’š*ú¸¥/]&AR2:õF±žEs®päÜ…öé³Ìþƒ*¨u83[XÅ:Ô‰‘y)ui$LJq,hËs¼‹4uƲÜÁºµ´Û/«aC¥Øu$X¦ÜM¨ZfØXß‚=£>¸¶„Ô¶›ƒ¼O}:þð苌‹–S?¶i‰`á§ÚQôÂÀ ¤Ÿ·ÂÂÞi)S2QµÀ ½,HÐL¼jß±0Æ‹Êß â}¥o‰*KÍŒV…å¨ëèDð‚Ÿi[âX˜)ö•¾ƒ„4ÞQô˜Z’ãi4&«o[3²,O¥¤ûDzLK >Ò·˜X˜)ö•/ê0±˜¶‘\å|³¬í_“ö´á&ZU¼Ä·4ÂO´­;LKA ¤zÊŸõ0µP6&f¥õabøBÎòýã ²Ÿi^ñ…ˆXO¶¿xÂÐ0Qoy[Ì6•åo0°pSí+y…‰€Ÿm~ñ…ˆñ+y…ƒ„Ÿi[ÌKQÂHÖ­æ!i;U¼ÂÄ §j·˜X…´ûGy……–‡˜I¼ná¨JgÚL- ÁAõ•¼ÃeLmW¼a°©e¹x•ï1nE0Q9’®«Æ )´c¡3>¬íc)KH$Êéï›H±mÈo0ÚP i´ÌÛÒarªÑæ%3àÚvÆ®h04€-*÷ÎÒ&}¢=&H¶v«y‰r“P»O„k;Ljnƒ0“/ÞbX…¤ÏJ¥Öa´‰‚ªÞa´…¶Ê ŽM’ÖvE™š R[O¬©ÿQŒØIm*>%{ÇŒkd|š³Kȼ¨ºš÷rܯ6ÍŸßš2úéÖÛ® ¥¸…Ô¥Al…×! ©À E‰ ,só ç EFxÑæúÚ|·/Ë÷'Ô5šÒ‡¤ÄÙS÷E!‡šüU6ÂÒÓUŽ©7iyªTÁ“ Y…7Í•™;<çU–s&zÿ.dyM=FD–+œËyìWÓT«í-¬U0”0*š@Tî™ÂÇ—c<¨qŠ7†yV÷9Ôfõ”yÇ/·ÛTSéRMâÛM³L–ÜKÁªÂV«ð™z.t#ý¬Í)×//­G&äoòó*|´áuYzˤI ¨ßl^¹¢VÂǦ̿V©ÎóZ¯ÖóFÏ9Ñ䬴Åc­²Šš:BóA pûÅõÄ^Iµ&s“!yX̳eËùj§9ÍTÍG4´RŠú”>ãt5Ti¥Cµ)X¨^y@(®ô¬$Û4Hçe|ÍZšN[ͳ|ýÜÉÇ)2ö’±š»C™×Xã>e4mÞ`Mд» !R™œ&UõþqÍ2Œ¾ƒ §˜)ùvº©+9Zšî”©Ë‰|¥ 7}Yôê†Èó¼¤ótß²LÔ³–8ê)òŠ…³•6] ©Km¬  +â2RF‘z>uÉ9ëy'3ä #;¤Î2¼Ê’ЉÌù•†i™¦xRåo%Šw|Û…M)ÃyÄÞAï&ÛŽ\©~äÔT¿KCÊYcëk4æ‡UH^Bæ(/WT‹l(g¸ƒí­0µ^«,˲Þ|åjL±>\',®¥]3d„Šo/‡1±§J‰è¼v˜–=–=¥o0ÚQž¡° åNúuŸhF±È0²Ÿi^ñ†Â…¤*W¼a°¤{Ê—õl+PØŽòŒÜÎà d? >Ò½ãÅK(2’×ï»@õÕï“[­ fDÕi>±Ô˜±—˜)ö•)ö•ïleÛÊ÷ŒI•)ÖSŒ×y^´ûÇdj2à]M$ëW¼bl§NÕõ+Œ6Ë·h*Uº{Êã`•2:5|³ë½qvá¹ûOÁEÙ^W¼xÆmÍ0í+£¼a°Ö¥{Æ.Ê–Š¥}V}åq‰´‹`·?½ã ¤Ϭ¯xÄÚD4è>²½ãdW"ò½ã „ÁDìR½ã ÀFµ*ÔblaåûÆ.À†QlÔ­>цÀà£ÚW¼bZŽ=¥{Æv«Þҽ㠆UàI?2WOµ9LGN{"ãËÈüɪ'=„ü¼¿û¡Ï`µyiþ/L¯Æ¹ìªþV?õÞªòø‰ž&ƒíOH‹ØY>V‹=~(Ï œ÷=¢óÙ`Kñ:¼Yÿ«ùCžÂÃýÞØsØe{ôï,真—¼oâxCÌOÍ\ú˜sßvpç°Yò~]~bö Ž%éÜ»®s²PÈq3¯ñŸÕùwÏyœ(œö[ýßî‡=>^vâÏýpç°Oåüèù’Ã×{lkštŸ´ïËÏñº3Ïg%O–ÿwû¢óØ]>^Gæôø¢sÙP`LË_ë‡=„>[ýßî‰È'gæú/Öÿ{ûâóØPùiŸÓã‡=[òÓüiÿ®ösËÈüéËïÄ‹ìåµã|^{<½³ÅþèsØAå­ù½>(œöü¿û¿Ý{<¼¬ÅþèsØOƒþï÷ÞÊ' _‰é½üáÏaÿÙjgoodies-forms-1.6.0/docs/images/quickstart-grid-details_sm.jpg0000644000175000017500000001774612003555436023371 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀ{ØÿÄœ!1AQ"2aq¡ÑB‘áRb#±Ár’$ð‚¢Ò3CcÃD²ÂS4Td%!1AQqðaÁ2‘"BÿÚ ?ú…i<ÛÎÿO«À.ÃIæöý˜±V}ïoÙ†"‘–‡›yßéõa`§”&¦©m*N•"¦›‡§ àyžÕçÄîWöÖiÚï¢Ùn]„ÛKD †•õñËPXoñ}˜¸*6Ÿpø¾Ì,jn~áêû®¥çÞ~!ÃÕ„ƒæ6§i»‚ÊêõÚ½mƱ£V–Ýð ÛÖ8äu{Gs^ãÛ¡¼éÉmÖôfåqF+RØiQèÃ(ÔŒµnˆüCÝ…‚QÏðãˆôaœ˜;Òv«tÑÉp5…Ñ©……rß§HüDl„ò癿Y{Ä67VÍ‘æ—F¦u×E¨Ü)õŒLxØhôÛñ>¬[¤Ï¸|CÓèÃ8ì N‹ˆà}H°¡çÿ÷b`a¥3pËPáêŰTl5??ÅÄpŒ,jXûÿâìLe ¿þ!îÃêüC݆}ÿh÷a‚õ½íì0PÉN{ÉÛöb9wÙ|ÇqÜï.S¾=­”ÊÚ$jÆ0¢-d³m,Uò¡×Ñ öþRó$6)j¾hŸR4z&è¡"4¬œÅ«¯Ró5MV¹×?þœïm,c¿Í“<­$©—‰#ZjfÑ¥ã/ɧÄ@Ó…€;•;×mîêë¿Í~ ÈòÄêÁYe ÊI"¦—!†‘èØpÁé¤ejÔ©æÛ„W »v~ÿyÝ Öå¬,¸Œ[¢&cÔ¬„4R ´ÃŠÛÊžc†9yž}.ÒÉhc:F Ñ«IÕ‘åÏ ÂÁªÓËÝò(æY;üÒM,Ñ»\Ô7I©Œ+Œs*ŒÅi\0bí>MïÖ=Óç®|É=î Š"up´VW)•Ò¯E Ó\õm‡ª2#¬^¥*¬+°Ò´ÙéÅ‹Žrí>`¾îr½Ÿ~k Hô¯ËÇÈÚŒyÕš”ñW,BÌg‡ÊÞ`Žk†Ì³¬/%ÓÇ ‰ƒ8&2šžœ«<ŽÊ…ˆjùs¿/YêºóH®nKQ==$”Šs ]•¥qs’ÛÊýã¶÷îw~a¸»ê´1J0J™¢ÈÉΈP£mwbxk¯[oX“)áÕXšåF$ ߇Î5æËeºŠõfó‘Åu$Ýbi.e šª åt©Ý§#¿ ãòךçæ‰Ì‹ ´si§O‡Æ5l®ìLså®úÖÑØf·`ÌÁ•£NóK³9FyÓ>HË^^î]ŠÙÅßx›¹ 3‰’yc §\’°Ð#|«ž¯F &× ‰ÃDŒ ” ¡Ìz°,Dñ>@ôb­sÛíû1MÛ}¿fþŸoÙ€ƒÖ~¿³]=>ß³™ULrªCÕ9 â¬ó¤@ HPê;2Å…òfœüGùŽŠ#´ïœnuÙoÁ-æFʰ$íåÙVÆ=5§zÃlÏæ’:(-ÊNóv2ÜœßÕ§žŸk{±§4Œ6…Û°ol(€6¦ú7·V›V¥ÏyÞÜ=XA®·UmU51 Ð¹bFûzùË:ªé1¸Wj·1Ц»8bJv™ аշÄw·»¬/›ª3ÏIÞÜG£«Õ¸1'Iô0–2Ƨ45 ÆñˆéÓ7Ÿ€–9EÃÈ\”eP©V  š›ë†3lÉn˜ÏÚÞìZÊÆ®«z†öôú0‹U3;x·èÀ Ò³Z̹HÀ-¤ÕO‹ÑÇ­uó µŠìZ¢µÅ_JÊ´S`lÅk·i¾KŸ4ÞEÝo,m»]íÏɼk%Ä)X¤XŽ•f ÔÕ>€p¬ìgµó—z’Ù%›ËÝÉeÒ½H„{Y˜©Ñª™+ÍC§<…·›{äpÛÌÝŽþT¹i$q·V->‘‘]QF½mZše‘8-³àÛç>ítÅGh»4šÚÚE:´O1=VzGà‰U}+ZW([/§«D¸Õ1a¸RŸ»mŸ¢Ê4š¾±û±ás2ˆ¦2Ó ÚéZÒ†¸z:Îf8PùXÇfõ …!™Õ¡g@(QE%…~&;É'ŸîçÄrþ¿Í y{óÞþíÃ4L¿›"‘Ó"«J‡ß–'öþPþ¿ÍŸ´y\öë«YRöYá¶K„T˜Õœ¡$0¦ÎŸ·î}ïª^<âuûy[¿D´ŠÉsZòn6ý->:Ækè-¬m-åžy£@è³3M3eCª™žcs6….û©T½”Œˆ{Ÿv  Ý›BÒòàÔ}ûvX~Ð œ¹>;ެ1ìÚ”üåÖÓþÒ燫«wì€\˜®î«Ôa&§¸ñiV$k¶ðlRvÒóQr”p5k¸æåìú0/¤ö°Ìöä5NZî+û1k*}^Ÿ¨\dÇ?VWw]£@ýÆà¤l*ÓæCk‰Ã]mž ŽëµüÄúŒåYTÕ=E+S³}p-â;¾ÖA½¸Ù¹®?râÛêœHßþ…ÎÁ¾ãÓøpó}­™tßÜœþôü?‡ €no;S[M[Û§¤oT¬ãUÏ%k¯˜âëóûÉ^Ñ5«[V.”w%ÿÒcµt¥y#+«SV¡©´w—áú½d Ü>›©ƒÿ§6 /ïÁ®ÒÉâGi4Ìí\ˆæåþ±\ïÈ"HZQpôLÚZC×ËOf"ý6_Ymèfù¦hü9“¦¿Ë·²øÁ,ðB¨$ºbXêRÛHúe‚}6ø‡¥Ä2;,n”­P Þ¶UVIUΕ`ÁŽy Åpôu¹x(PW`óbÄpû¿lóÅ®{eÄp’!Pò— FŒÍ$a4‘ù„‚ZµÊ˜#%ßmó«Í‡ºÆ¢BQŠQ]*úë¸åLZqkæxí¤-ÜÓȱÇÃ2± ^µ<”«ìÁZûÍ­ËØZ¢•£š#+(fbªf¦üñÞHX¤•6Ó¥*c`?f"j­â•K6ÁJ#€>­*H,¼¦´­RJìãLSBzš—úy·å¦Nz4…:ÅÆ›Ê䇿:FxO-vô£º‘¥W·‘U^ˆBÈ úxâ³üjzR*c¼qk:±jÁê!rhrÑ(;p4›Àzh%·”)’=9H9õ #/N#]-ô(Úd¼ú3R0P,„€5f}xžÚ½¿Ö~¿±ñÏ/IH´”·þñW4s3L\G0 (*"joü5ÀI&!yX×2c~ðayÚ~”äC*¿JEI9r%MÅ߈²ò+o4yvÎÊÚÞòþ8fŽ(ãq!eÀÒ@; Xon8º–7kï·]׸\GÞæµ²gO–´ŽÝ˜ U‹YÔã2Å\R„g\öa­véxfƒË~`µ¶Šßþ§»:QR'ùZ•UcQžªÕZ½NUÄÔ)’y_¿RÑcóÄWHÓ<Ó¬ ÂU˜Æi¥ÝÑ ôÍ8W 0g ´ì=ò+{æ)e)5¹ ‰5d‚Ù‹4rܦF` g]G j}»^³æíÁ±«f9d÷a§õÚ~Üÿ̓%I¸tp4°*Ûv¸âÂ\¢)D¥2Ê™~,£7s7i|ªUÞTG} úžfЮY{q5Øûå˼°¯k¸YD’E ޤBÌ„©ÆjYé§·F ûç~6rZEÛ&^ä-ëó+Ë«*Õ]ƒgìÂÕ•ÑïPJÖ=º2Úæ!YJò5hj¦•Äj^i¦B%}¼ÝY͈€^ߨ*% ªõ&ÛOâÅ K%mUiW…jœ¿‹ö@¤“-kµåá·Å€Ï³1’iWC2¯4‚¢€ƒ“S~$¼µÚf¶“«ÈLÓi-ù`™H¥âã‚\ài †y©ËT»k»›ÔÄhØÉA$ÀÓsËÇø°Þ®má(½k‹ù‰AY|Z†“â㉭u—ÐSåVòeK‰¤”*k:æ Í¨ y[/Ó,nU’òqSšê–žÖÆ«#ù+‚X|ä•¢Ò-ñaÈgÈhPd¹È;:’ç@x¯-a{Ië<ázRu?6aA ×â݉«×Êí|å‹‹8帰K™'Hdyf×#jPf5\öÓnü0íÞÛëü0Kq¾íöžát,äŒ5Ì!ô3:Ät¬…†`MR Ø-©{{*ÏÍÝÔÙ£Ëå¾ä³h^¢tØ’ìJ˜r‚µæ¡¥ 0Öt¿ú‡¹Â–סw)£¹y—¢¢c$z }#"I¡W^¶®tÈœFïÜ߇ø_nóeýÔ§¥ØîÒ“[[ÌÖ¬O3)q¤Ñ"EÕ_JÖ•Êë7¶½WÊ!I ®Ô ÚrôWúøÌ‡#w±½øk,óÄҤњêÊMUqÃÒô¹e4«é–TÜ}ø±-Ñü§ßˆ€PÔÙ¼î<}x¶Š‘X®Í9ävgéÃxYæ0w T¸‹·£¨1‰Ñ‚A4©°ã7Ó¯_úù~ðïÒ,è$çÿ65Êãí–ƒïðþ,. ¾ÛS~VÃøøÚÆ KùcßáüX¯oB³õaDTšÐ~.5Âyo¶q†GÛc‹ ·%ä´n8ŒÔNÙiaM|{ñbÜD²ÐK” Tn×Çø° ¿²²HQ¥‹Rõ# ›ø™ÀSââq8o¤»ÀS·ÚÙ— *3«ó3©oÅ»[üeùo·Ð)ÑþóüØÕs_éöÍ#þ]iJç'§ñaèSvëj§åoÿyÀþ,&ßöëaerÝ tŠNRe¡¢œ¼{ñ›á¿·7´ù¼íÇvóuª;—^æ1ÄÌRŠÇJ•,õ#N–$Z|55{våë µUISš…¨j\ƒyjâ»Þ(Ų…)BTÿöê®' ýwtK‘EXcû[Ú‰Â)ëka1okS  ê ×Ѭ~ÆÀúŒ£pÿ ÷à„\E$ÖצO*º+Èç…^—,¯1iæé­ah»´r4®Õ´"¬dÑ+i˜lÝQ\zïþ}þ?«Ï>îy7¸ù¤É 5šÍGr°\HÑPŠ€vxŸ«Ÿc/?·Üø:]³½Iy,Q) êÄפQ@š€\Á9šìÝŽ]þßÓï]:÷ßM7½À[9 o<ÃEKEµß‘5ÇÜf—¹Û¿Ë3ÚÝ)Ö # G6†ËoÝ®77œhnè_)u³h€ûðÖÐ_én¶ö Ã׊õe ßÒ]ýÎwzðÑMÞ2ÿIw¿þYøa ºÈRc%­ÐOúg”ýø’­Î1-û’£Ïý=Ók“U>]Í9TS½¯‘±÷d5þ–ëÄå¤ã‹XYîñ‰Gô·Y®ëiüOAW}æ/itTº ³ŒË€6úpÖúËo NéýT€Û\´¦“òÏRÕjþì7’Éôω÷XÄcò.rÿëÉ‹YPî°õò.vùi=>Œ?x„²…ÈÏ}´€l>Œ +Žå[ʉêå+y ÌFºù‹…ûtHôÑô¨«(<Às®¬;w¶ùqž÷ÌÐ÷[è;wbìátXnÝÖ.¡eˆµ3EÖÜÔ>mÅ÷k|³[^yóåÕî<»n×AWYë 劳WE(ƒVÚWë¿Íy磬ñC4ŽÓ,öï$iÒZÇÑ=@ï«ã­|íbûvóÜͦ^͸I­¡•Z”T$›™Põ°HP7Ÿ‹I©-z¨áDmK¿n·µ¢Ë…æm§OÛ‚i3õ S¬U! 5¦[ð¾é›7Ào,­î­„3'(da@0§Ò¸×^ÖV,•—¹wai?Aìä›R<ŠT!R±€ÎM[” œÛñ•PîÀÚÏ"ÂÉ,0¬ý9Ò’êÐ*¬~îx£Þcˆ¶¶h®/ä…¥D„E1f3§—O¯5w9Ý-¬Y,²L‚2T¤£•xTc-õÞsñËw^êÅ«"Ð3€üøk8Ÿ¨÷M!–XA™ÂOìl[W ù®õ› cÒwô2ÙélMLN¿{%KO\óèñþþ.Ó»SÝï僺Lhê¡AVEmšš”®/Uí|qßíl{«ÛOŠÝÈ-uZ€ì(‹]4â'kxÓ—Ì݉ex~m €ƒ@¥…$ !¨Ëš¢˜µ“{ŸskÃuÂI4ÄxÀFQDQ]G›a¾ïê÷±ÙC—CG%Éz¡Di#XÝr!µu+·v"õªî·Ò.êÑØ¼JL³,‘ëøÜeGZbx­ÌŒiݼī¤ÉneN‰?ñ0¶³ƒNáæbÌz–åE5?âaµpgºw’²BsÝ îá*`çîÙ uyaE*Àž‘iÛþ¦×^+ÿÛ¿.÷H¢¸½ŠId—§1¤²*©'ªÁq“³¶ªÔóSÝ®¬ýÿ±ÚÜMis 7Î ±»Q•X- ó~5Ìåž*Ûí¼ßå9©|½ÎÜFÈêm&=[J½ª¡qòÜ¥DWjúÌ ,lC=Ë>"TÔn¡­(h¡_GÔ=ø(©èö~5ÇS¥pc’‡A ÛL°çé›7Á¬9278¬®H``Í$a††V%Aä>%õDrÄý¢ï·Mr*-Êt¤m\ <£I¾,²ÅÕUÕ²XHñ+E ‡H¸ŠëilÈÓ¤ÓVñ§„w©ã^ßÛ¥YÕæˆÆÑ*3ÿ¦Ä T}xÍ­õë¿Wå?xÁäRƒ¤^9gW c‘‹›p¨ w#,¿§„×üXZr[][ê-¢ì(;E¼ZvoæÃNT·°j°+L ƒoÐØiË«ÙD ÇŒÈí$Å¥2*)ÕÓARFÀ1®«ÚømŽÚÊwœ< åeµ¢7:… Šð݉ûÇÉqÇÛ#”Á¢žJ°‡LaÙU«];H ‹k•-›¹ÀK:ÜŸJ(Y*+¯"6Ó~]Ù-zp h¬gˆD+¦¤H¹dF¡è9bk]döåù€Â½Ðk7 ZÝ?öÑ#ÐklØ“–%Yx`ŒÚ•Rï~Àt˜ž³Í…§'Ç=˜rª÷H2Ë¥ÛÆ®qmNMSjºJ´äTæa„×-ÜÕÂS\µ€·•ä{FÖÆEMw“³k®ìe‘î*ÆŸ¤ü£Ù©‰a7 hI `ª¹iIjšÔ56€4¼½ }µ|íÍÓÙG%Ôò,“\<136…@ƒQ©åé­Þ+·n$ƒ²6—ŽÆ„€R?—·Ó@u­(¼MF"\ÃCòùXâºÐ¬,Ï }hŒHÔTS#­0`6Þ[òõ³È íÖèÏ"\2ˆ£ H€„uç=4ôñ8˜žbà/Hû¾ÅÃUšèL¶× ¤”m.ѳMt“f˜Ú´má÷xâ²5-¶¾ÅÄÄì±[ÙÜCjÚïÖ!‚‘Ôש›*jbŒsyu ·‘­înÞTRñ,—/¤·åžÌJ²reìvÎÙGó7ñ¨ƒ5µ5Zƒeq+}eçñì–´îmV6®¹f¡¡¡§©ðÆ5q[w£úy#{Eþ|\[DÖ·ìE³äAhHÙüX&³Kgݘ€- s¥$ˆ ¿½‰‹­½–’+îªÙ§$¡ÐvFƒh'†/UïëäéÛæòéhôcEÌéà½0ÞvyïoÒsp±ÁE‰z§CëªXÑK èµÂ°uå„óÜ2´(ð˜ÚX™RE:æ‡éÅoû-ÙXZ+Ùܤ±´ÝYF–E•[I@ºO³¾¾E}ÛwY.”Óȉ$9‚ÃŽ!èÁÜ b¶ÍBþ—ù«‹bhE¿pY­¡}”$Æ )é|0ÑÕF‘ú~ß‹T$ŒâÂÍ{izÐ\MqnÂ>“õL^¦ºhr8–7Òó3˹eÕ[j!Ô#@Pôê9Fúâ±g.,þPK¾í{}=õè.…a†eŽ(ÄkJz˜Å› Ì}x¥ŒpyÒ QW=ÓBHÀºŒªÄѦ€Ci!i–"ý3â{Ûþß$ªo¯â’Ý¥~ªMJÿ1 È$tQª½!Zg¶§j¬¿í啳Uï®®Oo,:ÌU hKÅ’µÖÕØ6-)LêÀn>ÅÀ»}‹€DÓô-å™Á+¦ i­15®~«‹v:N\7¯j ƒµv{WjNžÕÂ…\1M»çQ–GÙqomgm%ãÌ-¡H§fó´Æ×V£ÌÃQ©-_Š•¨äæ£*WÙŠ%Þ¶·’8ä1HêBHºIRFL2ôŒIæüÁå^ãÝà²[~ñ-ƒ[+¬†=G¨$ÐEhñøteª§=¼mƒOfì]ÞÎêI¯»ÌÀ˜’%Ô‹ Ð’BšìPÔ>,† ëÛÇ$QÄ’JfuTASô·‰;pŽ›z¸v3ݼµßn»…̶½áíìïÖ¢«Ò©£d –zìç]+I…¥Ëå~ÿ/o³¶_0Ê’ÛM4³Üè%æg¸­dåTð…SÑ–. ;w–|â’ .üÌÍZ–·HT¥5P.²CÓO ïËwíl.-­¬b{טZÆ‘ÊZŸšU*kZfº÷µ~*TŠÝ¿ÑëìF†WxghÑÕÓF&”5#vÎñ¡¨ó+äÞþâîþÛ̳À³¼®Ī‹+3ª~c²ÑXŠ2ÄÁß°í—V¶¶p5ûÌÐÌÒ®£Nrç:Ðê,i²‡<Òfäl÷ã݈ˆ”g¸oì1AxóøŽñÀz1l^ÆûG»Bßڣ݆ «Óíì0XoíQîÄÁuþÕì1Qwø¶à…K°ø÷~ÜX«áãÁ6|{ÿnWñÁ€^_ßF­[ÇôÓžñìPCkxÿ°ÀSWZx÷à$•éŸÍø@f¿Ùˆ•¯Çâ<8âÐÃ^§Ç³ÑÇЩ+Aãñp€³ü~ÌE)kÓ_5Qk]MãÝÃYÕ|{}0ÕÒÞ=žŒ@"¹xönÅPǵü~#û{ kOÙ€‚º~?f±_Lj ?ÇìÀÿÙjgoodies-forms-1.6.0/docs/images/quickstart-drafts.jpg0000644000175000017500000012567212003555436021603 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀßqÿĵ !1AQaq‘¡±"ÁÑ2#BR’Ò$ðábr‚²Â3Cs%¢S45ñcƒ“³DTd£tEU6â&Ó”2!1Qaq‘RA¡b3"B‚ÑrðÿÚ ?ûþ§0NÄY9Øûw8ÂʸÄÊ9èºRo;&•žë'¥ºtÒ¸Û}5Ò6ŽEi ûùJ»˜þßoQÃîÚ¥!5ïò‘û·¿/·áJømú“a¯”‘é¬ AµÂ´sXò&Åœûü¥&àñM'u¤/@K»Î”Mk¼¥ÝŒŒw ¥65¯&ô®¤–Ù0W7íJÁûñŸ£«z{ Úm¶h§úZU5îãô‰ ¡Š9ãûI°Ö»ÑÓØ­¥¾ƒN„x’yÿ)Z¦­Ü~ŽŸ!ÆShˆÜ÷þ²”]k¸ývæxf'íÿ2OÖJw£˜éœ6ÚxRJf——ô’‹ûñú%û·‡?à»GÞÉúÉCö/ã’gNâÚ &ºf“õ”¡¯ìÓ¸Æê%+§ÞËúÉC^î1ØþAŽ ŠKG}ªM/ë+D×»—dÆÌýîŸõÒ~²”5§ÐÎ"Ò§Yuÿ®“õ’†¬ñúÃÙ‡T>jÿ›!úU¢jÈv"Ôê_;Iæ&}*PÕž5¹ï®jyøò}jÑu§„‡·hÚ&¹ã÷Ï×Ö”5náò{z{pEGøÏúÓbjÝÂp𶅳܃Ï­(jÏqî¯Å]yxÏR‹­< Ž-ÛÕÙ<)㾩CVx@ù†„¢kr‚fP×4ä¯]uxÓϵZ.·(F\%ÃÁoÍoµívëµ(jò„wå/Ü2·àS‡Š)åॠ¶Ón‡’ìãÝA´™xÝ´5ùA·àÐ>czOçxÇêR†·(ðÒÓ¾#—ÞÒ•ï(krµ 05¦JôA¬Äè8òæ”5¹AŒËZRû`Ú&¥|ôªQuþÛLtûÃv·)|8}õ}¡(ký¶ö3q è‰qõ+D×å ³ +iL…Ù¦šÉ_¡(kr„Ž&ROú…ÐÔ'RPÕåi?âiñ÷b ÿ‹üIC[”Éžã_˜^ AÒJpó)C[”"0\i‘½ #F ¡­ÊÑò"A#|5þøÖ¾„¡­ÊÞÄü qêWøN~¥hºü­ìqàÃñ÷ŽÛÍóNµJ&¿(t—îß]87ħ±(kr‡3‡’§mýØãQâW”% nP€ÀÉ®ìí8ÐLG›‚”5þÛO÷|–‘ó+ú¸HœŽÈ”5¹[ØÝ€m¾$}’'sO r¥|éC[í·²QáK@¿¼;yºmÄùj¢kr‡_•vÞ]ZÿzG±J³Â ¸¦Awu¦ºÌâ”5g„!òvêåå8¿~‰CVxA;7Wã/)®ž;©ªPÕžôfõ W8Yf¶º¸2Å$rn|¥Ú Zkù$hBQ¼¹õM(ëñìõ¥i+ý:IÁXq03Ø´Öv)|sÿÙ_Ä~°ÀσéΊº}¾võ·9 “ Xù>Ö';n×µâŽÚ÷pü…›¥‡Ñ ºÃ÷¿ðïž{Ä—w6á—´ÿÕBLsiʯa v¬J=yçåP *Ð(²X@©ªÐ)NõýHtæ€@R¨;Ш öð@iÉÓ‚ˆ GÔ€ï@ˆ@äâí§z¥t@ wÊ€¢ך Œ(Øì¹>:WWË×7úô|o¬ÿ¿bü\Èt?LÝàì-l¬¢»eÆdI(bÏi•„ûÅÒ{£oJ¹=—à?âWPu÷FÍ—ÍØGiwow%£eµ\66´ø‘‡¹çG8µÔqv¤ÔÖœ»U†¨  @ d4@0€ @ƒh ˆ yÐ-½ˆ9 (€ ó@ tÓ‚€@SÎ* š-@TÑ* CX Z€w¬ÈZ E?TG¿v; >G޹8¾L߸ú‘š7pòKk÷-Z\ìRø†gðw¯:Ïñ—9Ô¹KË®˜ÄÚ@Û>Ÿ¾´–ÞI¥ˆ7ÃxÚ×½Ìc÷HâÐ}êv¬L0ôþ½ô?Zt,GÓ9»g|Ž+÷\tþDËÄñ>¬y1±î’:¶8ߵ͒‘úñœU ±ä„ÉhœÂê 5@tNhª­>Tˆ@Š „ £ê@ôæ‚%¾dD“Ѐ4ì@h€ò (h( •Pcá™aË㦧èµ³¯GçoÄŒ Ñ~?e³yžƒÊõwNKa 0²ÊÊiâ3ø1á#FÏsk¡ÑIq{oÿXz[¬°xŒü¹»;ŒNúñ²à0wnq–Ö!¼¿Ý¼Ðàæ7Z¶¼ÒÛ  â€A¸;Z ‘â€4@ =9 B•@耠怢ä@ §¥ª­$¾dD5ìZ€zª² Ô€@Ô GSnù%Ø ©Ù¨î¨¯©YtÊÞǨí*6ôX2ㆲ< ‰µ¦£‚Óžn%ú÷ÑF 4 Žˆ iÅPpP1ÇØ²P-{ƒò¬ƒO"Aƨ +Þ>îh¨ úáªZòì@üº \Ð6×ZÒˆ{Pvù@UPï@ªxr@ô=ݨZ(;j*kÅè*¨   i¥ba6§¼~a) ò1XvÍþ½@).&€@ D»pÓZšðA-8:Ìh€¯¡  €æÑÒ¨ MeP=Psà€4åÅ€ uÖ´ÕÕ@  }"æ‡4¶¤Ɔ…©èZ€¹ k =ˆ P1ú©ÛpwŽ'M { €U×'ucíjŠô8Çm6ˆX(>„g;¯×U§1ËŠ€ÖÊJС…€ýh@õ@PUIõñZ§]d: F”òö `è€Ñk†„kª]8 ¨ P <¨ {P@ 9 Gv”¥9×è@Ñ¥8 Eݨ ŽÔ ˆ WD 5ª ^œ¡9WÊÈÍ_0`HvÎþ½Tîó£ˆ@j8q@ ‹¤cW85£‹œ@´ºUªT}(*?)jÜ´x¯xÝI ®º×ê{I:-PªâÈ** `   î<Ðà×¶¨MPžH€@€ô €²jš÷  V "¬€ * dõ8ySùHG\œQÕç·Î>¯­êpM ÃÙ¶€R1 áæUŒìKžZ*Àî‫©¥* ÜUB¢B«!ðê:ñ@Í|轚­¯/B16F÷1w,6—ƒ·¸6ÿ |{™£{"Ýîµ­:©*Ñš´[Õ=;àÜÈ2º;tðíÛxNg¹(U<‡Sa¬1Ç#5Ã_kPÖ˜¾ñÎsµ s¦©1+EÕÝ3+jÌ¿QÒš‘ZP§¢SÔœK‡»µ¸–Âî+—ÛÆùÆ:¦ŒÖ‡—zE³]§«b‡FËmiÒÖÜÎÖIzs+äpÒJâçqãÅ/¥°Ùù®:´ø¨ëÙ¸,4“r6Ð\Ä{Föýh‘ÇŽ71 ð÷Ûõ Ëã8ü\@8 G1‹&ê ¸ ˜Êc]ÿ›‡N>û~’ƒ¨»µ-Ç´ð;ÛCë@þ"ÜÆ9róÚ_ÉB,›ÞHy÷6¼†µÅÌ÷©^ 9{V/صëèò9 ;[«'X·)æÄÊùã3#45hÕ®#Pë& o«¾4ºÿ5;‰ý–ÎÒÞ1ÈoÝ#©åRéþ+n'¡º»ŽÚ+Ù#Úba{’ÝW6”Ûœ·ÿÚêùÏ…Ôò»ufk!£o!$jAx×Dù®/nhçâ7ëA?˜ãé_‰Š‡þ±¿ZüÃÐOÅDÔ¿Z |ÂÆ•71S·{~´7–»Œñ†ž{ÛOjo¬Æ¦â-xUíJÛë'’q#CG´ëéAØHÒ* yÕ 9 EìiÀwDø«aO¾fºy¿Z ‰â(àkÂ…q@v *€+P¨ !Qh:,È9€¨Ô Ρè÷CMY¡>P¤ºd⎯;º>õz¼Aj@ÿ -9æo\Ò‹,"tÕh*…A§‘J*Jª ö,ŠwÉáÚÛ1å¿pØd-%®ðö¹ïÚE4o ƒºsíLO/å'‹(énªôî-Àî¿™Ý<ÇûH:Úa±Ö“ ­ãsd¡/{´\$Oz Œ­¾è/®8ÿ8#®wõè×<È»?? hyùú¦®2oÈËnó4² ¥ˆJñ ä¡Îˆ®5 Z’Ï¥©òLOÌÎSá"ù‰nÃu´oÛJ{4Y¬Ñi]töîÃåóØÂû0l;SS¶Ÿg^Ĭ”‚—§ñ2Ãe °oñ%¨q.Úæ´°TOºâ5H¾SÒŵü3é[wºAÏ=®·‘Ò¿tŽÜÖÂE64¬ß2Eø±°E’“!“M !”rpŒ’ÇÚ+Eš­ÁQL8”dµµ“ûÈcxç¹­>Ѓ™Æãˆÿ„†¿å³ê@|·ÿ¤‡þí¿Ròœ]Cœÿ–ß©0øj,¡¯ùmúEØ|I56pÔsðÛõ …ú…öP8~¤ ØL3€Æ8{Äÿw0†Ÿ²0w ê(#ûµ…Ööm‘✴÷/Ýœ5KŒo$ñ>,Ÿ¬€oK`¯Âw¹ÏwµÈ$þ˜éçzÂåj~êtñáfÑäsǰ ío‚ÆÛ¼:È×úÙµÈ/š…¨ fDòWÅ]>ö)¯ôš•G†$vÝ;¾¥jÞ,8áqQùÁ#Óµ*êV¾M‚8GçèN¡*%‰ü@ÂÞÉ+.ð£­ÌÎiñc$€à]®ÓVR£f\Å»Yi<-uÍ¥ÓÄ È÷µÏ¦»K½Þä ÎKwž~:Ê5«]ñ÷»¨ÖLi²&Êwçv ×{𯗏èÐ\|€UWI³oOÚ<êë–ºåÇ];Œ¤ÿ´ƒ^´æ€©Êºñ@‰ïÕh=Ë!T 5@WN(2òå¿1Ãî©i¸};ฺôÙÀ2CƈÓÉ+J "u(Õ@ò@¹¡ñaô ûŒ€¥)‘»ÿÅ%[]ýÆøÿÌ7+ªŽ•áÁBwb3i‹ÊEa™³†ÖþæIä‡$6ýçˆIŒ×íUŸg^-:Êß0ÈÉ.‡‰#ß;üW¶”ðá ®¾ñà‚ÀÌõáÉ‚{¤pÑÌÍ”<žãö\gßu^Bß=»£d6íŠßŲ~³¾K™ÊFæÔUµì!kÕHÜäwxyd²ŠcOŽÞÆ‚àÒwIº€Õ¼*•‘g£½µž;cð™HÚÿÙn… Íjúm#PqÃgïóÁö¶¢¦Ð ‹AÚ|)5óo@Ä}H*|kGwäÚ@÷õÔÅg'h‘‡ÒCDÜu4øzs¤îýDøŒößø(KÿÏ4þ¢gê ²·YÏÐÄ OÔ¿àíË{|g~¢éz€ƒ[;wö@Â¿ì ¯rÌõÜÖž%¤0ÇoqÎwŒ\àÖÔ:€4~r ®=å,Ð.±,—,->C+P^ö ¢¡@0P ¢I‚-oK‡û²ý³µV×|ýÿæ” 8ˆ 8s@¹ñ@s@èbŒeÃz½ÙÖ³Y¶2ýÉby§Ö»ˆA²×]x ÅÏbn²—v¶Ž«1.~@²Ò–‘²;¤ ØŠá‰°ÄƲ&Ö1¢€Èò Ê·Çæ-ØaŠî9Æ&˜MC\âê8Uöõf»­gòhø¦¯A1w•h÷ñû/V‘þÐjü^eàìǵ„pÌßì‡ ^>‹m-ûÁ™ß¨‹¬ÏåcÙ§ÙÅ+çh@¾70A#ŸRã²ÃŽ-Çù³0ûPDd²´±2Ý,fˆÊdˆÿ”Ï^Íñ~²ó[ïÊÅ\êÆ}{/ž°T>ÊíŽA„‘é…Dx#§»cxï$é*óÒhÖã¯Iÿ(é.A ò÷¾•Ä];Aᓨá@ê ·ƒŠhpÖ1NÒÙ™m{OC@§™jÔåDT0O$¨hAÀ(¨‰ª üÙ+¹5§»ÇΖò±C ƒ´,«w§pv55&!ǹhÎÄѧr9‘ìT:( |¨ob-ª ìήǚh/b$öhêzÔ'ËéZ­rV’KµÄsº²fÆàí§°ÑdZAÔ Úm/`»uÏ„u¬Î·ypi JrÕ 9HAK'˜µÆ6Î]}pËHƒ(h÷‚A=š ¿Üƒœò²_+É ¥Î v´TèQ·ê DìcÙqîH˜ç5ÍZûÀ ê2øÍµø˜ôãï Ïqtþüw ;ê@|÷S÷úŽ4kÏÐŒæ/œþ–»êAžâ¿õô]õ —Ï1#_Š`õB3x‚¾2§…\¨ÑdÏáãûW‘ùŽïêÕ‡;Џ¹e¬7 ’yŒlê*hHDõAG0Iµcyºx)Úej xpo"€@ê|È0úLRÆïoïÿÉÞãù†ÛQÄÐ.h PgÇ—lùY, ò2Ü~Óv)áG!šêçS8 Ð%•±Æù4¸ù…Pr°»øË(.ƒ bxÛ a5#p­4AÝ­¤ n5>^Ôc½÷SZ´ŸÇHÒ +´ƒÏAßr¨2bê[ eš8£¸{ ‘Ñ<ˆ^ZK k€¡AØgñ›¶¾WDyø‘½ž²(ƒ»2¸ÉVÝÄGóÛõ èní@ÆŽ‡Üß­å1­Ñ×pŽ_Þ7ëAæ1mÝÅÿxß­rø¦ñ¼‡ôÛõ >s‰¯üd?¦Ôn[iK¸M¿Z|ç5øÈtãï·ëAÍýC„h©¼c»6UßÕx0îÓâ=,e*zƒ  7‘¶ºã´úÐtÌ?{ýã~´yúÅðŽBþÂð=gDฆáž$26Hø0‡ ùBÔ„8t®¤ŠéÍfC+P¨ Pò@*¨òª3ó@eÀ:Õ zHR[ËÄÂðOç{U»Ób˜ ÐýËxwö-ø¥¥¢9–ˆІ P*Ó™:ª IúT ×µnpV;1ÿ¼€ú²8õk®FÃ)·I7ÐÇ ’ÈðyQ§$9n gN]Ùañ¸øÅ«¡ñ#{œX×ÑÛDQí.•Ç]Pj庫Œ™±MòѶáÑFç²)£\÷¢©P™žuìW1cÙàäbÚèmïˆHÓB;¶¸i^GˆAãíú—9n÷˜üfº¼žâIÚéCå‰ÍhµfÚ{ǷЕw=qws6)Ö"+;yÙã_|o¸ð‚7ÂÊ‘÷w’ˆ%Ôwù—õ álá¹²ñ$–ÊWÊct’ˆH-ps}Ýæžh=¬—[1׋yÝýä!Áá§ùÊ ¹é¼ %ü£BËy=ûJ âíáf6ÑŒ££l, #…6…¡`EucIC@²'FöyÐ^”¡:Š­+@ÝEö0ñh>`‚.·¶p£¡aíRÈagØò4=ê(-4?€ 1·O)6¸ýH3óGmœn¦­¸·?üV¥‰(‘h€áç@«ÞÖ¤"0zDÖÂëÿž»5äk1)G¸ßþa¼+Näpˆ!peJa¦ q‰§›¨vJ8Ë©1Ý)m5”¬«ræ †³Èæ4‚\¡:œîr8ín%żÚÊÖ‡ˆªù‹ßáHÿ%»½ßx ƒîs¹\|޵|vwp:h®ì$g‹¸T†QÞî×S^Äðæs–·†HÃ[ÁnÖÚ y,Ì-YÛ£ ›Üƒ[›¼¸ÊÝÇ+íÙ`É_o ¶ÎmàO¼$ÜiA¢xãšýá¹eൎWÁ¤eîÝ^ñVÖšëªGAçA’Ö8Ž ™GIË4˜X_3<7úT¸n®ã_Î: Ø¥t"£½,l¥}¼nò±¿R?&ÄWwÁÃQü† œxütz2Ö&æ4}&Û;&×dŠñ£F¨ÙÙ´ÔA'±€}Ã[pðYú#êAYÙ;íÛÄï+õ “l¬À÷`ŒsÑBŽšµo‚DÁª:(4ù@(!ðÖ SÁŽ›GÔIeg#6IoØ%ÌiÄ:e a0´5†âàíh ¯ŠáÁ¶¨-@4ªT fBæµ5ò J€‘Áà Îê8a®ÜÓBÖTzBK¦D(êó?ÎÿB˧¦›§+ò~›~å¾èàœóñKNÈ‘ª’Ÿš 4TDT“].uïPM£ŠJÐqâ ¡–cžlõÔnxÖÖBß<µÛÚ\ÐhîÑ^h#w´»u³§s­%Û¸ ^Ð@:wPp¾µmÝœö®qkgѹ•…+ª 0Xfá‘¶ú#m k|4h àä[ošŠ„¸ŸµáOö1m¢ž<S,suó9r´-¶hAyõ Gç¼fò}âíÏ&ÔS³Ä?J xyÞ"kn< Ãô2ÌÙÿÝ£—¸óý¤Åš¨&æŽtˆšú\ƒ”¸ì”÷V²ÏsËY¼PØã-q÷\ÒÒKÈ4Ê Y£K {&ƒSþs_(  {x  8QÒÿòù¨ý®çOûg#ÑŸ¾:6i^(àˆdP±Ï,`kžk! ǵÔâ‚h9ÓÊÔ ¯ðV_ñFþ$жôþwLQ™[)cL­}àÒA"¾dªZÂ× ¡ÅlxI"cc‹!rÖ0Q%®VòA1g—i ¿†ø›_QµË“Sy‘±ië(Á厦øÈ›OZ!Ë´O œÀte¿Õ(.hp·…ý´‘ÃÚ?‹¿¯±qíÛ#O¶ˆ ìÀ6î ?ÚA—œ»LuÑÓvÖk7˜q÷TîkOö ÌNã¦6èÒÖí%Cv^äôË¢0´€niîc®üìûHÉd]ï36Ïå¾6»ÑR€ùµëE.çw­ðÜ=;.𴏵ŖO€÷O<‚"AÚ×Èç7Qü”´=¨ z#ÚV %D‡z€ºð U€«Þ€TõfF_R|Žô´í>†•¦£’K®F8yÚ3ýç¨(Õ“§(p6žiNê­1‰¢w鶇]j9#™Š…B,ivî'—bÈÕPiЉT("HTSÉÊØÅ«žC"ï{Ò§¼è°:?#a÷QÈ·ëA6^Ù½¤²hÝN4{tõ >6χ“{~´¼³›ˆÀíÞß­7e1Í›¨M¿Z_ãîÝÄIà7¥V^Ù?F\FãØÓô êÙb:x©ä@4 4t³p@Í·:ò›õ äìž9††ê {7·ëAÈæ± ]GQØPKæø½ºÝÅØ}ð€ŒWþ®/Ó&r˜Ñ©ºˆ÷·ë@›“Ç8U·PŸûFýkC£níœ*Éãpî{OÒ²¯lÚéãò.oÖ‚'ŽÜYñ1vïmié@þ2̶¢xÏ~æýh3s÷Ög6ÜFç6{w5¡À’DÌÐP ÚãÍâÓDªRDct¶–µ ¼º¿ã8£¿¸ßþa°äQÊEQ΀ó ]è¨ Õ|¨#¯Ÿ’ST¸ *€ª @ù GµT *î Žh Ž\Pí@ŠZˆœõTÓ¹@Êšñ@è€Ñƒ;>?Ñîéþì©.™X£«ËmgrŽÏMÓOcðoÙð€Šp$pZrÍÇ-!ÇE\ ô4PQQjO^ß"‚4¯>j‚„@¤Ž9c‘¡ì#V¸˜¨8ÃŽ°‰ÅÑ[DÂxícE}Jüv=Ú¾Ö#Muc~¤ØXCm;66žÄùn7OÙb¯/q¿R­³´n­‚6‘ÂŒhúMÐÀG½­'5ÚȬ1;õóÁ\çÈÖ5ƒsˈhækÉbU2WââÞvMnkI˜àY§xh“ʼ©ê+×uáÇ:A…£d.#콦Éï×ó­V¦ßâǯkzß©°×ðXA8šâá’-ƒsKc;\w 8ðY›&‹â­jh°ÑPñõ [æ5åT‡’ÐY´îAžÅ ýä^h4Y ºpâ |…h1Þ²$ P §"ˆ1:QÛñ³8VŸuJÿœä‡oq¿üÃljŽS¼(€­@D ÇoWô˯…‹2vîº'o†×ƒï~náî׺ªÍ“J³êkîXjzÐ{A‡UYÜdà°·òI,—Èã `¶ÑÎI ?a–íiÓn Ô®º›¨ç蟊ÖO¥ºšæÉ±ÚãnqØ\@&ÇBæºivÆCç ÜÞêsïO\u“Ó-Û.†ÎÞõÝÖ@ \eå«¢Û›¥atLŒ4ŸÎšò:¬ÎfÆ£/kw¤z&nŸÉM+®Eͨ¶ŽÞÈmÚøÚ\ö4¡%bëêÕ¶Q½&,¯™ÍI!ÜâÙdh¯hÔ ›h»Œ‘¤MãLÂjY$Ò¹§Í¹:wÖÚ0r¨.ƒÎ‚C5e4–AÃÈäÂÙÖ»ç™ñ¤ýdå0vÏpß$ÏúJpñº Ý]xbá- «¥¸w`3Éôäðé¶æå”ä%qöÕqrp× Ç7éjòšš›Û“ØYdxc›#Ë…:ê‚ý0 ä@ GÕÍTïÑ ^”?éržâî¿ñœŽÞçÊ|‘ÊFˆ„V *k^5âƒæýOÓwÇ36'0ÛO|ÒÅ $ É&&Ò‚Gw%ÚÉ·ÓµÊú×b,êÞ¨Ã[_Úe<eÇÙÀøæ uD·26¼×]µ÷¼ŠÌ[;a+14•õæzKÙ^ì…´,ÆB×µ§eóÜê´{€÷hµ{6Ã3~Ö¯Ze.úæ;W—ØØBÆÖÎFûò#à%Û§%DE­VjÍÁ_Übrο¸²¸î†rèXß¼K—{Ôq«é6ÁnË¥Òiÿ-°‚<ƒ^ÛKÛ¦Ö츺æäp4ÚÚP,_6×bÅhú]µ³íìÛet¯ch&—Þ.=®¥9šºÄ+ \ÑýäAßɇO[ÖAð9gT; ßäBÐ}$•Ü]ßåd§>FÆ?²Œ]ÆŸê3Ÿ.ÏÕ@|²ðFFo!lgèA?ƒÈ·ì_Tö>&‘êÚ|6^µqØb?Cß)­Ïa,xþÒnu£…³Ï-^ß­|Lõhm`#´JU÷g"Ú<§õP!.p7Þ²Œ»–Ù´õµñsGAbÁÞf|Í@mϸSm´]„—¿Øü7PêmÉÿ)߬‚qÇža÷ßm(çF½ŸK^Œ¿o¾Ð×sÔ-@𡍠Zy …å@ÔN”ןb’yWʬU2‡ý:à; e¬¼O7áIØ=*:·ºz¿%´5¨-:‘NeiŒÌM"Î'øRª‰"žU )¯P%\¯üº~öéAd;¸- oÞ‹#q4-¶¼pæ)fm¼…Íã­*|ÁdugRtûÞ"+c!4Ùâ·u{­AZ ¹·œ?À‘²Þc°×kÛŦœÂyLe®O>>ìmrÍ’¡§©1U 6´0phyˆ¨´Pô2RË6êhNÙc‰îa4ÑÍi#Ž‹"ƒ2óÙÃpÛð|V6M²DÝ7 ÓBX¹Wi%øhã÷Q4ö· ŸÀ\í÷o¦¯3Fè¢Öwõ—ÎÓˆtm5ö Œ–Ù6±Ï mƱ7ò -òQü¦ÚúñÍ„LØ÷v‡H@hó¹Á¿ˆørð&ÛâùìnïJ 4ÏN3Â>â|`íkâlÚ[OZ ò@WMkD}H$Ö¨+Ý'²Vkç§Ò‚ΨP"ƒ£w|˜—}§\Ü»Ó3Š:ûÿ(nÓ]ÊGðªjÔ@åÄ- §lrC%Bn|‡–ÍÛøyRnÙDôüNêÆÆòaº“E0 ™¯h!Àpí¢DИ«Íãz`CÖ¹ ×ÙD1¿ mØÚ5ñŠ;häBévoðÞçqW©ð-Ì¢cLÔ§ŠZ7SùÜW:ˬÐ|±¼m጖0ÄÙy†R=*U"èÞz¨¨:‹P!4±Ãå‘Á‘ÆÒç¸ð ¤¥F`Ée¤;àÆ`$ì“Ç¥ÍÁ§µdHßæÀ¸w‘Z¿„SÖ|Ë.Ç)g'E,O>‚Z€n~µ¦æÖêÝÎü—Â÷{*Àåj&s– ‘àÝiÿ·—Ë_²•‹©qÒCn´ÒŽ·™§^g‚TX‡5c4ÑAÜé%ÝF–9´Ø7C€ÑA~¨P-´@Â^hJ …JZ TZ€Õ§Ê ~U¨H(4W³Š¹QO*Ç\V£Ü#N:¬ËVbyí²v(êÜéÆmÂÚ6µ4ãÚ{V˜ÌÄÒG8Nh>…CTÏ]PTÊëc#xTµ¾bàE§yV aõ&%ù ŒcæŽ6ÜNøèÎѹ·´éU{°´ê]ö¶LŽÐX†x…¡Û¤ñ‰$“ÅÔæuP_é¼tÖ2Ã;i<—Í+Çå\ú4A¯ô (V‚ "žn"ü=ä`о' ùBÖ¦&ÛÅ\ßqr䃰"œj€/hÐ ™bdo—pAÎyã6ÓÜDnÐ8É=ˆ0²–9<—JXÃ,mÇìò}á£CYGwóÝÓ·ô±’ÒñöÚÀø¤“9îyžá¨Ü=íXÁã²Ïs‘Ê–•ÞÖ:8cŠ(ë±'SÇqA® Ðb¡d´Z€›Z{Ã^tYïG¹œ%ͪ Bµ×D P$ˆ€ ÄéŽBâçÿÊ:ûÿ(n 9Ȫ!j´ ýÃVòâ;Pyަ†þÞëãœ$¿·–Kx-l#£ /vÙtihsœ5iqÑdVe¯S[ÝØC&Añ6þi7Ù·dŸ ]FÊæ—<¯j ›“x2ØÛn_±’âíæ…Ïc(Ö°šR…Î×ȃ`U¨ùê (ƒ;67XO ‡Çå¤ >¤›µ €ÖŽh‚@ö  份ßÞ‚„DÉœšGð‚ÝŒ¶²8¹ÿÕj|ô–+;6[—]²BÆ0€ýì-æâjJ‘ÍÇašµŽêoÖhv‘ZÊdk[À &¨#q!=aaN©s›–‚h\Ïw•ÀÑêM$ HÔ¡WZzÈ:) >E`¡<ˆ*äZãg0h©-à³-Y‰ç¼fÿ+Ð6:Uþ'OX¿…XiÌý£ÍS?Tõ¨çËÁPr•¦ªƒNÔ‰P0 ²)åš]dæ«ÜÆ)xApû8- oËc#œ[Iy g:xN{C«äª g¹œÖ@´Eüú ­ykilù®¶F¼‘QïºúPP–懼èàg~àÝ<Å'Úô¬b¦H⯠³ûƒ˜£š5t/æ^çWÏRƒ´º@Ñ¿ ÈP‘ô “¡éjï­³ÜdžšB ZºÊhñ%°`½§sKF‚‡šäÿƒ›¥„JØÜð%x%Œ$Þ4ÕZ¢ UPÑÚ‚®CHXî;eŒŸÓ±Z  )D ´+@¨¢È8„hƒ¤>JH5i¸¹Ú{GŒê#·¹ßò†Ø:q…¨E;ÖdDÒ ­@çqoÃÉ!¯l¡¡aÜÓéY¥¶‚YáÍûØ7xn­((à‚/´‰×qÝjÙck™QÍ®¡ ù¢•Z-N€ ­8¬€ ­¶uÅ«˜ÀÓ+Kd‡y!¡ì!Í&šñ+ˆó>üÖÑä1ïþ³‚ìuûÍ]’‘½ÌŽ0=aÈ9ËNÿ2ˆž^æk)97ñó€§R )háùÕz¨P+[|»²‘Ü]Y"{à½ä¸¸´¶­p(y ÒšÚÚrÓ¤¯m¬¢³¹[ÆØžA o&“؃2\œx†ì޶ÐB}ÝÎvÖÓ»R‚Îk9±·ó[—Eq$±|©ñwoea:”n¤htŠüæs8öÅ ¢›dšü;ü)Ó‡u5­I4äP4@Ð2*5A2F–•%ƒÒð‚Ý5Õ5#DrP ¹©$o†/GÔà£Ò€K>œ4ñ\£·¸ÆÛì§q¹h¢ÈF¼x­@óÒårrÞ\Äé!ÅÛA7òIÆù%vÝÀ´Ö‘ÊȻ„¿¸¼³tÒ ³Äsa˜4°JÆè$ÚI¥P^’hØÝÒ81µsˆ§@5AÎ;»iÀ¦×£o»¯$ÕîZƒ;7ìÖñ2Þ!3­uÄD€ç1¦´iv€ÔEþ[Ä,8·Éþ+6  ægòqÚ*f`("ìÅÔö¼|Íìt?|?Ù¢oêkf“ûë©Í¶î#Ì•'ê¬[ –;˜nàcÚZó%´š9•°¦,OZ|\-|rFÐøž74†š4{iTQE1¶(˜Øãh£Xа‚@IíIÖ„‡bÈ•Btò ‰¥Oz ¹÷ ²Å_ûÀ‚ç4@qA´ žÅ =hFøct *s’byq•È¶8#P¢Vœ5ì@Š 9+Š’Ðíd3 $¡¨Úáϼ óùNêóóÜÙ]¾Ú˜ÁÃd4ˆ1¤ll?dîw:pRƒ¦KÔ7–Qã®] Ô­¹—ì˜ ;Û]d$J£‹ºO+o\Y:Þ¹6Ɉïnƺ¡§vµ.©.ªQgƒk T ðØÖmoµ P îµA: ÎÎG¾a»oíPšŽ:9×=ŒÕÎwš{PsÖ{¶üD{»7·ëAÛÅgç7º„ „“DÁï½­™ {Ps7æ‡Åa§¸}h&Òi¨åD-Ås—ŽpÔA[^Âç“ëA›‡6s–ÒÙ1âÛÁ1MqcÞÀçî4kÈ’5AØÛõ7—O´Í ͉ÌuËÜÓ½¬Úñ±€†×B Ø|d¶Œšk©÷÷Nßq0n‚c&´pA¤ÕjT%`:ëN|P5tPF‹P *åAK3¦.ëü³U™tÊÅ^CÄ‹³Ú£³Ñôe?uq„i÷#Oé¨sÏü’Ø.èŽ) EQÇ™€>u* T*qÒ‚žLƒsª@kšãN4dC./…˜u”¾ÃÚf-h{ü*ûû´ÝÍLËÙy%7Nt>8—`cšÚ ¶û¥§…tÕÃî d/™ò1±GS$…À5 q©åDdŒ½G$mŸöVAk‡†ï¤<Ó m ÍÈ2 oˆ¾’Xé<8äkêÇ:‘ëÈ»³µj¢ÉŸÞ kNiA!&î Œ¼ìr†Áqİl‘Œ—Ãu™#ƒx* X¾_p ¦Fãw*ì"¾M¨´Ë¶¤_6CZñ Sú$ mµÊSÞ½kkÈD4õ ˜±½?jþB9ÑŒÌh‚V®·¶šo‹™ÛçP¸SAäAï-±˜Û¹kHcC¥”€KàÉØL×®bxc„npx qàÚ׉AØÜ[´ûÒ1¾W ó ê)ÄkØ”qÕ=Þ\ÐjÛÝ[ÜÅâÀñ$dHäGGGb…Ãb ™¬}Õ„—Ð=ηˆ¸<†º ³»JŸ2 6×v×Q6ky,Gƒšjƒ¸: •y £™ë'KÅknDΘ=Ñí-àw7^h3¢‡ AŽžê¢­‘ìy½òƒ¾È6ívÞâ!>­È®/³°w †ºð¿ÛDE¶–Qêz~B;~îCè/@xxÐú ƒ»Á_ZN´Çz,eí«ÏoVú.¢¶G}A÷Û§Ü#mË}× ÄTŠðA¸ 8-@tâ²@R•§>(ºûiÞkÝÚµ ª¡ÐV¼Ô­©˽ D¬…ªÔUC%AC7¸ânÃxøfŠK¦N(êñþ#»è ;Qéú;^–ÆÔSîxyV¡Ï?òK]W;” Q!ü À;Ð*è‚–aíf:W8ín¿Ò-kNÑhg¿á–nNÑ)ca”;›$ðç¨!Aš:FX⻊Ú錆ëS¢»›'ˆÒú¾¤êñ Hã½™“7ÃtŽi|uÚZÚ{»ZâÖŽ\x«AÞ.µ‡6:;¹„3øaïvÇ8xChÛQA Þ*P_°Ç6ÆÝ–í–IšÏñfvçš÷Ñn%WšÊb•E,äo8ç‚CßAS±qw‘ÊLÆ+h"å¤ñk[R}UiLfí«FC<‡µ±?éYDÆ[M-.\{<:{J ”í67äiúPsžûÅ‚HŸm¤%ê£oü)-‹] n2•”îgÛl€m!¯Ð÷j‚¦1ýMŒ³··µÅ¾M¯x¼ÞZ7Êæ» t´÷©®s™™±×Ciò‡ ¤º{@.5¤Íoˆw7òK¸ ÜéÜõ†Nßd"âæqîìu;mH׸ ØA™Ôf#dRÿw5Ä u:x€ðD›»8 [¹Qó 7UHP"àƒ*z¿8}öÚZ¹ñÆÑWÊêwíeŒ˽¦¸‰Zê´µ¦XǸïÎ5¦ñÍ£Ò‚nÊd|6øÉ_6†hÞæÆÖ‚í¦:8Ž:rAÒÏ'y3ãeÆ6{S 5{‹ÀáÈ–hy Ó@UªT@UÅh* h5V¯bÍ=Š=J„P>:)#?8?Ñï(i÷gŠK¦N(êñ$¾¥—¬è½zW;àkÜ÷§ ümž ¸¤<õP::È‹+^Z’µ‚Ià5P*ƒB5ì*‡ÇÌ ¥˜huŒ›©´:Ô<(,Êó/•¬t….·í:‚´æV… ¤‘Ù¢Ù^˜¶Ê\Ç4óÈÖü)âa£eejáÙUh/a±¯ÆYüÄ:âÍ-w½‘òcœ>Õ;T ãÔ“ÇWJÒèÜøšúrk¤h.=Ú 4Çx~'ÅÂbäï´ö çó¼= Ð;$oÖ Þ,·wijojö;ƒ^é)­Ýì+_f¬$·ql­š2#]#u4Üx žNõËÞË™fÈÃŽ̨.kÇ&¦ˆ Öu[Áyuœ.hÒ:=ûÈç»M¡ÞMõd.{¶ÚÜÆv¼1¥ÌpíÄÚñ'“œPkÅ#Ÿ^æ9Â¥Ž¦æ×‘¡:„uò ‰!ARO/ yC Þ|¯phþ©AsT¨jO˜v <¨ tÕNî(FøbôsÈ™ÛãOéñ\ŽÞãoA¢8ÁZŸ—†;˜›j/ipâ$‹Ã~Ç»oÚZx‘‘a}s]ö‚íóVèÂ-d"G¼ÈdÜáµÆšèPX‡=Y ¢/žá•íû „Fæ±Æ¢Ž-ÞêUµõý­•³®._²&Š“ÄŸ Pu³`’ 5ÀNœxqAËã­EÄ–âF›ˆ£ñ¤Š¾ða$nô„Xìí–"òdy”6à7í°ÎL›Ëx¹  þ ÛòkÃĉô(铊:¼Ÿ‰æB=5z^ä1V —É¡þyUÇÜbkš€IÐj¸I AÖ¼•šÿ ¬† kZw(9¸ö-ŠðåÚ¨tPVË5ÎÆ] œbu;h²:ÚÈ]mÆžþ C®ÚŠv t Ë ÔŽä:÷­WŠ‘J¥CÐF‡YÎ gøƒeùûUh;‹[= aŒSóZß©Aж3JO @øR‚žMs’8^ݲ°=¼hà*Ëâá¯zБ§Ȳ$M5õ-e´«€¯idH;¿NäAšÖ†£Uˆe®]É‘DÂ{És\:}+Aðúö ‰d»B‚mš tƇÆ]¦”å4ãŸÈíî1· (Ž$iõ Ž ­W6wm ¹…“5¿g{C©ä¯™ ϲsÝim’›ÜÆ€]Np;i@á kÏŽ¾MPEØÛ×Â¥xûÎúÐ-±­|“ßSíA/–Ø8ŠÛÆvšŠ´qA3agÃÀgwº»cÄÀÓCQ¢c¬+_2uÔ´ªqöÿ¾jb»ŽpÖAâ*ï­v#ðṿeñ‡´¯´´– f|“™ü]´.hk€h¦´ÐúY-õ #T8 Cã vìxé4ÜN¿ÞÇÎŽÞãj¾^Äq#SäZ€}** 7ôOz^ä  ‰(: ˜õv 4ä€(è‚\Ô4A=ÝþDä=¨#]Pê€@Šž+P ¬Èaþ@ hP@”* HàæÕ¾ð<)Ø‚–iŘ»— Ô0ò¯¼¼QÕàù}*¶ÚéˆÛ!eK7¼Šò«¹!‰¨B®0‰#ø• ÏJ^Р9èVC’Š¢EV„Mѹ@U@ nÝOt —$ ®ò nêTW°•¥N€,¡ä€:}<*òä1åA O4  4@"{.\0€T@(Føatˆ©?{7þ+‘ÛÜcl’~¤q$ U¨ ™ uÔ ^}$š *P R5ô \P3Z ($¢ o<Š *´M{” @¡>¾Ô …¨µ®ˆ‰PÀ ö(PUvöh´¥d@¹­@òÁ¿,ºÞ}Ï Ö½œÔo+uyÿïGé#¥›§Èùk@àðeEg7ùïô¨ä‰ò-=j‰tÕ@û(² 뮈yP@Á®ˆ ä‚$ ÎÍÁÔ3[ÆÜí¥À}e’öÒ[ÆPèÖEsfZk̸ù‡ƒé~ºë Žžé,öfë,}S$L‹cž9Zé,çº1‰¥¾‘µûYNTÖ­•0ŸŒ—·? Éf¬ÝˆÄÜâ²Ù›¤¥¯6/¶ºßd’¼€'p Š¹Ô Y¨ô,ü]Áo’Ú|vBß-ºÝ¶x—¶Ù÷^ؼòCþ÷ $i`~ÕEßÃþ§ÊõHrϲ8Ì»¬m¬æ‰¢ˆYZͶC æÎß;½æ¼ŠST{¥? wNbﺪÖêÁ—p\ÈsREl¥’Ò9g•ŒÈùB÷7t@;iÚIR£Vãñk am<Ù|nK,QÛO¥Ä1¾yູŽÑ’ÂËyg¨ÌÀöHÚuZŒ®·ü[¸±é|ýÆ vObë‹©f†Ec+˜çB.™,Ì{‹šöÄ××êUJÉú}™ÆâÌ7&|1G,? Û÷;`· Ê.+âx„³»ºªÔR°ü`Ãdí1—Ì6Zñù–™1Vâ`}ÖWÆë™ Ž‘7í{ú×ÝÜ•æÚÞ)Œo‡Åc_áJ6ÈÝ»^*há]Puwî@ŠÍ¨$€¦¨: çROu<ëP%íY¨—Š (k¢<€8!á‡Ò¦˜+zk÷’TÿÚ9óñ6Vœ:,È¡@õZ ó #ê@Z ðg–ëì^g 7#‰9Ì“qÐÇs¹–X´žäÈù eÖÚ” gÚîÔ3²‰9ü=ÿ˦·nnò ͦ&ìØZ›`qeã¶6k¹w=Åþï½@45"¦ÔK ø®E¤Ì¿³¸¾Ë¿#—ŠÛh-Ù+,ñ×Ï·•ÓÍ µ»~ò®wÙJŠýYøÍn:7/”é+K¬ŒÖXÁ|ëöŶ³|ÑamËg–) ©BæFÇ–ƒïQJoÔýSiÓÖÖ’Km=åÆBé–6V¢?k‰ù¦|17܉Ư{F´Taæ?±°öÜã2{kVÞåmØËÆ9à:`éÛ½ßtã²Ô„UPâ¦Ç”²ÆþL]µìxë¼Óc‹àášcˆ¸™D®cÌÌ÷ÙƒkïmJˆÜþ,alnoíò¸Ûül–VWyxß ó< ß7†È.&{³Þkfk*• )ø³ŽÆâþmsƒË3ØÝ4·ÒGmnÖBÐdð®.!þï½¶8Üê~JTW‡ñe‘f:’Öÿsð8‹Ëk(Î×±îoi4“#G§ºæÛ=žÞÏe¥¼ÓZK’•°6Ü\Û³BZ&tísVÕÑ’4qV$zUA]8¬È#§R¹_:PV IPê %]B *ày*ëô­@§—qË¢¢7kæR]2±GW‘ñ#üÿWñ¨íG­Àl?í$þ²Ó–nÿ“CÕܲåð´?ÃEA§ñ u¨ïY €yª c‚·†¨%Å×’D/øn,z¢±0ñ?sç†ãÇðvüOƒg=¦Ý»Ï‡_ˆÝZ»…9Õÿñ[‹¼m¶#)—Ž\n>Ã'‹±[çðr2C#$•ï–F9ð›q f×v PwoáfXGksøK¶.ê ÌmÆ;mXù!d‘IñMmÁsÛ,S½»Z[´ê*µAê:3¦2!™›#}ýîk rS¾ ´q¹ÖÐ[ølc¥œ>µ.ççPy6þä/pV]3ÌÃsÓøÈn™fËKW[\>K»iíÑòá­k$„Ÿé\ÜMDqª&µ¯.Å¥©SµR¦I¯iB¨Ô¡TD¨õ!Q_:ŠB©ƒ¥(²Tê…J½ÈT!PO.HU W‚È*¦¨TT¢ÒEjP¤Ÿ“Î…$T) kÉ H'˜D-Pô u@yéíE¤’!y–Ф;½+)S¢ŠÔ ƒžÔR?Üwû[wጮéø_+·>Ifq=•yÐ#·¹æô@öÕG‘^Ï:D¨¨E¨ÝÌ!Sªº¨TŠ” r <4@ëËš½È·± @pD¨¯Ÿ¹ü_úP (Ð*OyâPV :ê³!<* QJ¨P A:zЩðD¨TÀ¥tãÅj¦;*©j…Jµ'µ¨YQ@«_ @h‚Žm»°÷ 0IN’QÓ&œu|ßáÿê‡é5Ú¾‰ƒcåÆíñÉ«›rÓÉ›4»ä½ð’ÿ)ò–þª9úù#ðnnf=û‡Ô‹ëäN³{‡üLÞbÑô*zù ëKh.çox-¯±EÔäåò™*I¾ºÔ4ÞÝ?ÙCW‘ŒTõ¯Ì.tþS)ýT59Ë&ùûšÖ§V~ªœ€ÆÜUßêðû²ªzã„ÇN?ó÷÷ìýT]NI7p_œŽÃáþªÁ©É!cqZ›ÙpØ?²‡¯uŒÄ×ãgó~ªœˆcæ §ÆÜÒK?U N@cå?ùËŸÒoê¡©ÉÊL;žOí÷m¯æÈöQuy"ü,¥¾îNõ„kVÈÒOv­(š±ÂÛ…¹hÓ-xIítgÚÄ]HáRôÕäµÿ^ÈÇ^Mt#Ñ÷h±-í?ôÇN_ ~{~t ¯ƒÿøÑumñ¯ý§r5¯Ï¯‰ìûž^HÐÕ·Â>¿ô~ïdÉÿžÞ~Œ?¨‰«g…©ŒD6Ÿ;»4æD:ÿ°‡®ß @Ád§Î¯®šCúˆž»|-3ƒ¿$™»¼©ê ¡«oŒ 0…Û†bò¤ÔÿwOFÔkZÞÙ#ƒÈÖn‡=TõµVÞÙ„ËHÍOΕŽ:5umñ„]Ó¹Güö馔4dt:öSŠÖøÝ̘%Ã=y»½±ݦÔ5mð„Æ,náÇ´ÇÐÕ·ÂôöD³k³WDñ cO¨-Uuíñ6àr-û9‹½„0ûB†µ¼ `2ƒQ›¹·lTô¢jÛâ„Ì–ínn`xP×Í¢¶ø}\déÜ›€ÿ\»&!_/ºµ­¾?Q."ëw³æ×‹ CƒcÓN:[sb±±‘Ò¸)eÁÛ;æ7Q×xÛ€<ê4ÑW\üØõî†ÐÀ]é–»î;›õ,¸êÇìúµ‹°GîOÑPÖŽ |Žþžî^ãMZÃæà‹­ Ø<äåîÀ㵇_%ªš±À%óNVà*`"TÖŽpWÔ§Í®5ŒãÛÁ hà>E"Ÿ7¹òуèPÖŽ0WÕ'æ÷$ £4õ(º±À|Šør÷UíІ´pEØ ÃZe®Áí¿HCZ8‘_‘®^äÀ€Ï©Z8È.ÉÜr×]ú²‡Ô†´p#€½#iËÝíã¦ÀêòÔHkGp¹æ4eîˆÔ×kÓE£Z8'ò+ÒÒ>ou¯?sORÉ­ `®iïe®¨"Ñô!­Á\Q”»ý&ýHºü ¾IuÏ+và8 ´{¨kGvåã\¥àò9£û(kG \ÝÓ8r×àŽJ2ñãog3Ò’k yÿz>†¢þÄxÛØ›Ò4βZšËÏЇìG½KL8æoéÙâ©×ûmìc¦§Ÿ›^“Údíó"ëòƒýÛ“Í/«ÛâÿÑÂÓýÞp§úõ{|_¢ˆÎ·+RfÍÝþ¥zkÛ7/B.¯+]üýæº{üKPkrò:ñ¾¼5ÐýéÀ©­< x ÛÍxýó¾¤5¹AŸo½ÿ¯?RÓ Ý9§í×Õû‡"kÏ#Óä ÞÞŽßÚ^†¼ð„ÿwã–2öðhFïÄùª„gÏpý×mkóKð{|aú¨ºü­/Ývþ§§?ø–d×ûmìëOº0väï@&¦¯iöµDÖåiü’^%vt×ÞoÐÔ5yZmÂ<þ£viÚöþª&¯(WÎZKo„¿”ÞÜ8Go+¨í„hÒu£B²é“}oŸÉ~:ëýéô…îϱtµÇŒ2í ¥Ð÷<…§ÎÏÅêN±üCëŸÆ+ïÃÞÌ~íâ00‰²ÙHâl³Èá³pfþô¡€8F‹âú7áNÉYuN|u˜tOÄ_:&C8añc™­âAÛC¸×ÔµØÓ‚¡-È …4æî+ª½Þt «Aé@ë§ý !Õ_J­u@pvW±A@+T €·T«~´<Èí4Ó½ªQéâ€$ U>T hÁ]44@Wµ¨­Aæ£Pµ›Ïºê(T[wãèzzÐå×ôÏbŽÙøß,—ñÏñ ï¬z—ÓÌä}3pè®ämó!‘ч¹­pd©s¶¹J¸½×áWâ®ñ =í”X_ØH Êc' É„Tj)¹®¡£¨8‰G¶©P)ßÍê„€÷¢–ˆDÜ0* ¼P:ÕPmkDµç¢Ž\Ö ìYÏw­+­9w |tì@PH(×’ óZD©PnfêWÞìæ• ª¡U@ÉׂiÍfAÅçJ =ˆ3ú„4à²V¶òéý޹ã«ãÔg`ô#ÞúßIôšŠë4¦‡ùç’ÓÅŸŠ:>EÔÝ ø‘Ñ¿‹—¿ˆ ¨lsPøYŒ3çe¼ ›‹&”.‰¯ ÔR‹àú7áþWñ+óî±ÃA€‚GD1¸çe̬Œ<¬Ð¹Ä¶œ)N­@õõPDÙ¢(hѨ+õ ^èàP2#´ùùò `C>dPÓ·µ#åÕüæó"‘Ђ5î@õÓè@ÜëÙ¢Só…P!RxiØ„:ù¨8íãÏJ Dê4×±뮈%ÃZ耪P'Nô 9¹¹^Õ¡“ẇ؋nøbôi»öºƒC $p>ùYvÏÆüéÑߊ'Ð_Œ¿‰³gä˜ûâË(mátÏ•ñÍ)-ºïŠn!G³ÿõ§¦³íÈu\eldÅCÕwÆâÃ+K"2Ë1yi¡Û÷á¬ò÷2áEDw‡W‚×jAÝæx uÖ¼»wr(܈K‡=Põ·„p@·ß:8¢‚{*éQç[ÚîïDš´Žµ@û2Bîì "T"€tîDHZíí@ƒ©UÜO44ó ^Pµ¯ý 2 ÑZùy  ÓøUË;zÖŠ“ r×aGL¬qÕòO‚gõ~µ_B°úwJ†¿­v‰å-®œP«ÅŸŠ:6Úu¡ó,¸ªÔ@þ%ƒIÁÇšñ T0@8 Tæ5@À<ÏÙÍFˆ€ÕDí@SO¥ä€yÐÓ‚E<è§ U4ò N ¤­’Tò@n ñ¥P"ãMÄóó »ÐÞö†£±©î!-K;±ÝðÅè²ONÚÒ…£Ä§u$"ˆíŸ½];ÑÀ‹´àƒ;Ô6بX^×Ïs3¼;[H…d•çƒZ=§€Z¶Ú¤Í³È½ÖPÍ–wÄ€Èâh¿@T¦Ý…W[3)¡ª#-õ¤.ŒÍ+#.;Y½ÀTö ¤AWc0þ4óW’Ûaï®b;e‚ $aãG5¤Ž*Ù¶h“¹Ó<òâí$¸p7BÇÊ@¥\Z Ñ[â“%³±eÄW‰YR£kÞÓóF½è$Döq@ë_"(¨å¡@ê#Jh‚;‡4šð¨A0í5ÕÏnº F‡»¹$Ô耪T¢ƒD "4@W¹Ö¨ Tî@üh((8wêTV¤S½TV´ª ™`]‰½hÕÆ @ýå⎯™í“óB=”—ÐzI¿èÌ4¥e—óÊÓÍŸ‰´4#¿@Ž&² ¨ÇÊ€©A{V HkåP¦‡U&‡(€Õ&¡ ô ¢Pùí@ª zö D”§™%@Uò (#D9kç@Á@ÁB‚4ßN!®§œ"Û¾ýÐÞ›´’xmžQ×?tÄÔw„S3‹ÉÅš¹ÈÁb쀸´ö®ŽFµÖï÷·hâÝPjÝW[f(ÄÖ%æÿÿ™dÜlf–S!sïmÌÇvìsšáV‚­—ÄK7[3AòŽ®}Ä%—³µs\×ÄÚHc þî…Àî.ü¢¥mZ\/ús5š·´ŽþX­fá!{½ÒJÒFá­Þ]©DMI‰˜q¼é¥¾3 œ˜•¬™®·â‘9›usšÊ擦´ZÔ·‚M—q_·²ê»Æä¢ŽQ¤ÇrÇ—>R# 8´Ž%f±]RhÒÂ0Ýôí†ç¾7>Þ*¹‡kƒšÑ_XX¿|µnço–NxßÎGô?ÙYhþY/{9>Vþªåo4­íÆœƒ›ú¨ˆŒ\Àîmüàö;c‡­¨Áe@Ûæ¸ψTùÚZx9¶è%·xïcǰ”PaΞµiHCœÖ²ÛÍ~” ÖÙ‡ñ»Š?æDOõŠòì¦ìƒôã¶6  >$8dIî13è¢"bß.)K¸NNŠ•ô9áf ¡šÝ´ãµ>Ò€9.¿$ž DÐ?„ɳx×vîˆ} <¶³ÂuÖ¬pÓÌP'C™Ð¶[pyÕ¯úÐ/3Q÷¶ôçî»ëE–Ÿu¶òwUÍúÑ]äZ@’Àžøäiº µ²H ’8A¯¡S¡ï@kÏÒ€!jE$¨ÕÐŽ |È ëN}È+eùeÛy˜$þ¡Fò÷ÇW˼9{O©WÒ}¤ãspÍÝÅÒÈï%]U^ üM}kÜÄÐ>ô ž´ ƒ’;¼êù@«ßæZ xù:Š,ŽV÷V×,/·•“08±ÏÁÀ9¼EG0ƒ¥éZPÿ uP PRÌß»Œ¸¼c…µldÐ8’*íAq™`÷ìcyçáN?¶Ö ÆfHÿ–Ð÷Ï5P?ˆÍnàc ñ"q§¥¨y‘i£±Òw–ɇ´ }]1ÒÓ´¾1êÜ€7¹}ŒlŸÒ’6ý%u–"­ÆÔö˜>\R¸öÿß7ORÆÊ“CbÖñ¯ß6ŸÕAK™â,Yÿ|8~Š¿6î°7°ºbtþ‹.m­²E!þLÔþ³PqnVù¹K+‹!®üC¸J±±¶µ ðkž~d ˆ#B),p#‘ö"Û¾ÇGÓÖÌqih)þ#‘Û?xïZ8 0@éæAÇЊɾÏãí/k&÷Î@s›n“cI¦é6ƒ´yQ-whAѽ€ bjÑÀ;‘E qD:ùŠ ŽËcÁ§Ä0žéÝÝʨšcÇþažcTÊã¹\Ççp¢ ®:´ø˜ôãï d±çO‰ˆÿM¿ZñÖTÒxÍ?–ß­¾>ÈŠüDdvïoÖ‚m¸ú2F¿ù®éDJµ@Ûü(‚`ëÃ_"¯bpAZ H|Ð é¯Ô…Pi^ôE‰ Zy í(+äEq×cþ¦Mó 7—¾:¾]¹ÝÞ…_F¯£ô÷b nÙ%±åWƒ;Vˆå…ªP(•¡ô ~D ž¨PduI•ØwFÉSKWS4ÑÌï •Õåîž<–Fs³âríÄÙÚÁ9‘D裈c&íÆ Ý†ÖUݨ-ÇÕv®ûKÈ‹]I`yØÓ«êWGŽó¥G ×V|&<Ü[Á+\%Ž=×=­ yÕ໨9 ãZÈ.à·62]D÷Ë—¶ÍqŒ˜ˆ¤nwuÓ½*6 ÏA,ñ1ÖÓÁõl73c\ñ®ÚxÊ£TryÌ»oN OÊÈíñÈâ] Vßïf„;g4…»ƒFóïÐnÛ¼èƒ3©Žaù%ñx‡±ž+w0A©Zž: @Š ¢îÖ¼ù”š¨ $æZéDnÚï6ÎBÆÿ:F‚G¡®Ýj[ä@‹}("Z‚#}?4ëæE·|2ú8Ýë])MõÖºï5GlümÐÑDpBNä™®3+l2QBÈÛ%É–[|Žê¼½õ1¶Fù8Òˆ(tõ—VÚc¥líáÆ6ÆË©¼RSâÌKx¥h²÷©ce%ÆG3£%®|Sµ¾&´c\4ÖŽ(!¾´°2Of-®d–( Þá$U˜ís›ù¼Â qõq‹&qóÀn k¯-Úâ×¾œ¼HGèR£bË5о…kr×ÈZjÓë´çN)ÅÔSMuoc ¡–þ¿·ÆF[´ œò5&•hæƒu7J¶fZÞøƒa7׬ A}içâƒh^ö Zª´NД0Àî10ùZ xãü6è„uµ£½ •­ús~3áÿ ˜Ñô æÜN8hØÏä´¸@(ÊqÇCý'}h&Ü]‡û²|¯yúPHã,©C•ñì(#òËz{®•¾IdúÐ!‹µü¯Ý Ë!úP#ŒµäeiíÉõ 6ÁÒéÿZÿ­+‹;+h%¹•Ò¹±4ÈíÒÈE+Úá3q6ž3œùŒaÏsÍO½ïR§²¨.×Òµ‚; Z tY¨+ÃUD šJêéäAS,vâïÄC%þiFòñÇX|ήí>¿­W­ô.—aÙ¥‰-àò«ÍŸ‰®)Dr½ò@rÁͧ`ÕA!P²êµmi8U¤PƒÀ¨#à[ïd‚& 61ûFæ´òiäï[]ÎÊMAØÈ€>_ulrdÔdÜ<&S΂bß.ÓQy»©Èƒ—§üL5ÿ)Ôþ²áf?´@{+†Ÿ¤‚F<Í=ÙmÏ•‚$gx[whÿ­æ¨7On:Fóír`Íò¸·#¾7iþÒ|6l´î»§µ±8û\‚_ ˜Ò—±WŸÜÿüÏ5SKØ»aõèä²Äݳ+%ýåÃ&‚Ø"dl, ‹ÜMIÔ”`yr@¶šv ƒšPs•£Á}xmw±ÝðÊèàßÝë]š·Þ¡þ‘GlümÀ 8¤4æT»´ ~Ôkk,ø`cc¤ðåkœÆŠšZAù®p%ä0²8ØÖ404~H¼;ÐQÎ>ò6 |÷rÈØ¢¶¢-úHìhA,^&ßnbŒ™%yñ..«åñsŠ £µ-ɰ7pÜÅ6óq,‘¹‘½áìyÜÒÒÐ}h.3- †°Ü3·t¡ÎVÈ\÷2¼ÜÇhAæqnö¦wÖ£ÛDÎqUÿŠ‹ô?œâ›Æò!^ð@|ç]ná×…^ЂG%ާüTCŸÛoÖ‚ËãM÷pŠè=öýh'O'ع‰Üô{~µ¨…͹ÔHÃäp?JÈ‘¹„}©<®lÑ?ì=®¯ }ˆ%T¯¥¯(3ºŠ7¿~Ö …Ä—p >¤m¾Ú·s@5hZÀÑA¯zPq@ÿ…P¬È\” Tª¢ ™R~Wy¶•ð_LJÙ5àå⎰ùæóØ[Üt«›òv5¤Ùe‘JûåiæÏÄØ§~¨ä+Þ€ÖœR¡*5Õ@hòÑdDÑhp·¼µ¸2|<­—ÂqŽ]†»\8´Óšƒ·G+»¨m-e¹™Û!…¥ò;5:,‰1áÀ8ppy«P'¡" ò+2+cr–™+Ssjâè·¾*¸Ñ8±Úð‚Öˆ8ÞÝGii=Ô„ác¤yq ¢ºžH3YŸŸhñq7ŒÜZÉæ-r ~ñ[´{ö—Œå4Û¼ÓÊ[¸%D¿xì*c¹sÏ$¯¬ xR­°½pæD4§˜·=PiaziÿSì©@ÆbñÚ³r[J‚ï ¤žÊ —Íîƒk&2é¾A½Ž@ÅÅ=ÜeÛ¼­`ö¹óL…*1sŸ+£Ú@ŽG)Ë&¼k,céA˜æÝ_E8o™‚¾€P#sÕû6VÑeò¹Þ¦€€´¾Î3+ ë-Ë&ŠII‡}ZZÚ:Ô¹A³ÅPÿ!QQk¢L>éõü×kÙ¢-»á‘ÑÏ.éëR[CW‚hyÕ³ñ·ÀiD ¨"PAÆ‹A×Ò²! ‚O ¬.íx´–hA¡v îkZ\ã´$š î­¥4Šf<Ž!®B ºXÛ«äkiÌCâí‰ÒvÏÞZñ6|L±é¥w‚Bhå0öj2è«¶7¼Ð {-Ý®Æ;Ì P#ooÊ~ˆú• bF¢6è„ ƒ­m_ö¡Ç½­>Д8Ìc¸ÚCÿvß©@ F(äáìþí§èAÎLJgGÖ†‘ä"ˆÀØ÷fh´§¹4£ûH ÞŸ²-Ó©Ûq.¾_yz{hÉ ;f”ÿieé¬<±:)a{ãsK×K)O«hÅ"‘0m `ã@Ñ@Hð¨@ îT"€@"Ì€(5AK2àÜEëÙÉ_Ñ(ÞV(êðþüÑè ½u{šhn”á¾SOûG*ógbj¦¨äePT(R¾EA]P„¹@¹qPfuçïxòG ’ƒBÆHí®p=´A›e›Š×0ì [QO{AÛ³~ñ-íq)Qv©ÃÍ4±‰\Ï ¬{KÚ[â6JÐÆß´îˆ8u ënp,’Ñ¢âÒñÑ1ïÜ[qãØBv=Rnº–ë-û™Ñ::Xö’ÀÚv;MR£®=.bÚv–³r\èíšdd’Š7:-6¸É(8tdwÃZû˜¤dW²Vˆ‹]â ]¸Ô»Ÿ=&¨2z­¤ôõïÝ­2ñ,iû(5˜ZZÑ¡D­æP"P¥ò 7 u@ t@¸ ô[Àꦴ¸î6_v(iýï½ô ت¨ w TãÛÚƒÀýž_æ;ØQ«7Ã#£ÁoNÚØîuü£Í½Æ6Î¥pP-ÈP-)ÚV†fJk™®bÆÚÈat2\Îßµ@ÓÝþSŽfGÒkgºâ&Êã4Ä9⦞! ¯r Œo Xüâ¾Ôv;i[h¿@ Ë1ºŸ…‹Oä 䨂w Hª’$Ä M¤džÑ_jòùÔ@|šÔšºIÜxë3þ‚€8{sÂk†ù&zp–DûÏüÎé¤×ÐPSÊblã·iˆÈÙ4,kÌ$Uã´ Ú¨æµ :´ÐÐó(©@yVd   yš=íyÃ'õJ:ebޝðÓvB;=gL×å,©’Jž#–œ³ñ|š¼QÈ )ʨÞTÒ¨$kÉÔc‚ PÜ€T$Ú×´µà9§BÓÀ…‘ ^'‰° )·p»{+Ø  ½¿Œ'13Æh—hÜePs6mŽF25²»t€4MkR<¨$È"lŽxhÜ]¸šs¥*‚^S(…‚_÷£w¦•@¢†CüÛ‘ÆG†€*çqqï('ËD2Ö²Þc§¶…Íl’4—×mj´ò àÔMnÑýÔ‘´óÔ “fÏñ6Öæœ„®×ý”ã3ûØàGòfiö€‚?›&£͵àf§è  Þh»îñí¶I€þ¨($'Οü¤-ò“ìj ó:VÒ#ÛI¿þ(ŒÉŽ6÷Jß©øûîxé?MŸZr9Ä l¾RöíAÍ8û¸ð?—0ž`PE×Aù8øˆÿ?_ê ágZ~ —vÿ o ©†6ïÝ#äÜNÀ Üíô u×µÚ뾜M)ÙÉ ’+Wq馚 …È­¼ š{Žö†¬ß ž =hjÐפUu÷Û5*8@ŠÔUBò ®û(Ýr.š÷G)hd›iG´€j ¬È‹1Xæ\Ü\‹vx×CmÃÈ®öð¡¯o5¸Ãã.[ e¥–䘘=ÖŠèEJ„N2ÍÓG0fÇÄÝŒ’Á¶µ¡  !Gt¦ ís]oXÜ)á—»`4¦æ¶´ïAº~(qæ BçÌÙ$Ï/5ÀÒ§•j> 8R4æƒwogc3™£~¥Æf;‹‰?jè4Eí¡¥'a‡¼AÙ &š:vy¯±VŤÞƒ\}›•±&ž&Î÷µÍ’ñÜÛ¾›%k-®_*^ÔîÝ*… W˜@VœP:‚;–C@ª€ª y{y.,$lrxs2’E'cã÷›^êPt²¸Vp\Óod§fà  vÕP î@器$ ÍLÁ)¼'‡‚úþŠ:ebޝ+÷?œ‡ž¦ÈùK)§Þ˧añ Ó–~/“T#: 9ö +TúÕ h²ªsò-¨5­}J T$­Ob‚ G_"Z   ¥8” T-P 7j •Pÿ¡Så@ͯo N½¥I@êO‡$¨hƒÍ>SËc¿ªQmß ŽŽioMÙ·±§¾žñ u<ÄQùUÝ(ìÁ¯0Óê"ü’7±÷·GÄicë'E-^†à†8cdM `&º4P-@éU@€@*M2 dZ€jxhVd*j€Ts¸[Ð róZW’:ebޝ5¶?Ì„vnô©ÝˆóMÊŸâKnyø¾M•AþùÉ­|ˆ@WÌ€!B€¦ŸBÈEh%J…‘Z «©ùrÏè@jС­HUNˆ¢¥@ªÔÿ¢@úPHyV@}JÀb ,‚¨{Ö‚]N¨4UªVƒò¬€ ç>°¼vµÞÅ¥·|2ºKL¯‘Ü (óU×?aH÷ u×’Þ€ªÌ‚¨Ðu¢¢aË"[‡j‚$ú E%™’J¨9 *(‚$¾ºRžµ¨ª…^ԣΠDé¡P::€ª«P©T!ÇÛT  )é@èy Dšv¬È Æœ|È”AQÕPÉ/Gº(镊:¼÷ÃÅùçý¤voô̇\wI+×y ÕiË:êÜÕ¯/b9x耯™@´@Ö@V‚@ôP2 ­€#΂.>¤MG‘/Z{‚<‡¢«´ E*¢‡ŠÈ;<«A‡*@ý !T­£±¯rŽåAÉ@êÈr¹·——¸ïaZ[7Ã/¤€=gCQ´ÓôŠ®¾ã_ÊŽ!Ü;Ðy›Î®®Jln*Æ\Õ±¥×†C#Œþi{´Ü¬[]ìL´p™ˆ2¶fâ&:'F÷E42}¦HÃG4©1E¶jÑXh‹»Ö†&G«1ö7SÛHÉ<¥Œ®7ÛSËšÔY]¬Íôl ¯¼*8ëÁE‰tJžõ˜óJÒ=ˆ9ºòå¿jÆP’ZáéB~?výdÇ\ÿè¦ÿcõ0˜~Îp9ÖŸa@ÆN3Æ)¿îœŒœDÿu0¦7 >e+áMOòÝõ G&Àt·Ç#<<è#óf×°xNAnÞqìv€éæ(Ÿ‡‰µº‡÷.@‘‚Z»åóJ8UÐí mÊʵ¸Û–Á¡­ÔP&f÷d`±}¤Ð¾à=ÍsÀ‘Š“¡: ÑZ–h¡ÒÊðÈÚ*绀:W½B€@¼¨¡_ãT?Wr’AA Šü<”¡;Jð­bÌ­›á“ÑÎÝÓ–nÂ{‰-Ý=ÆÇº-µÙ±ÎuwµßšF@¹ËÜ5¼H‘‘I¯”´ “mºŽ1îÞ[\›£>–8Rÿíòl‡ô¥?B :¡ãÞ¸³‹¹±Èý<îj ^¥Ð|m¯Ü;‡é „9ˆsY\Ë ÑÉ ’ÈcÌsH :¹ÃÞ%˶¿n‡h: òª95õý¤¿#’_HÂöÙ¶Zâ4,`{µ4ãTö7Íg ×&‘ÒBMK …¨œñÀž<ÌŒü–IöÖ¦KHÅÔâV „¸ŸxW‘ ÕÐêµ®"›©¡â äƒÏÇÔ÷c‰°¬ž9¶Ž¼—=ÀnmZÑ´·Z”¨²Ì¾Q׳@Üa{`dNyl¬Ü#wÐнÅOœÜ0ýæ.ñí kÿªâ€ùñ×ý>÷¸ø'_Z·=! v*øqÿctƒ=¾ö il®­ÍË‹"–f´¸4¾šx4 ÙÒÔ ]ü"µPDŸJ 9 h(çhp÷`ðÙOIj2qGV?ßëUÙ³€§ÊmÈ5ÜZk] ÉQÇ3B¨æ\»Ð$ CÅPÅ h ®ˆà€¡Y œÊ ‰ñR|eíÄ 6i` ·˜þKèA§g-PRÆa³qã _rë{ÊÆc‘Ó´xf§y']üµ(:A‰ÉÜg-ï¯Û~®k'‰Äƒ¸{šíºëªSà3~ ÔV×ml܉›m!s©ðç1²V­Ö£’H6@(´'UOSI·ú ¹ÒDÖ4óq‘´ '8Ô×δ#]0{ÖC¨($ÚqAœZ]ÔAÎÚ{§°ºM}ˆ(ZOÔ7Ö— @cÂÚF°î$–Höh+_ÞæoíÆ[#íÝÒ_v曞_ ÝÅ»BRÆ5­oÙh A¢B[Sä@y <¨Ôç@qòª9Ü—ü<´ã±Þ³+f(at#¤ñõâZâL«Þçò==Èà*†¥dJµP?᪠æÅ‡"/‹Žñ‚Ê›·U¼wÜ1¤Ks·ÅuxìAw€¿f2ÎÎÆXžm'8NkÀ%Á¾íiBPBߢñµ–Úä"šA;Ø _Ø$yoqJ ×]>ìm•í®Á× È1ÂI Ík˜iµŒhä4w Ý´2ÒÊÐÙ[Ø5€AW+½†Þê8_<–òÈcs‹ØYÄkT›”Í)‡“¼™¢õjƒ³r÷LÝcn"hâæm”zkêA#ÔXà*Dà‘/ê c©q þògEØdŽF{Z;«0 ÔÝiÛáÉONÔÅÝÚßeïîíælñ28aì €(^áQÞPk/ËqwåÔÇ4d?|ÐÚƒÝDv7›±±cm2!³CR ˜¤ ¡ÆBâ ©WÒóÜRîææH/[4—P²7—Ç ’Š~Ð÷uò”“㣴~Yñ±Ò_Í4²4’Ïx;g~ºhPB nroˆH¼™—"ê;s(Úæ‡¹Á±»o»ö‡Pt“À²ºÆGw;>gqtf–1ÌÊÇ3ÜšÍÙu+숹¾Š)Éf×:šFÐѯEí­å¥Ô~%¬Ìž?ÏÍxô´”Ár´ÕuÐñsøöE<äw±ƒþÑA«í@ ‹AëÁd"µ&´Y³…£uPHÙþ¢‹N™X£«#òʵvª÷G—™ÇwkÜ QËÜc–Ò9AT Dsâ¨)§Š5þ%A¨@ü ‚UÓUh‚'¸-ˆVBö u+@«Kk¸L71 "$®í Žð²(;f?ºšæÛïþÑp@†"ô}œ­Á-ˆŸ;¶j·”­VBÑö~ê-ÞsDä·/5—)vO-…‘CZüšðZêŸöU§—bÃ:Òí÷R_\]½ìðÚ'-!­®í( *:òì@Áì@yÐD P*P D ¢¡Êèm)<M?šT–¬ßX‡´=Žp­Ç÷¹Gwù%èÑæIjQ VCª‚•îkg0·žoÚ›CŸ!iÓvÖ‚hƒ½¥í½ÓK¡xpi£… \ai¡8^d. ½‚Ý–ÆfL×8È$cHÚu£jêSDëQÌw ƒË€4ãMz ë‹î_,:ÚîÓ,$‡Š>´s\8 ßdì±þ ºygÄ<ÇçUÀk´hE¹ì9—LÓ‰;¾¤šÄº„]²½æžÔÛ’±p«n"?ÓZñ¶Žá#S\‹ê™D ¸ÛÞ#.ÓÄG_1¦ˆ:ü­”£înʾ%=€" qq—eœ5´Úá3ê{j2î±m»ín%l’ÜÅlŽñZ÷{ÂŽþMPh>òÑs3æ ÎipµA6ÍÅiˆx#m;j´ûR4k·ˆãÙåAÐR¾Å‘ ÐqæDpA. o“b7ŸCJ¿¬Å ?ÃïÿÆWRc5ý2¤;{¯É/Cü4GœrZ€ê¨h¢ÀÎÌ>;[¬¬Q]ÅcIüª±®§¸ ¥Š}ùê;ߘÙ)‚/…Ž:ÑðÔ’ó»òšã´ Y‹‰þ}k³âmÄVï|bgm•íapævµ¤Ð Œ7=] <)ìc¸1º¯¹dqѬ£ö ƒ²Z]¼c"e¼•1ÉGÆ6‚ßp5ˆ-[|ì=à]Y°¹­;šÎàþz×OaËXÛY[¾giP#ÚYSý#DaŒ¥ E;(øqŸ´ÆŸ(¨:ÊņÞ#åc~¤äÅã\hm"#ùú•¢9¾Ã2?áb `/pØ9 žJxvÁŠƒkv™A™íšÊKøyÐhOr¯g™L´—â¹}¬•Å·ujE¡A™Óù Œ’›KòÙ$0¶æ)@Úíyhl€i»J ¯¿e’½¼¾-¶è yN¯H˜ÒÞÝ€»Èo™áx¦Fø@WÄÜ6Ó¶¨+<ã2ÖÔ8BÓºCYdq.{ˆ÷œu=È*XáË'¹–ýO,ïv׆’|2jíõP LéŒ4w­»Ž¤5Í0T˜ŽãZìuEEM<¨æ ܘ¤±‚Þ ˆœÂ$sÖT´ …¼ “i6'%eqy+|'Ku$ކ7ìh•­;(êýQ[PuR.ãkˆÐ>±“ú{Q›q¾ÌŒ>G‚{‡j ¼·½ˆo!rçSù°½ªÐH (€õ (³!(#ü@s +®ˆ3óäü¢â€“FÓôÂ:ebgoïÛC¥˜YҬ…£»E¦3ñKOÊŽg]ªÐw DDOrÐ*¨¬2Xç?cn"'…7Ž* [€òdF Ù<,–:íx¨Ü Oœƒ¦îH𢠖÷ížöêÔFàm ¤4£‹Ûºƒžˆ- G¹jLŽJÖÄBÙÃÝñðãc^I¸è+¥Èä2÷v“8v¶=  “o\tmŒÄžNcZ=$ ‘–ðƒ»Hä7ÆPDüSªF9#†÷0{@·dD‚˜öw¼HßVˆ ¯'Ì–{ ç¶1#\Ç8ÑÈh4*‚.#…P-V„‚È~TÌ ~D )üh**‚Žb6.î'h×Dñ_èÕ_ƒ¦TÒègt0§HbA¯ü;N¾R¤7î±ÏVé¢82@´D‡‘bAå4@Ð:ö |P5¨9(4×±PŠ¢j*;±@ލP0yóA: ‚Mmm;vÏ%ocÚ=h)?§02Wu„#ÈÐ=ˆ¨»¥ð$×áiÊòèQƒ¦0Öב]Á£–ÞHX …¸çÖŠ* D­@¡Õ@yÖB(@®š”µwP1×µœ?žÔtÊÅòW¬Ÿ›ìE]À·nżÄúÚ V˜ÍÅ+èÈÑxkÏD”¢Qª€©ìPt'Ÿõ œàK¾È’{(ƒÏ_¿Û;[l[YpÉgk¾¹š—ä´ž5Y3c h,®âšy­#‹Åt@8nÎÚÁ¸N%œ™Ûìâ»./lì2DÆ ÎsZ*íæó@™Ô8w=-Fx‘“Z¥hxTWTÏc’n?@C†ÇSPiJ º û¦µÙË ðds¼yHk~”D÷ U$ Ozï '± Û‰··ƒ®`»ßï²ÛÍ®ž`7:Æç†Ž$„‡Rcši/‹І¾'êÙ"€ñä‚C?Šá$®‰ôþîF9®'°5>D­nðø‚7G©(í9ùÐw¦¿BDC¢¨: T×TTȰüÁi"‘I§#î•~ eâ†oD’zG^"Ù•¯ñ)žçõmPñG5@P5¨‹2ÑT¡‚¨z‚&¨h  ‰"BÐ6¬ÈT(Ø|È$;Iž¤ bˆ  +Nh IÑJö a¹cö¤€vÑ®>ÒLÛä«nY»óL~ï©Õ@² ×Å…ý ±Íb @ÌYS¨–žmØâ=5!%®Qå­ø¶ÆÚÕÅ‘ê{½âPpº°ËÉ ·eÔnis gsKd\ û>éÐ Ðl²Y%cd–ž#ÀÕÛE|ˆ'¢±Ž-ÜÐí¦­¨­hA* *9 P0@ «“ÿ—]“'?dªÝ˜¡›Ñ­¥1 ~Í ï 7î$õmq" Zó൩YU¨ ³!Ô×DÚ  (  EI!$ b¨@Ü‚4@Q DTUÊF„sA0<ˆ*}ˆ"k®µZ Ÿ2¡î=ˆ§ÀíPIVDI­5íAÿ½Q_¥~{þY'`|_øG\­êÚöŸJ2íÒNÝÓxò}ÚD¡iÓÜ~Ijéõ*à:¨<Ð:„ ¨ Z 5ª²œÖ§$¨  ‰Ôª HJ 2h {k^uYö¸ `ª¨"O™I¥(8ó@T­¦ŸR JÈh¡Pëͯñ UA[$\1÷DqÉÇù…> YŠ:W÷E´t<økT‡OsŽz¶ÑÄ;Fˆ¯5¨ªª¡…¨¼Pñ@UÖ¨"J]{P0NÒ”AÕÊOj:vq@·vÆ•A!T q@%¨ïEDO A H(Gb%Ñç@܃7¨NÜc©ÄÉï#®N/“…[ÙëF]:CÿƱÕ×NžãòK\ãUÀyЭ@QP 8(D ƒÌè d¨ÐÂ뛌շGfn°rø9{kIn,µ¯¬´ÈµáÍ÷öíáÍ$|ó+ø±”Žÿ3“³—Oœ4§ Y‹²‘ZÛ^GGí%ÆVdÊ´Εª•oº×­ì/£ÅZ»æwö¹¼n*ý×/‚ä3bbº‘±xVþãe•ÅÄš–ší£hШ·Ñý}ÔÑÊ#ÍX6l}÷Rdððß‹ ù¢‘—w> b ¡ÐFÈ<=þ wò)ªƒÖgúŸ%i´ÀaqÑä²·6òÞÈ.n œ[BöF\é[Ë‹ÞùcC;j@Aãîã´Çcò’ãì›iwW7ŽÈ“‘c$™ÑGjËgµínÚî|‘ƒÀ)Q³wø¡“¶¸ÈÜv•f##ø°'‘ñ0M°ˆïcMÃwƒ#Hd9Ð @Ð*%Ü)ô ‰+PâQZ :¨j  „EP •P"hP/" ¹MÇxhïJð«-eâ…>Ž-=-‰-û? = :gãž­"8‘ÑAµÕìÔrT0 ©•ÅÚå,Ÿgrûˆâyδ¹¸³–­5šÚHeo}¯5™!ÇÆq”ΛܭÝí¯SÉŠ€\æ2’0[¡e”lØë’ò* ‘WpuA5ƒƒ³ýYå…îc ËŒu¯Yä!@Ù[/…mc~ï ¯•Í1Áµ”Р·oøÇÖ¬Å׸‰lrvоÈüí¤V—W“Á¬s]Ì_Ìo752FÆ}kT¨ôÝþ¢oâGV[g/ ¼ž,vñ›H¥·€¾þ»a–k’×{´qßïPpàµ/1ø¥ŸÁ\gî2ð[ÛGŽ®Åᤴ»Š{¸­´‚h²KPçÆÈ÷FÓ­HÖLŽmüHüB†FZOŒ…Ï»»ÇÛYän1÷Øëpëɰº9ä‘ït^ëšöºŽìµAÒûñ«m2W}5-Õ‡ï%¥ßƒ¶Æ^^¶òZÇr×ÇiÓ‡âí•ÒNZ=Ý}ê çŠüWê\¬qܶf/Û;•»½täBdžêZÖG©oì›…MGzº*1sŸ‰wuŠÉcÛ,v—Ö²`.í2"Âïd·Èe«ã6Ó\M(itz¸¼nasvƒªKw×Ýcmm˜Ë9¸çâznò,~NÜE8¸¹xl&æh$ñ‹! 7w˜òíº¹µAÅ{øwÓã5kad,¥Ê]c¼X-ï2[ÛÚÝ\[ºî[H’ÙÚß7V®ÝZ{ =çLeWg~n­ï Ã7«F¾8^Cˆ%¬¹ìá«\IiÑQóΡë;þœëN e¤n¹¹ÈÏ†ÇØ´Å5Ó!|¶÷sI/ÃÂ[$”e»½Æ¹»*à5P7þ#uüvqK{k·Œ½ÏÝâ²·{`l/ÿÉ[=¬r¶g‡K$Žc nãPƒ{֙뾰8Ü›íllç–Vc-iu¾òáñYsm‘/øIw\ak7µ¢¤ ÃëÌÝæ3­³E$¦6cºe­…“KºÏÍÜ Ncµk½áZ8 ®«j6þ)õE¥…‡Pä ±~÷%•Æ|´s ¶|¸_9“xΕÑãZYáó®ïÉJŠö_‰Ÿ‰wù.`é÷^››^Z˜ñ×Ö쵑ÓB×D÷Jóñ C3äi‡Ã.ðËvÀ‹Qïú396cë™ïmïæŽi ’[kk‹®e*É-nŸ$ÐÈÚûÍs»ù­@ÛT  ‚Ð »²ª…åY ~¥ÍåAÔòâ bŽU#®N/’¶ÓÚUaÛ¤zkiÆ÷öªéŸŽZÄ•\h+Ì *€Ó΀æ€Ñ@Õ @Tv +EB'Ÿ4 ½ÈÓ¡T ð–ß‚½Náz}²]›,I¹kWºV™$‘s› ÎÙGCµÁ›ëZ+¥Vh4òŸ†øëÛ›ûØo®¬ò7¹+\»n¢0»Áº³¶e£<6IšX裣šðíI¡RHëgøyˆ¶´´·7W3LÄÙöÌ÷Dû»‰%–@ý±µ¾ë‡Q­ðÕ>»éüµÖK—ÀÇrÜ­´SÚÉsgwojóo)cÌR ›{¶=Ž|`î=œZu(0pŸ‚0[ôËq7™«È>:ÎÚ ì~‡<¶Ú´¶Iá–f]º8n´5”*»cømu’Ì¿3‘¸nó6r‘ábøq…ðºgøFzx‘UÑø”;G*‚¡WÑ7rª¢š×ÔµW±×T£øÐ:…¹ÒžtGñ­@huA-È|è´0y¢{VCE¢ š’\hiF颓ª"®V¿,»L2 È÷N¡_ƒYx¡K¤ :_9 hé­t§™Ht÷ç«d„q ?À Z"ÐŽÔ)(uô!I:¡I½jôY‘+ú7§‹Ÿë:Ø\ߤðø’û׆ì_woÜ?ih~Ðvò¦ÝUoáïK7.ržÆŒ96Bn'øv^:'ÂùÛÿ9ñÊàïv†µ¥uAZÂÞŽŠÊãá]?4.·f6KÛ·ZÈu-á2슎h,,³òv¥ ´ú{£°x«»Û!q%þAÇ{ywuqw4­·2tï’›kð¯qµ´²½¿k!¾³¹‘÷ éäe½£Ëü+wºW:k£˜Aí:(4øaÒ-lNdwL»ŠineíÛ/$}ÃXɼ[–Ê&x‘‘1¥¥Ô­¥6ŠZö¿‡]ie=Œ8Öü%Æ=¸y¡|“H×X±ò½°ïw\Èw}­xè( ª :Að_G<7WRda‚ÞîêæöîyË-%3Ûí’I\æ¥vö¹”5J Ã^”uÛn¥Žæg—Á-ÌR^\¾™­ƒD3]Bdðç‘»ï=¦»[Zím$è¼ÄG‰¶ø›Xnf½ˆÙÝÜÛÊÙîd’YâÇ#^CßpóµÄ·^ (8á:&ÛŽö̘ì¬ñÌÆã¬ªçxaÓ>{‰^÷—9ï•Þ\u÷I$îAc+Ñ3”}ì·–®7æÝóÜÇ4±JÙ,÷|<‘=i‰ñï4tt=µANçð×§n¬…Äù)¢wˆ.wdï÷\2m¢Hç>7Þ1Á€m< &¡nÏ¡zv×3Z&\:{S#¬ ’êâ[kwLÒÉ»Þè¢.a-÷Z( •(;åz7¦ò·“^_Ùø×7 ³Šgø’³s1÷FòÔQhËôãÁÕ ‹z#¥Ùged,AµÇÞO’´‰ÒHæ¶êëÇ3<îqÞñ’û®«}í‚BÓðצ¬í¤µ¶“#³£ÛÀÜ•ðe¼m•“5¶Í}Èkâm6ðhÛöjÔØŸÆà¬]gkÃ$•óÏ,ÒÉ<ÒÍ!«ä’YKÞ÷óÃNj†žTdùÐ0V„ª‚$ ‹¸ AIª ;Щ ÏÏËÀáY¢ü@޹8¾Jõ=žµ\Õ:Vúæ.œÇFËfk`m$aŒä÷Õzs퉺v´þgyÿÛ.)M}誓r®‹xÚá&g ×ÜEˆºÖ1ý¤j2­òŽÄ3y8k€tnõ‘tìòŽÉÎ@?iÄ\S›ƒ£#Ú†¾Vö5 Ÿ“Üt÷£×ý¤4­ò·²/ÍdÀ;p×ò«ãõêFTy9~ñe*°W@÷Z.…¾vötnw&ïþ‹p9êæ =(ΞqØ;9’‡|žãq¯»¹ºQ |¡Øf®6’q—@ŽTiöM(ãóYÏ}Ç ŠÏÏÅJ8ÂmÉLIý‚ày›õ¢iG3”Ÿ•…Áó4}(iGtmýÖŸ°Ë¨ígÖ¡èŽ.Î\²cÊ®Ü4‘­inä…•Œ¨ã |êr q·`>ã}Tr.ŒyC•Ænñ‘“&êW~KhÁ髌¨ãMÏdˈvì 6šÅçü´kJ<£êéó«þt+¯öÑ4£Ê>®oê ƒxa/.1ý(i[åog'õ6E³ÆøƒÅàG´y÷"èÛLvöX9|˜ÿèóM’/ÖF4ìòŽÊÎÍõ ©fBÑÀ:xѸʳÎ;žuäò§ßĆ–_œv!ê@Ó^Ÿ–½‚xˆö¡¥—ç½EŸ§¿Ó·!òX ’ѳÎ;êLΔéû¾ÚoŠœiÚ†žqØÔ9€M0dñ>ü?¬‰£gœvI½C’:Ø>XéO.ä4­ò·²_¼W k„½á¥ö‘4lò´¢È’iƒ¼Ó‰>þÒ.•¾VöHõå0·ÇC®Öq¾Ò1åg©ïê)‚¿¡ãî³õ‘4mò´ÛÔ™÷nÁÞ´ mujutCFÏ+]?xo«O“^whÊZ.¼aÂû?xëp׃îžHe- šîଵnLV6§Jæï"é¼l+»—÷c|F†ÑÔoSÁFóò£×;c{Pçï¨ÃÞJÖŒ¯£uQÇJß+Rn~à×ý&ôSMXÞ_ÒCF< 3=væ‚qá£+ç´Ft­ãj.Î܇Pâo6žk±ÈºVùZžº4ÿH¼í ýd]+<­/Þ èIÄ^Šv1§ûHhÙåhýáž­®&ûi.ðÆšp"¨º1å3òÖŸ*½òøcëCF< ÇPIZ|®ö¾ñ¡£P~`*1W¤VšF>´4cÊýâ–¤œUõÐx\O¥ º;”ýCrÓ2óvá»îI÷9ÐDZÈ+{Ÿï'#Œ¿öè(ºtw¼À |³"iÃögkëDÐû­îæîª}uÃä¶Ô ÂÜóî­Q­ºÞî¬ê(ˆ'à/Á<[ðÒ}Hšu½Ë÷’/þß×ÿk'Ô«:u½Ð“ª iãò:þmœÆžREÐû­î_¼ðjEŽF½ös~­PÐû£ºC©aåaÙÿ 7ê¡¡÷Gpz–/ý@Óÿi/Ô¡¡÷[ÜãêH©°¿n•¡µ—êDÑŸ(îì3öÔáouí´›õPÒç |þ Ù/tåð³~ª\á&ç­ÉÛð×€öü,ôþª&”ñ„ŽnÞ•ø{¾4ÿ…ž¿ÔCJxÁ?5l?À»4쵟õÒž0‡Ï-èOÃÝŽ"†Özéý4§Œ"3pë[k°8¶–Ó’ØÑ )ãÜÜÿÃÝ-¬ÿ¨†”ñ„¾wm_î.û?ágýD4§Œœ[P‘ÖŸûi½^êSÆçOƒu§þÚzÿQjJxÀù½¹ÓÁ¹©¶˜ê©)§<`|Öß”WÿåæýENxÂ?8·ÿss¿ðÓþ¢sÆù¬¹§ÿ/7ê!§ÎÍ`"¾Å8ëo?ê!§ÎÊÀ(|+ƒä·ŸõÓž0£›Ê[;àc¸¨’7 ÛÌ+GƒMXŽ™VO«|nWù”îçÿ¸—õUsôÝÉÿÙjgoodies-forms-1.6.0/docs/images/quickstart-grid-specs.jpg0000644000175000017500000015724512003555436022361 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀuÿĶ!1AQ‘Ñaq¡"2BR’#3Sáb¢C±Árc$‚ÂÒð²%5s4DñƒÓTdEâ£t&6!1aAQ"2q‘rBR¡#±Ááb’Ñ‚¢3ÿÚ ?ý6ë³­¥HÚ¤ý±ªq4ã€ÅÓÝ;ŒZÅxNã ¸5¥[ŒZ [“[}Óa:ŽÈ± ¹phº¯tĤìô¥VtP8Í”·+fé½;ÈÔ@f.Ä«Ý1šëJ¥Ôa@cXEÅ{¦§ÈIº¯ ÔvˆÕpÚ…OúLf.ËÕVã jJ·PUÿòT«ªðh;Lj¸ /[áWºc4+Œ…Õ{¦ xU^é…6éºJ|6uN51ŸŒª¯tÆi{ ÷L(õ¾{¦ËÃãuV¨z§ÙfCòõU2}•{¦|.«Ý0¡žË¥ÓuV¸Nƒ˜<*÷Lb€óNiT¿¤Å¡1G²© Ó‚i^BæjÕ¨í燇ìð¨ÿÄÆ(dû ÷L(òebUî˜PM·X‘J‰š½S¬˜ÞqÈpt .«Ý1Š {ª÷L(T¾›d•{¦Lðí‰+æ鋔rŒðªÏºbP®8Óu^é…Ô¼ I*IõNÈÖ1È«NÉ„$L$ Ý&ØLã§b½ÓÂ3@‡Ç²­>Éá ¬rtΉD´Ö1Èj^ÕY÷LI<Êg)+Ý<"P…ð}U{§„(*©ÐY=Õi©Ú#XG!ØÀ ÷LJÒ¯tð‰@c¤zª÷OPMS©-¤IV-ÂuÆÃÀÈÝVdÆhLqì«®é… Œ=•twL("¥À Ü’¡'|'QáÞ`wUÑÝ1ŠÌ'ØQÿ‰†¢c§ZUî˜RÃ5CÃÌÓ›ªñ*}Óì˜ÔG ãÒZ±“ou^éŒÓœu@ð3î«Ý£uR¸,—IWø¶ø¸ð‰¨í=ÕK j v~¢÷jÛ’}ÃqR!:ºãS)Áë< ³\ŒgTSì¯q† ã}Åî0Ô!§@uãqg¼4$û"58ðŽ=…û¦3¨˜ãØ_ºa¨á¦â·jNèItÝQ¼á6$™h²50Œ=…n<"j8Óq}jxh¸»: MBiÜTŠÔt±¬ã‘£{ Üc:‰g[Œ5JwW¸Â‚©\ºÀ&ÓhZDk8ä;g­Æ3¨˜ÒõW¸Ä¡U<%+ª÷O±ˆ]3ÀS!% ðF.QõcýÕtØbj}2ð¯ÝWjRð,8.ªÔŸT싌r/ $wT{¢d$ìê„Àn8öU.£Pq„­J·jZïøÎ•L‰éáÇCâ@]Ve\#40—…^éá @ÆJ§Ôa¨US·™P’…©‘‘Ú:#XãÈv8öî™ÍQ6¥RÕaÊ‹c‰’R¯tð†¡5N‚„ØG}2šNÑÑÆCãÙ_º®šiº¯tð†¢“/ åý'„(&©Éá‰+æ$è1¼1 ÇI ÷OƼ —;×>£…±‡°¿tÄÕa÷gQOÝW‰Z³Œxo’ÐÂ÷Ìâæ˜ÃMÅî0Ôqì«Ý0Ô q? ·ºƒŽ=•n15>Êú,<"ИÃÙ^ãÂ& …ïÅžÉá A¡*ô¤ð‹¨8ãRU/é<"j06«Ý<"P®(Ÿ…Z6hX:=•uHÀL`G…^éáK¢Sº­Æ2o¸Â٠W]*©¦î(VLÁÑpÅ ôÔwGq{‰…()ë­Æ- ¬ð+t(ü½En0 ·%m›¦Âl–›#Q f9—ËV蔂3µµOúL(ùÑq[¡B«xã6pÕݽ;4ÌB1óé¯t5Ìm{ŒIø˜êúk·¢w SÇ̤Ü]‰:­Õ×€ÑReò—î˜Çãî©?M~é†ÁÇ?M{ŒM;…N9UŤ K®7¯ ¾9ŸËPôÎÑ_0D¤Ò§ý&G¸‚§V§¦@E׸Soëª-¬Îí—NØS¼Áúk÷LcN膤Ë_ºa§pMOö—î˜iÜ-—ûîœ5̨z¿tEœ;†š¡£ ~鉸ûŠù±ôÜ÷L?q<ÔÇÊ_¥&W¨E;÷1NÉSŠ6$õFçÿ6'ò—î˜Ïãå¯Ý0ü}ÄóR?-r?tÃñ÷ ¦¨º•Œ5™¸£bNعbj„‡ÃsÝ1?qXúk÷L?qTô¶¿tÃñ÷ §¨ºÐMÅ‘n„¦5–<‡y¹~RýÓü}ÁóS· ~鉸ûŠ*¤H͵ÊVwLXø];ä2qgºcȘۋ÷LcNày´ÎXk÷L_ÇÜ*¢ )—Å‚R}S²,a@·PÒqs vE¡dÔk‘û¦3§qsP%;‹Üa§pš§ïS¸.ªÑ옸ãÈg™Jâúî˜L懰½Æ&Ä:{‹Üa§pªš€¦H¸¿ÔuÃz†´ûu]15ͦ¾«¦'ãî"*§ [P?Òe ø]C÷’žâìZO„ê3‹†õ 5HP»4wL5Uarþ“ñ÷Í'Sk÷L?pš‡ÂƒfâÁ Ið›eÇáªÀp—î˜ÏãîšþÓ›Gv¸lL|5û¦/ãî°KÕ3¨`á¯Ä¯Tû&5qÕ¼~ÓüÅžÏG„Æ4îçDTÙòײWaøû‰æ“ô×gÝ0ü}ÀóIœðܘ.˜~>ây¡¤¶¿tÃñ÷̦c¸ä¿¤ÄÓ¸žkck÷L_ÇÜO2 2BýÓÇÜRµ·=Ó ;ˆª´ƒòÜ?ñ0ü}Äó@Û†¿tÃ^ày‘2Ckž¾é†¢Â¤Kå¯Ý0ÔR™xî˜jªIõî˜j˜M½ÕŽ´˜j j/ ½Ó BYó *éšoÈÆ%#@_t§DEí£¸­ÑhSÌ€…K«í‹@b[;ŠŸWÛ ª©CRuÀR†Â”µKBBI1b˜¥ýÔåJ÷2õe•¬ÕeõÕ¹Zµ-¤!¶iÍAR ›¸¹%&üÖ›–ÎÑ(Ê0g¼|½O‘ÖWeeǪi›b¤3YKUH•Ò»RÕ:ŸA}¶¯·ñ¬R& & 35ýäåj4Q©¤ÕTŒÁ¬¾¡•RÕ4ó­)並Î)J™£»ß¤™D¨jßÜ.R¤ó.TWa'.vžž´)§›z¹]2›³›‰u¬²@Îçî×"! ·óÒ¨¼ªo/SOQOPKaÜ5SºÚJ”Ú‚ ;ÃÃ8Í@{¹|žªó@Š·VñS­¡b𤲷©Ð¥¼ÃOáà¸ò…^i +=Û!P3þÙóÍo9rèÏÜ¥M5-J¤a zúEàS©m+7TžósDç#dJêTâ¼ÂUq^dºGLn¢ƒCÊ—ËWgÎÈ7‘í]U–ZÔskÿy‘þÁú~Y@ã”—òDk)ꨞo™9D²¨m¥”¡´¡R’‰Ó‡®¥ç †¥ì½tõAiÍÖí6]$¬]§­Ô‰"”°½2ÑÖ)]¬Sôջ퉬 ‰&M«¢ÈkU§ Vô}°Ö¦ÝV;Æáõl—G\jqŠ ÅTþZ¥ªÁÆ1P=þãòžI\ýeRëuT­"¦­¶©ª_Áa —žS ¸–ÚøjšÖBS+H…@«¿¹üŒÕUe2óFñ¨?ùÄ€µæ„8™¨žú]MË{äÉ36B yÞcýäÊ(iiŽPÛ×׿IË”Åe-k ¥VªºŠbÈ© ¾ân©ÌwA1f‡ÑyüüÃèŸ ÛÒ¶ìí”ôDÔ\¼~š÷EÔLRDðջ톣=3„{Š ¸£¢58À~.¼5uJ3¨àsfÌEëòü¾†¢‚•—Ì*3 רCHh^*ªJÛÂè$̦]0Ôy¬Ë÷–“/ä—3zÊi¹ˆdêÎF†ê*ÃM-ÆTû ]a]¼èF½¡ÑäßÜ|ζ¿/­m4ÕhÌÝ¡ iJ/\¡§®p“ Šƒèf¨Ê³Ì¿6£ó¹z•QMˆó©IÕ0ê{Ò=×R}51Œ¾Z÷CQÈæqåî^E*óª‘DšÇ 4¥iQ.:”)ˉ ½uC^l(q(¿s9yªgVµ^ó®ÑѱFÕMeCØM¡Õ+Ë2Áx¥ÐVT%5[!ÏÞN[k"M£íã]Tü Ý¡1ÓVï¶&{ûkÝ VyÓæ)þ…ªÕ÷cQŒSxô“Ôñ–­ßlJs„µî‰¤Ÿå¯t]DÅ7§q[¡¨`(L!GV‰ÿ8š@8Ú>·CH=ýµî† cw¾Zôl†°!2î+t*/Ø…n†&1>¢¶h0ÖÆ7q{¢ëãýÅíâÇX0ÖýÅn0ÖÖøU¸Â„.e^é‹AkQS¬¨¡@¦ö™{&†‡/»8Ä¡U:@ðÑiKÆ3ð*Þˆ´‚\Tü ì… ™‹NTR¸Â%ºÛˆIV‰© bͳßÚÜÒ»9c—êª`dy-F[™Ô2pßs*4wØ@@S‰w¤n’ž›#48¾_š¿psЧOFÂÊii|ˬҗ“™1V¤ß¨¦¦Uå7N£†”*çt)V‡«æ^HæWùš«˜rÔS¾±]•VÒѼêÙ. ªy XmÀ‚ELÐ@Tå#(PWîXçòêU9CJî}‘;”Ó0ã׈E]2ÞNáªâCÁRZdŽñ²- åÜÍ5ÿOΙ£t´®c©NåÌ:·°ØE éYºém°ãŠ[ªRû©2ô¢PÉÊß¶µÙ>vÃUYKÔTy…E}&r¼Ê´8”¼ëŽ·ÿ§ÝU>21nDդ݅eûy‘Wrç#dYuÇk2º&i_[©²¶ÐJ ‚FɤB‡x­~a&â¼'fÑÓ®Sa« ²W#rö‰êœŒf‡Ë9‡¹Ë™êëk*(²þ_¨9{”©E#Ë©MmQªb¥µÕ«œà Ó]Ot¯â/¨Ê̹ž¹ƒ™¿_Ìi¨2ÞþAv‘ª—j“æŽW>T²ÃBòÐì½$i… r?8Ñç\µOTÕʹg0Ì+buOÔµ\Õb“–ÔƒX›à¸tÕp¯¨â¨Ù†­ÃŒJ@Å3ùjÜ8Å qTL°Õg@ã‚áºn(ÎîÍq©ŽìE{pã¤|»7¦ç Ž}ç:\“-aÖó\›+¤UmkÎ2Û*&½7Ò„4î=ÐäÔ´Ö˜P¢i3&ù7=ÈúåNkA™en)n¡+F]OBÚ©Sw\l¸º[$¤((Ù Êoó3˜å™‚ršl¡ê<éŒÂµ¨UfNºÃ}U0×ÛOy.U‹©ÑvfsîŘRÅ_ÓVáÆ%]WÓWgPÓ/–­ßl(*™dEÅ­FÉmë‹””-]rbPó|íæÉOA”‚†òG*Û{=Jб¦bnŠvÒ‘"u(K“Pî^Î<×8ò‡:U»ÎTÙ#Uœå— E¿Xû¬.‘ÔÒ®”÷eüT)*J“"$©Â†»¹»)ÌÆwBÝ%}CÕF`Š'q„®ž£*c/ ¼vâÐëR¸AN¹ÙÊ9Ïöï$Í9•šË30Úë¼Ý}S¦˜©mJ¶¹ú¤•¥µX‡€3N˜Í-=)uRùjÝ Gæ,Š·3æ.UÌØ¸–2:ÚŠª´.ajCÔ© € ƒ¤™‘dõÙ >¬ÊóNLæSÍÊG\­«ÌÐÝ%I«KFš¹4‹ ŧ¦©-¼…ÐøJ$´™Î9?oy/˜ÆJšúÆ“NæcÔP†6â©®©ªB–Ú’J‡P› ¼ „FhuyS•ùß–U˜·GOCRªÌ®…õ.¾êÝ}iR‡KEJen6•_ ºOvbÕvaOÏéÍÔ¹v]Jë¹®E”ÒUVÔ<ë,2éóéRÚ@eÒúSˆIMäŸõ¦Œ~Ófò-^BËͺú3zl×/*qæëtˆ§BZ}Æ‚]iN/7;³NR‹–<ù f"§'®FSO“»G·šW7çê³e¬¾¦‘$¼ûi8—ª$ønì‰Cé…Ó© Ý _žSžÔåˤ¢ÉrüÚæœKéÌßS(me2BÊ/‡i½jT5NvX…ˆ™èðŸý¹çÚYι.]&lŽcÈ©òºœÒ½÷YqІ(UFµÝC/—[ZHRmÎq&¨rW3äYªsú%Rë9ÓµÍÒ<û´è[5YM>]"ðeÛŽ%Ö ¥p‚s²ÃXã9pö·yiËü¬Ö[™á.»Í×Õ<ªb¥5*Úçê’¥¥µX—€=Ý0¦^‚±Òi×Ü6‘¬#‘péN·D KÆô°Õº% ŠfEÅn… ú”¬š±!µZPZ寯i¹ùÃö×rÚŠZL¥,š<¼­çœqúŠÌ½ºdÓ€Ù§J2´‹æõš3Š»œ¹1®æ×óê\µ¼Þž¾Œ¾¢ü³+ÂU2ÞZJ—¬T­*LĦ™Ìˆ´;¼“ÊÕ\¿˜gÏ-¦Û¤ÌŸ¢r†šœ¸¼&érÚj2…¥&ÅÓªí§»)Ûd(zZ— J;Šô‘gLk+騎¨Í Ž}…n…ŒO¨­ßl)I©¨EæAJÔà(I&V™[œ¢ÏÅ#ÔWg”DZ”-}œaH˜Êœ°×ÙÆ°ÎûŠó4ç ZUÿ–5\7‡Û-ªŸ]‘šsŽ©Œ©üµÂ„ÆTþZ‡£í…]7¼ mœaBØÒ-[¡@Ui¸­Ð¡ÄŸ–­Ð ñ ùjѲ2˜jÝ û Ý _M]6B€›Þn… bŸa[¡BO°­Ð¡1O°wB€Z{ªÜa@âýÅn1)Kqd-®éõ¶{0¤08­7d(-Õ+ØWg@X •Oi—Õ,®\V´Î1)[‡¾á×-:ãQ¸ª>¡ìãQ11Ü=‘(LE{³Œ()kV3fá°*Ë#QÕÛ6•ÕÝãQŠújüâ¼Ó VYg³×Œxo¶Z ÊújìŒêçê˜ê—ËWþ=1uN(éBÿñ醽Ä/(+嫳ŒMA/+Fû8Ã^âb«é+wÛ î&*½…nûa¨˜¦-Z?ñ®‚Q¶â‡þ:ᨘ¦~üuÃP1•§ ]Rûa¨‰tÞ=ÅãÓ AÅTü ìã DÅ?M[¾Øj)>¢·}°Ô@äçÜVï¶$À7þéÝöġוˆÊpÔ'f¤˜Ý%ç%ò•Ù îa­ªg%¬v+CèijmÀº &"LS¿ÇÆ2òSK¾iÚ+ijYBJŒ€¶V닌på\ÒøË—É_g´ÉkueÖŽˆl닊î¶UÙX÷Ãù+솠—ÜÓ‚«:¡Bªqxíœ%I ÈY®Qh\¼ïÒ_]‘5p1ÜÓ‚»:¡¤{‚p’¾È“qBêƒáxJð‘+6ƵáMÆr_)]‘cÝ"¬©çÿPÍT¦ÔA}!JÀD#£Ë£©Œå‡Sôq†¯<8—ú–pál•*¢ì†™Çz½Ÿ+ìÂÜwmø*Ù«ŒoH÷xÓÌ.cà¬îã #ÜLg – û!¯p¦Ýp:â°•iH•–F¦àû¿E}‘cÝÌ9?’¾Î0Ò=Äó. ¯³Œ]#Ü-—œ pá(ÞTì•Ð"Î1îjú+쉤{ˆš§5°½ÃŒIÂ=Äó "E•ÏÑ ;…Ó¼à¾0VAZŒÄµž¸¹cáªy`ü¥öq‰÷"8—/'Åe5em,•Õ<âl®¾ˆ˜xëÕßÏ•×l]/2©|•î­;¸Já Y”gf³×(äsr–Üg1ÍÖY\ߨJŃFFØå‡™›êôüŒöÃöÆ_4àü•ôhã#ÇÝæO2ä§€»5YÆG¸];ËK)KP¶Í±rÞ¡¾ez0V7çNà‡×ô—ÙÆw¾²…|%öq†Åuia4£ -³Œ'÷  öq‰§q<Êõ²½ÃŒ4î1æí&¿,¨¥q¥¥.&EVY+vÃñÄúºøsÓ8ÈöœRBCK’R š”4‡.g«6fÈ­a,­µ„¥ÆÝœµ¶ ­½2ñÄÇWO’qŸé-aõý%R”kV$ª·”¦œ%‰ë²Q¬qå Ç^€ÊÏMœbkÜû’ù+ìãÒ=żÂô`¯pã ;…T¼TÔ°–;ɶÍDÖ8sÔ3̨‚pWfc:w̯è¯pã ;‰æWgÁ^ï¶w }⤠Ô$´™Ëac…z†c«é9»í‰By•}%p|Ê¥<Ìt0Ó¹Ë-U{!êfœ/-wšA*º-ôÆ£¾­F313!«rž û#sÕ"Ô/S+³ qiÝÌ/诳ŒIúÃ;ï¯Ì2p•ëYdôF£:·‡Û'Ї-ø+쉤{¹ }rù+ìã^àù‡ •öq†½Ä5 ½òW?GkÜPäÁYŸWºG¸>ev|Ìõq‰§p<ÊþŠ÷0Ó¸>adü•õYÆwv|ÐÓ¸˜ëúKìã ;‰æôW?GiÜP¹ü•èèã ;ƒæôWÙÆ&ÁÇ_Ò_d];ˆ*ô—º&Ä™Ÿ„½ÐÓ¸!ãoÃ^èj¥)N´J)¾u{2†°…®_,èÓdMaYkÙUM#ÔųuÄÈ›4L'˜oÖ¹_sBÔN²Í)Õé‹CŸQÄ^œ#ÙÆÀ[Š^+FáõˆlD)˜Ž}#ÑhãÖ1úJìã `­vü5 Üa¬ ©Nc Ü6lè‹À¾"õ6eÖ"kb,ú†C¤CXÉ|³¼D֊׎ÓdÆÑÖ)MÄ]¿ öFu„ž`Šl4. ´›ËS“vÑbî‹4ì”HÆ2ô?r–¸ÃXaϤg®­ISÊ(Y1=ÆëäÊãm/éªÎ”ñŒÔ8õý#ÙÆâ9©³ÙÆÀKkp:áÂ&wg£g\YÆàãŸM]œbk˜‹—Ë=œa¬ ˆä¾Q곌5€¦\X[Ç D•Û¢ËLYÆq?”®Î0¨8äþZ¿“*þš¿‘Jâää›Q‹:¶õƲÆqW/–®Î1`¦³1][.¸)Ã}Ö„¥nÊgé”1ˆuòã¬ÇèÛŠå¿ _‡Œj¡ÈšG–ÔD‹ê·»í˜¹c¬æ,<ëí²/ºÂ‚H»4¨‰€mØc1ŒJ儯<Šá· VOºÂ,]pÏá*z¼6–u>Î;ëÀlá¨÷E¶[g\nœ3ªœNn«ª¦¡¦u•8ÒS($KTˆ6ëŽ^Xˆ‡³àáeSþ.êVOåªÎ¡üãu ukQ¦XÃPlãÆ"Ã’ë’ùj˜wŒ*ÆXü¥vq‰¬ вe„®»8ÃX ©ZËV¡C¼ŸgÚ1¬1‹ ¬”¯ÃÆ3¬Š¿¦®Î1*Ä]Ÿ ]œaPRµ‰¡C¾›zãXÄ—ôÕ¼qŒëb/é«xã RâçkjìãX=aÅͨ^¨Ï2šÐ’¤.ÞðÚ\H zâFU½,G,}n ë—~R§ÿ1u‡.9©¥OÑÆÀ˜Î}%oOk;Î,ÕSͲ½!ÝÙ׌bšÃí–ŒW>’»8ÄÖ”Äsé+ðñ‰¬sé+³Œ5€C«*ž‡»Æ&°ˆ§ôÕÕÝã 1WaÂWgT Š¿¤®Î0¨W§„­ž¯kâ«é«³Œ5€1W?”¯ÃÆÀ˜®}%vq†°¡Š»ß)Z:8ÅÖ/é+³ŒM`ë“? ]œa¬ˆ¿¦®Î0֪߆®Î0Ö+ØTÿñÓ `%K^3i("wÌìöbÒ¹XÙß ‡7¯v,¨ªB;Í&br#Lg9á×Á†Ù×v„<²€KfБ¯Óˆ·<±®+P\=‘i qK.4pÍ—¬³dX€ÌG>™Þ#4 õûx…•®_,ï¨ +sÃ9*BËtFªŽKåâ3@â9gÃ=¡ Üúg²ekóÜ3¸l˜Û¨ ÌE€ löFk’}\ܘº̉A7«-ü£8GW§äoñûºw×+P{#Tó¼å;ï+žk«‰¡fi˜ÒV©åýïvqññþSÿg Ä^Œ3¼Gjx..^Ù„ Yõñ €–Væ+§ ÌÊbcdjbüG$>Þ#4€\\§†{!BoÃ= –\XSÄ6m\ô‚50Yü³½1š:¿¦eÖž0¡ ‹:Z= ªe,÷ øŠÖ6ÅÊq/–{"LçäÈzž™ä-³5T<±£Bœ$DÇo>W1ú:‹—Ê?‡ŒZq*‘K ‘p‘yFsLk8å\\S§5ÏÖ[25×FU´‹g<_vOoÌŸöðþDY?,öqޱÙhÄ\å†eÖ8Æi™@ë“#¶iã D+é‘·D(LEáÑÑÆ usùg²&*çòÉ÷x„/éŸÃÆõÌɳ¼B.,hlöB„Ä_°méaBb,ú‡xã :©Ÿ†{8¯FÞ8ÂÅW°{8Ä qì+³Œ(@µ{ ì… }^Áì…ºWŠÌÓ)_Ö=“vÜpÞ ®06·rZ¦®yÒ6ˆ™S¯ÇË_%µ¡N„¤a›Ö®¸ÔD9eÖV séžÈ´…¸·1[%Z© 6EŠ.;ôÎñ ã³ùgx…}ÙÚÝb+ZñÛ!½R´k”Xˆ wéâ%B¬á¼D˜„KÎòÎñ€»Ëó@\‘¸l˜Ú#|R›7$;¢3PMË!‚éCg⬸½"?Â$c ežÕØÌEËåâ-1.+Oÿ¶VT”…R²‹¶jRŽ˜Î¼ÛÕžqøb=¦Ý¬GgòŽñ¨yD¸ìþYêq… ˆì¾YÞ!PÓŽb¼pÌ̬˜Ù˜áN.=#&E¢3PˆzV´wŽ1*.;ô½"l)wž’ŽÛF™³·Ý–wˆT§6aâbº,ï¨ ¦uÐ&Í«Q63‹”Bœæœ"=#ŒJ"Ü1¬ª¤q×T¡Pò)ën§¢3Œ[·ŸÆb#ÙÒÆwé(zGº¸—J¥†¬A"ò‰´{G¦.T3ÑКWëJ ón⨠Xn„ÿ(Î8DMûºù|›DG´S^##áâ5¬8¦+¿I[Ç”Fã„€Ù"Ûf6õƳÇìG>™Þ8Ä C®ý5oÖVã—Wð΃lÄ(R™Ç0WE³:á1 n+ŸLïaBb¸4´®Î0¡ÎÏsfrìµÊŠ”("Ä Jd¬Èk‰qºø¼SœÔ6¶êð’CfRÇz¹Ìzz¹¹þsQ–Ó0ò Ä}¶–u,ÊÉÆsPïñ¼1ä™íŒºiuz}7ÃÍT]c‹òÊš ½[cXÇ!¡×Iùf[f"N"÷ÜÖÙÞ8ĨM[Ǻ„Ô­ÂØ¼ÙäëЋŒâ¹ô”z,ãÔWå(“Õ @ë¿I[Ç•5.¬†æÚ‡}'HãÆ±œúJÞ8Æ5Ϥ­ãŒ*ºçÒVñÆ-A>c–-ìó,Ì•4Š0ê,´¸OÝŒÆUÛ¶Hãï0ëÉœ‘>¥1xrœfÀ&Pwˆ´Ÿ c¨ØO¤D¥ÖIun¶;„xµ‘¨Ž dõ<°ÐwˆÎ¬ÔÏAÆ^¦ÉôŽ0¢/8M­‘ébê+“ùjè´q†¥"ª,Ã3Õhã R"V»ôÎñÆ%BÌw@âõ¶wˆQJ©õ$Úƒ£YÌŠÔ(›wäaPRØ«>¡Þ!ªêË[ uŽ0¤ê§à:µˆjºŽ#“ùgx…3]Áu7Ö‚‘0'1¤Ø!ªÆ3+VDÃdÅ*æfÚ»8ĤLU}3ÙÆ©O-ÀãG úçHöaHuû¢Mâ5P¢µ:´­‚AÕ1Æb¿ôñÆǹ2®3àŸ‚eÖž1tt-ÇÄA-+ÒM¶Eˆ|z‘ùÞ#Üg͸ÞOiâcTZ0¼!¬—/ á€d&5Ê5P%Uré©Ý}Æ®¶ÊJÖo ‰‡Ž2˜s9¨·?–¹ç™RkÚ¥ShRˆ ¼Ž˜éåðé4Ç+‡[ÿ¢wŽ1Êb/óP„gt‰Lh˜TR›Šü„š;Äfb êÅ—æ•*«œNú˜ð´$>Ø‘.¾oµÞ-·¢Cà‘ÖG³ŒC“œÆfœTІTji·f$BÊ¿˜‰9GGl¼S8™é3MøÏÊÆñÆ.‘îàçô`õŽ0Ò=ÄÆ|~A°{Iã #Ü-·Åt†ŒÉLj©Â+ªŒü¾AÞ#:Gº3ú 'xã cÜ gçòñ cÜ)— t†‰%sU¢Ã!˜€Ügþ‰ŸXŒéàŠléã #ÜLgÏä™õ§Œ5pše¼¿„LÖ£)±¼¢ìwþ‰Þ8Æ5ŠêC•Ëkyɶ¦ éÝWLc "ž“÷Gé®3æÌ¼qëï:”Î:–ä–Š¦¥[1¶.QT™ºjœ©C,®õ+˜.Î^)e½1Œu™˜¾ŽžO á3ëÑŒ÷ÑVñÆ5¬{¹È©÷¤~ ‘ÆGºJë©a 2HQbåŒ_Q|wçòIôŽ14qûÓù³a¤{‚·ž(PÁ"Â'11qFx2Ø .€ ÆÈLB™Žöœ>±Æ&‘î&3òµ•vq†‘î<ÿ<¡úŒ…i ­.6¢@}ð5õÆ<˜Eu{~“O%ö—q— ¶œ$LÙ²7O&tË™ÌL=WKNʦÝK+²FÀ±8Îx\=É\ϬL:¡×„äÊ¥=¢7PòÌ•Tãªa`´ ,¶clkbÐÀûòa]6Ž1#Ü\:ü¾IÞ!¤{ˆ{[*Þ˜iáU.º[i@^IÒ5(tƱÂ=Ã1Þ?®¹§ŒgH÷é|•oÒ=Äý Üa¤{…>ó„µ6”$°t6ôƱÂ=ÃqÞú*”ñŒéàã¼%[Ä4uLg~Š·ˆiäô·˜æcZþ}“Ò)458ȪJMÒ°*H¼ Àœãž¼½¿£Ç9s]?+å4ê¼ÕBÉâ¬ÿÕÇÅ«üÏ$úºŽ²§ÀrE©JWå£E Î5¤<ñœÄ³5”Ò4°´R, âÿTOÇ“çÊZ]uÑTÀÂ2’¤&6F㮬c?INåôÏ,­ÊE(“2o}±!cË”t*­ü¿%Ëjs ”j&\¨ªyk%-´ÒJÖ³i2JA0Ò=Ò|³%dÙ›Ý 3òêšvݵ ªAaÂ’ ºLäA².±î‘œ¶ VÒ{´Ê÷çÿT4uÞ}M)¼‚Ù¥%'H$q†‘îÌdÎ2ê[H¤PŸßÿú¢~<}Ý'ÍŸ¹í¶µÇÞø˜iîyg3ÕWéÚ¨\ߢ=k¦ÍðÒ=ÚÃÉ–=&Š9e¬½#¨ü ?{ºÉò”´0ÊùTÅ:´ƒüá¤{¸ÎS+:Tê ¦R’t¤”ñ‹¤{‘3 JÊéOø«î¸Sü #ÝÖ<ÙAŒå´­Êí"ìÖ¥Þþ*‰¤{“çÏÝ¥h l¶ªsqZSd¿Œ4w=ˆV\ÁŸÀrÝ2qCþ¨iíÇ–Mj™¶ŒÐÓéY?ÄÃH÷g,æz´\—ÊWd5v¨*¾Ù»íëû±[ÒÏÅ s9ª®¢›!«y¹¡m¤ «GxF3ˆˆz>.1—’•Î9™œ¦…§ŸmNT<šzd¸ãŠ$$tÇo‡n^o.qŒÌ5åÕUõm½WIåª&ãÂî—„Lñˆž¦3qf:·KÍM¿j]Ღb?­¯Ä"Tå½ÏÅ €JÜö?J€•)ÐûgÙ*VŽˆÔD;û“^å'&æ*ùeÔ’»ÞÚ€"Έô|h…@E;¿‡9­FÅ º#SVôç†}á¡bx¦L¾©—YpÒ –ÃŽL˾ovÆqÕÓË„ã<û6¥o<#gÞ£UER­ÐÕˆ$M^°öŒ2ˆW•ÔïšÎÍÃÞ®V±+#‡‹Û'·æý¸ År_,ïÖ1‡†”.¼AøfÞ‘Æ5ÀU3Ž¥”€Ù"Zf6õÂb1úgxãX:èü³×1ÆÀ.8èBŽÑ´q‹À¥;®à7ðÌ®‰Ãg\& 6û¿Lïbk Ç~™Þ8ÃXó‰Hâjh)$̉Y1…ÆjMCŽÜOÃÔ5q*%%kîkkF‹DZ‚8T­À~Y>‘Æ&°”]RÜòê›d+f6ˆÖ8Ňb¼$0ÎñÆ3¬tþQ÷‡k‡^·á‘ÿ!ÆÀM[Ža¤ßE³Ð;cXãÁ×eòŽñÆ3¬Vì¾YÞ!¬p–wŽ0Öj–çš“€‹GLk`:û¤Ÿ†Gü„fqbã¿LŸH†°#¿HïbT,0ÖÕ4šª48€[‡LNÄÒôEúm¿13è׈ìþYÞ!Q.qz(Ù÷†ˆT*-O™w ƒ0FèTšþî;–ÿ‘ÑžR®§)^cVšÊT6åHu¦T•²ÊVµ¢ôŠ…Ò%â²qj)cíy^^äÜÏ0æ$”ÖRòêhóǹr™ðý5;utf‰4JCi*K®´Ã‚ÄÛp]³5àÑruUO(g –j×Ìg–³ |Û+NMUNíMa§ A«¬RÜn±ôÔ )• ÊU·{¦ûÿ,åÍe9 _ED))Ùe7iÑ$„©}õ÷uµzbë é‡^½ò¼!¬ â;ô¼!¬ b=ô¼!¬*b=gÂ=&ðã a8íÿ–tmÖ.;?–wˆkb=ôŽñ aSâ>Q÷„5€Lü#¼q†°-}ϦwˆšÀ—ÜŸË;Ä5€qúgx†°*]Xü³2e D5këúgx†°ñYq®î‹úþì)µ,Ýí‹C›Í ºöGTÐnsJuìP1'—§âe¯’%áÙ̳·)ë9Áº4Ö;Nò©éiœT°éÛl«²>ޏñãþ¯™”ñ³©™sî`×+SæŒe˧ª­x3NÓ½é“ëY¨êŽ~?ŒçSѼ¼¹kp«üÿSBÝÌ(§\@]ch7CH_t(‹e¶Q¸øq”Ö2“æ¨ú›[çúWØÌÜb™gÈ2_AQ8‘¬ :Db~$ÄÄKQ牆l“3ÊÜš§0V\Rœ4JB¯{5Êo‹Ž3Ó8yn8¿Ÿó:œÜåNdëES)*ªº¹Ü²bÉZ k?‰„c{ù¦éâØçþiL³º¼Å”S)å4ÖXR’²€»ª° ‰m1êÿ‹ã­\,Ľîõzå\¼!6UÔ´S" û¤ãƒ’]|óCÞåéuªvËcºÚmØ#Åm5îïŒT<Ý_7ó+unµOËky„’x¾”Ë]Û§øÇ9h¤ó‡3Áÿ[X]ÒóÛý1fxVÎÄDÇ.¹- Û=€D³(*œ³× ädKPCªI)y±"™M&bÓ<˜Õ~ÉæŒÙCÿep—›§6vóìÈV<ï誔 *u hMâ?Œœ¦¹9\Ó›Ûw%Z¬ŸÏhDeaÌù¾“’®~°´`æ|âS:º¨n-óFm}âr…&1ÛÔ:#R9¯16¥BÍ8íÈgûFbþT»4üfàþÓ›…ru¨¥öÉ€S\Ù\•9,ã5’dâ6˜Ô†+œkDÇèÏ’,"ûzý1µsžcêd‘Òãb¿î9´åú»ÇdhÕi€C㚥+ T¢dë6[ýQ© <ë™™TÏZCq‰èµNo-ó6dÅ ‰FIP»õ-G±ÞS„‘iÕÂ8wù9m”Oge¾oÌLÁÈj{íH~(ÛΫ×\†Ü–©rR‹kiûÐÈeËóì‘un'#ª"¡âå‹hJ`k¢1ëäòmM§›ëBärJ»£XSGþ¨Ó’¿î•*$ ŽºÍ¸z} €SãP†RMXE¤(Üÿª.]CÎÊŒ’ªÃ`¼Ý½±ÿq¬$Ñ*†£%5ÿtà,®p¨¹#“UÈ‚ øfÉTXžnt2ܲŠÅ&@-³® çE¥$œ¢¶Ëd’L¶w¢žvq@’צfV¡?÷@ry»›TîL¶“—Õ°µ-°´€’/Z& ŒåÑéø“õÿIušç"–Ó{)­º¦މÆã£†\̱füöë-2ã9}Ržm*RÛ)Q”…ºcI¨tøøc”ÏèèŽl\¿öªÐ?¡ çœq™ƒX¯n¤ü%Á-)P1b˜Ï ±Ÿª&«Í©)PâY R€²' ‹,º &iOUÿË)mº bÒeâ˧©× (’@™$‹"M1,=ËK„ †f?¸ž0Ú£Áœô‹9ìâ„%o>Ûh_…JXõC„ÇÞSQŒ”Ζ< –jYZ€%`Â5k/‹åÇ®2ÐíjhºñKm +R€f!Çg)ª-¬âÅ|7Ù\ô]uùÆçÃ1éM>d\.bÒ»ÂRë…3RU¶ï˺¿éP?ÂN3_phlï) rd–íÛ1 …µŸË=¤%õ=ŽÈ’çoݲ6·¥b½¨U–VD”Ø éÆx…‹®:¼:ù5z±Úgs[[ê©ý=¾êÔ¥ªñmKö'ÓïùÄ\}ÔóG‹ÓÑé3Ž_¥Í2¡–¸Ùe„”Ê®© lÍ%'¢<þ/,á–Ð韎&)þXË]¢ý=Ö ˆyuk›«»h*^™ÇHóÌM§ãЦ¯ÐhØBhÒ4¶*_ZR@²9G–næV0ˆ†N[å„äL©¦TãÉЂâÁ NĈéåóoÕ0ñÄ7SåÌf5‹LWT”¡åޜ…‘Îs¸¦µ‹·þÝòÒkê*MSµÂàRìzJe£Lz?åeÇf'Ì˗Í·µ5<¸Î_—:✦y3Œåù$LI=SŽž•ܹçâㇹ£E[Tl4êo¸Ú•®÷ˆ"cÅ”ÄÌÓÑP}ç¥j?g…*nùnÛpÙ>˜¼R™}ÑêYýQšŠ"¾^S‰f¸Ýu’g÷¥Áéù=cøÃ¦]x‰„]IÞODj¡æp²Ç^<Ñ›"åˆj˜U`(Æ1æ^¿4µêî…»oÂuÇJyKtÜfÎô*›·~Xœö )œ\W{‚Ò™ÛÑh:nÎXc¢ØÏÞwéƒéàB^œð„ºÇpÉt)é"}ó;tX#SÀ¹lÛÇÏ|C¥±¼C€f²>Pß é‡qRe'¾©Ú6õF¦¾!”ÙˆÍB]OLšvî6л2t*3=¦59lg{F#ÑÂ-!4É8%'¼¢ ›z¢å4UmÖ*¡"œÃ¥•Ní²Ï¶3韎p«õ‹j¸uS§ðð‹Pæ±­„žŽïDÒ´ÂnÓ'Fžï¹DXyA³ütÙÒ"T¦¯:ÖþP NÒ[\©P›  '„ vÒnTèHÙ³ª,ÀaI:XM†ËG”F¢Âzìá†Þšª"‡ Jrbè™M¢.±-øóÖm­-É à$Ø-˜á ˆbùr9,z±šPËmU4êåw“lsÏz¾'–0™‰övU§ éÕ)å&±3§TØL„§á³¼"ã‡\ÿøtþ(ƒ?þ]&z|:""ÿþ=»”ª¦Ó†™°Ÿm³R‡D\`4%CE:G¤[¡ Oÿ·M¿Ó¡ Î~]#§» €Š¦-^a?0KÂm¶5ŒB™€Ú•3Hè 7ÿíP%¯»^ÿåÓ=Z8B’g£—™V¦›3ËhÓL™Õ¸¹ªË'GL6ˆšwñø¶Æröm]%B‰“3ÜFº"T1ùr®²sékåÓ6Ù>ÍÑü*œæzÌšKßLLY¤Šy¾nÈ)3v™ayV[]ZÕ÷(YÍKÔáÉ]RÊ$MˆQbÔS¥Þ/™r†i™æY%'.eÙƒ™6]”äOÖºëH¦uU.¢¶¦‘ÆÛr¥§’)4¦íÀqhïÍC°~Üçy–T9}4jKiÌ)9>Šªa*¼Ë¹]BŠEàn•) ´[}g’óÜË6_1y’‡Ó—çT¥7EÖZm¥‘Þ!KU¦Øµ ³Ó¤ºt·«ÚáEfSh¶ˆT-Ê ¸45/H‰PXß{éٮص¥¾ôð?GT-ÈüB$ZÙ1 „Ž<,¤uK„MI±7Õ¥©ƒ¨˜©RG‘¥Ä*òM{WQ=ò…C§äËÜû ¶[,' ‰Yv]R”Ma‘Cw,m”¤ ’Ê 3f^_±Ú!B¡nÌü>Ñ û¿OÓ1 €—Ë¥öMÎðY?»„D—å,1=vÅá\¾l¨¨k$qa%%.5h"v¸˜Ç’©éø‘:É]EÑðí–™ˆÜD<ùušÏý>Ñ „‚\5­’Ý¢vOM‘¨ ËõšôJ„€ ©Ñ„=á …¿Sô‡]áB_ÆA-‰È˽Õà\ª«éÑ8ÌÄz‚S­¯Ä!ÂúŸ§Ú!ÀX/ãÌ v@O¦/}ùZßhášOFjjUS´¤6ÔÂÜ[ª™¼³3¡Ó<¶h¼ôæ[Ñ÷µC†%ã+¹š»-Ï3w)2w³“åÈehMÔ\ã~[tÍD:åä¼#b©¿q³ê‚PÏ)Ö©r%(¾Ð% Êr&MÉçg)³”«'÷`ÙÍdþªúF¢ª†F˜’*ß5s62åËn‘{ü¦l²,ôS6s”¹iõ¨>Ì¥¾ ºy¯˜ gþ¶øÿóÙÿºŽiæ›Éå×ç+}‰Ï|ZæŽaIpÿ®>f²UñÙ³GÞ‹%šy«?•œ·RR4«žViõ¢T%¡æ¼þÿÍÔž§™ÿº¿í|ÄL“ËUt¼ÆÏê‚’Ï5s³þ´üŠÕùìi'®,†¯š¹Šì¿×*/ >ÌÿŒf:,q“—ʼ͟Œ©RɨHyÓˆhzæiïWDcŽÿ++Ê?GXóG0¤“þ¹P¡ªO1ÿttyˤæNcÁ¼9}Û·•)¼Ð²fzâ䌹>o̬«¹ ®bT8¯šÚt‘$ÚcÅ=?#=µí:*æNc Ÿúãã­öG^¸Ó·™9žï.¸e"~;6 ºa;<ÓŸ¡°‘Ëî­(LÉ3Æ,ÊZÉæ¾dRA³Pg`øÌútªй¯˜R“—*×ÿº Yç,ám¨~‚ô¤m.¶“c3€ÚGè/H#ŠÕº´^„Êç|òr¾ìμf†Ž‹Ñ,¥;gÀ¥'!rò´üf¥ü`Siû…œ1J¬\…Еw/—@$ËQ‹tß ¦šÑÎùÑH—ßœ¬øŸç sõ\s¾wgÿëµ#oÄoAôÄž–Ôcq~«ÿ¹çOý~¦Z}¹îœ9ˆ’ê9¿8q«§—êEª[cXÕ8Ö%®jæ9¹ ÁÔó{:â_%*9³š@ïdO@/ 8ˆ æþf@ò›dnºƒºØ£3üçÌE°•rû‰7º‰L(±*?îÜÓaºHØDå):óQUßõ¥è·Ê\s§3Ën¤?©YBï4ó3£þ¾±ßI}­6ýèÖ2SBùŸšR›9yJéµgiŒÙD#š¹²rVFm° DN˜ºy¯™oä*$ dò»á%]8ÙÏ1s¹ƒ"¨%]2ò›%n$…b&á §AµÆg»z0òë„ãîõÏgÙƒOÆQTàæ"áIüQg(ƒÇà¸æbÍkžT¿Ny°N•©±ü „e eâ¯Xj~¢­¶ŠÓL\) ¥I¼wƦ˜Æ"eå9¬»=]3ß+®½¦Š–Ê*iÛŠ)‘($Í&VjŒíVœzÂõ9-fmQ3[Éí<ÎZ›” ½JÁC2î6’$”÷GtY`ÙhsËÁ_Ýîè;Ë»Q•¹Fï.Ò5¶ÃJ£Àd$¢”J@”™/ÙÕ(×:«•y,¢ŸÉe<ºrêb«ÅšV™e²©Þ)n蜒ú"\:~ðìÒÔÕ8 4ÊGBÊAìœ^%Ï,bz¢¥´)^\®BwRA'ªÇ»8Ű':|™~TÖQöÄÚçãÏùcû¶1URêo e·Ð¾éÝ&ò½aš¯8]+·WHúļm ­;Äá4ÖˤŒçèp‚)*A;Z_›Csñæ=qýÛVúZ.©…H Ý«p‹1‹ŒasLiÏÒ³!JþÏ”¾6‡Yøó±ûµ³Tó ”°¡ý}ÓÛ¨—)Æ™ŸÏÒË¥µÒ¾H²ò[R“¼ÄÎ1îé‚gÖ?pg˜C‚bŽ u¶D[…Ÿ1ëîsùÈeœW)Ý œ¬I'p&“ ÌÕÂÔYº+'‚Ó‚^ÚTüÀEˆ†sñÎ=iªûÚÚê´E¨sUÕ8ji’õôˆSÖwÿ²(ås`yYà xÛ×?ÌNÁÎ8z¾ÿ²?GY%ùphÏì‹PóÏU|é@Þ8B¡ uNã7ÜïJÞŽ¨ÔMï`oû"T#ÃÐó0çüèó9k¾_!É•r°Èw¤Andjè…b=3Á—TfeÌÔ²åsBnS%Ä•€:?Œ+¬­ÓRu7’•M!C£M‘¨ˆîaæ¼»—雨ÌTR—•q´ _R”‰ª3XŠe¼ã‘f4®U3TÒZd„¿Š¬%6U ,,&S…b®²jŠÚÆIBš"wÒ S-3½¢%G ÏMZÕRÐý+¼Ò’n© I’­‘¿@·sºV`Z‘~•-Þ’’›·‘ÄI„«‚¹s˜Sžåƒ0¦aM6¥)P¼.™ÌMºy0Ö¡Ô%ùøUáÂ5rðå×?Ýs´%"úš¦]ÓrÕDIt˜¨tièÐAa²0A›ªJ€*; ”âV)pÐiPR‚©%V‚°£n¡1 ÅnL%!WÝU¥V“œ2¢ˆ!ç @‘ÄD¬°øbÌcKÁéqäªêP‚6>d¦†ƒæéR›g!£Ód*=JX%2é3ÐNÃè…AEÒÒ¼§3¼d$\„£SÑxlU,¼H Xð¦cVˆÍbÍ•qô¦F”XlMðzl–¸qèujŠ”RÂ@>V4ëÕ‚éüÂAøh$©V[âÕ.‹G¤Ô“ò€;ÿ•ÂôÉËÉrÌɺ<9$|WDäS„Û(Æ.¾|âgú7)ŒÀ‹ˆPR†¢f,Ó¢77Ò§4J$’‰t¨í:båÑx4«4!)Y´‘zF|c%”µÖTê‚‘2¹J JµUY"€¶ä äT{bÁDygjl¹yIºRåÙN{4ÂW…R»P¤¤ ÉN^zF˜•‰Âèo1(º›E½ëé¶]‡‰pªèªJH,µt$™*DȰ\-OOX@KL©%"@ º¥`¸h¹^&›Û>é3=Z JD»V» HRÝ‘"G6'0w'S~]%ÆÕy ‘2ŽŸ‹5Ÿô—]§ëÒ-e$1Þ?œ^á<̹<ÚýPbŽòn…Õ´•“9NÑöÇ?,Ô= Êrý]Ô:¤&Hl*GV™uGOGÒòãŒa¦J”Ô¢'âDk¨i¦xéB&F›À¹‹2˜D¿ª&¸–`¢xúÖj‘ùC\QŸ3`!”)-Æ™ˆÖ8âAC’R£?XÞD×SÃ]Ö§Ä15ÄO,VOu;gx q {/lÎíŽ&@鑨#Xã‹yJ@Gs¼5Þ²c²38ãb¯0CiHl­K6MÕ Ä&œÖ²ýäS„ÛjJ¯L˜qè³9\å™Ê»!¦}»¯½VØB@1a¨ñÍ[ÚQôÁÿ—Ù¦"zÊTËå§Þû"Í- ú™Ï {ßdDˆ‡ ™9§*È*(š8ZUbÜf•¦Ûu÷u-—.6Û(qjUÄêqMÅjŸÝ.JRhç™!.WbùZu¡ä>¥S¸–^B™SaÄ8ÚÖФ… $Hœ9Ô{2f_¼\¥K“æ¹3«¬9mù“L†jM[4âJ]+Î4}Ô”—*Jf 2‰ÂÌCµÉ™Ökòí.iZÓ(r¨¥,›HH2‘MBra@‰”ÈéCÛBžœŠ¿xp‹1 Q (½+Ó¨Eo?ôĺâð•ÉyùXØ÷¾È,Dt§§àtÁb¡b§µ o‰P•ê•DÄÌW³² Òµ}qºyÞ5Kçn`Д© %KÐ.Y-1™tË£³NÂY\±BSá36Lz5Ŧ› xYH%V•LõÙd(Y×RØ ¸æ‹£^ñaXPj”ã·š3 6èê‹=¶žu&^_º}`«OX”áHjª]ºnâM–“ü…6ú†”­‘()ª‡’·/_TÕ;Q©è‚j–…Ý T§2gfè•¥™…$õ“¨XV‒n¦ÀuŸ@Hüƒ—G®¢LÊ—iÑ "åÐ9YƒiõDΔϼ{"DDCUÍÆn𦝳t´Iê¶£lH2ÂqXW­F 6 ™êž¨Ó,ŒÕ?„TÜ’PDÚ/uC!ƒ$®­¹X“ªvJR´ÈõG,¯•qü%-÷T•¼ÃfË&BˆÞ#o<žÚŸZ,a)ËE1ahÖùt%¤6¤aR€×«» ?©!à¶•ÿP×¶B %œÑv”¥&V-»!@-‘lÞLÀ(¤dµí‹(ÓÕii(¸”‰ Zg£M΍LzÏI˜=Dt€UMB/!"ìçl‰ôFd"®±ÕR,–’¦åÞ‘Ù®.=Vj±Ç4¥ `&FÑ°Å‘ÈæŸ8ó !“Xʈ:ŒqòÅÃÙð²ŒrÊ?õv@ šd£2'Ó²QÖ:<^¥KÀ2¤ªïx‚ 2¶z£XÕ-Ô$„…&RÒo !Å‹*¡€JX¡§Ó¦twŠ»ÁBr`“USR¼Æ­……£h˜‹ŒEŒç/¢fJÂ&/a\†¡ºB®¬‘ ½¡P\£ 'Ë©GOzð½P —ë)o2CðX Ì‹dz"ã•,- à§Ó¤è×¢%EŒb¡+$!‹âv§½fùDÖéßwLøfNލG óÜìÅKÜÏËu]SaÕ%7}« ±+—XËý¹Žï|…¼gÝD­T8JÓØþÈT ^©Ÿ…;áÁûúêy»ê2ªWUSæ«ÁqÕ2ÕÓ•Õ$ßy-½sÅÝšmT…“œ_F£íbÈ?m9…¾d©Ï3W)PsZLݺæ)œZ‹æÒ)´²¥¶›émšI)d&j6&FÌÒ8ô´Yòy^»"{+¡o0FG[“Ñg‡4¯}+r¦˜Ó%i¤u E:$\ *»¡ ‘õÊ&ª˜¡§§ZRVËHmD(ÊiHVE¨SBž½áõ ^ûóð ð¨DZßÔ€}0¨®£é{ì…B€UDüÞ…@±S¶‚c¦½ì€záPçõ!3ë…@OÌ÷õÛ €o?0n ð¨A¾ÿ°=èTÿ°=èp SÖ÷ÿ²Þ{ÙþÈ•bšÚs! Û³·úe§‚´‹cQ¡QX)›Ä|¥(*J/LéQÕ¶35¸á9ÍG±À¿±;þÈpÌ ßöS¿ìŠ¥¸]ÅlÈ^ïJÞŽ¨±T.UQ­)÷¾Èœ"„q ¥ô<’£Ü‹4Ôϳž@ÍÐ+R¾å²3LÚÈË9ÚsUMè *P¢Å9w:!Ë⦄Kå«F¨Qe£*ç¾â•YJLÇvá–’‹=Öw&ç,5´©6^’ªÙD¤³—s¢ ª£PÔ fÉé…`¥çT“*š9jøg_T(!†9ÖOß¡™Yñ6½:õÆä? ª] åìª1Â*(ùÂsS´JV®â¥Û [Rsz”D‚n¨Ù µ)©9¨!a £ ­wæ•ÚI1r,ÁAÌÉl'ü"™ÍFê§Ûâ–&vqùg-æA—M §ÅvASŸÌ:öFqˆ§“•壮2þf|Jbv÷´lÄCÏeSÑs2[±H¡2 7§¤Åȶ|¯.æD%ü4ÑÝÆraiU¦vú#ÄC¿Ÿ+ý©ÑM75ȵBF /׆—š ™iê ÿð‹Yt´¼ÒLD»§¾˜Ikš^l&EjÔܰDà±üДüºIØ&à18,e͈iiã̪J^‰uE‚Å´sBÙDÙ¢"èÞ\ôYªYe¼ÄVT¥¼m±n bpX®ƒ˜€Y¥½=%ÅÊÏD8-ËÏæ ¸¾í5-Ò Ø(qFÅhÑ ˜‡Šsšìèýi˜£¥žq–M½BÈL¸Ìú2fŠÍèmu4ëJÝCiºâ‰¾£$é3˜§o3–s8ÿ‹Z¨¹ˆ™ :yWDzf˜SÏHf~“™ƒd*†šà#¿ŠHìXÅm¨RóT¤)i%¤üC£O³ K—gÆÕåôª X¬Saô& ²ÌQóaCÈÒ­ ÆX²…CÂR›ôt©HRn„º­3ꋌ%š[æ«€ Jm„b«„Jäµp9¨¡IM=RôC‚Ñí2E2ŶÏó¢Ùj6)ÐR\›Ê¶Ãd\`¶–ÕÍHTÿK¥˜×Ž˜‰\–Z‘ÍÎ:¥¾œmx:¤"QaÌéYPË)fv?iì‹Mc<¹ùž[Ìuy–NºšV-Tß±ûÓœ€Ô"¦=;=9ªæMÚT&mó½Èͺ×ÖgöÿËCæêv™¤t‡gÿL"aÎc*¯Cd²ÊtB ÊAôÊ50˜F3<Í<·2s8Ð¥ºŠL¦…!±j+ëü»D„ÔT–œœÌ€uê9¹§§ñøõã& oݦAA_™P.Ž»1¦r©Œ½„¿\æFêž"™•©,ND<´¥2 Îá1…}ßèÇÊ»•ù¿—Ù{¾r“'z’ëª8æÔ«©Âð«F”ý0\0Âzåþm•gÊÌX¦CjU 뤩gºúT¦ÌÒbÝRcé—ú#µùøpÜˤiÇHŸU‘-Ó"jÈœJvâ´0à¥]æ|ÒE¿Ñž$¤Ì‡²]F,QJ5ÍY¢[H3䉪ú4Bh¥—͹‚A?¤¸´‚âüHŒÜ¡æìÔx²WAÙˆßp8ü×ÌYvR¶”8€A¿ŠÙ€Ær‹‡§âùtÊûK¬žqÌ’ƒ’¿0±ÆÏó‹<ãÌˑ̜Õ[SOJ•e/´RÒ¦Tƒ9c>Nz=_(Æg¼SµþݙݘÉ*z¯"g¶7pòG5f!™9’T¥&D¨)@¸±0ž~x¦ðÊŸ»¢w4tN$å9â®` ¡ëtMhœ. YéXWteNLýô8\sMqJoeÝ+I A×ׯ`£œæ¬Õ´•¯$¨ ¤MN"ïñŒÜ ãŸ*,¥:Lå ´8\*çz’¢?I|ËI D6…¢Ÿç:…Êr·‰Ó¦R”k¡(ö¹»7p2:‚%í$tkŒÜX¯û¦dTr*€n‚VزÑ8·wÌîúH·YNˆp<î}ÎµÈæ|…Nå ´•8n¢›…I' sË*›zü^Rõms‹NL7—Ö^ØXpòãÝgàåþxÿòué3*ª”ÌS-±ýԔƯï6~9Æjf0¾R M†íàÚ®ž™Äœ±îïÅš½±ýÜÎ`¬Ïꃠȩó6Ü MU`ê©’SaII,Ô%RV 6ÏTn☟Æ=qxÌ»‘ùó•RÍM4y«õyRòªÆTûÌ·JMeE[>\ລ²ÒkÐI 7P±3XánNOÉ<×–Óå…¦~»'o—îÓ¨¼Ûo/'¤v–¡8¸*ºy³tè´›C´üy\_BäaË›Î\ÍiÙE^k™=˜†©Ö붇[iÜm¢¢0Í·cQ0å>)W­®sÃLÿ¨ð‹Ãú—UYQLÖ"Ù¼'+¨š¾ˆpÖNNiæ¤&ÅÒÔ%S•éôÆø÷záϾ?ºíó& îR¼U°¶±üDXË÷f~,Ǭ~íM×W>>)Aö7@ôZbðå>,c¬³½˜VÓU)+¢uëA¼’NÁ`'WHñ\q'³˜T¹ÿÓ8¡VF¯<¼UìЇj×áf_Ôe¥ÏZ’+³¨iËî²Tê&£3¢À!3Œ:xüsäËX¦6y«/pL¸#ļ™oðwËáyc¤6±›& ÉBÈØ£Â5¼óâœZRºÍm¦_ÕöEœqa`º¹Ÿ„=ï²ãî!UV’Ú}èšâ«s´-JΓ¤K£¦"Æ$ 'ÐOª4·[(XII”ÄΣ=‘mc*›3ã`ODÉáQ_—x&}Ëø@UeÜfæ;eiÙ‚俱;Ï‚]‰ÞxA%º¾cæh{ÉV+.Ê2wpÞºMCÂD¤Ìì´Åêüû,Ëó Zjê¦iê*AM;KQš‰#¢ÏLD8åâžåí7o[-²”(aÎy‚“&C.æ´ÃÊ(Ç Z›AcIè:Œ <ï#f4F—8ÌÃÌ¥·ë\q×”«¢à ™ôD¼ó,q…æ(¬atM·ß¨JÁ@’­™J¼o=ó»OÐ~ODíU-hmMW´B©ÝAWy :o$AŒÌpc“½È“•yS­ 7¨Ã,úJo$¨ÊéVƒÇ£·Ÿ-¦'³ÔÍéhOE§„iÁà2ªz—9¿˜ÊnÞK­Þšˆ²à–ˆ‘ÕèòLT=©H!½>-R‹N+ÀX˜@L§¤ÙÙ 5ŲQuA"bÓ5åbzw‘ŠêP@™ $‘`Ñž‚îÒ6·-m.+I 'f¹ÄײãˆB)$^2þ…G¢ÒØŽŸ†…¨êQ”û QTÞdâ¡-‚²LÕ>ÉF§¡MJ£| Í·ÙŒëŠ)äÊ';Ž)@ÝIQ”ÏD¡®"ŽP-2R@LüI&õ‚ƒ;4ï)‡¸&µÞ:Ê­O@•,\ øÃ†Ù™›#µV\––¥êò¢¥¥@,ÝQ"Ø‘^ùcY§Eº …%M¦@LMs· cPçj1FòiÂÒ™ªj´¯¤Ù2#YB9ùN_Xâ«.‹Õ šŒì”­åOȨ¯áÿÕ±]K7ƒsC£Â¬@F›e1yö…BkP¢]àU1z_ô‰Å‚ìÆ™xR6”ÀœïzÄ„k"ŒKu;è‰ÈM$îã5Š/Þ’@¸«2>™B±Ö\KJ»qSJÎÏDXˆ m8ÂA -XÒ%¢ÈH·”|.b$ÎÀèÝ6"PŸ¦¼±4‹†ÛfEí6ÈCXõ[.«)>YhH %VÙ1®ÐbÆ1èlr2Êä¤6„¤ œúti‰0LÙ™mc‰l:‡¢ Ò¤™ôĘtñçRÒPøM¤[3u$n‰N,¹ÏVZÅÕ­‹¡Hîf’Ѥ(œ®¥S% ©ÐIë+•¸e)¨CÊ)  ¨L¡GGT(Úò©OxM*"Eð`ÒbQKTP„¨„¶™›AžéF±.45*2.]nR$^¦Zã1Ô¸Us %-Ý;m™Óm–Å£hjn‰´¦ëŒ¶‘¡$ËE–JYЦ(q¤„Í»âêu[£§TX„9ÓR•% Ýô•]M€Jd™ê˜êRê§Q[iš½iìѦ.¸¡b¥c¸“x€£dçlJŬ\Ž`¦­d5D"ð¨-%)ÔHžÎˆÖ8ãexÓÙN¢ZéQá)‰çÑiÔY$§yá‚#Ü?ÉöQ¼ð‡ ÜÜß9˲—4¬¥ `¥Ë®Ô¼†QÝMõw—tX”’z#q1MãëÑæœÊZz¤f´ ¦«o™ôÔ´[u° ÝöÔ ”›ëJf5#1PØþár]œÖœÚŠ¡9Tf´ôÕ :û)lR¦Òf•¨‹©J¥3d8)«•9…þ`È©óaLÓ TÌ´„T7R’‘dñ¼‰…M*°‰A]`j/xS£Ú<"ð ¼Á¶êwžà„ÿ'MÔï<"pœ{§ùn¤ÿÈð‡N¦÷>ñᆸõ[ãëJgÖxDá+Ø ª,’Sï(oTOÂç„fùŸu;Ï©1ª­·’›A6ÿ(p±5ÒJL‚Z@€?df±]¥`j}„ûÇ„>”@§æ{‰÷T ÷²7À)àá¨dÈX¯jGD)D´oû#Bຫ¿ì‚Ç"1tÉ;þÈ“H·ÅÔóÂKÆÆnÄÎFV˜¸ôS>Äï<"pˆq¶'yáårŒ£™ò|αŠf)ʪêUUæêÐòK ^AHB‚®ÊÈÛ!LªP²À“²@[ÿa@|d ¥ [z'Ñé¢PZR ¥!)*"òº²vF§  äd¤9=ÓfÝOšY±)M²Î_Ή[ÉMŨƒ2@:'e²€”‹ªÅÝYÃ/çf©F§ ÐµÔ©% !*ØI ëÙf˜È]Ú£b ÙmÑn«ÂÊS탈”KIUëÛ¢, ôÎ]I¹rôÕÞšå5Ñ.‚ÈC…Т°lð¦CFÙ¦1\5çä%æré ²SŽÊsÓ|é¶&þLÞQú:Eå$wî ,[%]Õ¾71TêyL¦êR´ÌÍS$i6h‹—AL†ÊÒÚUû³UŠ:tçN“¯~¦ò®¥µ(‰¦ù>™Ùlj] ©PšlØ{×Ǧ9™B0Д¢Z/„ËîÎV+º”¥JØ Ñ¶d[SõêMÂÊD“4¨™Ìt@%ÄÕ¶Õì$8åÒ%|ÊrÙ!¢ì.¡m!%°‰p›liÙD ©„ h)핉錊yºôÈ­»~äÊG]V>aÌêÙÊÖâ ÒJEû  ´Zñ‰3Nþ o*ìèœÆ¸"úÑp ³±&53pã8õpù<¨S !¤,>ÒTê5›Då=:cŸ’xz¾&9åü]&ëjm8E3½êêgy#¤k« 1)§îƒ;Úf˜‘Ñlk£Yª«´­ ›m‘ ôÌ ê”K)Uóaѧ¨D q3•Ñ)ÌÌØ="ÔV:R‚d{ɼ£¶ÍQ¬EÓTù2 €†jž®¨ž ¶j– °„I=3³d@ļû~Æ$Ž ~µõàŒ+ªJça²ÉƱê¬ï.±Ç,ÚSà˜$³”ãÔZäÀ-«^™Ýµˆ ¡ÌE¤¤‰Ú’H´ì2‹Ô8œÀûs'.Ò¡)Puòá´ÙtX-Šk>›{aæˆÐé<"Ô8ÇQFÄK¬ð…BŒêv'yá ‚:ýÏ}Ú~ný¿ôõæjk3«Zh˜ÂS‹)Êêˆ))¤M?ì²Ù¾GÚáä_¶¹ýW5¹œfYK4Tµ”ùãô¼¦V_S˜TÒ~ê €yHe×[˜D^™·,¹_¶ÜÆï(Ueå©Ï(9o0ÉèÍKùgéÅÚš`Øn™Ma¼¤ºê´ ”ÖB¡HûvSJý&WILmœ&•6›PH½áÓ«ã“áFóÂÿ‘±Ïp£7ý”ïäákƒÍIü*6b¯_ü Ym+šsü*)•›à¼ä‡Wr55E¬†ù Lš*LÌÉçW©,à9˜*f’Œ‘ â¯þØŠÄE´4dÏF*¿ša³Ó'?SJI¡¥( QcÖþ˜ÖTZå®`AH ì8Êÿ¶2DªÝ>|ÛE¶òú[³·ã/Y™Ðˆ‘Me”ÏU 70ªÕPÒLËã(ÿF¡›R‘¾cC &Ž”‰›ª/¨NÓ¨"EžO4“ݤ£'E(z<"`¯q?íÍTjÚCÊþ€-¾i*²†'n:ÿ싳3KÌŠCr¢¥)%J}sìL'­–b™æ‚ E%Ðf9³¤w"QiÍe%*¢¦PÖEB‡ýಠ'2%¥)yu:Ôtª¤Ù!d»‘b‹9„óF ét§¸;Æ¥FÉA‹4Yè_5¤rÊN±P­>äd±Rù˜¦G*¥>Ðó2ù [̬s+ùiJòÖ ˆ3mò¢-ÙpDÊþ>zå}¼ÌR²ºu%mM¤{‘®)Ë)ç‡=Ë3ÇQKw&a MKjÄK÷ŒÁþ‘.¸çž.ÿËLûÌ:ªO3…I9Kj•JlÞˆy®•sý˜6TrÆÀ˜³Ì#Yij¯sRU!•µ3¤ù”Èþ…ž̲’²ÆtY*‘ÿd PždOé,©#Aó#ù¢•Vç1ý¯mIÓ=}ذZÓæE~ŒÊeh•Re³R"\Õ¤åLcü %ø Z'ýœŒ± uÿ’%ÚˆUIæe-¢¬©»ÁbìªÓi‘ÓÜ‹‰fÞæ‰2†l·ÿšþˆÏªÚ‹wšHºœ•“mŠóiþ!I`4(¼‘?5`Ê{;X— ;¥æg¹—#­s)n‘NL2ðvbZû©‘ŒëSoG(Ë n#õzÆs¼Ír Êj[éPD¿óEÞ ðcÝîé´åZÑ5 êJ§>ÉÆ¸yæ9s곬ͧ†ò§žJIÄ)l™Œå”CÓ‡ƒŽr¦_Ô«j+iœ{'q.4¦T²Ù)*Iv,‹ŽQ0×àÆ1û­ÛiÚµ‰–Â:©ÿ¼<¹cìçÔæ¹Ë5måK}C©q n6Æf]ü~&9Ïý?ò³yžv²B²µ m.¢“âÃü›RíiMâÒR© ¨ÿFê'‰û¿Ñ€Öó8YÿÓ˜R}R*lÑæ^ˆÃÃ_|ÿñÿÉÍUçªù”-'©ùÿÓbpñÿŸÿþZZs1Pï´„Ì«þ˜på1“è+ÌÒ•NÓn;©*YJwÝ0™†°Œo™¨b¼Æ •—4zRÿÆmÛOùÏíÿ––*s5‰J?Öü#WSŒ42u$³Â/sÔ9^„ÃHq@ŽíâŸå ¦°ŒfyšeýC=Nœ¹$eá>ÑuÓÇþ_èsU™’È ¢(YZOð‹Ã„{¶ü´$zOpæ“~gºç„8—õï›·;aÀZ…Axxg#¬è˜‹À¹Z®vÂáy¿¹¼ÂàB*¥êO¬Âà,ŠŸ2|7® ²”Ì^)L²fÄu[éN#ö"š†Yo ¦jV“¥J$Ä]<™\œ|倄tÚbý,<÷,·RŒÏ>T“yU€™ÏRqñÅL½ß.bq¿Æ?ë/A*½A¹zcµÃÀsµ-öÂà•V؉ž“ €¶…HqÙ\œÅán›¢,Òš|Þ ‰k´Æn?˔䎩˜·Jª^¤úÌ.ØÇø—nÌ,ÎÓ¦,йórœ‘¼Ä¸ü¹èn}g„K_ón‘Üdff;!pMæp»·|J´“·ª5•)‡ÍÊЂ=18¥¹ÊåšœÁü¸­jJÎ3©¼¢g ³!£Tc Šz>^ŽQìë‘W±f7póL*Ki)—zV¶Ã*%Fb–¾5T:¤Þ&r½f¨Î5ß"cÑÑÿ6~÷ž«‡&²FaÏDÀ¥8ª, ¤ ¦VZbÌņ˜}TLt˜ÍÀƒÍè’7ž¸tTᬠ m:%Õ(F¼Ö.„JCI:% ˜ ÿ/b:-<"pz‚7˜· Ea}4ÎÜ—x“ n‹µŒ\щUT¬·¤ÄšbáÎÏ+ëèéZZ.$¸ûmÏMŠTŽ‘Ë(‡§ãøã9žÐèÿ”g$£yቇšK©óX&ðMÙghc1a¿åëÞb\^‹¨ÞxD¸ü¿ež¼BªEAJ/}: Ó>¨Ö3“¬7Q#ÒxF~•IÕË™õý‘x½%)ßöD¸ ¨Ç›EWD–.Èë‘ècA²¬Ó$o<#7ˆæ{(—Yá €gU#b7ž¸,Ó1¯o™²š¤¥§’ë‹ÒBDãÄeO_‹ÅŠrõ‰‡tyÍàé$Æî%ä»ólÍæJD@(Ö Ùi…⾯-ÏÜÇ›du5U/–MMUU= u5WÍ3mô3ŒðIA)Eí„Ì„Äç⛵ÄÊ¿tss*î]®i¾aÏék<½2T¶4Ï–EJRjK,–C—¼ô¯J^+±žæ®[ýÜÎÕƒ[ž$&„Óf»N†’KŒç§,§J”Ò‚®ôµÃôŠ<ûÍçY–NÒeY•&uES"©*Sw¿–gd_¤tGœ½¡–™ž¼V£ØeYeˆÞxBñU›¼ð… óƒR7žú@>rõ½O}";±½æ|îÄo³Â'Òù›¼ð‡Òˆ<Üô#yá¥Dš‘3$ï9>¯l8 ¤a’’/+Lý£Îbþ0>¯ldô¶<¦‰ú:L„}jßYDĈ§o.{Möl"£îöÅáȪL|vì¦e9í1¬êÃ@¨Õs¶3ÂLJ“?RRÚg=и‡îÏ¹Û ¦ÇòíÊä®è¶LXlßû°à;nKm±.{ s»+¦zvE‰VTýÆÀ ‘H‘·D¡3 Ɠۄ÷wž¸WËã–k¦R¤¥$‚­i#9ÏW‹òðÎ0B»b@רF¢xyrëÕÆæ´>å-{¿üÓFBfr3Œy#‡·à}Ùlʈwž¸âE*ƒØõÙLk;GDo ‹ ÿ'îtÚxFxc]Ýç„8ãÈøwžàgªS×Qzï2"zgÕƃÆ<¦nÏÓàCæ,DºÏ– ó´'yáÂ*q¯³0Ÿ‚gLDkÿ"Z.³Â1ÀÌKÕŸYáITlFóÂ$žÏ5›²ú¹×$Y„´ù²ðž1Î~÷ÐðÏûÿ(ÿ»ÒÊ«îkÛx|üDù³ìKÓéP"¤ÊxvhÓr³Ú<ʲÊZqF·mI­iOÓ(›ÁÆ‚T f4Ƹ¦ñû%ã¨ÿió<ª¾“>É«¨)¹§jWT¿$´Ð-š¶Yd°Õ+O!M!¤Ò4Qñ ˜3ñË Èý”­RéÏåR©«”¥8ÕY¿êét·Š®êï f W˱ŸåÙÖqf¹…5evršT­ªjuӴȤK‰HM÷_R¦ÒOØé'Q{ÕÑÓ€È#ÔŸ¦ *¹Ûÿ&÷©1ªØp'ù€o‡1÷;bp!5Ҏؼ<վ؜ þDσ¶/N§îvð‰À·ùÛÂþGÝí‡1÷w˜p!5¼ð‡ M@s¹‘<74OîÄ„ô‡†[$cV9¼ÊíK4 -µÜW˜fÔéµz#žyDCÙðð‰Êoürÿ£©7g F½F7ÅcDÓ§¦3@üs­°ã]>ØR…áø•=ñ¼ú©§îËÓà©Ò&• LB¨N<½^ØÓpEÒzg¶7ŸQ—$­«ª§yN•¶û‹,’UfŽˆåŒÛ¿ÈñÆ2èôô§¶4ó§Æ‘ÞØ¢”áÒÂ$S)tÃ.¢ã^¯lJOŸg¶°T;²ºg§dX€YÅÂD®Êè”ç²$‹ñîÏÓ>?Ý킹|É@îa’ÕѨ¥)y&Ó¬Dœm×Þ™[]3/°ÃL¦íÖÒ”:„£QÆy\ÙUô.Ö6ÒTR n!Í~©œL¡¯’pš†±vBèß r*§0gvSÓ´F±ŽC{Ow¶3BÃ^¬(Ec}Ùl¶-Pw¹2›V‘+vƱ€ðjd<õÄàOòg9£ªØ•ßsîö‚*±o3;¾0A·LŒk6óûQè&2 CÚ{³×¦ /mOl(qóu¸œÆ‰¶0Æbàp0ë‰R„„ÌÌ4Ê$ϳ¿Š#Yœ®»*Ûê~§/#î´èÿ®1Y59x=³ýÛižÊu/S™ém@ö¬Æ¡Ë,°þÕ+šæ,'iPŸî¡döe~x²ñÇß_f%5;m»ÏQR©Û‚V‰úЈšå×o“ÆN•*s±eK”êÛJÇñ1içÊpþÖ¿µ±Xsª?ÙCž\Ò`p9{FÑ›ôuÆ|uõ]¨“Í%VŠ!Ò1brÔþ/KhkõÏÎòû·ÿœX–&0k¤ ͱ§:åÌ,ó"Z™U*’¥LIËP²3/FÞ:æ×Aæ`fà¤=Äô˜C7âô¶ÆQ"n¥¤ô$©_ÈEsÊ18 ©Ÿ¦/ *¿5tݹ~VNrœ8X†þË>à¤6k.iŒÌºÄx½lÆŽ|OÅÀ}Ò³=ð´™ñwmO™—zäú'ÌšŸÕ¼ºYPõƒ…Cø7ŒcëjÒ;šªÊ–lmJÊ¿”aé2ÒqåêÏÓ †ÝKÆ¥©”̶à©é‹Â€øÔîùjèS„-zLÔD*!¬óœªý@xëLúŒ.$öÔî0¸‡ö§q‡Mc_rE3˜`û#¦,ÐiY=±.¢VKlŒ8üe;Œ8§Å%ÉüÅjG›¬k…à œŒÏ¨y‹õ\³—êªÍE+µ¥§ÕãPoÕ:4®'‹<5œ£î3ŒºKé)E@HIè1òî.^¸è´ª'+È—Q‡ ó°çõæ 9cÔL0ÝÅen¬‰Ÿî¤EË Ë?Ý;Á%ì½CÚòêÿýØÄÑu,ܾçî ò¶NºÁ*ûK*±dC‚Ì;yⲩuGÿqf&æ_§N Ÿ÷Æœ%‡,Ìyò¹Ê¬%åà°î ÉmÓ2v*È‘•»ù|:Ä_«¦?û€'ßËÔuŽú âSßýÈ+øneÉOÿ Þ0_¹K™qé¸è·ªpcÿ¸WÝ›™|É÷Ë®51ÀjUû€%xÐ*{èÿñˆ+‰û†hËÊu÷]ã–ïîIºš]×Gó€ÍN÷î?ĺÖ[j•zx¢Ø³Ð4=û’‹Ylå£ãNq8?¹§ÅO–¤ ˜Äÿœ yÜY|Œ¸žŒalX‘š¯ÜP‰"—/ ©FôÞÛl\¤55_¸úé('²oöFn}iL¹?¸´heºzÔB±¬*3×רuóg¶S-^g÷L(Ù,Q&ʦ{÷ IŒ»Û³.ƒ§®,ÌÍO>]^ >\@Y…;âÖ=$S^Kõö³ÿîÞõ=3Ðïñ„30 ªýà ?ãP}§tEŠE)ë?pÒÒeE@¤K¹ßtL&ƒüïî ¦ª )ñ$õY€Eg?þŠ…=Ü6z!ÀKõŸ¸A…•RPA˜ÉÊAmf¸·‚tÞrÑ ˜S¿PýÄŸþÛE.—žéDàO?û„ ´4DlÙöˆp9|Õ™sÛYKª§§i&kh¬¬w‡†{c9MC¿ÆÇléÒb»Bò «fV³i·Y1«áË)åƒ<ÿt¯£m§2ö×›X¸¥NhP6ÏTLâáÛãy4˵:kÌ9Ø (©‰²É¹.¹Æ®u*3.q-w²ú}"À¥vEÆ`™sØ6eô×¦× ‰pssƒO?ÿ2P¸õNtLÏéÌ«T\̽¸êsŽr)DòÆG}27—m¶jc03nu—þÛO·Ä±ü£7͹Ø,²˜ì7Ö?”.Xç?ý.™DèÅå „%ìÛË_Ë©“%÷{ë6Èô¸ÐÖÎkÍÃÿ eg_ycWQ‰p«~³Ís·-d¨­\!pë\ÔOþÒ™ L.™gŽWS)ì±)!E!Àç†i$Ù®,Rã3Tï”Ö‘b:Á‹pÌ MqõÛé°Âñ»[gy½Æ%âCÅsç.ç¹§0òE&bŒ°eµ•/»\Œ,Dh^a!¨K­¬©n„‘vr$‰bÍSQö•þÜe-b³ŠŠ×**<µsUj›¹P3š~¥×ÀB é’”„ÝBSeÝœ2ÍCûrµdü´yš¶³—œ¢'F\M)4̼ÖN2YÆS6©#FCÄ´§¦ª§§j AC(JU9É"Brê…À¸MmëVÙ=GŒ^®Ö{HÜaô‰r®S¼‹: N¹W/7\"ÖOJ7\SY;T‰u}*—k=¤n0àšÏiÐax€dȼÆ@„UëR7œv¯ÚGM† *©éGl8UdiGl8а,(í‹p(ò’Ux^ P[eÓÑÑv‹å6¨nûap¤×W"‰´-õ€•­-‚Mª2ã9MCxx÷žËrf2ãPªiTêŸxªd•«Ó³òlåŒDpÏžrµqNÛ5l4¢´8×u@ªÅJG^¸×Ï8r™xâ^QY==/î]HÉKtôôE ³)‚ ïN=“圼3/>µ=VICWLŠZŠvœ¦DŠR;¢[->Y‰zghf2Èa”¶Û)Ka2H%8“”ÌÚÔ9õ³@í]-XB[zŽðg ]U¤iÑ#Í5LOŽi¨Z¦t" ´ ˆBei#¦1>M¢ÛŒ(ç)BÜmÅ¥µ-²KJRfS¨ÊÛ#;O¡1džö“ÓgÛ Q“³œÆŸl,+ây’&'pNÍS=1fb…Ô—¦;ɘÑgÛÑ&jز:j†2ÆZ7Q+ÓLŽ’¢vÆ1˜z>NWœË¡'¤&¤îá@YRÒ@Iº¢6Æq›‡O7I¦ÿí'qãáȺ`ö @RBLä$võÅʇ;!b¡ºj¥ ù§M ë=qËÇôü¼¢j¿ÅÕ“äx“-v1»‡˜$öÔèØxʼnZ`ö$´+&>ØLÀm×åâNï¶%À€<=dî2=1¨ ÐJæ›uK§®3ÀgùÒw0àUeôúÉÒ¤xÃ…‡9Ì^¦Í(”£y¤%Ç”$©Gº@’A¶19=^/ØK¨Í`¨c§RQëM$K¬N56^9‰*WPNÉ?ðPþ$E¸'Ç0­^cå\KN(•‘0eÅÙ¢Û³ŒÎPÖ-¹xÏÜÌŠ›=É*_MWW_MESuìÝ‚C,)qM•[TÐV‹-Ѹ¢q¬_8çfÍóïÛŽkC9¥eM”äTI§ S -ʤVe­ÔâW<êpcaŒ%#¾…iÑ™f1¸z¾OæÉž}ªËx5E™çyË•m¸ÜŠ•OIF¦íU©•å±)8ÓÖò'2çY¿(Rfu ÖÕ>º¤•´„¥%-U:Ò-(ð BápÂ&yšwZ¬ÎÜXm:ÊÖw$ªé–G­º $L© ëÝ—ñËþŽÁK³ñ Ѹèñ­'-ï ÑF²ºg3F+–„š¶¤6î°“)ˆÜy+„Œ[n9í Ñ‹)wEá1¦ÃÆ¡uÒ¯ÜxŰ¥‡1ÓÞºegO\XÉ?í§qãó|ÅYn^íbÁs w[H©D€&u“—+Î3Å\¨ËŸ¢^§T‚:Ò©Äø|’  Á3+%8ÔôW#:æÚ<ª¡¶ª‘P¶ÝF"*ao5vr7”ÝéJ$JãÕ«–ó˜äÔÕ¬¾iä’‡dmDmŒÃ^N®™Å”ÊÓ.£Æ+›Ê¹U˜œú­Š*ôR0†›um­€åå¨U2¤ÊRo(™žAÅs.! çlªDþTY´.%¥+æyšñ¬ÓÚ4Ò ^8YFùžcD”öjÂg¶š@ ñ"YJŠÜý—s©Û*iÛ+?253ÁJ/0æ2?÷t¨êÄÙ®FüK(·3NfEéV¡dz¨¥œ÷¬BÊ1—2)´ß¯mµ ´ºŽÌ‰eÕo3›å9‹_P$ÓÛ9\jg‚–\Ñ$©yË)™O•M§W¯ÊO7ÍeRFlÁ»9“Kh·_Ä…”&¯š@ýb˜¨"Vjöå’’‘þh-£8¥œÕ¦”Îs:;ñr’-󢛺3jd¾U@‘Ñ5D™=gõB¬®/©¥}iSÔO©µ®éÞs”þô¡Go‘7“Ô]{ÚÐxÆœ§K…„É@ l‘Û× ºŽ>eÍ9Nî]sm¼¢TZJTâ„ô•^—¦"ÎVéÐÖ³[LŠŠ:†ß§rÔ¸‹AíÓÑ–’»âŽðJt¸XEÕ HHHñ‹!€?í'qãëö÷“¸ñ‚©Qˆšw¥ ¡*&ะ8yW9dÕŦÙ}I¿$¡N4´¡JÑ ³d$w¾8Ö'ªÃÆ"S·/…¥@èœû`¯Wû™ÊŽRT6T¶”[[ eÔ*ð"ɨ]“âÂ.^½•:ãiZ’• nOlKÆS'žýÁv¥Ž\yô]RÙq¥#¥*žØÆ}Ÿ‡5—ÿl¹•Y·; ó²æB’H4Ϫ@‰ÈœA·›Õ‘Ìóž ]úܰ‹!‡¦«Dˆ‚,IMc7çeX3 ´87M3Àú~$bù5Wõ^|2•~Y3/ÉvVÙíÏѲ•ViÏÁÂ[–¨` »§ªñ…¬C=FoÏà .ÖP£¾™M•OUýbJ8ç|î›W˜Phœ…3ŸÇQ‹ä£ÚÎ9ÝV ª>‹–“Ô¸Õ¥œË’Mú¼´HNéeïû¢YHõw8•³ñòÕIsë¢Ù˜ÜIK Ël%ì¬iTŸ”ºç¾J59—9•XîX 4„‡Œú¦ae(sv½ßv€¦rã¿Æp²˜kë¹¢Ÿ4ʪßM—ß¡-â$ÍÔ™ªcT"9·lsâ¥íi\¶þ;a•ÎÑbÇ ƒË%j]Ìu!¶±Që*Ä˪fØ\5Ž8ÌrÐL§x r»?ç ÅŠyœã–òLÿ4¦^y‘SW9N…%—j˜ié$©$§¼IºH™Nˆ»cNúc¡ùï$òÖfòkk²»4­Ka„®ª™¥ü pß šEã!ÒbDÃŽ<­UÊ9>jÑg6É2÷Ù[æ­Ä8ËnT)7éšmZ“ÝR´‘a² eC{YsÙu#Ty55--#s¸Ãh 6‹Ä©WPØ $ž¸“)†ž¦0œîðÆU=ÝwBçÚak–¾…/KÆŸtñŠç)r£ZÓ¸ñ†Ð€QQ©IÜxÃl@»Q9ßNgí…À´žÖ¡¸ñ€7^öÓ¸ñ…À??w0¸ÿ#ZÓîž0¸OÊwǺxÂáV»Q?w1.B_Ö¤îMncÖ%¶ëÒ=á»í‹à°ëX—WÛE%x¨š„ä©YÕ *©ê_¥u–ÞÂ[ˆRRêGy‰¨ÍÂ>sÌ9].œ½5Õ9­}U]ðšºw\[‰y 4 öF¸W/æ9¯-';ÎÞ~Ÿ6¢aõS©*SJ-Z¦ÃéAOzÉÙhtù3+ÍSMC^îhûÍÔÓUHñÄ RälZ‰UqaZ² ÜÚ§™3öê*oSR:ÓLSÈ]DÑx¨=èœ!ÜæúB—0jÛßx<ÁLŒÁú'U†¶]i”ˆ·SzIH$÷uÃ…pçO'Påj¹Õ‘W„ð@"D¥ ÒF±n¯•iêä6B”Hr™×Bm˜(ØÏ M<€Ã¬òvT„‘ƒx&ZÔ¢vˆ˜ÒËД» ¬Hô}±e–Á{5󄕤[ýJŽxM½Ÿ/˜ŽÍy’Jn²œH’€¶S¶Gª5ÃÍiK„¤‡¹i¾•OD„å8p[SAòŸ‰$ôBF«-×U²¦ÔãŽ)!!Bd Ï»²vF¦©MMm:Ò)QÌ&v:ã<%ƒ¬"íÑ„,"é™Îs.” !´^F€H?À˜T ¦­HqAQY½$Ù)õƦ8-O7xùp¢A¯T£<´¯”¥A%s™ ÑÕ×E ½4!7d'¤Ïy”X¢Õi ’dÕÕ2ñžƒb$³ÐÀR…ÇÊE†ì½:aÁÜÎP£zŸ5ÏÓˆ&š´ ‰LL´“==1 ææÞ¦OÊWÒ=lj)’©ƒÅ”ÉbVú½=qr¡à¹¶òTÛ!B]Ì«ó:HR—)…´•*õÔ¨ˆÌLJù0œT¢Ïßȹ‰ÅgHo-VfS–S k¥?œåÓ$Ì2 ËÛÓfô•5ÎÐ0úWPËhya)2¸ç„…NF58IçÚJ6KU¬ºÅKoù,”b,¦W’è‘‘8M ïÙÛ¨SXª§B–†¤ Eâ”)RI1 v²Šçs ¶š¹# 5((L€«ddaq*¾bŠ…ÐT¤)3SKÍe'¦,Pâòj–ŽR£QPXiµÞîëB•=pá¿ÛÜë7­Æ¤Z éiÔâªxœ@·T„%'Õ»®' óEBþo–Ô;qö õ”Ín”¨_º; Q°CɧÊÝGíE}CàœÁ ­©˜$•-s™öD&›ñÍKÞäåÑ”ÐâB ]˜:Ð:bÅ3êæsÑC|±Vª•‚‰$&BÒ¢ ®&QߊrÚãÙ,ÚmŸÜHÝqž&£)mh+RR¹h&s•–ˆ¸ÒÙiÊBï.•fé$”£m¦3Qe¬XBÒP–‹BÒ AžÝqx-Fòö¾apÙ )RPéï ÂÖ].¶‹éÔ™ge²2œXˆ-¥¼ ”ϵk3 Z#5X¹Eñ$^H(H (¶ÝQx,£t$©º¤Y☲sé Äà²ëh^–õâUj²ÎS1¨¢× º”Ò@—u("SÓ#8“E˜)hhRm–ޏpZ\Bn]¶Wd$N¾ðí„ÒÃtO˜Éo-Õ˜³q°-°*Ý:£Q1I1xÛÙ„??˜Ÿwí‹Ã°CóµbZ|?lKak•|ÄÏmß¶1ì8\ÃÌÙO/ÕQ+4«,ª´­šFÛa×ÜuÔ ¹q¶ÙK‹R® ·Tkh®ÇØÂŸÜþKRh眶—+ñ|µ:Ø}/©T¦TâmkhRB†’$ Kf%‹2ýÝåJ\›5ÌikX¬¶üɦE5KI«fœIJ¤yÄßEõ%%ÆŠ’™‚L¡¶(îrfo›g|¹KšVíP+Jmô$$H¦¡-90 DîÈé›ANØMEë\Ngí†Øª]¨ú‰÷~Ømˆ…ù‰÷~Øm°ž"}ß¶-ãìˆôȾ7}±.ÃÛ¾Øm]z~1îý°Ú=„)Môîûaqì¨üücwÛ €J]Ñ|nûaÀ2{۾ؗ€÷¶70¸@éžðÝöÅT“ÞÒw0ªCÝÙ¨Nâí–Ò˜EÛoËæ ê2ûbÜ ,º‹¥NxÈLi'V˜\è˜uRpøý°¸H_ éJø÷~Ø— ª’î*&±zJ•]1x ¿?˜=ß¶¸yÖM˜Ôçù%{JJ™¡SÅé‰]¾‰tè‰p™ö]][’×R4âKµ -ÞRHιE ]% +ŠHuŠt6»&J@#|k…s)(«é¹Ö½I¦¯¥iì`žî+D¡@ôÊQ"a çT©™¨+üªr$i…°µÉ¹0¿ŸRÕ6íEC¤¸ÃÉ7CJ7¥ f˜p9œÑûw˜fÙÅeU=Z!¢Ò2 Rþ1:t¤Y(pbº#M•*œ8NÓ¿ªv Ñ‹“SR¾WËMð>»¨"DÂÌ»8uPn‹p̼g.R½KÌYååyM¨‹³ÒVDcˆz¾V{eâë–Ü[×UrI´$¦rôN-¯)âåИ‘!Vê…À¨iÕ‹«3ïLwO£\8XQºz§áH V¨ÊË-°Åš¥4±™¥"â’L¤ ÉK¦Èœ2¯–Ì â€öM‡|*CY¢•È©iÓ$›Dú`+s?ˆ¢’„*s¶qg º*ê_ð¹2‰ôë1ž–Gê¡2 l U%ÎrDÂJíÕW‘5- V€”vBYyÒØ—¶A²Í&s™Ñ ¥l Y# aBÎÛvĸô=^öþ¢²¥ìõn:꫉+#Hk‰ŒÃ§Ÿ r§±Ãª”ˉ³îý±»‡)ÑP¦Su` "Ξ¸e0<Ã|·U™Ó1v¡,šÅu ¼‚«Á+´i×¼tõ|Éä®mäÜò»6óùc”÷ßh1P·‚‚šH>6äM¥&Rðòž¿ÛË&¦›3¨¥} ! Y¤„¡jôxtF¢aå~ÚÕÕÑ¡úšðþd·Ãî¾R¦Â›»wºf‘-šÜã“Q˜rëÙC j»uHq ’±)¨[;@”M‡[,Ë^  §¡iÔ–éÛKišM·D§¦æ^e¼¾©d¥A-,ÝS’OL[…ry:ïúý#-¾Ò—†TãI’ŠJÉ2"}1.¶——ééžeú†ë(-…&}ä;«·¼Ñ=¸Vl÷”(3¦*[«mÚ¦Ãk©BdàJMäÈÏQ…Àás^u”åYo/­kJÙ¥ 4œnP~$ŠttÉ£%f eA+MÜÀîýÁÓâ7žiÜs–*î&BáL’|AbZã9LS¯‚~ª†P]¥hm@R0,œâpÁnæ¨Ãºº›È*‘3”L\f„¹F—T [¦ü¬œ§·AÓâÊ(Õµ\YJl!ZzäLN U,¦þY¶ê”ŽïA&pà£X»ZR— 0„§ªØÖ5csU]Õ8Ñg…)k¶Ø—QWhP&d¥&bC¤ˆ—(–Aq MCA@I 5ô˜\!Š ¨Ål-éw¤’“¢Ã¤ÜPkÌU6‘uûg &$Ì ” JÔ«*:¤c<-#øê¸ ðîÙ0 ƒl§?n­¾dåô8âW~¥¹,â3"ÏDHêíÇâþ¯ Ü¨úƒÝûc¤SËp!º™|Ñîý±npê´G»öÄ™‚%à?q›ÏÓÍÜ‹Q•R¢¾­ŠúÅa8µ0ÐIÊêJÝJ¹âîÍ6ªBÉÎ-ð×ö²dµüÄß1Ôçy­U+jÍ(ófëØ¦RÖXw3~•M¥•- J¤ï,Ýš´&FÌÛãP~Îó yf»#z†ºÔd•™=v¬Ê½ðµÔÓt¨R:…" .]*»¡!P¸\¡¥«§¢§§[É+i¤!E)˜šR”å²-Á´”Ô“óDÿ§í‹3ÀáÕOæ§Ýûbm¡j¨š™OÛ …±Ã©Öâ}ß¶¨jªfnwí†Ð,[©úƒÝûapj«S£Ý϶%ÀÏY@Šºg)jdã.¤¥Ä¤L.L£—›Ê¯ z—ÖÚ´4òˉOTí…Á.yƒß‘¸-—I‹38Yÿ&7šU9XþeVÒ W 3+¸×tô¶ÆfV9–¾RaÔrÞ^€å‰e)´[d"ZòEK±'•¹E·9x̺›5Î3Lζž½¨K‰` 0— ƒ%^R„¦1ܽ_'Á><âýqo»ÌfÅg Ëÿñ“{ÓÞ‹O5˜ž_悜 ¢T¨°ûТÖVEÌ„ç [gøÈ—ñ‰EªÆOÌ!NK7DÁÿNè‘ñF¦8[9yO2)"îr””éW•AŸâ…%€Éù‰$ÿësÐ 3rþ1 C”ó!Qžw!¨yfì;àY4ùG0ÉúÔûê¼ ;DtÊØÜÁhž]Ïf3ÁJßÅ-‰Èsõ*÷ëBÁ`òÍñ…%ªys˜ ·;"ÙÌS6?œZ-)²Lô³ns4Ì÷M3[L\ µÇ/fáSýaDÏ»þ;R¥#„™ëý•272ÚJ…)ÛïU<§]UÙ[á?¦q1áßäey˺Rì¤V7F¢\T¤JðS%‰[+:bå"”´Êi+ ,©jQÖLθÌS~L­¤¡ïl™B&°Rº{ÃtX˜e–%€$%d&Cn8=qº% ]{ÛÑ €º”8¦IP ¥@ÙªF,L6_Éœ¿FãUT´¨eäw’´•ƒ3m½ëtÅ™»ŽûctKUn?ŠpH4ËL.;š©¤È+*RqEäÍ ‰Ìj16§O74è2(I¾ ]–‘ጺ¸üèÅC¼¿PÚSŠi QMé8‘91Œú;|h¼ÿ£å`-­µç‰}+7Ž="Aè’Ä„Zp‰!þPÏ‹ã8mV¤]U%)‹.0¶jùG>R?÷†AÓÝ£Aô ëU‘+’ÌG)g©ÿùÒ-•žM°6h¼!FÍLäœÄÓeÍÚHÓe"z¯y-ü«™@@ýa©b&_á£O¿‚\¹¸æ"ófʵ‘H‹gÿ(ç1ÊÚç—sy‰fmKa¥lÿÕ±VA.æ uÒ6ê…%–þEœ‡Z'3negÿ¥F™½ˆ,ôd¹ê<9«e'Q¥AŸâŒW%¨æAœ¸••æ©7†ªd=𥲚åœÍ,ÎfÍ #ŒE‚3NSz²§.]F`«Ô·¤6”è3´˜ºµ‡’b*­Ù§ÉgNcR»l*P0ÕÓ/‘qQŽ?³Jèj ©X«p]G®+žñG­Š…6S"D¯‰ƒ.¸[”<î 0òåÍi³ö(اeÕ9Fíayà/6×Âu¬4ªé¼©±®ú:åŸÒåóÿîVmCÊy³¹eS™ÖQ–¢·2z”0å CÌc6Ûëqæ”îß‚…÷H&@Ä·8Î!Ýå~s¨?®È«ÞRêUšWÒeªKiº¡bÕb*bßò,²ØZL»9MU73åfÔ•/·JòCh# @°ê™\ÂT¯Y³®$ÔºøüÚÅTKky5Cjškß= Â*ËÏl76ÅB"ùQÚR"Û†YD­qóùƒÝ…Ã)uéÚà÷ap K·ŒÖ'Õ öû>ØX!·‡æ õBÀ({ê и(xñ» €n»¦ÿd,‡}±º\êv»#ß¡p&¦FþŽˆ— EJ}"ôÔ[^®”Å„Ðä‡Ä·ª ÇœS-æ©ÒWbj6˜“ôülªgøË äì_dj^Lz@ÜsêvDhµ¡Ìtwõ*ÙuE€Ë®ýNÈÍÀ7ŸÌì…À«ëÁen­}ÆÒV©&fI6£ÄQsõemZê[ÊÝNRÒ/.¨©8ÉiJ±Ü/Ùª*=;˜ì!æ^4êB›ZEŠIÐDE`Ï3¡•mÊ—êVPà $L&m&Z –f ¯h« êu¦Å6ûEu Pó v„ n¦5=/9Í3jG”ËY]Em1l•T0Z°Ú J¤ª}Q%pâcõ+’3&3 ¤°µ!t 4óN …!ZdgÑÅÛäå~Iw•«ôÈF¥Â4ÉUÍ#2ÍÓ–æ,0Â]M¿OŠI$‰¦KL£‹Õïùÿtçó.x¦]Ç3z5*W€4’2žÂàŽ¶ðÑôÙ8>©Ú2hÕÛ'!e5šŽj7sš%™X<¢Ç¦ÅIJˆóÜØ‡˜Ñ®d¡N¹ÎCUøÔÏ «ù¹) ^gFØ&RòærÛjâYJÛ™Ò¢ŸÔéVuŽ¡ÿTMŠæ<ÝÝ>~™"S2§QŸâ†ÅšþuïëiŠT²…:­=dÊØÔäP~§Ï-º”®­‰h2`Ü"YKyþtP7sJPM—|¹˜Ÿ¦Q‰«çC,LÖj#ËžÞô,¢›Ì¹À$¤V±bŽšc·T•lâå<ÞÝO6*êS¤G}‚ Û¡r‰e4òµngYú‰«©CØUWZR›·Hýã ±§~ãÖ|OÂ#L—J— ’åÑw¦+/8ó´µ3raº§’&›|QÏÇ/GÌÆ¦?ƒ°ä¼}‘§œ—mïê–ˆ°…Ó¥Ì@;¢BCŒ%W!ÉNþr²"KætE®ZÙ¢}Õ®hmµ-rM² $ë„~Gž§3B.2û“}²ëbâ“)…%`Ý´E™‚ÛßRÙ{"&РzsÄþ‘f›æÌß*s"­cõ*r°BŒD^ I§8ÎU1ÃÓñ2ˆòDËÑ6—JE×®‰£Œn:<ùO0ås˜G-Ö¼Ú“ŠÊ1[¾&›ÈPRgÑ1[ñ嬼²s¿Ü0Â\¿@RBT.¡ÉÛÑ8ͱv.ç¸Kh¤3FìÊ{×V™L‰iTk)¡9Ç?ÛŠŠTËÔQß#Û’‡õžy(S€S*ѶdŲ–FsÎ$(ÔR¶Tewdšáe*îqÌÅM¤ÖÑ  sœj$£¿Sæp»§3 ¹+{Š ª3|”ÐŒÓ>"ÌÆ„„Û0Û„úm…”²jy­ÕÕe"‰¶Æ\ÑÖL,¤}Îk°[Dz`.`È꽂Š{1æÄ8P¦Rt…¥$‹=3Œß%œÇšBe‰M3 ”(iÑ®%”.æÊؼ§i$ ³ &BG.;ÜÍœ'™2úg|º–÷u(IPPU³6Nð“¾8F—/qMú‚“ñŠQe—m…¹e¬[| ¶VL 1X¼l†›ÍGÍu³²I"+¤ëèàófSÎY‚Å.KšÑѳQLã"ª‘u Mùãe/4™„Ÿ ’Aþ/Cú^B§öc?FI›òîUŸ1I“g´Ô5Þb‘u5 4”h¡C,>Ê{ì²ØPP6‰1–gW^£ö×>¦Íÿ[ɳzvó1˜Ö×%5TªqÞ`Ã,¸ÙJmEHòéRUxl–¸©‹¹É<µ›òç.ÒäîÖ5Xªu<µTá–¯)÷–ñî^\¤\–˜7X=EUáñ=vjŠç3†\wÛôÊ ˜o]ù½—ojp{±nzfn~\ a»?™ÙàK®ýNÁ®{}‘.R‡f{öjïÔì€êsðÄÚz0{°¸!ë{àŽ¨·„;­sôBԗмT’½ ¬NZÉI‰ÚGªÈЄ‹ÅŽòÅÙûZD8\/i¯eŸÌì&a"8Zãƒ×쉴”¸lbjU²êXf³±ÉzM 7~¯`‰´PáÒ¹’¸-棟eœÉ_ú%8¨BræÙ©\À,2¥}(ªVèÕç–¨…&AANÕ@y¶˜@K© ²sxVò×y“#J—ÜBwD€)LIÊ!OîFR3Yt¸Š^HÌ {ŠZ #½+tÃhSÛçÌ…Jª[5 p³&ÚHM¯0öŽ˜»À”Ÿ¸-St·Yr¡iiöÒ¬*ψtJzÄgh8_•©E>sŸR´«¨MCkY½ˆ»Bå76ôåËæ~›B¨Sœc‚Ë7QukYA2Q&ßL. U­4Joõ¶ÈÛè„LÌH §Hš€N‰ê‹•Qm,0Óå%r°­*+g§\N ô–_ÛÂë”ù¤œ°V(ƒ!#4¦.9C&+9g®(xÌ_ìûcq”8—J—‹!Ë êÛ Ê<Š•öX¨I\¯T8­U×ñ˜‡£äç~ÔêÝwê~Ôå8©Ý=ÿL¾ØFP<·?åKÌ9.©¥Æm‡Aoº¢S ˆ³1hÄæK[Ë9Bs,¯1t³JÒ\ª ©UöœL]ÒmJ¶DàzÊgME;O¶çÃy qjP˜†Ð3s}zƒ‚a…ê–‘(»@®T¦¨yz‘Ç^K4ìÓ!KZ¤-&pš‹˜rŠê3K˜´¶ŠT³9 ÉD¤ÈÈJ&Ñì¬ù4åTMÖ°ú@[ §Šq'ÖJAÑhöw™Ÿäz¬–®©+£v®¥§p—†€éråã3¤*G\M±XëW’%ӓЬ;4à6S0'+ƒ¦A¤DÓû‚ë¬ò…z¯ø’„h—‰Ä±2–¼qrЦšòÍ„º¤¥ ¢F^ˆœ ŽÑ ¶Vµ¦ò”‘":D­œk²Ïý=åVF‚ó&'–º©*É wº‘ݰ vÌDà¶g³E+ És2Ñ-p¸…¶jÊV_m a–šQq"e`é¶F.3%šŒ©iT” úm¤é31+’ÎVZ@R”ñþ g¢…2HIVËI”·Â'Ê%%ÆIrÛòïE‰=‘Ò(¶”åNJAÖ§íêŒÑlµôªm+©\ä m½Ñ(ÌÄ,I SÖ8‘#ð°Ìuh$ʼn‚\ Ñ žtÉÐ0´ÄMdô̱ýaôT´ô€Å2þ‘v‡ŒpŸúöH‰´ÊØoYñOM‚BSÎsG4µæ9[SÕWÖfËv–‚–¶ÔâÝm¥>GÅ[HH¸Ò»ÊP\…±vŠn>Ç!¿Ý¬•Êšz1M™ ÅÄÕŠ,…9Lhmª„Ô))¤\ÆJ¯ß()У19pÚ~õP·fY†_EX_o)ªÍòSR†ÍkT¨ R’yn¶”…¥jKÉBîL¥&PÚ^¿’^Ï«9jޝ8¨p×T§iy†©Ö‰Ù+8êeeä÷§"'l"a"¼'ï|Ó´X!´*Øoý_Â"m©n£ë~höT ½õ{6„@‡¯‹ÓáÚÂ{ëÂG°…·¾¯`‰´*Þ—Íìv„@ÛÓ?°Ch6î·;M L7~§`†Ð Ç~¯`†Ð"[~ß‹ø~ØmÊ8nýN϶@ÎûnLá$¡C@Ú›bØ(eé|Ó¸E±Êæ¼”P€éïU6“!ªØÆSË×ñq¹ËôupÞ?›øDt¸y.Ä4黨"mŠiÌT C2AÕ(ÖÁ—å<_Â#;@8/ýc¸Chö4÷Õ유s‘“4Þtþb—_ªa-º2lÙ vΊe™ òÅÔ"ž¥^MÕâ3LR.´Uj²M²ÕáXy…¬ferv¥¦°ðeKHZd Ùè‹`»Ê9eåj^¦ºmim’Œ0íª¼ëN#E,eo,¦ҋ„¤*èJJ;³ÑÝÓ¶-«ŸXß(åH©mǨéPÆÈBVn÷%§Nˆ™d¸Ó“ûUNó¹]^`j±\¬ªYZ¼JîØ$Ï\Lsk8©¯g¼ ½+^ü1­¡‡–iå+˜seÓ>”†µ”Êe!SƒÞú:eŒÇÒT»WT@ál–ë’V•)n&ËÐuiˆ h«@ %ÅLÉ $>ž˜T,¢ªvüñ/£!{@Ù¡L䑆¥ º LæwÆL(¨)›‹)žpž¹Ã€ÓLó‰™&r Y©é!W;²R2˜2Û˜ŠKQê*’µ)Å‚‘¨§@:ìŒð¬è/] •*ß ¸Flúát£qÒ€²ì‘)($£8lS9S‚” «MÔ I´Ïh†UE5R-`bÞN‚« «a‰pO,œ…JóTù“X’>qFÄíJNظÍC#+Îf=^°4ü¾oWv78—NÓªe*K·Aœ…Ñ·®,ä,Ók Üx(ƒ ,:Ƙ›BÏu°j ¾6º8Ãhf -=/›=¶D¸W’æ´s«ÔU™e5f_PÀJ{å·ÒHœû¦VŽjyOœ¹”´žd¨MVÍÑúe9¼\»£@ÿ8ÏÜ5FãHKHXJR›¶,Û‰súw—’W"ýé°³+»áp9ôty~}ËŒRºê*iVÓXÍ ‹ @2%&ÉJ o~Úd.ºóŠRÒ^u.É&èL„ŠS/UCH‹²ºYw'å4 Ie´)Ä6¦Rµ RŠ®l—xÃaày²Éë——¾–kÒ–Ù ZRL¤€ ÛË.ñõ}"eÄäT€×ª= rkÉ÷~Žwî 3Îrt  !õ$ñO+­¥ ãJWS3s`–™‹"pË;¯% ]B@$$ÞAž›4™Æ± ç¹Xðrcº ‰ñ‰Å¡ƒ ï?tݱ7gg¤Ã§’\´ n¤Å‰…%ꊡp»NdR‚w‰ÛŒƒEC¢aWB“ H=DÆn-itV8Iºè‰„”OTá¼%.š§SßÅB‡ô“3=³†ðR¯WU)M%DZ¢4mÓ°Æ£((•¯ü%è²íÕ o²1·%P“U†]uh¹2’¤=Z;!3 ÏåƒJ)*Ru• Z™ÊQ8[/1¢i5™=BTq¼Ú}›ª6KùÅŠ')ÖžÁ,?!ñÈœ¬º#[9¡§¨úçÝvdµƒ/ËçŸtDœ£Ùaáù÷$æzÎkäÚŒ‘m‡¨+*žzª¡’ë ¡y}CWœBeD)N *ÂA·DYžþÐÉ?j\¢ÎÎ3 ×ÎÕWRæLfˆC(uÌÍêw¦¾"Ëhm‰m)7‰ÒU=9¶ºÙzª~^¯åõUå-Ò?•TåÙ•>R†³š†K v¡ä¼²„žðJS|Û4ÂÇÒ)(ž§¥fœT`¶–ï]w@”ÎÈ· fá??œ}Ñà¸þ¹÷D.бQ1'º"lZúß„CnÀ%Š€~y÷D6€K5tË]‚@ЉÏðˆm ˜?_ðˆm)iû~1÷D6a‹qº!´{ëtChö°ÿÖü"G²ˆj¢s/~  Ó¿W²&ÐãK5HÍÕ!c@Ò“ÐÛ‹Ô³¸Eµró¶³C5Øš”aŒå<½?*™þ2è.0î»yqé a®C¾wZ¨´,¼ˆfBµˆ±"á ·â™u–‹,þaÜ"Z mPî°»ª/|ƒtÛ-@ˆÕð/†æ·áÀZIšÌ´›,¶¢'x‰ôXXB¼Â€\Á3fÓg—3Ë(êu×›mÇÚÂ[hR€‘ÐLfe¯s«7)e¨¥È(’ÙZÚJœ)HJ–“(˜Ë§ÈŠòK´R°<}‚,Ë”<IËù…}neXÆlõ ê‚Ú›m¶–w\Ö Öcž¿™1ü]¯õlð1Ôk,1/ü±Òž;0ræv”€3ç„­±†Dû!E¯úw+3×Óÿä³ÿh…ÎŒ>Pq?¯:HT¯`25ˆÔÂÙŠÈsÁgën‘ÿÁk„f’Öw+s·¥´2ÈþP¢×9u) õñlÏÂg_¢% ô¼¿÷ÕúõA暴ÖÞ‘årþrmýqùÊV´Ô]‘(²,få2Vzù:Éi®Éˆ”Zƒ•sY›¹õBg§á5¶M7)æ*fòsº€I"E¶´‚mðÅÊ YŸ\ÜŠ³w+-e½™’9•¹*–¹UU>ëÕNá! ¥2H2Qqˇ_6Ívz;‹Ñ‰Ø#Q.%Ó¶ái$8@¶BClk)²,u³PT½ÈHh½ðÉéù5£¨½8†}B52òãÒHrшl-U¦JÍ:!µ tC)å ,Èâ:K S°BÂjš_—vnM7 Ę”X‘–ƒ"Ëéz‘”0â“%Ð1¦ÙBrp—õá PÂp~iÜ!cs–5S—T6àJï ¤^Bt˜7†U”KE5"Ú¥eœO–„¦@TJ$ÍåyK›Í”5|¿SJÕSl-Ày3@ï4¥R™0êBr~k(Y¥5ù +då¶øœ"X™äºœ›™p‰˜Ò…M ”ÒOX× 7ý{˜RIFjÀŸÿ }¸ÍrZ~…Ìc½ú•9=4ºHÿœZ-YÌ©&UÔó´0Gð\(²k²~`uM+™ZnÉ‚- éïEÆ”w—9‘n Ñ”ÊÉ%‚&=è”¶«œ­Ì.©Y›WÅ–³;ŸZ%©åø¤$fm$L¥‰wD»Ð¢Ùžäìùµ3ÿª4¥È2© ÞAm)å~cÿulk±µâ¨ÍrY¿ë9îA͹jS*"ßù‹]<¿ž6.¦²šZ¾§ÿž,,M¸™­0;͹E¹ƒ`$-ô–ÙºQ?T©Q‰žiêñc✻½Ã U%2r¢þ»cqÃ˘½Hû”&¥m“ë$&}¢.Иå[9kÍþqõëï”fÚœãÙiÃV”c*Ö•m“ˆÝð¸Íb«Y}cr»^ê†Å¥ í”`œàç©ëÐKU+:VP šä"̳ŽPÉúfk9ŒÑÁ®E¶Èþšuü˜zâ&9ðùô âçã;„ghD¸¿©Ø!au)V†þ„›#Q*³hQBd²†È™H˜N}BP‰pšœ;„XîbuÚlޱô¸o!¢S º&i×ÁŽÙãÚhxQ°é+MâdI2¶Ø[_ºW+››täŽ%.Të#@ÖêcÏßïçÙÚ ¹/Ü#qÑÂT©BÃs+˜¼›$=¡Ǫ†çÔì‹Kú‚%Š–—9bÂR…Œ)¬È¸C\ãx‡––0õÈFDÂpŸ˜wͶáÜ"…>…b³5’Jì°YÝ1¨ÂÒíø‡pŒØ—eóO\„U˶|S¸B%c‡0 tó6]R ŠRÛ©RÀ´Yüc>¶ôøü•âœ{»¥ýCÑ`áÞaKkúŠë†Ðƒ†çÕ;„M fSkóÉï«åªÙ ¢5E7cFŸQ[„M¡„Ãsê+p†Ð&‡óU¸Châï|ã`†Ð Býµn6„ 5ËæÂ.Ð&þ¢·m—xœEn!´„¿¨­Â&Ð&þ¡Ü!´„çÔ;„6PÓ“?[„] [ Ϩw›B‰mϨwm˜kú‡p†Ð ”.Ù¸wm×UížÈ ®¤šä÷È•v­6Å´h ™xÈÝ P-+[Šì…Šœ•®žÈX8'ê+².ÁKl—‘72geš"ØfúŠìáajÓˆw6($xÕÙ )P|wÕà;6ƽKfV,öD°0ÏÔWd,Bƒ#ß>™@("u È7E¶m1g VfÚ¿O©º²NìÖ“ò˳§‡ïk'"§Sy5/ªÆ’4 ‘0žùyË¡„£#ˆ­š£{8ÙôémN6…”ui6žÊfzŸ„¿¨{"lÊ•?˜­Â†¡?ˆ©z!a 6¢§F"‡{M›jE’ÂÁùŠ=6Fv ¬qá €R)2pÞéS……Ó!E ø„ꜥ¶5!¡·?Ž‹#6mZÜQëiR?™Û E‰ ¥l–¾b€ïh–ÓCpܺ~!³E‚3e²ån»UBËëtßZ{ÒLå2·o>ç1w4¸©õ±.%R¶¢Âq@¢Í±fFl¡ÊšŠB·]7ñ@Q–¡Ç'o>T7©¥‘,S¸F£.Î*”(&X†Þ2ì+N…` â4‰J[!9v Á_ÕVánÂÁ ú„úKìRÚ¼»“p‘tÙ!²,O"Ͷ«‰!Â&–Bd[ PîÛ°µÌ;„,s3êWª2ЦR²¢´H$m¢È“˯‡-r‰le—(È! JCdj8sÊnn ÌUNÕ1URÉfò"ï)@'´Æ'(®[ðÆWdzPB¥óáÚ¢* ©JÂ'|ø“+´"ã*pmsùªÜ"X˜kú¤ì°C`B;\2êØ*¥ ›]óó4 †.9—gÅ;A‰`a¬ŸšwmØ 5ëtÙÐ!aO!xÌ|B{ÆVdƱž”Ó„|Õn€ÂX2.Â]’pî±–ªÊªf˦úŠŠtz©™‹· cÒÚCgê+³„M™}UOþ<"íØÒôb«²&݆e6¯>ˆ¯–­›Dkn:7cN¾ª»#;v`*ŸÍWd6ì-‚­N*ΨmØÒ¯|ÅvCnȪ›RA%Õ4Ø8CnʰeCóU¸CnÂW/š­Âv@ .÷ÍVäÃnÀ†WõTzÀ†Ý-(ñÙ »‚¹üÕnÛ°˜*·â«p†Ý .Câ+²vQÃXÒâ»"mÙ Q]Û²ª–×oÅQômØZâþ¡ì…Œï4¡R…“ðÖ-—´“ÐàÊÈù„n…«ž9PÅFZ†žPÆ©J)Z™Lƒdc<ª^¯„N9v‡SgóU¸pŽ›<¾¨)Üã/pá ‚–Ê‹èN)™J¤lèFA˜['•/G›ˆ)ÜúÊÜ8Ca`ÂÇç(î„ä+†q@+$ÝœìÛg€ÀÂþ¡ìŒì!iZ1¸BÀ-._0ÛÕ ’ò“ˆ nƒ;6˜³<Õ2NéuõÂMó!ᕺ¢N|5…Þ1HÉÒ·¨RJÚfè ƒt’áQ²È‘›~x¬¥µL©)Q/+FÁ«Ñg'–*ªs*uâ©*»8BÂ_Bƒ¬ ê3Qö}“ÑÆx *_1]œ#¾¢§èá ²©üÅ~µ†:š4šúw¯ªúBÒ Å€Ž¨±îÖ9ý4ׄ¢>jýp‰2Èùu}Uöp…¢yuÍ_gZÃ2šWžHÄ_ËVÍ£¢5|7cF ú«Þ8FmÁU¿]œ!h8DYˆ¾Î±\^?}œ!`)¢{¸ªÚ-!j¸e@K}œ!h•}Evp…€7Å\ý!bÉhÏæ/³„,Âæ¯³„,LK櫳„,°©Ÿˆ®Î±lÌWgX£õÙÂ%‹a+ê/³„,T4«~"»8BÄÃ?Q]µ-Æþ3fñð,jû½°Ô¶eâWgX[¢`)Â'¢ÑÂ.Ô±~€[ûêì‹i(²Õª~Ž´)müt ÊÓm›GDX•45+/«xáÑ0„}[ÇX!»Lk)†—7 –©ËEœ"̳\OiIË\J” ¬eƒoOLc §³çLNq^ÏA… â+xáÙá?¾­ã„,Ø•«Vÿ²*ÎÒ&§EõX© znd4$|ÅJ{DM¥ ƒ98©uý‘6Ϙ©uý‘v §l]_}@_U€ôÅ™SpÀüÕ×öFlÕ–8©õްp¬õo"Ä…Ó6 C¾¡iÑÖbå2††ìñª}q›5lï«xá` s¾­ñc%R™™²ƒ}Z6ŽœÆL›/U%iKP%ÇÆ‚¢DgþG“l›p϶©m˜[Î kº¯ˆ­G±*« M„|E ¤Y1³ª¸h}Eo"Z˜­ã„6ªlŠg;ê$$ìÙÕ¹ i¥]RîÙÂ&Y)ªBR&\P\Ç–€X˜ñª}c„6êÙ!…Mj²ZÆÞ¨Ö9r…gÌ^ñ£†e+ê쉲%Ë_û‹Þ8C`ª¦$ÊõY·ª5Ž\ˆiÿ¸½s´p‰j>_GÄ^ñ¢y}[Ç»„Ô´Ð8ŠWy"Dd ‘qÈXÓèø«é3#;åån*Áëû"î.šk~jÎÓ1 >ÈNÄR¦°-=ÝqÈ;˨½ÿdgaLH‘u{Çl¥)'â®RÚ8Bs u™:ÐÄQ*'^‹Dj2à;Ëmu{ÇΠSoÅ^ÿ²öÊuvé´p†áN0í'vÞ×m‚5¿|¨ú«ßß°žXKæ¯Þû"oØAL™üÕìè»Ï±,êbuÀb/åcoTk~::ÿiþX}Uïû#;ösCN4b¯Þû"m>ÈKæ/Þû"ïØO+Þù«ßöC~ÂþX}Uïû"oØCL'ƒÆF€È”ïªÞ˜Åƒ„$;곦+åÁüÅ× R]jO2/(ÍDiû¦5ÀqbϘ­ñ›E°¬ñ«Ù 2=µo……8ÔŸd^U¥ZÎÈÔO¡‘/½ã™°×ïZ€§O¶¿xÂÉ ´Ÿ<å|³mã´F¯‡Oí?'×W¼c6æ˜ >ºýã Dàúë—õX8)½+ë³ïX¶ö•ï–&ö×ïX„ÊW×ïX¨§=õûÆ-ˆXO¶¿xÂÄãÚ_¼abÁ‘í¯Þ0°À™ï¯Þ0±lí¯Þ1,Lí¯Þ0±#ÚW¼a`E½õûб _}[áj ¾›Lî¨ vÊ.@™ß ´ƒ¬ï1l-L¤ëVó‘T4‘ë+y‹bŠBKè2ºffz:bĆ“í+ÒLKÃO´­æG¬­æ$È]Äù/ ôôÆï€ÐÒ=¥o1› :”­æ%ƒ†Ÿhï0°¤¡>aI™± éé1fxÃHÖzm‰`ae[ába&S¼­æ*ÒŠà$‘ŸDYžðÆÕo1›HH©[ÌT%M$’oA1l)–’Tí¤wå¤ì1©•h £Ú;ÌfÑ0“µ[ÌKTÂL¥3¾-…S¶ TIPï(XNعHnÄ­æ3b`§ÚVó  >Ñß$*™°ZI™u°™ 'ÚVø–m'ÖVøXŠh‘xï‹NÐ,¤’©‘´Âd3>Ú½ãÁK@iR·˜ZÚMÅwÕ£lXºvÒYACº,™Ù •\´™ø•¾€¦À)Fz‰b<Ðë%J±$Ê}bEÐÚn )@¨˜“*¶ö•¾ —í+|,*¥4Mâe#)ôƱžCí+|,Ò}¥o‰``hÏ®-¡5-¦àïßN¿¼:"ã"å”ÏÆ­šbX8iö”}0°i'Ä­ð°·šJTÌ”mpoA‹4“/·ÆlL1¢ò·ÂÁ¸Ÿi[âJ’óc¡yFj:ú#Q<à§ÚVø–& }¥o… á 7”}&¤¸ÚCÍ ªÛÖÌì‹Àii>Ñ“ÀÂO´­æ& }¥KúŒ,f-¤Wy_,ë;cWäý­8I–•o1-Í0“í+NÓÐC)²§ýGŒ-T ‰™©CþFØX¾³¼¿xÂÄ,§ÚW¼abí¯Þ0´ [ÞVó „ÁDåy[Ì,ûJÞab`'Û_¼abDüJÞa`á'ÚVóÔp’5«y…ˆZNÕo0±iÚ­æ!m>ÑÞaae¡æo¸j™ö“ C0P}eo0ÙSUïl*Yn^%{ÇŒ[‘LNd«ªñ†ÂŠmèLÏ„ë;DXÊEÒÒ òº{Æ&Ò,[@2[Ì6”Úm36ô˜\ª´y‰Lø6±«š J½ãÆ3´‰„ŸhI†Ò-†ªÞb\…$Ô.ÓáÎÓ› Ì$ËÄw˜–!i3Ò©u˜m"`§j·˜m!m²‚〓dµ‘ffƒT–Óë*Ôc6[J‰^ñãÙ2™x•ïm!l4’§*±Rñ‚56§` hR¬ûÆ1h%”NÕ+Þ0±BR*;Ì6 a´”ªe^5k;b̆á¢^%o1,Ò=¥OWxÂÄÂ@š·˜±!T­¤²žòµúÇi‹•†á#ÚVó°K(ö•¼Ãa H—‰^ñ‹¥R´‚ÂyVhÂfC‹)ö”=&&È(Óy^ñ…ŠºÒKj• úÇdXºv’YA*V¡Gd'!`Òl’•oÞ0Ø1éÞTÏÞ16©m!…¥X“¬ì„O*³m&à7• zÆ$ä iÖW¼a·aiöÕï_d²jšN!J²ZÎØÖ9r¦†S?º{Æ&À–RMŠUšm16 Ò·˜m(ÏPØò§}:Ï´#XäYO´¯xÃaBÒF•+Þ0Ø@ÒH=åKúŒ6¨lÇyFn ga†2„Ÿi^ñ‰b¥”Ik÷Œ]  zê÷ŒIÈ-Ö†3"j´ŸXêLXË€ÌûJ÷ŒIÈLûJ÷Œ62må{Æ$Ê”ë)Æk¼¯Z}ã²5p.¦’u«Þ16S§j‡ü•Æ åÛ´*Ý=åq‹°J™G š¾YõŽÞ¸»pÜý§à¢ì¯+Þò¸ÄÚE°[Ÿ‰^ñ†Ò gÖW¼bm"tY^ñ‹²+‚‰‘y^ñ†Â`¢v)^ñ…‹`#Z•?ê16°‰Žòýã`C(¶jVŸhÃ`pQí+Þ1-G Ò½ã  ;Uï0±PÂ=¥{Æ„Ÿi^ñ†Ã*ð$Ÿ™+§Úœ¦#§=‘qåä~d¿åžÂ/ÌüPç°Z¼´ÿ7¦Wã\öUÅŸçOþpç°ª¼¾"g‰ ûSÒ"ÅöO•ŸæÏ_Š3È'ûž‹Ñyì‚0%ù(“b¿וޙÂn•c?ÌüPç°'ËÿsñCžÀŒ Y‹ø¢MŠüU|ÍlâÍПãOó^{þ<ìÅüPç°Ÿãÿw£ÅlSáMSÄ»1)^žˆ³ÐQXüÙÿÊ/=G—•¸³ÿ”9ì.œ X¿‹ùÄ›oòþdçªôYµ_àL|ÙÿÊQ9ì‰ð5âÏþ_ÊöÝí‡=‚šÀ‘ž/ˆè½¶57Ø3üîÏþQž{p5bËþPç°±Á—æöÞÁLá]·^‹Ûa¿ÀŸæþ(sØO«ñCžÂ þo¦ô¡Ê£Xxi½‰zVÊr‰6!ÀŸæþ8¼öDø?ÝüPç°`Ý2ÅÑ®qbû³ƒ†Ÿ›9 Êô¡7Øùy‹ØßŠPä(œö[û¿ŠöùyÛ‹?ùÞÁ?ãùÑó%‡®öØ×4é?ißãÏógžÎJŸ-ýßÅžÂéòò?7§ÅžÊƒfX²ÿœ9ì!òßÝüQ9àLüßEøròßÞüqyì(|´ÏÎéñÞÈ-ùiþtÿç{ 9åä~tå÷âEöümxߎ/=^Ùâþ(sØAå­ù½>(œöÿû¿ŠöyyY‹ø¡Ïa>÷9ì¢p¥ùž›ßÎöÿÙjgoodies-forms-1.6.0/docs/images/quickstart-grid.jpg0000644000175000017500000013072212003555436021235 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀwÿÄ­ !1AQ‘Ñaq¡á"2R’SB#3br¢±‚C$ÁÒcð%5ñ²ÂÓ4âsƒ“d£³ÃDt„”UT&6!Q1A"a2BqR#ÿÚ ?þqkþ¦ÐºdqY­7Ð"à½õeºuE¸eÜ:¡ƒ‡À­QB.÷  &V¢ê{&ÀssF†ŠÈù?†ØÈÚV¢;Šè€x„[qVdɶJZ½ÂMÅJá²Í#–.p+ˆ¯†­±}^tm†@Uµ [aO^䛊î ,Òyb縫ÃWFØžBÅPùÿ`†sÃWFØ–A4¸°ó†â¦BtròƬ˜)ˆ¹ýµHsm‰ªô—Ѷâý5tm‰E‡{é¨ÍCE„$rƬUñU)aª ±œAŒ±ü5tm‹€¨üŠñÏ §uRtáª×Im‹`®*ý5ôm‰Ê—ÛWFØyyGøjæ³l0J™j «é¨ö”siç‹d,¶¾±<…Š«~šº6ÃÈxŠ3újèÛ ¦x¥‘4(Ú«lÒyböê,PHQ ±2НM}a)ÕJXjèÛ ÔJk­Œ52Ù¶/y4\8©}µômŒàʶm«£l0a×”[_aYñdš2ê ·ôÔ{"Û4sÂõš+ˆ¬¥µYͶyRûjÔ6ÃÈS…L94(M'0uœŠ!Õ]6«&ØÍœ•é«¢Fƒª?"‡ÀC=bÔi–.(NY†‘ë&‹c*_m]cy2½5jë‹ä,Sé«P‡‘¥¬¡…Úsu_á«PÛÀbœèV¨y2½5jò!Rá“}…L8’,uƒ :©}µO˜Fp,SzW¨CÈ1Ué«P†Ô8¢¦¾š„–m5ר¶*½5Ká¶3ä,ufi}aäa#X¦_mVryqGäT¾ab«À­PÀLÏasæë‡ñO¦­]q<OZ¡€.ŸµCÅ3=…j†ø>hyudW4BLËNhñ#–$ƒ 8¯º6ÃéÃ=bªeÅeºDù¶Å@WRÓfØ ©ÃŠ…\3RrrÅU/ª}Åtmˆ«&º6ÄZ†FÔ5mŠ$T³R™ ÷ –O(å‹ö¾°;‡£ld,EËíž° -Vö,Ù6ÀG~éD!S¸,³1<±slEËí«£lgÌ"½5tmŠZ½5tm€˜[ç ÅZ+G/,QLEå-«£l@b¸?„¢6Øy‡Wé¨rÙ¶‚ 8 óÄ6£ÚYᱫ|EúJèÛó±ô•Ѷ`aÕújèÛ aj²iFntƬÆs)i]c>` «ô•Ѷ`A×=5 [bà3ŠJÚ”/¨™KO<^Ð_Ù}¥tm‰æˆ¹ý¥sÙ¶`eÕúJèÛiV Èµ3mž#Ëì/ˆ¿M]c`EÕÊa¥Oá¶/˜8«¿m_ m„‚t‹Zi›ìea³l^ßQ\Uá«£lgÌ"½5tm‹‚O8¢ÚÆ­IË-ñ®¿PSº Â»£FŽx§"˜«·é«£lgÌur–º6Åò#Tµ jÛ4sƺÎFêä$Ò¥ðÛî6_¤©h³l<Á¬UÙôÕo6Øž`…kŠÀ 6¡zVÙe¼ñzÁ\EzjèÛ *å,5tm‰æбü5räÛ0J­eM¤/ Œž!ËëK«ô•Ѷ2"ý5tm‡˜êçcjå°m‡˜%Pµ}9¶¡Û°jËë ¨uRûjèÛÈ EújèÛÌ :¯M]by‚/-WÚì(vÆ–/^°Tº¹ØÒ¥ðÛu%WDÒ‚Iœ„³åÏ ¼T.–•/‡Ã<<ª¸¿sOôÕeüÃGÙèÛ0,eöÕѶ`ÐuRÃѶ`Î)ö¨CÌÊwªb óŠ÷­5œ9´¢Ì±q,´®°Á…¼ä„š_FØb³Œç¦®k6ÅÄd¼æ@Úº6ÂA2âñÐn€«,äâ¬rϤ®±œC¹¥tm†Šäå„©|6ËŽ{”« V ‰L[29aœ c»è«X‰ã¹/´®±0,g}%tm‹‚A×=ÂŽ‰º¬žSË& c»è+£lL€»1ôU/†Ød <÷¤®°È0—ÆYÂTÈ,”\ÆsÒVNM±0,w2U““l2Ü9+W,¥¶¨´ãÇNå ‹,«±ÝôU/†ØÎD?p碾°óŒæ\tm†A&XKŸIV¬““<[ C’–έ±2îÿN¾°óî?ÁXÕ¶`•;®%³&Tf¥“:,k´÷Ÿà/£lg̸w3*ý;aæŽäþÂ¥Ÿ&Øy¦yIJZ„Í¢î“˰XÔ;è/ôí‰æ|Œû‡}ÙͶ'˜pîBÊÀøm‡˜%Hó‰§l– $D­év‚¾áÏE}c9ÇsÑWFØ`›Ï¸Z\Ù_tÛfŽx²r]p4€Qì;4sÂÎEqÜÌʹ¬ÛÌ÷.O쯣l<‰T¼µS®m(M9lÛë9Çp$ %sm‰œ/¹?²­Cl2 c.SÂW5›c9jÝZ©Ô j-Ò9c]`¦;³– º6à eõ‘öT5m‰æ<ì¾Êú6à KŽ)(¥ÚM²Ìyã]d5z+Ô6Æp0ûžŠú6ÃÌ >äþÒú6ÃÌyÕ’ßÒP’ÁÍËËTÔ¹è/£lgÈb¥~‚ù¬ÛÄ;™™^¡¶/˜ óΕ¶K*P»’dÈòƺõ‚ØïeÀW5‘Ÿ0#PñÀ_?gl<À{‡GðѶ`‹Ï8j™›* ²Í–5:ÇN¿J¾3ƒ#*èÛóþǎ碮°È¸t§l<À×9à®rÉfØy¸t X_5›a€¸ú —î퇘 g}~°È;„ØÊº6ÃÈ ®ƒöW/†Ø™UC³±…ôm‹îNx+³òí†@ÃîLʧðÛÌÀ>ʺ6Ã޹}•tm†5z+èÛ yF`²¯ˆa—•“ RÑ! ydU¶«†a·¦õúWBœsÓ:ÆØ‘ÏìEÇŒ€hË9˜Û R„ÂY#â6ÀEˆ€aÇ-úg£l;xɳѶâ¹éÓ¶¸ç¤¯Ó¶ Ðq~™èÛÅ\ÏÓWFØbž"§öÏFØ‚kÜ6«’PBóŒ“L2"—Ü»Ü3¢.+8àìC±–L®ñbð€©ÌÈ:Ä2 /”ÈOš5“r·d>™Ö#‘Ö6À_s;g£l8}k%© ŽØ"rÐycRAlW}#.q¶3À1ôα¶8é´´u°È&ó‹*hÈ7ì´h1© ®#¶}3.qà ãÄý³¬C€b=³e³˜‡ ç}n{Æ>²\­‘©#}­t»éb3ߨb;™³¬EÈ Wg"ÑÖ"d¸íï´yæ!ÀÐ[?h€3LC WÝËpóLEàÇ}#¬m‰"ë¡_lëaŸH€aÇ%öúDL 8³>ÁÖ6Ã}~¬m€çy×=Ê~ÚÕ”fR"È*z_hëÈ2·^—Ú:ÆØ²A%8ôÌ™2çp,W¥<>tÃË{„.ÐJ¤&3‘ñ—Ú·œDÀj'öP†@ïçk-™D0d©ßr·c$ŰɃx••œâ>BĨôP‰“äÀjsZŽQí ¦-O£Íjc9>BÔú˜CÏ_ñjNV˜CÌù¦qðƒ&L¯o 1{Iò6]|ái‰ç¨Î5O¢|ɇž¡ãTz Ö˜d¥qìÝh‘lŒÀÏí ¡z¤ù„g'ÈÉ~§& Ö±|õù½SvÖO™0`Å+&°*"J¼"ö“EqêIû'̘Î@b¿é2bäy×ËK›DL™zÉ¡¶ãøH£`ñ–MTKì™þdÄÈ ZŸDù†Ød¨uòš K-áë&â¿+2üÂ3œ…Žü§‚|Â.@ñ_Ë„g¢i†A ·S7KrI)™˜ñ½dÄ~Ù2yæ˜Î@ƒµ>‘à Ö-FLæL2|ˆÔ¸ñJ›"KIÊ3‘®² ãÔKìiŒäz¢_dù“¶>AQèiÛ Ÿ#¸ñ-ͲX9E¦G–5$Æ{Ñ:ÓÈõFfN´í†Oñª%öLÿ0Û'È“Î=y¢¦ˆíL 5ÖNEK¯Ëítˆ™.ÔNÆP†ObÔú6þa Ÿ*çy×ýÓHÞ)]—‡$jIŽ“úÕñj%ösÙÚ29}Œ;Q/³ú„LŸ!âÔá~¡ Ÿ!bÔÎÆmüÂ>@]ªÂËšð†Oª}æa“ä,zŸDù†Ødù =POÙ3üÃl2 ³éñÀ‹áûÂŨôO˜C'ÈíDÌÙ>a ƒX¯Ïí0†@b?“  xÊÖ˜C ®Ìý#¬C»écl0Iâ³P“vD6¼ùf¤ÄJÜ—s¦¬©oOíôˆ¸&Vô¾ßHŠ…}Óü>‘5)ßtÙ¶ê¤'Ê#_akïOíôÆpoÏíôžôúb Mßp Ën'Ê#\`±[¾˜×È÷|0È÷¼\2Þs_NÛ©¼¦Q¬‚—žô墨ÎA«ÏK¸'Ï €¼÷ƒ¦'M©Üg;d¦vòFì˜)}éO¦3Oáôà ߑúvf¶ ÷Þ’'5iÉÙ«‚ÁOúc\g" ïKíôà ßôùí†A*u:䉛꼱lĨ9[—ï™ ~o6˜d#þŸH†A*e¼DûJÎ4˜½¤ x‰aôÄÈ[ÓžL2yïOõC "Þ –ç–F|±{AE8üíkõDÈ÷‰õC jqâ“ôói‹$¤SÞÕ ²è•±{H.ð·ÓÈ ï‹K}0È2úÝÀ\ÛºsòEŸPšS·&æ$$gÉ 9 xd@·–&@ŠÞ—Û·óC Röî‰ ¶Ú#]g#AÚ‰‡g‘ €¾ôû0È#P·JÙúr’¬Ï#ë ­÷åöÿPŒð¦TüæýBb?/¶<ÐÈ9[Þñ‰¶'uræIzÿZé¾÷§ÓÈåö+Ïú}0ȪŒ¸CÍ ‡*ûrýá €+{ÁÓ €ÄÓé†EOz]0È„vñúv~a ƒWÞ•ôÃÄ{ÓéÀb?éôà X^?NsüB¾÷§ú„1@q韧ú„LƒXŽÊx}"qÛ~ŸH†ˆï§Ò!‚N-Ït”ÜþŽ_Ä‘A‹.äþ"(¼ïƒ¤EàH—²\çáó“çL^”]÷-›¶„ªB|¢/·žð~¨ÏÞ{ÓýPà0·¼ª ßtTÎèË-åq‚O˸-üQž¾÷€[ËÕ*{À<ÐàLqÕÙº&/ržH×*•=àú£<Tötñꇼô»ƒ\N›/c;ØìÎÞNhÕÁKïL‹18 ©ãò pà+Ïx:a¢Ávû²@3]½¬ò‘«‚×ßôÇš3 ÏÊw,üÐà;ï[ÙøNS)Ѕɾ¢{YçͶ ßÓhœøÊØóC€_{ÓýPàNN†¬@ï+æå<‘{`¥÷¬ìsö£<©ãò~¨¼­é}¾˜p%D·p$Y3lùböÁE)é÷?TNyÐ~ßêàNÈ›1f R)ïlÝÔL]7¹"öÁ[ïzc\g §GÉÓªî û]9ù"õÀÙS×$Y!#8vÁ²§|=18[Þ‘« †ÀSd­¶5×4nóÒîsv£Ÿê8[Òû¨C€^%ÏÕŸS¸Œö>k;YpT-âepy¢p ª£Ón¨p‚ýG¦<Ðàs¸§ýã3@î¯ææLuëýk¢óÓµfíFxrû©ùZØÊͪóÓî~¨p Ï^îtà2§§Ü¨pß î48PÿƒõC„zg°9-‡+{ÁÓ*vs¹9òõC€=àýQ8 +vgéþ¨¼yé÷?T8S wÁÓ€MßH‡ÞsÁÒ!À&烤CÎéwÞ6«  '\åH‹d­ÙwF¸`]Ì®J/Ϲñœ^ ÒàóEàH—½Ò wU+l”Ä^0Zóä÷š'ÞzG°<Ñ8çA=‘怉S¾ä‘;’ïfœk‚Þð4g Õ÷ˆ‘æ‡^tü¢š%ÌIsܯ²'u6O”ƸÁP]¶ÆxnøF¸p÷¼Í›S¸®›¢s¹#W/¾Opy¢d ©üÉhpSòµ#Írõç»Õø¿ä‹pZóþæêŒð‚ûù.4^Tÿ€y¡À› t%}‘jÕŸ–-Vûþæ‰OO¸<ÐÈSçäüИ#L·°ì@3R¾nSí °SòÀ?z3À ª,!_šüè÷¡$¤. t¤‰çå‡lÑB§­ì48*{À<Ðà%-ù¶%#mîHL¢SþÕ© tKµÉͶh±[þæ‰À/¿àסÀ›ë{ÐP$m½É¯Ö 2·pÓ$ ƒæä…œ<~@z' Óhœ U©ßn»É•¦ôk¯ÔRû÷G`Hþ(™Èwžì çíD[Þ˜¼V-Ü Só&vþ!ë ¸[ùÐ9-ŒÜ¾÷€k‰ÀWߟprö¡ÀB“wÐ>âeÚuÁ[õ˜?½€_¨Ãþa:€.£ÓçíC'–ñS3Dû;\†53‘\JLy„g€ôÀýèdûþ˜óC “êw‰ Nñ#µžéI9¼÷€OóuFAyÿ×Õ¾ÿ€y¡®wTé¬fiº¹[Í™Ž½­t•=d’<Ñž¾Âûþæ†AªŒèhpSóµÍ¢·ÍÍ€^:šóÒ=懼ø?ly¡À/¿?¶<Ðà;ÏxGš¼ÿ€y¡Àž¸<ÑxóÞæ‰ÀaogH× wÝðtÃ¾í½Ž˜`/¹.çH†gÔð©G`XË™óßDX6…ÕJÆÄ¿7T[ ¥ú©}¡æê‰DÔª¿Hy†È²u+©ɱæ"äZêqÐJà•›Ü£’5P¹Y”4Ÿ7Tg:‡‰W±æê†uú¼˜ióuC êŸp Ázä¥{—š.Lûãz=»weU{­¦å3jp‹Ùd, 1¯×Òv¾S¿1.ßU{Ût1^iÒÖ0ËÓä²È¿»õuéÚÍú'NÛ5éÕöÇ›ª9ðÚaU!å„Î蘽Êy"äÄZõNd'ÍÕΡ*ÇðÓæê†u«Ón¨dBª1’晉òsF® •Öfm>n¨™Ô+õ~šf?T3¨ •^˜—"º¡U6 H[¤6 ×okrE³¨µú¹XØóuFsª õ^šgùº¡@U±æê†A&P«­ƒÛQ=¬óæYq*ý$ùº£9Ôd¹Wé'ÍÕ:‡zªSý®¨d§U@lI´›UóróE킸•~˜½ÕΠĪôÇ›ª.uú¿Hyº¡F)•PHJL·¹y¡Úu+«ô‡›ª3B½Ué0Ù:„µÔ„™¶ž!²,J™u §@K`¦èºof—4^Òh¦%W¦<ÝQ3¨auDËy†ÈgQ—×TY\Ú]37º¢õ“Cmu)´›ÍÕæ†WS/´'ùº¡A~ªCé0Ù ê%T·Ë °D‰½“¢,EBêd>˜æ½Õ 1*3¶-ü]PȺœÍŽN×T2Õ­âÉ ly6ÞüBY¢õEƒ•d}¤òöº£6u 9U/´<ÝPΠ¿Qé0Ù ‚5 ¨!»Í‹™v³æÍë:ŠbUåÁO›ª3C.UÈ!æ!ç¨x•$} ?xl†uùuumͰ;B]¡–G’5'QBº¯Hy†È’uúŸHy†È™Ô;õ2ûCÍÕ ê&騼Õä$©§µžG’5'QKÕ~š|ÝQœêú¯M:ú¡B¿W?´™~n¨gQ\¨÷­vur·›’5'\uŸÖº/UúióuFs«—ØŠêÀûióuC:€.¬¶Ÿ7T3¨/Õ}¤ùº¡C «ô“æê‰@«ô“æê†u¹W™¤ÏóuEΡ*ç,1?ÍÕ ê]^\$ùº¡C½Sé¦ßÅÕ:…‰Wé0‹A~®fM7T3¨Ð]_¦Ÿ7TLê õSûcÍÕ êúŸHyº¡BĨ3“CÍÕ Šwª%öíüÃd3¨•Mÿr‰ö—Ÿñ¢$ˆ¢ àwF³².A»ÏxF¾¨™…Äu:ú¡Â-ËoT2°_¼ì€=»mÉ`äYp_ð§YÙÈ€©ÿ ré;!OçJuàJœ¼ÈJOmYùy£W[Ïø¯ª3‘—¥Ýú¡"§åÝÓê‹J™Oá‰%2š³òóE² Þ|e@×ÕÈ[òî}Qr ýÙ”&|ýQ2 Òƒ(R³µÕ´ŠµçÏÈǪ&D"·üÍ ŠÂ”ùAš¹-ê‹$¥Sþݰº3äæ‹ÚABªŒ—¾¨™Âß—pkê†Aš…¾)Ü7®™ö¹9¢É44* !=„ä·ª%“U¹ÔkꉑUG€yº¡B­Oe‚‘)iêI`ªƒòyõD²yÿ×Õ„d©éžÀ×Õ awM ɶˆrEë"¯~ YpÞê‰d . ‰ÜzUÕ"ª‰w¬ì†A µ=ô¦€>¢eoTo¬‚÷ê=1.~¨Æ@Mò;ƒ”Ϫyñò }PÈ"úž¾É¸;ö[Èy#]d¼üû¢\ýQ2Kù5õDÈ Õùº¡Eâþ#=‘Þ$[øO$jH*UQ>ê|Çdg j&{)³ñÈ*I)œ£Ÿá ƒÕT{æf„ÎêóžNHÔ“'õ®‰ÔZ ðWTg#œúªlå;!©Ÿq:ÎÈd & ªÔ$~÷T,ÍùwS¯ª&@Šª< ×Õ /TO¸ž^×T2ýþèɧª¯?àN³²G>n¨™USàO›ª.@TLö?ÍÕ ƒS{Â5õDÈSÓî }PȧyÿóuC Ao[Øhdû¾®¿îQ`žóþ4Bb(‚ï„k‹ÁYª}öiœx + *T§ OD^’[‰ÛˆüÕšþ!¢Ü‡‹ÙmššÊçJŸmõH¦še(m¥Y,“:gÉù:ö¾?ú¼Ý­ë=|½>"âþ$ctn•ÒÑ{]á¼ÜhÉË  Êy&¡lgôÿÍÒÞÜý¿íí$þX«ãÊÚ ºVê©Rµ4”£yº B×l“d§do¯ü“´¹SýÖ}VsûR½Ë½+X¢(v„!M…’B›pö\”…‘ËÿRz“Z¿ºã{«‰8²§pФR7SV·R†E¨ Ê¢/ìý:öËS§ìíbqÄuµÂîÆÒæîe~åhY7^JIa™‹ÛþnrïÔŸ¶×Åî¾5ߔˣ޵›ìÕ;Xànà/†Û+#·!u_oùúùÉÕËý¼¾—û³RãëáÚdHŠŠ°¡#aÉ+>1Çþ:ÞÖü:þþqú(/¡!$;#æK±éÇÉ»¿ÿ¸Xî·1d„VëDd䈃(ßÜ{Š¢w%87EïªàÎkG@ßürDÿ¢ÓÝ9$òÉøÍ"2)ýsA7·3äyä‡ ²wß(ùKI³&2çÿr&Öùâ ·IÝ”àÌYŒ½ƨkß¼WmÝÔÁ–B^p~Æ£<#_Öø§)ÝL™eú˦Ü8;fÙO;,/9þ ÃU7ç‚âŽífx„‘ŠæÉÑО âBHVìhK>*ÿɃþ»Ä9FíhO$ÝP°~ä8FFþ•»XWåuBÏŠaÀ“lË}ý°àHñ~ôqm•nG‘%÷K­Ï!åuÁaÅÛÈ ¯s:™fÆhŸÛ(Ï_ï á0­Ìüô_lêíC%q¶ðèÜ5gA¼×ù¢ð¸¯xÔÕS³ý¥«Ë–"Š‘0E·Lk®¦½Re$§ÌvFx šœÉMŸˆì‡…TÊÔ§ÌvCÎé{Þ2$'uvOš53'õ®‰ÔfBmåŒðç>…z ‰ÝO-§d8oÎÔ§YÙ ~õ©L³[%à,Ju˜œ7ÇÊ}Pà)¿>êeÏÕ€§QxöS¯ª 1áN³²:uõC€üæR}Pà¾{)ÖvC¡)ÖvDà1)ÖvC…"^ð }Pà¿#_T8ÝŸtkꇙâ÷¾M‰– ä&rßG$YˆÛj~]ÔùŽÈ[*“"”l"ñɪ!ÙñTÛ…¢¹º¹u›¦™Âíì&ëhQ%]¯Ø#Ùßþ©g—¿ªï?GÐo½ÃI¾iQKZÜÛmaÖÊP ¤è Y~Ÿ³Í¹~®ºJGî×ÙE ´©‰\™´ ‰e2lÏÝÚr®WEV票iæÜ¦jíC>ÝÒ ™nR Éš1×öYu{tˆn.gsRšzPJs­Å•(èÍš/ìý¾«?¯¦:©÷cïT<Ã-¶åb¯Ô¨Ú ]™³DfþËr|5æ~¨p5õòÜN¾¨p9«±°mJdŒÿˆrFºàèÆÛˆ³—ª3p)?>êyævC€À~ÎÂ,Ìÿd8ªÄúD¥?q9óê‹0TcÜF¾¨œoœ¨F¾¨pKÙpÑÏ>¨p$þ-æf„žÝ–ç‘äLºåéá·o/Tg«®O¸}Pà99lÐŽKz¢p$âfH@7 þɘ/üÆ„k;#;P2„ë;!ÀdÔHØgd8+•Âÿ¾ja=ÕY3Éə޳ú×Mçô'’Ó²1רüŒ‚uàe^âìä™þc²“Žr„ùŽÈp4Kú¬ì‡3|æN³²/›úæ;"pǽ9$þñÙ ‚ö„Ï?hì‡%ý ³”ì‡úÚ¬ì†ÀN¢ñì§ÌvC€ÂŸÎ¬ì‡ým ÖvDà9» k;!ÀS~ÞÊré;!ÀS{Â}Pá\ï½Úl°W+9"ð'ÜxR>&/“©ð§YÙÄ/æ³%:ÎÈ~!S)ÖvC…E^çÜ&ÄÞºd&rLF¸ÁOæíì§YÙ:¡N¯Âgd3¨/UøSæ;!øŒqî'$Þ¹’fRœ]ê)üÜÌ’ƒ.Sz€*³Â™óΡΤåJu˜œ}„Æ>2¬Lä3œ–ƸÁKÕ'åN¸Ïâ û…eJlå0üPN O²™œ¶˜qöWÆ×ñ³S¼»·;u¦’£ ÒjÔ“t@P´ò´sÒq¿UÞ pËw…ª ¬m2IÓ;äŒêã»ýÉǤÿ8ÂN…V·>ˆjâ>¹y[Ž‘±’j­Oøi‰Óñ\ Ý4j‰2¬ÎCðÅíLt"ãQt'rÓ/Iiámüƒ_î~5 [ 9j?l4oýËÆo'r6Fp*8h•Oqj’½ÎÒ&¤Þ¡6ÂS‹(²÷ïÌ»©R©›1ójˆ1ýsŽÒ$½ßHþøì†„½ýÇ(”÷m2§1 ð×l¡£š£ˆøä!°½ÓN“|«‘1<ÑeýËÇä‹»®G:qˆˆñ7÷ô¿¤Ñ›,8äLˆh âN<½%nŠ@FR*:¡¡¯qªÔÔ÷}!BÏqläcR‹9¾øà 7AD¡Ÿp&>ŒÊ$õÇ ö¨©mÒèa«£~ñÊ”R7u*Œ½SñÍq×q/1½wSU[¾†j ®ë—ï‚t¦W¢Ä}ÂUY¡ÎÈp ÖOºgd3¨dÖJÄ£YÙ êW3†¯Þµb/*É"5øã¬þµÑ:Ï 5‘™åËìcÞKºgd?”jå+©ÖvC:†ÒªåÝF³²u ª²ÞÊ5‘3¨ÊeÞÊQ>s².uó~k;!ø€¹žÊ5¾F‡ºwQ>s²'â5ƒ*Q>s².u ùÃ9¥ó;!ø† \Ì’gd?çW+RgdLê Õb]”ë;!CO…:ÎÈgPÁ©·²gd3¨S¨Ÿu:ÎÈgUEâç»H’g‚¹Z|i䉑N<¾]gdk¿¯øu‘8\1î?³² ùîë;!Àб}Ò{·®ZrLrF¸ÅUE䤓vBÓiÈ>žð|-½wÿñfü÷*¦áú.š–”öRê…‹Zæ-»§L\ƒè÷gn]ç^õk/Õ±k%Jœ¼I%2Påà îj ;V´¶ãk[i¸âR©”ªy,‡’/Éâ>7¡ÜF™¡uNÕ•›¦„Ü2V¢bd —Ž÷ôJ«r­ºFÛp2ê*o4´8DÂT•&Èd¿õ*qHº¼vM3bòÞ šåàJ‹zÒVê)jYyª„‚ÊÒ¹…9ݲfYô@rVq=-5ô¨¼•/uM5 ’¤ªü¦”Ú>iØawîÊçëh)êÃAŸpÚ\ÂY7“xNFÌÐÈ:Ž?áÖvCñ4¨Pß»ù´vVíB Ü“†'.xvƣѧ¤eÔ%» +DÜ@R’’s™]éŒðºªiéæÐ{g=º! a° AfdM@K”' „s5BÚã’nõòdB¬2˜”¢öÅ\€© %I=mÖ3Dá—CMÔ —DòÝj»¥PRBDŲ·öB`Å ‹J‰Q™R¬&Ù^·6H×ia¦ -Ì© èŒä5"©"Öš$f 2ÈšÂI lO%ª iÍH©Ó ¤¤%µ™&ß^Ø‹V©‰&ñÊ6QœƒÓk– ÆIʉ–¹C"¦ª*µ !ÐH Û2,Ë”EÄJŽŸxSuôK0‘²Ó´S[Ð …‘™eYtÎQž;Š}µêÙB€´^9O0œ8KïÜ)÷’g Iœ³ÈÝŘ$šûMP•‹€!eJi±[þveÝåJÖE¼àÄàÖÛ¥®"êT{ê$ó‰C€œ¢¬Ã\Ëi A°MR°äšbÌ5Féw‰JBÒ’@ìÈ‹>.¨kx@Z U¥6Ë” !Á 7Z©¨© óÌ|{0àN©[Ð2Aú’ž‘¢,E’½è“#pè$«Ni‰D°ÆÊ*V¢\‘(LùôC¤ºðLe–s˜è‡5%å°’n%*R2“>ðäI YTî*w”Õ¶“3²%$ÓÖܹÈÿ™ Q4³Èè—ç³öEÈk—z†[KJuá âfoœ¹²Å’ %êUL%h233]‡¢&EtØE… ]Q2 ÃJ§7M¦SU³?d5%Ѱ§Z›“{²«2æL ³Fì"ðeþŸÅX}‘qJ!VßR•`àÔé›Þ ½}¤6‚I줓>ˆpXó¸­oáÃáô§Uiº6 ÉœìÓÈËì©.Yϲ5ø:vDÞ¡s/“YÙz•Ìî9®k»;‹ÎtŽHÜÌuŸÖºgQ!b5‘™ŽSèCÜþgd7¨ÌJÛšÎÈp @27uÈ4¬s)\ÖvDÈó?ƒYÙÄÌþ gd^1ïî³²Kóùu‘8 uY¬ì‹ §É#³1a´ì†@Q3ÜÖvBàs¨üÎÈŸˆsðë;!‘Dߟˬì†@ý¶'YÙ &üò'YÙ çwï Ye9—Åcd8E‹;.ôƸú¿‡¦' >¶kºÌ8@ ߇¦'JÅ5)îÞ¸eÍ1ãT7Rí;­‚¥¡I ¶ÂD£<#ó~Þ{›u^ê­M{aÖª ÇÔR¾®%‚VÎpð¿nå&¦“u"•{¡·a3Ir©êƒqo;P‘Ú·š õþÒï•T-Úmð¦j\mº…‚UÚ« í-E$veÉÞ;“ð•i¡¸íYÞ¨]êPúöÀqÎåâ™ÈuüÅ•m¯{¼Í;›íꤾºeZ »t  ¹`= Åý¶ÞôOnÊ·Ò(j]b©û„öÜDí]ð‘ž,Áªí®óf±/*¹îú”»ºÙLÒ†Ù.*ô¾b \ƒ¯Œ÷b*wöï¢dÊ£z8•V!'°Z§È¢™e¶'íÛCÉJR€Þhp7üÅ–'¦Åаû»ë~¡Keô%Ò™Îw,íJõe¶‰šÊPl”•¨Ù’3ÀèB™=†R2“oDâ𮔜6QˆàÍ9Kž+…”ÕMÛéHÏdÎg!1{H;RåRL”Ò$-°dá oU¦åÄ›3·&IJ†zr Û’Md‚,¿PBЄ‰*j™œÉæö3SP•–Ð1i=¬ÿÇ0j]•xÚ21¢bšš…K³!dÒ';tŘ1Fòƒ$.‚f”̨™œ¤Åí"¨w “ò‰Ëâeà/xó–*î.Hp…ïjÑ–PIÉÍX9Y}ò THID‘>Oñ‹Úª†¢µ"âJ‚¢«lc„;ÕjXZƒjÐDÉÄ8ÊÕ6{m 2;9,‹ÖA6†ð]3a§»u2¾LòYEí E;Í Om”¬g™È~0“x,Þ."ô&Y>áeÚmàYQQJÒfA”¹^°+Õ©q9€$ä…¤T&`ymAFx OÔ )J¸H™Ï,8©¬ªöÊPZP'8×\M[ÊÔ!Y’LŽ©DªÙ~¤¥ÇQx[!gÃ$2!û  àBrfì”2 TÔ´”)Iš–’/ohgLMT¤É$"C) 6tD¸ëéoaÞDÌÄÊ¥9eÍ E¢ÙWÐI K@²Øœ)Ô5JãhK­¶°TNvrˆ×\]3RPdlì&$Äm´R¤… e GfÑnl±8.¶”^M'1X2²/$õi©0™¥SD[#Éa~§° Â'œJfZ%)ÆeƒŒ:ê¬K BÀ÷¡Zž¡x–©)$™¥6-:!‘^¾wZ³î;$i&Q®¯¯N9ËvY²Äáù)é‡J£9GL8+Àð®kº{ –]"5Æ:Oë]^_'Lbcœú‡¦/>âVÜé‡#ÿÊÆ qøyí‡>ã5Þ˜pêt#§d8÷36#¦'_[ðÏãgQøF¸¼ùÃÓA'º-å‡ÿ1?“¦üÆ„ôÄSþcðôÀ†<Ìîë;!À>·á×Õ Vw‚‰•”òø•CN0Q™Î̱½‚¿X—¦3Àr{JzaÀR=Ùüa¤ ïºLŠo:DkŒã!ºuÆv!ùÝÖ¨l¥mÞØ01qì»;œ¹&c\`ó8“q;¾iYdº–VÅCU\‰µ¥NR剰z‰KÒÈž{a°]ŸË¬ì†À—KÊî‹§–.Å|ýáÞ‹âºíõ¼n¤{}Ü€fR´‘¤˜›ô€T[+;"l“à|³øÃò•œ/¾W¼ëjwnõiªZû% äÖ”Ê`žLÑ«ƒg‡øÂÀ7Ûdç:Â3ÂëIÜV&W¾›3Ì)Ñ(pkIÜ\T•7Ë`™„à AžâB·Uý` í8)”À¢ØknpÏ;"½ò&“2I´ˆœª7£»¾SÊÂ:,‡´7G"rß0ÁNȱºø» –÷»@•¨È°6ævvqb½½·ý²3°Öº8¤ª4Uœà§&¨a§ý'а¯êlƒ¤2 Ÿ bŸtñ!fHÞM\%SIde&Ø×hj¿Ñø„!(þ ÎÈ0DgƒXNäâ™ïŒÍ£ª×ô]üx5ÿˆ.éâÊ0똺Gtµ#®-†¬7O%]àÁä,ƒÓƒ[¿Š$­¦?ü(pk+ÝœHRJëØ×Zä‹ b›vq%^ÅÒ‘séeð0ìkguñAË[Jd2©¥OöÆMÓ8&^ê”øNĺa9GÅ(¦ZM]-Ûª¼JÑëõœN¤¤ºIJϤ¢zb_¨çVâß…eAúI“2p” áÁ­/tqåE P3™Bå¨rCƒQ¨Ý|FR–í;Žd'ž,5EîŽ!X3UÎCuÉåÓÃGô¾"H’UDAËÙX†ºøŽv.ÀbKTL5Êþìâ„¢ETwo§´1';ÂVÔ†º¥ñ]ƒ’@Ú.¹lK hîž!—kØ’Š)\âbèguñ+aWU@oJsBâðšËôDJ ×FMðW bÈjŠ â²1¨çœ]\fCYþ›Å3 Å£€Ø»uˆa¬¹EÅ IµÑYt‡‹†¢õ^hbP‚UeŽØl‹!®†éøÁ ˜þŸ1ÉËbHj~ÃŒâ–WD­6¸Â&îâÐJ‡ôù“a“ƒ Îe 5ÉQÃüGS½·MeZé¥t­xEÂM“Î9#]G×§ÜJÒž˜\C»Ue¨é‰ÀÌg(é‡s9ïÚ¦w,ºDjf:Oë]2{Jzc<9Ï •HÈSÓ•N”tÀ]¨™3OL6üÏáé‡>ãðôÀ¿™üª{‰ÊhåË“󰧦*‰ü²øÃ€q?’_p÷zaÀ×ןËÓüÀ?&³²'œìì‹À@¿žìóÚvDà_ðë;!°EiÜÙ¼Y"vÊaCl8 íMü©·ž7ÀܪÿLOÅLû«¹ÓÅU?€ë‡â©Ô Ý¿t锦"ï\"¯ðtÄüQ’+gfNÈoQ‚+sápÞ£Íc›Sz蘶Rœkñ•QÎŒ™çüA*¿ôúaøˆÒVû´­TÏ2ømjmƒ;«A’’yD7¨ 8ªMé ‹e+c_Š£¼wŠwu?¹¬y¦¼”zW–BS“I1ŸÅ#Þeš$yòCzY,¨é‡ ùñ9¾7•- "ؤp#×T…(”Ý”^Â'‰¸ì¹†ÝGd»xÆDóÊQ\kúçJÚ2¡¡ûg冣C{ÿpLÈÝô’Ÿ¯#ÿvAñÇä¯wÓ^¾Jäîyr¦/ePoþ;GÜ¢£BŸ‘Õ(šb­ï¾=*™Ý´…²'0ñÕh†¦)ýs/Hîú@äO¢2ÎøãP…\Ýô†ESò-™žTÊ/ja¸xÖCþYH ¨9ùnÄ\ñ±Eã»h„Ì„êO7†˜?Ü|fý.Œ“ÿÕìCL&7ÿàvwm0™ÉÏͦ5Ú®7þãââ¶”8m¨ ~ÈΘnïî3ÃÝ´Š²j8æÎˆiŒŽ#âÐ’§7m*y1ÉœŒ¬’m†˜TÜKÅ8(JwU8f§È&Ý‹ØÅÜ|VA»»)‰Ðje—÷bi^âõ…»)œt'ªì6jß<_pÏvRŽÉ³Ütd‹©‚Ÿ|ñf `nêSÙþ`d—4; õÅ€Oúu*†[Áùl‰¡§|ñiïîÊpŠ€O솉½¿¸¡iþ˜ÙMÂT¼awD§¦, CÄ Ò%2^"ZœIÄIOý1¹²tÊ¸š¸—‰R«§v2œcŒƒá 1ž&â%4¯ùk%Êòj'ŸòÅ”Åq(2;¥¥HNÇÆ|ÖˆšcC‰ø˜ƒÿ&Oÿ<ð”4ÆÏñ9þL‘<ØÉŸì†¦1W¿ø•- ]Ðf’J^IÈtE”‘ÎŽ7ß*ÓºÑ#›Nz%([e¿I—ôÖÀ:^Ñð‰ë©Š£Š·õéÜÝ¿êËöˆ» '8‹ÙVíl¦ø‘£-±e1Wx‡‰ApCæ=Ø› rŽ6ßV»›6dìO]Lkýá¿LÊwb r^Æ!½Leî*ßÊ ÷ZI¾@“ƒ,Œ^¶}Œt5¿ø¹H¾wCr6¼TÄÕÅT”M[™±3$§Ü üD¡¦â®+ ú*žLtÅLHñGõºéžÝ¬Ó±Pâ’ãŠ{@]ùBaÇÜ}‰Md¤ 4ç†õU¾&úaø…*㾘›Ô®g[ïš3@7§Hþ8ë?­uJ·1FNXĽ\§ÐJ¿KrøÅÞ >ûK}0üBþryQÓÄ9VË+}0Þ ·K}0Þ •n–çñ‡â󗿇ú¡ø‚U³°·ÓÄ0+t·ÓÄ% ÌØÃñ )­™ûsÏ–ÔkùÛ-o¦ˆ?œ…ÄÞ¡Yžä´[ÄÞLØfˆ%Wø'ÎvCñTÜ.š»“2T›u þÈœ#D¸’CU,¹t‚'ŸIÈšås.åA ­h8åKïpR«Ï¹!#gcöE˜•õwjdj;a½Jæp?ïšµ3ÃQÈtˆÔ½qÒZé¢R¼™óÆõsûJòuoPQ™IÔbïQ’*B»ÈÔa½C»U–ò5oPJªS¼FÔjgÞF£ êªf{HŸ1†õ ™Z¤Ï˜Ãz‚U>$ê0Þ •O‰:Œ7¨~fÔê0Þ¡”Ôx“¨ÄÞ §J5°Þ¡S¥ŽØoP‡¸™™F^X~#_ZySÎê\÷‰$ôV?ZaÂâÏ*sŒûc\*€=,©ÔvÄáÛ-N£¶'Éí)éÛ}È´NáÌe”rƸU.¿âN£¶'”¼AI¶Â$vÄGËðöââ}Ìò¨š~{•.¸ã7’ï¹ qEwI È›"ð<'á~%ˆëNíe§ß,4ÃÕî(JÒÔ Aí¢€ÑþÜoªãKSº·œª\mlï]âè8ÊJˆ7žÐœ„†ˆœg‚w6õÝ›¾»vÖ¥E”ÔºiÝqx˜9lÄÉ sç‡ÏWïJmÛ»ÓJºzº­×Pó´í?x4¶ÝQ) ”ä¤ÌEàx‰àÎ-¤¯5βÎòuUŠª~,!¢§$,N]Ó”EA¼xW}¿¸w[-†YATËèe°R„6•IH Q3°Îyâhû—åÞO-‡l8“ãæLùºáÀøýÂ\;ó}Mi¿îAY ÈœÀ±^ËËRˆ*)XžD¤ÎØœ)Uâ²Ð2þÈlå $]6 Ìs0ÕHK„¬&j$6 ³‹Ú@5‰w²èpÍ2#Y2!aÕ;hRQ2{R$dä0ȤŸp”$«±gdm³=°f‘hhªéµJ”É2í[9ª5Ú…š¥‚´¤ƒ)ÞMœ‘œˆÊYªE@ªBÙKVYCáy¡%©»¢Ò©(Û¦ZaBœ”²$‘h¼P¡9Ï$Œ^Ò ¶ÙžWx‘x‹E£ž3À£‹|Z•&JÈ«¤Èà ËÝ7]Z;bd&sÔ9bÌ¥©†Ê n ©zLkµS[5+Z¤°@"IºHÐ'᪂–Qt¬È)!» JÙ˜p6MzLš )&ÛÓ?`“Þ% œFЀ‘Ù·&\Æ/`ñë—ÙAI"vÈ!’VÄÈ(ê·šÐR „€J²ØNyœÐÈ òjZh„à©Ò’ :&teb¬Ù©RR…]A”Ó+e,“"Q(Ïóݤh˜)7²ŒÄÎPÄgy ‚®ÙδØ~&&+5/Õ–IÍa¶Åw„kªªº½à„â.A@L€U)äÓŽEï‡Þ¼ØBTRBR¹ÈÏ › N‘SZA%¹i 垉[®.DmU;Ȳ’–ÅÀ±)i˜•¹F¨°u—kÄÊ’$2”̈”u꺂”ª|™3Û(™Ò·h [a·@Êbä ú—EËBÈRAHS‘Ó`Új*NK‰Nb'—<@Û÷eAÀ¦æ3Ûnœ°UíZ Öîå×7ªj”¦¯$Îd ÈŽH°IÅW-]¤5u'²öÆ`B¦ [»˜¨äѦ+M¹x€ ™d)P2'L2#ƒ{2ã|A¸.]!n:rX’Ï’3_Uv¤‹TŸ)ÛÊj3©>S¶v£:Ó«®δ½ï›7“;Š•‡HåqŽ“ú×EÚ‹;IÔvÆxsû µ4ê;aÀ.ÔÙÛO”í‡]~v­3ÍÙ;a°;µ>4êë‡ݨñ§W\8×çÞN£¶ Éò{ÉÔvé?âN£¶Oø“¨í‡)ä N£¶Q3ÚLùŽØp4Q.òu±8OK¼Gl8 ³©:Œ8 zÞÒzvÃ`zySË—l8T“hšY°ËÄ±Ëøa¨h™:ºã{.e'W\g€äöe§W\8Oø“¨í‡ ‰K¾èL‰Ý$IŽXÖÌ“þ$êëŒð€%ùL©:ºáÀD;âN®¸¼ï¸&ògt Ë—ž/ ¬ž•ªO-q6!€î‘Ï#¶ã‘IÔvÃ`šRð}v¦rI&G—–.Á`—eb“«®3°^ñ&\ÝpØžT]p&Þãâ67¶ó©£r‘-Ôº•‚ðqFWFK¹"Ñs»øÌÉíÝ4Œ·ÛÅÖQ»¸¹ ¾—wtòËÓ–¸¸j‹£ãEq·h9;m†›<`¼B§è&E¨xæù¢ö†ºüÎnðY6ïù£8kI¢â¤‚q7x^KvRóC o‹D¤ý¹ißðTXjlÓñQGÝ ï*ôÛtÛ3“µ±­&‹ŠÁ™z€[>ËnÏ¥Qœ5QOÅýê#ÿÃsl4üK!õ(‰ÏØržš—ˆÕNM LÉãšcV¡£âS$Þ¡ò9ƒLÒñ2€¡—*Í 5#»øŽÒè¯g!.çÑl0Ô©)8›Û¶”¹EbD‰K¤Ë4í‹a®…Rñi‘QröÿƒLÓqdæ§(/Àì857hø¨ß%Ê™ —bÃQcvñ)Cj ¡º6¥Òg(¡ª*‡ŠÕÙÄ¡º –;`‰†²­ÛÅe%%T*Ixˆa¨¹»8¡Î´ \iEâE™¬‹!®–é8ºèwxÊqŒ)ª!Ž0Jd?§dx~ÑÐ[âã.Æï:DÝÙ 5ÍSMÅx*S‰ “’žÒ9#RÚ©8°åFïVkK¦Î["a¬&‡Šši·pÒ©»zÎYCƒHÑñ|ÍÖ¨žeº%.tà MÚ>*K`©ª2T´‹\påP—ËCWöÜ^ ÐÕ §;×ݑё"%†¯ƒÅe=¤P“îäÕ `1Åi°5@P2vÿ,0ÔªY⦇·ÝæJN#¢ÙÁ1© hÓñjiÞÈBý—bXhœb'4nò|JS³„C@£âÑ‘ 瓎ü0ÃQ~“‹ãwš &÷dßv]Ó–iHjÞÛŒ5»ä3^wVH̆°¶xÑR §ÝÂY ÷§ÍÝ1x4"—Œdé·hO´ñÕ1 57_ÔïÕSUìÚj‘kQ —H)#!/^Ô„T;iç»× bM@°­>^¸›ˆ~ÞÐòõÃa\‹ûö»iî+åå±¹˜é?­uIùØ´ùzã1ö¨Ì´êë‡.ÔO¾/\8×ïw““G\6ëƒ+éÕ×v£Æ]pØÚ|½pà+µ&ú|½pà0Ÿy:ŽØpKãæN®¸lÚœ·Ó?Ë× €¢g¶›?\8U$yNØpªx½°l¢¯Æ‰ó±7¨.Uø‘å;a½B ¬Õ£“²vÃzŒS¦¤²’•$ s³çv½E.VxÑå;c;Ô*çÞFœ‡l7¨ *¥ÞN£¶,½D©PXl¥I¤Jö/kÔP¢²]ôYÈvÆw¨.ÖϾܴHí†õ I«ÃTÔƒaœÑÏ^¡2ÝV T€›¢V’ç‡kÔl"¬üȳ,Ûz†UomŽØoQ‡“Q„»ÊMÙØrE—¨ÒQU$ÉI•™ŽMp¶ \«ñ ŸŽØ›Ô+•^$j;a½D*ÓPUå¦í“°é±©zŠWãF£¶%½@”ÕK¾GlMê •Rï£QÛ ê#Rš›‰*R¾‰XrÞÏëz‹ÕxѨķ¨Õʼ—Ѩ퉽C¹W’úÍa†õ}5´T¤Ø»2å‘åKÔRí`—mŒgz‚íT»è³í†õvv‘¨ÃzŒ<—ÂÚš“2®Í‡,,j^£e5yÖŽKØÌ½Ar³Æ‰s°Þ¡„UxÑå;a½DÜEF+SZfI•‡,,j^¢·+%,DùNØÆõ\íq>S¶/® (¬õ¨í„½JæR*Ek@­%WlŽ‘ËÞ®“ú×MÊ©Úây,;c;Õ‹ôž4O˜í†õBí³ê'Otí†õ "¬+¾œ–ØvÃzƒ¯ÔG”í†õEW¨Gl7¨ k=Dê;a½B¹YxÉÄj;a½C¬ŸÜG”í†õ¢·ÔO”í†õåo¨)Û ê2XIˆ¶Ôh"²qS¶Ôh&¯:Óå;bpÊ¿|§l?Âj¼IÔvÃñMDæži°üUýà¨}”JÏÄ©ÄFšmÙZ¡ª4,ì­PÕ…]ñPá NO¾î*$;î;âõÓl³LF¸Á@õ®¸ÎD3‰)_òEÈ×¼cW\®»î –/\¹L_°¥Ç¥;à|:âdxÆ®¸d v]ñ>n¸œ $;Ž¾Ø½$Û.x×/xÆ®¸Ï“Ö‹ãW\8 ‡@ï PàE¤¹ˆô–'xNÏÂ9cW.¼~q«®3À.½cW\8×Aï§W\\Š:]ú²XïœÝqn ]{Æî3žÌàÕ×)wÆ5Küb̦K¥êÓ+ÊÍž|ñ{`¬žÉˆyºã<åG>^¸oPñÊ´êë‡t‰s$-2¶Bï/^¸ÎõMG>^¸p‰ D­2‘ùzâÌÑ–Þݹ-2º%Ùäç…Íúþ4ùzâp&wÓ«®Ôb¥/à9yi•Ó;3Kž/\´m ~è’ÆO\KƒW_ñ]q7¨Ä]pÞ£–µ.àÊL¦'g/¢|½q€¹S?¸“Éw®Ô*mú‰òõÃzŽe!ÿ~‰­'é«å屭뎓ú×IKþ¢|½qêçöj3->^¸l ¥óó¤iìõÅÞ¡]~ô¯§žï\7¨.TKî'Ë×z‚íF\DùzâïP]¨ŸÜO—®Ô MDȾ›?\7¨ÐKööÇ—®&õ íG>^¸oPƒu>¢y®õÅÞ¡¥54ùzá½Av¢q>^¸›Ô;¯çZ|½pÞ¡ÝÆŸ/\7¨ÊEG>^¸oPî¿ãN®¸oUs<•µv­ €lÒ»?dfÐì§x[ÉFî¸>aª&ŒŒSóQtÆ5E!f v…ë†FY§U“Þ1ª!Œ¯"òœ)™$Œ‚$¼çÝ+”ï:På;^å ]XQ§NðH´ˆß‹–ü3î,¬sÚ®‹eÊboÒ²{-ñª w]”ïQ40¶k–CD’—1—%‰É6ÊÌñ­ºèñËdgAußæ”4?8òÃD›K¸Ž€±;Â}ŸÂ#VŠ”=ã^¸Î€%ßòõÃ@¤½glj„ªƒ wê°;f}ž¸Õ¢÷^—|jŒêxÇ– ¯LöÇ–'N—J ÕÚWËžf5ÚŠ øskŒðKó±ª.À½+<°Ø%K‰‚›ª.nX½…d÷ŒKEØÏÝx|ãË ìhrY`(p°ÝÕ€.‹.Å¢÷^ñQ6Rôå|jë‰ÀÊÒèmSP"G7$Yš)t°‰,R$%É š7uùwÀýÞ¸œ÷Œya°b¤:ròLû<œñzæ ;tIc&ˆ—4;¯xÁå—\8KÞ!¨í†ÁÏX—0IR„¦,—(å‹ÖÁ»¯øÆ®¸PÊ_—|jë‰Àe/ߺâìªÓy@‹èùå‹0^ëÞ!ª3pjë w†¨pƒÞ4ê뇚¡/µÛ+°å‘åõ°^íFu§Ë×àjU4ê;a°/çPò°Ø"øw T;Ö~˜*ù=ñ«®&ÀÂ^ñ GlM€ºð=ñ.n¸luc2/ ’m—!K9¸÷¨<±€¸ÿ¨<½pØG¨9{=pØ9Ô—½ú;cí«7(åìÇ_ñtÝvpycïÐ\zrÄXlAr¢ß¨<½pØKågê ~Xlë wÇ—®qÿ—åë†À\{-ñ«®J_Ÿ|j†Á«ŽÎÅP؇½Aå†À<2¸îÃ`A/[Û|0ØK¹o,6ußÕuïÕ {Æ5C`w]ñ]q6+‘itה߿6xW×b:—eß¡q^oníí_»M6ï¬48´…¾‘hn}©rÊ:~¯Ù:ÝÍcöKgÎk(˜Ü ¨¨Ýûî¥ÍíGPÓ%§V‡‹„L\ø™ÇпÙ?¯$ηëËõâÒVë©@2 3d²Ç͹¯líÀ7ýÈ퀫™eË캩¤LºI~ÓMx^¸l ëÒï§W\6zĽ€©¬4ÎÎQËë`­×ÇÎ<½pØ×½Aå뉰•®'Ë× ‚aÀ„M@öÓ`ˆrƺØ.ñêˆëŒÛ«¯z‰Ô6ÄØ‚ëă|j†Á „»y®Ðï—ÆúÙȰK¹Ö9;=q„¼>p~q6ëÞ4êë†ÁØŒÍBeFV~ëg"©KÇ#‚—®3°jëÄwÇ”m‰°%%ÿQ>^¸ly.‡™šì™”‡áLÊ*PîPçDgB|õD¹6Ã`w3úŸ¦2÷¾GÔ¶áÍÊ#{1×ü]·Áû£ËØç~‡qéÏùa± ãüOÓ ƒ7½,LÞl ÿS¢({3ØǽQ?Ë× (|(ýAå†ÀÂõG”m†Àî=ê,6qù}Áåa° ‡íú£Ê6Ã`w”±Dÿ(Û „?+\ºá°ñ]pØKÓ?PÝë†Àî½ãX›Æ€ðÞ+*p}‰$ÝÒç<[`è ¿—KEÞ¸lãÀL¸,·»×îο1ÜÜ»8€oMïP’§½ûÊOxD’ˆ‘™œ}.ÿôx½døy'ê—oÝçSŠÇw^êÝ5Ž8ËO8ímRÜ$­¬‹ÓQÍ—ž;I×Õí#fGG»sˆ+¨©+jœmš=ÞåIZIIYJˆBìÏÙœcÄý}w7jÛoÿñõß®nýÏI]PX¦u’·\]ä…n¦ùÒš5ú¿WNjwïÛ‡¿¿Y«Þ¼ê)‹Šj™ ©§V[¡¢/( ÎRŸÿÒùþhÌW÷³#1º¯óEÑ’ç÷ £W:?bá¢.î+XФOhݺ…dt˜²ŽÆãi uJÙ”ð"&‡ÆóûtÖ~ÿ†…îxäŸý=7%ªé†·QÅfµ„¾Ã²H*ITÅ™E‘®¶l·Tm]ä)·öÄ–5W?¾,üpØ`Õzüýž¸^Ðs–ª}òfð?LÈÝG,kf:ý%ªŸXyzã;Àj§ xyØlA…V?Œ¨òõÃ`Aª‰ýÑåë†ÀËupKòõÃ`ƒÍ-+ÿh7)Èd¼"ìøE›K„Zç@‡ ­ÜYþˆƒ“wîŠmÝOH0Ù¼¥¨ IRÌÔc}ûú»Yé'W&ûám×¾0}ò/àL¶SÙ"yE™Œ^¿¿·MϺx–ÇËÐnæQýˬ@ì¡hm¶nö0î’=ûÿøÏü¸~¾¿}¥F즨JPûhu-È -°BO$ãÅ×½E’©í•ràXÉvè”´FwiÆæâ¢rµªå!>å”а™I}™ ÖÇIûl˜çzJ³4Á—n5$$$% e'4föß«yŠ©’V•• ÀX«¢`X’\v}üú"@î9>ÿ@‚¦Ëër &vXÐÝÇ}NQ Û¹Üý"&‡qܘÕE¤,¸èÄù„ìÑR‡eÏ,kµE0ÝœƒŸ¤FuNãÀ‰úa¡9êtEÑ*d¸YW!m—ybö¢©móüI~ìgC¸ï©úD4Ÿ °N•fÈ\„„…Øv¼Šáº~Ó@[wÔ°~héw S\ÄŒì‹0‡ (!É ¢BèÑÕ[ ½ê~‘C¸ìûýDª[pS¹Û²D÷DYU¤¡âCœý‘ F‚õ?H‰ {;–~Xh…Z]K$•ÌLYtieEÃNú“ýÑÕ·|}Ю;9ßËø`!Tuªbúl»ËTZãÖ}\¿„CU«ŽK¿úbqѦ‹Èrm ÿ0ÍžFØÔ¢×]°—'ðŒè.=+ŸÂ xnÏ¿ú`9ßK¸¬öò¨ÊÎC‚ÉC Ÿ©úc#wõ?LM¡Ðg‰ÑDÝK˜ÌýKITŒ†ˆ²ð(¶Ý6‡O”D–|#8/Ÿã(‡¹ð4&7é/ið P÷¿Bq?†fd„÷­úD=O€°Þ*ûÙ´zŸXoz¿¤CÔø¡éØïéõ> ½êþ‘SàfãÓ±ßÒ!ê_°xOzߤCgÀxOOîþ‘SàOz¿¤CÔøZzgêþ‘Sà2Û™œ—ÀDõ>Â{Õ·š/©ðmïSôÃÔøR º ú>[vcêtCgÀ‹í¬J²¡# Ì®¸#M…˽ÑP•xº5EÕÏ¿Ð!¨w~~\žÂŸú—º¸ŸtZ»t^ºHéïñÆ|ºp×ãèVdo„‡Eï “Õ ¾œLÉjHR\°Û0O„MFý]&嫨§zëí¢ój6ÌJÈš>Z½Þ/eÅ![ÿ x] hdä R£:ÔŽï-º„«ˆP³y7SìÚ 36ô”YWË«Þq:ÄñC‰ƒḞÄ*%§’ñi(»Äˆ· öÛ?ÞËS NñˆqHG6U.Èöˆ¥r‹¦ ëÜb‡ÄßÀ Â_Ë4ea´ÉQe\PÖñZ'=þ¢@°{6e3ûÆq%<®ÝG¨Ù¾ÒL…†‘³3§¿ L]/qjI¿¿QÿðGBá¦ÏqH[Dïºq"m]*DÓøâÊciªâ±%+~RÈZH£°ÿö±%1Fê8©D¾©TaI)üKÔÆRïZ£¾ÙP$ý2JD´vá«uÜMO¼÷Rj7‹/µSUíÖ„Ó„)µ*aWÕáu©_ds&/@‚Óƒ#‡P‡¯à§½S¨EÙð±ÎPçõýKpͲDkf}'õt†œõ%‚3løsû '=S¨Dõü ÂsÔ:„7øiÙýèC€ËnætêÙðiÙÚéÔ!³à§s;Ð!° Û³?TêÑ ÚýC¨CA†²~áÔ!¿ÀE§s:läØ3†ï¨gÈ‘ ƒXNú§P†ÀðõN¡P0Ûž¡Ô"hA[ÛèÐ\sÔèÑ  ©”ß¶à&ÁâCi »,C¨A[\lêt<5Ëîyš4±üIüîpózé3É1d]àOyîå×îúŠ3Pã!ôb·ÙZg$g‰¨üã‰7.êÜ[ÆwQnºªêºŠu¸ÅU3Ê÷u³”ÞP°ç‹°toνÂ}ïÙ¯ˆèèÊKó‘œæ„¬ DÀœJ>‡…øu{¼6òkjT§mJ¦ueÄ%J´ÊqUv½úýüºŠµ¹r½M¶Ú­J”‰ƒ’pGW¤ÜÝK*½\ÈH—)€)¸‘‡÷…EȨ §d6Ê’”‚]#åH&Sˆ>a|hå&îwo·+MÊ&ïmhRÛÃP½dà¯mQÿnM9Qú{µI»ÿÃÉÓb=ާS\?»[ ±4¬Ê@K¸!°zeµ€EÿŒ„6ól´¼·Ø* “¬f‰lWòj¡E)H-‰…™MIDƘÅn7J„a!.$ÈÉ.'´O:§dâË »ht¨BT¼¤¤Zt EØŒ2¼ ·P"ù o4¢ö°\V%Ä€¥g˜D¿h‰°'| ª™k%À›O.‰C`³.¿t6ÚHIÉ0&9Äišå³rôûFfì’m9' „­l(–’‰ç—L€†Åi)ZÊR ¢DÉì Cb(Ý*¯_BBD¬MÙOâa,dµ†•,)2²Á{áí`én‘¥-'hœ¤%§“$MƒÍàêU!ýúRéŸõ'Rlì¥Åئ¸ä¥‰Ð!£­¸i›“’D¬!ÚÍÅ4•\<åxp%ºýã\§mR x¨vµ;“Tá±ú£pñ-S;á@Õ都 Eö)ÂGÜY9L²ËžÚÒošJêšê:w”·(ÂCªº.é¼.¨e„¼žÜR¡ºjêWQ\—TÍE;7V„ سΛ¹¢ö³EßþânÁCUTÈxà!J§Æo ”ØBm¼†'¨>—v¾í]=QUÂûip¢@Ê𜧠‚{駺+S‹•— gI†Áåðâo‚é]K…XT†BBsJL6+ûq]½ª)L»­ÑѤ¦K™¨S‹Q]ïÉ#dAÇQÅôÛ‚›}¢<í) TÍÙªðÍ´î¥nÿíB›QnS¦¢  ÖâÒ³3žÈ°}½(>Ý“ ¤"è’s(º<Þ/KÇêdäÁ¸`É|D¶+„Ó¡ù-n0$@¶Ùf±J•NéJ•)ZfT›I”ç.¤7KÍv:]6ÝRF|Ò˜‰a­-…8’•4¦ÒAùGǺc;!EH“yJº£>Á˜Pæ¶.ÀÕNÒ‹i$*d§µa’]1©a®”nê{³÷Iñ((çͦq™bë/RRâÝSó I*No…‘v!"Žœ#éVIR°He’'Ë ƒ5T!e¯¬µ®ÒSÙ•€ÈÊR‹, Ô© R²R2HÚ"KÍ2’äÕ)üÀ€uC`¡EÜ“ }Ñ"'É5tC`æÞ,¬Wî' “YÞ!$0\Ò'X•õ§GN¡YP2ïªeÌ"h0ÜÅ:„5c˜¶¿~>¡ž¶CÄ#{ÃâèÃwÕ6rƹà »ê™sh0œõN¡ 4èQ§P††ZwÕ:„4,gc§P†ƒ ë³Å<¶hNLýN  ÏPêЃnN×N¡ mÙ}èC@vv¸uhÑmy1:4µú&†Xþ'@†…†±9¹Ð"èxkõ:MW-Sk¾~¡î d¡Ô"hÅÅcKÞ»–CLkxÂsÕ?#:ãªÞÛŠ³w´ø¾TL¶\Ñtv3Lâo‚„$È,”]àx›£u×Ññ&ú&i¢¬,Ô²ðEe7O=‘4>+mÔ£v,»ÙMs$­@‘m§öCG>íàÅîÍèîò ­8•Ž©U¨q!IZ©öHµ*&c G™½¶cxÏ{t=P÷.äi3.#.U*Øhú}þÚQ¸«ÃIÝÁv@Yt V¸m·×Ãû¹KwêfŠ„„§pCG£‚å¿TóÈCGÏP¿7ßÕ3/2´àƒB©mÂê¯, dì‹5Æ}+Š•®I*RL¦ ”CÒé"•Õ B‰– Ãuu6(j\¼°«’R„Å„i‹ØÕ×E½%$¼¢e”¤fÉ+c:k¹HUõ©Hda©­ =ìÚR´•)iË9[ñ¶,«¬%[Ø4V¢¤¤O³,²<“‹Ú¦š]¨|,ÌY)K',ã:ºØkx$îR™ „©3? a¦´‡kJg}DÊÑ)TÔØqÜ&Ô{#æÍûE±«Ø×jIQúnY;2hœ=#Ìàä>§wâK¦ðÞOÒÍ)‰¨úRÓ Zôþ5£Í:ªvÊ]) v£ƒ|ðÙÞU{º¨Õ­·7sØÍÝJHV”™é”gQáñ/oã½UE\Ý;5¡Þhšî¢bm¨d¼“#Eë?·{©N»XÍMM=V ¸Ó…!*B@JBVÂQÄŸí+”´ªr±OÖ!ÓPõCȘvü¦•$)6h†oˆ8Eõ¹Në[þÝ¢â\ m ±ITÍŸŠØhõ)hULÃtíºCm%(@º2$HEÑϾû{žµwïÆíÑodÃG›Â•TîZJV+šuÔ°ë()$ ¨Kã “’•‡Zyë-à¶ “~¦\°Ñó»·|Ò½M\„­Ü.(%!g Í=®H¾‡Íñ®ù îŠíÊšÒR”2Ó©§¼Â€)”–’l’>Æ’ÑHÌž a¦@¤YÙ4yÜUNÿô‘‰zw®ÑÕy¯Þ¤z „¥A$\Óe’ŒúnG*÷› ! uÕ$¬ JVÈe‹;.4WºÐâ‚‹„›{DÚ9ŒKØÈÀ|^ZÙ -“—4¥ѶºÜ;èiÖN)):¡©Š¦¢­8%Ô¸•(Û$$¤XrFºÔ±ÔÝoh¥Ê…X2)´ l²±åËV¦Ô%… ™™!)3É+bz\,TâH¨)p‰P.A+"iªÜŒdß|¢DÁ”¬1©Miê7­J*@1%4]} â<Aš¯faéu7C®¼•cœ4¤‹É £) º%MOy2ë[Ãp ÔëD”Rž †vFºÖ;>¼0﬩óºÉ†õÕ¨CCÀw&2µž¢Ç:˜tÖ¦NŸ¶g`ñ׍߸¯€à}Z„fös‡€÷®­B 0õ•¨CÔ ,?;^V¡PéÚúµ¾àe‡½s.aÜaïX˘CÔ =?¾y¤˜¾ fßYZ„4éK€‡¨ÃÒ–9³ðˆž Bë~º‡îˆ¾ ~Ýï]Z„O_À~ÝßYZ„=O…h2ðÅ'à!ê‚é'êB‚ï¬uhZ ëA LògUŸ²´Ú½C““d]5¼%æpóY²­Õã=5 âj¦>âWÏvy´óF´[ ^3ÑЗêˆj¼g¢®u ã¨_3º-³IoᬠâÏ(ššç¬ÝÔõ´Ë¥«æqµ€RD5PÝ\?EºÐ¦èŠÛm_!Z–0Q2†ŽÄ6¢ó‚ù'FyÅÑàï?íîâÞuÕµk¨SÕKJ]RP(š~žŒ0Ãl¶ám! É‘"BªÜXʲF›"hù÷x]÷w…mK[Ú¢ŸÜ,6ÚZºBR;È' ÓŒ§„÷±[ò¤2:nÆMPpÅvC¾êåšIgü¸fµ@Ë}U¦g0kü°§áýã%ÝßU@Þ öZ·—¹¦¬¾Þ*[ò¬KBZ¶¹xv½3»¿+LÌÿ‡þHþÞÞ%Jžü­ídûvNÌ©øv» Í÷["T8g=¹S°c…jÓhßu™2I¯òDЬ*½ýn°saÿ–*á:¹‚wåi"Ùý1oÁ0›‡+0=õXR~S„FYx"öUÃ/%W“½ë ²‚Kgá܈k»wî–hPðeÅûªyÅ( •¨Mƒ’(ë-ªV¸lË’.ŒÒ!F²#²$,ÑÕÂ\þá艡–•`Ä9y"hÃÍ« _Pä:"ËÈËM(´ƒˆEƒFˆ··*ÞÇñDMA†äþá膈Ö5~Ä­WRB’@ ‚$A‹(á£áÅJãnÓQ2Ë}µ¶ÚRGÄhôÃK}Cfk"zeËÓÅ92HCF*Рɛ„‰¦É‹(ªZpepŸ€‰hŽð ]e´Þálb¦î*J“Ê›ÁBš¯ŸOÔ¡ i;ö´´¥)."ɨò©³ ïð]Ca*Nü«™ZGiºu º0À‹ ·û&ªíßëÕc9ºÝ2f~ ÆlEÕ »ö´“–icÿ.W] ðÞðB.§~Õ¤ ’E?þ\7¸{z5ÿ?¬í/ÀÄŇý8Ô ð¥JœÄ^úª*?…‹g§éÆU¯ö½Læ7½På¸Ä¹¾ÜÏ ÖK}Uáb_÷"ªOpÝPy©ïŠ©•*Û¬øOàuáÚÖû»î¬ 3þHÆ£ áj‡Bïå˜küÖáŽöó©V¶?ðÀÕÃò¬ qÊ×Ý4ÎZJîHÚ‘$fQõØmBÌCf{6DÔ<NÇT<»!ëø°¿Y_§dOSácŸ ~ü}E¦m’|\ѯs>ÿ‹£y1U©;#>çÜ<'÷•©;!ê|~²µ'd=Ï€—oÕTódÙSà<zªý;!³à+õU/†Èž§ÀÎç÷U©;"úŸK+¼fꎭõ/Ø<%Oî+£d40Ò€ûªŸÃd]S+'î«RvCgÀÒíúŠÔ6C¢Ò½EtDЕꞈh KõUÑSát%¥J× ÕSá ^¡è†Žj„(º°A¸‚M™”aCj³¶®‘ERÚ¼j² ..}õtl†‡†¹÷ÕѲ©”+ÜwÕÜËfžh»À¦ÏñѲ&ÔÜ:†ÈšˆoŸeCQV°·NÚœ(@D$N@i€øÛÆ{ö¡êŠÊ½Þ–wc l¾–Ü¿TËn Èqh"ÔÝ3²4¯´d¥æÐëN•´âBб"• ‚,†£Êß{ꢂªšŽš™Êʪ ¥! R.£-¤eˆ;·mCÕl_u—©)§@˜æ"Â"ªí¡eçõXmœ¼‘ty[·‰i«)wh¬£ºŠ„6á9ÅŦSýèˆéܻ٭íLãÍâ²¶]S4àM三^MàråÕzIi`Jù艣âêéxÝõ½Müz–Ýl pË.ZZIšTà²f‡ïqE;¸G‰]Z„¬4ôó‘<ˆËÖ¼:©O8N/<Ø/´dÿ„]Lt–÷åÕ¸‰ÕJS>Í“-R‹©Žt«ˆÂÊZßjR&ü«@Î̱{UÀ·x»Þ R¯Sµ{’ÈΘ^ë… ôê•ËNÔå 1¥+‰OkúË– ˆ§gãe±4Ä[oŒo|.á*’°Ï91{S \fÛ ;½]¹"°™”þ N&˜.qJ›˜ßî¤4í‰ktÅPŽ&¹Ä 3Ëü»Yt(i‰´¾'ÃHÝà'“œ„ÊÂ3g‹iŽöÆüR’“¿Ô›l½NјøDÔÇw «x®ž±•j¨qªÇ‡ B{ ‰ dLkQî)µËîšYF)Y¦lß#²,Ñ͵Â^\C¨Fto ~3¨CDÝma¥öÎC£DYyTÂÕ2\yðÚ$;K)Hi0·‘´Éh C×’«R¡"ÄCP\\¾áÔ 9·«¦—wTÔ­jSl6§$$LˆJ97ó«Þ !NÒ=J€´8JÚ’mIJ…¶ŒÒ€õ‹KõU¨DЖÜU¼‚>~¯Œø])(Vöd8—jA2PPUÒ"ÉÔ£èkP:dr)D´y<[U]EÃõUT–j› Âp¤(jeh‰ªùE¯û€”_þ®…Œ  dϦÈͪ˯ÿpJR„ï sÛ@*[HJ9,œYLt‡¸í7±7“@Œ-!_Hœ/jaâñÖœMmé }ºÇ$ŒOG˜b§Š””—w©mD›É 6%¬ÃLLïö§Oõ¤ÎùúvŒ¤ ¹c]i‹ Ýð?ÿ±%M‹ }ºJº¢Jy«¦»{™oÉ„ÿô©ŸLM<ÕŽ#w¹½È™švÒ%Îbê`ué´…ïäÌÌtžÉ¶su«".?Å”ï4-R´¶Øc Š¥î&Q ¼ZN{sCS Úž#i!_Ô‘—æd[ª—¦ß›Ðo}ÛMUR‡Sênò¸p‰?jð©ÙšûÊŠ~êº6CPðV?ˆ³«d4•úªèÙ_ÂÄ Jàb«íy£W·FÿÅpʽU~‘þãE•â(jÙAê¨êÙ_ÀJ ûŠèÙ@-*]õtl‰è2Òå÷Ѳ.…‚}Utl‡¡Ò?Q]!èkYqѲ %gq]! -¨ÿ]! Kk®+£d42ÚήÐÕ/¸¡«d4µúªèÙ []¿Q]!hwã=4s¾‚Y+"h@Í™Jäå‹CdÛ=E,ïž‘-ÓÄWFÈhÖ9èÙ >æWÏrs³O4kxUpϨ¯„¶FuÃ>¢º6DДÍðB–H"D¦Ãð†ÉøŠ—ˆÑ¾ø §úiM3ÍÓ5>Û8yP‘Þ&ÜòŠ?GÝÔínÚV©ž.S¡¤%•‚RB@&qQäoPž/£y×mŠ7œ½e–ö³h€òþçQ&­Fµ‡©·k‰½KRd¥¬^»x· n熎”p·kŒT»LÓË©†X ém7‹“ÄHÅÑ}ÙÇû³x;HŠt¼ ú’ÝK–]aÕŽÊU0'{4A~B}Æûm„ï ÞJL5_O„}C““dM7LÀsyo°•â_nÞv’m‡b÷mòäæŸœÝ™Ïm“ŒãzÃk,¸  ¥¢R”“9d˜1v!%÷û¨ RA+ œ´ÎPØ7KV®Ýãp(™$"ö°mo¥Ä¥$•gSz\Ä`ÒQÙIU™f™X~Ø&€ÔÁê†E£’éVÉh‹ê™*˜ñ{X#PÌʱVY"k ‰°gØ´”ªjnR9 Ïž S´T1;l3ÍnQ ƒšÀÒBËIÒ •HÎFÑ’vEí`ì§e‡Ô”­±•iQM„ Ù`89 SÄ«³^ýÒnÛ2ˆ²ÆkèÒ¤~¡èÙÔN•Ó¶o¨vA•š9¢öª°iYCŠ#÷vFv á«."º6DÔ'Z8J8‡!Ñ£š,¼”þãîZ}ç„>âî´¶V„¤€&¥¥ÈhQ…¼Ž}ñ¹éøVƒú¶é«r•ªr€ý ×y‡P¢’”«"ÏÊDd}kI+JTT”†LöèJ<Þ-JÑÕä:fZ)ÍóY¢.‹9[Cºw+u5U4´í LËÂJÒrJ&ŽZn0áÊšCTâJZ/-§$—”ثȔæ4Dô#¼xÓsÓS¶í3Ë®[­‡’Í=Ò Ñ+TÀºÓ q WîgÚ¥¨múº´6 Ø½0¤Ì]˜26i‹(ûŠFŠvÓŠ£u)O˘sEÑäñ²%õ–H+hËÔO$gEj½¹MŽ).$ÊD ¹"[Ž'iXº›ÊÅ-3IÛ#]lU†ïOÎíÙd–Á¥ÐÉ“'Ií…]—@‰±SE?QU`ÅÀflä†ÅB±¯q…jYQrÐP€A‘¶D[ª7{‚êK¥VvJn¥'’@J3Uþ˜….ùÕ A—0‹°Õ‘»Ú˜º€’l&Y¡±wr2—YQZ›í(Þ2 vM²"ØÔ±5Ð7h»u5bYˆBAý‘%†¸·• ¯Ô+}’‹ ¶J%±¨ƒ4®­)V*Cy“xHé"K ÅRoo=È%$ûµ ÂVšQ©c5õƒgÕWFȺÉûs™åþ‘42ÉœñUѲ±ÎZ>ûî+í!ÉÞÿFÌꆭ‘s‡€}Uôl†ƒ^ª¿NÈhA…Oî«£d4<Š®ô³<¿Ó² zªèÙ dÌýUtl†ƒçuzÆÈhx'ÕWFÈh*—Ü_FÈhIeVýEtl†‡‚}Utl†‡‚}Etl†ƒ ^ªº6C@Pþ*º6DÐaªq]!£æIZ“ˆ£4¢Ûç eǰ[ •H¨€-šnœ£@”]6òÞœ'»ÃÔNT&ž ™Ò¯_²©!ŒMÛ Ú–¸u.%ò§uÅ»+ U9H‚';'l5_f)•ê«£d=–e/'{o«• nU™dÉ”í‡nÂéiåWPâ”t¦_´F}5¬*‘å‚´©y&ž&®„RV¢Ä¥× æ;$YÎl†šºjA%aJœˆ$Ûž/jjƆ¥´ýíä 2"jk~Þ &jRïfH 3Êl†š¯²yi™¼GŠVN.®°Íê@”Û Q@Aѵ5Îöïy%Å-ŪS² ÉdŒgME)¨âñ4¥Df£ 5¢Ë—q ®ÊJIÈ锡¦¹ˆsÚ%H$Ÿ¶ÊQ{S]”Î1t e)9–ÁÉ’P™>§Vð“ª?Ï>oH ä·$]G½€°’qTy,ÙÑ:fXl‡&‘$Ù£š-¢¾Ýv Utl‰è™sûËèÙCKeA %Õ²ÍÑ4|—nž;­aæ7kôoP>[eÔ”:›¥*ïwM©…£š›€wÞö¬j»‹kÃá’Æí§±„”ä*ž_ø¶³E"Óf*º6CGÅ4®9Ãõà,¨†Š®È|¶Å”sѧrqëmè­aj[v«Lˆ˜”ÄŒKD—ý¾á§\ZÜd©n?îTIùòhIÑ 'îÚՀܤÞ•u*YlL„DÈ´ÈCGÁoá a±AFý-{• …S- @XX.ä„£ô´Ó))Uz†Èº<^4§Yá÷RTÖãI»ÁÉÒ³PÓÈ#©C&3­JãuÆÛ(¾ë–©))»9󲬫8fmÕ¸,UÑoDKMoé)Åp,Œ€ CÒkHKª2B–£’ÀΨz5Ÿ®Ao¤™©3Èm¢ÎÃxÎ …ZEƒ³9꽑¤T¸R§T’{WT’9m‰èi5j•öß*Ì;)3ŸÂ†]­©S­¡Nå˜ê œ¹ã]{*kC¡ËÈ*L¬ ¤&Sæ²3; <Òj.¸ùu @7W0¢'ËC˜R°ÚÍÇ]Ss°’0rÙž&´½[A5»‘´©BUdÛ–X*·$nV+ê) }eÈòˆj¥>ºÇÄl‡¯áÚ«×^±²·ð±nE|±W,9å(ÕíÃâè4æuzÆÈϧ8B™YÞ^±²¿€Í1õ—Ѳ‚öÊ'ï,|FÈzÛ+Ö_<ÆÈzµTÇÖ^±²‚öªõœÖ6CÐB™S?Y}!ëø Ó*v:½cd=ÿ F•^²õ‘}ûUJxËÖ6Dõü M:Œþªõô¶>ªõöl©}åôl‡¿áA¦T猽cd=êõ–ul‡¯àk^¢º6CD”Üêԛʒ›J…¾±-Œ—•g,hd “ßPøˆ#8VžÚµÁÉÛW$¥²w?˜»}]ÉÎ|±uT Ÿ¨­cdMF°Åµk"hxvwÕ¬l†ªAyBùè¶Í&5¢˜RʵŒMScÄy!¨cÄa¢il—Ú"A?ãTý³J7‰šÅD&zåQ´S!ÝQ32•§T4l¶ή‘5_6ÿµS¼ë+¼ë©–úÁSl8‰„9]ѳWÿ÷›Ë—ë$ÿáˆ68QзÎð³6"eÿvJá‡efùÞDN_,áz…!IVûÞêÏñþH¶¿ûYÙÖ·…Ÿê£ü‘.è°ïàrH—S1ú p»„7¾ð‘Ôü0¥áEXÞ• c 'ðÆ¨ª¸QJŸüÞ¼Jx£&¨Ê'þÎnï^Dæ~¨Ê?v즀!;Ûx$ ]JŸƒr$oJðHÎè6üS±ªµÁM6¤ŸêU…C9R?Ë wîMÆwe3Œš—SŽ­Òâ¤o™ÛdQè»'¶©|6E”I†TiP¤-AE"BbY9¢ö¨¾µ™[švh²1µM-’'}byŒ§û"Œº‚Y¾®éÑ£šò ͤêµ#FŽhv¼¢˜_ê(êÙBÁ·¾®Ñ*¦~ƒ€­D]3[ÑëygvR2BÚ@mdH©)H2øž¹ Ÿ†­Ñ¬#ê+£d4B±¹52¢®Òtx‡$X,͈¯‰"hó÷þå{zP{FkJJмP„,ö å%šk„ðæù‘ÿŸ¾U§‰j»*­Á½‚Z ß}”²ÀÏùc]WT<-¼E©ß• ŸôØÿÆMhðÖóOw}¿ÌZdÛª&#?ÐwÀþ¬á‘Ë„Þȸ%WÛÉ×™S›ÙÒoI?I»&€"Ȱ=Á»Å×1¾ž ÎCMŽk”`ÖÁ5Š"{áâ@ÊZlÙ,’9¢škàz•¤![áë¦W€i fœ™³@×+¼P•²”ïwfI-6sO4k¬5Òž« ŸõwE†ÐÚ¦2j£ƒê.ìù•–¡H冲xb½$½V3¼Ð5“Ãõ¿Ôh^¨ÞŽ=€â–‘†„äI˜çÄ{øKZã:§ý×5ÃF°2}Eëꆬs–¿ž–"¾Üò4kxnUÃÕ^¾¨šçÿˆ­}Q=Pð¨½cd_C8üñW¬l† õ¬l‰ê„XªõÐ`ÿ¨­cd] 2&~¢µ‘4Ÿõ¬l†«+ed ®*sžŒù"êgýEë! K9~¢µ‘-,þ5k! Â—ñѲ£úŠÖ6C@ÿQ]!¡–ÌûêèÙDTŸæ•Ú3Ã@Ëšò§Š)±+u犬aešÕg(‚bÞúµÀh6líªÎX¢eÝJò§rs½è¢˜V÷•® ÑlNÅ[bh0Àù•¬CDÒŽ¡3bAœô“ÕRçâ:ã(JlxÕ¬@+Ÿˆë€’ë¢,Lí¶4ªá }ZÄe ‰wÕ®jC¾©óÃU&›Nv•bå9þÑBÐñ«\Måk€EŸÄ­pa±%IFŪÉòƨ¶þeKŸª2ÔåÛ:à„QøÕ® :hÊʬü¦5ERç#( VwÕ¯ª(Xv©Gâ %JÝêtv”&4Åì,üj×ÕdøÕ¯ªj@öÕØLYF)Q:vÈR­H ɰ¨g=õk"zQ„|jÖ6DÔeÖþ’ÍõXq£š/[Èlá#´¡0,Ÿ$/ÔP7øÕ®&‡‡øÕ®5H“(¨Ø4Åëõ ‚¼­qä›GmZÆÈº­cd4B©°–'yG´œãÄ9#]h¨lxÕ1f^¨”?ZÆÈñ«XÙDj[) ¥­#(ÙëEÃ_zÄd€iF\W<Ðô€RKø«?½Bn0Íâ»DÛ>HÔíÀ¯·L¾âÇïF4/h™ª¹ËÅØBâ¸z/¡7¡¤ßT”mã E¸ö‰Ž9æŒú Ù§ÔpKñ¾Ôýªο4ODCÛ§ßÊòå‡â>(¾¸oüWö©ñ¯ÍÓœ?hŸžhžÔý²}Eù¡í4©*µÅù¢ûSö¨—}süÐöJWó{Cö‰õæ‰èdR‰÷׿‹è?hŸçù¡íG´M¿QÏ1‡´/jœ—×Ïz€)G¨¿4=)ûTú‹óCØb•>¢üÆ'´<ÊX‹óCT…8õæ‹ öÃÔ_š†m8¤gu3´æUŸ¶2,D‡iZâíS)?:¼Æ*e&Ëê—æ1v ÁHù•æ0T°Ð*.ÍR¹¤éŠ+‚Ÿ¼Æ&Ô)ñ+Ìa´)Ëy^c VRÚqÔ™«º-™Òbè® eb•¬Æu *Õæ0Ñœ$‘b•æ1vŒ! Æt(Jîs¢-ª¢šAù•æ16¡†“.ò¼Çl@‹)#¼¯1‹ªË "ó‚ò¬Wˆè´W%yŒMBÀO‰^c a9–¿1†ª ²’ •bÈ£¦5iUÀHùÕæ15 %röŒ6€´›;j³ñj¥LØS`•(œ„é1®Ô\0Ÿ¼Æ1¨a”x•æ0ДÊeÞQýãQ*VÒªtʋڪ¸Ư1‰¡`&g¶¿1†¡©¤Ý=¥XÌa*¥LÊM;D©S(OÌtCµ]3n!H+X $-@ü â!¥„åÙœ¨“ y¤á,ÞU‰6^:"Ëʆ™NIR­æ;ao#x(œï+Ìbj 徿1€K@0³yYÌbõú†“)ßW˜ÄÕ”øÕæ0ÔaÄ!"òœPܦ.‰U60gy]äeQΡ­UÅ:oNúüÆ%£XI^Wš"3‚¼Æ.Ñ*¦ÂpäT®ÚsòƺÕX°“óªÌ׌gBÁæU¹;F tYÛWš&Ñ'šÆdµݶòÔª®å‘yR!Sí®·n‰Z¥|c;Aí›ñ/ÌvÃT½ºò¼Æ&‡‚‘‘JóhKi7Oi^cQŠfXlÍSº, :!ÚÑLx•æ1°›;J–‹Æ.Œ¼ÒC+3U‰?1Ñ^Cm”–Ñ2«@ÎtD·•<K¾¿2¶ÄÔ 2Ïïº#RÒCʰxŒk­äoo*Ù|Æ3¼Šà&ÞÒ¼Æ' ‹2™W˜ÅÑ ¶Òj=¤|ÇÄ#]h¶cL´ÙÎu˜¨a¤g'Ì`¬a TJÙ]œæg9Åû `7âP?˜íˆƒ‰ó+l4<ÆuyŽØ Ð_P$ØA™Ò`+†'Ìb[lg:ÌpÛœï~c„6Ùu̹­¼tF¨¦­Qýã¦ç•^cËi•„ùŒEI„¤—&7´™÷DZ/‚*óžª2ÌùŽØž¨E¤JÒ¯1‹ªçe´ªdص"tƨwHœÔG:¶ÄCÂlÎÕyŽØld*åí S´Œ<ªÊ¯˜é1hÚ›jV©SüÊÛZK-Û+Þc¶&¡–‘,§’ÓQ:VÐiÐI Ýñ´S Ugâ1ÃH–UyŽØm"é™94˜J1NÒ ™ªÔ˜è‡j)„‰HyŒ=PƒHÉ3æ0y¤–AU‰?1ÑÏ}T!”&eVó+lKy ¶3«ÌvÃÕB-·¥^c¶(SHöëµYÔú a#%åyŒd-Ûj­üGlOT ËzUæ;bú¢Kmá¡Ú´*fñÑÏ®Q|æm>emŒz¸Dgó°õA€ß/˜í‹ê¯ÙÎoßœ¿oIñF¯kÿ‹£³lϘíŒú®pÒ¯1ÛT,¤mW˜í‡ªË`Êjó+l=Q°ÃzUæ;bz¡)†ÎuyŽØz¡–UyŽØ¾¨E–íí?¶ÃÕ¹e6~#¶¨X-›&¯2¶ÃÕ·dªó+l=PÓNݦò¥ù•¶'ª5‚Þ“æ;aꃽ*ó°õA‚Þ“æ;aê-"Ò ó°Ða£Ió*a–ÃÎeí!339Š¥TiL ‹g.sК©Ù˜µ^c×a“LÔò«Ìbú¨b™­*󰽪°k¦Ù]s3Ë(zöÍfR¼ÇlOUµf`ÍV~#ULS5<ªó°õF ã¨[ g3¤ÅõpPÓµ¥^cõP½³y&­=ãUŸlÝ–Ÿ1†‰¢²ó€Þ²R´èzíN®^ÑÛÐ~Ù£dÕËÚ;bz£^Ý©Jjó°õDÚe¢§';.ñÐ"ÛE}»zU,Ý£ÝÛ7¥^cÝ TíË*¼Çl'j9™a¢f{*Pï1»FÅ+Rʯ1‰ê¡ûV´«ÌaéOÛ´UyŒ= 0Ãkffv“ó“‹h¢iZ3µVÛ÷@)Ò¾{ÊÛt3LØÈUæ;a;Q:VU;jí ‰›L^Ý®ŠûfçiW˜Ä÷AíšÌU/Ìaî¡.°…U0ÌbÎÕYb™¥2Ú»BiWŽˆ»ÑAJÔ²«Ì­±=ö4iW™[aîŒ<Ãiefj˜I=ã¢5×µ Í)´Ú»@'´tB÷¡ûV|Kó{¨^Ù¡;U?ÌaNÒYQFC!&/ª*)›˜3Tÿ1Œè~Ù©åW˜í‡ºlÖ•yŽØ{ªS-¥©‹Ó¼œ¤ø„YÚŠf²ÍRüÆ'ª·jyUgâ1=T/jÙί1‹èIúvÒAW|iuìªVô«Ìbz¦kį1‰ê¡ûfüK?¼vÃÝy†Ò¶€*‘T§$Œjvª©¥oJ¼Æ3è%S"ÉyŽH{¨JПi~cUS[(4/(Îsíš,ípWÚµ)Í^cÐ3gæW˜ÃÝAíÒ¯1‡û;®™¡PКˆPTûG4£S¿lö¬åíyŽØÏºfΕy•¶ììJÈÈUæ0½éösŠvÍqïX߈é^÷?Æ/íYžUy•¶3µdø¼ÊÛ×`•HÏâó+ljw¡{FJ²«Ì­°½û ûV™[c>ûÚ3ø¼ÊÛ}‚4Œåíy•¶/û(Ï´jñµ^em‹ga¡H̾o2¶Äÿg`½«9мÊÛ}ƒlŒêó+l?ÙÙBiYÒ¯2¶Ãß`ý£_‹Ì­±=öAíZ/2¶ÃßeÕ“^em‡¾Á V†uy•¶/º¦kJ¼ÊÛÕ §/u9Γ, ÿÚb詚–}f¨™§hgæ1v›Í=fDÃMš‚%ò‚-:bï ® |ºÌg”2Ã\ºÌ6ƒ±§Y†ÕL4p¡+.‹ft˜ÖÑ\¹u˜›BöíÎ`t±6 ÀDúÌ5RCi/84K9Ñ·BÃðLe0×.³F‹m“mœ¦U†Zl—3öì´ŒÂ/kEƒ Ë>³Úa°glùÎØmDÜC\ºÌYªç§e*}õg:c]­*¥†ùu˜›PÍ;\ºÌ6†švŶë0Ñ:fPZœæ¬çL^ÖªÁ††f3µ ®]fT›–y e3Z'HÓf²E¥6ÚaÚÝ,6të16  ´4ë0Ú²ØI6ÌœÂZ¬S4Ña²g;©§D;Z)‚Õ™u˜mF}»yf|Çl6Œ>Ãa•‘2BIÊtE–èÓm7†œ¶œè…·@Xj̶r˜m·k<õ˜›F*@aDNÁ¤Å–Š¥†ì6ë1-Ányõ˜›B-#áÎa´sÕ´€Õ“™R3ŸuµUÁk—Y†Ô†¥ž|çl6„nYõ˜m¨i# ‰Ú´ƒl^´[¾]f3´-ò‰‡!QˬÑ7Úoœ²*‘´øO,k®Šà5–ß1ÛÚa»¢Ó¬í†Ð;wd üÊÛ ¢.4€û2™U³'åçKqWÀnYO˜íŒíA‚ß/˜í‡ Ák—Y†Ñ'™oÜ4˜!s´òFºÛ‚¾Ý™dé1¡fc¬í†Ð{v$DºNØm/Ѳ׾P•˜c9ÓÏ¶ã§øÅð&âc;\ËYÛhb•ÌvÄõA€Íì†ÎS £Bœ t°ÚnÎŽ“ ¡f3g)ÛTgÛ331ÒvÅÚ·c$޳¶&Ð{v€”˜ÃhЧjD|ÆFE3VåËâ;a´h0ÖŽ“ ¡à5–GY†Ð°!Öa´ݯø&AíÚåÖvÄÚ ¡År¥=Á-¢RÿhE¦Ïý°Ñ%²Ì²t±t$´Ô¬'l4L!³PAi:O,iV ¶ ÿÄíŒêi­&BÂny:L6‰¥¦ñÔ33œój©„ÖÚvÆt<&ÿà˜j &ôt˜ !´Éw9ѵU Úc;P°‘3´Ãh0›°ür˜hà  ­ÀrÈZt½ª¯„ÞŽ“ÔeHi?ö˜m,¶í1e£ 2ÝÕOÆ©ZrN5ÚÕ«†ZÌ:LgPð›É#¬Ãh H”¿ÄÃh3H-L‹IVs¦/j)‚€:ÌM |ºÌ5H´Ü²f,£¨Aa :sÖŠá5ÿÆu\ºÌ4eÆ›-«.M&,£̶YnbÛ¢vñ{Zª`·/ØoϤ¦ÀÎ~&.‰¾Ú06÷Ns¢/[Èhi»ˆ˜Ì'i…·C-5<ÿbhE”dH'’ñ‡ ße•™[+Ì'a@ÓðLM|ºá Ão—Y†ˆU¡©€{É•¿ˆFºÚ(hÿÚam våÖbz 9g“)†Ñ*–Ñôä «)u¢¸-òë1  7,ÿa ÂoAøBN²Þ# NÕ[iÐc]{}E°›Ðu˜ÎÐa·’Ññ0Ðð›åÖa¢.¶Þ3@NDªv®·\Îf3´-Á0Ð`µ—üL4IÆ›÷ ‰L©Úy9cRð-‚ÖŽ“¶1¡–N“¶.ƒ™äé;aèû9ð[÷ÊþÎtóÅ·‡OñŽŒ&´t±6¹– z:NØhia­'l4†¯.“¶&ÐðÑÒvÃh0É.“¶@iÙ9ºNØhX,‰ÙÍiÛh0ZÉ.“¶ ´t°ô:³¶&„jÛ:NØhÖ ::NØm Z:NØh0[ÑÒvÃhMèé;a Âoþ †Œ\F2ÉÈPŸÚaªÞ?ðL] ÂkGI‰´aM1)‰KFCLNâam¸×¸)•"V1E’Û&Vt±6 ºÔórZbãz¼°kB_(=&4ªaµœt±ÙŸì´ÄãZ:LÛeç&,e—G³ ª’‘Kx‚D¤œù¦ya½†Ãt’ÊŸ7\7° TrÊŸ7\_]„”Õ ò7\_]†KT3°‰þc¶» aÒbÈ‘+³î^x¾» %ª Å>n¸ž»µG;HóuÄõØl7I,£]Ÿ¶&Ñ4¦›@Êì…³çžxÖѲÝ$ò}q=vŒçn¸o`ÃT’Ê<Ýq=vJ) «WD®Ìé狽†ƒTSÊŸ7\=v ‡J|ÝpõØ"Õ²ŽNÑÛ h‚NJïQÜÒ±«hx4Sï&›®'®ÈØf‹Ä<Çl=vS Qæ#ÌvÃ×a†¦)Uâ/LŒ½qonš9÷“9xºâzìƒ9n¸ž»…Iân¸zì$Ãt…´•9›/Ÿž/nÝ•\*9ån¸ž»ŒüÀÌvÅõØ"Ý(’5õÃoÜJ™ºb ˆ L^ë‹m QiO›®'®ÁáQ˼<ÝpõØeMQ„’'+;]põØ&[¥- ¨€JEëy9á{vS4zG˜í‰ë°X4vZ<Çl_]†_j4²Ó.×'ÑÉ» áRNSc¶'®À Ric¶»¤Ò<ÇlMìŒ:Š|F€"Wˆ6æ‘åKØS 2<Ýq™Û²– e7\_]ƒI.÷ê뇮Ã5MŠÕ¢Fw»\œñgnØ)…I¤rvºã>»Z£Ò<Ýq}vCÁ¢–Qæë‰ë°’‘Lh&WHUã>igKØT·Gœ§Í×ÞÊÎbŸ7\_]…Aœ§ÌvÄÞÅú"Eï”;2ÃùyãVöÆÿÆ.¦èdmO›®3½œË ‡J|Ýq}vKT:Sæë‰½‚¡½aO›®Ø<*åüÝpÞÀ-Pg)óuÃ{ƒ»óùºá½† [¾g»æë‹½†Öï…üÝq7°Ò™ÝùÊ|ÝpõØ,* )óuÃ×`¨ffSæ;a½†ƒTVȧÍ× ì *-)óuÄõØ<*-#ÌvÅÞÊAª<å>n¸o`ðèå”KóuÄÞÃÿÙjgoodies-forms-1.6.0/docs/images/quickstart-groups_sm.jpg0000644000175000017500000001651012003555436022324 0ustar tonytonyÿØÿàJFIFddÿìDucky<ÿîAdobedÀÿÛ„       ÿÀ|ÛÿÄ  !1A"Qa2q¡ÑáBR‘±br’¢#Ò3C4ðÁ‚²$“D%ScsƒÃÓd!1AQað2q±á"BRbÿÚ ?ú‚&~/h¾ªÖì2ž-ݾª²}ï?ª˜0Ç‹yßꦘg{ŽÿU0I ”á¼vy)`!†vãìö‡g’˜0̇>óíÃÝI[qö‡¢˜aaÇ÷‡¢˜X]øíhìÔ°B㘜{´;»©‹èùżxz*b!qïýáè¦ ˜{ø}a覘_Ç÷‡¢˜aïùÇ¢˜&aïyÅ0*ã¼¾ª, œmå>ª¡î=ï?ª Uaó…êØã8âÝÛS•”FnÛǵßä¤PÌ·ñ}ïU1 …ñvïïòU°@ËÍ<^ÈßÞ{ª`.VËxßßä¤ %ŒÈS?•͸ìÝÝEÂA¨†ëÄ$+d’ÙÚ*ß'Ææ¬gn-êˆY]1ö»{u$ +¢Æò‚)cc¸ öTY5ždF=&RÕ(å㳃>?°RÖ¯K7ÿ+ÁÛ‹³w’«ÖÌœ[ÎþãÝI1Oã¿ÕS ,8¾÷ª˜*‚xݦ±#$…ck#»-˜rÃ:ñn;üÕpôlÃÞûÞª˜ƒ˜{ÞU0@F<_{ÕLâþ/?ª˜ ǽçõSý¾UERÄ¥»ØÜßfI䈠9`Y³pÛVÊËãâ?kÕDD"Ç‹yÞ}¡ã[»O¢ƒ í§^š®ÎÜ¥‘äÜßš-‡Ö¬ë·Y~VO9“húÇíz«N –Ëâíöo’•Rã˜x„{]纈$‹"q×’‚±—âä"àäN,Ûql6n¨×¨¢'‡ã2 Âq|Ød.À ›oz\Ö¬¿¶µ3·Ýíy{ª¹£ûGÅïwêA&$C%‰bÙKmÃfÊ‹×Ëv§ €0¿ðí8vvQÓ?w?זŶfâ;GµÝä«\…ˆÌœGiö»¼”˜Œ§Œì>ת €‹`çíz¨*ƒ˜ ÜÉ~!Éck-…ïªÕÃ’9‹Å¸û^Nê|ÑôS“SÔN’m$Y3¾³PaQ˜‹p³³lÜ·:ný¢[Îq³giôV1¦Têý0I$|ãü5büUwn5ž1׬¿<—õÙÚûGÚ>ŠÖ8„lrŒ{}£Û䥊™›˜vxG´{Ou1ݬ1!íEY+?ÅHsp•@1Ú _ Vq»ûa!š3ª1U…ÉsŠ–`fâ /•²üwÖ®æYÛÏhú*ãš3““â÷aî¦ ;Ha#å[!ÌvÛ Õ1®¹¼³¢êY4Ld·)f»S ŸD~ypRP«¼|ô&{‚yÙ®%wƒž¡ÂÌÇ´|¾ª¸Š%‘s™?†±> ÷vTô½|Ìp4¿§5qéWªÌ–s"˜‰«!PHkñçm×Ý^ŸòÍý®WñÝòÖ½ZÙú¾¥Ã‚ÙH1±-°eãÇ ŸäŸõ‰ð¿V>™úkU¢Öé&n¢ú¸tÓO.YüÑäÁ®vmǾµßòË,ÌÒ~<¾]_Ë—š[ã5XÜ‘Î{bwa^|ubÔ#i:Hš}TªPÆe2ÊÙ@2NÍÀÖrºqòûu¯Óî.d°;Öv?0«ŽG‹©ôl£þlØßlÍè¥T=C£óüÙÆùÇ´ý}wE°ÿœI´<þíG¬ècS+/W”¾TÍyšÖ»[¾Zœ5w E®é&cÿ2”Zþ/4Ø‹·‡vÚ·ÉŸÚ°ëzR¹¿X”lÛ)ýÊc ÝC£‚·ëRx¶»jP,ÝG¢4R×$©ó…†R¢Ï*bÖt¯ôœ¾ºÜ¸–ΦQÄ2X[ƒ¶˜ÖùÖ•ê'3Îdµ÷JîäªÁdê}2_­H,Mÿ»êPÔú3®K°áÌýt ù‡J¶_ÎæÛœ|t¤k4$ê9=E™~%Áæ2±vÊ·7È<Õ—[.xÞ-Fªµb&Ë‚Ü_ïZ©Ó­Ï±µçDø€‹…¾,ýŸ5Ëô?>5˜£N 6ȉÙä°½ Ù¸¬J…Œk«ãä·ò[-L\÷†]DyŒƒR j8…ŇíµTøßtÕéʯã£\ØÛOì¨^—è·?œú*ã*$Dš69Uƒ©78qzžŽ·.¬UË@n@çp« v¸½gIú…õüþ—$jDH‘´ÎܵüBÒƒìë”Ýnú#ª/×FX–=f•C»å1FáWß‹Ÿ™œ{"ÙiEòÕz}+ϪÕiäe†Â8!rÆbÀ-‰>$_ °_Ô ×Ó‹ ¬ÚZr9Ò(bÌVT.ÖQØ Â£w7 axÕ2˜å¸ì†QþÍDÐÂíŽP.ls·ZQ ÉpŽ[(ñ$½§èÕMFÔ)µ’Aˆöeíú´†«ø˜N¢AÈ”Ès7âb k –£WÄUó4†,Œ±„RâÞäžãÙKåxÍZQ[hf ”üœ5XÐhP”$\ƒ€"kì;íHhLê!pèÙr°cø‚ÂØî¨²òÎ%³tö\Á" ”ä°1Xe×Ìt¸í¿®[c×Dsf؃î½öy+NA6 H׌ܑølw Á ‡WˆçŽXnòPW.ª6 ÂlØ|‹RSů29<Í[®¼¸ÀÝÝE³|:O©…gXÙÀ{ ·wu]'Kf‰ÕÀ›˜,ž#vÃÍM>ª78È6µÚß5DøÝÁmL·yE³\±vÕ'[H5ºB¬ÂdÊ0'1°½Eøvú-ŽX¥\Ѳºö†&ª^¶yYsÛç5Q$bU’6Á_2œNÃ…U—)Âe(Ø ‹n¡k?T›QɆ”² Íœª‡`¥˜/ 𦣙ê]1ÕM¥:}H–9Þcˆ™Ã?]Vù†Úº1Õz´‡Ú AêÆuFR‘æÊZÙ±ðÛe± Ùª:áú_Ndf‹V~šÊÍpZDÍb-¸Ôôé³å¥øIUˆ}V©»HžK|õV4ò*Üjµ@ïS4˜ãåªaÑ&i|Të ù²_} G‹QamdûFÙ|ô†)ufvV×L…9³È ½þkVu«×‰B5׉?­›—‘lK>&æû*ß&LZ’jA9µR —<É-j¬à¼“ÝGÅL1Ãñ³´ÒS /5¢u“_2©R|E±ÝQg–{ÇhoÔ¥$)ä¨v½¹vÞ;*VùËúö½†¾LÍQ•6Ys±ÝäªçD}Sƒ6¹ÉÇk°ÝEàé§êO3¨Íkn×óQ81YH kõ®ñN=øŠ~¤I­s¬ÔI—T×F{­ò!±á¿ž’7Û¿‘ÖH$þ,˜7‰‰µí³ZföÙàÑÂÑ⼟]‰ù€¨–ï —M$’g‰câ¶u5wÉâ!Ó\«së…ó6>\*Ÿ/°Ë ÈY^2 ó)7=ÆàÑ:öÏGVÅËìI¿˜ %§ù~V¨2Ì’JšˆÔâêè‚*ú^—,«U]b w(ŸU‰o'»lÕ‰Ÿ)¿‹¶¨?‰œy>—m8ÍL ¨èðD hYà7%Ã$SýÕŸ\;ÊïÝ t­=ðÎ?÷fôÖ¸qDéºp»žÓ$§–—~äqìÜÉ{ûééôQ£Š×Ü¿ÞiXÐFf‘Y,*•lòbMî6î¨Õñ.ž¢Þ.VUÊ3Ë{ã}‡ÉVùf›òÝ9f$5ðþd¾šp€Ý3LZÍ{ÚüÉ{}8 ?OÓˆ$Ÿ VÌ9’ì¶58k¯–€Ð³töX؇SËc$—Uå_æ©s‡L¿ÝúöÚ>clâßù’öV¸qÐCÓíÉÙEFéðoÃüÉi OË¡ \¿ûÉiÁ¬ý#J‘ɬhĈ>&LÊ^FV (Ímf:þN$ŸfÕ…Öpùä7„³•ݺÕqŸ—Œ!erÙÜÜÞÅœ’’3{q‚±7 ç~/!za{ ‰‹æÌÀö“e0‘Õ˜m#½Kƒæª’áÐ2­'¼—'æ¨Z7?Û7¢ƒ4É$º]RGüIEBC[1 þÚVº\²¼öƒõo&9 ê ¬ŠOÃÊ‘YcŒÊ3¾×R£Êõ_õíý¯?ùyågRý_§:\ý=Étž8&f¸LˆX`Nêtÿ^ï?BþYé»§þ Óêæ†(à™N§›$Lñ²©Ž3ã½÷Üw×>ÿŠÉ¿Fçy[5}F +¨”Hs)#—²oß5«“lg¬tÉt°%H³FÑŽDãÀ¨ðÖxo­G¬èÖØMÿžsþÍV ½gG–ö—ýÄý¿V¨SÖô"R7`ÿ‡ÔÞÅ ×tòø‡ü>£÷)®éZGþ/,Ê~Q·û>J‹Æ±¤3”«F€/#Q®|5o•¾Ž· Ìq“wò5¹FN¹Ó×!-%¯ÿ?aú5 õÞœb{´…r›ŽF£e±öh±•:Ö„ …[’F'“7òÎ[páÙMtÏÝ·–´ë:ÍÆý߃7gÕªäu®ŸÌOÄkãü©»>­"£õÞš¿öäÏû´C¯YÐeÈEûc—÷j)4\‰Úiî\™›)À2Ø[ )ñt½üIôh0Dg”çÄÿ3»uêâN×1d‘¤–, ÆËsÌjc2Ø&4)ƒ—ü=ïL>WÈÆŠƒ„{sŸœÓ uØ1ýÜÁóa.”0[ÜeÄ[8ù¨šlÿÚÍLæ2,:žUùX¡ø­‡ž—Ã]3å7ÂoIÑët#O4J€Q‚ ¡¸'-ö^Õ¾Ÿ’õºÇn²ªê]KC¤Ô $ÚW‘õ” e¨¹Qv và;k2Ñ4ýSJúv’8ÙJÀu+¡F’mÜ/–š+~¹¬QŽ\šéÅ¢Ò£›‰ ^Ë)¶ß¥M0OPël4ùn òÉûô”ÆŽ›«êu áÔä°†9#1‡ ‹:‘bÍÙH·Á:‡[ÓtÍ\PŒP[Q~ NÑ{ášä› RùKnckõn›%ÕÂŒâèí˜A¶8â*ÖC]¯0Å¥’çüL©Vb«i!³áaEbÖþ¥Ò 6~*MWfå³ñ{¿ƒ)ÍPžUëuÚ¤éý+Q¢ @¹b—5¬Ðå"äT®›¿-óýY®~£V!àÓ©Û|²ÛüôÖ0?>ýFî¹aÓ¶e¾Ï¯M\^:Ï\*Áâ€`oe”ÿµML:uޝ—øpûKoóSLjè²êõ ¬iJ—2ËàVß³mX×k8t rómsfS½°8lª›0²iæxÐf±‹ÿj‘z„±¢ÄaýÍé£Þ<Íé œWÙæoMÿ`}5³`}5U–lë¥ãj¦ho¦ð×I-’® y`Û.p;~Z2¥‚IVG@]‘ZÇ{fwåÔsaü£U¥–m<Š`HŸLÒ­ÀX†Ý½–ÀÕÕT½#¦Á¦Q Ä“C˜u¢"róÚ¾4ëŒ#ôÖ‘³Bt¡e ψu³eSŽ#`¬Ûï^¼Ùö¬ÑϬÃâƒ2“™~qcßÅQÌDš5Qšu8Ÿ‡Ô~õZm+jtªÄ.¬ xtú‚?ÍCSâàÂÚ»-ñÿM¨þö«(ÝÒR'ê:‰„æY !NSƆrÞM"ÛÃ\;§ëãÔ³…U•ð1;;íKä»ñŸÅ#è&2.Š{Í“0!‡íjë Ôtº~F–1(Ò,3!‚‚. …@­q²õÚMÓ;È©-Y’k(Ì-ucá'eMY®©QtŽ–ÅÄ1¡Œ rMkÀÀp¡Ì|µ-oÆÇ-$§˜aÁÏr-²‰«Ñ´ˆS&¸\‚s»m‰«é5yŽÌÃR²ÓJwwÑ+§kÛTªF žoÛ4«+gé䄦°éudmC3S®WÊ ŒOu#]¾î¡¾u>ÉË{ß vÖµ3pä…VÊÃÅx܃穩$÷ü× b=¶oM5”È;<ÇÓMDå‹ìóM46Nï1ôÓDÉÝæ>šj²ÏÌM>¢D¶eT;@=ôÞé%²U 1lÇ„új²°}ßdújD] `‡^ºvÍñ¬îÊàØ9'nl¸ÚÖª)=¨Æ¯ êšÇrL‹1 \Ü b»1ßAY‡RŸ¥ôcS}IxÇûm(|;¯YµÓ¬²Üû‡ÂêK]tòG¸¿ÏQáÔáxänËÄøUÂÓ´è"—ÊkQ5’]6«-†’@M‡ dyèºÑÑ ™zŽ¡ž&ŠðB¥]7 !þúu^Þ#¯ ŽiÊ?"f9NË›oòÖ¯”»Ÿf>·Òµ}@Â8å1ndèìÈYJf@¤bí+ õZMJ®Œ 2¼2 ÎG¹l™ñ6'Õu½#­6ŠUüÂML–àC Öº•4RI§ÕÇÓº:e&Hr UP¶#NÊpßR·rZTMUÿ¦sc·”ý•ÕrÃ!)}+¸Ç‡–ý–«‹¦/"FÃòÙXn9Mm›i<šYF®t[i$)¸üÃa©Mlý;Xµ +õN[:0âʹ­³}X½÷ú:wlÊŸ<9 ÷n½]g ϔأyDlG˜ÔÒuÉ­½äaóšJY†åµ·}“馲Ш>ÉôÐ6Fîû'Ó@ÙOwÈ}55T4‰3I àBìÜ7À\ÑzËnAk<&Ä{¾ºÔATýŸ]+M×ôÈe‡¨£™&™™ˆÌi#ߘFN$¶Ðn‡Y¢Ô†m,ÑΡN1•p>Biè„ü£ÒsOµBkîóÖ‹¯?+ŸvÌ¿Gîúê¹+E lû½þZ´`Ôõ&Òu QŸÊFIã†I8Ë8pÙ3ZÀ.ê‹«ôC¢EªˆÊHü+…°Ho5 ÖŠ¼éLl¼YN;{ê5|AMñL ­›)¹ÛßVùOJµý‘‰ÕOžû ¤%íõˆ¥Fδ³ê´ðhÃNZB%uŠLŠ¡ß=²mm¨7j,"skpœrœ0òÑc,Azh!œhÜkˆN'Ê*7wû¯ëËjŒ[‡º{<µ§5ZV“NMD‰ ݤ² ŸHŠ :ŸÔ<Á(ѱÕO‘ŒKRJ¥­€-+·¾ˆê”ú8}S颩Ҭ`Ï‘¼¬[‡ka}õí¼oÑiš¼'Â}žñßU=(·„ýŸ]Dcáû¾º ú'ìúè ¾‰û>ºo£÷}tQÿ û>ºƒ<⥜ʷˆ†ÎÆÛè×MÙžE²”6»+Q“[ø|Þºj *å<;ÎîúUaÖô~“¨ ÏÒDØ\Æ·޸ƞˆçËÐ4K…¡Ôê  Ñ,\™ %íe9%æ%¿ee×.öÏ»xÑõ¸óõ‘N=”ž ¦û®ñº¹MrRºž³ÞØ›¶šQ{}YD_æ­P­ª“L?TÚ”Ev‡–€b@9ˈö©ö·S@Ô/TÕª_¥é“ø§GøQ}ê `ý-4sscÔ®oqŠ#½ˆÇ;ȷܨ+oÒó¼ìÃ]4ÊÈ¥×WšXر8‰àÕ=­ð»KÓõš'|/B꾂ñÈc©§U–‰:ÓÄð&£§jc–WÈŠ¨’Ö¿‰€ý¶¦¨Ï¨êó†ôÎZØÙµ2¢ƒ~è¹Çe%º³,PæÔA¥åxVL„a—wgÑ¥]¢:4í.§Y«Ô? ÉÊNß <¡òÕev›¡ôx :(‘±»Áca½ÍAºDPŒØÙVPÙE¼?w×P$q­ß‡káõÕªŒ«Í^dîïôYàÅE¼?w×Q‘-áÛô}tѨ»ë Vþ»ë¦†Ê-áózê •{<ÔUmhÝ@÷µÔu q["…#(ù¦µ(°"{ža馠"©‡yÜ;|´ª5Ô®H"Ãaý´ÒpQ K A•2…Àalú-·tu:&•§e@ì#K‹6À?¶Ìj2àõVºhÒ>‹¬ÒEª‹ñ']AP¦7ΫŽY0̇c†Ñ¾Ú0IÿZ/Tc½*M;ÈTHI¬ ’¼|Ñlq˘)í·¼®Ö—]Mª:f™¢r5š0¯×CËAÌl‡˜æÄZÜTÑÑÓê4ší,V*±ÊoÞ¬v‚ MD˧y,‹¬*nI8UöÖðçõ t£tÑj¡‡W©Pº7”g6^;TùÊj8s·ëEÔô™dd2$„†©’ÙU&[Ü o°SQÓÑkzŠM¤^©¬ÐÄê·O‰™µ35ôè”6nZûÜFö[TÑÔ‡[Ó¥œé¡š9u ˜Ib¦<™ÃXàWš—´vÕÕ[ËRÍÿ°vUÔ0U΃.î”ÐÒ"dblì%"{ƒìM4**qpÜ=4µ@ªóTeöNáÚ;辌Q7§ÝššÉ²§¹÷G¦€_p}‘馂=Ϻ=4Ðr'¸>A馉‘}ÑòM5J—ÇôövÑ &l|;;ªÅžÃgš€&k{;Ogm(c›6íÔ³[ÙÚ;(8¿ª,ø$üß7Ãçkrï{rdæøqËÈæf¶6½¸­Näåÿ´Ÿ™õÜìoñ¶æ\íö-å—K£ÿÛÏÏ`ü®ÿ™Ú^W+âöZ^fobÞ/û[´àlƒþŒøÞ›Èþ³òÔøê3~_•²Þý×ññ_n6¤ÁÐý/ùGÀIùGô™¢Ë›fO†‡“’øåø~]¯n7 ÝÔ¾òWÆåø.DŸÿ¥çÙ†û)Uá:¯ý¯Ì7æ|G3™ñ|Îg1¹×äðgæf¾_Ù…ªð®ÿ´üïë=¾WÇg¾QáåãšÖ¶\oßSè:÷ýÍ›ó[s~+OÌþ?õ<·ä[&ü™­l?mªA»CùGç+ð×øÌš¾eïlÙàçgÏÇ›øY7d¶^Uªëñxv÷vU@̾ý” Ù²·‡gu Øx|Õqcáñʪ75|;gh¢ú0Íô|ÕÜ_GÍ@=χ»eF£æ n+c—ÍP/£æ¢¿ÿÙjgoodies-forms-1.6.0/docs/whitepaper.pdf0000644000175000017500000061263612003555436017025 0ustar tonytony%PDF-1.4 %äöÜß 1 0 obj << /Length 2 0 R /Filter /FlateDecode >> stream xœµYK‹ä6¾Ìð9‡^©$[2,žé6ä¸06a÷’¿Ÿ’íz´JÖx¡YªÇWU_•ÜðÏóÓ·ÁáoœÇKr„áûoÃÏ? ­ÿ¸ŒÎÏ“ùûýç§—·ç'?¦ iò—qxûuø´øÁçáí÷á³ó?o>?͇ãÿ>;ØV¼“¥`6ÅmeÂc÷•ÑMû‡ ¸/&úp4+‘V²½o¦}¸$Z¼nKYÎb!øÃÚǼÑot6À%Ÿ8<˜£xÏ®“ÃwM¢,³iÙ7Áeþ€àÞm+wtñ—384r«ÜŠ¿ã`ª‰"Ð~}õ¯~ÇJ/…ú;È”™wù(6àµ}eäó=øï˜‘àÙ;>Ñ¡çuÏÅÞMÝ3ÝLÚû™VÄønöWýŸÄ ¯¤òÈÒíó$m`ØÓA£¬ÜŒx…ïºPk4S.GTZ¿~ô¨àŽZÈy™#Ášl·ƒ÷bˆ\[œŸ “|<óÇÎ@DD^•®ãLY¿f<•çÄm„ªQN4NãðÆ$çþrIQ”5"˜¼LÖP9"ÑŹ ­(¡u#{òžk²Æ]w:)É®ÓeSÉ”:’ÊÕ€T6n04Y}P9š6sœ“ÐùPy??˜+ É뫳Ǟñ“ ]¾»qÁŒB…hj˜˜Q3›ÐfWIÆ3:¢É¸LbÛàäŒý‰î´É£® ñáÊc^U1Ô‹ìGMœQãgï0ï%:\X¨`ÔfG.$&+— v¸¶³!®õÆÆñ×VFHîJ.Aµ…+ÒINl‘9K¹=vT©*f6nuxÁІu„Ñó¦@ 4ÏÇ1Ш$_xCÔÌFòÓ™ ×ÙŠÕ˜‰‰‰z±–M_l¿dT®Q=v@VÜÍ‘46ÈÛ踖ælåÉ\`ËÂL®Vé3áO@“À‚Ð4Ì¥¡Ä¿©blE!B${##K™J’vÑqÞ Šî2‘c»°6µ¥T&ÁBðÞ‰þTMâ€ÀÙÈù-ú¡– 1Wèî“ ÀÜ@ú÷6‘¼t!¯ÁƒŸ3tCÉA:Y;˜âª`Ù`tÂÁ Gª%òA¥‹º2’Z£êža¾ã”îéFšpUi‚$ß+·Ý¸Ëj‘´­òÄ]±¡H6Õmj !ÌÄ[̬ÚçµIZ¶iÈz'Mz¥W¹ƒËu¨ÔŽž=ÇNŸ©Ó_ªÃ#ì`QÃÏj´¤êûó)@B3IÛýðzÈÑȱãñ¤Ñ-$ªOhD“(Ý©·™ÒR'ÊÈ£Ö ¢Ùž“–bç‹/Ê ¹té°@åñIe’Fe0´ÏÀ¬QÇlõX:¾ ß¿"BAcÊ»°z6ß– b¶É'óðË×ç§aøôÓ×0Üþö3à• |°Y+žùõA¡Ù8ܾZ"r_uS€Èe$]å¡ÿ€48ãŒÜWx!¨Øˆå]‚mgÙ±z®iVí:CR6 ¯¥+=åÌ­ÞrÎëÈx[ÖY¨9û­JtïJ%özTÚjò8Ì´ƒ§^x}*üðíáYK¢Ô†'iækP›¢~m=ÍïºTy„Ùu`çcy®Q ×÷x_œ?fψ6¶BOå%z!–!Qáwg¤ cKÚû9i›[–Zg¿ã†à¸ÂÂ5Ý7Hx«¼ö ~%{pço~üÿ(¼êìí|[õ(YⱯº›[ªÃ9Õ›ÿ?ªKîT“Þ‚î´%ÂSñ8O[DB8¥lû[ìHvnRÒ‡ Š$=ÌÇIÆYÇäÉqïåº{¥µcz™z×2 q¥†#ïŒ\4m ã6}ßÏH «.§\–CËìï¾­.k;®³óÇ»¿ ÿ²¢H@endstream endobj 2 0 obj 2106 endobj 3 0 obj << /Type /XObject /Subtype /Image /Width 584 /Height 488 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 47687 >> stream ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÀèH"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ÄŠY5 ‚¨‡,ªìB€I''æ­­¾ÈÖCý±‰PÆæ1‘ÞãóCE¦C"³ ¶ŸpS‚G”ÙÁÁÇåL–]/ûÔ›;ÍŸi›íKvÅž|¿§nÇס­VXy*pJÖÿ?3Í(Õ¼¤Ù«,O—tVe ÿX©$lÉȨ9ê@ª†é?ç„?÷À©äkFÕµõ† Òa¿{¼Á”þý3…ÚçÜÕÍ'NŠãK3ÁgýÜsf[w‘•„@u@¤I8Ï=¸­(âoKžk­´ùy™T ”ùbÌϵ'üð‡þø}©?ç„?÷À­+[D²½A²ˆîe‘›níøU“žÀU_C¹H]Œ°ùÑÀ. ¶õŒ÷ÔŸóÂûàV¦³¡Ç«{övŠÒÊÝ£Mò³‘¹”qÀ$žIö¦Üø|ZiRËqpñ.¼ Àü¹aO'‚9žiGI¤ï½¿žIØÍûRÏïGÚ“þxCÿ| ¸|;tƳÛ<‰2C2«ÂÏŒnã‘“ŒŒÔ7z<¶ÖÒ\-Ĥ3%òËeÐî?Q‘V«Rm$Èö2]~ÔŸóÂûàQö¤ÿžÿߪí4m5¯)E¯µ'üð‡þø}©?ç„?÷Àª»MM¡dZûRÏïGÚ“þxCÿ| «´Ñ´ÑÊE¯µ'üð‡þø}©?ç„?÷Àª»MM¡dZûRÏïGÚ“þxCÿ| «´Ñ´ÑÊE¯µ'üð‡þø}©?ç„?÷Àª»MM¡dZûRÏïGÚ“þxCÿ| «´Ñ´ÑÊE¯µ'üð‡þø}­?ç„?÷Àª»M&ÓG(YþÖŸóÂûàQö´ÿžÿߪm4m4r…‘oíiÿÖŸóÂûàU]´m£”,‹_kOùáýð(ûZÏïUvѶŽP²-}­?ç„?÷À£íiÿÖŸóÂûàU]´m£”,‹_kOùáýð(ûZÏïUvѶŽP²-}­?ç„?÷À£íiÿ]ìl©›d@µ„qž®:^fŽ…=“ÔÆ·±¾¹gŠÊÔFßtÈñÇ‘êÅ+i—Ãþ]´ñÿo0ÿñUÓé·6á ´ºˆºKmîQ—BbLþÀ¦¯mg$SÆ.n®CvB4õítúè^U\æ´%+%dßó=ZYM)(©7v—õò8Y/$±º+,F"‰#Æ>¼zÑG‰—ý4úu·ÿÑ)EzhºI-ZLä‡îÛ‚{2MQîóü†0È«/?#`õ#¥\fÔ[O†%ñ.&Ydg:~T„ 3·<ߟ½_ðF§ê\ë4Æ©·çeÆwg¡‚ºŸøDô/ùñÿÈÒñUÜFÛ54î»[õõ"•:œ·¬Î>yåkNIu´[\gȃt§ndV2€0 ÷¨¬o¡°’)ÒÌÉs…ÖO´l]§#¯qÖ»_øDô/ùñ?÷úOþ*øDô/ùñÿÈÒñUñøhAÁ)Yú~ŒSÃU”¹›G,¾"˜Ú¥­ÅºÍ—"ÊžfÑ#3nÜ8;H=:Ô7úä×Öâ7 Æ%‰ÊÞ¸ŒÔù`’898ö®¿þ= þ|ò4ŸüUð‰è_óãÿ‘¤ÿâ©,n ;¨>ÿÖ£öÿ™ÌÞ%’Y/‘,irÈØ‚ìÄêÊÈ`½0~µPk m)awv¹ûJ?ÚX”l`d°bÀ zt®Çþ= þ|ò4ŸüUð‰è_óãÿ‘¤ÿ⨎7 ÿá¾`èW{É£kÀ\4°Ù$^uÌwÎÝæ;°£oÊ sÔÕiu3-•Õ¹GÚnÃ7™xéÏ^¼Wiÿž…ÿ>?ùOþ*øDô/ùñÿÈÒñTãÂGh¿økyù xzïy/êÿæyïËGË^…ÿž…ÿ>?ùOþ*øDô/ùñÿÈÒñUÓý³G³ü?ÌÇêîyïËGË^…ÿž…ÿ>?ùOþ*øDô/ùñÿÈÒñTlÑìÿó¨O¹ç¿--zü"züøÿäi?øª?áпçÇÿ#IÿÅQý³G³ü?Ì>¡>çžü´|µè_ð‰è_óãÿ‘¤ÿâ¨ÿ„OBÿŸü'ÿGöÍÏðÿ0ú„ûž{òÑòסÂ'¡ÏþF“ÿŠ£þ= þ|ò4ŸüUÛ4{?ÃüÃêîyïËGË^…ÿž…ÿ>?ùOþ*øDô/ùñÿÈÒñTlÑìÿó¨O¹ç¿--zü"züøÿäi?øª?áпçÇÿ#IÿÅQý³G³ü?Ì>¡>çžü´Ÿ-zü"züøÿäi?øª?áпçÇÿ#IÿÅQý³C³ü?Ì>¡>çž|´|µèð‰è_óâïôŸüUð‰è_óâïôŸüUÛ4?•þæPŸtyçËGË^‡ÿž…ÿ>'þÿIÿÅQÿž…ÿ>'þÿIÿÅQý³Cù_áþaõ ÷Gž|´|µèð‰è_óâïôŸüUð‰è_óâïôŸüUÛ4?•þæPŸtyçËGË^‡ÿž…ÿ>'þÿIÿÅQÿž…ÿ>'þÿIÿÅQý³Cù_áþaõ ÷Gž|´|µèð‰è_óâïôŸüUð‰è_óâïôŸüUÛ4?•þæPŸtyçËGË^‡ÿž…ÿ>'þÿIÿÅQÿž…ÿ>'þÿIÿÅQý³Cù_áþaõ ÷Gž|´|µèð‰è_óâïôŸüUð‰è_óâïôŸüUÛ4?•þæPŸtyçËGË^‡ÿž…ÿ>'þÿIÿÅQÿž…ÿ>'þÿIÿÅQý³Cù_áþaõ ÷Gž|´|µèð‰è_óâïôŸüUð‰è_óâïôŸüUÛ4?•þæPŸtyçËGË^‡ÿž…ÿ>'þÿIÿÅQÿž…ÿ>'þÿIÿÅQý³Cù_áþaõ ÷Gž|´a}kÐÿáпçÇÿ#IÿÅQÿ–ƒÿ>?ùOþ*횟áþaõ ÷<ó ëFÖ½þ-þ|ò4ŸüUð‰h?óãÿ‘¤ÿâ¨þÙ£ÙþæPŸsÏ0¾´a}kÐÿáÐçÇÿ#IÿÅQÿ–ƒÿ>?ùOþ*íš=Ÿáþaõ ÷<ó ëFÖ½þ-þ|ò4ŸüUð‰h?óãÿ‘¤ÿâ¨þÙ£ÙþæPŸsÏ0¾´a}kÐÿáÐçÇÿ#IÿÅQÿ–ƒÿ>?ùOþ*íš=Ÿáþaõ ÷<ó ëFÖ½þ-þ|ò4ŸüUð‰h?óãÿ‘¤ÿâ¨þÙ£ÙþæPŸsÏ0¾´a}kÐÿáÐçÇÿ#IÿÅQÿ–ƒÿ>?ùOþ*íš=Ÿáþaõ ÷<ó ëFÖ½þ-þ|ò4ŸüUð‰h?óãÿ‘¤ÿâ¨þÙ£ÙþæPŸsÏ0¾´a}kÐÿáÐçÇÿ#IÿÅQÿ–ƒÿ>?ùOþ*íš=Ÿáþaõ ÷<ó ë[:=ÌqGlDV÷Þi]àždŒ8tUソ>•ÕÂ% ÿÏþF“ÿŠ£þ-þ|ò4ŸüUgW5¡R6³ü?̸`êAÞèÂÖnÿ´-m+M´pጉ}o’0xà_Ò³­-"†Úâh„¤Ü–(áÕ<È‚.Yr:ŒœgŠë¿áÐçÇÿ#IÿÅQÿ–ƒÿ>?ùOþ*±†aB1å³·ôº¶i,=Fï¥ÎuĘ̂gµBëFJjÖàª89ÇJ†Y#‚4ù#†’àÿÇìS»´‘ìèçÞºøDôùñÿÈÒñTŸð‰h?óãÿ‘¤ÿâ¨Y…?ëæ?/ëäaéú“@>Óf¶#[Ç<·1£BÊ[åb3œpúâ›öë¶Óî,î~Ås¹d2_ØŸûÀïϯâs½ÿ–ƒÿ>ùÿøª?áÐçÃÿ#?ÿ^mJxIÉÊòÖýºžùû½9ù]o­_Ìí…ªÛ-żÛ÷«È”6Ò—²òß#BâÒÊé.líæVq# "V€Û¸äuÇô© @Û³ g{‰*>fÃqµp}‡¥ 1-uR×Ã:mÌóFñµ²Ë5Ù·i|¥Ø¤@û˜œ’\tÇ*Èê3Y†ÃN2¬¦ÂÔȲ•¼•ÈsŒ¶q÷Ž=xoÍ  ®_T¼Õ#µñ!µXÚ(wm•®™/ôt?"…= ÈärONµÐyµuo{$“ˆ&ÓÒ þürÙ—/ò…;ˆàc§L Z¾¯¨\iÚ¢=ª­‹ÅwnŽJ”YAó2Ä”?.ÁŒ“’'RÓS¾k˜Zv·k{›ÉíQ6WO,Ɇ,X†È‹¦ÞöÁlíK<ÓÚÚÉs4~\òˆ@2ŒAÎNÞžÔÛ-:ÊÆYg‚Þ1<®îó]í½ËX ‘“ǰ«š3UüÚ<ÚXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmXͪþmmqߎmìí§þËEEñ%·[ÙÛOý–Šú'û¼>›9%ñ¿ë¡7ÃÛx§·ºóC«6ÈËÝý®Çû>×û’ÿàDŸüUr_ ÿãÞïýØÿ›Öñž(í-î纙.'Q ½Ç@HòÇFqÓÓœœ×‘šÕPÅJÿÖˆÛ Óûÿ2ÿö}¯÷%ÿÀ‰?øª?³í¹/þIÿÅVtzÚ%Â,ò—Á’ÎT!²ç9Éü½ëg5Ç ŠjèÕ«ÿ³í¹/þIÿÅQýŸkýÉð"Oþ*±¬Æ“ ÝÌšœv½-°Î«ó<Àã>ÛsøU ÷ÓåÖ,N™²¤s'˜`DÆL±ã8éßúöÎk›T„uÙö¿Ü—ÿ$ÿâ¨þϵþä¿ø'ÿV3\þ¥«i~öóÜÚÆÖèÀæT¶äéÝ·W× äì„Ýìû_îKÿñTgÚÿr_ü“ÿЬ-+V±µÔOŠñfŠáTÄRDtþlŒáO8^Ü“ïÏKšNëq­JÿÙö¿Ü—ÿ$ÿâ¨þϵþä¿ø'ÿV3XZþ¡×û’ÿàDŸüUÙö¿Ü—ÿ$ÿâªÆhÍ¿ö}¯÷%ÿÀ‰?øª?³í¹/þIÿÅUŒÑš.ìû_îKÿñTgÚÿr_ü“ÿŠ«£4\ ÿÙö¿Ü—ÿ$ÿâ¨þϵþä¿ø'ÿV3Fh¸ÿ³í¹/þIÿÅQýŸkýÉð"Oþ*¬fŒÑp+ÿgÚÿr_ü“ÿŠ£û>×û’ÿàDŸüUXÍ¢àWþϵþä¿ø'ÿGö}¯÷%ÿÀ‰?øª±š3EÀ¯ýŸkýÉð"Oþ*ìû_îKÿñUc4f‹_û>×û’ÿàDŸüUÙö¿Ü—ÿ$ÿâªÆhÍ¿ö}¯÷%ÿÀ‰?øª?³í¹/þIÿÅUŒÑš.ìû_îKÿñTgÚÿr_ü“ÿŠ«£4\ ÿÙö¿Ü—ÿ$ÿâ¨þϵþä¿ø'ÿV3Fh¸ÿ³í¹/þIÿÅQýŸkýÉð"Oþ*¬fŒÑp+ÿgÚÿr_ü“ÿŠ£û>×û’ÿàDŸüUXÍ¢àWþϵþä¿ø'ÿGö}¯÷%ÿÀ‰?øª±š3EÀ¯ýŸkýÉð"Oþ*ìû_îKÿñUc4f‹_û>×û’ÿàDŸüUÙö¿Ü—ÿ$ÿâªÆhÍ¿ö}¯÷%ÿÀ‰?øª?³í¹/þIÿÅUŒÑš.ìû_îKÿñTgÚÿr_ü“ÿŠ«£4\ ÿÙö¿Ü—ÿ$ÿâ¨þϵþä¿ø'ÿV3Fh¸ÿ³í¹/þIÿÅQýŸkýÉð"Oþ*¬fŒÑp+ÿgÚÿr_ü“ÿŠ£û>×û’ÿàDŸüUXÍ¢àWþϵþä¿ø'ÿGö}¯÷%ÿÀ‰?øª±š3EÀà~%[Ž—”nó3ºFoîú“EIñ?þ=ìí§þÉE}ýÞ?Íœ²øßõÐwöÛouþìÍëY4›¤?.¢‡€ ´!G}î€SÜÖ7€"’[{Ÿ.e sìòþâºï²\ÏÜøøºò³Jqž&\Ë·ä°í¨+yþek³Ëç\L'•xBhAß'ŸOÇ7üßz‡ì—ó÷þŸþ.²\ÏÜøøºâŒU‘«mîsú­¦¥$Ñ%´78ÚVfŽe@Ûä.?ˆ#žÿC† $²Ýmu””4Í-ºàJ¬§ÏE üë¦û%ÇüýÇÿ€çÿ‹£ì—ó÷þŸþ.šIɼßzç/¼’ͪFÖâFh›ËÇqÉ2¯;˜Ž­ß²\ÏÜøøº>Éqÿ?qÿà9ÿâêá'tL¢¤¬ÎN×KÖ&Õ­d½ˆG R¬Œÿ/yèõ ÇÚ»/7Þ¡û%ÇüýÇÿ€çÿ‹£ì—ó÷þŸþ.‰ÍÍÝ„b¢¬‰¼ßzÈÖôæ¼’;˜4‘Œ29#zõ?Ÿ§^¼VÙ.?çî?ü?ü]d¸ÿŸ¸ÿðÿñu)«0”T•™ÏG¦^^¼Q]ZÅiie£¸¾q>c×uÕÓù¾õÙ.?çî?ü?ü]d¸ÿŸ¸ÿðÿñt”R ¡°Ûëx¯aÙ' >ëwSY¶ZYûCIxª·Ê€ä1õ>ÞÕ©öKùûÿÏÿGÙ.?çî?ü?ü]QDÞo½djÖÓÜ]¬‘G½BÀs“ê}ëGì—ó÷þŸþ.²\ÏÜøøº€`µ…ã.<ŒÀ×ük¤ó}ê²\ÏÜøøº>Éqÿ?qÿà9ÿâènàMæûÑæûÔ?d¸ÿŸ¸ÿðÿñt}’ãþ~ãÿÀsÿÅÒ°y¾ôy¾õÙ.?çî?ü?ü]d¸ÿŸ¸ÿðÿñtX ¼ßz<ßz‡ì—ó÷þŸþ.²\ÏÜøøº,Þo½o½CöKùûÿÏÿGÙ.?çî?ü?ü]o7Þ7Þ¡û%ÇüýÇÿ€çÿ‹£ì—ó÷þŸþ.‹7›ïG›ïPý’ãþ~ãÿÀsÿÅÑöKùûÿÏÿE€›Í÷£Í÷¨~Éqÿ?qÿà9ÿâèû%ÇüýÇÿ€çÿ‹¢ÀMæûÑæûÔ?d¸ÿŸ¸ÿðÿñt}’ãþ~ãÿÀsÿÅÑ`&ó}èó}ê²\ÏÜøøº>Éqÿ?qÿà9ÿâè°y¾ôy¾õÙ.?çî?ü?ü]d¸ÿŸ¸ÿðÿñtX ¼ßz<ßz‡ì—ó÷þŸþ.²\ÏÜøøº,Þo½o½CöKùûÿÏÿGÙ.?çî?ü?ü]o7Þ7Þ¡û%ÇüýÇÿ€çÿ‹£ì—ó÷þŸþ.‹7›ïG›ïPý’ãþ~ãÿÀsÿÅÑöKùûÿÏÿE€›Í÷£Í÷¨~Éqÿ?qÿà9ÿâèû%ÇüýÇÿ€çÿ‹¢ÀMæûÑæûÔ?d¸ÿŸ¸ÿðÿñt}’ãþ~ãÿÀsÿÅÑ`&ó}èó}ê²\ÏÜøøº>Éqÿ?qÿà9ÿâè°y¾ôy¾õÙ.?çî?ü?ü]d¸ÿŸ¸ÿðÿñtX ¼ßz<ßz‡ì—ó÷þŸþ.²\ÏÜøøº,Þo½o½CöKùûÿÏÿGÙ.?çî?ü?ü]o7Þ7Þ¡û%ÇüýÇÿ€çÿ‹£ì—ó÷þŸþ.‹7›ïG›ïPý’ãþ~ãÿÀsÿÅÑöKùûÿÏÿE€›Í÷£Í÷¨~Éqÿ?qÿà9ÿâèû%ÇüýÇÿ€çÿ‹¢ÀMæûÑæûÔ?d¸ÿŸ¸ÿðÿñt}’ãþ~ãÿÀsÿÅÑ`&ó}èó}ê²\ÏÜøøº>Éqÿ?qÿà9ÿâè°y¾ôy¾õÙ.?çî?ü?ü]d¸ÿŸ¸ÿðÿñtX?â[n·²ÿ¶Ÿû-Äx¤ŠÞÏÌ™dÏ™ŒG·wÜÑ_C„ÿw‡Ïóg,¾7ýt.|8ÿ{¿÷cþo[7ž"¶²¸6óù¦EUc²G*RãÖ±¾ǽßû±ÿ7¦_ÁÇŠ.Œ‚wòñ» n3ÇjåÄSLeNn‹ôA8ÒVïú³XxªÈö¸ÿ¿ ÿÅÓ‡Š,Ïü÷ÿ¿ÿ‹®xi/˜b™ži#È Êʪ¬B‚H!‰Î:`Ò¶“sëìɱ‰ÈØ6† Ü| ©'ž~VÈàÔýZ>Ö¡ÑZùïÿ~ÿN#µ?óÛþüþ.°£ÒÙå‰<è¡ó¶,~c1Þ̪Ø^>øëëÔã5-†•%ÂÛÌÙò$‘U𬠂Ûs’6žObKÃÑE*µ ‘âSÞoûò?øºp×­yïÈÿâë +!;ˆ[{lˆüß¼lup9¤šÝ­Ä{Ý uœgÓ¯ééŒÏÕéµ™¾5ËsÞ_ûò?øºpÖ`?Å'ýùü]s«R­'‡€ÕYãW„ÿŸ÷äñtáªD‰ÿïÈÿâë jU¨t W´‘²5(Ïñ¿ýùüU8_¡þ6ÿ¿_ý•d-Jµ”GÎÍAz‡øÛþýöTát§þZûõÿÙVrÔ‹PéÄ®f^ÿËOü…ÿÙS„¹ÿ–Ÿù ÿ²ª‹R­CŠ)6X Oüµ÷ëÿ²§ ÇþZûõÿÙTKR-C)bF ª¦¯˜PÜoÄŒUBF Rs–Þ«–_ñìµÌø×¥¯ýt“ÿA޵ÃSJŠ2ØŠ²qƒh·ÿ e¥Çýø_þ.—þË/Kûð¿ü]biÚT7p-· ¹Ø“€3ŽÀšƒS²†ÑÂûòøÜ3ƒÁõµS¹¨$ï{ZÕek£¢ÿ„®ËÒãþü/ÿKÿ U—¥Çýøü]rGæÍ[Ñ7°]Îp«“Ԟ®Ϧ²L°Ä·öïo´Ä ¹À9,F3Ç8ç½v<%ìÌjŒèÿá)³ÿ¦ÿ÷àñtÂQgÿMÿïÀÿâ뛋L»–O-c@Û‚®éUw“Œm$üÝAã=G¨¥eÙU"4;”0U'‘•ÎrAàu<àqKê´?¦?mPé?á'³ÿ¦ÿ÷àñtÂMgÿMÿïÀÿâë›OºFR0L…@]ë¸n W9ärxäzŠš-.wå¢#Þ¬%Bó(#vpÍž¾ž¢“ÃP_ðãöµ ÿøIm?é¿ýøü]/ü$–Ÿôßþüþ.¹«Kqs#©&ØžANíªNåþzTBªRØ^ÚgUÿ ¯ý6ÿ¿#ÿ‹¥ÿ„Š×þ›ß‘ÿÅ×*)—Õ)‡¶™ÔÿÂCkë7ýùü]ðÚúÍÿ~Gÿ\À¥¾«L~ÚGOÿ ·¬ß÷äñtoÛzËÿ~Gÿ\Ð¥¾«L~ÚGKý½më/ýùü]/öí¿¬¿÷äñuÍŠp¥õjaídt_Û–þ²ÿß‘ÿÅÒÿmÛúËÿ~Gÿ\𥾯L~ÖGCýµ÷¤ÿ¿#ÿ‹£ûfïIÿ~GÿXœ)}^ídolAýé?ïÈÿâèþׇûÒß‘ÿÅÖ§ ^Âö’7?µáþôŸ÷äñt¿Ú°ÿyÿïÈÿâëœ){ÚHÙþÕ‹ûÏÿ~GÿKý©÷Ÿþüþ*±…8Rö0i#cûN/ï?ýùüUÚQÿ}ÿïÈÿâ«$RŠ^Æ#çf·öŒßoûõÿÙRÿhGýöÿ¿_ý•e p¥ì¢ìÓûz}¿ï×ÿeKöäþû߯þʳE(¥ì¢>vi}µ?¾ß÷ëÿ²£í‹ýóÿ~¿û*ÏáKÙÄ|Ì¿öµþùÿ¿_ý•/Ú—þzûõÿÙUJ)rD9™wí#þzûõÿÙRý ÏCÿ~¿û*¦)—"3-ùãþzä/þÊ;þšä/þÊ« p¥Ê‡vXóé§þBÿì©|Ïúiÿ¿û*®)—* “y‡þzä/þÊ—qÿž£þýöU§Š›!Ü“-ÿ=Gýúÿì¨ù¿ç¨ÿ¿_ý•0S…!Žù¿ç¨ÿ¿_ý•2Gh¶Áƒ61³ÔÓÅEsÒ/÷Çò4€ã~'ǽý´ÿÙ(£âwü{ØÿÛOý’Šú 'û¼>›9eñ¿ë¡7Ãø÷»ÿv?æõ[[­õù$À©Ï£Bþ†¬ü8ÿ{¿÷cþo]|z6›s sOg’:)fnIàW.&ª§Œ›kú²ÁÎ’K»üÙÀ¦«7Ù¡·’(dŽ5e`Àæ@JŸ˜ƒž6.1Ž”öÔça8TŽ5™ ¨?(Q´`’Hùr<†5Þÿ`é?óáåQ^èúe½Œó¥„£œ2j>µåc.ç'eªF®’]ÆÀQ¡P‡ªª¯]ýC};E©Kå#ˆMµÎÁÝ…*WŒíãjöí]Út1E#Çeo3DFèÅœ©»æá²sëÒ¯ÙiÚ=í¤w0ت«çåu*ÊAÁz‚¨úÄ;ÙK¹ÉE~c Ço ìmñ›÷mÈ瞃®GÉ%iœ;U^=?•urA¡Gz->Æï.à­å[É"¡8ÀfPUN<‘€Aèjïö6›ÿ>‰úÑõˆö²}Î!jU®ÏûNÿŸTüÍÙüú¯æi·J÷±™Ì p®—þ‹ùø—ò¿ðŒÁÿ?~B­Óc3›¢ºOøF ÿŸ‰?!Gü#pÏÄŸ¥õªcö29ÑJ+¢ÿ„rùø“òÂ;üüIù _Z¦?c#Ÿá[ÿðCÿ?ù _øGâÿŸ‡ü…/¬Óc#RŠÝþÀ‹þ{¿ä)°"ÿžïù _Y¦?e# S…mÿaGÿ=ßþùaÇÿ=Ûþù¥õˆÙHÅá[?ØqÿÏvÿ¾i±þ{·ýóKëg#œ+[û?ç»ß4¿ØÉÿ=Ûþù¥íà?g#$S…jc¯üö?÷Í/öBÿÏcÿ|Òöðg#0RŠÓþÉ_ùìïš?²‡üö?÷Í/mò38S…heùìïŸþ½/ö`ÿžßøïÿ^—µˆù@Rнý›ÿM¿ñßþ½/öwý6ÿÇúô½¬C‘”…8UÏìÿúkÿŽÿõèþÏ?ó×ÿÿëÒö‘+*ŠQV¾Âç¨ÿ¾úô¿a?óÔß?ýzŸiåeaN?Ø›þzûçÿ¯Kö6ÿž£þùÿëÒçCåd"œ*_²7üõ÷Çÿ^²¿üõ_ûãÿ¯K•‘Šp§ý™ÿç¢ÿßýz_³¿üô_ûãÿ¯K™ÃëqÓÜß#ß.Ó®íf·†8.!vXÁ(Œ °ú ³1ŒBæ}žVÓ¿~6íïœö®CS2=6UÔ æ(ù¥ò g“ÿ<³Ÿø}ÏZ›Ci¤‚'ŸÿF½b6«áq?–ºTl™Í‰·ëƒóqô®ŽÁ­Ê&°‹b2‚5Ú£žxíÎsïK™IèDv‹1d·Õ¬åŠÚÅ.J}´ÌÒÄaòž9&Þâ@ÿ8*ÀÙ׃žp¹6ž»þUÅ´ò¹hìÌ`Ü‘®dD´•´Èçs ¥²Û°£‡ Q°Ë7£eÎ8bjÕ¾‹wog©³Cç]MåÄYDÌñy0¬›K¥Ž×å”*»†ÇOUoõ M65ì¾ZØ;Iû¨Îz9ÿiW¶z ’Kiá´EbYŒ  an@ÛÊd”ð=Ï'’ÝM¢jI,“Ë;µëÚÚ–Œ"4†P¬䫟¼Ä ÇŽª›,‘ÃË3¬q¢–wc€ u$öÍjú+—–;K<=¨ŠÎ]ÊMœùrÓçp$²1eÜÄ¡'3BóGkÝBúHm¥šÄ^ÊLVÉoÅ/‰†Ã†YT‘ó$zº«]WN½•#³½‚á]…ÃŒ.ÝÜŽ׎¼ÕÊääÐî$·½µ¸±ûMÝÅ©†ßP–D—ÈÜFUœáùpäí\ùêH7–¬|= z~”Öæ+ˆekå!'Wla¶d€O^þµ£i¨Z^cìòîÝ’›”¯˜£dÈ—æ_˜dr9« $nΨêÍmpJœƒèpAú@æ£a{~·7OdËÊà –„C$Þ\fF 7“âî8$€ªNwm#H¿´\¾ž²]ýâ³–çË&Ô¬“”°üªVH×äÀW]Es¾Ó§Óî¯GÙ®m­"òÒe·OœÞBÁòô)É8ôPM—ü{->?¿/ûÿû(¦YDzÓãûòÿ¿ÿ²ŠÈ¢J*†±-Ü6ˆöi#5DžZ†pʃÔôõëT!ÖâŽÓÏK¿µ &HÕe6ˆ°çyàò¯^ÚFŒ¥¢Òvfõº'hbŠß|²M$xYS°d•nùc8ú޵ ^"y¢–9?fkƒûÞV Žžß™ZW©Ø^Ò=Íê+_$QÈïk _³­ÄCpË)m£>œ‘ëÇ¿Ÿð Æ5·I\O?¹˜2¶ðH!ˆ<Ž>´{ ƒÚG¹·Ea¦±s>§km1Ʀib˜ÎJpqÓRxã©Ø‘Ý1²—=v²ŒßDTΜ¡kõ*2RØ’ŠƒÎŸþ|¦ÿ¾âÿâèó§ÿŸ)¿ï¸¿øº‹OEAçOÿ>SßqñtyÓÿÏ”ß÷Ü_ü]z*:ùò›þû‹ÿ‹£ÎŸþ|¦ÿ¾âÿâè°ÑPyÓÿÏ”ß÷Ü_ü]tÿóå7ý÷ÿE€žŠƒÎŸþ|¦ÿ¾âÿâèó§ÿŸ)¿ï¸¿øº,ôTtÿóå7ý÷ÿG?üùMÿ}ÅÿÅÑ`'¢ ó§ÿŸ)¿ï¸¿øº<éÿçÊoûî/þ.‹=?üùMÿ}ÅÿÅÑçOÿ>SßqñtX è¨<éÿçÊoûî/þ.:ùò›þû‹ÿ‹¢ÀOEAçOÿ>SßqñtyÓÿÏ”ß÷Ü_ü]z*:ùò›þû‹ÿ‹£ÎŸþ|¦ÿ¾âÿâè°ÑPyÓÿÏ”ß÷Ü_ü]tÿóå7ý÷ÿE€žŠƒÎŸþ|¦ÿ¾âÿâèó§ÿŸ)¿ï¸¿øº,ôTtÿóå7ý÷ÿG?üùMÿ}ÅÿÅÑ`'¢ ó§ÿŸ)¿ï¸¿øº<éÿçÊoûî/þ.‹=?üùMÿ}ÅÿÅÑçOÿ>SßqñtX è¨<éÿçÊoûî/þ.:ùò›þû‹ÿ‹¢ÀOEAçOÿ>SßqñtyÓÿÏ”ß÷Ü_ü]z*:ùò›þû‹ÿ‹£ÎŸþ|¦ÿ¾âÿâè°ÑPyÓÿÏ”ß÷Ü_ü]*Ë1` œª ä—ɨ°T]"ÿ®ƒùž ºéýtÈÒŒøÿö?öÓÿd¢‰ßñïcÿm?öJ+èpŸîðùþlä—Æÿ®„ß?ãÞïýØÿ›×Uq+Cö"—VöÒV %Âî@smËž3Þ¹_‡ñïwþìÍë¾´ÿ8?ëšÿ*óó÷©ü¿$iCøkçù™V³O=ü ê672¬Rå ˆ…PLxonsÎsÈãÞŸâ4»m ïÊ‘p3RÀÙnsýßÏ×+Q¶ÒŒb5Æ1Ǧ?!ô-r=Mº±çÐJÇK1´ÞB*7ú»€<ÃÏ Sž™ô®‹Áb_ìVi òÞv0äçåÀŸ0oçÞ¬Iáý!ïQÚÁ9°‚dc`ù>¾‡œk",h©…E*¨ÀÐVP§ÊîÌiÒpwlä¦Óu7Ñ/æóYÞ[ùìá†Y¼Æ3*ÛŽAHƒÊóë>¯ å»ËRêRÈ-A°tik¢\±“gËŒ˜¸| ­›^ÂÚw‚i˜H˜Ülq‘ž zbkškÈ‘¬í¹Ø"æ'$àvõ5|ÑÚçE™ÎÇ&¡*ܶúƒê"âõ\Êd0ía_3÷Y"/<ñº©_ÙêiS$M}yïv+ÚN…XÚÜ)Çœí!ÉhÇeÉd–®§XÕ`Ð`‰…®ä•Øâõ“ÿ Õ·üøËÿ}ЏÆRøS"[KvV½[ó5GK›ï´lºÛVócf×ò¶¹/?êÈò×~x?Æk¥½¶‚=¡¹–îUFWóUZYw‡ *ƒ’vŒcF+þ«oùñ—þûÂumÿ>2ÿßb«ÙÏù_ÜÅÏëïoiq©êöÍzuµŠ+…†à—µ•Á6äoÙ°ƒ»Ì2¦°¸Ö¤—JžawÖÛE‘¼ì%VÙæ³m"(ÈÝ !—pÛFWÂumÿ>2ÿßbøN­¿çÆ_ûìQìçü¯îaÏëïIÒþɆä¸PUŽÏl€I3æo' Àª|pƒãŠÖЂ&¡­¤vò­{æ Ð4jù‰2’lº¾HϯpNWü'Vßóã/ýö+FÔ—V±ûRDcRÅB““ÅL£(üI¯ÓOf^¢Š) (¢ŠÉ²ÿe§Ç÷åÿÿeË/øöZ|~_÷ÿöQY6æ´FK,D0`Ѷ#ô#Ø‚*›hÐ9y$–fåI|âWpd\6úöïZTUFrŽÌ—÷2ît·& "–Ie‰Ý‹K1V;†Çz‚;Ça Çª¤Ò»JmšÝÊp¸f,q‘מ¿¥lQUí§k\\‘½ÌÉt;IT,)Ùm¾ðû ‚N¹ÛÚ¤}-%(ÓÜÜÊÉ2Ì 0ꣀ0Ðjý½¬û’=Œøô‹xîÂ<¢Uç ‘Õ†zt8úûÖ…TÊN[$¶ *š_2¡dV–B»K6³tÈô©~Ç{ÿ?vÿøßü] 6ÑIö;ßùû·ÿÀvÿâèûïüýÛÿà;ñtr°¸´R}Ž÷þ~íÿð¿øº>Ç{ÿ?vÿøßü]¬.-Ÿc½ÿŸ»üoþ.±ÞÿÏÝ¿þ·ÿG+ ‹E'ØïçîßÿÛÿ‹£ìw¿ó÷oÿ€íÿÅÑÊÂâÑIö;ßùû·ÿÀvÿâèûïüýÛÿà;ñtr°¸´R}Ž÷þ~íÿð¿øº>Ç{ÿ?vÿøßü]¬.-Ÿc½ÿŸ»üoþ.¢aqÜpÍ,R,‘»|‘• ‚£ûÇûÔr°¹5QR0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¨.ºEÿ]ò5=AuÒ/úè?‘ 3âwü{ØÿÛOý’Š>'ǽý´ÿÙ(¯¡Â»Ãçù³’_þº|8ÿ{¿÷cþo]õ§üyÁÿ\×ùWðãþ=îÿÝù½wÖŸñçýs_å^~aþõ?—ä( |ÿ0µm!Æ#QŒcz`còARÔV£m¤#Äj1ŒcL ~Cè*Zä5+Íæ ˜Ú(ÕˆÇÌqŽ˜çiîq냎Zã±Dzã2ëáÿwó>œŒ?Òã8éŒãÝ{ãú¡í-rw™>"¹ß˜wŒ"|Ùù;ö8¨nQ“Q³ßŒ™á8òÄd~ðp@èkkPÑ-n.&¼šòxŸk P<©ÇÖªéº>v"»µÔ.¦Hå ƒ°|ÊAÁ½8®c;ߥËç[x¥§U¶û5¼ó9,Ùò$AÇ*Àzg ëœ[+iZY.ÅÕܬàJÄxbŸ™·¨R2Ë–|‡‚+§ñ..³ Å*Gå±bXž+þk¿ùý‡þù5èaêÓ¦š“³¿gäsÕ„¤Õ•þh­a¦ÛÌcW°ßnV.²ÿ;3ÆrÞ78Àõ–7K –$¶I#YÑØlxˆ˜‘·7<ç¾8­oøD5²ýœ^Û,}öÂ79Á`2F{Øz ‡þk¿ùý‡þù5ºÅRþg÷KüŒ½Œû~(¥qkgsLt÷WŽÞTèñûÈÔ¾aoânrÇ G¨D‘é [PâWa¸ù㉇~9vzzóZ?ðƒ]ÿÏì?÷É£þk¿ùý‡þù4Ö*еäþæNËïF$)3xré„DÄ·Qá?Ùprߊý3ï]§‚?ä__úêÕÿ5ßüþÃÿ|šé¼?¦É¥i¢ÖYB¶å÷¬1UéÔIAõ¾Ítk©¥rƒn]»ùštQEsQ@6_ñì´øþü¿ïÿ좙eÿËOïËþÿþÊ+"‰(¢Š@eø… éñbY£?k·\Å+FpÒª‘• à†?þ°+'TÔ®“ìÚ£ù-mmwu²Ü!LQN¹/œ`ì'xÈëŽz;»;[Ø„W¶ÐÜFpYcõÁïɦÿgØý·í¿c·û_ü÷ò—Ì齌ôãéLF"jzѸ†Êhííî%™TI,@ü¦9[ýZLǬ_x°ÎO/5äÔµ ¯p%Œ%¥ƒy‘aÀwG¸MÈC‚™1‚zœ`gŒ×Go§ØÚ¢¥­¼*®dQJ 1w ¸ã>”I§ØË·Í³·}»ñº%8ßý¿‹'>¹æ‹Ìý®]. µ7Hf2_]gj²HËÜ®ûŽñò20£± m5]h\Cg5µ¼wL¨P c•³±$sÁ» ÜŽ1º·Å¼ ·Æ69‘p£åcœ°÷;›'ÜúÔvú}ª*ZÙÛªæEĪ·pÀëŽ3éEÀ‘ÿãöÇþ»ýõ™¨Í>‡s6£z²Üƒç4 —Ò¨b±¼¸ "Ü2I±’q£;ˆ®-%er‰)-± 60è9êE6mu%ݽˆŠâ\ù’¥‹+¾NNH\œžjã°2„:¶²fK ¨ ·ºžUHå‘ J䘒V$~è€wŒ–éòœÁ»«¼’«=î!b-ßçwº–ÝX|ü±X¯9äduæ·ÑŸK›N·µ6¶ó0fXtþ íhÊ“Àêò§XG£XY¥´®UprÖm–!˃Â0ìXðPŒé|Gª–‘ml¢“ìhïrÿ"£í–Xú¼‹åƒä“ŸÞcwû?3umcSMöv–Í{m†6I!1,Å_~ã“ûžÀrÙÏ;6+ÄòX‡h\É5‹“¸²ü¼y$wæ¥zrìÛnãc´‹‹7ù]³¹‡ËÁ;›'¾O­ZŽ;“dc¸¹_´ Í{'8!X·#޹…Uðì’Má½.Y¤‘ìâgv9,J ’{šdsiQY(­ Z•*`[' ƒœ»qƒ“Ÿ­>ÚïN´`´·x!LíŽ+7U98qÔÐOûN×Òãÿ¤ÿâhþÓµô¸ÿÀi?øš¹ESþÓµô¸ÿÀi?øš?´í}.?ðOþ&€.QTÿ´í}.?ðOþ&í;_Kü“ÿ‰  •Ÿ{ÿ!+oúã/óޤþÓµô¸ÿÀi?øš­-Â\ê´K.ÔŠ@Åâd’˜ê¡¤öj(¢²((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š* ®‘×AüOP]t‹þºähŒøÿö?öÓÿd¢‰ßñïcÿm?öJ+èpŸîðùþlä—Æÿ®„ß?ãÞïýØÿ›×}iÿp×5þUÀü8ÿ{¿÷cþo]õ§üyÁÿ\×ùWŸ˜½Oåù#JÃ_?Ì-FÛHF1ˆÔcǘü‡ÐTµ¨ÛiÆ1ŒcãÓú –¹ JóK˜Ùai–ãåއ©õÆ:¡êeqœ[Jqž…yëïì?ï¡ï‡ú\g#qœ{¯|Qô=¥ []¹º¹Ö­tëˆZ+'•03þ¼n$ŽÃÓ¨àž£º„ÖZ¼Ù‘G#ÊByÛ?ãäcžz zg=ÍíœW°ySn!‘ÔᑇFSØŠÌðîga \Ãp—“MnÛŸº¸'ŽyäõìB¨”-cšTdês_úì'‰…ÄŸÙZî-5áVAtöáÀ†VÁt€ÊƒÓ’g,×Zn£s qâú[[há‹Ík½Íæ\±¤d'äV?3 c<Õ¸ø•14ÛþÓåØÛ/Úóö±(ó³œïãæêzúš­¡_ÝÞÃr—ðy7³ù.6…Ýò+ƒ´3Ã÷Lñœ :‚ÎÊÒÂ#¬Ñ–ÜRÂ}p;ð?*ž€ (¢€ (¢€2l¿ãÙiñýùßÿÙE2Ëþ=–Ÿß—ýÿý”VEQE€(¬ý~G‡ÃÚ”±;$‰i++)ÁRàƒØÖ=í½Êhz´ØÔ-"ŠØËKzÍ*ʪä¶åvùH)ò–ÆTñܰ:Š+ì«o⣚èÆ-'m¯u#†!ãÁ ±ÜG˜ÝsÛÐc:ú’]ZñmVK•Õ-2ªùŒ¿èÇ`cŽ3Ø3E€ê¨®fîîòD\¬Í©Ûý À¶I´àK…‘‰áOî s¶µÔɯxgVÔç…LaŸ÷Š’,LåÔž7!B@ÎcüaLÍ/™P²+K!]Î¥€YºdzT¿c½ÿŸ»üoþ.£øý±ÿ®ÇÿE½jUE+Ÿö;ßùû·ÿÀvÿâèûïüýÛÿà;ñu¡EUŒÿ±ÞÿÏÝ¿þ·ÿGØïçîßÿÛÿ‹­ (²?ìw¿ó÷oÿ€íÿÅÑö;ßùû·ÿÀvÿâëBŠ,€ÏûïüýÛÿà;ñt}Ž÷þ~íÿð¿øºÐ¢‹ 3þÇ{ÿ?vÿøßü]c½ÿŸ»üoþ.´(¢È ÿ±ÞÿÏÝ¿þ·ÿGØïçîßÿÛÿ‹­ (²?ìw¿ó÷oÿ€íÿÅÔL. »Ž¥ŠE’7o’2¤Txÿzµk>÷þBVßõÆ_ç&•†-W7ª­äúåÌ6kxÒ­œFŽãdPHZP×pÜ2#kp½;ÒQ\õÖ±¨Ç—0E «$·6ð@#bâH–R !¾`LGå˜sÇ,ºñð¬³GkæB¾dÑœæ@‘Èwäs"›m–>íE„t”W6š®´.!³šÚÞ;‰¦T ( …1ÊÙØ’9àÇ݆îGÝW¯mà¸ñ6›çþ]´ò&õ µƒÃ†èG­­ErzEôã@Ó&-åGb–Þd9!š&a‘ÏMŸ6ñÔ~è䃒iWSêwØ]$‹å<“ÝG!-òÉe…Ôöýù=|ƒÇ÷Kè®åhm&™-lÃ=2j_±ÞÿÏÝ¿þ·ÿXzti†o"‰#IoUF,˜vÖUE3þÇ{ÿ?vÿøßü]c½ÿŸ»üoþ.´(ª²Ÿö;ßùû·ÿÀvÿâèûïüýÛÿà;ñu¡E@gýŽ÷þ~íÿð¿øº>Ç{ÿ?vÿøßü]hQEÿc½ÿŸ»üoþ.±ÞÿÏÝ¿þ·ÿZQdØïçîßÿÛÿ‹£ìw¿ó÷oÿ€íÿÅÖ…YŸö;ßùû·ÿÀvÿâèûïüýÛÿà;ñu¡E@gýŽ÷þ~íÿð¿øºŠæ;ËhÖW¸×ÌE*!*Hf ×qõ­Z§«Çÿ®ÑèÅ¢ÈT]"ÿ®ƒùž ºéýtÈÖEgÄïø÷±ÿ¶Ÿû%|Nÿ{ûiÿ²Q_C„ÿw‡Ïóg$¾7ýt&øqÿ÷îÇüÞ»ëOøóƒþ¹¯ò®áÇü{Ýÿ»ózï­?ãÎúæ¿Ê¼üÃýê/ÉPþùþaj6ÚB1ŒF£Æ8ôÀÇä>‚¥¨­FÛHF1ˆÔcǘü‡ÐTµÈjW™Ö;˜Ý•ˆòÜec-އ²ŸOQŸCÙæár²ñž‘1éŸoöOéê3-Ìkš”—ZœZ:,°Á$Š“9Z@N0¹þ¼÷Æ:u˲ÕN‹~äh$eY ‰‹±èP¨ÆîƒúØëõ>;èÐçËžß ÀdÆßNã‘ßò5™áÿ:SwzÉ-ç!6ä¬KþÎ{‘Ôþ¾zH¨Xæ•9º‰§ýv'ñÅä+§Çd÷*×^[‹a‘—Ê‘°<ß”r óØ¡¥wcsuç›™f¶þ\l7³™'Ï+ í\üªxQž„ŽŠkx¦’ %MÍnæHÎHÚÛYsïÃ0üj ­.ÎîWšhÛÍeEóFGP»±µ”‚§çq‘‚Cx®s¤ÆÅK ÷1iëö{K>èÉ3#¨*0D)óä¶7l'#!yÄ·~$’Ð}ªK%:›<^bÍûܲù6ãÄÀ|ýÁã ¿‡¦Ãkqn1Žæ# Û¥v.¥ŽXœä™ç9çéUdðôSkkšEkPÌëjì,ÈU·)r„îNO$ó .©>£ç-ÅŒ¶ÍÒ IB89èdD$ŒsÆ9ó›{{¨‹]L •åƒV¶Š¹ˆlf€ì$dàï žs“Æ8­»->ÞÇy€JZLnyfy\ÐnrNNp2}M@úƒ­Ú²NEä«4¿é2dºU”îùHÚ¿w(  tëÉ.ÅÄs±\[KåJ¨ûÓ%UÆÖ 6ºõœýMÊ‚ÎÎ (ŒvêØfÜÌîÎîze™‰$àÉèèO@Q@Q@6_ñì´øþü¿ïÿ좙eÿËOïËþÿþÊ+"‰(¢Š@6HÒhž)Q^7R¬¬2 Žâ‰#I¢x¥ExÝJ²°È`z‚;ŠuÙÚ½Ú]½´-síIŒ`ºŽx ÔOæjôØÒöæàË$‰pë#@ê†0ê.ì‹ßæ®Ñ@}ž3Ìòcß¿ÌÝ´gvÝ»³ë·ŒúqUõ 6;Ý>[%–KX¦Ü$òpÙÜ>e=KHç=êíî"¸´••Ê$¤¶Ä,@ØÃ ç©kûN×Òãÿ¤ÿâj´Í/™P²+K!]Î¥€YºdzT¿c½ÿŸ»üoþ.®7°‰?´í}.?ðOþ&í;_Kü“ÿ‰¨þÇ{ÿ?vÿøßü]c½ÿŸ»üoþ.«QiÚú\à4ŸüMÚv¾—ø 'ÿQýŽ÷þ~íÿð¿øº>Ç{ÿ?vÿøßü]'ö¯¥ÇþIÿÄÑý§kéqÿ€Òñ5ØïçîßÿÛÿ‹£ìw¿ó÷oÿ€íÿÅѨiÚú\à4ŸüMÚv¾—ø 'ÿQýŽ÷þ~íÿð¿øº>Ç{ÿ?vÿøßü]'ö¯¥ÇþIÿÄÑý§kéqÿ€Òñ5ØïçîßÿÛÿ‹£ìw¿ó÷oÿ€íÿÅѨiÚú\à4ŸüMÚv¾—ø 'ÿQýŽ÷þ~íÿð¿øº>Ç{ÿ?vÿøßü]'ö¯¥ÇþIÿÄÕinçP…¢Yv¤R/ ”ÇP= Kö;ßùû·ÿÀvÿâê&]Ç ÒÅ"É·ÉR*?¼½IÞÃ&¦ˆÐJÒ„Q#(Vlr@Î>ƒ'ó4ê+1%ª]½Ú[B·2.טF°ã‚ÝHà~B¼ù~\1§”ž\{T ‹ÇÊ=Ê8ö•-ZßO±µEK[;xU\È¢8•@b6îqÆ})·6"{ëkµ¹š-Õ—íë%[p<|ƒ¦½[¢€ 6v¦%ˆÛBcXŒ*¾XÀŒã*÷N8é!Vó•,‰°ÊŠ7€3Ž ç’3‘É©h  ácö=âÖ'–ve•÷8œ³ºêÇ ­Oí;_Kü“ÿ‰¦QT¥aþÓµô¸ÿÀi?øš?´í}.?ðOþ&™E>`°ÿí;_Kü“ÿ‰£ûN×Òãÿ¤ÿâi”QÌý§kéqÿ€Òñ4iÚú\à4ŸüM2Š9‚Ãÿ´í}.?ðOþ&í;_Kü“ÿ‰¦QG0Xö¯¥ÇþIÿÄÑý§kéqÿ€Òñ4Ê(æ þÓµô¸ÿÀi?øš?´í}.?ðOþ&™EÁaÿÚv¾—ø 'ÿUï¯a¹·X¡YË™c<Àà`:“Éè*Z(æ AuÒ/úè?‘©ê ®‘×Aü@Î3âwü{ØÿÛOý’Š>'ǽý´ÿÙ(¯¡Â»Ãçù³’_þº|8ÿ{¿÷cþo]t÷¦ÒÞ×}Õµ¬>Aw–à|£ÜÉjä~ǽßû±ÿ7®Ñ-æxí'‚hãd€¡pCm=ˆþíyù‡ûÔþ_’4¡ü5óüÊÚv¥ hcMJÂêØDàI xÈb>ëgúUWT†ÃNžá$äAµ åÉ dg¦AÏÐúSía¹y¡ºº–"DEB$L˜Ý´Ÿ¼sü>‚¤ÔlÒþÂkY‹€ßÝ=A÷Á×#4w¶‡nµ·òjW¥Ï D¹H8€!GN˜9÷®§Ãš“êz`’nf‰Ìr`1"?×8º&±nÆÞ>Ý™Ct%ã שô8û¹ô®›BÓ?²´Õ·f +1yYs‚ÇÓ=€~5;êsÑSORšë7v÷·ÜCö¼^‹[h­cç÷>q,^L”ã·Ý÷À"ñµíÎûyVÊÞÔM4¸\Û°i–@ãvN Xr8 Õ¨´XãÔñîîefºûPGÙµ_Ê1`aAÆÂ$ýÑï–Ú0ó'òîVT¹pÄÊí#íRõÏÝÆsW[C·>)..ZÎ0µ¦ð±æLï91Îæ8,@'€0¸®þ·¸™åÔ/.ïYÔ#y¥ *mùxÄÏïœsÅUOÅvöɧ[5Äp#––}¦9e¦sà¶pŒÝ·ñ.s¬.7ýö÷Nô;3¹v†Þ1µ¹eŽ#'öiÚê]NúK¿“Ë„A¢Ú   S‘+ƒ¸¾ ³o¦-µÑ–;«Ÿ'{ȶ۔F®ä–nã’ÌpÄŒž®5 Èõ‘nòEko½ –’H&ù¡‚FK[' wUô]}¥Ñm¥Ô`ž;ƒ`.·ÈbQ8U]ì¤6e—ïmûÃÐãFãM7WBIïnZtZâ1å ©È]ü0 ÷ºûqPÚ[(<ÉÀ±·BÛ†F6W<`°hôÇ\‚8  x‡ûWP°‹LóÌLÒ%¡r… \3*Säì%º‚­Oêêš-­íͳ[É4Hä¸l¨;— p§Qè>Qǰôªözlv!ód™LÏ4i*¡³-´…ì9'Ž(·¨Ý=”1}–)/V)•Ú&arG3„#pÜÃÊÆì€w}ÑŠ†úïûcÃ:Ûí­äÆš/ ù3åy‰&ÑÎrË´üÃÏAߥK;XÚ6KhU¢UXÈŒ€€`?Þ>µZûI‚îÅí#f´ŽH„.mÑhÀ '*p¿1Æ:v¢à[øý±ÿ®ÇÿE½jVLî"¸´••Ê$¤¶Ä,@ØÃ ç©kûN×Òãÿ¤ÿâjã°2åOûN×Òãÿ¤ÿâhþÓµô¸ÿÀi?øš¡(ªÚv¾—ø 'ÿGö¯¥ÇþIÿÄÐÊ*Ÿö¯¥ÇþIÿÄÑý§kéqÿ€Òñ4rЧý§kéqÿ€Òñ4iÚú\à4ŸüM\¢©ÿiÚú\à4ŸüMÚv¾—ø 'ÿ@(ªÚv¾—ø 'ÿGö¯¥ÇþIÿÄÐÊϽÿ•·ýq—ùÇRiÚú\à4ŸüMV–á.uZ%—jE bñ2ILuÐÒ{5QYQEQEQEQEQEQEQEQEQEQEQE×H¿ë þF§¨.ºEÿ]ò4Æ|Nÿ{ûiÿ²QGÄïø÷±ÿ¶Ÿû%ô8O÷x|ÿ6rKã×Bo‡ñïwþìÍë¾´ÿ8?ëšÿ*à~ǽßû±ÿ7®úÓþ<àÿ®kü«ÏÌ?Þ§òü‘¥ᯟæ£m¤#Äj1ŒcL ~Cè*ZŠÔm´„cF1ŒqéÈ}K\†¤L?Òã8éŒãÝ{ãú¡í-Wšå¹Í‰\Ü|Éœgöî3Ü}g›kvÎè"9Îrƒœç?ú~gÖ€0oïµí™í­®Œh¤m€6=A>µXjš‚^['ö‡œ4jÛcP.¨= &¥ ‘kw–wMpÀÁ sòŒB‘œæ¢o´ÝjŒ,¯,Ñe¤…ó€à’ÌTvþUÊܹ¾fºXèõGû2ÕfÙÞá7Í/•|—|£Œƒ–*;æ£]jÞ(!k׉^D“l^x‘ ;]¤ ©;›ƒÏÕËÄ»x€±ždÝËM é€ËÏNsX2øJd;ZK$ŠÂg¸²YH-#ÈL[Žöñ€¹ÎzŒ+i–²:O4ª~dòòŠÌà8]¤€­r¤u§G®i®ÅLí–3ÄñÀ$‚\hÝ´ó·æÆ9¬MCCÔ/n_MŒùZnû‰DÏ“ºhåI–ÃLx(¼½ÇÍ£áØïÚäMrËÅÃLáW¶0×ÙǶ;І×ôå@Y®C3ˆÄFÒo4’‡îöîÆ¹Æ>SÏ‹mnÞëUûI+%Y7#%¤ ¯òá1‘† ç#VÃëisÀ614S‰JYÙ,ÀG"FIÏï É$p$™ôýM>ùî!ºVY™üåh¹ Ë,ŠîùH2I »@Ýê6·±!³Sm$«;÷®ÍÝ#åGRK¹ÆÌðjóÝIj†Uš<åd…ãÜÁ*Xà9\ŽG¨ªÆÂük/z—¶Æ&Ú«–ÌÏ|nU`à ‘œíÏLä(®“áßìíT^ù¶Í¶‡r[lš]̇|²n;Ûääàd±4»EPEPM—ü{->?¿/ûÿû(¦YDzÓãûòÿ¿ÿ²ŠÈ¢J(¢Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@AuÒ/úè?‘©ê ®‘×AüqŸ¿ãÞÇþÚì”Qñ;þ=ìí§þÉE}ýÞ?Íœ’øßõЛáÇü{Ýÿ»ózï­?ãÎúæ¿Ê¸‡ñïwþìÍë¾´ÿ8?ëšÿ*óó÷©ü¿$iCøkçù…¨ÛiÆ1ŒcãÓú –¢µm!Æ#QŒcz`còAR×!©ô¸Î:Fã8÷^øþ£è{KUæ‰e¹vìÜeI^¸@þ£¦pqón‡9iyÏIXuÏ¿ûGôôƾÕïãÕ&´¶H ¡nBOÝäî½@5½E. ŠQfD’Ƈ`'†`!ˆÏ5KSž _\ï¸ò¾prX1åbz{T wi>£d-䌟>q´>`çhéÿÖ®W9soÔÖÊÇ_z¶IYŸËŠ(¶îvÁbbùU$tõÀ¦JÝÜ_2ØÏrÅb‚æTÇ8ÀÃO#¡=E¬2\YRÆÒõ]†ønŸj9ÏÜlœÆ?•sòx^å åH³ÁäIÚæŠ8|Œ*cÍUí vpƒÝÇQ‘ÐK«iÝ=¬Ú¤w¥ž&C¨ ¸’36óôæm©X]º¥¥õ´ìèdUŠUbP¥†LŒg׊åµ=;P»y4;x£ÝÏö–(ts`¦ÒLÊìxÎ:ãGTðõÆ oÏŠ4¹ºywrJ£Y˜:w;ŽqžûPŸöÞ‘ö_µÿjXýŸ—æý¡6oÆvç8Î9ÅëjK`—1¤'‡ç\L»”ç-€„œv"³,´;˜õ kÙ(š9Ã87“\±AÊ>y=åû  rrs>•¥ÝéÚŒÓæ #¹i<Ïœƒó¦‘ù‰ó€##ãvh實¶×B)-n|é\íQ»y;ŽK(Ê‚2y<7CÖm5­>‹iài$yaŽPæÃ;[QÈ E$›kbáíí&µ€€µÃ+DÛf òÀßw·,L—kýŸöõ¶Oìû#hžL­'›Ÿ/,r«·Pãœîê1ÈíQ@Q@6_ñì´øþü¿ïÿ좙eÿËOïËþÿþÊ+"ŒÏªºièêZú0AsÅfÉ#A¨5½¸O²&£Æ»* p¹èséÓÚºYà†á\Cª@u 3ëÍ4ZÛˆÒ1A#mÈ¡úØÖð¬£4e(6îsÒj÷¡–Xf-ñNcvUä¢çr®2£#1'iÃPÔv7C'M{¼¡Ã°úñœç¾1ž7~Áfdi>Éo½³¹¼±“ž¹8ï“Nû-¿üð‹ý_•÷ÜþïÓÚ©Ö§Ò"ä—sžm[Q˜M$$/“QcË€ÇycžsƒMŠêîÚ“òÈòêžA$)lzŒŒd€<A]³µ/›hKDBc@:éŠWµ·“ÌßMæãÌÊ¿3ëŠ=¼6åg.æ7š„·¶¶’\˜ÃÍ:_-œª¨+»†pjO·ÝÇ«lž|@÷>Tf5Y#<}ÆÇ̯ӿ\ñ[ ko—²—ÊÏ—„fzãÓ4}–ßíhò"óÿç¦Á»¦:õéRêÁýžƒä—qÒ,­*TO]Ñ—Ïþ<)ž]×üýCÿ€çÿ‹©è¬.jAåÝÏÔ?øøº<»¯ùú‡ÿÏÿSÑEÀƒËºÿŸ¨ðÿñtyw_óõþŸþ.§¢‹—uÿ?Pÿà9ÿâèòî¿çêü?ü]OE.ëþ~¡ÿÀsÿÅÑåÝÏÔ?øøºžŠ.]×üýCÿ€çÿ‹£ËºÿŸ¨ðÿñu=\<»¯ùú‡ÿÏÿG—uÿ?Pÿà9ÿâêz(¸yw_óõþŸþ..ëþ~¡ÿÀsÿÅÔôQp òî¿çêü?ü]]×üýCÿ€çÿ‹©è¢àAåÝÏÔ?øøº<»¯ùú‡ÿÏÿSÑEÀƒËºÿŸ¨ðÿñtyw_óõþŸþ.§¢‹—uÿ?Pÿà9ÿâèòî¿çêü?ü]OE.ëþ~¡ÿÀsÿÅÑåÝÏÔ?øøºžŠ.]×üýCÿ€çÿ‹£ËºÿŸ¨ðÿñu=\<»¯ùú‡ÿÏÿG—uÿ?Pÿà9ÿâêz(¸yw_óõþŸþ..ëþ~¡ÿÀsÿÅÔôQp òî¿çêü?ü]]×üýCÿ€çÿ‹©è¢àAåÝÏÔ?øøº<»¯ùú‡ÿÏÿSÑEÀƒËºÿŸ¨ðÿñtyw_óõþŸþ.§¢‹—uÿ?Pÿà9ÿâéU.C×1ž@€Œþ;êj(¸AuÒ/úè?‘©ê ®‘×Aü 8ωßñïcÿm?öJ(øÿö?öÓÿd¢¾‡ þïŸæÎI|oúèMðãþ=îÿÝù½wÖŸñçýs_å\Ãø÷»ÿv?æõßZÇœõÍ•yù‡ûÔþ_’4¡ü5óüÂÔm´„cF1ŒqéÈ}KQZ¶Œc¨Æ1Ž=01ù ©kÔ‰‡ú\g#qœ{¯|Qô=¥ªóFÏsWd"7•AëŽåOרéÐöy‰Îqs(Îz㯷¸ÿ¾G¾@+êš”Zt ̦I¤;a…~ôþ2©ÔÑõ‰.dû&¥Ù¯ܪT¨‘}ç#ÓÛ>¸¥¬é’ÁªÃ«™¤–‘`ܘTä>èˆäó’F—§Ï­jìÃì¶Ñ02Í?!;P’~nùí×Ð…r]œÒ©QTI/ë¹Ü_êúzD×&_Þ¿–‹/+3`¶¨'¢“øSlõ(/n$†Y"IO›FpÌê>VØÏP8#­A­ií¨M¦®%ò¢º2JÑLÑ2¯“"‚H?y”qëéšËÔ´k5ÌvöòÜYK¼nÒy\+ÌÄ/œJ’£??sŽ@Ç9ÒtôWmáëÆÓïÞâÃuâY4z{Íåbq-à R§B´_wqŒcˆ¯­Œú¹Óíaˆk^}ÓµòItGŠo+qReP»â\•`~î@;º§gªYÞÊc·‘™¶îRѲ ûÈHבÊär=Fs¼1¦6Ÿö’-îmâ“fئòæË€È‰$ã£5Âjw¶·Ou¤Ïä±l>k@ñ¤E†ø£È,W<¸˜ ØPt´V'…¬®,m.¡šáˆÜn·Žo(M‰Ÿ–/‘Fíçry&¶è¢Š(¢Š(&Ëþ=–Ÿß—ýÿý”S,¿ãÙiñýùßÿÙEdQ%QH¢¸ž+hÄ“6Õ.±ƒ‚~f`ª8õ$ –¹V9eÔYfKç”_[5°ŒJaòƒDX¶ß“!„‡æçÛm4MU­/­ïe·27’æ7f‰•wA`‚8Íbh²_¶¸Æo´,rÃ#Í Å6ÈdܘPîÅ[q˜öƒŒãÁ\ÚY¦àDÚ­ßœ`‘ã;w\–R¶÷ëŠ,#¤ª×÷Öúu³\ÝK÷™"i6ŒI SÅs–°jWéÐÝ@E:A5ÉH„HÑNdFå‹åqÀÏ#ý¸xgTûgÚ?{£¬ÏçnâvI<À3÷z/Ê0`3E€égA-ŤLÎå!¶9RFÆ=G=@«_Ù–¾·ø'ÿUßþ?lë±ÿÑoZ•qØOû2×Öãÿdÿâ¨þ̵õ¸ÿÀ™?øª¹EPŠÙ–¾·ø'ÿGöe¯­ÇþÉÿÅUÊ(Ÿöe¯­ÇþÉÿÅQý™këqÿ2ñUrЧý™këqÿ2ñTfZúÜàLŸüU\¢€)ÿfZúÜàLŸüUÙ–¾·ø'ÿW(  Ù–¾·ø'ÿGöe¯­ÇþÉÿÅUÊ(Ÿöe¯­ÇþÉÿÅUimÒÛP…biv¼R+8$ÇR}MjÖ}ïü„­¿ëŒ¿Î:O`Š(¬Š (¢€ šîÞ ã‚iU$•K nÃ*õ霺ŒwÍ5¯­×P9Üabbª§v `6Œín§µr©Ù¼°•SR7«-ë8›`s=¾ð¤ü›HggËéŠÔÕ<ÿ´ëßeó>Ñý••åç~ìϸç9éŠv¿M‘ÄQ<Œª)bK=äŸa\®¥¥m ð±:*òÃï$ùe.É9>wºçåÎ8«¶ð]ÛjÊ#7†¼02I$_#ìûòwŸÞñ»¯ðçQ`4^ö+½{«G}¾\€¬Œ¬¹‚*Ñþ̵õ¸ÿÀ™?øªÂ²ÿ‘vÿþ»^ÿèé+©«ˆ2Ÿöe¯­ÇþÉÿÅQý™këqÿ2ñUrŠ¡ÿ³-}n?ð&Oþ*ìË_[ü “ÿŠ«”P?ìË_[ü “ÿŠ£û2×ÖãÿdÿâªåOû2×Öãÿdÿâ¨þ̵õ¸ÿÀ™?øª¹ESþ̵õ¸ÿÀ™?øª?³-}n?ð&Oþ*®Q@ÿ³-}n?ð&Oþ*ìË_[ü “ÿŠ«”P?ìË_[ü “ÿŠª÷ÖPÛ[¬°´áıŽgr0]Aàœt5©TõoøòõÚ/ý´€eAuÒ/úè?‘©ê ®‘×AüdQÆ|Nÿ{ûiÿ²QGÄïø÷±ÿ¶Ÿû%ô8O÷x|ÿ6rKã×Bo‡ñïwþìÍë¾´ÿ8?ëšÿ*à~ǽßû±ÿ7®úÓþ<àÿ®kü«ÏÌ?Þ§òü‘¥ᯟæ£m¤#Äj1ŒcL ~Cè*ZŠÔm´„cF1ŒqéÈ}K\†¤L?Òã8éŒãÝ{ãú¡í-E,NÒ,‘º«ª²üÉ»¯äzߟȀ­Ç;eˆuÆc'×Åþïä}xŽþú >Õ®.[ 8ucØëþzUê–w¶þE¼ÚII·L`z®ÈÉ玧Ü­ZÞE®Z_ÜÌ$´Y«Ü8<÷þ÷sÇV5§Ûõ]eŸ,Ë$Xc<Ïæy îxÎyÂ÷ÉÏ5ЩǒíœÒ«%QE/ë¹Ý^^ÚXD%¾º‚Ú2ÛCÍ @O¦O~åL´Ôl¯–Îæ)ö¢Éº&Ü»X²‚pyF…S×m§º¸ÒVÞYá)xY¦…UŒcÈ”gæI‘ß×—¨Ûß[Ýݨ{¹ÒK{hÞóËrêÎÄ…ƒc1¢á0@`NFsÎtUÄÛE«M§ßÝJú‘¸µ²ce: î²ÜmýÙ?9*±pû‰g9åúŒš‚]¢Û¾ º¼—J€™ ¾Tæ3û’p">¹<î Π·½´º–h­® šHl©Œgž‡ƒ×ÐÖO†#¹O´ù—73@vló­æ‹ ÎìyÎÒ6ú/§;ª”W?iµ–x,náž;s ÿdšk2†Áw86Ô9ù§v`ªŠÄð³]K¤º’y;°<ÐËdØ„ñ).Fâü’}¸ÀtQEQE“eÿËOïËþÿþÊ)–_ñì´øþü¿ïÿ좲(’Š(¤E´ñ][EsoŠd#`Œ©Ú€%¨ ³µ¶–Ymí¡ŠIÛt­aL‡žXާ“×Öˆ/-ne–+{˜e’Û*Ç c熡àõô¦Ú_[Þ<Ëndo%ÌnÍ*î‚ Áqš³P]ÙÚÞÄ"½¶†â0Û‚Ëp®~MOU¯ï­ôëf¹º2—ï2DÒm$’ §Š|Ë/™°ª3E!m®ÅAYzàúÔ¿l½ÿŸKüoþ"¡·‘38G”†ØåIõõ­fZúÜàLŸüU\oaý²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüEIý™këqÿ2ñTfZúÜàLŸüUV¢#ûeïüú[ÿàCñ}²÷þ}-ÿð!¿øŠ“û2×Öãÿdÿâ¨þ̵õ¸ÿÀ™?øª5?¶^ÿÏ¥¿þ7ÿGÛ/çÒßÿÿˆ©?³-}n?ð&Oþ*ìË_[ü “ÿŠ£P#ûeïüú[ÿàCñ}²÷þ}-ÿð!¿øŠ“û2×Öãÿdÿâ¨þ̵õ¸ÿÀ™?øª5?¶^ÿÏ¥¿þ7ÿGÛ/çÒßÿÿˆ©?³-}n?ð&Oþ*ìË_[ü “ÿŠ£P#ûeïüú[ÿàCñ}²÷þ}-ÿð!¿øŠ“û2×Öãÿdÿâ¨þ̵õ¸ÿÀ™?øª5?¶^ÿÏ¥¿þ7ÿQ1¸žî9¦Š(Ö8Ý~I ISýÑýÚ³ý™këqÿ2ñUZ[t¶Ô!Xš]¯…ƒÊÎ 1ÔŸSIÞÃ&¢Š+1…TWÅm’fÚ¥Ö0pOÌÌG¤@Ôgj÷ivöеÌkµ&1‚ê9à7P9?™¦®¡bÓÃÞ[™gO2$®éîQžFäzP×Öë¨ Èn 0±1US»°Fv·SÚ˜i²F“DñJŠñº•eaÀõwêlŽ"‰ä`ÅQKªXñè$û @W{(£Ód³³†(#1²¢"…U'=‡NMYûeïüú[ÿàCñIïb»Ñ纴wÛåÈ*ÈÊËx Aò­ìË_[ü “ÿŠ«ÄÈþÙ{ÿ>–ÿøßüEl½ÿŸKüoþ"¤þ̵õ¸ÿÀ™?øª?³-}n?ð&Oþ*«Qý²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüEIý™këqÿ2ñTfZúÜàLŸüUÛ/çÒßÿÿˆ£í—¿óéoÿ ÿÄTŸÙ–¾·ø'ÿGöe¯­ÇþÉÿÅQ¨ý²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüEIý™këqÿ2ñTfZúÜàLŸüUÛ/çÒßÿÿˆ£í—¿óéoÿ ÿÄTŸÙ–¾·ø'ÿGöe¯­ÇþÉÿÅQ¨ý²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüEIý™këqÿ2ñTfZúÜàLŸüUÛ/çÒßÿÿˆ¨®d¼¹b{x|ÄbÂbÄ`Ý6J³ý™këqÿ2ñU^úÊku–œ8–1ÌîF ¨<ކ–£%¨.ºEÿ]ò5=AuÒ/úè?‘¬ÆqŸ¿ãÞÇþÚì”Qñ;þ=ìí§þÉE}ýÞ?Íœ’øßõЛáÇü{Ýÿ»ózï­?ãÎúæ¿Ê¸‡ñïwþìÍ몸‰¦ûK[{™«Žá¶¡9¾ÖÇí^~aþõ?—ä( |ÿ3RÔm´„cF1ŒqéÈ}KX¶°Ïü$éÖ6Ò´Rå`”•` x$ì^sÆ1ÀçÚŸâ7»] ïÊpT+bNÂØn1ýßË'ÓžG¡£vW$oé ?’oP¶@Ü ”çý 1úñZHë"+ÆÁ‘€*ÊrõçðFÏ¥’˜‚£•àVWëÑÏ*{;×EàÇ•ôWå¤ì"ÈÆW‚qëó¬¡QÉÚÆ4ª¹»4nº$‘´r*º0!•†A± ®oäYÂ"Œ±b$’z’O$ýk·6Úv§«ÚAii%¬º„Âî3™§!¦mhl7,Ãä^=4u{ûë–)5=“Åj&¶O-_NKæ ¤@Û ‡ve‰ Ö·èntõÅͽª¹ž(Tçæ‘ÂŽc×Ð~€šäÿ¶¯—í/eöûÕžñOÚä¤~o–v ÉH×$œïõ"³5{Ë»­Qqm{yÛ%†a6Ú\îRë/e;@$g$à­z%@–V‰z÷©kÝH»^qÃŽ u#ù ä/u½b)5G[ËhںŶðÒD¨¯åÉåùy\íC¹Ü© Àù”R…F…$z–£cƒ%Ä¡R2wµ— ydáJ“’§’s@&HÄ«u2–TÏ$ dè2?1N®3L.5{Xtù ³Ž8®¶ÜépF‘\ŒÛʬc'iÁ'1õÑûÝf;w²I査Ñ~Q€;šë* »;[Ø„W¶ÐÜFpYcõÁïÉ¢à9ÿãöÇþ»ýõ©YS,¾d¨Í…¶»meëƒëRý²÷þ}-ÿð!¿øŠ¨µ`4(¬ÿ¶^ÿÏ¥¿þ7ÿGÛ/çÒßÿÿˆªº¡Egý²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüE@hQYÿl½ÿŸKüoþ"¶^ÿÏ¥¿þ7ÿEÐVÛ/çÒßÿÿˆ£í—¿óéoÿ ÿÄQt…ŸöËßùô·ÿÀ†ÿâ(ûeïüú[ÿàCñ]¡Egý²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüE@hV}ïü„­¿ëŒ¿Î:>Ù{ÿ>–ÿøßüEDÆâ{¸æš(£Xãuù$,I%O÷G÷i6¬2j(¢³W3ªÇ,º‹,É|ò‹ëf¶‰L>Ph‹Ûòd0üÜð;m®šŠ`rúlÆhlm5 kÈÙRÞI˜ÚJMÄá†w €…É'$®üÖuO?í:÷Ù|Ï´eGåyyß»3ãn9Îzb·ê³µ{´»{hZæ5Ú“Áuð¨ŸÌÑqÖ¥¥m ð±:*òÃï$ùe.É9>wºçåÎ8«¶ð]ÛjÊ#7†¼02I$_#ìûòwŸÞñ»¯ðçVý6HÒhž)Q^7R¬¬2 Žâ‹eÿ"íÿýv½ÿÑÒWSXÏezl–vpÅf6TDPª¤ç°éÉ«?l½ÿŸKüoþ"ª-¡Egý²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüEUÐ +?í—¿óéoÿ ÿÄQöËßùô·ÿÀ†ÿâ(ºBŠÏûeïüú[ÿàCñ}²÷þ}-ÿð!¿øŠ.€Ð¢³þÙ{ÿ>–ÿøßüEl½ÿŸKüoþ"‹ 4(¬ÿ¶^ÿÏ¥¿þ7ÿGÛ/çÒßÿÿˆ¢è +?í—¿óéoÿ ÿÄQöËßùô·ÿÀ†ÿâ(ºB©êßñä?ë´_ú1j?¶^ÿÏ¥¿þ7ÿQ\ÉysÄöð"ùˆÅ„ň Áºm”]5AuÒ/úè?‘©ê ®‘×AüdQÆ|Nÿ{ûiÿ²QGÄïø÷±ÿ¶Ÿû%ô8O÷x|ÿ6rKã×Bo‡ñïwþìÍ븎ÚÞæÎßíE.ØÆ7 lp=k‡øqÿ÷îÇüÞ»ëOøóƒþ¹¯ò¯?0ÿzŸËòF”?†¾˜ÙÚÛ¹x-¡‰ˆÁ)SÂ¥tY’E ŒeaG¡¥¢¹ N~O ét¤=Ò!çÊWù01‘»ÿ{=qÒ¶í­á´·K{xÄqF0ª;S&,—1²ÂÒ-ÇÊSëŒuCÔ<Êã8¶”ã= ó×ߨßCß E-‰QŒvC%¿³†C×vñ¸ê­ ~¦®¥`ÖÌÌ@J¤’zµÍߘοtn•7€Aÿp`ñÛ§¾*Seý‘ «O /–[yƒŸ›šÇÛ>kò«}½¼V±˜àMªÎò’~fbÌyõ$š–¨k×WVª–‚3Çç4>jàü¾bÉÉ 9ÛŽ„ÖöåôaÓ,Y㲉¤¹3Î$äI*2ù²H¥W16†à”crºŠåu={Sµ´“P‡ìŸgónáHZ. )1 _x‡¦ÑÃcl&L`Cqž3@…«nŠö+È.¥;.¡†m·-ˆw2žHù[vþK|Ê#8P 'Y»¼ÕD2Û;¨æÒo,Gº5d1‰È‘NHB1Óž7h¢Š(¢ŠÉ²ÿe§Ç÷åÿÿeË/øöZ|~_÷ÿöQYIER¦É"CË+ªFŠY™ŽÔ“ØS«?_æðö¥HÏ#ÚJªª2X”8w4fÒòÖö#-•Ì7†ÚZ)€}2;ò)¶—Ö÷2Û™És³DÊ» €H°AfªiðÝEªÜ½ùY&–$T–ŠFcBN%ˆ}ÎÝNÆ:63à‚K›K8TÜ›U»óŒ'ǽý´ÿÙ(£âwü{ØÿÛOý’Šú'û¼>›9%ñ¿ë¡7Ãø÷»ÿv?æõßZÇœõÍ•p??ãÞïýØÿ›×}iÿp×5þUçæïSù~HÒ‡ð×Ïó%¢Š+Ô‰‡ú\g#qœ{¯|Qô=¥ªó:Çs²±[Œ¬e±ÐöSéê3è{<Ü ÎV^3Ò&=3íþÉý=F@2¯tK‰õ/-ïÖä<’HÂÔ0ô¨WÃ×Fê)çÔ–_.Tþàå¶°8ÉséYúŒp\x‚ëÎ.ð eÁáû÷éÞ«µ¼Pê~\^n!#,­ŸÞAW+”y¶êigmÎÆòÊÒþ!õ¬1†ÜhÀ}p{ò:cé¶}›Ì±¶o²cìû¢SäãÙÇËÐtô±öﲯØ<Üïg“³ÍÙƒ÷<Ï“9Ûßûâ±ÿá$ka¼×ڃƅîâc(ùÝ e ¯%TàaŽIFfŒ¾ÓçÖS¸f‘”®Æ†?¿/ûÿû(¦YDzÓãûòÿ¿ÿ²ŠÈ¢J(¢Q@A­´²Ëom RNÛ¥hã d<òÄu<ž¾µ=Tvv·±¯m¡¸Œ6à²Æëƒß“SÑ@̲ùK £4RÚìTµ—®­KöËßùô·ÿÀ†ÿâ)hªM¡ öËßùô·ÿÀ†ÿâ(ûeïüú[ÿàCñ´QÌÂÂ}²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüE-s0°Ÿl½ÿŸKüoþ"¶^ÿÏ¥¿þ7ÿKEÌ,'Û/çÒßÿÿˆ£í—¿óéoÿ ÿÄRÑG3 öËßùô·ÿÀ†ÿâ(ûeïüú[ÿàCñ´QÌÂÂ}²÷þ}-ÿð!¿øŠ>Ù{ÿ>–ÿøßüE-s0°Ÿl½ÿŸKüoþ"¢cq=ÜsMQ¬qºü’$’§û£ûµ5s0°QE# (¢€ ìí^í.ÞÚ¹v¤Æ0]G<ê'ó5=Sd&‰â•ãu*ÊÃ!êî)ÔPW²Š=6K;8b‚3*"(URsØtäÕŸ¶^ÿÏ¥¿þ7ÿKE4ÚŸl½ÿŸKüoþ"¶^ÿÏ¥¿þ7ÿKE>fí—¿óéoÿ ÿÄQöËßùô·ÿÀ†ÿâ)h£™…„ûeïüú[ÿàCñ}²÷þ}-ÿð!¿øŠZ(æaa>Ù{ÿ>–ÿøßüEl½ÿŸKüoþ"–Š9˜XO¶^ÿÏ¥¿þ7ÿGÛ/çÒßÿÿˆ¥¢Žfí—¿óéoÿ ÿÄQöËßùô·ÿÀ†ÿâ)h£™…„ûeïüú[ÿàCñÌ——1¬Oo/˜ŒXLX€¬¦ÑéSQG3 AuÒ/úè?‘©ê ®‘×AüHÎ3âwü{ØÿÛOý’Š>'ǽý´ÿÙ(¯¡Â»Ãçù³’_þº|8ÿ{¿÷cþo]õ§üyÁÿ\×ùWðãþ=îÿÝù½wÖŸñçýs_å^~aþõ?—ä( |ÿ2Z(¢¹ H˜¥ÆqÒ7Ǻ÷ÇõCÚZ¯3ÇÌo+*-ÆæãОqè ê:t8Èy¹·\îž!Œç.8Æsÿ ·ä}(PÒ5 uI®­¾ÈQÈ Jç<(¤v¨F‹ªÉwo-Á³ ±±Ù!áUƒ` €v¨ï¦š}vâ(¯fD l•€A=sŸÆ«™®aÔ-]Þgˆ0•ÙIÀ ÇŒW+pæÛ©¦¶:»ËH¯bÌÓª†Ý˜gxŽ~¨AÇ=:UWÐô×TSUÚÁep%$‰0x ,Nüä³xåÚÅÍÕ­ª½¢d— òy-7”¸?7–„3òà7g 5™7‹,4øàKû¸¦•É$‘ªÀw0ÿW#î$m`Uw0*A+¨Ì–ãÃPÝêo=Ĺ³mäZ¡‘AgFG'ç+Î÷9TS“œõÎŒºUŒÎï5²È^S3†$†c”r:³Œtüj…ç‰mìÃÈöwml­2 … ±š%vu¶ì-Ç Ž¸ Óψíb2}¶ÞæÑbܲ4¡X#ª ŒÄŸ,oÈÈÇÝÅYƒG±‚HåXåyc1d–w•ÁÚÊ>f$à|ƒq8ɧåÙÁp·ÆÑȬìJÈÀ1vf;†pÃs±äǬ»Ù]…KKiî.Q‚asÊ»¸HSøÝž:r3bÇZ{Ýaíb´”À°+3ü Ã&ùQÕþny‹h#9ç4rM.Î[Ñvñ±“pb¢FÌ1†dk0ÀÁ ‘µ}§hö:fß²G(ØžZy“¼¾Zqò®òvŽÀô¡}}g¨Aþ ÛK*D±ùNKT2ä$dáH%¶à¶­7PŒ^|vÓÇnʯ ²lÄÊy  1 cæò8ë€ ”QEQEdÙDzÓãûòÿ¿ÿ²Še—ü{->?¿/ûÿû(¬Š ‰â¶çÂFƒ,ǵ2Úî “"ÂÇtdVR¬¹U5¸%– yaC'Ù®vEûÌ«œ€;žzUmUŽ ¶ˆ–— ^ǼÉ—'œ à’­aMI/êÆr“LÔ’îŸl¬PïT”€ÌÝ8çðéÞ§®VûNfÕg”Y‚;‹cÄYXR(Ç#¦@©#³¸:³4‹*Ê/ÌŠë,cÇ“ Çäûv­Úê] öŽû’,{w;˜(Ú…¹÷ÇAîx§×-ka$z>•‹GYÅê4ß»Ã`3rÜgôûnµi1·–ZU™D* |»¤ÇÎIÉ'šN‚ÖÒÚÿ€ÕG¦‡MEG$ÊÛŸÌÎ1òÊëú)Ÿdƒþ›àD¿üUsš“ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿGÙ ÿ¦ßø/ÿ@ÑP}’úmÿÿñT}’úmÿÿñT=Ù ÿ¦ßø/ÿJ¶°«nAÈÌòеMP]t‹þºäjz‚ë¤_õÐ#H3âwü{ØÿÛOý’Š>'ǽý´ÿÙ(¯¡Â»Ãçù³’_þº|8ÿ{¿÷cþo]õ§üyÁÿ\×ùWðãþ=îÿÝù½wÖŸñçýs_å^~aþõ?—ä( |ÿ2Z(¢¹ H˜¥ÆqÒ7Ǻ÷ÇõCÚZ‰‡ú\g#qœ{¯|Qô=¥ cS°¿mbyâ°kˆœ©ÌPÊ÷ê*/°j“^Z3éÍqKâDª¸cüDúÖž³¬'M:Å”ÞÌÁ7Vô'ßžâ{™£k¿c•m/¯âån2ÇË'³‘ïÛéÐX[®b"*\¬éo-师$7“Ú0lï„!$z|êÆxª  ÃÞòîuÛpѲƒp 3ÇnTî‘ÎSiŽ1‡ëº·öD6Ï‹oô‰ü÷7Liò3d¶ÓýÜtêEW±×LòNó$‚+x¥ b^èòJ‡W,?v:/w¥•o<9=íóÂ÷ ”Zik*±-,n®@1åNevÉv¶ò6é]h6Wo1¸ó]f¦‘7``òãœl>¹Ï~Ô7ˆ4Åp¦iNPHÌ-ä+’Ë™n#ÁFv1´ç§I®i±ÝyNÈw2ù­ˆ²ªY‡™™[<ñ´Ž¢€ô&‚{›ë»©`—ÌF” qÓUBã1È'$(´Ñá³»76óÎŒìæUÊ‘(gwädiÁçœÔöZ…½öñ”4xÜ’Âñ8¡Úà`àú§k¬H÷³ÛÝZ¬m FfX%óÞ1Á "ªü®A(-œ6 Ç Üi‹st%’êçÉÞ’5¶å1³¡[‘¸`ªœ)#‘ÉËôÝ?¿/ûÿû(¦YDzÓãûòÿ¿ÿ²ŠÈ¢J(¢Uh/ šÒK’ÞTQ<ˆí! ËfV$úeIúPš*£êšrZ%ÛßÚ­´µ&3(F<ð8'ƒùmÞ­cj—{®#ym!i¥L@ÏÝϦ:úŠ`]¢©.­§´o0¼·û:"¹ŸÎO/ Ì£œú©ñžH8sjšrË Mj$¸UhT̹7Ý*3È=±Ö€,K,pÆdšE«1ÀVþÕÓè!iÿ—üi×@5æœ>ÐN´nGê¨fÖgŽúáÒ?²[ÜÅlÒ‰˜ZAM¸ÆdP~n€Ÿji“ûWMÿ …§ýþ_ñ£ûWMÿ …§ýþ_ñ¦Çâ :[Xî šI£—ý_“’HURHœ`ô×tù.|ˆçf;•|ʼnÌY`G™™!—󸦋ŸÚºoý-?ïòÿÚºoý-?ïòÿCq¯ÀbSfûÜÍ 27U‘TBÈHƪ’9_Q“L×๳±k‡Ûqq M&ÈßËGu)|Rr0 Ï+ê2X ¿µtßúZßåÿ?µtßúZßåÿ|:Í„údš”3î³ (FÆÐ»‰s×#¨"ˆ5›)äHÕäI$}‹°¼nNÖaò°#`ô;HÎEŸÚºoý-?ïòÿÚºoý-?ïòÿ6ß\·¸ÕžÂ%‘¶¦D‹•ÜDe'\$óž*µïˆE»ÞF°I¾Òæ˜ùNêèæ,@ÆìHp “À8íE€·ý«¦ÿÐBÓþÿ/øÑý«¦ÿÐBÓþÿ/øÒ¦»§¼°Ä'a4ìU"h_#nAR2§‘÷Nî™4èu›)üÏ%ämˆd¹Þ(êÑñûÁÈåsÔzŒ–ŸÚºoý-?ïòÿÚºoý-?ïòÿ)×,DJáæff+å-¼(Æ3˜Âî•äâ_Q—iºƒ\èVš…Â᥶IbBÜ•…Q’}‡&‹Ïí]7þ‚Ÿ÷ùƦ‚êÞä1¶¸Š`½|· ʲ­|g ßÝGkg|ÒÏ)Úˆ°IÏþ;À÷íW [€€2måúá£Çó?ýQR0¢Š­uuö{‹8¶nûTÆ,çq¾}þæ?³ERÔ5(,ô³~7ˆìØþ`w°U%».XyãžiÐê6²5¼/uj.gˆH‘$á‹‚3•èYx<ãµ0-ÑY·:ö—m"¤—Öÿë¼™•q mfùùù~áZ²Ú…ŠÏ4 yn%<ÉPÊ»£\¹†x#“ë@•³ª£$“€Wû}—üþ[ÿßÕÿmì‰.—vѺºˆäRTädú‚ü+jšWöû/ùü·ÿ¿«þ4}¾Ëþ-ÿïêÿlQO”.cý¾Ëþ-ÿïêÿo²ÿŸËûú¿ã[QÊ1þßeÿ?–ÿ÷õÆ·ÙÏå¿ýý_ñ­Š(å ˜ÿo²ÿŸËûú¿ãGÛì¿çòßþþ¯øÖÅr…Ì·ÙÏå¿ýý_ñ£íö_óùoÿWükbŠ9Bæ?Ûì¿çòßþþ¯øÑöû/ùü·ÿ¿«þ5±E¡síö_óùoÿWüiVöÍØ*]@ÌÇ $Ö½SÕ¿ãÈ×h¿ôbÑÊP]t‹þºäjz‚ë¤_õÐ#P3Œøÿö?öÓÿd¢‰ßñïcÿm?öJ+èpŸîðùþlä—Æÿ®„ß?ãÞïýØÿ›×}iÿp×5þUÀü8ÿ{¿÷cþo]õ§üyÁÿ\×ùWŸ˜½Oåù#JÃ_?Ì–Š(®CR9`†b ±G!P@, àƒùŠCmnÙÝG9ÎPsœçÿBoÌúÔ´P6©¢£ÜG¨XÄ¢ê‰ðs‚{7¿çØŒmA¸Ô®Mö´’ù*ß,3gtÄq—£׿{*+Oi.[ºQræ*ÝÙý¦æÆo3oÙ'3cݘÝ1í÷óøUSCû}Ô·t_:DžLÐù‘6Ã'ß\Ã÷¹# ªyé[Vf‡;iá³éš…ŸÚ¢mµkÝ[ìH·<Ï•]Çç` ÿ^x¯w¢^^_g0eÒD³ÌÒPäÍ‚°rI 1À1Ôãæê¨  ÍH]/Î`–(ÒíYÙ­º`g$žOSŽ˜’kÜh—7…î ²²Db„ˆ6åK#(݇ËP@,021·EfhZOöD7)›oô‰üí–ÖþLiò*à.ãýÜõêMiÑEQEQEdÙDzÓãûòÿ¿ÿ²Še—ü{->?¿/ûÿû(¬Š$¢Š)VéÚÙ&´híDkv×PÈ&b\ý£ÎUeÙòƒÐN:àÖíÀÂNÔa¿mQ#µ{™Y÷Û™˜"†X—!öOîAÆÑ÷§5µ-ûPºe–eò™¦ýù¹¯ˆ A€®ð2NÒz±®šŠ.Úv£6¥¦cµYâXöÁç1V*'R ìȘí<‚=ê5Ю¾Ç«Fd‡Ì¿´xÔdá$gÈ'¨ó€Î2pNJèh¢àT¼;nôóÿOÿEIPE§ZEª]j/ 2\Í(t”Ä7Æ<µM¡ºãå'·Þ5fþ(^ÓÌ`0u”0]‡¦rxîG>µœd±?ó1äX?øška 5µ¶œ¶—q¬öVßf,%ÕÔ„ÉÚs÷õëÔT±ÑçåµóÕtôžY3,žTq;Ã` Ñ€FÞǦA÷ØÿÐÃÿ‘`ÿâhßcÿCþEƒÿ‰  –ž†Õ"kXÖ#ÇŠÑRGT‘÷œ³€dm$xÁeáÈm&·}Ö²„;¤’ÑZ]Ñ¢¨Øäªv0HË`‚A÷ØÿÐÃÿ‘`ÿâhßcÿCþEƒÿ‰£P$ûÿ„kûÏÿ—?²ù»?ØÛ»üqšmæžóê_Úܬs ËõD ’‚&'ǽý´ÿÙ(£âwü{ØÿÛOý’Šú'û¼>›9%ñ¿ë¡7Ãø÷»ÿv?æõßZÇœõÍ•p??ãÞïýØÿ›×}iÿp×5þUçæïSù~HÒ‡ð×Ïó%¢Š+Ô(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÉ²ÿe§Ç÷åÿÿeË/øöZ|~_÷ÿöQYIU.a¶šê}»ŒPíʯMıF988ë>æÞê+æ½°He’X–)#šC–*Cn~vcœŽF9o­¼øm¥š8nåMëlò/™ŒÀœã¦G£McK’ gR³x¡Ç˜ë:•Lœ œñ“T_M¾–y-ºÅss ܬ%bÑ´b?‘Fߘù‰_½ÓŽa:ѵѢó!ÝcoRrpJËœqÓ7§Qø5ŸTÓ’Ñ.ÞþÕm¤m©1™B1ç€ÙÁ<ÈÓu ZÇOI~Ñq–8Zo :ùŽª ;TžxSùV]æ‡s&§5ôed/+Œ]Énv´p®K ' Ä~\`î9§&‰s æ™ÙÅ¥ä>[JƒB|•‹ ‡;‡È.8ç&€i.­§´o0¼·û:"¹ŸÎO/ Ì£œú©ñžH8sjšrË Mj$¸UhT̹7Ý*3È=±Ö³fÓµµ(õ3ªÏǶ9бQ:_f@ÄÀçiäïQ®…uö=Z3$>eý£Æ£' #<îA8åGœq“‚p:P½Ð y§´ƒí‘ú€in/îÞæX4ÛXg6ìfšsV*(Â1'Ðr0IÎxvÝéçþžþŠ’ ¸·¹ŽæYôë¨a7 eš(,(a†R¨à`œµ° ¾ñZËr±[´Éoi=Á“vÕf‹nPçæÁ=ã’¤ñ4‘ÚÇp²9n *jY‰NÆs¹ü¾Ê9ÝÛ¼¤Yj®¡o6óˆåS$P rîWçÉxaºƒ÷¾a—M½–î;æ¿·ûln¤0µo/j¬ŠÝùÏï˜çwaÇ©p7l®$¸³ŠiD!¤]ÃÉ—ÌBB Œ•Ÿ&µØ¢æXÚ(á;š8ö¬®ÍÆ$®Õ_Rÿj¬úE¹¿¸ÔÆ·Ï0–ü Z™/ëÚ²æðä25æÆµAr'Ä¢ÑLᥠÒg•Î pÎ3KË4¼¼Šy%‘U!’"±»#Íd2F<¿Ç?™p7‰txí¥™5YÄJ ,S£HQße€ÉÀäMMfyãµK8¬®..IK²a Œâ@„“–^6úóÇ0K¤Û˜YažèI¹L×2Ì¡‘Õ×*ÌF2£8ÁÆFFj5Ónc¹7Ñ^Â/œ¿˜ínLD0Œx â$çqþ/Q‚àMˆþÒ‘ÜÁkþ„^ÝÞLHP…p€GïS'pþ.v÷×7Š-‘- ºÿB Žd-@¸p@÷I‘´ÿ##~mÎúl³¢y1TRÄ*– óhói\ ›_è7÷QÚÙß4³Êv¢,sÿŽð=ûUÂAÖà ›yA>¸hñüÏçPE§iÖ—×7öÖ±Çusþ¶@9oðÉäã©äæ–Ý­Eío/þ…;«ETŒ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š* ®‘×AüOP]t‹þºähŒøÿö?öÓÿd¢‰ßñïcÿm?öJ+èpŸîðùþlä—Æÿ®„ß?ãÞïýØÿ›×}iÿp×5þUÀü8ÿ{¿÷cþo]õ§üyÁÿ\×ùWŸ˜½Oåù#JÃ_?Ì–Š(®CP¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(&Ëþ=–Ÿß—ýÿý”S,¿ãÙiñýùßÿÙEdQ%QHŠ( Š( Š( .­–åYÝz:=3Ï úÕs§Hæ%wùEÿÄU¹ç†ÝÜMJNv 3éÍAý§§Ïý¯ýþ_ñªQ“Ù ´ˆÿ³dÿ ßåÿGölŸô»ü¢ÿâ*äRÇ4bHdIôe9ñ§Ò‡ölŸô»ü¢ÿâ(þÍ“þ‚7”_üE_¢”?³dÿ ßåÿGölŸô»ü¢ÿâ*ýCû6OúÝþQñfÉÿA¿Ê/þ"¯Ñ@?³dÿ ßåÿGölŸô»ü¢ÿâ*ýCû6OúÝþQñfÉÿA¿Ê/þ"¯Ñ@çLs×Q»ü£ÿâ*KM>;iŒÆif®ÐÒòޤ‡åW(¢àQE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ‚ë¤_õÐ#SÔ]"ÿ®ƒùã>'ǽý´ÿÙ(£âwü{ØÿÛOý’Šú'û¼>›9%ñ¿ë¡7Ãø÷»ÿv?æõßZÇœõÍ•p??ãÞïýØÿ›×}iÿp×5þUçæïSù~HÒ‡ð×Ïó%¢Š+Ô(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÉ²ÿe§Ç÷åÿÿeË/øöZ|~_÷ÿöQYIER¢Š(?_‘áðö¥,NÉ"ZJÊÊpT„8 ö5—}¨ê–Ú¥°žx|ÈYc¸iP³M`U~îüã¾HÈë]‘¤Ñ´M§'bâ´F-¾µ/ÙxVÒ—É–F„ÊQ+G³ ÿ»'h9;—æÆxù®Üj2ÁªÜ¤†ìm-æibü™ß 9ö#9[0éztÅ,±É •‰’Î@ p>cÓÔúÕ‘ ZPŠ$e ÍŽHÀ'Ðdþf¤£ƒXÕZìi×GÜŽ%’!´+,­Ê,Ÿõ$}ñ÷ºqóTÓu «awkY.ÚVmŒ‘$†âä¶È ±±ûÀú–ÀÑ&¥Ç°G¦Ù¤ScÌEB¾FF9Á§ /NÍl,-D ¡Z?%v `Æ0 'êI¢â2ô ÉoµK¹ç‹Ê”[E¯y&¸CМd®q“Ž™=j–—©_iú&“µ¼¿i³‡Èa/•–†1»æ;ÿÖƒÆßºG~:[k;[EÛim ´."Œ(ÆIDzÌëA³µ1,FÚÄaUòÆgP?ºp8éÀ¢àsWº­å¾¬7G÷vÉ%²˜×jÈÒ=®RÜcÍçoQž,I¬j±Y´—0Gl w7!(B« Ñ$…†wŒØ ’o—m4ûà%ºÄ£"P¡Xå—èHé£KÓ‚À¢ÂÔ-³€WrJñÁÏUg2À"1ÀT XÖÓÅumÌ ¾)H‚2¤dj|r$Ñ$±:¼n¡•”ä0==ÅrZTwÐÚØE"_%Ú-ªÂ¸D°„Í>àoõß{æéá¦Çöºm ê ,)åÍi›”ó& ƒeûŠqÿ,ÎOLn„uWW?gòÀŠIZWت˜ÎpOr@i‚êàôÓn¿ï¨¿øº.Ænì?ë¹ÿÑOZ*µi$–‚Ý”"»ŽKq3þäy†2$ Û¶cƒŒ–àsÎEL$C+DLŠ¡™sÈ8$zÈÖ5ü2Ï£'ǽý´ÿÙ(£âwü{ØÿÛOý’Šú'û¼>›9%ñ¿ë¡7Ãø÷»ÿv?æõßZÇœõÍ•p??ãÞïýØÿ›×}iÿp×5þUçæïSù~HÒ‡ð×Ïó%¢Š+Ô(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÉ²ÿe§Ç÷åÿÿeË/øöZ|~_÷ÿöQYIER¢Š(¢Š(¢Š(+‹xî wü¹J;!u„Ô_a‹þzÝÿà\¿üUZ¢©NKDÅdÈà…-âÄ\“ó1bI9$“Éäš’Š)7}XQHaP%ª]½Ú[B·2.טF°ã‚ÝHà~B§¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ‚ë¤_õÐ#SÔ]"ÿ®ƒùã>'ǽý´ÿÙ(£âwü{ØÿÛOý’Šú'û¼>›9%ñ¿ë¡7Ãø÷»ÿv?æõßZÇœõÍ•p??ãÞïýØÿ›×sksÚ­<`„PAqÇçæïSù~HÒ‡ð×Ïó-QQ}ªÛþ~"ÿ¾Åj¶ÿŸˆ¿ï±\†¤´T_j¶ÿŸˆ¿ï±GÚ­¿çâ/ûìP´T_j¶ÿŸˆ¿ï±GÚ­¿çâ/ûìP´T_j¶ÿŸˆ¿ï±GÚ­¿çâ/ûìP´T_j¶ÿŸˆ¿ï±GÚ­¿çâ/ûìP´T_j¶ÿŸˆ¿ï±GÚ­¿çâ/ûìP´T_j¶ÿŸˆ¿ï±GÚ­¿çâ/ûìP´T_j¶ÿŸˆ¿ï±GÚ­¿çâ/ûìP´T_j¶ÿŸˆ¿ï±GÚ­¿çâ/ûìPu—ü{->?¿/ûÿû(¦YDzҬˆ’JÕIlòqØVC&¢£óáÿž©ÿ} <øçªßBÉ(¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р (¨üøçªßB>ùêŸ÷Р * ®‘×Aü?χþz§ýô*‰#,#«ã€sØÓøÿö?öÓÿd¢‰ßñïcÿm?öJ+è0Ÿîðùþlä—Æÿ®„ß?ãÞïýØÿ›×Qyw¦Ø•7×6¶ÞfvùÒ*nÇ\dóÔ~uËü8ÿ{¿÷cþoV5Y–ËX¹“Q’E·•òŠ—bÝäP‘…*åÓ*¬&Êîà¸;y¼ÜÇýê/ÉÐþùþgMÛÍKÇÔ2²œ†¡¸ªÉ}¤½£Ý¥å›[FÛ^a2”Sdz€y˜ª¶ŒŸbÕ® qc,¯,1"nGå®í«Ü3‡>œò&:êÛT’+¦š+…kœZL¢8ü©•¨g¤ä€OÌI`Seî´Ôû>û›UûV<ŒÈ£ÍÎ1·Ÿ›¨éê)é5ƒÝ½¢Mn×1®ç„8.£ŽJõ‘ùŠæ µÊYêѵ­ÆíNÚX퀅ŽY¥¸`÷|J‡çÆ2sÐãYÇ›­Ú$÷¶ó;ÉÁ¶$ÊÉûÕp0ÌÅÀÆãÃ’TH,‹Í`—ihó[­Ì‹¹!.°ç½HàþF™ Ö›qs%´6²ÜGñ$ŠÎ¸89ä`ñYúòO¨I–ŸçGs HÞqÑ#ÝЬ$Æ Üë÷I=xàâµÅåóÈm,­¦†Í"]ñ¥œ‘< ²FÁÚça“_?(ÚO€:/&?î ŽàÛ[F$˜Rë8'æf £R@®|y¾`ûGö¯öFù<ž±mÝ·÷¸Ýçýî:vÛPIô«lºª_=ø¸³d‰ ;AˆÈ[gîòJ~nx¶Ñ`:˜ÖÞh’X¶Ûç3o›åý›Îs&ï+sç΋5RtÔO%¡Ô¼ˆmîe² Ò†.ƒ|Ìwù¸WÎFx#X¯Éû‚&?î §¥$°½ìf0Åp+3’†4'æl–‹òIôíŠÐ d~LÜy1ÿpT”R?&?î <˜ÿ¸*J( 05£F9eÓè ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸(òcþà©( ü˜ÿ¸)DQƒƒ4ú(…øÿö?öÓÿd¢‰ßñïcÿm?öJ+èpŸîðùþlä—Æÿ®†/†¼Q‡ª`óŒ¡AöíÆ}¯é[ð± ÿ þGÿìh¢µ«‡£VnsÛõÿ2bådÃþ4?ôÿÈÿý'ü,hèÿ‘ÿû(¬þ§‡þOÅÿ˜ùçßòøXÐÿÐ;ÿ#ÿö4ÂÆ‡þßùÿ±¢ŠSÃÿ'âÿÌ9çßòøXÐÿÐ;ÿ#ÿö4ÂÆ‡þßùÿ±¢Š_SÃÿ'âÿÌ9çßòøXÐÿÐ;ÿ#ÿö4ÂÆ‡þßùÿ±¢Š>§‡þOÅÿ˜sÏ¿äð±¡ÿ wþGÿìhÿ…ý¿ò?ÿcE}OüŸ‹ÿ0çŸÈ?ácCÿ@ïüÿØÑÿ úäþÆŠ(úžù?þaÏ>ÿÂÆ‡þßùÿ±£þ4?ôÿÈÿýQõ§‡þOÅÿ˜sÏ¿äð±¡ÿ wþGÿìhÿ…ý¿ò?ÿcE¾§‡þOÅÿ˜sÏ¿äð±¡ÿ wþGÿìhÿ…ý¿ò?ÿcEþ§‡þOÅÿ˜sÏ¿äð±¡ÿ wþGÿìhÿ…ý¿ò?ÿcE}OüŸ‹ÿ0çŸÈ?ácCÿ@ïüÿØÑÿ úäþÆŠ(úžù?þaÏ>ÿÂÆ‡þßùÿ±£þ4?ôÿÈÿýRúžù?þaÏ>ÿÂÆ‡þßùÿ±£þ4?ôÿÈÿýSúžù?þaÏ>ÿÂÆ‡þßùÿ±£þ4?ôÿÈÿýRúžù?þaÏ>ÿÂÆ‡þßùÿ±£þ4?ôÿÈÿýQõ§‡þOÅÿ˜sÏ¿äð±¡ÿ wþGÿìhÿ…ý¿ò?ÿcE}OüŸ‹ÿ0çŸÈ?ácCÿ@ïüÿØÑÿ úäþÆŠ(úžù?þaÏ>ÿ‘ƒâ¯G¯C­¿’aÝÿ-7g8ö”QEj£EF*É wgÿÙ endstream endobj 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xœ­]ÉŽí¸ Ý7ðþ᮳¨X’G Àu‡}Èd²Þä÷#Ùæ`Š×Ui¼E£|=HœyHª»ÛüòŸ[—ÿ Ëð‘nso¿ÿýö×?Ýþ½ýð1taá¿¿ÿóÇ/Ÿ?üBúnÓ8,·Ÿ»ýùn¡»ýüÇí×ÿrûù¯¿Ìù©òÛ¯]Ú¯ô3]yҕ帺ýÊ@'z*tyuÇck·î¹–Îæ{únŠô0¯¡=­«?®ÅV1Ñ]Ë~%ÊÚWº‡®„c ž‘µÇ±ëÃñ½0ó&iÛtcœj2tÇ•á#Ò=DÞqˆÝñê‘?gºk‚w3ÑWZú¬aê=莹"À33ý7™®–ƒ>æoro!ä+EÂè{,< ûb÷>“ xò ¿j¨¨›dw ˜u½…Y5uåB”ñ«IRÂXÖÆãVE¸µ{ä'b~´öηÎ]¢­á\—2‡•¡T`°°¤îNìQ7zæ5­¬P³ÌÞ)ÝØ;7 µçŠÚ_ 1DàßEû ]·dŠ|ˆAö‡«+;žÂ3(eB“nFoCåíySÇÛ»K;÷…=.y‡µ°gVd–$° Y GPB°:BŽüþP-9ŠÑd噸“$yJð¦ZpDøƒ#h|-/½/Ë'"eN1S3/â'Jr¿•µ!€â¨×¿2oIò”œ£Di2ä|í™ÿ-a É[LBQÌe‚íòg¦Žýƒ)LÌ­´EíòkÚÇQD9›“DÏôÊ ó‘Ÿšyu5SeeÄ®:‚·œ„] |Ý=|©­Ò—ô0’N<í ®ÎBGe=2Y&aC¶?¼{æø,F#“—Ö-n*»õÄÜXäf“¹e}…æÇú¢Ü>ƒÓ¶íUkL@bÖRø¨…E-¯Sj• /»ëLSþ‚«¹â¿² Ý&ùØ£¦*y!Aq,µÜ¤iWR¦ŠÜLßUÞÍÙ#¤Ãçý“ZõÊq¿êMå¯-yc—ä¯K^jK[„,‘ñMMBŠðÃað{ØQ.|-ËdQß—2~“óŠìkó‹Ç%QNÜëZkWÈ´¯3eïä5”PÝ/¼‰y„ž—·DÊ$ÂO±š\`ÂŒ¶øÊƒc¤mˆŠü>–ñ:P‚|§+ )ÊO&ã.¦ÁPdƒ¸,_(¦Ž{Fcã"z%íÉr³tO"fÂà»\Á€@ì"eãý—Žô3)ý ôA¹WÞZ±õz­þ½øÈ´·£##X$å°Í³\+ñ(ØšÇÊ™¬X|ÞØ#HôìD`èa´ÿ˜ÛbĶ‚9uKÊé6N†/fxÈaÂ*Ö4 †x‚W¼§äM9*ŠC!×<‘ÎzK1¸ù±â[ÈÎ[Y ºp^Û]¬¸·£¬h£>öNXÅp–ú÷m¾±úC`+Wòšó'f¶þ(ÝuºÂ F‹§[_$Îl9ñîJŠm'·¾m”¸H„Ò?È·`¯/¬9È€Ñ²Š„Ÿ‘Hh“²~—;Áazõš‰ ^^*¸óîòNæsz›ƒàb,rúÁ®~ì$G^8b¥=4$‹Ô+*ÿa6ƒc1Šâ3Å*˜ç¢oqµØ½¬.’–!a—,ÕP¤Þ²U…nÇw +%æür`}ˆ€ nâÎy‹ì\ ñ ‰‰Fé÷J0ƒ3tÊ3*Ó y»X ETðd3ÜeE"cö OÖÁˆV%Ä ds>ð–ïU^”ˆB5R_ØÜl3õ&"›È¡ýª9ï•cÃþ)>4³sþûuÅ:¦Å’rLë½NR’ Ë•òö½ÀP«…‘ ((™ÕãCf±Z·Äia« ’ <›WóYqy"Ï‚ˆäçµ1!kÇ‘¿w³ÅxA„4x™&rEkÉÂkF©"¢Õ”_{䱓§Šf˜•™Ô ]F[ÑF%…ˆ·òco¼@êd`¾>Å’WÕúT Nì.`{¬À™egb™œDn„#HJI5™hä‰Lj¬D ’•D+F‹mºÞÅjÍí»—€ÌY«qØÄ‹§¶)Ó1·ù—¼€"žxÊE‰s–õÆðôï}µ6ñ«Û«ÌÞV„f0r GDÚ¼sŪˆsöarï"´]×B2tmÐùì¾B¯oDlxtT)P™UÅ(2gÀasEÌÁ­S¨„*†*¹TãBOˆÚO$"…ƒ-=O¤p€žDÔEéhHt{Q”ç+gЦ_ã£è²1ž{ˆBDKs¾ô³,†àëBW€]ТýMÖþ‚áuØ9_3éÏú®™gMàý²9D’jb±Ç*!Wꇒ§ÇAUXG…PçHʲd0‚9z¯¿dP…±¦Ü²£î¬ä´|’“Üav–A¢7ò$HY6ÅíÛPa¹A`Ñ•&(ã~1 $”\áýœ 9ó£¸õIÓ{d1©›X\ÍæÉМݱɓH­ XãdQÞ1/_2ÔÝXo¾pƒf6ùدòu©/}ósºD  àKØÇ0•Ⱦ¦IªDÉý¾ØðÿOFJU»ZíY“Õð]uÕV:€-¸âk‚>b!W|vIiÉb*j@ïvÕmEÌ¢B¡1AF~`6ÆRìÀUª5ÂiÓ1Ê"°"ÕJ°i¢ô¬â"o—Sºèp†„t1̆3µ @Hnñs2.GN_;X%Z盲1j[uw©½Ælj’N¯“Õ{&ò"Å(\2KZ ‹ÑÜl7w%+— mѸÕ> 6ÆaÊèÔ¦t"¶¶¡·7ô»iÃ×zŸ°ø{¥l“ ×Nº ±²wuT  -µ0ïAƒ‰\¬ck¥AnX{K“ ®nºU})öÕ UàNô¾`¢­Kö_g&EqîcuH p]ˆ¼È¶NPðòH\áQÞ"8PSHù±‡öÓñU¢-¦(£Ä6#jt¡1®2¢þ[ìTåYR{ˆ ©¬ùÛÛÝ .ÓÎéȘ¯ð›Þv¬šo7;8 ·¬ÏùÒ©eVuÛô¼¢Îi°ÔÙJ’eyl0†îQÂoj/¸˜&€>±¹†¹`]èd(ÍükGIŽ.Ù[кSP©@8é×ëh¬ŒªÑÌR5Ù©*–X­NßIT´lE6ûù(ÉÔñK©ªAâ=×Z“‡€¨­r/¹ÆTðFŒ°°¡˜*z;Œ-mcœŒÃغ#Ïê‡QÁgu‚ã+Q,rU+‘ÝvJlvr‘ÉI~¥I ©Ž¶ôÚê+AõI¶« FbÖo¡Á¸SœÓGIê-á{kú¬ÏÌD‰d¦¾jôˆaŸå’XÕnRéÇ‘í¾ú4wFœÔÑ "•¹à BdõºutÕ,Šßñ›BØà‚›Ú&ë\Ø¡–dÓ @¨¾ïkR·Xšt¹úš ×)ŸQE’À鬨!@4þѵ›ÏÛëUã(d:¦&…3ÜfÝsg…Ó²óM첡áR$7-mŸÊ‚¹tqÃí#1yóAE¼iå´á$grfÌÞ78µ¢vëß1`&ÅŽöâšV–táÎJ€ø¥cI3 ‰W®bõËhL6̸dCÁ!ž*%Êlßj{&ækT}ö†ýRS™±ijŠrPmÝ6U´Ö€°EUù,P.ÒÃj±“–ª¼Rv|#ÛÅÒµ(\¨#_3f‹°rŒ¨a+ec”$¯›~µ°¦&ÛÎr»toìó†‚÷s²†Ië@±:ÒÔÝŽÖÞd™^qvq ÐÛ›3rš(·‘¢qnñ°5öy©Zá\Ç.à¸/íâ~lfÒå×Jþ“r~½¸éÖ×%”vš ³§bB*¾b¾Ý+,Tò"Lw"¨¶J9DqR" mØÒ×d¾Ýœ:k ô½céiÔMƒ©ÒxõE£?t•Ø9D?ÆØPlo§ÿ½¬R¦;ëº%†‹ˆI·-ã×úët(ZЭ×ü¾y•ÒÒ¸7ᯒ5¢¶)ï“É¥‘4pÑ`Pû„ɹ·$ˆÜ‘™+•Â~˜ ‘‰¯²reÛFÛ­šÍBp 1& €ä¹vMy³ÛâÔt¦ñê2ÇÆ ­Æ/ Ç©© q•Šñø3 ºe g dxíÓí¼Ò<Êv ?¸Ö ¿‹eȉ»e,ÌE25¹í$ õüL;-wäξ·ÄŽ1æQmŒ£¥,†àÌ,ÛCw²µW5?5é—¶ì¥:ÁЩ–p”±¹I!lª<¦«c¸CÂÃ?ºycÙuš¸·[éŠ\/gÃff8 n •üSÆÍ'Mï(fšûjNÀrí=U:–$¶[Mq„=×ÖAéVÇxöÒ±9}àî96g©H´è.sH\ùÊz¦\àG©·¶Ç¸òãiûÚ"#m"Özp,½Ôw÷¤º[fhÄÚ“;™ö X-Î2îw9œ£RuÓBàp¥¢™6Št6±Í‡r ÖÝhÝ·$Ÿ8¬ b£5¸˜ág ‚ (¢ ÷F:\ÌÕ>\CZ,ÃèÜ"ßé^Q²r²@s´îئ8»~ ý³I0ä‰ƆO›H}0øjEÞXý­ ÉŒ¤Ü7¶ÊZ auRgôBó£Uá†Î8 v#íÙxg$y唓óP<§ >¹â4%?Ý›AŠ |¾@áD§¥NAËMPÝhºâ¨Ô©Øu‹5›Zƒ«D*s¨|Ú§­^“xIHÐ&Ci"¶¬Vv}m)ØÇ¸ˆ¿¢%›XB,qîn"'ìžë(Ó9â¬ÞmªwZÛ6Ò<(’¡z#BœñÖã²”RšÄÎw>ë¤Ôå‰Bѱ“Dû-Ÿ &Vy³ÜßÜļˆOUkÈWšŠ§8ÉWŒ ²{Ð Ç­gç±~VcÊi8Z/çÇ am#ÈælHW¸¢}]´¦`ë†e,`îg$®§6@t@$àµSåìŸ, ÌÀÇH<­(N…ͽ֩†©ãaU´ZW`Ý:΋5ùÅZŸ+p×xÕ"^°]Ò֧ȺgfÖ~Û›ÐGÆ.$,ÖÌ®4ü¿íKÇÙ€Ë>hJ[roÆ â£j1V¯&¡åphä®gÚU±KÞÌõ}îðq•œs®Î®]Ÿ>ïPŀDZD#d²^;oÛjLµ*ñeòp?!Wª ɘ³QAÇè‚}¹«a±kãIÐv»¾£-³’û¶5:ýO¾± 17W¼q“¥U0~qª#‹âàå ±çNU&'Z‚¢NÒµÔêžœ¼ƒ=vå†Fm%ÑHõÊö:%ÃäunÞ¼\sž•æxåœôÿvûc—Þendstream endobj 5 0 obj 4601 endobj 6 0 obj << /Length 7 0 R /Filter /FlateDecode >> stream xœµ]ɪìÈÝ7ô?ܵÏÊA4†ºu«ö þà…Á½ñï[™R Ê¥º´1ö{®—)åÉQÃÇþé?ÃöŸq¤%Çßÿþñ×?}ü»þÃqëþþÏŸúüíçŸBH?ÆyäßþöñçgøÃÇoÿøø%Þ†ù/¿ý«ŒÙþq(ÿüËðÜšú%¦íÝÇ/Ÿ4qý1Ñowõ5ÜŽÇG ˰ð*øÇOãžé—DÏ_eÔñK–ªQ²ˆ÷ß&Ùw¤7Ž<“žµò¼¸Ò³r¯a¡_ŽY‘gÅ©}[HCŽ_C– Í4æqüBoôð©YÀc»ý_‰v†– âºd%ˆø±üXIbtûÎe•Í4Š_ùIç`áKsƒYQÈþË¢În;…Çp'* «78… ,9ï nGe:´µ9Öd=!ª‘£‘F-BЃнó:"Љ:òQG ®ž´á܇5Ìá¶ýoÚ´|<®#0±G©À¦m-QÄ[¸û“óÚŸ¼IB1Ãs㺃«_Ã]NÙY¿Ä¼­nu·KÝéÆÈD*Säc ¤ÀÆ ÜÅúÞÁó÷ “…æ/”eË(áüa)Kå¿Óö˜¯ƒÂ÷í| Ï@ô“ù1Û``0Ùçlls>m“Éo‘é/.p¿ý!Yø¸vûæä° ‡A‹ºgaqº•45¶¾©©JÞ‰Ïwf›E¼ïlvZRˆj½i¸´Y{rÌDË¢EQÒêb¬D‘àŽô*Ï$VÒ«Üü@‡$ÊŠgjxlÔEÙ)Ú%bÊrh&ϰbæË˜Þ%sñ-ð%‹hÞØ´¹íÏí¢·¿owHSó"Ü"UXb#ä5Ò/´6%&žíd/5Á¾/Ë<[į‹99n¢š/FV:¼‰aØ…Ç.åI„jñts§}.g5‘Š(Û2©;ÙäÑö÷¹ ÖXäÒA°JMe’HÀK"é,y·w0ØŒ‹°;_Ðô–蚦r£pAéÚ™“ÿxnÞ†‘ŠzÇDl×S.hS‘›¾)O|"/kÆY”Tœo—‡Ð%i@ÐFãërç‡e!̲ÄŽDO¶ iÊŠ¯–0ËNî ô1´+‚!°9^Ýw…¾S*ׄ('={0QråC¢ÛäÐx(¯÷¤õ‰mûO~ Û†¸M˜ˆFUR¦ßÇZ#ðô×q‹‰žb؄ԣüí8 ÕY¤ÐÓÐÜÒôd܉4=‡É› .~Îë(!bQ>sCcÖÙòI §Ig„­,°ÌVr'-jYÄ8£Ék­œêÓÒ¬µqIn¸Ãi9—CípÚx…IãhL¥³W& €…¶š£¶ ,:Úc*Š™¸# †}éXŽEÏüC/.ò¯% "K¢7ë+ÖM[ÌUoiEGL3ÕŒa1Û^.»dÔÛ ÍvƒçÀù ±‡Áfœï„†…EÔŒ»¶xlúE`?óP¯ÇF¶Ò#û'¿#;c8ÃRw 7¶2{QõÝr…B9`à€MI0.ÏJÒfVCu8&ë<ðj·N襟y‚gò™Ï$³Q„-ê ûÚy£u3ªžØ 48ðDȘÿÐW-³qYa6D«° òC:>OuˆŽ “X¦X|Á‡EøÅlÇ:îX†ø[¢®nu“¼‘n“6(QÑûܹLÛy·Üé»º×øÔ…kíH"µªðVÜ‘Ÿ0«¨ª€ëNÆ“j4}qO¯±¯•£ÿo„6RŠê†˜˜Þ†`DîºOcUyÌ$7žX(“d`pÞàDŸ'^ût®F4 з ¨Î¸ÂIÄa“èYeu‚E&ú2ð*»ÍÉ`7ö.ô¹9ö ŸTÄø”é)¾4TZʦj^`ÆCï¾q)QŒB\ÊXÏ™=UÆíEõþÝ6ÑÍ6FábŒ P*—_±õp…sQ…2?tC¸}Åðž ATW­`0€„Ä~‡Çî4&úè½UG4y(¬gÃìlvcFÊ©ÅpG+?¶ZµïvÛÕ‹ÀèÎ+Ó°=x¥õF ûê®B‡Áƒ4QÅ=,æ–(~[ *ß‚a-ínˆrÆ™÷ŸÁPÓ"ªÆlh! ´¢…^–à瓯Âq‚,:B $¯åFÛ;(ÇJµ½÷ Ó‰¸,Ëž\„ƒ8ЧþÖµ%¬, RÍáþ*ð }y6è+>[‡ AÈ%Æ'Ÿ° +Ó*(GfVî—/í¡Ù¢—3Hȃ²ŠrµÂpáð{Ðo:3jU±|®–114ض·_Ƶ(ϵgj—5›'±ˆiGþáv™ m†–³•"ÁÀ¢?|cœ¨¸4ÊS8‘ÄŽ £g:&¬,ß |Õ1Òi/Žè¥2 y­—#¡œ‡Ž*}4[ È1¤Y÷-¯’Qœ·¬j‘_Ô`Ã|‹óDÏöºn)&E}Û,é!£å_úÂEl¦H(Áñ±îóÔ:ÞZó.Ãj‚õÍAì(‘ÝßÅ™­S¦ŠÓ|®‰˜~ïJõö#o|è@JÃ…*ûÀhÔèmþâÝgð{¹ *m éÅ6r+Ï´{íäÅKSnöp9¹ÃAÊR%«C3%¯“Å(7ÉC@µÝõƒ=”ª„À~¢ÄdT†æ¢F‹G˜lxŒÆz.= “ÖÓ†¹p/ù¤ wÕÅf#Tiu•?Ê’îI«•PëeߌÀDÙ­ve™2Ž[uxÚP€S‰•ìoJʉ˶ýµähXîB$4Lq#ú/aÞF#jôU`y…n—dT”|ÄmsìކƒÙH]“‰…9æ?œb¹QòõƒŠ ´wT*—MT"baºäáˆÆ@Fms!½8ðÙ¾X‡÷C¹»Â¯^ô Ã%Uç‘—ÊEàs¨|¤Ú0êohÎ8Áëá1$äRuûFl]Uš´©ºXÕ>Kw5åliý{>‡ÍƒÅaÕÄ/Rˆåaœã¶‘»»11;dÃÉX}¨ÔFÇ^|iã_)Ó± ¢°%Fe—‚“…ŽeôŠJ¡1NtÂpH†9Žd8f`î¼ãfx´§cÀsA0yd}JDc´þ¬Ý—Âñ»à¬ùÿGA<¥Ž×Çp}ˆ‚é‹mö\BsãlÕÎp†¶r¾¾]â„„wº¾0<³21ž®^~”>C'Ç_Ss,U ø¹ã¸âɪf^­( ó^]µ‰çI–ÉÉ|†Òx²8uè¢>áNœê·Ï97·)YV*=`›>wѨåoT–G«Î»ÿAU—§ÂE æt¦õ¤Q¹Ó‚þå¬J¢5gUò:@ßµz.:P|Šÿ¨RIéD(IyÉ3èâhRš*–à'Q§qé’§¡ñ/¸Í^^Ëd4H$³90>ì_ý¢Œ¬tŠŽŠ-*¶W/§ÛæŒ2-ÒŸ*®ó öéçYÎÓ7P¾wÒxß(%v5P—àÝ·BjÅwŒ’­‘|5°ðôö@PãX(ªgžò¾ûÞÊXådבDo/Bx„³áÛ‰®û«ï–X,1 Q› éSMþ¶!ÈMo½¦‰,o»d<7 K¿ðš®+VUը܅–ƒÝ#bÖJZK©FVÜ©ä¨]Æ´…¾[ËÒX5ªË–@TÞ§Ôµ›#Y¸H@Û ~HÍܽ‡º¿çÙrHý–'b7ä º°H^V 0’%ä/ËjoíË2i®@š>' £QMúN ƒ¨(¨¾IZoƒkFæâ‹Bo¶Ú­à”Î_Uq“¶0Ól|ÖT7éLÀË âoáÈèùüu™xÛ; \ @^ò}ö­»ì•îwrîHxWœ—5À!F*«~¿žÈAø~CÄÔ¤­:•Cܨe²Kþ/0LZ£Å0N,£ï@2’€^W[„œ\®R_¯ØÐ)ZÖ¹8–5dñ`ꂥص­C­0ŠÊ£çåëª6³ú¥ï*¿ ° w’(Q&tk®×öJÀ ¹LZ.]Øu7|mͲ¸UËËËãoþ[®w-ÜH;ÓF“_¯eÑ"‘Xu+Ó®ˆ®1YµÏªhåc ú­°)‰Fo#»7 #QÙ#¡$ÈXU•‚©zÈáféÏl 8ecí¹«ø`’•YŠ-íœ6Jg£Sr¿ú=Z,+ @™Ø³}RpÀ½8sˆv—ÞUEC„Å»Ã`Ÿ•}•Ž’’ö’Ù@îp6T0SW¿—hšò`ñR§ÄoÈ$ˆ"æ^[ä¢UᬠøÔÖQ»‰/GDrªDä;ýîëåÝÛP#<©.-HžÖ˜u:ÓM§'F Œ•4—ÒˆëXÖI)…3ï‰>Òw)¡ìˆ'”% ¤b¸x³;t‰³QÁ—Rºðùü nü<)?…ˆ êšÅñfËzUöÙCøš _ƒ7Ÿ{ j»"©‘ÍþœŠlQÑ"5<(Ä*I6}A'wÛÈX‚Nd°_ðN)ߎ³Ú/*ÄŠ[p:ða¯¶³¯•sðÝ&½àR­]}^ƒ s·ÌuÊë·Úõð1prVYfv[4ˆÆEos1ÎOû(¯Ø»²RïŠÞÜejçªÚPà|ß©ÁîÞs¤¦ñàò~iܵxîS4êì7* YU\!ÀV «]þ€£úIã(J²²«¯U}ÖÇ(»6”Mâ¶—s†ÒñïÊU‚TpÉq1£²µíGª¶”ÈDzV¹ 8N'â*G_œ¶¹ÜX€ZF2EŒŸêð 3Y¢Û,@«¾c}ý©Ѐî^ãÆZþ&'¤R Œ¬ø½Ô¸þ¥½dÜ7¡u“ôa*6|»?«»N F±’Äò¾óýèœî¾Îêôu>&ªb˜«ÉqY¬zòÚ•IY’Ndkí«µÃ¶7B¯áÇŽÏyXëDRnØS¼=b÷+mF¾—Á„’H=§tž|iЖԣɭµœÔý¥{ÞÖ—Õ¯oHAA°I½í¨SÙÓ½ i»DL BÔFpÒ¾kÝ_ÛÈÃZëĈêÆ{×Kñœ8N竲[,õÕ‘hЈ㯊µI`W²j dx-qöÜkçäþe³c?gôó¡!…ûë÷vÀÌ^KðJ²z—Tº4”>‰¥ï+Qu0,#Õ—Î9tšn®‘¶õ’”Ž1*´o´}¥13P^;Æò)ªúÊ%̨mù›>™8iyoSôCÌy¢ëÕ\’ßTy-íÀ¬­â Ç…Ôï;aœ“òªÔ”¦ KêF1›¦Å4[ ¡êèu'Úc±¤ð챉݂W¤´c®M5Äp;'ÖŒJvÜàŽ€·ªÜõ*ÇZf[d¤®ü²øé•~€RÈu|¬À x¬ ÈzQÚˆÏîR,–×6D]Ô­ü^éö¡„}|…Slò ‹º´ÝÙD­µÕ ‡Tû©~(X˜¶LìšœïÊí6j4Iì Sð)Y¹?¯"V±u¯ö ÂÁ6ûó{ö¡/*êÎ[>j\ø}+®.ƨ¬nm´C6•ä4À<£× Y XÕ6ŠÒ$æzSV¿?C„·=ÆN¯”­÷»ë‡–õ3xb©ÚŽ|ƒýhM­­€dâí¬&Þ3A8‘m}w»Ø©èXúmÂM`¥þ€ˆMéØû§ß®‡çTßÑ,¢Òå°.^Ed *C=éž´Ö¾Ãÿrup‰‹S¡t¯ÝÕJMb*)kìLƒø!#:±‚–¢ûí Ÿû× Ž^ k=móMë3ÌÑúœÕg+GöÈù^eIÂH5œ0tC&Ó†å™j¡aeÕŽG~åÞªŒ~ëspffÀ®„©]]ÄöÀîç£Â¸ZŸèºöÝC{ò7þµà­!¯d‡z_‘q޹íÊ÷#ÕC¸„ßêÚ"8N¥´$Ð/>!çÉÈ¥¿ø G{2¤N \:B€¬·TÕÚH2EÙ‚q—¬ª!­x;à<­.LNrêmtïø¤÷Y“ð”HɺÄ4ª†•ØÜç…þÚï!%ã(/~]Òž\1Ê {E‰ü›à`ÐWÞ dîR©ð~ïq‰2óœ9ÐÊvúø¢>P7ÀP¯¤©Á:5MŒ7ªÂM¶?šF*¿±Õ NÙRDAÚôñ•ð0[ÙùüI_b4©tSÝ ¢l¹”{Øî´æÑIGmt+ýov%í|Õµ¢)"!µcë;uY§’©|1¡UÕŠ¬|ÃãEçÚʦk62#/~ÖÓœëžÂ-Üê.bÕœþ,•&ÿ´Za[Jµ»PtUw¾kç×¾—iν²óâ¸Ø˜’ýžx‘+²ùs±R §kþ´æ¾üð„jÈvþ ۲癖8ôñ!î,xúîY>üúñ?2 I0endstream endobj 7 0 obj 5605 endobj 8 0 obj << /Length 9 0 R /Filter /FlateDecode >> stream xœí]ݮܶ¾7àwØë\8ü‘D  ¬÷œzÀ@ m H‹ä¦¯_Rgfù )®rÇF`ÀAd‰Îï7ÃåÐ\þ÷þÝ/ÿŒËøÁ_æÁ]~ýçåoß]þ³þÃ‡ÑØe‚ÿþú¯÷ï>~zÿÎZÿa¼„Á}.Ÿþqùþn/Ö\>ýtùÁ~üËåÓ¿ß¿{oýØ5”·•¡ÌG¶Á–ñ»ô¯?˜ÛöÄGš÷'/f°ƒyÝž;óaÙÿÁíôÄg¶g6R±?´îà8{ü“ˆKk.!þ.Þ»ø·õ‰G?}—YgJ~Ø)¾µ.Â]lZÖ¶ŒmZÂN×ÈtÝ2¥Žµ/<¯å¾ÁŒ¸çoh!C~RΔÿߎvÊ %ö ÀÐÅ\·gჭ¿uÏ«Àwòë3‘!?4yðL¸ñæ–åg“djó D¿³÷òÏJ¼Û‡¢qœñÎÒðôá²k SöšŸÅ§™Ú¥>áÝ3ïL4¾h}9«3 ïí5I O쬲TÏôÝ3}®¡,x;2Ù(Ó]ëf¦/.,&¢ª7ç… B¦*¬°cÊOè+ ºç·f~KQÆÈ‰ÅÎQ×¶5‡ÇHyT…åÀœ/—æÅÃ,™s¤LQ÷#9>óÏ1ý¼n¢ÿ‘j gš#­:9™¸àÆßìBâzsÅac6…#©XîLŠk§(kÖ Ëª­Ö•ê‘•td'@BE5#û/üY6ºIQ¹®RT“Ÿ‘3Èô8“äuÏÔ»1ÃóÕ-h±ÏÐËe7YCöFê6¨†ƒc ytMôäŒ‹Žˆ¼Féõž¢Y4Ñ“Ykn¥@‘œܲp„˜Ið8R-øå°Pñ ÓâÒ‡á0ÈO‹Ñ½‚gE·$º+,ðžUH§™EÙð¸ˆCZ•JlÝgL m¬p&ñ»ÁøîT›Àgñ3rËjÈQ#¯ ÊˆèiÍ ƒˆÐ:¡®ÔuPìËz!¢ü5þ-\¥YCnÈ*jís³ ìóP ¨® çzIï`ðè8˜¡RI“Ô”¨½5µËOS$º­] Ùl®îR1ÎrásT¡×ä0iY9N©úÆ+sÒzˆÚ5Úì=$ìö~y•r©Í;$wQ™WƒÁV 1‰Î7¬ùšuSåF{wYiP´õ$ û]¯àèà8ãqÀJ÷‰’­°Î «×cÖy¡—KÍH™'yBì9{Fz3.kŽ„Ó9åï`3òbžÿ ±Á¿ö&-6‘6…¨ug_Œ£é*U¤/Ä*æÂ å­Àöž i#º°šã)ŸùüÚ—#^»—ƒ[[ƒUªú‘ü¥À/R+T.zpÉ}s¿í‡¦AãYU£8¥Ì÷$²ªüáW›G Œ²ˆûxÍ2XèSS‹‘Îí °n˜ —äÙfÄÔ7õ)G¤ð팾‰]©)0c*Y¯ÀRÌjȉ.ðD"–¸È+Eîú RÌÁVÉ(hÁkE{#Þ¢ÚÏŠ3`{ŠÎÀ?Ò–•˜.®æ!–¡aoüÑF£¯(_¯ô''HÁ(Û¨¯Å-‘S”µÍvt¨ç¸ È?»4€P~XrsŠðñO*²­9¿3Xæ‚À™õúØþù=Ç{£¡J1ÁÀ2œA™‰Ë›!zç]O’h’NfâÜ Ø35¾:ª[8®?–5X†ë`ÄO.êP€$•µ âÝPB)Ûv›>Fy¯+ }”ÆéÎðVÊO'fÊ ùšœ1"œãMÛF¼—”ú¥l¤¥P<Òr,úbþev+QÍ®ƒÊ;\9ßcT•:s“Ñ9¾HžÌÎ,e²|"³#õêÚŒ™lòøŸ7c°ND¡ƒ_V|G–FÛ#¨þ+þv"è<麹ìVÆ/¬j °¶·Òà¯à xå J,½WÆ(Ú¾<ô”°üìÎEüÎÃÚ¾Y‡±ì³Ùý—Y×9ß¹À\u ¶ÖUG#S{/k÷p¨›}N±@ö–ÿpžé‹z8EŠˆÏ<éòUëæÒ _…ßaä®ûª6MÓxÎâw –9å?§ß!ë¡Ù«QG`øŽqƆÖ, 5yœõ¨g¤µâKδˆÛXiGö4¡,^;8~h„ü—ß ð­Æ ðK%YXW4AvÄ´‚€4¿=U?ݶÞ1œó(ø‡ˆëNKl ó9ÿßy°†“Õ—+h ê,x”k˜N᬴êèú{ÖH@-®þÆ•ÎuÎ×%È1$ˆU´NŒ 0NŸ-æœ-âw|uŸ-z{Îñ;þèœ-zdCþuPÆÁ¼³#–cM‰¸èP³:"ÎÞʧúf=,·Ý]1ý Ô{j‡GEK`:Ú9@¨O@V&ÑÖ‹vxæ´Úóøˆpµ÷è®`SGV|Ñ!Æ€wíi{B€KrEă¥Î8u®´i\„•~)0øñÿ†ºúõd}d^nRáDÓˆz—üùSmƒÛ¦»¶y(MwXØïY­- öº¶Q›eRgÍ'#½9cUv܈hZ4?Qš1¥FDÙLÅ ØqÚµ¹‘è“êfèòpL4Šán×V\ö5uÒÈ:íES)q–Üb÷léLÐHeWÜn=¿7 [Å.Ìy‘ Áuiu)*ÚeѾp]CR·¼Ì è_Âü ኆ®îºug 2¹Iª7Ü ÁöØœlV )YIQŠ 7¢ˆX8®­32©²¹dT¤ä7j-v´K/D÷ž3÷\ˆÎ £ MmÖDdÍ ¯zãzÙ߉{áFéZ`x-FX(kBl,?RœÃ.k#¨8v·‘À¯³w‰•[L*NÑB¹hºÆƒÙ+š‰Fè<”ö+Õ@"ÚP$}}h3¶º}Õ[ UáÇ ¯¢ ÆCÛIêaòTü ĶzF ØÄFô»q[sÇýÝ8§– Ç¢ö²·5v™MûÄ · ¿©šDK 9ó3u©VZxÚæ¦Ò±W¤‡÷Í(öK.ª¼Â@Þ×BÉ U²7ÊâŒhC)a‚ïK:â°¶8ÒähnѵwC¿6ùRJmçìQxõ âSî¤!ç!RKnû"Àyž±¬ž1h,+ŒÂ]È"â>7Mg«tÕ®UlœgJQV›Å ým1ÜÚàG•j+&eÕøòDþÒª©ÏhƒhLê/'nŠÓÁµp_SÌÌdŒID=w_ÇoXËqúº]ZCðÖÂ"Ý/AÇ3$"V[ëÔLé`›d÷“ÕšNU3_ì"˜ r ±îÈ]ÒbÆ—CUÔçVu]pÛ=;ÍF‘$B¯åå¢èÓÁ~yÍFY>j°C¨--#g½ï"¹œèô;ÇN¤mÁk‘,˜Îa›Îú­V›¯ñU„JëÙ5*(QiÁ´. ÚjÀx{·;œ•ä#ñ‰V£ÅbŸ¿@¦Îf&?¶Š(¶¾BlŒ5iJ“î06É—›5nl¹;z}Ïb+fU•…^•%‚¹wP8Ñ£Cù‰¿Õµ“vJ;£>¼¦ “)sØŸ/›h›°•N¥~ØîŠJû[y./‹ˆ¥Ø º±Õ¤€÷ú}ˆD*V–N^íK‰ýîZÐUÜ…´ÝPoû°÷¡T‘<ª!íc  ­m³á—‚˜µ°_­øNúZ”²]wx[%ÞÚ'؇¦î‚ll`ªQ –:óZ¼_D0\Ü®Xù ´'>BÙm›qNëîÛÜ…àŠc~«¬F×S;j/6:svÙ¸Ðu»Bíá®&ÇêÂ` ʇü<…r¤Wtò]C9%Ph*⾫g×#wÑÙ{lê¬á~[ ßYœœ!•ºO€uö<¢„ú­¼-¶OÒê^þl"ÚªyÙ[ƒ­º»±¼Öjå[½ÑÆªÇ UÓ¶úåg»?7efD¹ßÚYò@8þæ®í2eó|9 I^Ü,b- emzÝñZ!jæ…“!AT#ÙâDqYüÀ‡¥¸ö/µæ©8:+Z^^¢€·à¦õ¸þ?ÇöÅendstream endobj 9 0 obj 4523 endobj 10 0 obj << /Type /XObject /Subtype /Image /Width 241 /Height 120 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 4525 >> stream ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÀxñ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô&`@%sœ÷>¦›‘ýÁùŸñ ýÕúæi+6ÝÆ.G÷æÆŒîÌÿ%®À\îÌÿÜ™ÿJ(»r?¸?3þ4dp~güi(¢ìÈþàüÏøÑ‘ýÁùŸñ¤¢‹°#ûƒó?ãFG÷æÆ’Š.À\îÌÿÜ™ÿJ(»r?¸?3þ4dp~güi(¢ìÈþàüÏøÑ‘ýÁùŸñ¤¢‹°#ûƒó?ãFG÷æÆ’Š.À\îÌÿÜ™ÿJ(»r?¸?3þ4dp~güi(¢ìÈþàüÏøÑ‘ýÁùŸñ¤¢‹°#ûƒó?ãFG÷æÆ’Š.À\îÌÿC<ÍÖ¡>PòínùX÷÷¥ª×ëìÿë¿þÈÔÓwOq¢›Eh"÷W虤¥?u~‡ùšJÉî0¢³t¿ùk?õø¿ú"¥¨]E~²Ú½Ä¶âæ+vØ‘ˆçT`ÄìÀ±å~Pp*ÔXfìr$Ñ$±:¼n¡•”ä0==ÅHÄòÊê‘¢–fc€ u$öÍèíwcáÝ"ñïhÞ+h¹U_b§· À’I‘¶•íö­}áû›Æ¶ºKk«žE“ÈòcŒÂÅJm>alí<±Âða“ª@ŸÛ:5Ædßö–Ly³DÇîçn}ñŸzÖ dZuœÖÍ$ÖHæirÍ$þñ»Õ¯ìÍ?þ|-ïÊÿ…7Iÿ#ÿ]¥ÿÑW+TIWû3OÿŸ _ûò¿áGöfŸÿ>¿÷å­Q@³4ÿùðµÿ¿+þfiÿóákÿ~Wü*ÕWû3OÿŸ _ûò¿áGöfŸÿ>¿÷å­Q@³4ÿùðµÿ¿+þfiÿóákÿ~Wü*ÕWû3OÿŸ _ûò¿áGöfŸÿ>¿÷å­Q@³4ÿùðµÿ¿+þfiÿóákÿ~Wü*ÕWû3OÿŸ _ûò¿áGöfŸÿ>¿÷å­Q@³4ÿùðµÿ¿+þfiÿóákÿ~Wü*ÕWû3OÿŸ _ûò¿áT Š8no#†5à £~í;V½e§ü~ß×aÿ¢Ò¦[ Õk¿õöõßÿdj³U®ÿ×Ùÿ×ý‘ªàhÑE¨ˆÝ_¡þf’”ýÕúæi+'¸Ìù´{9®e¸&é$™ƒ?•w,aˆs…`3€áDš6Ÿ$âi!fa(™TÊû@Û·*ghlòH99ês¡E3ì´kˆÀ“bÛÉq$‹ùU˜…8ÈÈìHèh—FÓæiŒ°³,ÊáÊûàC\áX‚Ù`ù<šÐ¢€)^éV·ÓÇ5Á¸ßÜòîdŒ)ÁX áˆÏ\UÚ(¤ôŸøò?õÚ_ýÕr°Y4ùÛì^aÜC0´fɼóšNŸÿ@æÿÀÿâhòtÿú7þ¿ÿG7ÔV“§ÿÐ9¿ðÿøš«]ÿ¯³ÿ®ÿû#Uš­wþ¾Ïþ»ÿìInQZˆ€ýÕúæi)OÝ_¡þf’²{ŒŠ)âšI£²Ð?— Áù[hl~LãRÖ¶©§Yjš¼W·ö¶òµ`²Ì¨Hò"çôàÖn§q š²OÚÅt—ÐÄchÙî‚yª¤îÝû¨ØgŒaƒg9“X¢Êé/lmîâ #¸‰ePÝ@a‘Ÿ~h½ºK+‹¹CíâiX/Rdãߊåt3¦#IþÉ’ÞM[e¿œbpò„ù|Ñ!Îv…Ü0Ü µJæ:]ËÝßYÿi­œæî(툹cä¸+#ï? $pá6àm§`;ZÎÚvŠW“)1ÖdŒüîUà‚rFñWk UÕ4é®gÒ®¯ím¡UÛuçL¨Îgb‚s‚Ëvœ”ݤ1úOüyúí/þŒj¹TôŸøò?õÚ_ýÕrµD…Q@Q@Q@Q@Q@÷¿ò¶ÿ®2ÿ8éi/ä%mÿ\eþqÒÖrÜh(¢Š‘…Q@Q@V»ÿ_gÿ]ÿöF«5Zïý}ŸýwÿÙšÜFQZˆ€ýÕúæi)OÝ_¡þf’²{Œ(¢ŠC (¢€ (¢€"±½†ÚÝ¢™g%ñ‘‚ìG c¡«Úv¾—ø 'ÿUa7—d†6e¦ ¬GM§Ò¤òµùákÿÛÿˆ­.ÄMý§kéqÿ€Òñ4iÚú\à4ŸüMCåjóÂ×þÿ·ÿG•¨Ï _ûþßüE`Mý§kéqÿ€Òñ4iÚú\à4ŸüMCåjóÂ×þÿ·ÿG•¨Ï _ûþßüE`Mý§kéqÿ€Òñ4iÚú\à4ŸüMCåjóÂ×þÿ·ÿG•¨Ï _ûþßüE`Mý§kéqÿ€Òñ4iÚú\à4ŸüMCåjóÂ×þÿ·ÿG•¨Ï _ûþßüE`Mý§kéqÿ€Òñ4iÚú\à4ŸüMCåjóÂ×þÿ·ÿG•¨Ï _ûþßüE`2[„¹Ô!h–]©‹ÄÈ%1ÔCST;®#¹Hn"‰w£0)!n…GuÞ¦ÝK*4A°I<›8$/ÊXœ¼)ã"¥Ý°,QPmHËí§þ·ÿ¦ýŸQÿŸËOüoþ9JÀY¢«}ŸQÿŸËOüoþ9GÙõùü´ÿÀVÿã”X 4UV‡Qòùiÿ€­ÿÇ(²žYDÑϳ̆M…å Nq“E†Zª×ëìÿë¿þÈÕf«]ÿ¯³ÿ®ÿû#P·£EV¢ ?u~‡ùšJS÷W虤¬žã+ZÝ}¢âò-›~Ë0‹9ÎìÆŸo¿Â›&¥iصyI¸)"6(¬z+>6«ŒA;‡¨Íä¼²Ô54»«ˆî.T’'‹yQ¯ñ89ÊžÕRþÏP»»]ö×ñÞE ]l€B²«# ó6Ñ“¹zîÁáE^ÑuË}JÎÍñq<*Çll#/·,ªäm$sÀ$§= –¹omg|ÖïºâÞY7ÆÞ[º)%Cà+ƒxoCŠ–÷ÓhÚv—>Ÿ5©¶[s,ÒÙ{ÿ>–ÿøßüEl½ÿŸKüoþ"–Š9˜XO¶^ÿÏ¥¿þ7ÿGÛ/çÒßÿÿˆ¥¢Žfí—¿óéoÿ ÿÄQöËßùô·ÿÀ†ÿâ)h£™…„ûeïüú[ÿàCñ}²÷þ}-ÿð!¿øŠZ(æaa>Ù{ÿ>–ÿøßüEl½ÿŸKüoþ"–Š9˜X…Ä÷qÍ4QF±ÆëòHX’JŸîîÔ:„r·Ùå‚?1 —y@@, ²ñž3ógŸJ¹E+šÓÝŸù†Üÿßqñtß:óþ·?÷Ü_ü]jQEÆeùןô ¹ÿ¾âÿâèó¯?èsÿ}ÅÿÅÖ¥#^·M:ãþû‹ÿ‹«:LCÏ:li¥Þ •UyÇßƯÑEÀ*µßúû?úïÿ²5Yª×ëìÿë¿þÈÔ-ÄhÑE¨Šsý±_lVñ:„ÊA=úm5íCþ}!ÿ¿çÿ‰¢ŠV@µùô‡þÿŸþ&Ú‡üúCÿÏÿEr ¸nÔ?çÒûþøš7jóéýÿ?üMQÊ‚á»PÿŸHïùÿâhݨϤ?÷üÿñ4QG* †íCþ}!ÿ¿çÿ‰£v¡ÿ>ÿßóÿÄÑE¨.µùô‡þÿŸþ&Ú‡üúCÿÏÿEr ¸nÔ?çÒûþøš7jóéýÿ?üMQÊ‚á»PÿŸHïùÿâhݨϤ?÷üÿñ4QG* †íCþ}!ÿ¿çÿ‰£v¡ÿ>ÿßóÿÄÑE¨.µùô‡þÿŸþ&Ú‡üúCÿÏÿEr ¸nÔ?çÒûþøš7jóéýÿ?üMQÊ‚á»PÿŸHïùÿâhݨϤ?÷üÿñ4QG* †íCþ}!ÿ¿çÿ‰£v¡ÿ>ÿßóÿÄÑE¨.µùô‡þÿŸþ&Ú‡üúCÿÏÿEr ¸nÔ?çÒûþøšA ä÷aŠ4‰Ë’$,OÊGM£ÖŠ(²SeQLÿÙ endstream endobj 11 0 obj << /Length 12 0 R /Filter /FlateDecode >> stream xœí]Io»¾ð˜s ×^€‡#it`  C€¼Kþ~ÈžfU ¿"‡3#˲ñ`Ø‚[Ýd±ö…,šÃÿ¾~ùïÁ¤?qOþ°wøý‡¿ýéðŸíOÑØu‚Ÿ¿ÿëë—ço_¿XëŸâaž–§õðíï‡?¿Ùƒ5‡oÿ<üfŸÿrøöï¯_âSHƒ§ßýæžíËùÙ)}ùסá½m ﬙σÙôÑ>ƒ=:s~¸ìOÌëùÿóSyb}Ë•w‚9í_%Ôo•'f)O"}çöõ¬åÉ c¿™@`"h¨¹L·ÖÈ2ÞNûà Âê¼YíTÀµó“-8³ „t{¬I°ý©è|ú`C¸;ØL‚Œrc .i0W†' Þöõ{Zš=šÙî_ZOƒÙXc¥oáõÌþ´Èf 9ßÒ‹;’íÄÀá‹/iëÓTæ0e™s…³@phS¦±<- _$ QÒ,Sû˜Xè*ð¹3†c`<­Ìò÷=à1$Íd\^GY‰óʘ‹VûVEÐîÂÔ£˜£{¾RЋR ˜vax-åiâ `Ñ`s]‰QØæn“é ±Âĸ}+¯¶©–wD>½IŸ€|îŸN@Ÿ™É›´DÂÁ[‘?§q¡x{V•±It–dÅ O ê\{¤&”ôß’°“Ú‰_xËúoº¢²èÌ:ú—=Òîú8ݯædã&VÞÎ÷À ºÍÊ‚h’,Àg.\Ë®(K4mÓÝžÒEAOŒaZ`!½“VdzÒz½òR舊±ÌbÁ-­fèAØ,C6vÈŽLšpæG„/™]EøÖl› ¿ Õ‚X³sÒ£âL›Ä„YÒê±¹0@Öxt6š×Æj}¶<;€AÑ­¸ dv-,A³C\ÓT(%s ‡[:Ô‰ba!£'‰0I*v[j‰+k¼tdC WÑ€´¿‹\RAi¢7R³ûŠâÚãéˆÚÊ“¼FZ: °£Âʱö©ÝO›&ªyºø¬b ñ;›ç“z1!-& •Ø;ã#ã¿N˜=—_$»Ìnx÷H &H!_ém§XqÏ/ä€ Ÿƒð$¸ù¸‘n—ÍÍ>m ¤ŇìÌjò4''5¹ôPk"ó‹#òS›„JžD8ñ— Óâ‹m¼Ë9Ø2µUž´FÚGe¤éT4ÅÚlÎó¤pþ0Õ_MàëÍæz­G/0Ž…qVç­gÆUÀÙR?Y=Œãœ}†' Œêq<13`UÁX¬Gžóîå:½<`ÕÀ™kzi¯bU,æš›sáÈð¼Â ÈáÀ +rÝÆ”'0—ò©ì¯¿3Á;8ÎHÁ)²Ìº…8êŠ?ç²Îœ’išFõݯÿd½‚³uÕq6£.Ë(Ã3{ˆ¼|ΓYuK/}Ò‘ÐÙ@ÐÙQ› ­vÍÛ26vfâ­" "®;U·ŠoBr„…4‹ðÕI²°†ò&6<ô*;Ä~=zÍK¸k­ªeÒ¯EX/‹ÄT@ @ø:M®U+{„'±èlËЪ=ké"ÐNY{í'1Qû²3GµPÙ#µØOä=Ð ¶)”‹Ôì‚5 ©’±DL‹b˜´ªºwŽ;x{P»Bª9!îãV¦Nõ^x·½H¥Ù1“„Ý=tÚ— ™¢N©«Ç~ ÈØg)ë.M!ꎎf•ñZ·¿CE ¨£&áV`ál¶v)Ô|9úÂ09Em%v„‘ãÔ ±dî$ÍgŠßµ­jµd3HÔ1l ÈwV4>?r>G÷÷ªd 2Oö\Šu9ï³y»ÍÎïÓ‹ ¹li…`aûR¾ï&ãcX•Bt»È1áÔ1yòä{ _ ,´ºÙ‹d7$„'5\ÆŸ Ý!šÍ2ìRÒ²K´ˆF)Èíc¤zê—šüy•p‹¢â±u,ÛóVÀtƒ’>f Jza}JQšÕeM6YÚ‘»*ζšh\z·$Ħ¨%ô£æ«·øâGáRÙÚ&£LírËl“Í úÙœ²ãߊ!'ÀOÚ§Í]¼ ¶ÚE€ô…H‚—õ~‘+7K‰!¹ªmtc)Îdƒ!–"8ÊÒNIÈQSú*rF_«7¢¡$‰&G#ŒÓf½öÜJ¢Ö^™Ö©8ebó0Ž78 òë¬æ–¬çt~)q‡T˜·Ô9£¸Qí´o³Z{ßm¤õ"o0õøºˆDÈû÷Ù{9°¢.™s=Ò®ÚD]l°ˆ‡§quù_@?0Ä6u¥¾°mÜ$®qìt°À;ÎM}xá…½bNáÁ$ çz@z?l‘üR¾[¥¶¡K²Ø;ÜN¨†fæ³èŠãXdÀ°­ï`l‘A`WöôQ­€ˆ$¯q“cŒ… BOKl>•5²´Ú^¯îWìœp@xÐÃíì×qÙ÷±¹8Uý_ ÛÀÕÁE#™‹â|g¶ãÖΉ‰6€Ô8ÞAÇoß~¸ƒ¹Õ¯¶Cp…,Þ²>%6x«q¥³}Äýw³Ð!VÉ;Á×=!ÑÕaËÖ“ÎÙ¥6Ik‹Áë⨈"-PHêr%q:Ô» jñÊ¢ij ¼+vª˜ OG`¢¡>ÎBŽ»V8©q GeÔpN™i;•þriLÛ8]“oì„S}ˆAËê°ñ‚wÏ!©úvÂ¥}FJµœµBȹ|“ÈºÒ ƒ6ßýzQË8áFè:¤ïËàdPñPšu=‘cŸÍ©„œ- B¦Lˆ+Y†°\~*# :¢d+êIkkÂà˜}ÒK‡‚ƦUZ>b#v2„â>à™<ì ÄÕؘšx'R¨,¤øŒMXoí!Ö_I|…/pÜŠX‘r'â™fT„Ëéî®È榀Ÿç¹’úó6Çn}Fiœ­å°5CÈ[5üôœ-5ˆ&Ð[L+ÓÓ=kä¼$LpÞ©Þòã ,ÖZÀj/ÐEQá)ñÊ„*{&’A؂³VÆIcEÀ0g:ô½ŽWsŒ9&†“Ôr‰þ9–Ì¥ü3Égþ™ð²ý\Í•øbÍžQÖë˜Tööª¹’%±ksu[(ÞתÎg¥ Ã5{ë|ôsöVØäT1ðŠâÃ;ç8¼äÕå¾’â[ }z>ÊS«*@þVRçmˆ‡©$ÎD‰=“dÂdæÿŠ*™ò ò½v$÷A°=éV´I¤b(#DOý›Ãw…OéE ,Í@ÇÕ©³VžÓû¦ðp9v0]xŽôC\4IìÖm•ðp•<Â;Nykj¯rˆÞ+qövÆVhÅb}Ïgj©±tÆh{ošw{±gøt¹Ãka>ƒÚv´Ñµ¬Þ±ƒSEœ‘sqK•˜@ (ŽIb6)NPó4É]¨ë ìÔê}®îÒ]­Råwv* nµ Ð ;MúÖ4ä@.ŽÉ¯¢sÓd¡ ¬;EÍÚGí·”ý‡á\=3ëèNlÌP6,æBÍ/²9ø*„õ)Ýý q”kê(` r:”7hìo‘·†vlÛʼeOAo ¢×ŽybšŒe7ïîȳÙs²¢äeÉÑþåÂ_Ÿ›8a]Ÿžj~—Ï÷*ß=z2ŒÎ½ÂWpê4Â\3¨qå$0Õ=ë‚'”'¯ï3W|ê|àI¾çG•Sž+Œ'š”óÇ€åÌ+ž, ×1a]Ê™"Ä!œ°šñ|àp„^ÊyÖÎy³ú å„mÙ #gÛà3ŸÆ&xà¬rB϶Á٭؋wífïÒmõW½Ówxêu­ÎX*8üd:êgÔl÷Ñ«§£ˆŸW  žæï討m‚¯XG=Æ =ÍÖþêÍö©5›_—;4|õ‘>Û¯!_©Ù`>gb'•8°®yà”~ÞPfGÏ<ÔðàWŠ÷AArH\2@W’ŒÝ‰CÐ „ÐÃ&€\Ü9ûÀ;÷qÂ{Ñë1¬ö5ä²ÞÙ*ß=êOVÂnE#ÝN0j[´XßÍŸølZ2B, ´ïù×Ð’èß(øxF°F"äO¯%q¥?VK"½¾§–œÝ}Z¿ëùã¤%;ÃÏï~~-ÙóôÑf´c,ÌœMhçòm˜ÁÅüs Ú¹Çd~€y%ÓÁa›ÃÅÏøÁ¸ç1Ý1ôJêøØÅS鬽¶5I_ßMámW57wøgmÕáŸ6ž±ûá÷ãŸÏ¯ëŒ£ø€ç;½Ð JTÚ‰ÚôœÐKÃüzW‰‰ £Ðßz·¼ÂHöñ&Ì?è'5ý¿¾&‰ñ>Ï ¿Ò&Ïa}µ-æÜâBÖí8õÇzr©M|§RÙñœÐOB=]c•,7h+§OñÐ~¿“6Q¨ƒ+ñ]ÐãèCìG<ž›fïäŠ0CðæûÚ-Ì÷è¶ú«G%¥³ÖÞã̶\(šíód?8s†O°c÷;Ùæw˲`æ ¾ŠC‘€_î³ßø]Oã— ™ÿ,Y–¾›ï¯ÄïäÛðÀÂPUØ›»8ºúj©w|Òèÿ××Ú·E·t°4{/êèø‘Ÿ6#Hxîìtìä]:Ùš[ðs[%î½xž¸eÑζ,ß±<é ³Åî´O˜ùÁ{þÐï¨):Öñ¦=J?FS˜pŸŒß=º£ïºövôր£:;úÚüw ý>îÖÃj?îê§j\À½Ó#{à«Ggïdð;³ÓÚ£nËM‡£^@~¾+7…·¿¼ÆÐfôÖÞ‘N”ŒkokRÌ‘^Ówsîàf­Qßðu&ÁóÅ,çv—ç7<È’¥:—H(m öÏD¥3Y±èËß9ƒÆÓYnI"Î]Óy<<«*®Am_dÍG ÃB -N´n\¹™<èÄéc¸_]œvÔz1úJé®sÛå©öêÚ=Z›S¾{즼ÖlÛ1G J̪5å·5vÌ÷t0 V‚ñ<ê3ÎùJ6nŽùoX?A¨•Ý’¬4ƒ³»f¯ÉÞ …b7*¾ÂŒ”~¹ï~Ãë‘7ÝÙ†Gñ¨ðfIصwӽ׺/¹³C¸íËŽœoÄ•*2ÒH÷öÚû:×ǧªZ¤pë@Fü>:ÿLw~ ôýVêàtÚLÚ7cZgN¸M.Û|¨`b1û«F> stream xœÝ]I‹$Ǿ̨³íŒ%7†êZî‚ÿK ž‹ÿ¾#2ó-ß‹¨¬îéÑØ!”ëÛ·xÝþóõË¿O]ú§Ÿû—pš¢?}ûýô·_NÿZ~xé;7ðßoÿøúåõíëçÂK‡ée>½ýýô—»;¹îôöÇéW?ÿõôöϯ_Òœü˯ÝÜÝÖ/ãKܾ¹óúÅ¿Œ4j\¿ô/nûâ‡.úëúÕõ41Ð0ÏË;OßhTwîâúí–Žú]´+OóþËéýɹôe9ÿ¶ÅD‹E:ëL‡ðÝnD§uÛ¨¨näz7ç§Å‚œ”s2—®ä_`©Ëöÿ|Î.ÐþŸ³»'€m°N@•ÅÎ3,?É·Q vàq*&FÕhbtcGTàåxå9:4““/È+ðuº—ΆèÀ€ö5 Þè3S“ Œ3°ÇÙw¼Á Ç-ŽN‹˜ä!m0:ïúí^o@gS¸œëÌ5ñ (–p?9{@ì]Ažét ´O<—÷s—#ìê3ÈJví^‹›0€]W^NÉ»Ä W†&Í&Šæÿg¢â÷’¸Œ ¶1À÷Œ%w#d¦«D@¦|‚ô%ò}e ã!GŠxYcWƒ÷FëéðœÀ¤²J®Ã8–C § ¾‘‡&UBŸÈÊòå¦d‚ìQêøXî0Ñ"ý‹äÁ…øž½¡œB7‘^0ŽÏb²KÇh_77ÉM±b}X .ÔU’‚}AÂò”…b›g“(4x¶ ªAÓ1Ã% Ý”Éfã>þašåÉQèåFšïͼÖkÜx ’=Ї˜9 W¾± ‹ã²4ÆŸýMP•N‚ÌYuì},hð޼ò¨˜§Ž˜|Ö@,;)\¹ˆºN@É`›ƒÌ¢ p5% N#} ý–0T¶ Nä=X•Ê® Í¬„g Ê(W¸¦“øôÏ!ز¶3…¨%J"“²{eøóÙú,¶Ü¶$i4€Ü6kÑêCrff謙JÁNÄ™¨-@4¨Á…Ï¢õøXÞ“ýÆ&icèÈ{8r-ìxý„&N6'Úò–ÍšnJÜÅ+u€æTÃBç€ÏÌ`fr¡íZ¨f&Ay^×nu ‰iU'¬«dn}'´–-{D sgp ¸$,nÙ*üqu†8eT+qÈ£Ðë…yÇô@b|ò6½±˜(%Sz%Ø`<ÇÂI(!Ž\!Y1l ­=.«C´ ä‚H±'o“ì?\ž¤ÏFyéÔDCÞ‹7›½}Vëh%Tˆ/ô™Gñ!>÷ji2‡9—éØnbAɳJ7F]áÒyÞe¬’׿•bR nŠ@d÷ŒðmÏ`ˆIM¶„í¥uH×#š­‘Âuë )óDkDÃ(} øþšH=[Œ„–Ø06Ñs³b=u‹‰yᆤ\X¼¨ö„\”5X·Ê1Ÿ…¿úvþ¡ŠöxÒZ ³m±|DZõoQü0÷±$¤G^œm€Hf;J¥½Š)éX ÌY $EÀžÀÑ9š¬ÂŠ5÷°‹ì~‹Õe1HWt³®Àˆâ{.õ½™$þ¼%b< }Žâ–˜ó7*WÃ’N 4k×cKé ZŒõöyndFŽF7G‰;qVꎉ …µãÇÂÅUÁTÎX‚ !ÄG¬GÚèìÕ”{El<…zü@Ôˆsµ5 VL'WÑŽÛ:­.öÐ2Ò%¼t)È,ÇKˆ’Gï%žj”? þÙMDõm©fƒ»œðr†—øÓ‰r¶…Õ~2Î çqyL²§–=i¸D;„Âx>QlæJÆ $Ú)“ Áþʹ164Q bÁÀ;”Ì\&î·}2“-Je]ûŽ-`™ãƒõp0&ÿ‰8ñ7oØD=Po†jM?e˧$šàˆí%¢Q!I¹6Þp´׌QNXˆ¡+.Ä‚zn r°LÅÖøÀÝC. ßÀ4)ÔªPÉó‘%Þ—«¸µvÊ+tÄTÑ*¦âBFjå~rÔ‰Ùhpö\§ ˆ$÷¹©\åÖ•^¨å#ñY1.‹AoΟ*ãëÊ”.!9òîÝs÷áÛ´¹rŒWjƒ–ÑÛI˜!ÀAnÇ9»æ1ñ4µ‘(|©ê®ñLþ¥¶ù%ï‚Ñ1m–Öy_™üa;L²Ýî$çc×rH¯{“ãÈ-%B¦‘Bo‘}Ûzvç™<“’Z¸GÈÅiY¤·†—&ª%¶xÉk†rVÁl3°³ÀqYÞâJgD<ÄÚpËà$[hCœ•r¤svQÏ–¤ÁNB Ká…Š`sl‚Ø”M'œWÍ¿jÝ‚‘èe<¯e N°Œ¯„J@]0x‹ØFIĵe7í1•ßÅØèÝÜž™Ë\Ã2†ò!%°p+‘ÜfñÁÒê3£™*÷tK¬/Ž•eRBÖE©ñPmBg†Šã2Œ­ÇZ0vå—0Dw„Íâd!ಘ>c£„QÇsÄùˆg¸,¡,¾O]ñ”@#%P£$†™s[Њñ•6ñ‘ºÚ2΃»VšÃ°ø÷Q@o%Åñ/BÇFõœ‘:à”7ÎLT CM±•ËA͈HCçS«;þ†Šã}õc}èÉ¿Ó>ôµ¼½w(ù¢¯$(æ Yá°Ó³‘½òëЦ7£ 0ÑŠ¢•…4}¶/éÈçl诞K¢—¸|éÉNuE¥x¥Sõ\ËÂ#©Uè±Ó¢*¾ÉËIcëõGòþtÛƒˆäœ}­Þ+¶ãiZP=ÜèR´òЗ_ƱüBžª|‰¥îðå+Ã^þÀ {Øk„óà-Œ£Må—oçq°;¬ƒ+8OÀ3Ç÷@,¼>†ÆèÀg€[Ì8!Ž¡ó´åŽ3Ëv>% Ó0èU†&¶‚0•·²™Å;0K’*ñÐ[º%`âO«ºª6;ˆIøJ±R½:a1¡¹¦ä\ݯAt+`yœ ì—õü­Œ ܶ]‹«+XÙù†Ef7×qå?/þW pH›Ý:#P®6j!uß̲èøF¶ N[Õ3õT5Æ× •Ð,Uàu±P¯T FÜKž4Ô,¡Ssœµi¾¢ÐЉ놴›Ê»Ò’´R$ÔŒÈh¹Qç{¼>UU£Š+e˜SŽq¦¸šä”/¥&2B{x.Ôà=ZôÉFÊÏf7†Õ}¸Ó|ã’1I’Îl¢«2ÇK—à GÊ¹â¢ø I­_3*çƒô£Š(6žRPÇ@ÑÚ^§QˆÀcžzÜz4W b,— —lù05ì!;’ü®«HÛì8E#ÅœM Îß‹-"&’«‘¬¡…ëÇF›N‡³»¤ï|Ùú£‚åY—˜#Øi@?N¥4K¤MI6ð¦wÕé8Y+u®ĭq ä9ËL#]o„åäxKº‘n6j]̵]ˆ6Ö2pÁ˜•1 ›}¬Ï˜ JUÙ€W;ìè.2 ›²[snmeßíq©»*Ÿªp»5Âb$} kØpm¥á¶(«ÃЪtçÔn\ýç¢v 7ŸKíH>‡ÚÀN…/Åõ¥õB;•¾™jT‘Lk†–"++rõΗ‰Vr'’S`²T¯Í׌—òKK¡FÇÐgl‡'Ì»}ºè:å2ÿ9üa\2§K¤"{ÌÐ0¸ØÇP´’¤¹¬Ý«¯v%wM“q›úŸ‹ÛŒ~2·Y ùn3ïö¸MYïñÁ…—ƒø ˜˜Í³»&Á;iJ¬nw7Ž×¨¶ß$xKD3èGüìÓ˓ǶÔ*DüRêý§ ‹Jh;ƒ¤21HÅkZX„‘X¢uAóØ“/‡$…ߟER¬à&¢þ¦¸ÖñeR‰¢ö¾}ÕŠd `9GŽß¨ ·CS@Zxù<¹íyÔ;І†D{ êu_Ôæãêïݬ LšÿÞª üð\v­®ñØÛ&]%3€sU4? ëN?¤ë¾?¨.æ‡ZÞÏÆƒ/©ÝldûñõšW>¡ö4œÑ«í¹Ò>~x8廓ï¢l:³n|ä='C¡ZÒЫžš`¢ê\øå¶­*Ä~¬Ë#Lý:ÈG]ŸƒP±²u¶úB¹,PÀØçŒU/1ë g)± s:ó¼,ÊCD›jŽ Ö¤Ë¥ÙTîê#ùS,”Ü¥¤94ת‚?r„ž{«^ˆ=¯*!Cw&ʶŠ?’_¢#4° Kú«4¬R+«wc3«€—óDS^ºÖ˜Î¬›­B•r¢ÔRÕF<~UÎÈ•mçUûlä¥Îe6ã,aKâ“ú\í>ìÚ¯-G…ÑYŽUÛàÍYo.&ÇUŸ=5‹"‰âò@?lefÄ«ª–öHÑœ3ÍUŸx½áãwÔYFߟê:Öß“ÑÅ¿ªãœUÒ!½'ÕŸOá6(õ‡0V«\ãõ‚AN·öqà^+YïxY“¨®“È”¹)'È ¼CÙù¨QšŽ‚´Q?uäiŒÑwb׺MJôÕK ±\Œºo†B£9è{úã4¯¡Ì׋àÓŒV»0³Šô#ËiޱɣtÚÊ»~°šDîž×8ükêŒ}¬¤L ¤í‹¿e£f5èB~D5¯ÊYºjÊÒéŠ?ãaÏú¨r5¶VKwmp úgõù²˜DžO­ZvqÔ¥´“¬­y¹uŒ¹äÒ£º4Qü¥I0AÍë8ê»ÔúúrÁ*¨†.!yf•ÂeÀ@ªcȨ6d÷ñÀîØ#Kë\ô'¼|Ýbê7ý(¾&À×üicÁ} [ÌUåpj@±s`I>³Wµ$3;LÈ`ó£iY: ~àD-(~><>6«ú‡<œ)¦@1.ß×cgòéý ¼Å…>*©ŽÈI>âÒg,ØÅuZªxÿÏu¨b=2Â:(ÍŽH¡Ö9ÐŪÕÓ‹W>ÐÓ«^ÐÍrÂúQõ13þ)Œ1øö P(îAGº¨e<  1ïãÔ1|'Ëú_äÔ¾Á+H¿\ÿÝâ¹Æ½Ïp‹:zš_žâT´§þÏ8èð£œúÌ:ßMr õò9’CØÝ-ñ€Ðçð‹[]éÄúß~?ýñKöçrS.ß/I—ôÙ¹aÿÓ:Ïû%¡æMù¯˜óBè–r ë§)·3ÚN×Ïæ)×á(ÛL÷Úž¹üX›Ùåkmf·fÁÍ™~jÁt2·Íl€`˜ê‹®?¢±_ªÔê‹®?5±‹þvú/²Èqøendstream endobj 14 0 obj 5111 endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xœí]ˎ云Ý_àþC®½¨%À »*soàócð€½™ßR#"y‚L¦ª«»ªhà6®Z¤Èxœx1œþï÷ßþuâŸq_Üiööô￞þçO§®ÿð2f™àïÿý÷ß¾ýñûoƸ—ñ¦ùe9ýñ¿§ÿºš“Nüíôgóí¿Oüã÷߯'ÿögûÍ Û³Kù—®é©LoMžÞíÓn{âã»Ûsޞؗ‰ž ~{–ŸX3„퉉ϯ¹aºðdv{BŸ{ÝÿŸp³/ÂØ—™æÉömÇ=Ä?i‹‰zþüðbOvqqˆq‰úûSfÊPRÚ»øîJ {2‰8‰~®y³f¢%6ÓˆžøÛMäAþ%ä7Â-}†·HŒ`ö§v"nÎ0áh¯Ñ—Éò¶=™é­¸XJ¾æ¥æR‚7Ìù+9ö/ùÅ<™ñ¥,”;çÏ…Úß J„ü•¹ߨ«½fz46ê‘ f4Ӿё8,,—s±lË[½çø'“xú'¸’€ZbHr¤32È›! ø”¥Ê²ZÅ•KY·oÄ×!N¯‹oÞèGüb|}Ó—$ª®éÕêü‹ Ã9®<.2ÒÀµµÑ¦…š1¡Á]mté£ð¹R…. Äp³?qû“ x`lÆœ¸·Æ‹$—Äg”Ô´û×( Å\}9¾z•Í+æwl–DT©©,/$åvž¸0G{´¼õ$©NW`gÉ;¹¸í jbe§%ÒsgthÃnz×Ö>p­á+‘é<(H ‘ vÍ´¸èÜDíµù%Á~0–%æ„-Ä‹™Yhó.É )l(LF‚ÀH9™‘Ç3žƒ(2TjÓœµ©Fô¨æ6ªü\ ’€ŸÀrã¿‹j Êö¦Ê};¶qÄ$³à\ ´v1A®]Jùd9&óšÉa r8~b2IÃ,ÊÖþ¤:K’åI#˜–çRtKKŠPL6fz©5JNÈ@C»ò~Àºó8ÅZ'¡H¶`·_k¹A¥~0¶ecϪ§²Œ·m§ñ¿ÓÈa`e54„ˆwͽ晘‹ê É[€w,rìØŽ"Z,†DŠ–™°"L÷ sJP’gWò¹L>³ð?]ÛJ8˜øß¨„q€IªÜVÄ!AS¯9wÂÌ åTdЭ¡d!9Ûv´vÅã1aÙΠ凑LR4æ'’EQ%ãp)–쟌ŠÔ\“°FÙ[™¸D¹¦‘Yðǹ¡>ñåÕr$ ïŸ×À‚=YöJØ™¨Ñ<¿áüækÅ¿Ãî(®®RtÉšZ«Œž ©vE§yŽÿ i1ŠVb„êWmâÜgÜjÎŸï†øîœ>U|Ö™üá¨>¨¡Â}p‘ ‰Õ–Ã< £àk¾ÂÒ‘%`µ:1Ý5Ìye^aûÙ® ¾`ðN\%{ ˜…–î«ðkhh† ec4”b¹ ¼E¾jݘ$tÿ¤Chåt 8},â+ÐŒjïp´ª{ ´åž7o.û1ðdc¥'!(~Á²¤$hi+픾ÔãÂMÓ¨(ÏwÚ„¸ž2ʤ”Q7òU Íë áó!<.—£ÈÓ4Ã;±dM+K×Q(±ëÈÌÔCT js¯‘V;d¥$}xÍ‚VͽåµÐæÈÒæ11˜[0KôÓäÜT B;Ñ¿nõÙmE¿q¨9&? Ç[Iඇây5Mñ‰Î]š2¦´X·[s€[f´È±]ô'\²Ð; Z6DÚgãàW,Ãi•w(8š™!õبµ`HN6T ecšj@›i˜a‡-õÓŒ²-”š¬:ÌÔLs#N¯'k¶ ˜Ëœ G`•²èFóÕK…ÝeF¸¦nM¢º c3%º+œ[4…kcN)RÎTüM6ð«Ÿ>GlI!—Š4 0ZœÜX’-‡É!ñzÈèk¤o‰˜Ÿ ìÚcŽ{lþ}ú×ý}þ׸ÆQ‰™„ùy­fw7ÛºHF·&U›QææhÛ$àh÷!‹ILÃÄÉÜb÷QxLÒ},Mɨh¬8>àƒ›I1÷ôbNxƒ"£VˆÉißûšÙñNb% «9”DÊð, 4’]œWæ_VïL§ "IÀ¨"g‡ÊvÇUùŒ†¶J°Žô‹ÖÐa;'Ö4N‘EH=‚Y•edÚjHyp†ç!%}pCSr᧸²À&hH1jmGû»´£øöºi)!kº”OBu³]é”Hj§dÐ4ÝßUiz ³ÛeôÞ Óc—M§óì  >ÊøXQöâÄ(Ÿ‘C³I§´%–½Á³rX»Ú¨5òA¸^"¨yÛ ?oÍi8Æ'&Ây«»<Í£©l',ÚJ×8š©»8uйŸÉ®àÀ¸„8$ضÌn80$7d¶‰‘@^ÝË’PÞÝ4¢ò w²3ÞD|¦Ä]̘5ÇeîÁŒ9åGÅî3òFÁŒ%AÿF~»æmç‹ÃP£>º¶JÌOõ¸¬ž4Óä” -‹‡'mÕs…é镃%ÐÀ¬*ÊT|~p R"¸9·Ìrþ„_êÔ"Û·(aùTZʉ7ÉáX=o·ú|{Þ{8‹üACkº¦skç’óz+Æ9(ÒªFÄÙ†WÞÙ¶žÎÌ.ë¡Å O’õˆQñcægy¿IæCò; $?gM§È7Ì-yHâD}—5¹ÈoÕ®ˆ4#Û°ƒuç‚.Ç=âZDf9º„6*€SD^7ÂEhZ0Änyý¸¶¦!…Mɉ¼ïg >_H¼Q(«‰ë-µŒJŽIÖóæTÓ2P€—¥eÉS´Cíõ‰ë$Üã%±[bÒe:’ ¸ôFËNЛ½æÙ>ZóûÓ9 ÄÒs–0[d wG‹q)†ÒÆ£<Ê'ÎÀ;Eà(ïÊ'Á–O¦< øV²?’%b½be©®pz»¿åë3<¹Âz £à&²žb3±Óñþ(^ÏR§<¼£¬pªï=—ëóX3Ó÷ÕXHTèLä ®‡e£.™ wª\nk¸OÞÚ Çq¨u §_á×rÝùHѳ”W²¨á˜4³KÇp_£ …23jJyx7þËsè3w ußztÌǬ(Ž›PÇ€Ö) ; ° Èä€Ö8}ÌbgªµdñùäË?9äñµ¬1Ê|Ãïò23#Þ‘îtè…â¿€"º!*…Ž](( »·IË rÙpÌ;Àq_¹ÀÖá¨v¡P½ëP®‡=úê’3[Σð­Æ¨QoMÎ[ŸŽ1Î/¸ªmíìÓ=øÃÍþ ¿xÒ’ôŸÞWµ8ß@é‡d£”ñ‡(v Û¨Øð ߯;–®×`)Žûµ°´¶ûÒnÊî×7¯Çî8e¶ßQjˆJZî³Ïÿä{!.ÚHô¼CÒŸ æAldß™û8K‚¨ŽL_èÊ(¯gýGPÆ} b®óv˜p Uçuº†oØ…9Žglþƒ‘«ñ¤#yG ÌóD=×3¼Ê×{ô¢cÍ­8·®ËáŽÿ°áÔ`Žyk8î‰Sß§~@$Ž4¬ç¡‹Ä?*ÞàyZ1v‰ìM¹÷‹;dŸ•qO¹ÿp_¦­ÏÎլͧñyŸO¾Û“æ}&Ež÷Üo¨ˆã[=ì uu„ÄCžÆã]øƒÛLÇüIeܱ¼bÇIì3¯xg_ϼb{_ï¡â GXÚç.žBÆ¥çžòõ(”‚/€HáoKtVpa˜yò8îi%îHÃó×P_‚ƒõê௡ܲ²½Ê¸g´üc8'Ìï»\ó¸]…Ïü‚àŽì™Cø®Œ{ÊÞ×”=mTwD˜:(²ð3n–·å|>V·A÷”ó_WÎŨöÝíí&U‡n5}?<Ǫ(ãžrþŸ$çŽzà^^MƒBª}¥ÈÝg²sjUå<–TJµ­ÖÞ¹~òÊyx.£Ì-!ëåñ”zÜPÚÈÂHMæ¬ý–?™c}äÐÈ-Ë”àfô„½¥ø퓪ÆQá3j`•V9ÃÌ‹²Ê±X%«ÇBhF+£0ê+¨”ör6‘½¯º³tcô¦Á¦5©XuÇÍP¸[EG¥y”²Ÿùÿ“пÉÂnk©°\¥yabà@ªk¼/L”Æ—í2Ê&}®º˜¾Šå\_j'Ò—¸þ!Vù&bsI½E§®¹Ú;Ai5WÒÚ‹n R©n^&Å]¹%aW^ìEg¥ÅVôÆ ö.Õ.q§¹Ä^½“Ï&ÂCjÞÖÛÈÊ­ÅÚJ!nµ#âò¦hªí™ÊÅ1;Húæ’dBø3¤Âe•ÒzgÚTp-=¸ÐgN„üºh´zv×ÛáB‹€­€4K¤b·Q/2Þ¸ÜöŠøÈ ±¤+ïm-EVJ&±¬íÝyµ.“ÌèÀTÒzÄÂvÎ+˜X²üª¨ÄŒ­…dÏ®æ(>O9± *7 nj•]üªU=†Á.Aѩ۲ýûçEEPa}]àP(UD<“GRj‘¬LKb*%c¡V \¸~gqu®¢= –ȵÌ0ÅÎì €¨¿áˆ˜Ís6;—ï n4÷*ýS¨KyÓ™ÈºÆÆ°ãެlm´R°¶ÊdQ‰Ý(è!E³æmÕí¡ñ‰®nÕÃ5åš×Êã÷*poÊ5ûܵ§j ª}9æ8kê^åîuݳ‰Šbj îºÒÙÈ´P,ËKüÆawOÅ &±=¢°b;6SCIÁ½7 tÖÌ­%×ýÖ@¾Áþa£SmÝøµF¹µbö)æAAâÅ²Õ ç²òV]Ô¬®Ì–\q£UXfLýM‰ŒZqcìàÉv8C´¨a¬õÀ Ó÷;ÈÞ´+ª)ð´¦¬ÖæÇw­c0Šút_öp{)ÅW˜ÏôržUT|¦®¬ XkGŸç•ý~QÌ(wÀaûÚ)èJ™Ñû®­¢$ãCiÜå.¬¡ ,ƒ¼!Òès‘Æ1:¬{˜Ùg´¡åwøuö·ÔÃ.-’U{DÕ¾)&M¹ôä´ùW›´:MíÞ¥vLN«[]×{½Kí8k{•xGøìõÈ#¯ÚY}S0+þ“âÓU£wŠz2ªÙ¡z—m{©ÇDÜ[ ÔñÌ™ãê–OD¯Ôò¥Ù®pÙ³kuPïû|Óï«Ö™[b9-#’jëñFÛi*Ñ3tÝÃ>XkÜ*[^®z´T¤Ü{—eüN zW‘ï; è­·kïë®àÆZÏaRÜ©ŒpKíÀx›Ù—~Š¢ $ºôa¼ˆU!aÈ…èëAvÙè€û©WQA °¿ÅÀa¡<›•íÌxH4 ³å•¸½™}V Ÿd£qgªy¥ÍB „ßÍKr@ë£ Ñ Ìå¬mé>*y¥’œo”E“¨ÚÁ¹s ×6RˆNqÕÔ%œNh @òDJK‰ü™­¶ÎÙeíœLãý4uV録™ÌÁÀÚÉ}Ž%½<ÃËjtžˆx¤7õn¸<”®Á¡mlä 0x!‘©·¾Î;ÊÞ^£Ök®lÏÛnŸî|¼Ý£mˆ¸PHàØú®±ã,(ã?“Þ’Þ±Ó-îHºÆ‡MYëíÍ%¡Û*i©Gb6­ÜY­•}id 3‡0j?s[R61wLà‘[Ó¿¬î=x(MpðÁ4nËëÚcôšŽaRú3oÆ›f¤ËNºl>Œ¦ò²w-]¶À7F ymC xáV²Âs|ÑjÄ4óÁè=G~HNÊÂ4ýÍ‘èw½Ž¼Ö€HÚÑT4°lÛY ù ²D[ÑzÃ)ylA–Ú6¸ÁQ»ÞÏhÛXt…Ù!*4 ïÊÄ‘Ök™ìäR¾#»¯-© ç5QŸÙõáÌ}ãW<³ÛcQ0Ú½¶Îlð©C›áâ€Bñ1€z2KÊ‚;›Tø™Å)ð“êLÚÏË‹Úw»s+·Rúèÿg—Â!ç[%_ùük á–ô79Ò„åƒÈ”þÌM«ïüZ«_²LàÑçe{tÙÚ,³‘‚¦{…ˆCúöâ,eš¡@$äêŸbÓJ§¬k+ìyŽ1¯K-7u˜›mIýz%ûFÖZA)ì}3o•ùwu «)Yzò–[Ñf´ûéÐ%ŠˆÏ›sC±7þ,6T•Q97©m\aÌ!nc˜\à"}|Þ»¡Sïsså7®mqí'Ùÿµå’ÕÚÊõˆ“_ECÂ^º¾åßïCwQ½¬±B|‰äbrˆ*L&Â)оÓF¡8uϽOɘ‡î}*ãºjš~Ú{–û‘ à'ôNÇoëzžëšÒê|V¿áÚs7ô‘þ'­}X ¹çnfÏÍ]˜gD‰`žŽ>pGŸöõX5bš¤ŽéüH5¬ùé P oZ÷ôbì¢*ü"øãÖ3ötœ0>PǬü ó•ÊòÝ2?îÉDI×Ãûc¿rÇz¸Ø«~‡ï.]2dŽYZ÷XµîŸ! OúZϾÈŽ;†Cïµ­/‹Oº'CÖÃ!w¬kÀS†¾¾ ™ñá¸÷úž ìö?Ïò@Òà¡f Ö‰R<ñ‡ªò…ú×1v¯{ø•(׳{ß «‹GOuñáW AŸ{8è%G…6ü{ñ£4øí±"™Ç* š!Ô¬Ögñ^?ë“]—”êWèÚÅûŽwŽ=y q~]!Îg[!"ÎÏ•ÖG§‰Ë|È5ÁaïÍB==­:¥RÁòàÄgõLÀ1A²vÙݳj¿†_‚xóéVø ú%ópšFí×dtÑ‚ŠNà=ˆtmÁÛ‹ý6ø|iŠ.ðp…‹ÇНÈß²?Pþaðé·)ûËKó.O@·Œè"wýwñž¡É[Û¯orñ qmDàŸBæïˆß6áö´»v¥°·UÿrúôÝQ-endstream endobj 16 0 obj 5541 endobj 17 0 obj << /Length 18 0 R /Filter /FlateDecode >> stream xœí]ÛŠ9}7øòyztË‹`X¨®î‚}4öö ³ËÌËþþJY©J'¤RÉ媞cŒ±:S EĉÊìÃÿ>úuîÏhÇ=,F ¿ýcøëŸ†ÿ¬?x…´üûÛ¿>zýúù“”úeæiy±Ã׿?ä ÅðõŸÃÏZüyøúïÏŸÞÝU_š¦Ò²0•xóy2ûâîó?ýYÏ#Úɼ¼ £ÞÏ£r~‘Û°žç—e“‡óˆz™ÃÍ‹ÐÛ­N®l¸…õO¶w£_ÔY`5H¿/²:‰Ó6Ÿt?Þ–5ç!w1ËQNÛ…#](LØœŠ›;ÉM Ò¾˜0|’K; iqÛþ¤®M©HDA*uJdÑaDÂTAõò=\³D)4É› í^ñâLäìFs.¹$a¾‹UÂöQ¸0"'Æ{@Á :Ñm°Vp©¤<-Q~f¦–õÂìcyžCXŸ¶K °E•Ä}Œ°’Ɔû–8¦aµc>“<Ø”íÉi25éƒq3Qr<A6!S 'VŽL!C4ˆ@ÈÕ•a˼žG¦8‚[?†yGlš|òðÿ÷°…§£8¹[7±”ŠN"Ânh²Yƒ›Ê‘ñS÷æ³q:íÖqk9ÖAÐ5,Áu»vA„p2»a6ïÂÕ˜9¹ÁA‘Ñ¥"€!h¨lž²½ºÁÁf&“š/Âq-¢l“‘Ї r[µ*E šém)md ›·QwUŒd“êØZ#5`ë #‹F‘1¾«è~ïap"ßužÂæLܰub/[˜øÇ$b#$€-Á¥¦êuB¡SyM-Už‚0“‰ºhgÑàˆÉh6ÏfZ »*„CLOnDóC 2‰è!ZDn:B’…£`œCû‚äîï»lÛŒ©IýDR÷ŠÝ1Á ¤i³M›&­"±ZX=¨J©`ÕÄáÑòd ‹d°¨Z7Úùnˆ é;rNH¼e…qäì¬F¿9*F«NR¬rŠQJž˜¹€·$$43™p$1Ìôb´$ÅDêúsÍæI&ë‚"™ä‘®YñÊÙ®UL–p%~“!v$ —âôïQ¯. ÊT±4$•‘wV±à’9ƒZ]jSÞïzqHø'Ô¾OM46YÉx}JCÕ£Z©¼'ëU#&XCOQ©9¢¢],sÌïëUï¢>›ðqÞͶÍ0&^“"+2Ö™¡Ü¿ŠÔ†éþXqDP¾=·„ Q#à…ý&¥9Y³R_áŽaÉ’ÑÔì䛿Å*3š~%&Ž\’¡S-9J³Ø,ždySˆ y"¦øQ•ä;‡}ŠBDÚèa´X5µº)MSÎ0ÛÖ4L0¬eÅ%o¹’DbÁÌÁõns¹ qΠR"P#i!ˆwÄX‰“t¡a©¯Z¸v—œœÌ´Rê,ߊ-ŒJ, ~%œË˜C B4Ì­3¯¨Ç×id šå×¹ÅÌ­µjk‰fAþH/iO-åè—0ÔFþóÝ$Ò÷OÊ!Lpm°Æ¨T0½/Ö.Ç›‹æËõ*TSpÅ!‚,ß„rK•äe21ˆL;’µ$í[L*³o˜2)êöÌÏ‚ƒëyr;ºppÏ kóW+Ä!½Õg[–|¶˜„ƒa.Ò <_J­îÒ‡mTÆžSÇ0ÕOhߣ7+¼Åa“\I’ëVòŒ÷´à­q%À™²¯è”_äþCŽ–IŠ“k h(q™¼Á(&í˜Qr™÷ÅÊ‚J›E‰ k%.0‚'Ñ•¸&¦)£?;H m,+MÚ‹ISNÊ4§d FmGŠ:Dùœ .–;&g*äãX»ÉLóx˜´HCRåÆÅŠ‘¦ðp&­ˆÀ]0—;¬]U~¢$´ÌëHÓ–AZlÿ’[½$M³D0hn·\‚˜TñÍÔ¨u|^-Þœïn;ÔÉYXÞ v™:͉9A²_ßé·Úk{Ùï¦1:_Y|S[X'ø&î¾oÄ^©®ô̯ÏèÑ‚g¸f¹® › …¢=hž¥¤ÙÄÁ«´Kƒ<ˆŸçyyÈ£ÀÏü <€º ›Ö{¡Æj«ÏwZ½o§Ö*{}Í{iå½·â 7Ùýš¿Íî9?•’oåŸÌab‰­7¸Îé‹–®GÓeÊ™þ±Ñןqî/ÖèÅ]Ñ«ÅG:%Ô Ï÷Ãô7JØâé-:¼»„È¢7Ix=ê”ZÁë &ã­¶!ï EI‰óüܼ×ÿÄ? Þ¡fßa¼ã S©Ù×±œWCv3Æoóóo©£sù>F¬Ý 2ŠÕ]^„™‹¡ecŽVž‡ñ¬%U>S“Þ$O9#»—<·ÕÑ•µ€Mpžš•q­rÍŽh5°S䩚V12XX½\écEˆ9ìw¬ô‹1 ŽÂQåü[óÍ-VjÝŠo’ßa¯È-8àÀ4ØpÂŽv΢KmõJtÁ؆ž¾€]ôú¦¾T%rX¸«Üõèõ»õaØ ¿3ÈÐh1ÔøAA-B,›áœ 1Æh#Úbú ®ÎÄ_ÜWÃ]ŒìŒæ¢öÞ,ˆ|@ÖfVâ©àGÑL,kè0`1†g²ÌpžEyg1S‚¾¯;•¸…Q›$|»®yÆÇ¯T£ìˆñ¦¦®¿Z¨¬(xîЪPnì̘ƒ=vèÌ·ÔcLTêë•0]÷NŒËå£ça}o9íÂÖxãlÔOK^XÄ]µ:›`f<³*j¾„CãÏÝïèE4ãgwGt‰D߂ĖþN@b©ÿ8*^³½­°ûdiÌc¿FÜcm…yUK~…ñ„¿™Ñ}›= %UþAFFÆ×¿3y¡ŽFÛ}˜QVí3Ïe=ì°ÀzÈŒL§ºÈŒŒõ‡$•ö/†2–ïd4·öÁhxöЂNF½è\Ì>sRd4|Š¢%ã3]_ÇYÞmø`¬ø\|Ü‹½:ñÁè±óøƒ½Á^̳ªøôT×¹WáÂÌ·3ÜZ³1ÞÑËpŒŸ=Á]§â÷C0ê£ÁÓüÇe8¦ÿ‰Ï5œ Õ*½ò<å³ì¤ÿuŒÅÚ0ÄXú¹Â^âC1Äè±C£Ø'†žË‚L–ˆïlb8|ÞFÚj8´|/Ã1>´®xbPG'ê£Fî3Geº’È( 'j­áÐmø`¬¸®Œ;ñ¡à¹ÿ}àcgëµç¨Pæ[ÎÖ™rÝð”G ­“ò¼ˆ>ÕË‹Œwîãü½ò¶ZO´àFn:WÞCØGxr‹¢=*g-ع›ŒÇüsV¼‹™§‰“Q½œ,à ‡}`‘ÉYQÐþCOÒÝ·¡±ÙG;IgdìËck˜¹é$Óvf¤µ?øë!üØ{(1vîä/Îc~‡§ wã/FÝX„7ÛöÅ&þªœ’?€¿Ý7¢möÑø‹‘±ïánüÅi»33¼´Ì|8þ‚ú ß.è)cù^Fc|hY߳͌>zÑ9ûÌ.û*2DÌCOk´áƒ±â‡ã8”ñn5ZßÓΜ¶;Q4îô=¾Çq_>›ãÐò½ÇøÐ>ª¶NŽC}ô¢Óìô ¼¾ªíÙ‡ÖhÃcÅÇq(ãÝê¸NŽc´Ý‰¢õwŸïEO~&ú¦g™Iž;ð—Z|W­ÚË_Œì£Fë{“ÑG/òÔNߥcže~Ö3ȾGl9M·ù>c¡ÇM(ãÝê/ü‘Ma´Ý‰¹Ó÷Ùžü;àÝÒÇrZµ—›ÿØGmÕÉM¨^䉾)×R[=–›PÓm¾ÏXèÃqÊx·º©“›mߌ٣lñ6ýšëu³ø\ûœáúñ³()Nþã8ÛêÉ·àS˜þ­Õ«0ák}éwuá{*RǯNq ú$b2¯ÿ}¼l‰"àW)mªò)1ÿ5¡ø 3üè[ò@n¦Ï·âgë’}; ã·oTòõ*\}rJºü=¶_†ÿ.œendstream endobj 18 0 obj 3446 endobj 19 0 obj << /Type /XObject /Subtype /Image /Width 519 /Height 261 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 16940 >> stream ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?Ÿ]Ô/áÕÞ{Û˜ÐGÔIY@ÌkÛ5Wízçüýßÿßæÿ_ÈyÿÜ‹ÿE­t6d„ªEƒ»™Zê:~ï×Þºkâ%F0QKTaN’›“mîs/©êÑ6Ù/ïTã837øÒ [Sÿ ßýÿoñ£VÿÅÿ®cùšf'•x¯±Û Ü Ë'Ê~qî¿{·N£­vaçíhª+˜U\“åLjÚŸýnÿïû8jÚ—ýnÿïó_HÒî6»¸¼70ĵ®ÕÜ0Cm,Åpã=sÀç,ž mâD“S"Å–2Fì1Aß®}1WͳîT®¥ÿA ¿ûüßãKý«©ÐBïþÿ7øÖ¤–V©qiØ¢5ÔËåœ4YŽ"v庂í×5µµœö¦ìÇKq¶Fr‡iŒÛ~lþðôÀÈš\еì;K¹OûWRÿ …ßýþoñ¥¦£ÿA ¯ûüßãW&ŠÆ6ºX#™‰Œ¦EŒæØb0ƒ¿\óŽ)fòmôÛ¤KxÈw·q’ß)x™¸ç±'Ï^sJñì}ÊÚšüÿÝßæÿwö¦£ÿ?÷_÷ù¿Æ—D‘£Ö-6„;¦E;7‡Lô>ãš§Ue{XWvܸ5=Gþî¿ïó(Ôõùÿºÿ¿Íþ5LRŠ9cØWeÏí=Cþ®¿ïó/öž¡ÿ?×_÷ù¿ÆªRÒå]‡v[þÒÔ?çúçþþ·øÒÿi_ÿÏõÏýýoñª”´¹WaÝ—?´¯ÿçúçþþ·øÒÿhßÿÏíÏýýoñª”µ<«°]–ÿ´oÿçöçþþ·øÒÿhßÏíÏýýoñª”´¹WaÝ–ÿ´o¿çöçþþ·øÒBûþ.?ïëU¥¹WaÝ–ÿ´/¿çòãþþ·øÒÿh^ÿÏåÇýýoñª´´¹P]–…ýïüþ\ßÖÿ_·ÞÿÏåÇýü?ãUE:•îË?o½ÿŸ»ûøÆ—íןó÷?ýü5Z–•îË_n¼ÿŸ¹ÿïá¥ûuçüýÏÿ V¥¥de‘{yÿ?SÿßÃKöÛ¿ùúŸþþ¬)•îËm»ÿŸ©ÿï᥷óõ7ýü5\RŠVAvYûeßüüÍÿ /Û.¿çæoûøj¸¥©²ËlºÿŸ™¿ï³Kö»¯ùù›þû5¥¬‡rqwsÿ?3ßfœ.îçâoûìÕqN¬‡rµ\ÿÏÄ¿÷Ù¥ûUÏüüKÿ}š€RŠV “ýªãþ~%ÿ¾Í/Ú®?缿÷Ù¨E(¥a“‹›ùï/ýöi~Óqÿ=åÿ¾Í@)ÂÉ…ÌÿóÞOûìÒý¢ùí'ýôjN€—íÿÏi?ï£NûDÿóÚOûèÔ4¢¤dÂy¿ç´Ÿ÷Ñ¥Íÿ=dÿ¾D)E&2Q<ßóÕÿï£Nó¥ÿž¯ÿ}ˆRŠC%ó¥ÿž¯ÿ}_:_ùèÿ÷Ѩ…(¤¢Yç£ÿßFæÉÿ=þú5§ C$Éÿ=ó¥ó$þû~u¥¤2O2Oï·çJ$ï·çL¥ ?K½ºƒØE3HÿSEj#„× žMeå† vG†T$p‹ýj¾ý[û“ÿߟþµz ñïûƒùT•£ÄFI)A;ªM6Ô­sÍ%‚úgß,³còÈãðGm{«¤ êr¬‚¨¯K¢´Ž7’<±ŠH—C™Ý³ÎËjÍp· צdY }Àz×¹üêkiõ(.Þ项–W]¬Îdôî¤ýwÔPñ­ý”Wó<úS¨K2ÉåN›1„V0úQž¼ lI¨BT·Q”$©PÃi#¨ètSúóÛ”>®»ž{"j3-Ì…È,X1Ü@À'è *¥ú–*· ²yl@nWÚ}°Õè4RúóþPúºîyü nåíÖæ&#2œzqD±^M!’hî$sÕœOã^E]{ò‡Õ×sÏEµÇüð—þø4¢ÚãþxKÿ|ô(úô»Õ×s€û4ÿóÂOûàÒýžùã'ýðk¾¢—×eØ>®»œÙçÿž2ß&—ìóÿÏ?ï“]å}v]ƒØ.ç öy¿çŒŸ÷É¥ò&ÿž2ß&»ª)}r]‡ìs†ò&ÿžRß&—È›þy?ýòk¸¢®>ÁìsˆòfÿžOÿ|šp†_ùäÿ÷ɮ֊_[}ƒØ.çäËÿ<ßþù4¾T¿óÍÿï“]}iöb»œhŠOùæÿ÷ɧyRÏ6ü«°¢—ÖŸaûÜä<©?¸ß•/—'÷ò®ºŠ>²û±]ÎKËî7åKå¿÷ò®²Š_Y}ƒÙ.ç(ÿ¸ß•;cÿu¿*êh£ë°ý’9}ýÓùR…oîŸÊºz)}aödŽgktþT»[ÐþUÒÑG·}ƒÙ£›Áô4ìC]½»ì?fsÀJP+ ¢lû³0)kzŠ^ÙöC ‘[tQí_aò Z\Q[4Rö¬9 pÃÔS·/¨üëZŠ= r™[—ûÃó¥Þ¿ÞjQKڔ̿Þ8:y:Ñ¢Žpå3ç÷×ó¥óûëùÕú)s…Š>b}:_2?ï¯çWh¥Ì* cÿž‹ùÒù±ÿÏDÿ¾…Z¢‹ŽÅa,_óÑ?ï¡KçEÿ=þúbŠW yÑÏTÿ¾…8MüõOûèT´P1ºGúš(Ò?ÔÑZ’6ø÷ýÁüªJŽø÷ýÁü©·cu¤Ëçy9‡›œlãï~k%«5ÊÛÈÚ_–&²¶ yÞæÝ¾YB o˜ néÔ÷éëJú®¥Œ“3ºÑ$S/—¸1`2ª¼íÁî:º>¬ÛÑ™ûUÔêh®fmJý5 m¢¼G w*ÞZ‘† ¸u9=9éR&£|®…§©©}‚ƒ.¼òÄwéŒc§9¥õiwjŽŠŠå¡Õu)-èÉ,3±ßå…A+å¼qŒçúÔ:õóií·D‰lc¶¨^K…#èAçßÐqT°²½®„ë+^Ç_E3kˆ‚¬¿8ouÝŸr?¥GåÝÏÔ?øøºæ±±=—uÿ?Pÿà9ÿâèòî¿çêü?ü]z*.ëþ~¡ÿÀsÿÅÑåÝÏÔ?øøº,ôT]×üýCÿ€çÿ‹£ËºÿŸ¨ðÿñtX è¨<»¯ùú‡ÿÏÿG—uÿ?Pÿà9ÿâè°ÑPyw_óõþŸþ..ëþ~¡ÿÀsÿÅÑ`'¢ òî¿çêü?ü]]×üýCÿ€çÿ‹¢ÀOEAåÝÏÔ?øøº<»¯ùú‡ÿÏÿE€žŠƒËºÿŸ¨ðÿñtyw_óõþŸþ.‹=—uÿ?Pÿà9ÿâèòî¿çêü?ü]z*.ëþ~¡ÿÀsÿÅÑåÝÏÔ?øøº,ôT]×üýCÿ€çÿ‹£ËºÿŸ¨ðÿñtX è¨<»¯ùú‡ÿÏÿG—uÿ?Pÿà9ÿâè°ÑPyw_óõþŸþ..ëþ~¡ÿÀsÿÅÑ`'¢ òî¿çêü?ü]]×üýCÿ€çÿ‹¢ÀOEAåÝÏÔ?øøº<»¯ùú‡ÿÏÿE€žŠƒËºÿŸ¨ðÿñtyw_óõþŸþ.‹=—uÿ?Pÿà9ÿâèòî¿çêü?ü]z*.ëþ~¡ÿÀsÿÅÑåÝÏÔ?øøº,ôT]×üýCÿ€çÿ‹£ËºÿŸ¨ðÿñtX è¨<»¯ùú‡ÿÏÿG—uÿ?Pÿà9ÿâè°ÑPyw_óõþŸþ..ëþ~¡ÿÀsÿÅÑ`'¢ òî¿çêü?ü]]×üýCÿ€çÿ‹¢ÀOEAåÝÏÔ?øøº<»¯ùú‡ÿÏÿE€žŠƒËºÿŸ¨ðÿñtyw_óõþŸþ.‹=—uÿ?Pÿà9ÿâèòî¿çêü?ü]z*.ëþ~¡ÿÀsÿÅÔ‘‰q,Šç=U6þ™4ú(¢ Ò?ÔÑF‘þ¦ŠØ‘°ǼîåRTpǼîåRV%Agknåíí¡‰ˆÁ)SN)‡OµK PG Ê0ÞRÏ׎~‡#Ö­QUÍ.â²(Úév¶ìîWÍvemÒ*ü»F «e·ÿž¬ó~àûÿÞúûÔÕSU»{ *êö8–f·‰¥(ϰ0Q“Î8µroV ) ;Pò8¶„4 ‡"1—¨>¹¥û-¿üð‹ý_•÷ÜþïÓÚ³5]v=?Nº`Uï ·ghbG™c}¹Ê•ObÛr2}qsûZÏí>Fù3¿Ëó<—ò·g|ÌlÎ~\g¯x¢ò "Ú*¢*"…U =)Õ›o®é×H¯o4’#¡tu‚M²`d…;pÍ€~Q–àñÁÅ/øIáþÆ]D[H ³{Ÿ%’@ĨCòr¹qóôïÈΠoÑXÖzÜFû\$É)l6s+œ*¶LDP7¯<ŽG#vÈ5k‹”¶†}Óºy‚=¹`IùpTƒœ`à,2ÄÒ˜Ìj±<#mULg8'¹ 4nºÿ }ÇýõÿCÿÇíýv?ú-émõÛ©ŒXDÖK;Â_í—*åì+·?;yÆ~Z¤“Bu×ýî?ï¨ÿøª7]Ð>ãþúÿŠ§Ç®i²1{"m,³KÇ€ %d`†n Èô¨›ÄšR™gÆÝÈÂÖR%•C· :·9ÜJ|¨.;u×ýî?ï¨ÿøª7]Ð>ãþúÿЧŮi²Ê‘,ì$f Qâu1“÷D€å–þØÝÛ4Óâ 0$’4Ò¬H'šÖò,nª ŒWò‚FÒr#"ŽTu×ýî?ï¨ÿøª7]Ð>ãþúÿЍïãþúÿŠ£u×ýî?ï¨ÿøª—KÔ_P7bK9mZÚq IYYÈ“´>ÿbz~ý¨.eîºÿ }ÇýõÿFë¯úÜßQÿñU©E¨.eîºÿ }ÇýõÿFë¯úÜßQÿñU©E¨.eîºÿ }ÇýõÿFë¯úÜßQÿñU©E¨.eîºÿ }ÇýõÿFë¯úÜßQÿñU©E¨.eîºÿ }ÇýõÿD2™ ŠÑª.>ŦÆât“ûB2EÁE`vmÛÝG–NþA'ÃVfŽFxd…Õ'Ü7.à~R:dzÓ¼ÝCþ{Úÿ߆ÿâê¢ÒB0áðœæÅtùЬq[¼ pog˜’bh÷X„C†'Tuܺ–¿ª[NÖËm²®CG2€EÄ}é ±6\9?0Æç›¨Ï{_ûðßü]n¡ÿ=íïÃñu\ÈV!ŸJ¸“íÛ^/ôFÞérO “¸:þé±õ†0ð¥ßöY°Ä_¹µ’g’þâ@ÌbhÁòËwgØs‘¿æêóÞ×þü7ÿG›¨Ï{_ûðßü]È,G¬é2jr°¬q½…Í£62TËåàÜ ‡¸íZ6ÍpÐ)»Š(¦9Ü‘H]GÉq•–SÆøyÈV秦ɵ.ßËóõ+8¼Ä&ùÕw)èÃ'}iÐêštòÅö²I2–‰Re%ÀÎHò>SÓÐúVmÝ«ÚhqG)S#ê0ÊÁy ^í\€{»ÀÎ3Ò§¹¸|YaM•¬î0…†ã—ˆŽ>Šß÷Éô EÛ‹ë{k˜-¥2n3åªDÏÀ Jƒ´ËÉÀæݼÖݤ«äN¨Ñ»|¡·co^ç#z©?üŒÖ?õçqÿ¡ÁXºD3ßøf;I$ò®ÛMAf…ˆŒ ‹¶PGV´“Œ¡ÎX¨H†Vˆ:™C2çpHô8?‘ªÇR´ûM´Ffº]кÆÍð[‡np¤ã=+›ïg±mfßΈêª` €P‰’@Ãv+ç69vÞ¡Cw¢E*F—eUT`(òàØQ`.Os\ÙÇ4k"ŽU†AýÛö«¿ÙšüøZÿß•ÿ ªÿñûcÿ]þ‹zÔ«ŽÀʿٚüøZÿß•ÿ ?³4ÿùðµÿ¿+þjŠ¡³4ÿùðµÿ¿+þfiÿóákÿ~Wü*ÕWû3OÿŸ _ûò¿áGöfŸÿ>¿÷å­Q@³4ÿùðµÿ¿+þfiÿóákÿ~Wü*ÕWû3OÿŸ _ûò¿áGöfŸÿ>¿÷å­Q@³4ÿùðµÿ¿+þfiÿóákÿ~Wü*ÕWû3OÿŸ _ûò¿áGöfŸÿ>¿÷å­Q@³4ÿùðµÿ¿+þfiÿóákÿ~Wü*ÕWû3OÿŸ _ûò¿áT Š8no#†5à £~í;V½e§ü~ß×aÿ¢Ò¦[ ÕkÍBÆÇgÛ¯-í·çg*¦ìuÆO=EY¬mI®“Ä6Êe“ì—Ye1Œo‡œ…nzqŠšñÈ“D’Äêñº†VSÀô ÷êåÄvöwoo­êeˆ¡ž-·n†I%•äPÀ®ý  çØàn¨üípÛÛ‚G»º¶Šð‰c ?1L‚WŒù¯ï´°Ž²Šä.ï'u¶ºšáRÎõ¦˜¯žÒ0E‡ L`¶ÃÔ–8ãÞ€nn5&k›É$Hm‘ãD•š2Yœ ádžá¹ùH,ÝÅõ½µÌÒ™ ·òÕ"gà %AÚeäàsNŠîÞkHnÒUò'ThݾPÛ±·¯s‘ǽTŸþFkúó¸ÿÐà¬]"ïü3¤’yWm¦ ³BÄFÅÛ(#«ÚIÆPÎç,T$C+DLŠ¡™sÈ8$zÈÕc©Z}¦Ú#3].è]cfø-÷8Rqž•ÍÎ÷³Ø¶³oçDuU0F†@ (DÉ a»•󛃻oP!»Ñ"‰#K²ªª0 ypì(°'Š9®lãš5‘ Ç*à þíûUßìÍ?þ|-ïÊÿ…Uøý±ÿ®ÇÿE½jUÇ`e_ìÍ?þ|-ïÊÿ…ÙšüøZÿß•ÿ µEPŠ¿ÙšüøZÿß•ÿ ?³4ÿùðµÿ¿+þjŠ«ý™§ÿÏ…¯ýù_ð£û3OÿŸ _ûò¿áV¨  ¿ÙšüøZÿß•ÿ ?³4ÿùðµÿ¿+þjŠ«ý™§ÿÏ…¯ýù_ð£û3OÿŸ _ûò¿áV¨  ¿ÙšüøZÿß•ÿ ?³4ÿùðµÿ¿+þjŠ«ý™§ÿÏ…¯ýù_ð£û3OÿŸ _ûò¿áV¨  ¿ÙšüøZÿß•ÿ ?³4ÿùðµÿ¿+þjŠ«ý™§ÿÏ…¯ýù_ðªPE77‘ÃÆ‚a…Q€?v«^²Óþ?o¿ë°ÿÑiS-†‰h¢ŠÌctõ4Q¤©¢¶$lñïûƒùT•ñïûƒùT•‰AEPEPEPk‹{›˜.e móå²JÉÁ B‘¸«ÁÈâ¬ÑEZ[y¯a¼Heƒý_ï[bœ™Ûœ1Æy«4P¸ŠâÒVW(’’Û±cƒž¤U¯í;_Kü“ÿ‰ªÓ4¾dBÈ­,…w:–mfé‘éRýŽ÷þ~íÿð¿øº¸ÞÂ$þÓµô¸ÿÀi?øš?´í}.?ðOþ&£ûïüýÛÿà;ñt}Ž÷þ~íÿð¿øº­DIý§kéqÿ€Òñ4iÚú\à4ŸüMGö;ßùû·ÿÀvÿâèûïüýÛÿà;ñtjŸÚv¾—ø 'ÿGö¯¥ÇþIÿÄÔc½ÿŸ»üoþ.±ÞÿÏÝ¿þ·ÿF Iý§kéqÿ€Òñ4iÚú\à4ŸüMGö;ßùû·ÿÀvÿâèûïüýÛÿà;ñtjŸÚv¾—ø 'ÿGö¯¥ÇþIÿÄÔc½ÿŸ»üoþ.±ÞÿÏÝ¿þ·ÿF Iý§kéqÿ€Òñ4iÚú\à4ŸüMGö;ßùû·ÿÀvÿâèûïüýÛÿà;ñtjŸÚv¾—ø 'ÿGö¯¥ÇþIÿÄÔc½ÿŸ»üoþ.±ÞÿÏÝ¿þ·ÿF Iý§kéqÿ€Òñ4iÚú\à4ŸüMGö;ßùû·ÿÀvÿâèûïüýÛÿà;ñtjŸÚv¾—ø 'ÿU`q-Åܪ®åw¡RFÅ=A©¾Ç{ÿ?vÿøßü]E KæOÌŒÑHr)PFÕn™>µ2½†MET (¢Š(¢Š­qcossÌ¢A-¾|¶IY8$R7Ux9Uš( «Kco5ì7’ °«ýëlS‚3³;s†#8Ï5fŠ‚w\ZJÊåR[b laÐsÔŠµý§kéqÿ€Òñ4Ê*”¬+þÓµô¸ÿÀi?øš?´í}.?ðOþ&™E>`°ÿí;_Kü“ÿ‰£ûN×Òãÿ¤ÿâi”QÌý§kéqÿ€Òñ4iÚú\à4ŸüM2Š9‚Ãÿ´í}.?ðOþ&í;_Kü“ÿ‰¦QG0Xö¯¥ÇþIÿÄÑý§kéqÿ€Òñ4Ê(æ þÓµô¸ÿÀi?øš?´í}.?ðOþ&™EÁaÿÚv¾—ø 'ÿGö¯¥ÇþIÿÄÓ(£˜,?ûN×Òãÿ¤ÿâhþÓµô¸ÿÀi?øšes‡ÿiÚú\à4ŸüMUÄ·rª¸G”Þ…It<õ§¢“•ÂÁETŒn‘þ¦Š4õ4Văþ=ãÿp*’£ƒþ=ãÿp*’±((¢Š+'_¾þÏû Ë4‚(æ‘åT<º­¼­ŒwåA縭U5 :ßRŽ8îƒ4hÌJƒ€Û£d ÷ÆôÇj`c¨cŽÎêS°¢XÞ‰² ‰É*»Ndv8<Š×²¼ž[™­o Žˆ‘$")LˆU‹ÉU9Ê7ôçÒ#¤™Z…åÎ×G]å)WWèŠÉQÔŒã9¶–¨—ÒÝ‚Þd±$L;aKœþ”Ž×ZÝê׊$žU¼†Ö(žáÖ0`9ærr=jeÖnVK‹E‚â;{‡I÷òmÙ³å‡ïvB㣓ǿJhÓ/£½+€-äò~é“~×P¸íßšŸeOùƒž]¥Ô­ù,Òdy^?0m ŒqŽ}H9ú ÓÖþÍãyîÝ’Çgÿ>v¿÷å±Ùÿϯýù_ð£@'¢ ûŸüùÚÿß•ÿ >Çgÿ>v¿÷åÂžŠƒìvóçkÿ~Wü(ûŸüùÚÿß•ÿ 4z*±Ùÿϯýù_ð£ìvóçkÿ~Wü(Ð è¨>Çgÿ>v¿÷å±Ùÿϯýù_ð£@'¢ ûŸüùÚÿß•ÿ >Çgÿ>v¿÷åÂžŠƒìvóçkÿ~Wü(ûŸüùÚÿß•ÿ 4z*±Ùÿϯýù_ð£ìvóçkÿ~Wü(Ð è¨>Çgÿ>v¿÷å±Ùÿϯýù_ð£@'¢ ûŸüùÚÿß•ÿ >Çgÿ>v¿÷åÂžŠƒìvóçkÿ~Wü(ûŸüùÚÿß•ÿ 4z*±Ùÿϯýù_ð£ìvóçkÿ~Wü(Ð è¨>Çgÿ>v¿÷å±Ùÿϯýù_ð£@'¢ ûŸüùÚÿß•ÿ >Çgÿ>v¿÷åÂžŠƒìvóçkÿ~Wü(ûŸüùÚÿß•ÿ 4z*±Ùÿϯýù_ð£ìvóçkÿ~Wü(Ð è¨>Çgÿ>v¿÷å±Ùÿϯýù_ð£@'¢ ûŸüùÚÿß•ÿ >Çgÿ>v¿÷åÂžŠƒìvóçkÿ~Wü(ûŸüùÚÿß•ÿ 4z*±Ùÿϯýù_ð£ìvóçkÿ~Wü(Ð è¨>Çgÿ>v¿÷å±Ùÿϯýù_ð£@'¢ ûŸüùÚÿß•ÿ >Çgÿ>v¿÷åÂžŠƒìvóçkÿ~Wü*HâŽ%Û QƤç¡F }QHéêh£HÿSElHØ?ãÞ?÷ò©*8?ãÞ?÷ò©+‚Š( Š( ŠæMíÕÉеKÙ-mí&”Ì"“6òœ´„€F2OÊ1êq“¡£jS^\ÜÛNw´)‚O²Émņ69'Ÿ{89Çn]€Ö¢¹·?e»Ö/mb·­ol³IâÖÝppA nÎ29©Æ¥¨Å,¢²¼v·qZÊÈŒ¦c'—‚'`_0u-»îÑ`7h®zÃQÖ.¢ÓÔÉcæjŸjWò\ÙWyÞO˜UÆ ç¥9š é¼9«}š8î.ØÕZÞVÙ»#&‹Ùœ;ÍmJÑ d*Ì g÷¸?ösÏý×åÿP¿ü~Øÿ×cÿ¢Þµ*â´QþÎoùÿºü£ÿâ(þÎoùÿºü£ÿâ*õì„QþÎoùÿºü£ÿâ(þÎoùÿºü£ÿâ*õYGû9¿çþëòÿˆ£û9¿çþëòÿˆ«ÔQdìæÿŸû¯Ê?þ"ìæÿŸû¯Ê?þ"¯QE³›þî¿(ÿøŠ?³›þî¿(ÿøŠ½E@QþÎoùÿºü£ÿâ(þÎoùÿºü£ÿâ*õYGû9¿çþëòÿˆ£û9¿çþëòÿˆ«ÔQdìæÿŸû¯Ê?þ"ìæÿŸû¯Ê?þ"¯QE³›þî¿(ÿøŠ‚é5ÌO+J"*³œlSØäÖ­e§ü~ß×aÿ¢Ò”–ƒD´QEf0¢Š(¢³ï®®…õ½…dž)%3K– ûƒ‰Þ?ˆc¯=+;ÂòÊn/mæefË.à ›€p¤Ëõõ' †ŠæÜý–ïX½µŠÜ^µý½²Í$[ˆW[uÁÁ»8Èæ§–£²‰þÊñÚÝÅk+"2™Œž^|ÁÔ¶ì»E€Ý¢¹ë GXº‹OS%™¨Z}©_Ép fA]çy>`W'ž”æh/¦ðæ­öh㸸pw`Uky[fìdŒš,#fpï5´I+D%«2œlcÜàTÿÙÍÿ?÷_”üEBÿñûcÿ]þ‹zÔ«ŠÐGû9¿çþëòÿˆ£û9¿çþëòÿˆ«ÔS²Gû9¿çþëòÿˆ£û9¿çþëòÿˆ«ÔQdìæÿŸû¯Ê?þ"ìæÿŸû¯Ê?þ"¯QE³›þî¿(ÿøŠ?³›þî¿(ÿøŠ½E@QþÎoùÿºü£ÿâ(þÎoùÿºü£ÿâ*õYGû9¿çþëòÿˆ£û9¿çþëòÿˆ«ÔQdìæÿŸû¯Ê?þ"ìæÿŸû¯Ê?þ"¯QE³›þî¿(ÿøŠ?³›þî¿(ÿøŠ½E@QþÎoùÿºü£ÿâ*¤×1<­(Š@ªÌq±O`;“Zµ–Ÿñû}ÿ]‡þ‹JRZ ÑE˜Æéêh£HÿSElHØ?ãÞ?÷ò©*8?ãÞ?÷ò©+‚Š( Š(  Ñ¡i‚Ev¶ß³!IÒ0T©URHU ‘´:qÀÄözmµ”²Ëœd•U]¥å$.p2äà|ǧ­[¢˜©¦7ÛnÞic’Öâd¸yd:H‚0§xnFc«/ajþnè³æÌ“¿ÌytÛ´õí±xéÇÖ¬Ñ@ °µ·û7“ß²Â`‹æ'j¼uçî/'ž*±Ón4å‚Xâ²°å!òË9"6Aó–é†ô'޵¥EDÿñûcÿ]þ‹zÔ¬‹±ã’ÛíG¦ó‚só:Q}Š?úÿã°ÿñUQzÜ¢°þÅýÿñØøª>ÅýÿñØøª«ùÜ¢°þÅýÿñØøª>ÅýÿñØøª/äå‡ö(ÿèÿŽÃÿÅQö(ÿèÿŽÃÿÅQ 7(¬?±Gÿ@?üvþ*±Gÿ@?üvþ*‹ù¹EaýŠ?úÿã°ÿñT}Š?úÿã°ÿñT_È Ê+ìQÿÐÿ‡ÿŠ£ìQÿÐÿ‡ÿŠ¢þ@nQXbþ€øì?üUbþ€øì?üUòrŠÃûôÿÇaÿâ¨ûôÿÇaÿ⨿•–Ÿñû}ÿ]‡þ‹J¯ö(ÿèÿŽÃÿÅT¶‚5G·ÙÌo†L(ççå$t"¦OA–(¢Š…Q@¯,mï6„“;^)Z'õ”ƒƒÆqÀôÛ2ËO-ö+u„2í!IÀ™°@2íÓ×Ð ·Ef¦˜ßm»y¥ŽK[‰’àEåé"ÂṌb¬½…«ù»¢Ï›2Nÿ1åÓnÓ×¶Åã§Z³E0+Aakoöo&-¿e„ÁÌNÔ;xëÏÜ^OÅýÿñØøª/äå‡ö(ÿèÿŽÃÿÅQö(ÿèÿŽÃÿÅQ 7+-?ãöûþ»ý•_ìQÿÐÿ‡ÿŠ©mj$Ž;o³˜ß ˜QÎÏÊHèELžƒ,QE¤©¢#ýM±#`ÿxÿÜʤ¨àÿxÿÜʤ¬J (¢€ É¿×-áeŠÑüé~ÓR6xÐ´Š¬¬ê6«OƒœqÏ:Õ…&›¨ùbÎ?²‹a|.Œ¬í½‡Ÿæ•ÛŒ)#99ÇAœ«@h6¢ŽóAm’]G÷b‘ ü€Hfr‚FJîÀ#®@%•äòÜÍkypÜD‰!JdB¬XJ©ÎQ¸Ç§>˜Ë¤ëQ]˜¥…®Ýá󤻑¼ÂÏ.”¬GÄ  `ZÚM¼öÑIö°Â n —O;HzÌêp'Ž„jrCw¨Ëw$kek2@ˆ;HÌË œäÉŒôæ¦YÓå•"Y˜HÌ«Äêc'î‡|…¿‡v7vÍP0Iq{©Z‘¯íî•Þ'² €œ>6“ò0Æs‘VfÓ'“í˜xÿÊäž<œƒÇ_ݶ>¢€ˆ4ÉbIY±"†‰M´¡¦s•ËŒrvƒÉâqy:ßi­o5¼–WŽS„%îÝÃ+†Æ>QÆ;õ¨ôÝ2{OìŸ1ã?b°ki6“Ë+‘ÇOÝŸÒ«E–¿ðŽé¬’<¶›L®‘9Œo"g~1÷±Á9äq@Oÿ¶?õØÿè·­JËøý±ÿ®ÇÿE½jUÇ`aEU(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+-?ãöûþ»ý•©Yiÿ·ßõØè´©–ÃD´QEf0¨.îíì¢]J±«6Õ«·eQÕ˜ã€2MOTµ+iæ6³ZˆÚ[Y¼ÕIª¾Q“€8áóÐôÇ|€ 6ºä—WwP[Ûïdv¤Šð¹a$°aÀS“×aZ¯Y^O-ÌÖ·G ÄH’¦D*ŀ䪜åŒzsé‘ý•¬¥íÍüRY­ÄÞfЀ@âÜ`§"~H §n Q©¤ÛÏm‘Ïk ¶àÉt󴇡,Πç’xàLD#S’½F[¹#[+Y’DÚFfXÈ9ç&L`/§54zΟ,©ÌÂF`¥^'S?t8#ä-ü;±»¶j‚K‹ÝJÐ$ˆíot®ñ8‘áñ´Ÿ‘†3œŠ³6™<ŸlÃÇûûø.W$ð©ää:þí±õèüA¦KH’͉4Jm¥ 0ë˜Ô®\c“´Oë‹ÉÖûMky­ä²¼rœ!,vî\61òŽ1ß­G¦é“Údùûƒ[I´žXù\Ž:~ìþ•Z($µÿ„wMd‘å´Úet‰Ì` y;ñ½Ž Ï#ŠÚøý±ÿ®ÇÿE½jV[ÿÇíýv?ú-ëR®; (¢¨AEPEPEPEPEPEPEPYiÿ·ßõØè´­JËOøý¾ÿ®ÃÿE¥L¶%¢Š+1Ò?ÔÑF‘þ¦ŠØ‘°ǼîåRTpǼîåRV%Q@Q@Åİ4÷SG KÏ#Q“ŽI÷¢Þâ ¨{Y£š&Î׃)ÁÇ{дUh¯­æ½šÎ3!–õŸºmŠp7ãnpÀã9æ¬ÐEZ[ëxoa³È%Ÿý_î›cøÛœ)8Îx  &ŽFxd…Õ'Ü7.à~R:dzÓ¼ÝCþ{Úÿ߆ÿâê)âŽk›8ædC1ʰÈ?»~Õwû3OÿŸ _ûò¿áWì"¿›¨Ï{_ûðßü]n¡ÿ=íïÃñucû3OÿŸ _ûò¿áGöfŸÿ>¿÷åªϸŠþn¡ÿ=íïÃñtyº‡ü÷µÿ¿ ÿÅÕìÍ?þ|-ïÊÿ…ÙšüøZÿß•ÿ ,û_ÍÔ?罯ýøoþ.7Pÿžö¿÷á¿øº±ý™§ÿÏ…¯ýù_ð£û3OÿŸ _ûò¿áEŸp+ùº‡ü÷µÿ¿ ÿÅÑæêóÞ×þü7ÿV?³4ÿùðµÿ¿+þfiÿóákÿ~Wü(³î7Pÿžö¿÷á¿øº<ÝCþ{Úÿ߆ÿâêÇöfŸÿ>¿÷åÂìÍ?þ|-ïÊÿ…}À¯æêóÞ×þü7ÿG›¨Ï{_ûðßü]XþÌÓÿçÂ×þü¯øQý™§ÿÏ…¯ýù_ð¢Ï¸üÝCþ{Úÿ߆ÿâèóuùïkÿ~ÿ‹«ÙšüøZÿß•ÿ ?³4ÿùðµÿ¿+þY÷¿›¨Ï{_ûðßü]n¡ÿ=íïÃñucû3OÿŸ _ûò¿áGöfŸÿ>¿÷å‹>àWóuùïkÿ~ÿ‹¦ÃŠóI3«¼¯¸í] | tÉô«_ÙšüøZÿß•ÿ ¥QÃsy1¬h&U÷iÚ¦IØeŠ(¢ aEPEAwyke–öæxËm ,>™=ø4ë{ˆ. YífŽh›;^6 §ï@ÑU¢¾·šök8̆X?Ö~é¶)À8߹Ì皳@Uio­á½†ÎC –õºmŒpN7ãnp¤ã9â€$š9á’TxŸpÜ»ùHé‘ëNóuùïkÿ~ÿ‹¨§Š9®lãš5‘ Ç*à þíûUßìÍ?þ|-ïÊÿ…\S°Šþn¡ÿ=íïÃñtyº‡ü÷µÿ¿ ÿÅÕìÍ?þ|-ïÊÿ…ÙšüøZÿß•ÿ «>â+ùº‡ü÷µÿ¿ ÿÅÑæêóÞ×þü7ÿV?³4ÿùðµÿ¿+þfiÿóákÿ~Wü(³î7Pÿžö¿÷á¿øº<ÝCþ{Úÿ߆ÿâêÇöfŸÿ>¿÷åÂìÍ?þ|-ïÊÿ…}À¯æêóÞ×þü7ÿG›¨Ï{_ûðßü]XþÌÓÿçÂ×þü¯øQý™§ÿÏ…¯ýù_ð¢Ï¸üÝCþ{Úÿ߆ÿâèóuùïkÿ~ÿ‹«ÙšüøZÿß•ÿ ?³4ÿùðµÿ¿+þY÷¿›¨Ï{_ûðßü]n¡ÿ=íïÃñucû3OÿŸ _ûò¿áGöfŸÿ>¿÷å‹>àWóuùïkÿ~ÿ‹£ÍÔ?罯ýøoþ.¬fiÿóákÿ~Wü(þÌÓÿçÂ×þü¯øQgÜ þn¡ÿ=íïÃñtyº‡ü÷µÿ¿ ÿÅÕìÍ?þ|-ïÊÿ…ÙšüøZÿß•ÿ ,û_ÍÔ?罯ýøoþ.› r+Í$ήò¾ãµvòÓ'Ò­fiÿóákÿ~Wü*”G ÍäpƱ ˜aT`ݧj™'a–(¢ŠÒ?ÔÑF‘þ¦ŠØ‘°ǼîåRTpǼîåRV%Q@Q@~"tµ2¬†îÛk2îùñà‘‘‘í‘FŒ&Ô#ºe7†à<Ûj0(ªŒ€’B•PIù•ÀÃ¥a‡ÒŠ(û >”}†J( ì0úQö}(¢€°ÃéGØaô¢Š>Ã¥a‡ÒŠ(û >”}†J( ì0úQö}(¢€°ÃéGØaô¢Š>Ã¥a‡ÒŠ(û >”}†J( ì0úQö}(¢€°ÃéGØaô¢Š>Ã¥a‡ÒŠ(û >”}†J( ì0úQö}(¢€°ÃéGØaô¢Š>Ã¥a‡ÒŠ(û >”}†J( ì0úQö}(¢€°ÃéGØaô¢Š>Ã¥a‡ÒŠ(û >”}†J( ì0úQö}(¢€°ÃéGØaô¢Š>Ã¥a‡ÒŠ(û >”}†J( ì0úQö}(¢€°ÃéGØaô¢Š>Ã¥a‡ÒŠ(û >”}†J( ì0úQö}(¢€,CÄ0´QEÿÙ endstream endobj 20 0 obj << /Length 21 0 R /Filter /FlateDecode >> stream xœí]ÉŽã8½Pÿàór¸I”€ÆNgæ½æfú0Àôe~HÙŒˆä Ò´ssud¢”—ˆx±Pâ£Ùýïû·ÿîLú7­Óƒß-Áí~ÿçîïÙý§üÁì~ÿ÷÷o?¾³Ö?L»8/n÷㻿¾¸µéÊí~ ‹³æÅ#h¦yg£eŒí9¡ã×&`¦Œ¬0¨?Áæ—JÚª¹Qx|iÛ {<”Gy’,Gà¶¥š"?hE^hy„ß`b2©É<þb{±šÔ¾¶ÆÒ\CªÎ-R¦^ÈÔ&\ñýƃK 7TFÓdq±%’©˜ã•Èó¡vpÿ’Úòd`o˜Nž'y¡b¾÷@ì+8>gà–þœæ*Ø\™¢«d8±WÄn÷d\†Gw2‡â’©–›,Ûá€|…·ØVñWˆÆÐ÷ ‡3&pBífçQËÞn–bÇcñ“»®‘O°*|¥Š€ŽU¸ŸðƒäÏ" ‘‘ a¬üß–gH H :P)Û ³ô˜‘´„föI¥?‘bxÓõƒk±Ž¹ÞÆu"Ÿd\°d¹1ŽfJHU<©ÁPãš’Aп¯Á¸bå¬eꈘüûD)ƒâïóR< <²µ ˲¾uXºiÑ.'^õ£ÉO½€ ‡Œ5Å2Êk´xÅ –{8-¶„“`w[ðsËÞ¨Ûsi/Feºñ¥< È“~›S À¯+êZÄ8ŠA°K)w±K‘'ü"ð½O[¾ö9gá%‰QRº‘¤tU ê@À ýöu®ÙÑ@7aÀ”[¢.— $Œ2ºš'å>5%8¶r«U2yk/ÙÇß}¯K±ZÕŽ¤ÞKÓI[‘'»­]!ð‚'Õ1ÑÚÕaÕàš”tyÑ-ÿŽ…œ"¶4%ü;Wúä¤.ùå5ÿ´TTxßΞ üPo¤&1ö›!èâܨB šo m «ö“¢@V’hΟêA±ô«šü~µûl:IÅZîílfwÙ‡ É?•È.ý’ |¶$ÎÅÝ¢øo6Õ­D l|N$gžµ ƒ‡ÈìÑy¨¯ƒ öI¬‘ÔFÄ@Ë1—ja'J¨:'I²Ô¢a„£é†#ž²b6&ß6)Œ?k}Ojv9v@…H¼{Ðð¼EÃg*êÓ£‹- {a·WõæÚŸÎ%ö\\'©&ê§f(ÕãÚî«´'è=Ô÷8íàŠ…v:½/Ðû ½/ÍÞýÓù{ægϽÇó3}«¾Ð×úa+í¸Ç5Çö_Ù&Îþº+ë™Õõþ9® Å÷,ç%â!ýC ±>¨¥%Ya‹`¯Þ€¦a<ˆŸÖéa<ÆãÀÎüàx`##ê %†XíôßÖ{|ÛLWè«¶ú†{—»Tl|ðoP¯\Á¹¢ÿ÷pe ÷2è â©ã;qFˆíŒX"ÆÇâÿû>pu|nû·VK.¯Vh-=^Ú’ÏÖ¢´´¢H cD·üÚCÏSv" ¼ç)K;üÙuèdOIãA-¾ÑSŽøªOÙÁïEžò<:Z¯c–9•š•yG´Ú†Ì틯\çOcÏm}t|Ü´s‘?¥èÙÑeþtÄ^#Œ¹Î§ûþtš¾6§ÄþÏXµÝ¿µqƒ¿ðM~¿r¿róW®òЧˆˆØŽRÙae •æ¯Ê¡w¥ŠÆµœz…1úâ•txÑJÔÊxP‡(Wˆ½(¡ÆüÖñ v.‰áŸºº…ù$ÖVB‹Ñ`{M¨·:Zû1ÂÎZÊt íø¡Emoê<þ­8è¬vá<Ï !ô¶y E·½BÏ¢qî+Ì´]=+£TÏŠ½`ÖÑ­~=ïdãíü¸owÖߺÝ)«˜Ï GF{A ²Ÿ°^Cmà* Z+ê=Ê=Ê4¿ÂçNÓR•u{\WB½CÅϬRÌ1¯R •)ë®WzNê¼ìÏlÁ#ö0Öu¼æ8 F©¢oÇ{š¯eU)÷šæ«º`5¬ÕÛv†3‰(ï+1 dkóÐj Žñʸ0­óÍÇ…‘œЀ›òæ¾S±¶mÖáÛÉ+e×›—ýy´ bò„¹ à=Áo.fXeœ rNO}lº¼r hõmÞêÍM‘¢Å¯Ôa0ž\îãòçtʨ¯Æ™¹goÅÙȺáuë. ï=°¸eŠæ?0sPzSt†µâErÉ7:ö1°Eo&}f×bqòw,^†EEg9ûPÌõw¸2óP«_ó;Ã84P÷~nÌÃQ_‹³0Ý|nù‡ÍëÝr󲿯µ]è…•76¨¯ÎÛÍλ²5|Ÿûße¸8g¿Œ–ønëq“]ï‘üÂHŽó Êñ˦Ëã¶ÏñuøñqûÒH®Ø"4ý©ëqʯv®ÜQu1ª.ZúToUhgw¨_„*㕨 +|={GÕõ±Šd?ð•ÏVŠV¿¸êÔìl Vy°O­:•Q_‹³¾ç½ãìúèu+8C­~5Î;ˆ^_3õµ8›áÕ;Îú8›®{ÑÁ½<ƒ!›ùì}ENx)ÎpÔ¨{ÆPÇÎÞþ&â¸JÑÕºù/1o Cø•å'c4öS`í¬óEö§`Ft9†ÖÌw|æ~úQQt”Í›(oMNf 5ÕnÜjÈ‘”ð³{L?Oö즜ÂEu(D%sÊ#¯ŽÂžB,:L„ ;Ó®f@Á*‡´‹@?d‰G0’åÙ°=Kïò‰J¶CÐ QÖä>ÍÍ[Zcá¥Õ}ÃŒ–Žl˜i&ây»dCµÔük·Âºå¬B ×ÙZhŽÁØSÓ¨ãèIɪ;²oÇHN<"HBÊ@/‘îÕSSÈFHƒSéê;eìÌ‹gwѤbPAý7Ia.ÄÚæ;òtžåéŒBt8³ÊæÏ`Œb>vŸid3…2™Ë¬¨%Ëd{éáTÚž`æ4ßÁ+Â=j8Ø;¥çN@Q1ëªÎ2d H¤X›F:(Æ Œ2vYÅ{&©³Ìßh3ݾc%AŒžâÎ "ÁÄ…œÂ4œH$ë¶3½·òÌuå1&¸aRæŠç͉…ÊxºòKLƒ Q®A¦èA%$!4¤&Ÿ¸gOÌ„FIlˆmÙ"-Ù:J¡7Éb‰‡ˆ‘Iõt s­¾žu0÷Ü"PŸÂØ*8I±…N€!ºØØçˆÍÙõ¤LËŠ”«]6ÉÌO¾Ï³3sŠV´¥p"¥,ð è$™i–0€<º‚1v˜ÅËMnr.óø%)¾Ø~.q2ä4C®E`>OfÁ-Ed¦Á“lP÷É:ýF1Xœfì´æì¿¢ÈP¯’ó\/©Q‘©ðdb™¯ðô·©c£É fA‰nÈla%IéèÔÒïL Yˆ‹ÉÆ÷ pËa—ÜÕ H+˜§œû¤ß9~g.ÇÉì‘ɱdû"õó6t˜•Űç! \?g&pÈE³$‰Ïì\DêÈÙ€Q+Š<‘Ý HÌeÛɉÕIȇ£JO÷-»EÚö’ásJ50PðgºÎZ2“±ë ¿+YmTU›¬ì.áB"m¼)oM™GLm9ma–Û4ÑÇÞž>€œÓ\¾s„y•¯âÖ¨%¤yÈh³˜iê)¤Ù²±#F©‡ç:éΉ`z˜£ …|“H–ivêôb=W–]éæ±–¢kó*+¬º8—í¼rÝŠµ™ÔÈ¢4âE_€¹6=aOA¡*Þ3ép€þD²³ñGÓh¨#øDq€/ã75Á2àÒ‡ô-×>Rì?wÀF¾aßC<þn ‰ñ£ˆ\â Îw™Ò]ðœ;Èë…Þ¦MŽ Z]œ /×=3¡½"Æ©B»Šc÷KÐx©E‘¯ ÍR;gʼnt·£Zwñ’æ°]”ùùôaR2dqNÓ mÎ(#¦[KO˜·”œxsBW#˜”$µTmxPåF9m6Ê錺"‰`{µÿaJÑ*P*«Ø2ÁvJâ´ïȈø‰‹r& fç›Û€™RR'NFªÅ$ÆExk ¥R¬|u>-­Ì9Åë‚I pâ…«,„(>Zdƒ{!„vÉýæÅ‘ù˜}p˜ô­ù^q žNQÛ;Àg*“㜿–ݫ噺8ç*‡ƒ!úʺÔijô„Ð:§õñ3-Ê«©ŒäR&©ÛÝ\.éPÙj¶r¥dß4/JÅZj8õEz©}ä|G*{Y©nVŽ‹ÛãñoÙã•úOv`½pw)uæ°h¥sÃÞŽt\Y58ïJ…þ¹©~'å©Å÷xËY’¼Lêà†×ÙEQbñ¤œ6 ØøõZx¥©¼* ïøî_ÂwÞnµ?Ð °ÚFHCa‰²UŸØî„ @ða¤m¸m¿7Bœj™ÚÁ—ë¸Qg`“RoƒX[bqäcg,|ÖòŸ$©®•ÞDÂh¡EÙ€5²Y)³G>Ãcl¬WÍ¢=/…}`×]""ìlo£%ÀG>#• ' /ж½#¶ñ^Û2í äTˆ1¥·›ÃÆÃ¿ÇcÜ1ÖÇ~×¢ÚÂgs?'Æ–ð‰qLéíæ0ö^›Üï“:Èoñ¡¬ÞÆP}ÔE qûHÔao7‡º‘Ïiц ›W¨p«ŸjC_‹º‘ÍŸèï°ÆÆœŽû Gòéì–vÚ‡Pô‘9ÇÏŒ‡ØÛÍ!s„Ê‘‰Ûæ¾ þ!…9'"³³æ5ö ™Ò ~ 2•Þp¶ ¡råÌLœí#g‚$wXñ ج‚ÅÎÁO¯ˆØÂñ˜§½P{W¯¶k·£lGƒ’ÇCXÐÎЛ*’GO€3Ø×Ð[qjû\㑼%`St¯rÀz¬%†èqCZf'º ï>BÄ5tðm>òë]=î{]izÊ_8*£F d#_³6Ms8tñgZ¼h^ÌÓ;k0˜O¶÷ƒõæ…ùd½Cóêø ¶ÄzõÖ*z¹ô{U çuÚ÷/É3ÿ‚£V0†G×üŒ5ÒuDƒÖ•i|½]ü×Ýÿ¿½{­endstream endobj 21 0 obj 4120 endobj 22 0 obj << /Length 23 0 R /Filter /FlateDecode >> stream xœµ]ÉŽ$9r½7ÐÿgJÎÅ7`0@TdÄ}€ôZh.úý!én‹ó-=K=èCw{úBmy¶Æôñ¿ÿö¿SùgÞçécËñãïÿññoÿòñ?í?æ)ì üûïÿõûo?ÿøý·Òùc]¶ûÇÿþñ¯ïð¦?þóã/)üõãÿþý·W¹ëo·^•ÂàU1Lëñ²P*K-þËôy\Z¬ç•°Wf¹ç5=k[ÙÚymŸüºÈ—C*—óô>þÕwηÆ™nÇ~cœr:¯ù8ÞËKçúÿç”C>_Ô.â¹ÞýÇF×Ö81IþbYÈùÎy½Ó+$¾7òÅë·ãB«ãÇ’¯=úCmÿtÜSùL;ÂøÑöQ1œç•y a¥OÒ –í/D¦r6Ž`áu”³zL)<Ê;gŠLy÷&ïŠåîrá9º¾EWƒîâOŸ…_Þå¼RYÇÏóïQßðäofØøf&á¼éåÌ6™®0UÖ0‡…uWšöJ°²†SØŠñŸßáBC<åå)¾iaqÖÐÓ³®)¼™Y ݘ·˜7y>¡îáQ7$ Šù‡·$½Ÿ#ÓT½çÈé¤)Sì<³$ŸØ§-¥˜u7"®¢bÛxÑËWgYŽk¶r¦ÄëJ¯%àåg¡Ó6E©Mn7>z\YÔÑu[ÇSÛÛšbÕ)ô|Y“è$ZS„W°àL¤¡y!‘Dy“ƒ}ÀrYQjòœÂv~7&¦|Ya*b¯ú_Š’D¶ÅàâÖ(J¹|‰$GÙ‡áéó^;Ã5¬ïúnÚ$f µ#j’£?µÍ"zUÝ“Hʶç“ÈÎ$}Œ0É=Å|ÂÒÂâTã©ï±¼ñÁzpn4¼ÊI$ÒãQ̯A“mªÖ{ß¾éóÜФºŠŒ‘ÆŸzáI¸|e+…±Õ§g09ÞÞ‰;ÃN}@#Ç‹2ß\Ýi©ó;štª¸¸W‡¶}£=!u™6;-b1Ž* aß„‡r÷½Å`¾²$Dº—Á,VvÆÏ>éÜ”K…âïz̬“œ­-ýãbnX6zsÃ*n‹b\6`‰›ÐaöhÓ”&Ëoodg²Å<‰!­æ U¨¿ äVÓhZ»à¥LU‹²ȆåżÂ\VyË¢L@>~ w³úØnϲKx^ .*føŒ3“…a­´­[,úеKZ‘sÇØáÝ3‰•fè¯Tæ“è²z~EJÙå»§=xsiÈb'yÍ«Yò0ðºQU„xøÍP A>%¤œ7 nÖˆ_Sð+û{C%´Ìæs^~Ècv@ÐÝcCK¹.¨¨GïQ"±Þ‰µZê_³'ÍÜãÔ@ßʧ³ƒ¾áË”vJÕãpB›B<Ÿ_ ùÙñöôø¦OÌ'‡Ñ;ÒWwæ¤\–Ù ZÜŽ]tX µäHv,D2+þ"¶ÓIÏ¡FV!‰7i’”˜)4ý}Ðg3Ô™° C åø²V—Õ+íœ-TüÛ8c?èKZ7oÞBѬ½zÎé9:²‚@açKrMvLÄ—Øàƒè'9æQ1<r+´(¾a¡ÇI‹¸zVy.dÛåÕ¾B˜«N…г,¯ÜYåŽaσ4™Â<ŸtM9 š3,?0«p¤Nùu¬?ÅqSÙ}„¢õšñ?E!M†Ø ä­‚çªã|‰òïÓsâmK±Rø~Ú@oùÔÄÛaâK ‰³È¼é ž2Û¦=$ ‡œ½_sL—Hœ³ðýÇé5Aº#i·äBà‡ N-@¶tA÷†k<ß—;ŠY޾ ¨?Ù¥cõrªì†ÏÅÜ×Ô ihDC¢ÜQ IüæPBçëVÇÅ)òÅñràM ”¡‘a²0hfÕL¸À[9¾1Å›JþäSŽÝa)ÿìAtpÉÀB»Ë]ç`Qɰg¤ý¯€ÔA °3Wí}«ÿ^íøÒ«ÿÐKŸV誤FuE8ý•ÑzöìQÎPr5üNtâR‹pÒƒ“*1¤7Âëj|53ïì*,œX EƒN¹E)ó¢üg„hY>OµDŽ­*~ß,NK‚ݨÈ#‡zC6,,½“4¥h¿ï8¹÷Ó˜ÃL¦1óuäßg'ƒIËŹ\TàB…W88¾ ¤\»=3wrÞb¢W¹0¯Ù€?Á¿7ì+]É]¡Å¦g´ET7âjÓ1®†î‘ç½Xˆ|¬Çߪ&`ÀQê¡P‡¼ôà¡jãiîɳJÚù–§0³óªÃyE¢$¦iÅÌ-çîfÊk6BrâÜ)½ŽúT©HF-p*â¶Ö­cNáœt§]|QXªO¶ u ŽuãÎ$ìCìéŒm+wýŠg}ûTJk¦BÃ¥ž¾¬%ßûçÍàù‰ò¬¦¡j‚ÂÄ™_;v&tPA *°5èjHu‡OÎ6Èñà H°èN†âŒ8ŒùöF˜E”ÂâÞ$häĦ[RÊh†è.‘ßõfR}Λ!F<†cŽJÐW^¯Ê¬QŠdŒüZBšñ‘ƒö«§»‹OÛƒzÂoÒY‚$Áå£O`Š÷I'öÕ;·®ôT#Áž_´’Í¿çàˆ³,Ë·W95çÉ—h•;µ"ô±©¯Vô®]Íf­8 ÒØ­4j`neÒúS3*œ¢ÿwÇݘÓLèQ‰VÊ¢ì‚âåÍõ¡)寂´Ò ÖTññÌ®ñ§:fõbZ@_•i½€†LyUçô³åê%=$Q•WÕú|6LšÄÓ€¯é¬wÙWÕÛTTKÁÐŒ¢s—Y×%&©âÞÃ|¶/ÖÀ0N•_s'˜?Çhu(¼MΊجJ²úŒ¥sÒ¦Vå‡PÅöÉ€¾ØQezØ…f/#pYÏÒÕe»€Û6ˆ‰rb€ËÝÍÐ_9·  à oz05ìzÍCF+·ŽÈí²3FéFþO9ѵW÷ÁåÞ¡›åx]QaüyGO… À£&5›œÌ]¿qš:¦ Œb§ö9BŒý.!0A:ÚæV×®¶YkÙš/ÿI¾Ãèɽ ¨I æ' œÉJ¤-œˆÊf%T<€ÃPªfV×Å*]!ñi‡ku-‚ƒÿ—÷ç|µZsªxÈÚþpá s[7D9¼:¥ˆs×±åd¬FÔ€”XùôK‚‡H*$@j»'ÁBŸJ™­À Æ]@‚x+w ã`R›h×—Æ*Xv'ÔÀjlšÏûäMð1>QMo=§ÛÓìl²[iª›™ìívšÅÏSa§aÙ#xU3m@^NL¨l²¹}ª¸¦_eD·)Fú,Ò×F襷©àë}EǼÅ &I®\N¸ÚŒš’d‰âß¹y«’Üh”Æ?:¥IØkV§š,šË&uœ¨Sû3# « Í´‰÷8…jDмÚ=z|²`œÉÄD{T=ªÊ£-ßQió€n•ä^é ê:gQV·CK”×p裋a‰Ð5t@ä$äÎ59§¢¢ÐÎ]§ë!xÆ—˜5CõJÌ¥Ãò/7à†F.ÀþYw#Àb³IHΫ»41„JÉå´Lf€Åô^$ʶ“ÔÆ´Xߟ…„¹WæÕu{Àœ˜r«É’>˜((ñrfvÎ)ñ+8Îá•×É­Tõ\è¦3È\at×O>XÞŒ®²|’M…¶Ù/€ ÍÚlž+¶"q²Eºb6|™çŽocZ»e$Hèq4c̯ê[ÒåÐGÂDTI_Îÿ¡«Ž}‘<[ÓηXi¦+TïAP òÉYù6ÅÒ ÿ1ì büYmêP‰ófªRø˜Ô¼(”ÄÅ ³øJê8ˆ/Ky6d©,QF)©'Ý •jM\6§íáÒ )TžAP‰©¨T‘ßТ\&ÀÁ{à˜ƒÜ2ŽD½ˆªjõªœÆÑ#MlY¤qåÂh-³¾v»Eâoõx9Å`FÙƒ¸Ð<ïÔ‰P„pëQÍÀ‚e´Ê¨ "Dùbp'ðú»0ÌÙÝ4e²LNaØ|œ¹kŠÀ¨çêuØÊ°}a=|'/ÓTdÀ ¨õKå^•<=! žl‰S¢8 ôZÌB¬ô–4qå3]yá·ŸÓf‘v=­²ïÈÙ´í`GOáIQ–æ ìKØ6·ê<Æ¢)úÞA;¬n|^Ñ!˜Þ6ê¢î¢f¢#—ÌŸ¡,l¼Øƒ$Ö;—ù¡RSsøÓ £(ð4̉bñ«;ëä@˯¶¶K@ùpü(lýB%†gʇbfóüKÒKh"ý|/ü%®Æø¬ÇÞ¿+}iO–ôù}tŠ–F¾9ôÃóE~Û/ÌÊ¿‰§M¨PK ‡Rspѹ:µ¼aé6ùKg (Çw»¼±<_Î%…ñªýg8“UGÒ-ªª¬UI!ˆ‡¦T—"ÕwæëÔÝx™¯Ôi{…–|}Ï‹Vy θë’®ÊÙ f’´ÈUäp’ƒUËÁxô$|>kýU 'fè ;î˜<¬ÌwzLÅܬꮉé¨+a–"cތՀŸ¬GÈe._Ì7Z­™¦Ö`m>KQ[vD*µR‹[Ö¬¡®8èò•-ÉzeŽX#ûÁ¦&\|-i€ì/éµÚÞ˲°ê]/LQ¯Ê¢uH?ø{mã><϶SßêKÀM‘N[]\(‡ßÄÄ @DÏæí®üÆ%Y-UÎ4Àq=η¦Þ˜¸•Û9¡„ Þ©èQ‰dѧGÁ #SY­v·;µ9 o_Vµ^¦º¢¦Cs|Û;KÎÁ^ð” d‡!ŒÇX;®w´–ø àö†ç¯´÷açO‚Œ_½LÞ TÕêW>{ Xƒþv÷ò›å‰7çbbIîÚ¼}­ìWuSür']žÕuA¢3˜žcþ}%~ž˜ê50€¨U*d·=ÒmãŒFÒÚPŠU8››ŠÏ £÷ª"WoÝø hƒEN=êà`³_—ÍÇt†•¤Xjú J &£(SÍž ¹MÕ຾Á’“Øf|ÂååwÜó˜V£í—ZÛ±¤Ig¯@°ÎUkÐäˆ V<µ±¨º›ˆN6~¢Æíc;®CMãÛ…=QNÔ]jãªæCG6u^ò¹<¼1fÞh ÐæýXƒìèF›cK\ô'+ Ý*+ã•9øC\«B™ÏÙˆ!ß2ŸÖt5'xˆAèø–dºY±pí½¡"L+]JA‰8&²ø*éG3,»¸]ž•ZRñAþØ,Ó_f¸²À•Ð_Yñ©'ÜóÅsUb6¯J‰—ÎÍ]‡wžš":ºÖê×"¸®Ä“ËFÆbqVÝßBÁ¨¶TugÆ@(ÕÞ·*†µæ¥izð¥\ÉŽe@hÖ¾kœførŠü/ô/ˆÕ0{éf4Í>Á*o£¨Å£¾·vËd h,ÑSõ†ŒÅž¯,õ0âËfd\&ú;ãñWòt¿§QHm€vf¼+±9ciþo_¸:l“cÆÔ@_=¤ltŸ™£¶­9÷RL-Å%Û•¨JD²ëór¦އ xÍ™v#£¼€Shù“òð‘8¶:Êœ25n%?ugwþÕÈ‚ëè¯áÑgÒ|·(Ý9f5¾£ñó5äKÐb3I¼ƒƒÏÆhvÝE0&×ñ»d¾ï[•¹¡i°‘JF{ ¼‰w×/sYZkrÖ8©±Dd–•ÂæjÒëõÚ3ìªe [ùÝ‹¥ð.¬ÝÎgä9tIø9«l…õÃRÛe­²”÷:´J)T9EÎÿZ¨©øÏ‚ñ ŽŠ`îsËVó0”;~ÕuõÍŸZlÇ1½Ë„8k0£³ó—ŠO¬Ê¿¿¡±–ðÎ¥U—h™¿cì@%˜÷ihcY bXí{è_:]Üþ¿Uv»ÏÖÏ-Ö%èWSd—ij3vƒï:ªÿl?•Ñ‚È'9"QñÜá Š¿}ü;Å3—endstream endobj 23 0 obj 5670 endobj 24 0 obj << /Length 25 0 R /Filter /FlateDecode >> stream xœ½]ÉŠ%ÉrÝ7ô?äZ‹Rø<·2ïÝ ô@ ÞF¿/w°!ü˜[Ff•Ä£yÔÍÜÍm86Æôö?þñßoSùß¼Ï?ÒÛ–ãÛßÿíí_þáí¿èÓÛßÿãÏ?~þõç!®?Ö·uÙ~Ä·¿þõí_ñ-„óÛ_ÿþö·ð×ÿéí¯ÿ,×…[¹­\ò·)?Í?ý’_RyÛùË“~Yé—•îÚÏ_ÂV~øL—mÇO‹óð°Lqz…å¼yý±Œ/…·Ê:he1N{xЮÂ6ÞÔ‹< Žp#ÿ’biJÓû´O‰’èMõåô˜ ë2°•'E¼0…8­ç çMñG®§¼P¶2ÿï8LÇ/«<ŒÉÇw½Ó]|°¡'±÷ä¹c«,ω!Ò“œ#æ'ñ5{åã×gáñ6Ø>¤òâu®òl_Ù‹¸!{à:úE8äYÎ"Å×ñ—˜ÕŸh{t{Èô ʳÆÜ“’Ø^àøm¸ÔUx)ÂA²\#çÐ.Â×TžÞâN‰ÁØ2¿âÊéiüžH7¯Âµ¹§ Ñkj-µÆ;š>è)ú¬·*SçÏÉYo(•gœb?ÃÅxt¼ƒ¿ù®çø Æï*‹: ¸ËQ=ˆ„»ÃÕ…ýWº 7®(nx‘.Ø„×;r˜£!‡È>t·h_ä%M ÙzØoíÜ¡ë9EÚ·PŒt žk†çð»”ÞRöÖ“ozXLýÃB'¥²Z]å°Vãy^= þ·í²W–‡‰/ø@t!ˆ5??À>‘Ûž¤6¹U»Æ,ßTí´ÐÝ“þoZ`>‹ÉáËÓžå…á–)UÏ€)åðZ÷SQZ‘wˆ¦)“áÙ„NÃÃÖÞ¦/-¸«°K1?S®ˆï< &Î#ÌÂIZÍe²;¨m<‚,Ôþ8ïê¨eb œdúŒ ~Õ7JÖx­¯ºÖöÇ\'m')&ÿýœ„É™ ‰É£iU=§FyRƒMô{`ÆGOà½ÙÌœžE/o {¿Sû×"êtULøÞ3áy ûÿß±åTéÓØ2¼…é°+¤ã.ŒÄRMTŽOZz9:³¸°Q‚Eš.Z‰~È’tOœè†qwÄli$K¹t¼ö4/;LÌQÖ.€Žü­øšDÅ!öbª­¢À„<Ñbø øÈå¶×OJ†^ðV”³wºJq‚[“R‘ãÕæ\§pJDœA Ë; C(CaÞZS–mC£ˆäèeðBŒE„Š{G[N"´>ŽÚB4Vˆ|¢?ÑóªÞüg廃6Ó¾¼Å B$"¥/"KµÃ ":C-¸…X´‰²{Ž8Ýq‘–9X\݃ åõ%E¾‚ŸdÑ,0‹™râ½DÆc"8´þ`+f ± ªº‚ó„Æ—[N”qÕ»xÌSÝ`a¸ŸÂ5$QD+N¢á—ààˆ7 ‡.i#Ô ‰Í1”(‡LJÅ ….džÐ< *®|ÈÒ"uOfͨÊê~ÕßÀp¯¶àà‚ Ý•ã¶·HåƒhâAƒ‹cȽ>~ s¹Îàï*OÆYW ít`¸ƒÞ›ž ÇFôVTéP¼líö^d†¥%gÃw“»HÂ<–ŽïÔÍø¢²ÔTXäj€~‚nB”{8ò5u^¬LêB¹Ð‚ôTÌ+k UÂ¥<&þ,ö™ K”Wˆ¾‚U˜f¦<2º“]lY<]ÈqÃýºÐK­%ùJáÍ O]ˆF2Š!ßߘöup«‹¤R/Np/®]̳¥™/ê½{ª} ’W‹+Ýp¤b-nZŠ9J J°ÉCÕ½j——8Åc»*ù´¢rLê¡›´+t>Ž ¨—*jVsp”ºfÓÓfÃÇ­–è Îfè°-ŠSXd•,Êۡ㤂ôŸÇ¬â2kÎë ýS Ù,$ZéÙñ+«OzT[pXÕYÔøú;aޤ«Þ «ÈÒøëÅ6xâ;<Ü*¶a­Æ2u¥Xô^*É] ó¹O¨\œÐ {¢~éÀ×Ë6­ˆ n–·ækD$èo©Äá1t ÛÊ…Å “ò‹ !;ÙmHˆfªâ°emØ´aDÒƒ;pÀ8ŸÑrkbÛCǾ`F£½ ƒÆÈ^2âIa¿K™ÀCG ”îväwÌc™µÃÊ×@ÇT“ر‹þg.[˜…l™Ç±Qu:ük™*å¯ëú…ÅØ¼ò,WåE Jd²ç=l,(ÛpU½aÓ3&ùµºÁ¯Îh! ö|£ÕÊÀÏn7ÌSuŽ-ï KEµŸüÜ$C’oè¬ÎïQáu1)¹³*vU>ò]è£w)M1úäf}[0ùpˆk8ðÜßÄÀ¢·GHNëŒ_cù »*·tR²˜yèÀ‹©â0_&…þ­¦açÛ£F³wrËvR…ƒøÁÉnu¡·>6Œºtœì4B&wj^ò¾Ò2PG=‚9j†xŸª âÑâßÜH—‹¦:ªGÎ`MõA)­_ª%É[2[ë‚ÿñ ¾R£äuÚ²Îw¢,^÷…ŒK o9•ïN·ŒõevT•X ù.7l¨è£DέS“5UºhÅd÷håöFZ¯þ»äÉ£’ö½ÆÑ¬ÞÄdñep,öýR5¨ÑaxÕ1Vøb«ÁS]ÒJQ|Cͨ‚'8 „QÆ›Oƒ1‘BÀÏF šŽw y/ÅHb§-DËFoÈ·Æ‹¶ü|ýÃðrÕc¦?†ˆ°†iUº"¦ñ< UAÛ;é•<¯VóÚ{k;ä¤hÎõ-ÒQF\òÒÎq¢ÃëwÆz+¢%|[³‚œãÉÝa¹U7*’;6ÐhGܘOš¿½(™SvøÛ[p¿‡VèëŽõÿU¬ˆK0u(>}¦ô§žFØA/@œH$Ë‚¤‘Ãr.q"AŸ’ê«/í9[-ã=(FN[/Å=ÛªÂÓÈôç§³@3]AÁ9©P|Bi °’ ŠŽ´Ð¸8!²©}w´P£·Y§r¨“ìŠ~S¶tv]IûýÙ ú\ÿV}Ã?ÿ«îh FGUÞµ‹6Ûèõ2 C³×ó¨:{CY…œ\™¶i嬸šb€%ua ´ë©M’íI5ÑÎñÙÚÜ ´E¯vª1ÍaűLXðõ–4$L4ÎmÛý#¸(:ˆuð©±Ïa›'¿ØÌ˜'®ÛäfÆ¡û°«‚” Â'=ÿÕ^F.sVAüU©xSO·ÚÓjvï­‡© XEºôTwõ¸hxT¨0å<ÅG|æÐœøZkÑ’ñ×ÝæÈߥ…u˜E ×}Rqò hã2¦P|~rkm1_JVSÌÚgiËÖAj/cÊñÞS¬tᣅIjôãy¸•­Ëæ½ ›yI«‚"ó³ª .sÈ:Ñ%¹Ú~>ÏOËbt= 9R‰ü†æØ‰ÂŽ›—,míÇŒTÜùØ)å÷a=€sˆ<½ZÙ‡’‰ØSEÅnØnn—H6 0¯¾$ ¤í‡cF†F¢ä™n?hÏ*?çå*Tï¥D8›Ø¡Qªª˜ª›R·©)Åm ª)Ö\W«¤:‘^`_õÞIU¥9™ý£gaoA!Œ’0¤, ³‡2g“xQe¸»®ÚÕ¹ã`º} °s:•™„ŽÇh…šœéÁIõËá;í-‡Uvü: ƒq%B'Ÿëf2ç ½²Á‘c"¸GSÅàöQßj„(hÔj<¸„õ@œPˆ+ú’©¥š¸Œ&™Jö°PÒå©§±å%(±ÿ-½þo]®ÌPŠi¡Egt]ÅÓ¯ %Hj¦[ºS!Šá¨®*7ž³¶”©±fþáµzz8¼6ô©ü·±ºÃFL§ )õŒ|ôE}Ißááœ~Îë ï:)0­Íð×éx½Ô#'µ#d –Éé_WN»êy¾VôjêT2æãÔ=™Ë–0ˆ¨´š[ãúl‰ÏTMã¡F8ˆ|tQ¥ºD)ÌVŠí‡•`1cµC‹k+’ÕÆSòˆXñ³`tæYñ^í3>Hõh™Un+Júƒe\y²¹‚ß+LS0%ý¼P¡cæFwéoÙ½ën4ðI‡ ÛU†d sÙlv9•<„÷«ñO§à:bÒé…D€ ]Ä/๫äY.ÁÏã´@ÌÍ”¸ÊWu?ùQJO¾T€Ðé>‘(ã/'…?,Û¡òËÊáªñ4w4`Ü6«ÑÄM\Œ;.é1§Ñ $`[‚ŽÊôJ¡ßÝŠ³ìE\±šrjfõt@“ÛÑT$B9å9Jy¥TxŒËݼ,92†ZÆ|­LÁcj£T«W FÄó%å­èº &ëP¡S"“ ?5V.†1G¼KÆÒ‚ÃRQÛ[w£ŠUÓyÜC­$Õu¾®³!‡€€(1X€B{ÝC=X¥ý@W¸¡Å¥5ß,aª´.Fë7&쥵ßÙák…þ`íe©0Æ%ˆ‰­e^êQyY–f4I‚yXTV¼«§[-‹•Ñ—ñ©û†EÙ\L+FNzø–n'6º{@× Iösº#ɸÖÈ%´ªRî¥óq¾0-Ñhðø¥þ¹‘–HàÝ£Ãífó9$)‡‚UJ?«0E„’ž­¦$3Ë`L{Üuî/(«´ÓÅ+ðº›HR3 u áT¿×Í¡º7X‚ïx1ï_ 7°È¸/^Ïi ý׊è¸tÞÐÖ¢,V‰ ¥ÇH¦æúT+¢SImõú¾œÄ¨Õ$ŒU³ ñèßÔ¿ÖV¬2æž¾oD»ÆæZëtæ½ÕÁÿ¨Ò±`K5©ëªîþy©²ë,1É[|GÓ%ô”û.ñ± ÷•>ƒJgÔýh£úKNrÖãå£U¡9è|èÇ‚g6)ÏNs¯3ɘŽqc)N½Ó#Žfܬ«OÙˆa¬ªGUVÕé =Ý¡ŽUya!8žŽ³Ûw,²5*«ZXêŽÔÄß=ö=z5Žáÿ6¢ƒQ åM£ƒÇ“m{S‘0§²ßþ¼W"^*𪟌§|© Ð ´³usë)³J‰±#/c˪ËÄ +7òãi ÜœàWÌk¹ÅšµÚ{[H{ýü˜¸C`ì Úe4踃*éN}nlɘ^D–L)€!2!'Ž#‚±ôpõsÄuÀ8.óiq«3EqæÞ6ë£3PÀäj_ìܸ*ßg…Æ6Ûý ´:(ÔÒŽÌë×\Ðëw’$©–òs¼ÚËÈêºxϱŠX)ð²2-´ig›ÂGë0^ñˆ’¤§ Oó'ÅL‡h…}³´>cbÑG÷t8>†Cã™×Ö],í»Sª!¸N ¯š¡³–Å=',Y5áNK±£XЂ:ßǸ1hÉ@BÆv.’âÈô/ Uä2&ôéÁû,Îx˜a¥¹%«€É™ÇÌé«§¾!N!«ô;&wõªTæÍôC­Ž€ïK/ÏÛl4{ýêè|RîQy^ø&S¾ì°ò‹Æ z¢Î§ø§  …Ѓ±¨[®õ,çú­IðnW»ñY4 +a¯²†è²Nê/­j@{”»Óu·°eÃMuÛÓ°ŒÅ Cz ÑÝþ;!°F«»q‘#Og0ª•9Ç3Œ½Ý›$54âŒÉMÆÐýÎÛÃS‹¾$Œ7S:WMÂphæìÒ¦p~Ë «ùunCaÏ>»1ÞÊÊY½Èì›aÌ]øžëäH2X—øé0ˆ‡F¬çŠþÑ÷¬ F‰-¥¥¾¿8 ;¡MÅ2O5‰"p¿ïóEqޭƪ§¶¥IsKnÅé9oõƒWÒ¶Ÿ&Z°´ëK Î·ØÑ•UµÓÜrSÒîï·åB^¬¶Ñ{ÀDÍI¼ƒE¾SëöÉàÖPNŒP¦,;^ï×¼ÔÆî’£ÕæN…ÖX9x=Qç/¿Œ¿À=ël¾“¹Ý©±?.sTÁù^RôS43el»c°ÛêÙ*ßU Â_øHNBóK¥QÖdÜ>¨îÔC}©lÒ!' šSLŽ Œwd¯µ'€ ’¶×IñU¯)n ²ÛUpiŠ×ßx©Éî#õf•=¼\*ÙƒU¬*R¤:éÇÉcàMkL ‚\´7:X…->»Úmµ!‚P“êMv¨*´g¨dºj±kn¿ú,„Te~¹LÜÁNaÉySEWDlCÚç¼ûÒ2­V/â'·éßóTKD×ö±'ö9rtP‘6©ÀñŽ­ù2J—‡ªÙ ¾l~o­ž©xö)¢.ŸsýÆ©j~/â`ó´»_â!Ù(1Ñ¡Ÿfq/æ8ºJ±°Sìv*…¤šv¹Ölu ÈPïw>Ϲ[_ç o‘ œ8°èß¡…ß‘¹Ñ‰‘·:Ñâle& ‰–z´µ­²“ÞZß.‰4­¤ ¸S-f4éÖ'Fµà_…g嵐ñªKbQnP®†îéËö0?3"Å>™TþÆøî¢Ü†Ü8œUÃÛ§!!Xö&!=DGA=òø8ØöŽ¿¿VÚEK=9Ú‡—Z2¢Dœ)ˆðôÊÕ©æ$¹þVËx•}s««"¶`tgâ÷/¡,U÷¹£_“¶†æÔ7¤å@Ô IÁqï­¯Á;d3(!njŒ/*P¦LAj   µä· ìç²³p°T>8ÉG_ªò€;<ñãzl„ŽÏóÿç·ÿ1~endstream endobj 25 0 obj 5981 endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode >> stream xœÍ]ÉŽ$¹ ½7ÐÿPgÊÚb²³2ï4àðø`Àsñï[R—У”QecÌÁž¬…DQäã#©qoÿþþí_o.ÿ3mÓ{|[Sxûí¯oþÃÛ?ëÞ'ç·þ÷·¿ÿöãç÷oÞÇ÷émIá=½ýüËÛŸþÍ»·Ÿ{û%Nzûùïßù©_/ }o¨è6wóóg¬s›7÷¾µ~z¨:7k(÷#8öá|Èvå_‚s÷ýÇõ}>~sqÿe¢Oû¿Ç¼àã­mÿ…ß8þ=¼ó;wz'ò¨$˜í=¿Ñ„"ŒÃ#/Ç\äØþân­”ê?xçòB•IxóEJU*~u‘Á ¿µâàå‹@xâýÂoÍ4uŸÞ—f5¼º5+L¤ùûEÞ‘»Í« ‰Ø;™üíåÚÈ&É/<ôÔ—:¿µôßzÂ>À3~Ññ~®ð /þxkñ¢8ò1£duæ)Üiâ¬.³ÛüBÉ"F­ž@³dnõåCoýjhÿò _ÚÍV ãÙõÇñÑÝógùÏ2ð Gð·ÓÒPwx©¶ùÕ…0¹GVÀ5Í™}ºr¦ç‰ÀÜè‡,6ÐÒ¡fê½ Ä”‡?M`É?”ï‡ÿ1~7…ö]™ü&Oòñw:pè‰VÓDîž÷2ËõéÉlÆ£JM²Ž¨õž•ÌO|ì•ÎÌ`Bc-¢˜y0|¤².«ò¢*x*вä™$2oýõÏ.õô¨ô ë×w9leÇ:»ŒB¿¹Å/Õ”Ð~Ë÷“/Øh_‚XÚÑY6ÆØ{8sìù¤.yÙü“þ…¾(å4-Í$ÔÖfÓ[•e%Ø ëKㆰ›„+¦ n†œýš•´ ñlVåá[eùèÄÐ0£~óôAŠå|IJfcŽ›×ú¶ÄÖÌË‹Á8 “Ò(^Ð ëæ¿‘Ï•§¦e. ‰yc¸ã1TžþZµ*Ûx¿„7T`ضƒ/ß‹Càݱœ<.o•i;6R(eÞ bͶlMÊtïl„yRO8¸RK@®]Ñ­0`Œ¶QceÏÃ$4*ü­b'ŽÕǺ°˜ÁžÀmZ§‚_‰~a‰>³V—0g\€'˜ísF•yõO~ØõÇÍZ’CžUp²;W¦Å˜~œÂØ‘E|å×wWÖ³ÚÝWËæÚ¯Š‹† zÏ´d»~µ’Sö½ &Ϻ'l#íA‰Û¨ uÌ1ð‡úƒ˜'M ‚ÃŽ“‹H T>Ìij•¤BÞ^VÁ¦O9O:2£@#)U>Ô£‹˜jp Ø*ŸúS˜²·ÍV¨@ëãKKVrˆM¹4Ë#0ˆXaq ÜóR"JEïà@¸ãsëŠúÃá‹¶Üe§hg¨á­NÍ*§Ñ35&ôvð-Íð˜bú‚ÝIüÆâÐòÊ\ÛM2ŒO|À x 9 JOTÔ÷ht62è CPʳ̑¶Â©k‹Š+Tæâ™ÓÊN[èjt{¬*Î0uØ’XÍÕ´æf%sgP‘”«uij†`ï9MAÁ>àqÒç®]Dý^|ÈXöƒö=‡‘àpA©ÛX]3Žô–:Hí=ó>l,Ödg7qXŸ 0ÇçŠ5.pàø Z3%â…¬™÷ ªÖNˆŸ¥gÐ[»…b±wKhŒêSÓR²-_ ¦¥¬ü_51eŽ·G1 iÓø9ÐFËl3(ϸš((¿€YO„¶É'šG,È%+mÊs;LqœÀXi îÎT«CÌÁ~*}žµx·¼ÔTôN´.âŽe «»]jĸVIm,T¦XˆØêŽ0~¬ýÌø]¤©ŽÍŸ½±ù!‘ŸBÜ&B)ü­“(yÞÓ!ÁTÉºÜØ÷×\¢²OÏ>6çq0…°(3ÄS4ÙEúM" Α´Y’XI ¥W*ç…¯ä蓸³ äºð”‰ß’¨9[DÙ¾§ï¼œbÎ)€=  õäË#'„6ÄTêÈ»G¡L)ä0Ë*“ˆlðg6r‰œMP&bèXr?….eÃ? º1¡€ ”ýY{1`‰#×Í Žþ:KTå…¡G%Qé‹Å T´(2C’“€ Ê‘'¢¯ÿa  " g¶¨%°–<Ç•“ ~„Cp— ì/{j9K¬jèWux<NѵáX W1 ,ô:ˆ‚zùDöùÕ‚«÷CÿaK Åæ,aZ¸Â2|”IgÙÇì×Z•=šÏ¿®…Ò#ýÛ†i‚[ „T7ôžÏ‚8Ã]ƒæn36>O®ÜÈk7ÛÏ% R¾†þk=îú–¹R‹Õ.™c]q ΂·¨Ô8L<뻤­ U<ðžYT•+Ñ_âî kÖ–-¦„>»”L Ä,¶ßÂê5¶'ÉÃù¥/²ã"tZy[Þe’h±5éÈ )Îox–Ò6SEá™ãÕ@ü ýë‹ßXŒÊ!'Ç$ð˜qOÀ²ì2-%Žùyª• äøh?IxªæÃƒf¶É¿2fl8´•ŠR–Á£Ê$™O‘\U$ôÜ™‹˜"žmp†)ºâRSJ–6|4«Gr¯¤Çrx%Æ$ÓÎjš}€€\‡P+Î×ù±Wí‰üãï“»$ÏF—t7‚|•žrö`<~h9‚ùðÞwÍ'!ºTÚHH®!~ñ B®X51<f±¬ð)õˆvUÕÏBéƒ].‘)býî)ymYkž%¯å™bmü€ÕPl &8¶%CI•Œz¬;+E@yZKëNT~Kt ÖÖl„€áè5h“Ú,¬ÊÙö€0P=Ú¥,%éßW{¡DT.©Ux Ì>¼a!´„a@ö¿4(hþßÌýN”"/$Rg± @oý‡½ƒ*ý°Wxm*w0X#B~ň$!ÕXŒŽ‰jü¾”(«ØyŒ¥ÀæµL+;ží/UéiÌ SÁkÂwió`ƒ`å\ö3x°§ìœ û«N4F•ð äh$‘<É•oñ.³Þy›ÌÌ4#œ‘çî{­%û ŽÞ»i(Ô!« |PAf˜9_ã#ìfB»š AË%ªÔÞ)HÅŸWt ÚMv“ýZÙJÓEM2+ºL"hv3Þ¢MÅx#!¶º4¨Ü µû)E¯ÁòBm¹Ú*mÙÉžäOÜY¬*ß_ói£¢æ(…TªÜ*©úÅÔ†«¹ j ±¶nÍ/’•3D¥‘.,é·©„{b!7BLTàëÃ¥Š—¸ECíCdöT‘KlQÄ—p‘­-ñ`¬}3^´eSTç$©8—ÆúæÞ1݆èIe웑5vP c©Åbp-øÅg©à(EJ¬Ñ,L¶]*˜}Åç…­Ìê´‰”qóËžèÖ® ôó>Ò¶SŸÅ6€]0ˆqä€ KQ9Õ+µùA}zT·ÀGåaãG)³5>«³º ‰W#Ði:õú*žy!ÆrÒòQ ‰¨òHñÙnL=”7>0“ª¦ƒs…z¿¬Ú8ŸØ„Ò>T·{ãÀËÖNÇf){Yº¼ o˜_¬ð¢Ô¤KEÐ'®8%ìTâ]6CQ昈Á—]lY&NåHí­ë5C,ž ,Ø…¯˜þ¿lûeMùÝJâ´ÐG Y¸ùÊ€ÚôÒ€}Nt×jž¶Í¨+)pe¬Ü–ZwÉÇ ¾PýaóÒ¤¹òŠ‘ìX|‘†»°èðˆ·x /råWa3Çíb:qNsi \qÁEO5ísRtî—ŒT‰&k}á-SœÚÑF•Øát¥?Vû Ãõûª˪PWüîvjó²ŸPrbNN×AzNka‰yŸLÝ•#:.¨±rûü:³uú«Ëý¡›JY%iJÂ÷±ê• þÌöâqVwáf¹=V#ŒÉ*¿@"`›`^}ºv€@¡ºƒì®ÚËËù¥kq…³/sbVã!Ñ› ¸À3“ï ê£æ3¤èT‡n\¢.D°î‡ZÀ½¶ê$‡AW«Ñå“!›ˆñÿ‹š«¨R5†}²”Ñ[É#îR_8ˆîAëÔ;a‘‰3»b¬ÄŸ0)Ö#IÁ Söý«¼Êz*¬›ÕÚ8Ä¥FÂt3¥Z¯ÙTò““xZ&V ƒOÕ…ÁâDøQÃJ2ÔA³WÅ= ãâ©uÌT1(Ç;·$D׎n ‡K¶öJÍz›x´HjÞÕôÒ«È”Z&­[)‹¡žú¤Cð"£^ìø¶¶Uë>®¤!å; S±¦Å覸N@„C€¾þKçš]LF©ÆåÇÓ°˜í÷2*~dÐÆ`´{YFµUl¤ˆˆ:”MR¦Âmj";00·§”Œ¶ÌÝ’ëéäë¾Ù+fÆ”2•¤²c²_@ª *³«î®Q9@½ƒ¶Ýuï3•?Š®Î7$ÿJòƒøKPÀªO«ô/5NÓlÕ¤÷K /á«ñ©'Ô´*î M+vYÏ *Rç$žé±]Ûk§:ï½âE5³:H¢Å#s··,<™«cž®ÿág­|UMÑ(ð#8(›é%éß''¹¸ÁõbÝÔ3ƒ+Ie…×x®K±˜¬ëF)b“&¦‡Å¡[åS‘ùSÂAÁˆ…ÖÝþUøýùû´W©½ÅTIÙ¨õ±*¤«°3àØh$E ÒjÇW—Ʊh±ŽPJúcMh”„»Ä> aˆ¥PÿÌÏ û‚LÈh^ eç½$ÕTù|¢e÷¹»þ5u ·nÒ¡?+®Ú·*€ w9$ÖH`À:_q±Ú‘7i¿ÔQö ÐYnI3ÜûóÌ7Ã{ãØâš~=G£åø ÞÑ&”ú~SÊ> è+]âSRvrÊÂê™îú~7óöI£³’{\Qµ™î_qq gÈ3˜—uû.qlÅp¬*ÒÖJe(1?ùú4xÙ#ÙAEVãã:ÝüZZãs¿GÐ2bz[÷î=vt´ç ~™áßþ²à[wx¾•pdpwK€g>`xƘÏöz†óiÐ|ºLH¹@ÁÞ;ƒ2kÅrŽº>†=.üTZùÌè»0oïœUl#5g Fd.gPÀvFуSvÖíöÁ^UE*·tv<‚ÞFÔÐÉÁ30Îüx­9¨oÿGz›ªã¼¬·f&@üËØ°ÕÚRÓ°8 ÷~3>%’z0R¿¥q+¥û-ÇR¬[_Úž‡Q¥o©)ƒZ`I‡‡’„5ª³ÑyP,øT40_Veg‰MR¹LñóÿÏó•/“J}[W¾t ÈO–zøu‚‹ßá®v`¸è]»æÀ­r^p„‡¢ˆp…éðÓf5¢w“|xa6´À}u”.«V2 ¥Âúú$\/±mØãØueÄØ°²Û&]úœÛf^bTÃhL$3/í8š?4‘ŒsoÇYÆ•=a-תutêZ6 ðÞ ŠÍUË[®Ww¤ê‹ãƒÅ=ò\VaÀÛå'Õ=ÖWWËDžJU´=:Ï37°\ƒøò•„žO³Ñƒý‚nU5¯ç‹1‹ˆ9<Á÷V¿’ï 3oH3<Å+5¸¹]]ÉÀ;5ß ä•åjoG\æ¢ú^ o1ºÐ…©´ê¨9.=%—%Ñüë 뤬ÉAÇCaŒ%VôâWnǨL®N_Т–ñ1ˆÑºƒb@2.­HÛú g,¼ H§2q5ô-²Uþ}}˧ ¾Îósh¡^ýÕÙ¯DðGÁ9£‰P"DUsq£­Ñäà'ï‚l;ÄU½Ô—šY©³q–œ(:|Òkn¤¤ÊÍ‘_Ĭn…|B† ˆÊA7؈˜œAÈÎþÕ¥KeV«7:Ü׺ôå.IÎm@3Rüq¨ÕÀ:¡BªSìn*ö”÷!¬TÈK‡ßÏyît¢SjæÏ¢SyéÜÙï¹Umaxyògrm#õkÿ­¥¯–¢ Iù¡yçó—r‹£ …;ÿ!uýÅ…#3¯Æ‘ù¡ä’Qõãûš ¬—ˆƒ8Íæ‘ÍTŠÔn—!=£Ñï7œÔ¼„º+õt…¤GL%75蛇óÚ ‰½G2à£ÎJqI |@õòÔ¾5—Žë¶ã²rÐG×/ËHóÈíW½–8|¿¶‚\VvY_ßþÝò,endstream endobj 27 0 obj 4984 endobj 28 0 obj << /Length 29 0 R /Filter /FlateDecode >> stream xœ½\Ùª$É }oè¨gƒ¯CŠÈ CÞZüÍO¿üýô×ßþSÿâmH°Œá¿¿üóó§÷/Ÿ?ä·á4óÛrúò·Ónp‚túòÓ0ÿñôå_Ÿ? o N÷ŒîÏ–7”g9M÷g@CoÓíþhzym½?Á·QÞÉÛðò»N'Op”'eÌ37oÚŽ,PFÉòïOä÷´­íJâøQ„™Z $9T á €ž°ŒÈD eºewI©l Pñ¤kšÒy“c¶·ýͺ?äS9þ0-)ÃcÊ"Ål¢³Á†´¦™þœäœóhr.„¶MéÙÝDfaK:EóEænL Ú‰QÕ¹Iä©G¼’ÎmïÚã³íŠ©bg÷íˆPžŸ å$ixÜQõX¥y–wt­‹¬tî,TM ÍŽ0,U¿›% Œb¤QЄXä ÁïR^4“%·þ¨À·×¬$XÑL³¬°²"ÃÕŽ±äÎZ sðTZK·¯d;e¹ÛÀT<ª‡*Vs4}’>Ò±e‘#.MÑnr–í$üZåIT+ÓHÕr$¼1œû+cØë¾ö2¦·ñŒhTë¡öͰ =ˆí¶£Ù!¬Aó¢¦tUƒ8x D6v¢5‰  ›åÀÌ¢ÌëÀp$ñ]ß;à*Òbø•SÇ3È´Y€Â|Ó™ÜÊý©Ä¡L¿r»¸÷'™á’F¼‰x2š ?‘O‹‹2bT<6Ñ”%TwÚqä #2âƒ`·u-ÕÛ(Ì$?8Ž<¸¸¬üFa=‹EõEí&:^Àìò õ’ûñB9¼Ð9só©idTŸ`¶sóÌOí"ú6 ë¾*˜;>ž`Û† Ú†_jnÀÁþæù0Ú¨ 'DL2:;E:A¥T˜q-ªƒ s~¿c$ªŠ´¿vŠ"G‹Xíh$äŽvD‰¹)÷IÖõ±NieØ•õ–ÒÙ»Êg —³F½Ý<Ú–ÐC×*(•çàt-Ô ª3ðh WBƒÑ#Žg²Ÿ,4ñHlRY.DÈÑ ‡ ¸˜0¢ ‹ß¡Iœ8‘ ÷0_Ùmƒ¹mªæ·nåH ßšèW‹|eš&#Á ÑìME ÈU±æwƒ#½–UM¶ák« 1Þë$Ç<èÙ˜%òöm.íB¸JaÈì˜äÅ@Ð2‹"[ jàô¥@ª©èhé .á ÍÄœzåà“¼3#¸6Õq¾Õ<š"(ºF³©Å$Ç`’ÃãÆßuíYŒ­hÍ(£ ×ö´à#ä—(Çq@šèËåˆÐ!M¹-y’µÎ¶í5šw§@^ªd JÆ ‡F¶‹ÆT˜s4(K@l·Íd ñ¸Ïâ¬GÓIÄdq™cí áæ7‚çÞLjì™$(ˆT_2î úfê2‡%Å WE½‚ ¸OŽ^ý¢¨²O)6!_ˇ÷Ò\p+;Qáæ º^¢ÂÜK±:µ“Åu )Äé*òN”þ\&Lƒ‡•+,™À_1̪ͭiîÇÙ^ì¼zrmâRàsMM×ê3–ª’5æ§ßsåå™ßš]‘‚ W‡ÃΔ†ã ÷Áø9&ú}äÁøï¶ÁT†>ç7û-dû<øî¯yJajÍ€_%GUÇQ@á+Q}˜':§ÕÏÁ†’f±¾ýJŽ… !ÆR[0î;Ú•Žó °#tô§$\é¤ C|Ê䮸ðgCÚÁbU!"}j{Ì4^Õ>Š ˜ÐÔ¡rÀwû°¬¸æs3æÛ+›)³øZŸë´Ö§Ó¸ˆ¥D÷þ8N$X7AvÖvIµ 7Ë v5Úéß‚>L5Ž/”CmÈeÙYx®pÓhÀE×A<š8,UG=ƒKp½%ªúŵ©ª§ M»Ž]9‹Y/A({ìáÀ!Rÿ¬IÓnéתmRð‹1­¾Sà$Î`6Û dH ;QF`h³£äÙé¨Þ§ŽyØŸ ›‹7B½"jQ‡fàˆe ‘^BD´G$¸nHE[r ᤳ~ŠÂéŒ[pP‘Û=Wô7¢ÀR*C•}p€‹s¾‘†S°TÇd‘uÑø^4¯yÍ+ýùΤ¥#ªï‰36Ãж-ÜVµyš A ƒ cNï¤P±f)Ø/v Ué“E)… ßÍ@¹˜fCÇݵÁ•î Õ²$3I¥@™«\AïüÀ°cdÔèŸ$ W‡)ýyª馺Ê+û‚løê «3ã–‡¤ñª£*]AW[ ®ÐCg²¹!5’‚MV^F?ýüùS¢Ãûuû»?ÿ‰~?ýžCÅŸO€ 6õ—Ÿþr`/eæC‹Ð’9œ,T{Æ@€8ÒOÏÖñ†?®Ä£ôÖD­ƒÝ: 0†¨WË1jË­ìbÈú†”‰3†Ä7Ç¡Õç\Äæ mkÒó¤m ’CÁmGXL2˜é;%Wý¸3ö6538KmÇèaf=íб æ‡!¼cüPÐ*©çbœð$6NI…ú½rÈêÎä$9n^Å`Ñ‚~ É|º½È¯ó(–ÝuèíØŽ´Z!̵Èè9Òn«²ªq¦áöªI xR° VþlÁ sy¬ji£VÈ`%îÖïIÏLWÒ^ph¬Ò r¸laœ´;3¦#hzk¹‰á`+Þ^nÅ?O,àd:L‹X<œLä¾kPóÍœÛà\£Š³,cŒt± `&\4PH!P=á$T 4NÔ,iöê÷ÎÙŽ&7Žš0;@–Ï€k'¼á œ«^ ÜwUËS£0JÎQôã“aÎ<¥“¡ÏY„!óîù&M‹¸)\vž¿`G^ùâ¸h§ÉJ!²% qnQGmV³F*Çã?q?w3JC§‘”8WŸ_‹/qgŠ´Ó‘./æÀ þÿõàyÁ^ÿÊ÷óànorÛÙ·Y­í všTœoVAN¾¸¼î‹Y÷¿ë‹Ë®è 6÷ùÃß×<”ís%iXQ›½åuŽ·ÓE½bvx«Ÿ”yV‡B®ìabÊlËFpÐ,vi”wý£Éû8˜/lâ/øÇ<ކ2ìÑ Û¨yÕ"c½ÛòG> 'î|‚ÈÉåúO°×"›ä´A9æ²~UÞŸ‡^OÒ÷´x›Àó‹›;ï…ÐI“#£¨º‹h^SÑ~¹›xÓÈ-è„EÕ{hdïkäK…bÄ#ú*ÿ{“¶At­Jfصs¸àb®µµšÊ*ÇY:̤Rï4ùÙ…‘üÔßiµ«EÀk¿>qõì~ŽUesµÁO‹§UÍî¦AÛ]ç,&×Vdué-tè3÷¡Q[¿LòÛ<Ĥ…÷’Jå"¿BØÁ¤1ú¡ÂÌiÅ2ësçxCjMƒ…Bˆ+[e‹+&å±É¼'ñ*kº÷w ŒŒíÄ3÷?¿áçÊïƒÅÀ[ÌÆCþQlc¦§ÅÓƒj…ÉÒÒg¤~^ü|†^\»÷®&Ik% gíW…·ÖGº,·õš= Áyé {¥ª#Üu¤“Íã Mo…9\U.> ·Äš¡««UpùÕÚjž7´©-ø©"Üw<[Fs䇃ž]ßPäI­I³Ö½.Î-Iüüиpà¿Ð\´Y•#ù¸»šeX±:÷îLÁµà„©½WñW<žÕÁ–£â>XKéG›fÊã)f9\+W]««ûŸá^#(éÞ¦9ßÍ‹>ÑÁcmR·®D [‰J$çòúÒãŸD<‹«%j æ^Kß°vð}¤–Û^ËW×D§š‚AÇÃEÒŽÆ.ŠZ0~É'¯Âß/\òIî%‚Ëð(£H%³sh©À¸ÔA"7A§¶(l.« WyªbóÓKãšw:çw8“K ávÓ:'½ã´nâdá…´ïÒï4‚äÚ âzë9Ò”wDGƉ(cŸ_Û´†ͬÂÞ',­Ar Z_±6Y÷‰¿®¡ ¼õ´[kïv4.“Ò^_1}¥L_ó£°Ì[âqü?ŠBÀÑð §ÀÂûºMHÎté<Å †ïÉÈE2ñÝ»_òȾLñ8%ãûfcRдWYÁùx¬Ú~¶w´„îgB‰7bç Õ1>bÚ5»¢U¼1Ý+RÁÙŠPŽÚöU(\ðÊq%ýß}ég\+ýEA«•{bØ­î2—‘_À˜°[vÁõÞŠ–ßù*?ý\kL23 IãÎpŒëf3Ö¸Î]EÉÛµ×Öž]‚ÑkkoRðX¬;s³œèó¶ªýÎ =/zÇ÷gä~VãÃm«%Œâ²«½,²¼ÖƒÃÒû$^=Íj!aoÖÌÛu³z$9OE“7ëŒÈè]ý¬½¤\îâõ5œÈ3t[vPëzä< Š\¤]’¯¶h¤Mñµ´ZMvnº‡'—‡‹ŽÎØK ¹ksC¦¹É]Œ¯œl­au-ôªª¹nñ·§j)IC*+]j“G{%õÐ:w¡êÝr©4ª}¹þÒÎ X‡ ñŸ6q„vYµÓ²©o¬!ѸßPCzj<¸›ÂÓ:R¸M¯bòËPÄA«MªËÚRÒb[þðøb^žu7a¦¨ÿ©÷·zQ¤Óý¹ëoÔ‡TåAm©[Ùý¾»Þ@Ýq­»9òæ~ï_ëÍ<ýÏ¢ åendstream endobj 29 0 obj 3782 endobj 31 0 obj << /Length 32 0 R /Filter /FlateDecode /Length1 11252 >> stream xœíz{xå™ï÷}#Íè®î–¬»ä»$ëf;Ž=¾_Ç&÷‹ã8&ÎÍvŒBS6$BÂ¥PvBi·”Ò¦Ï!'KZèRhÚmËÙC—§ÐížÃi lÙJ[BiS,÷ɲœ¸<Ï9žçXÖè›ñh¾ß¼—ßû{¿ñìÌq¤C·"IcûF§øÕ¿»!ô2BØ4vpÖÛà¶Àø—ôØ Ó;÷­z1y !röÍ;÷¾aíSâÛ°ÿBú‰ñÑ_›û¾ ¡Ðeø{zlÊ=Æ ®ýàľÙCGM³›`ößÙ;56úìÇ®Š4ÀþÁ}£‡¦+ÐC0Œ< ïäè¾ñš5wý ö_AˆyezêÆY3:C¨úqú÷é™ñiá'ÌK°ó£$¼1¼è†,Ý'ŒBÉr*µF«ÓŒ¼`Í«Íîp–¹Üå¯Ï†Â‘ŠÊªêšÚºh,^ŸH¦Ò™†FôÿÈOî ÈsämtíAûQÿîÈw÷ßÑ÷Ò}†/Æf^ÿVæÖþñ7ØÏÜú›é[þ¼‹ým`ûþ}ï=Zß“?I‰_°œ»ÜXÿ+ãñ·"•oo=qé€wY×…¯¿áñÞÏ\ì¼íöW¿|C×ûÏ|ùRtéƒ=ÇÞ¯¿í?Ý'^®íxBÛõá{>ÌñO=Ó¾ùÒïŽl;rè_úÜ÷î}ñÇÓÏ{ܧë6}ãw«g/;&.¬ÁWÞœþšà»ïQûùê>óÆ›»OͶ½¾=²}ŠñœH¬õ=Û±å;?{55´ñ§§A[%ŒjvyŸfB]Ñ {`b[g-o7‹Ñ@sh­äÅ*•¤&œB‰«T2D©àÇr˜`†ÆG÷ÁhÆŽZ›£ÍüýÅÑæ¹fúFñî›xl¦ê›}ZZß džEªÜ ‚O%„@+¾)ûÃ+WÍ'l%gàj\òr>$çüÌ„U*˜·8gk3®Ëÿ ºù” Å” ÃÙ¾z7é˜{žtPüiØüøÓÖK>ìtJe¼Eí°ÛD“À«Y%A»‰3 &…‰[[mÅ™ç§/LN³tr§Âï‚'usÔ>4æ8«Ñ.r²®Ýyó ’°¾6²2y_YÌÔq¸P¦’®£ûÚ–}v÷ÄQì·„&C ~8{øþ®ƒGï¹seÉʾ Cß¼J ªÊ}ˆ/“· ²Ü^Ù‚ ›`ä³(èhâ¹XµZ©€šuó)Ð\jÆÅ ¨[ÊŒ6Ál „# N‰)@,ãÅ›Oˆ‡”L¼kôÆ›G3A ×V¤"ä-ËÜ{÷UiÌÕgn:ô ÛšÎ®¾ìûÊDQWƒA^!¿–2¢Ɇy^4D£ q¦g9Ž’“¢jE¬h¤ñ¥ ù<-e†‚+X´éäçã4ðÇðÇ–¹ËäŒ?;ñ8xI›û~†uKVHAƒÕ¬d¼ÑÀa,.òãb ‰(P:y@f‰| YÌl-¸h#QŸN%£8LÃ-ýk¶×ô¥Ú¤–ëðö­ûc#+Ü‘UÍË}î}ÄÛª¼©"˜ܾl{“Ï7hµ•Æ›)ÏuÁæ»ä¤Fë$Öh$-Q­ªUnU0,$§úJÇKº!Mé h ¤Î, K@è‡ùÿyîyfÿg²ÿ^²6»ˆ™P/øJ%³Ö SB–j R3&°Y˜µÄ`EVK§‹¬jbH2Tt‰‡LŒ·F(³;C¢¹6t¯ÝQïõVÖXTÚƒšê샀$ÁóS¢F!4&Ep8,EŸ]« nð…@GQæÔsL(è*•¦d6€&—·ÅÄ_2\ 2\’&i~+s$·8èk¹tOk¥J×¾ª3ì;¦P•WÆ>«T{kjnÃã£~ŸÉŸ¬R !ïúìx(¢µUgïÅ•zG${ÍoîßñÛD‹¨ü[”¢|M8ä/wÙDTò”;yF•Â< F£Wgïb&¬+½—:ù^"yc[8Fɬa¹|BÃáTnFÌüy ÚÑŒö·Ÿôh0£Ò”÷$ÍMDZ³é¼Ál9HØž´ÏÆcÛlbùwëYu\qÈZaæ\ÃOcK7û³I_myˆFD%ù>Q@åë—råãm¼Q§V)yL\P÷à$¼à%|M½ÃKÔ»“¡Niʼnˆ@šÑ[2âÏŸ>Q¥XOìh¥•7"§>w¤Î¬&,Ñ(#Nü‘ñ¥ÌD퉯?¹~Ëxû3YòôʘºÊ˜°>¶‹ú"#ù R"=ºN*Ãd„ Óë´*è ©õ:%£@ÅBhkŽ.J²b=4”b6È.È$81€iPA ]ºíKÿ£Ç²?Qß®:‰ý¿üyö5ÒÖ×ìKÜ8÷…Œ'#P…5h °ºV+é85£QC¾SŽ„¤A£Qq¥*ÎÖ¼HÙ”m)m>ß‚˜`Ä#tÝóƒ³o||ñUr!û^žýnö.¼'ûy¸®»Œ;É#Pé6ëÐJ§¢bRs‚æ06ŒtótùWÂr8—W v4äòú˜R¤ÉVÌþè­Ýoð ©Ä :‘PÞ¡"xCö/qŸfÐVéw¦°sÝõaÿ @3¼Fô€tò‡"5(A$ð £Áª‡gŒ‹è :'«ÝÅ…å¯*@‹œ>ÖÅÐnºI4UV&ª;ušã¬º¼*qߨ•ðûkÉ ½j­3$¹d­£õ9MJ·ê”pޱò ™- Š«Jäºg¡D‚è¡NŠ@óÁ‰–¼ö¡yÒ­ºI…#ë2u#žŠ†ÕËëÈß †ë¡ &“xv0nq™céÑáíUMeZÏã~2ôçòþõÝîFj  Ä”êÖ$ÇU@´ƒt˜¹Jm/N—%4åÝ"ÕP¦IfîäQÅÙ‚5[œ:rÉٚݿ½œ º½ÃøèF@@KØÇ„‡¨¦=-jì4è0rš”ü 5‹y»¨¥c\"ÀC4•€S2`%à’H^·B·ãÒ¸ó¼;;b]= 6]78ufÃî­á1ghzúfuuCe Ô! mìßÜíJë•yU„¿>ÖBoé–;6…R^Áäõ! $˜U.Ò†Wå}‰Ý®íã n ‹/•X.þ½ƒÙ—ö._†žÎŽíÛ‡™°Ã~º"#°¡VIÄv»ä`M:ƒ‚5+£žŸYnj£s¥n²—Ng/¶E o«ÏÇåÏñÝûn¥ï÷79-ÕðÎzà¾ÃðŽ>¹½ÂGßyê%T‚ š’b8’ÂVïv9mVâFI<å:Ƨ"«EÔPë°Á€Ó®°\¾²9jk†Þ›–‡B~mx…Jq‡dÜPNY.½ Óî(ÙJÀ›°c)dPð¿wê^7¯Ñî×ê1§ÝÅX´Uµ&½ò³D/f?ÞŽ¿‘}®±¡ôõ°Ÿk)Ã7£å ÿ”JI¨æýW¨Œlc…BR’Bñ`–( K8ŠR¬ŠùÊÑó9¨}ô‹¹?àÁfv´šÃ!9&Î’GÃF:bæ‹Æ¡±SR6 â(Ä‘ïÿ3‚ÌßéüˆË7‘pÇq­Þï¨WÝê)Ó'®O_¯×žÅ½Žì…V‹½\ÄeÙà ¡´è‰×…¼D±‘¾6¸oôŒÙ¨‚Í‹9¼$˜ÍK€*¬Ì/M2-¯ßßÚš\60è®ÞÔÚ ­š¹û©hÅÝ䙑ÈÁÃ'R×Õ®oûLJo]¿r ’ûÇ+Ì ð„­N¥ˆx‹ô,oT«ˆûÕ²6¯ÌJš"¼6“iS$Î0†JZæÜWhv©õ¶–‡$Iín¼ÿkµh­\Y#KžÏþöØØM;±#û£æ[FîÀª¹\Öq{üo³oÂ61JÞF´] c«U²!£A¯£¼À`A¡W³ŒR¡Ó fF«AX¿ÀdÐ/]½µ_¬¥ð­²i©aÝ8!¯ÕˆËWJƒŽS¢îöe©ª ßcãA±›D¶–”aÏ|²Dç/‚.ròüÍxPéÍôç(_> ‹H´“kWa]-AÕÓÂŽøå[•…[f~q’KRB‡Èx´1ÞP™R;Ë÷ i4)kïžXMeËéÛ—Uéna·-szcuÚºFGJÐðöôäÁí ³3«W áß׬ 3ÁXûZìt×Vv¶Ô´g"I—]à[‹Çç7)Ôef«ÛäÔ»fVmÕk\¹Ræ:’óâ9Ÿ:%‹ìc­V£´òZLŒ6ëBÊ6—ðI1e¯um†Éȹ*· ,¯uÂ+P‡#á#‡ïÜ 6)µjíÀ™oGoè«krXƒÑ¯Ð+ô÷â|ö5÷€;~8÷çã+Ôëy“±ÌÖô•y†ù=pÞËÈ'¯PùýR@^¡òˆ*bW€öÄ’’zuŠÈ_ŠÔ¿˜ø¬\²Bµ°@…·¶¯ï¯Nû«¯úÑcŸLî¹þæM;Bî»ÈËÝ;Rµ2Îûâî[[÷5Œ´9,eËcM#‡h,vÀ¦•œGЙý’Ûl’]ex£YàU4u h)ù±xQÊVŠÙV(SõóÁá%Š7Üqº§~½4ÒÝ6QÑ’Vœì&ç\ËægÏlÛ¨Q®líkwÎÊóªˆÌ+#RHæV£^àF~(Aií§6Ò×]ŠYò/Ê|ÝwýÓÝwÿ4ÓÀ†¹>œÎþ˜^º.÷;ôz°¤$} »X•Vì%ÓKTQ]"J&ƒ¡D_0!©Î‡{M“‹Àôù¹×+ùtÐ[Ív‹Y>p) .]u£…è¹Z²"ä-…àÍߤRFÀQ2 „#4Æ#‚à R¿3›§7I¼>tì‰@y²Ö¤ÑÕÇqt0q‘‹xzóuû±žþ¯æôH»Z‰³ožçbµMž>ÇÉ}HªÀS6yˆªG=uJK]dÖë¨J@/¬2 O’ôùƒ\åө£™¢Ò÷èÝÛ4än­l»á[iáUüV6Ól‹­jñóÙš•¾D ö@΢«0Q°ª€\("W§Š ©Rëõ”»éJHÐSî0‹Z¸Z„ÿ“êTQ ·b>Øó‘>ï«úLmËÐaF6s×»33Q{Å©ÚúuÞÆÕÃ5åÖ Ñ³nSµ5˜0‘‹;ú{êlúªÉ&%!m Õ–„¨Î¾ÿïÌt Ðüç²ó×D4òó º²¤V«”j ò½”þ®–+K,!×à˜‹ß¾³ß¬WÙºNÿIø´¬±ïu˜‡*\/~ w ÚQY[+Õ9«+ý^­ò:m¢Ž#XÍò¼{þéDtѳ‰k7u¨¶I­ìé@Ê&S™ÜIeнT9–&ŠºÑûÊšZ³º£»:Úß»õævƒ­¡õÒ#µao°bâX³ƒ5˜ÆÌª k|fÏØŠµÕjµ8˜Úy›r ·¶³Á¬£ÏÕ{á¾ÞÃ9ä@« /”ׯì&ž.³ í3 ô˜/vxé8à—z,$‚JáŠÙ>°oöâ5æïœ–-Ί„Ü©ÊÁñæxÃq|dæ”rïÚ©{¸1Ãk¢Œ\–ûˆÜH^€ÞÓ+w >ŸäWºÌ»^©F„…^ëUªôÈWŠÈ'ë—yƒæ |ZŽ”»gyÇ‘óuöƒ'v‚ +èÜ"­±”š‘54Tæ%hÕ}jÛ‘(Êgäs ä3UÑfŽ©h{f“Àéô[/´œr²ãä‘1µ¨´S¥#ÒÇ€­o\ëH$²Çñ>ï†èÊìç©%S¹?âO@CÛQH~ÂFŸ:hË‚Šõ»Ê€_µ,øÜ,‚¥13ߌ´¶.•ÿŶd‰G ò3f®ÄÐ,ÚJŠ~ÎbOýÆ;•L¸gë¾xÓŽžj¢;¤5 …›x–5’KÞšèaŸ®òô¡=×mŒjå«ð/6d³•ïùÚÝ­ËmòSè?Bþ;ÜIuú¡\˜FòˆzCøkÖq‹Šk9 §36JU áš—zi€m.<Τ±‹jëÜʽÕ+]•훎Ü>6yÆh«6b’ŒÖ¦ãäVÃ6RX¾Ñwó†ÑÛ»e ccïòì‹>–„ ROGC¬‘®òæðs‚ÜšL’È@cÊkÌͯ1î÷ÇãLƒåÍ2“Û\ýe-äxÌï¯Í«±JÈv ƒÕ¨÷Ô¥`1å3Ÿò]ýk:¬t±áZ‚É ëÃD¤»Õ&v?r¢Þ©Á̉ÏÝ4 (‰òü?wmž\]çšof–ʾŽä%¿O¾àùň±ù#(ûïÐÃçnùΣÅÿz'çeV0P AÂAøóhÎ[òïEøª7j—Q+¼9R…ÒðéÆp’+÷ÙŠ\„…wªBWP5þ)Òâï¢.<„êÅñ‡ÈK~ŒÔø#” Ûàx Ä‚bø×¨Ÿ…ãßDA¬E>ÒDujÁz”!ÂßCqbCxq9êctŸY×w#`èĿʽC* Æ„4#-s¦Q7\¯Ž,C-0_š\sþ2—…ïÚàÝKîGeLUj”‚}7¼cðÝt%÷2I= úó&ôìƒ×zü4þ&÷“w™*fŠù…¢Oñ¸â-eXyDùÏÊ»œ=žȩ¸Ü׸+ªeª[U¿U;Õ»Õç5œf£æ1ÍGÚ{µoé–éNê^Ö}¢ß¤Ò z ÿ`Tןâ ü$NPÂC‹7¡~ð ý!H…$D½Ô‹)ü÷›“¢?6–xŠ/îèZvÆ |óPa¬€s^(Œ•h%z¥0f©‹¾®-Ž1Rá¾Â˜ ¯.ŒðÅúÂXçÜR+Q/ŒY8þu8ºVŠÿ×Âp]a 8‰«0œà÷üp’™Âp’c…1à$ÿŒžBqÔ¯8è€.4ƒv¡=0FÓ0‡ñ8Û‡FÑ$¼¼àÉ)øœ…¿OÀhŽôÉûô¬I8k¾5%ö¢8: £v8²í@C°¿€ñ(œ=Û1øœ‚«Ã_wÁþÂõ§àÌ82 óÐk{QÕɯ¾êµûÿw×ëÅPJÞ§ix*ÞØ÷vÍìÚãžÞ5¾g|fßè䤷{jrvxbjÚÛ79;>39:»kjrtïÀøìhûÔÞCã;ì›™Ú7¾cר|þÔΙÑé‰ño².î?µøù)çÆãu±Ti˜?ûÿ{ì¯{¬ç(7"j‰IÍ0 m!§ð™‹8w¢k¢³ø{^©èFÕç9¶ç 8rŽeaû¿A(¾ endstream endobj 32 0 obj 6712 endobj 33 0 obj << /Type /FontDescriptor /FontName /BAAAAA+MetaBold /Flags 4 /FontBBox [ -128 -224 1174 926 ] /ItalicAngle 0 /Ascent 925 /Descent 224 /CapHeight 925 /StemV 80 /FontFile2 31 0 R >> endobj 34 0 obj << /Length 481 /Filter /FlateDecode >> stream xœ]”ËŽ£0E÷Hüƒ—=‹ØeC·!¥ó²˜‡&=@ÀÉ M9d‘¿¸×ÝÍ&ÑÁUå:6E¶9l}7©ìGš£ŸÔ¹ëÛàoÃ=4^ü¥ëÓDÕvÍôøk®õ˜&Ùœ|Ü&=ôçA­Vi¢Tös¸MᡞÖípò_ðð{h}èú‹zúµ9òÑñ>ŽüÕ÷“ÊÓ¤ªTëÏKͯõø­¾z•!ýùÐÎÝôxžÿ yŒ^>Ðì­ZëÆ‡º¿ø4Yåy¥Vû}•&¾oÿ_u%³Nçæw–h=Gç¹³ÕP¼„à`r€Ø5  ”€’9{À ¥_ ¯€5 À € W `Ëœ-`GЀ=ð©Î¹ò %ЧD:úìô±}JøhúèMÓÇ0Œ>hú”8MŸ‚aô(húsè#Ì¡°7úXœŽ¡O‰ƒ7Ñíú8h›èƒs3ч9Ñ×h¢sèSrú8–¦E;†>–ècpn†>r†>Ž›ÒÇr%Þzúöúr„>¯‹ÐÇâ¶…>ª }„Õè#ðú8œ¨Ä÷ ×(ÑgÇ9øxß—‘À\saž5 ;fl™®®÷Ÿ„q‘þzFõŒendstream endobj 35 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BAAAAA+MetaBold /FirstChar 0 /LastChar 57 /Widths [ 500 500 554 500 333 284 606 518 554 250 465 446 338 785 499 714 501 608 304 533 482 428 429 267 570 554 269 537 449 535 535 286 537 535 856 285 500 481 552 500 572 607 624 267 571 608 590 480 535 535 659 804 555 535 535 572 250 622 ] /FontDescriptor 33 0 R /ToUnicode 34 0 R >> endobj 36 0 obj << /Length 37 0 R /Filter /FlateDecode /Length1 36552 >> stream xœÜ¼‰c[Õ•|ïÛõ¤§÷ô´ÚÚwÉ’%Y²%[^$/ò®xOl'JœÄqvb; ˜H$!(û2„ 0¡ ¤3Àtí”2-ÓBÛ´,­Sh]c÷I¶¾™ùþ€OW–î}›î»çwÎùsïóžÉ½›€8Hoܹ~Ü'›ÿàû@qã•{lí-W¡úûPѱñÍ;ož«ºFqýæW¹Veä(î`èk[6­UÒT0Ö„®ß‚6”_œ£PûÔvmÙ¹g*Id躢"½¨JIm 'HŠfd¬\Á)yA%ª5ZÞPTl4™-V›Ýát¹=^Ÿ¿$,ÿ?|‘Qôg6â#àÃcÒ–…÷>Ìxñh·ÎÀ]¨ø_.0Žþ®+Tþ×Ò¡ Çþ¯^,·UwüŸ]ÅPé`A)èÃ`#,>°¬AŸ›ÐyàQp´‚AÔò[¬wÀ³àðsàY°¡XxwƒÀ; /¢6 JÀ/ qáïèêU`x™ˆ¢­j`ô+÷B9@çz@$@5¨íà0x‡ˆ ]É‹ŽŸwÇQq VÄÐþ^0ÿ€M.Yø5:J@[{P?ö€iÔ£7漃~ùºpè—¬¨çI°ìBGO€oÁ x7Ö„½µðê‡zc@GI= ‚0¨è^Áð2x6¡a±OPŸI`Nt¥tT)‰¨D=®ÍhD¶¡r7x< ž_Gçý;øø”AvÀõððó… Cº¡»2£»Ôk©ßkÑØ^ nDãz¸Ýç×ÀkàßÀ[àGàcp\„ô k¼Š…°k±7p¯Ç·ã³d98¿sáçè.it=W¾WPÊA*M¨G½`In3ØŽîùp,?:w€ûÀCàp |¼ ¾ ~ ÞE¿òô;Bå"Ä!…ú,B3,C#Ô WÀ.8o€'á ð<¼€i±¶Û„=‚Â^À¾‹{ñ{‰ ñ,1» _¸eáµ…-¼îQù"`D£nC²©@¥õ©´!Ùµ#™÷"œäÐ}¯Cw¾!i¸L ^NkÒ ±8œïï-àN4"÷£5_žO¡ò50ƒÊ×Á7Qùxüø6øø1ø º›_‚ß?‚?ƒÏ‘¡º •Œ ûÙ ·ÁpNÃ[á}ð+ðI8_ƒß‚oÀÂÿ„o£ò+øø)ü+œÇTXfBÅŠJKaíXÖ‡­Â6c»±+ÑÝÿû3Þ‚gñ}øaüü1üeüÂ@ôãÄGd3¹‚%o ¿D>Im£õ´ñŸßžóµó¯Ïÿj!²0¼pÉ…þ}áûy[I  ¡¿a©¤@BÅBc$аŒ¡²éáV°Yƒ ¤»Ñh]‰Æêú¼do·£rük¾<†ÊWÑ(=‹ÆæMðð>*¿€ßƒ9ð ’òŸÁ? ƒ¤¬@È¡ê z¡Qu¾4 ÒˆJ lƒ°®‚Ãp5\‹Ê(*ãðj¸^›/‡àð8¼ Þï÷"Œ<†Êãðüü&<ÿ~~¾…ÆõøKø>ü=ü3ü£1¦ÆŠ1;*.̱8ÒÃ!l 6†Êv=v3v»»òW°W±÷°p7âv܇ûñ^Ž'ñZ|~?˜/³ø·ðà?ÄßÃ?Æ?#¡&t„ÉÂ@$‰ÍÄâ*ââ>„Ð’jTŠÈ0ÙFv“’o’ß¡J©uŒºz•ïQ¿£þJ‹´†ÑÍôŒq¢Q¿ÿ^ðNìl;C~ ߇ôè«àç¸ ¿•ø&²;Ýð¯Ø—ˆl?àÏ‡á§ø·€ÆîÀJÁ/Àëh\Jш\G®ÀfPŸÂØïÀvüßá•ðŸØ=àèÇŠâ_%êHW%«*å±hY$* Jü>¯Çír:ì6«Ål2ô:­F-ª^É)䬌¡)’À1‚góˆmÆ32Cxœ­­¥RÛ¹mXÙ†‘ÚÔüÅcfl#ùÃl_<2Žû™.™^> ¶PS´eœ¶™49m³p¸gÕomrÙfæòõl¾Nxò 5ìvt†-cØÒd›#¶ÌLó•[¦3#MèzÏÉÙFgã&¶4žcå¨*Gµ™fçøs°¹æ+Xs&ùõj¦ÝÙ”™is6I]˜ÁÝ™õ£3Ý=ƒ™&£Ý>Tœf€³a†äùŸ™¡gèüÏØ¶J·n¶=<3}ˬ6Œ£ÎÑõkgðõCÒo¨3-Φ™–}ç ¥ÁYøXÿàŒ¬q‚þÁ—@ûÂÁçÚ65 I¿&6½üp#>1lµIÍé飶™‡{/ßk—>‡†ÐEKƒ½ƒvÔkgæ›t½ƒù;@…†0ꤴMºÍ orf¤-#Ûl32gƒsËô¶$¬âéÐ{µýTq{ú%dŽÛ3¶éþA§}&et­o2=§Ó½W?ß–¶µ}qOið9AUéç”übEÁ]^Ù´¼/_Ë.ÕP¯—†J=r¶!ˆÌØ6ÚPO3˜»RúØT ¦7V¢ÃÐk¢ÝŠÆodZHJ‚ Ý‚Ó6ý@@pÎýá‹[Ö/n¡ÜÂg@ªJpY†Ú¿TŸ fJJ$¤ÐH´¨guùvEiðÊ™ç¸`›é@CºÑICÉ0r»]’òͳi°5fö Ú6°Áx ¤Ã¡lDÚsfiv@ÚspiÏòé#Nç¯çé¯v†ñ,¿yA§ÎlIÎ@ÝÿÇîM…ýH}2¶çÒ=Ý=èY?}³Ñ32}ËM3RÅééf§­yzdzýìÂÁ N›àœ~®£cz<3²tK³ §o6Î4ß2´¢A‰FcFÝ8ˆ±¡B 3â¨ÖÑçìè´e¦G·¸¥2ß*°Aô"éȦi%E?ŠAŒ$EœÃgáuß H’‘Ѫ~‚6æå—0 +„ 5ÙÏjTbU¸æ³BÒ_Y¤LeW¹í*;þiÃÏü3M‚ ^|ýÒŠ…ð­xbR› “Þ-#yR`{Ø^¶l,·¼Üùr?Ú\xs\èä;Üžo‡¯ÝßÉöfû¸ÀUrU8fR‡-ÐbÙìååÈ.Ê ™Ú(íéæ•©Õ뽘ÆëÅJûW⣃Ão5Á¦&Š=UÁFLÐ4‹Ou§œ,¦–á¯Ëñ6z{¼£Þ+½‡¼·{õ~Ýûº÷'ÞϼJÁ{Ћy½³pcZ”­‘jØh­W§ªñêwÇ„Ïskskçû>A;‘ÓÇ@êâ¹\j.uMUxÂ0§ÒWU†Êk…סJÔWIb•A«œXBe8‘9ˆ.ã TbQ+ÔÐ)1jôùm ^ iÊéðT”'ê Ú@Ñ…âñ¢‚6Æó›cQ]á"RIÁxE¹×ãt Ã¤³µ],Šý…Å §pg™†’THMÈK­Ý¼œU°¦+ü.½ž-Ò¨X«ÚÔ³Õ°Æòr^nŠ”õ?šYݨóÍÇ ¢¼qŸà *¼ÅJ=ïðšRå͇Œn‹žÁ~¢b-2œVP ʦyþêÛî²±[dî99+÷1i5‚ÒÓP46ªÝc«µ!Ž€4gÒÓ+§w²ø˜‹[(9U¶_ô6©²™Z™©ˆç,¡Ô «KÝ.¤K¹…ßàWãÕ`v§ï"ÕŠŒºÅÐVÜfilbÌ@g1Z›Éo Y#Ö2kÔ3ÕZëÜmåŠX[F‘±õÙÖ[7µÿÌÿó:Îb]Ýܾ²ý°¼Ü]tw5.—7·bõ€œ‘‘a2è­eá²Tþ^,+[4š‹ ºvJÝé Ÿ¬®×TW׫;;×÷M?06%¬4¤OÀcž4ÏSM»T7ûãˆÀÈ,lI;B§l}pu'PãÆê@uuõþêcÕ÷U»š6 @C€šÅ>L;…~[Yº¿§}ÿxÿ ýwö?Üÿvÿgý ª_×°ÿ­~¢ÿ%x ŸOäÎ!ÌU©ªª$ØMN¤ðü¼–P‡¾ —à—ÞB^€€`Nærˆ5KPq:¼u˜„$‰p „ñ¢—Á¥Õ $ñ˜„J}DªÑþŠòÒ ºL–)·a4Y~…œ¤”ÚuÛ#G²"ÉX”U5CåÞiŽ–:<%èÊq¿µ%‘rú †Øí•jF)´íCK¶®P¨´rÎH°º•zì†ú „%´4Õ CÑJç±*VvÓßJ¬n³¨òÜô›8J¡x V6ºµEÅ.X{8èPq<Ü~ãcO›8œdHÆTÿ£8²E«Þ!4d=Hƒ>ˆ§·[AsIs¨9BXÍV«ÕnuXú¤~EØö—”`°4 „ý‘”9eMÙSŽ”³ÃßQÒÜe M …Ÿ "ù·×[Mvû"m£EÚq’ô›D1Gú5¨æ÷Ö»³P–Vp3âÚ‡k)»õ4v˜xLî¡ú7¢òVšH×ûKüMþÿ&ÿ]~Êï— ‘RÖ3"Ämñt?‡q ýí2C9š»pñBĹ sHÜUGÉPàr33„‘’jPBC 0rP7’íÃD4£zdpI¬¸^2EËâ]4C‹²®Ã%ÐÀh¢˃Y ÙìÃ4‡aZΘÖ2OV*J‡}£F§:Ž»î˜¾ÍínFI5qÆòWt¥[°øê»Ž&vÝ|·¯býS™¨Ö½5i¿©!€½ ‡tQ–j@öDËS&=$,rê¯ógz½Éèü*Šz„–_›M2Úòó²¢ä®ÖrS`ÅúÍ©7ï¨×p{ÝM¿z_kK–§œ¿|8PA²?¶ðk|œ ¢Hº¼ne÷……E;ÛQÜî(ëÆ»e#øˆŒQ+Âòˆ¼L•Ç• g|J&MN“N?éôiœNŸS™Æ+­> ~Êñi*wi¨à°•­1X Ð0 ·¦U2Ò):δó' Ð霅'žk”ö Ê»À¾¿åPe •ÏçTyiIúLJâË«0úËK+—ƒž€ä¢‰¼¦âyGPP^lYASy‘V”ãÑ‚óˆ/)k^@ðÆr3õª®À“í¬oçítñ~›Ûâ9zUö®òêFmù‡EñŒÍ™yÚÖPbs›Möôªéžrq^4ÑÍŸú½çêù_»Sq:Cu‡æ?ØÓ‘ñÖm§±®ñn›žÿGTëývùÎÝ5&§Ú³å+Gž6[üãØ²ðv÷£ñ¯{Ó¶Hņ#Ãe[#×Dn‰¼íúÜû©ïÏ%ŸU± XŽ)˜…ò´‘ZƒX0¨N ;(ꔚUüžç±ò㼺gáØ)lD/)D­ðùÜÅÜÅkTUaCa0%›wñZ©-!¾JÀ 5ò‹zäjhÜ.öä@óƒ)B*¡W'.¶léþd·i]:•»")*¼åÊö® w™Ymqg;dÎOY{•½O¹¯ËÖä®5ÔÙZ£»®)·®Î5ùM2uy96¾£1’Ú9RÚ\7ÞÍX¬½u‰íEqÚm…ÅJ¿í š=Öøõ(Ÿ¾øgüjÒ À£ép¦2SÕµ 7×Õ%‘­4sm-™¦F2Ù®TjÂÌ%ÛÛsœYÃqæFµ¡á¹ºÓ’ÿ¢Ùð\ñ™Âfáí_g†{”©vƒÐ,lxÞç[…˜]CZÖßÿ9nÕJ i“±ðœ*&¡ñâ9é}aNø\Âäÿ¤5KÀ ç‘ ó.¤0²0¡Î¦dœ‹»Èu¤±E•XÌ""i}"߂ɑÆ}ÇójXG±\^d.©+_íÜ “5•¢ŒŽæp\k¸=Xé¬fìåé6M±_F+8t«»¸:C×REzÔÞO“"Ñ^¶¾µ¢ÚSÛ_?PÒpE‘Ä®„=V÷†Ý7é0HÞq}vEµK̸ N‡«XÎ2B©ýàœ Ã0DUuÔøü ¥¤ô€.p,‚ãI~˜AŒ^2=ŽŒ ªFÂTŠÂd<%CIgSÒ‰Œ§)HIŠã(pÚå÷ÄÜÄÅɉ/lš›@ 5ÞHÔ“’Ò€¼Œâ‹H%º™ˆ‹Ëꂽ3ÿÁ==£+ê”bÅ—:›G.þ5 GV~­ÄXÞÙ•Æ*?œ¿÷êëWý¦CeȬÝ{ñùP0Ô￲¤,³çû!î‡ÆãåýN¿6£†2B‰nQ T„H¨å:º1¢Šˆ ª´HôªÄÕº5%wðww¨îïÖÝ«ÿ—’û§TÏ‹/kù*j“¬áF•#ü¨°M·K¿Õ°Ó¿³ä3þ3aA¿àÿ, ¤Tœž+ÉMªF±Sßfhó·•4š‚ÙÄAî ò ½p½ê-î-þ-áÇ*J¥{…n‘ˆ&*«p‹O-j4:ƒÏOZ¢I&¢¥‚KD5‰DÔJ¦È“$N¢èãypŠuÌÂçÒŠ“^èÝUL…Y–rK h·´`Àò–—›Úxt,zgt!JpQ•$T#ün"‡´I)&"}“s¢}Ë*™WÅÅX#ÿ•4ÐÑÈ»OL"ù!ΗW®¼;°ÀE^OˆKÌ.h¥$9°ÌóâjIwËa«ÝÌôù‹nŠÚ|E(zh(.'”GZ+Z|Îb³Æm-Â9A#óŸ7j壞 ¬k¦q {Ï`“íÂâ™Õ8m@c–ø~õ~ÑÐ+ÚÊmEþ]oN«óá*5¯)Þ ‹jfxVšcÚ¸ð1ö4’}\‘öwÈ:\GÔGŠ Ä$YÑ‘Š´°Íò.uWq³CvB}sщbܦè1ýËp˜@)c=쥄S&¹æ÷'ôP¯/)‰(FÒ6h“F3Œð.Ù8ÄŒ ~bN˜Ë3ä^½!XlÑQHvK/…TGQ`Ë;† ñ iB†Çék¿‡cÕÞpª^ÍòDyÇu¡"{öîuÄ"ë­Z»^ÁÒ)Zèš¿sªTäJ*G (f¯Xeäº÷Óœ]ßVf±£;o[ø-ö að`Úƒâm±»+  vÃqH@è*Ñ* †2R©|ÒU¢q¹J€D+Y8DAoC£ EÕ)«,!q½Ë트Үn׈këF×]®G\3®Ÿº>qqÀõ– \Ðåz7²ÄF&/E´æ.Yüâ²@}y¼HI®Þž¤ÔªèlcYMóWÏd(b]°ç.‹’D8ˆ.œ#cxÜÿ^Èx*’éÚÌêÌš¶#´³%)¯hih9Ư=Üx¸ùp‹l e¬eËš­WÝÕBÓq;úäÚ'ÇÞ¬ûv×ä~ZýAòãî?ô~xøÃ#ÊÍWÈh>в¿svÿŠýûö߸ÿð¾#G4Š*O•7’LeÊ»’[»:ºVlön^3–Û²Y!h}ºp&Üj u†²¡žÕî=qMµKÁ·ñí|ßÉgùü(¿‰Ô‚FþjX±V»VK§eP&;z(ÒüZæµæ³g›ÎfÎ6¿×ø^Ó{™÷šåˆôáÍÕÉ®žx_E9SÛéñ®Á]k§ º+ íþÎQë¶§³3W[¡©­­HG·™¶=éZ‹LÄÚ£‡­ß¯Õì߯Õ®DgQmª•»ÂÔø.„bº i”SÁS*ªÙ–‰dÒ™îÌm2#¡[[ªc¦=ÀŽža7°Õ':ïìÄ;gqæÅêÑÕ£'FñQTO«*µ<´éÐáCä}‡à¡!$ç. 0ƒTà·Èe»x!Wµ˜)›û_q¼œ¸H\}™eæ™fÅ·ùLFU(„âÖÅP('¡\²E^ÇbnìršIKyŒKÑ%–©Ê’*,—&~}Þ¾#:£¾,^º”Ü@ÅÅ yyÏS C¤F‡(EO&ʲjµÕÚjª,+*Ò™÷ÚÙÄÊÚ;1»QÃíQca•M9ðB¹ÎA0l ¬8êV'iÒV¿ÎùÙ*-Ϙ;RìQ²J]2{o÷am±NkÓâE‘Ÿ4Èp–’ ÖPßmâþ¼EÁŠEŽ#xê¡S8öCÂ\žæä³µkZy1ïümƒ!¹©uÓ#*ô+ß®.­ª±+œh¯$ t¥ÕIIj|«˜ž§ AîgÕ«x9¯°õüëºû¾â5à”èÏÂo¶Ë*…L4 ݧh=uµÞ Å ž/b!4¯bá<öEqÝ›i3`€«SÑiŸVLÛ©"d_£XcߪØj§ì6Û,|0]ÌÉQ°"—Û8;¡rÙm9Ç*Sú®¼óº=­4 «(!?·œro-_§†=ò¢Y,™¶i4JÇËZGnSÂ'”/)¿£ü›’`•~e•W*K1‰P±'ýø¡ß_Ì£fr.Ÿ›œ«ºÛäíj>,”’i—#2&&–‚™¼Èͽ,tAQV#j5b¤]»£6Wê^‹#rÍ‘ª&»6جP™#©ÃÍý}ާ²ç³ÔEFnîÚ}ª.hqÐTÄÑ3ÿ^wlk[kÔâpá¿ç_„µàЀ†´ú ñmñ·âg"AŠ"fF¬9uœ"Y4 ÙÉQÕµ’±x ­ðùÄÅ‹ç¤PÕ„”ßËáñ|†®’[Jí¹FÅx•µÔm°»,¾SÌÿWƒP:âÖ;Ê}‹'Ú¼î/mè‡Z~NœÄã`äÒ-„¿ª:QUÕVÒèHtT¦×?#¼y}OY¿1põÑŸTI¯ÙS0J9ÑtMDZ]]Q‹À¾Ð0Oã ÄÌ;À0¾™¶ëêºöaU9°CÀŽŠÃUÛª×I6a|G¹‰éœ…òÂaýÕ%)™SÌ­FÌh\9¬§6 ×óWð­°µõêq@ÌBmZˆÅ”a¦ox(e7RéY¸éTIŸc³¥}#ÁàÕû¶¯®¾zŸ¤Øsù$¨‹¹‹*I‘ÃÑg,œ+Ðz)û“§EsUH½óÊ~YCRs}~2‰Å†!¸4גטXô²ÈÈëñ.%ؤ @*’hó.C $iÂ%PHÒÌçÙt…#Ñ• RFeifæåN£íY#wÛµ±ËoòÕb1{@–1N ´>¬æMÿqC‹O(OÇï[Q‰»鸩v×un­¿>QîRu«ƒþ`ïîèüc•9A)RÁáGŠTéÈ %Û«ªqEY‘ENÂQ£ô:uíîšÊ¾Ý6RW$P˜…cåGµí·/£õÂî·Åc«Bv›Ó7DÍ– = 2îhüÚîxuÇü÷”Ô]üZLb\ OZ5¶DÂWY,ê’Ö8e( €Í¿wñx3á›ÀõàlºÖ6iÛsœ=±éLã7ÓÍæaÛöMí®ˆQ¡9'ˆj­ÞŰžŽÑQ6ÔÑ‘c=–õø| ³„­Ã¡ß=µïò:WÅÄ©ÕvÝp³¼<Ï­Í>ÊCkù­#R¤`*5‹ý>Í¿ÇÂï±ÿ`19ÛÁb¬, Ùþ}Ë'[ó.\ÐÞÏ.ø„/Ä:ùÄÖý¨ ‡Àb†k™7/6y®°¤Òy°ÌªuÚE’ 5Ð[й•X!ʦp%ÔZ!¢µ:iêá…—(Œ'½å°`·—òcK %ï‰æë®±r‚RIÉ…ZµÂŒQDŽlÖªZ*ä·ŒQaBÙ‹–W+8¥IE`rŠ+¦ƒ¼`#+’=íåÛnª¸Êcjöûr¢Ê&’!I¯V)3Ì–™œEnˆ7纔´ÎjŽtèm >–ÀÕ–ŠHÐ1o–Ñ8F`Íù «ó¶Ëõ,ÄùÔÕ)"KÅZ½×–Öè1L”+I¿ÞѨÇ1“ïèPã½mK¡gþóŠ˜R&c’À’ ÒŒ–a׌½Ý+7élœÿáäÍF¥ààõj^ʰu.|ˆ  O¤) Ô ¶,hk’L¢¦:¢™ÑœÑàM²2ä ‡ëM.W®2©©¬L²±âð q â/r§ô”‚!‰ÑrþSåleº’&¼’šÅªÓ"õi¢²¸r{åW*‰ÊÊÓR<ükib¥`fòÓ+ÎÎå.ÆRèµyåÀÒ|JùEÂÆôbâå2ÞY°#‹©ÒØ¥ «@=áq—#b#¶ Wˆu¥¾dö•¸^_I×4銕r«œ‘këÝ~óDk¼Äf™ørK'‰ˆÕgWçGñ"Ñæ¶\©Ë&•ÉözÊMêò"Z®Ðäjⷔ،ºìÛ06ª()jêBÜm†ƒ:ðéY»ÒP ” ›(ÃC¥A<rG"iwuM-`XJ‘téµjBt»sI¥&™TŠCÊ!a7<×3¤³Ï›†dÊå/RC ИŸ†3 ó¼—›^³ÀÓ˜ X*­IIw²"™IîM’ë’0™|7µ4ê9áósásKy¤®ª*áâ…sËs"—% Eɶë%‡‚†% 8½´ó Qn~ŠÖUC}"/—|â‚ÖXa´0ÙŽ]6s'’¦zão3j”«Ð™ :l˜¥Í¤Ö1¢ðÕÛd1æ±âŠ3ú†ºTܦÞë8½¡ÈP¸ÇŒ½1™À#æú!³'õwôbv-Irþšª‡)stŒÊWgûH™VcÞ–ƒ3 Ï»~‰¯'£È¯¾‘^+-C+j²f»²/UP™”ÕZZy¢Wº¾±‰È¤¸ äÈÑ-T’d.“Òd2©Ê:ޝ ÕÕà œ!AdXMÝæxØ9^÷WÙÒõ¼Îª ëºtu¤N7‹}œ¶Êü©tª?5’º;õ\ê?SR H½•º%#únçeù @ÞrJ†³¦¾](Äoä¢,Ê©À5’< ‹óŠù¤ƒžÇòïRT†-¥Ñ¤æRz­n)óa‘TKSoêõÀû‰§]r-i¬V…6…¢ã#õ©XÛ䃻J½‹­Xc(RÉÕöúžzK±RŒ_w“åæ"Πѩ…VŠ„F¿ PùHV«†êÆÇ=ÝwÎݬq}·=ºrhrþ;ÿV©µÚy£Ê-V~úÚ†¸Gf¼ñÕ’ùŸÖÚDWyžç8Ü·'((8œA2*^ø3q/é»ÁoÒûäl[­^Ûµz Nt5w·¯ÄßèV«fG&³ntdÝÚ5$3¦&'2­™vøF;l?__ïš0Ÿ·g^O¹0ll÷ÖóWLížš`tš/i~ªÁoÔÀ75‰÷Àìñi¡o2ÝË0§÷È=³‡ 5$Ÿ÷‘X¤hFj g`Þeå&&4ÿ+ägsBž!]ÌMDóB‚3žîÁ4;6<<®a4 ³$Å!IŒÈóEѥ߄Åc—éP"žÂYLòPŠˆ£yñIÎΊ¸ŽäáxH}!jöx‘UÓé/æ¶=ãÒÌ2‚È ¢OyO],c×—˜8JMEiŽ0­žR¼‹£zÕB¹ê{-­kª Ý”¼¹J´—ÒÞÄÙ9yeÖ]Ï)½™"ÒÔ¬´7;[GLšºìäf—›Cþfu\&g)¹}\ñâÜëkÆL„ÄqeÝÁ_„[ÕÛUÛ¯÷þ0AÉYb¨ ›œ!é+Õû&+=Ń.¿Æ$—"¥ X†¢Ô8ŽaœÆ7Ú諾ºÕ/s%Š‹çé…úŠ&G'±rQÒ2\Ž#.ü؃‡ÁfðY:}Úþw;64<œS(X%ϯr)XÖ]?¼fMºÞå°ÛÓkÖì`݈þ¸íö¿JƒŽáí«Ù5i73b‰ž†·ƒ$æ9 ôRU ï?e¡:¤jUûåcRð\Aï‘/Ÿelû}WWHû鸡åïÄ¿‚ d EBx(´¼FŒ¼·n O^<'géKŠ•¥€yNšGXœÌ¿ÿGÚ¦P^ýuZ)ÔÔä«ÒƒŠ²F²‰Ë=ÎÒ´ŸgÑäò’6R®åR–…‡KQ¸·0KX°/ERèÔ%qµŽW*çꊬ›µ*…B%W‘E´PãôúSµ²o«7Z”J­µZ/Wj} Éê”å=íÇ®+V«UJ=qL‘ …ãÌZ7Ÿy±«Êï+ïp)^RÒa^©£´?¨OÆž±ÈiåAµZíŒÇ¶xk?ðpÏìªYÒm )¨¸ZPâ é¬j>ôG«A0Èe¤+¥Ž9ýöNîáZeãs1W™»´K²÷ÂÂyÜMZA¼”Þ&—Ë9Êñ€üîžzÝóSϯ<ŸÛ.8H;mwÙªâtÜ•¡3®}ìÕY0h+/6)ÜA•—ŒESÑÈ6Vn3ªÏë§ŒSEX9ÃsÚf‚&“M µÀ%wº€–¢éªJ)ÒÇÂá\4Ïmª¤Ôœd.„¹s±sBÞ²ç#)d*Ü’©p9;Ya’^’üŒÂùÜDbI±KÑ0O•YQ8®-dÈäp1b²B*)§WšŽ~3« Õ„!˜º£P„SS/µCŒ÷Šœ®y²”0¬(³á„ÜÞù\˜ZáŠSS¾Wÿ ÕÐšÔ FV„”FOQ á$)VÁ–Í¿pñ?6Q O“”•À òÂ÷~†‚ä x ¤¿"ÐzTrlœMpëù üÆB –ßÌoá·òÛøíàòˆò¨ò&å1~š»<¾Ç‹[Š&uw'K¦Ýï{àKO~é͈÷à^*D„eeŠ&ùUò)rŸüVò~òAg¨éÁé#ÓG§oš~P\}dõÑÕ7­9¶æ2•ʬ\™µn†›7O ¼ð(|ôÑûL§#P9rØÆÜŸˆÜÁ»÷eØÄÓGøÃÖÃáéÃ]‡ÉÇŸ6šÌ‡<­37œ¯J Ô`N»aÒéæ)+†/Ÿ¼lõö±Ñ©ÕSë0õøÔÓL€¯IkQŸ}ußwöa+öÁ}‰L–˜y‡÷ówq¦"Ìij¾}‚-‰d"7FˆddCd"òpd&ò~„ŠDÙ± 811‹ý5­’ñLƒ­c0'˜×‚af¡úÏÊ&ôÏ.9£ü*¤‰À>É)å!žXôK¤rÈ5å'0sÈ=[‚œä¥~‹šªX,ÿOÔ\櫊û¾+’ÐD"‰l&³sß„fß¾ ÷GŽÌÂÇÓbÄv¸ï¸ÿŽ#÷ßÅð†á%˜2’]"‘:ª¼ö2K•ßríëC0Â<ÉÝI]’zUøZš2  ,1‰/¦ƒ½½ÞxL+$ .o©H $)å »[L ËaÁ‚-& ôK©„ÅUw…ÜÜâÊÍ¥€+„|R¦ÁYq)¿ Y;\bG’1]¼œ†–|&ºZ9›±ë\騰šÞ_¤‘G²Ã”‚uÑfveo¥ÎGb,kaUv…Uu22œé;س©±Ž1{h^T–)¥­±ÕCîÃ5¼¾×-’u¤¾¬­~Ð*Sj ºX±ÚÁ±œÊVÈ”*Ô»'ì¾€FùT›Šó2+ª–2N[ÄÛêÍ}NYq¥¯ÒÐ$Ù\JɇÖR£•Óù²µà©tå^-ÌÐeJF’eí‘ö²•‰ÃæÃ‰»Lw˜ïrÜUñdÙw4o[~k¹`QQf¹Dã1øËð%PÜX_º¼ô4ó]æï Μ÷ÔÀ`ß°½iÃl×—ÊnóÀèñ€"â#ü£Ûïlõa{ãTÑdì%Ø ê¤%MÈ+ÏòØ 5—K¥r±“æÿó¹^ˆÞn^‰D#æâQùõÄP‹ËçŸúåyYïr¦Ë…ÐL>D8æp§Uå62-3û«&‚Û³U\õÀØÖ›bª.{\ÉÔgn¼öÅ7×66{ºÏÞ:ùÛfÒ¤ÁyïL@˜ètm+¹¯fGņXÓ”­aU¤&!îgŸ j rmóªº×z¯Y5û³þÚ­˜Õ»þL¾OZ@è…½éoRÕz_¬ÆÍ+`¼¥¹eSëöûWܺ⎶û³'W<ÙõJ×÷»~×üqö÷+>ó~Öò·"Ñ![¡k-]QáªhKf3^æm'T«9èxWWS]EÐi.NX˰óàíFH6j=™F¢q,"Œi~ÞóqÏß{p¶§¸§¤'ÙÓÞCöŒYÁTdªÌŠ•1Wq/poros¿áþÌQÎÉ•snwGqé8ÞI÷ù8ZèœLù»ýýoù ¿{%­—èÝB¯¢GèÇéYú=šIЦg±O¾Ñ'£õtß’•\^ð—¨– ¤d‘Î!<‘“láD®àŠ <ž6¦wÒœ†¦9ɾ»ôVyÖ>™Ã"Já¢åòH™©E…WBŸˆ"Ö-ÑuœQŠ•* Ë®ðKt ÏÓuèr:Ü𕌔 ­[DJæÚPbÄh!ÖÈkµ1zpë}áí«Úwy·¾qlãü¼´V¿» ³bfš°­‘©Íµ7É{ÆOùZSùî»ç?ÛX/wŠÈð+àMp~»hT ZÒ# ã‘â0‘뮸­z÷ü_Ï Ôf1 ÄaۿΗø;wVüœºúLÏ—6\õ½ÍN¤+s ¿¢šI‚¶ôý¬?ëÇ4E/Ø1¿&u¡—eèSk4ãÝ}šîúú .¯Æåòvk\õ}joCXÀy¨cç#UçãQŒ™‚Sfy¼UVîM{§¼³Þoyßö~æ¥Yo³«÷Ö᫇û¶õí뻩ï>Å÷µôa}5îîv ûúº½‚Ú•vtqýÈõ'5--°˜Åù´RVÑé^Ý}¢ûÍn²»{6§ÙaY·Þ¥GçIAY„H®àGRjòYĈXÊÜ<èÿJÊ󠈆—ÝÚrjjäŸò3]ˆÂ–ÓÙ…‘qõeˆ‰ES°°ðeôRƯÈÏ“æãÝÂóõûÅò² ®/ΘŒÎ˜\Wï¾éh¿«8bohv yôD´E€ÊP]™ÊÈ4>SØÒ{é€[÷Ô`²ÔÆ™R⃠š”c˜!×Ó$]öðü†3îTÐ^jMÒÅÝ×^[~½=Ø #F¡“SЋËkdÕü3w?~ÕªDu0Eb ½7­Ùqö·Õ*U–FLð ?§æß¾V§¯9Ó«ªÊ´ZáÊ+¯ ¯p ‘v:µå@ßÊþ>|óùÆ©TÅXr*µçüU`ìú©«¦öë´cº¦Ãö3z3Ùì‹´ã7àa^!ŒêW’´›>䋸Zîw·û û6÷7Å»#î´¿Í ÝnÉbÈd7Ó°8o#`qš=$sëi=:õ >É'_û>ZLÂ_@Â’Ö‚!æ.Ð -Õ”r•ás—ÙŽâö¾¾»ÜÛYéÖëwŽ®ÔŒŽ®½btå³ðØ ´€ŒŠðEÒ„8Ó"ކ–¬ z£€¡,â-Lä×wªë` “HJÂçCR>;OŠ.=".å²ka"ºhgÎó¨BÑO@9¼°ôÊ+1 ‚÷Zd:´g™4i4+ )‹šªæex3Ñ<Ç™¿&ƒrZQRåhµê 5®õ8¦„&(™•Ì<éÓãœú×^eC}¨ˆ`Ž{´¼ S2,îmÖB«Õç­V¶ž Û’”1œ^ ê 2gð«½ô¨ÌPsKe±o·MåqA«lPÓn-‚˜ad´ý€H 䔚ڞÊ ÷|倧5S×ô­F·]W=®†•‚Y-Ò$ÏÈ b,„^Ë)hMÏžî˜jþó[Žè¡ÇϘ‹vÀÍ­~Þ¨§yK×Á]¿ž:ÕqO¡då (ÄQb$”âÆê…_ÒšÀ§éÝ?qüÂÿväí²·£oWP÷ÉNÊïUü ÷/Êûø“ÂCªûŠî ݾ»âÞø]U_JòšÕâêò1öJö {›ü®äÃò§JMÊ1eëÚëc-ŒÄbã¢V#ŠÚ[ų"Æ‹V1$¦Ä.‘ŒE´"ᲡßëCäÆÓºÀõd =¦GÜF>Â>©s}ä™…\š·iÅHŒ0('»*ÏVb•³ØÖ4š8EláBòß罜„ÿL/Ü'Bþ¸QµQ;~Ÿâná{¸÷ ùÃâKÄËô+Ì+²oÊ_S̈¯ ¼²ò¥U/½z׫÷¾vßk¼/¾¯þø–oýøø'ªODëJÕ eÈ6tdè¦ác«§Wß²I¹‰ß$ÈOâ'‰“äIê$}’9);Éž”ŸTœä^%^%_¡NÓßd^•½Ê¾*•;-œÏâg‰³äYú,sVv–=+?«8ËUžåÏ gUgÅ3EgŠÏ}'ˆä ê}‚9!;ÁžŸPœàN(O¨‚(¨m¢M"bDÑ0½7_ÛÖqã‘›ŽQÓ͡۶µ:¦››ÇýßoXÛìŸ>žn ´nçS7N=”zè|ï¾ó{FÏï(‹¤Æ’½½º$¢ô±=S;¦b;uØNf­xØàÿró4~¢vÕÂÚÓÍS³ð•´¯˜nž^5ýæôçÓ¤gºmzhúîéǦOOÿlú£iF? §§¿,ûq|¦ž{xy†, ª’”f"WXc’ÏœKÚv©•0·TІß-Qö£äµ¯/MÉà¢8~|­æøñµË$~N.Ó/é ¤»è‰ÍK` È_R8)NûÂ6VHi †éi©¢§u‹Ë ÂÒ<3í•Ô¦ppµt–˜È?§C.kÙÒŽN»”iB +壒?ðT %GJ[úIub1Ù°Lêt±D|£BÅì+¶”ñ~îÖ~fë\r?§Pèå…F¸òù&ˆ3Ρ$]Ìþ¡U ƒ9ÈðZÌì®r$bÿ”iŽ"T5ÿÓïÒJ¥ßtu(å CÓ˜1¤5Ø… Ò/M[y–1FJ\qEã:¹áÚGtÅŽjž+Õ:?ðéK5¬]©´¨9£PsU³JîcŸÖÜüõçþ³˜oñ°¥&ïsù;¾®˜èÊy¹’ó) ™€bS 2‹C‚018¡Äå25Ôµ¹T¡‘—èC+lƹ‚¦ä¬\ÉNAŒDŽ–î‘àE’Uàð]HÉq(º½ t¾Lù8û{Š_›[;¹üÈiáAä;æ.H æŸ{¿ìÓªBz¢ðè»ô‘ŸFä@sʤ/ "t1iE ÖQ¸ÅgñòiÕüCb‹+$Äü”àòƒyyÔ!ª‡f(†uQŠ`[µ“2º95§hZT`XpF¡ÖÖû›9*ëœzkòjgu½w¶VÙí±Ì[ÿ¼Åä­ðÙ.>ë¨é«{¬Íg4®|ºju²¯¢ŠŠ×kJþâþ)±cS ÁµR@'Æ2¤G<Sò(2Öó-/ÀÞƒe"gÚq_¹Žë]ûƒŸAš×š¼u®žš_5 G¾œÝoe² 1û§ԓ¤Ì`xúâXÛ–öÍ›¶l¾©ê¾äÉ—¶|{‹Ì:LvŽ <1xfƒð¶A88¸ndNNnïïâ‰GÒ¡n$Ì!"Š[,:d%[ÛÚ©ì¡/Ÿü—î»÷îÚêªJyüö‘CÛuñìãyú¦óÍwŸOÕž¯?Ÿk>?=íy:w~°wl¥ñ¼-v>48µrjš²My°ñó{œß¿wjÿÔUÔyðÕóO©§¦ÀW <ÍŒe¯Î˾’ývö\öó,-˺²ñlGvo–¼#û£,&²[²gßÏ#YX•Ý>‚ŸÚ¡»ZwŸ5|DÇÙCìs¾ì!+¼¿îß‚ßo’IÿQ Hq°†•%µ9ôÚ!²ëÐCØ¡C³ØŸÒÙfDpþÈâYˆXÎs²CzV.õÅpyâRÚd‘û,ÿèyíDËÒd„”u“èιÂ|ĹÔ↹ÂäùÜÜÜržeÑXëF¶o?”Õ2ÊÆ1>²“ÕiXV·„D–£ç¥Eì3žË‡Ñ‹ôóù%ˆË«óf\½ôÀ®”„‘V&$݈æéQ|i%û²þHµ>?<¬E±ýÄz·&_xê+ÿŒŽ¶ Iy`i•ˑ%Ï[qµäÐFD¶¤â½ä ‹Ï,ùü5ÊN³"'hEZã“5« rIRg.ÕñeHû<–„½»|wVÎ’2‚ÙÒGÓ4QÂjòºµÕw]c²\eå‹ìžP”Ñ\4ŽQ?ƒ6†7uYÔ4A0„¢CðcÈê´ÚmFéþz{‰¶•`¯ó™ –ƒ5z:”]«P™×¥{|‘ú…1<%ÐèöBÎ…÷Q¿Ln•–&Q…6&Ý ¯]ý@H`lˆl2GÎP¢WŽL·‚’ ´#uÚOëFK4bj4þĹ.Ÿ^ÍIÔMÇ„JM` d”*¥Á:4¿eϧï(X"ÀË8'IœÐ* §å¶ mÛZé<Ý“VX-·Gb5©XÅJÿE…P jȱ˜ܾðKòk¤ì…xºÿNßmþÛJn Ü~Ø÷°ÿá’‡.}$ôhâÑÊG«xc‰+Q!ÏÈWöEöVÒ™2™ÆÌ:¼¿võØ`ûØŠÁ|¿µ]?Þß?&lØPkœEz³pÑ›ócÓîïº1ÖÝîÆÜ× LÀÇd™ ëp]Gãtã5â:ÍD±èä^îª÷ö“{ŸÝûÚÞ³{ßÛûǽÔÞ— \)\ÈM ¢#\œøÎ,0œT!U-e«cùU“¹s5—)‹)‹b݆ ãM㆙£Lè²¼R4\˜ÀÈ©ó±Cù©¥‰ «Iò sWCJÿ eñ&Ö‚é—×-M>çýFAâ1½vÁH_òÌ%Ÿ*(”Š{Â!*:&ÖìøÒÈ•køX“ÃQ!ªy†gD{‹üо«ür@e6ú+äªzË+²e×Ǭ"[b¨ ¤9‘'\]½†~U¤ŒëÖÙ’<2l‚ñ¬yíÈ&c ­Eå,FV™Js]fýλÐf•é¡Ì„I3t8n¥H†×—¯ª¿1ªÂYS”êÊê´¥I{¨Ù!aëøÂÇä^² C1Íÿ·ÿŸ~,쇭ᬇ¨5ž†/>øÒ l×€m œÆþÔØßÓ ‹ONÕ6žOMÕ2²¬YõÖìÍÙÿÊRú,Ü–Ý—½)ûN–@—À×ܘ‚©Ó­} ˜?B S¤yíПZWû²­Â'Z¨ÕÎb{¾U600‹ÝšQ­ºVOk¼µ¹õH+åmM ÊÊÖ±Ö£­w·>ÖúÓÖßµ~Þ*om]³ZÖªo]][ y‹¼!Gæû£Eó-­ˆ`çÓœç&¤åÉ ú<¿’÷ܹ‹ÈbÏ]6]Rå ‡w¶f5­­Ù奚±¡Ø$Ð$ôù’ÏH"ÔécKÿ[§ð/Q E¾´ôV_˜ñ¥ó;ãËky³)ñÂsG1¨E`ÙJoýJuµBYóJDЉj–À ®Ü·}Ð(8gbÛ Œ’kk•)/EàdSoÑcŸPl´Z©wˆ´Å±&HXœ¯^ÙÕ&ª6h3‘ •\)M8ÌîÂ76x ¢“+Y‚’Ë¢·Ìß:·‘Ò±JZId(de:‘Æ ’æUíÿÄð¿eISj3†{%œ Ÿ“c$º¡<}çI%lŠÃoàý ¸ËzÀŠY­»TT˜J%Ï4·àˆ]Ð¥rÜÓn3©ÆÔ¦)õ”‹µƒÿ§»¯Žâ¸­êž™žéžÑŒæ£5šAê–„>ÐסB}[ 0È a#i„Fš‘°„cÙØÆöB„Ö|$Ï~›]›µW ~¶ ¶!'›¬íãÍ&9¼uÖ¼çØ»!1ØI°ßnÞ3z·ª{>$cçœì§QOݾuëÖ­[·nÝê®îùÆúê÷&ÖO´éÝB@Ø/<)œ¾+¼%ü‡ „Vá=MîžX¡(‡½›Û˜'p– 6,5Ø[³¡fgÍHÍšéšçjfj.Õjjî–8¼“›%Of’ûgÉý³Ñ+tKnˆnT"n(~-»˜Açð>ˆÏ)*á;Ç ±],ˆl6HYAÑvzm‡`QŠ-¥Ü¸²Œ^‘®ˆÝ<«T7ð’e̪Ê%j°¦Òè9òæb6Y¹0‹ÒõVy™þ ‹ä2&ëœkš` àÚQ†uÒ×M‰ö%i2fÑ›/JV+Õ‹Î$GñøO‡"ëJ‹’+5[’FרêÝÕÿù—oüló´©+M` IÉ)òþ6~—_jK²Ø±Õ‹ Ìb›–l²¡òž çnÝ?ú¦>ÃhÅLVþ’[7gb—ZÿÅ%¬ó*Öb½ V5sŸjûµn@ñóÞ¹5|­PkªMªÎ­nªª® ÖŽ¶óB‡±ÃÔ‘´6wmSÇPÇHß#ô{L=I=C=Ã=#=£ÃÆaÓpÒðÐðððÈýO6žiüîè…Æ·óŠÑ“TPPØäò‹Gô’ ¥$wÁ’&iDÇó¼ Â$¡ÀØdáÜ÷L0¥yå_«Ïkúš¦¤$ß\-U{ªÙêêú-[6¤¤˜ íá»gÃó#ãêó šÖžp^KKûø ­­é=ÞUÅ7–OTM”?2 O¤Ûn¸'Ò;º˜þ‰®‰žt¦G_®?0ˆÍŸ4?i>i>c>o~Ëü®™s›±yÞ¯9Ok¨¯?’ÈMšÇ †Y<{öÑè*?™>Kâ“ m_ANèä»íÿÊú° „{¥Ñ5ê’ìùyyC-õö––ú <š v³Ù°è¶0Æn¹¨‘"}â:Dw¬Œ¹›•>šŸ{Ø ˜õ²++Òr™V´Ñé‘\ ÏRž-È¥*éŽr€5c%´‹?âBvfe’9´¼‚,ãéôŸa£¯|jHuXŠWJ‚Ö¹Tb°^gLN ŠœÎ(Ô1ã¢e[&w,}ú×G×úê%šÜš`ÕÑZ^àL˜OJ[—™j¬v\lYŸ”“jcYͲ]Å N7%e—•®°X´Oâ«:Æ`ýصÒu—ge~n¥.-ë‘c[RÁtÈ?Âa¼65§Ël´pzI§4f³·eõÝRxëtÆÓ«8!_£‡±¡á<ËÙr¶ZŽ`ÉÌܺùê2§–³Ø’Σ^+hþÞZ¶^¯ÿÎÌ2«ÁdHsd×ðžáüãd]¾eî7øWl!P ÊöІ“PŸtºÐZøºñª‘1wZ>…¥0}ð|IƒlŒÅšÂ<¯·8¿êbMa¡·¶  Ž™-¯mXVX¿úó(®©Î)­ó‚oÞ;÷¯¬­G^ô¸×åÊÏχµh%b˜Ê2ˆ0¶—UÚËÊ*³É‹]f^^ó#N$ûí=¼¥’gË2ÈFK6çIyyl^Þ,ðò¦ÌRæ-cËÊÈë‡ê ñ[Ít3Â(¹q¨vl7?ÉâOò§ùWùà?ä?ã ä‚6ßÂäµüpÛΜÈãKAÝÙÓÉtÎbÓ«m×ÚÛ™ƒ×ž ñÚÒÇwÉ×Ò¯¹\'ÌNf–y“¹Ê|Ìè*Ityá„T~"qS,—W‘;+ð8? Û‚?½>š¸u¥”zCð×]°°|àGH–ôvÂõÈÛ˜>°|8WU ñ ¬™™ø¦Ò„Ý,àïÈúœs&€l‹.ÉëÌïÑçrŸv¿ê¾ìþÀý™[—ã®t7»ÿÙ­9â~ˆå_Êsó–ÑPeå·Ckâ_2¬•Öâµ³Ìo½fC%¸Ø<[Éÿ3Ïðqó^w_L~Ä…õ¢õì´Òmp<Át¢A|éÖ“ÌeböÀQ€úð%Ô 4ëÁ»—B~9¾4÷y…´Æ‹îbŽÍÕ³Þ[Wñe´pl'º ð. BVæ²èŽÍ½妵—Q¶öº®óÎ}y«™ïÝjÑCfcîë„·®eh¿‡Žj¾‡Žhˆ<ÃQõna.¡½ÚsР¹›º=èwš(ª.Ç™ûÙIÍ*ÍO´Ïê:¸uÜÛú~à-üØÈy“+i™yƒ…µü8ù¸õ¬í û¨øDÊj§/uŸë—îóKö¥ý‹ô¦üýÌ׳~³t.{.÷›¹ÿ˜Ì/Îo*(-ü…¢;TŒÎ‚SÞ–mA´Ú»‹yp$· "ô¨¦ – ßz8Ãj)zK…YäBÿ¤ÂdF×TX‹Œè?TX‡ÌX£Â b©Iß$ü° kŒ§)¬¥ø&ø7(¬#¿B‚¯¨°¥ã_S˜#xF¯Â€gìÖS|© | … И‡™{U# {E…ž½¡Â,*cÿ ÂPVS¬ÂZäÔ¬UaàûU˜CW4«°•jwª°¥kŸVa^S¡Qa þM…hò4 ?á_Vá$t¯¨ðä‰NÄ+* :?¢°x{ŠQ…5('E¦°‘ôlJ³ kPfÊ=N¼>eB…5È•r€ÂÂ?å¤ ÿ”Ó¶Qü›*Lð¿ °è*å3ý8 ;½SVa w*z)~½ ¼¢ÿTÂÇù5&|QØMéŸWaB¯è$ÒÿO&ôïSX¢ø[* øTžÂEŸš§Â_F`=ÕgêÝ* üSi驜©T˜àبп¤Âÿ…©žSßSaü©5vÆûýýr¿oÌ'÷G&C]ƒcòºàpplrÄ/ož î ùF' åµcýòòU«–ÁWy±\·w¯L©ÃrÈö‡öùû‹ã[|!ßPp¸ÿ´Ë>y,äë÷ùB{äàÀ¹ß7蔇|“r¯˜î „Çü!.0,÷ùCc>Hw‡áþ@ßX 8.ŽÖÒ:æÛè‹ñ-ŠU/+9 Nïñ‡ÂP^.-^QÍ*ZÀ㿦¨Ó_›  }ÈëVœùÐ ¢aÔäù{èÙ~týÔóó÷$”½­’Ûþ…” ¹ìsì÷Ù¿eϱçÙ³‹)çå6=ùM18ö#?åÔÔcpȨÊŒ I(O¨+£u”ù©IÈóf3…‚@AêºITøµ@Cø-G«à³©P9Ì2ª£¿x$'ðÓ3?¤~H÷QiŠo[ãÂ6½¸-O¤£yý@9Déö.ˆþ$ÙïLô00á6 i/-I$ÝEk£ò*º ¢7‚!:TÎwÓ¾!´ý”Ñ6‘$ í[Ø–VZn/¥[,oÑmZ/Ï+óŹ÷PÉÂjý2* V ’E¥Šþˆÿ?õÀ——©èúñ{?N[¸X‹ù5Òüû¨,»à¼ƒþ–U€J©ŒRÚ¤æAUÑÒPR¡Sð½pVÛªôaR¢™á„Raªƒq:b{©ÎګдÑtX-­èg9ª€C™óó %#5ò+µŽŒ~ê'üÔ’vQ=F{ø‹u3¿?©•(ýéWûM‘9 ¶F©i„öî>ÚgãjÛýíÕI*õšrçi1LkV¬¤0?)?L1‹õJjRœLkõ«²NªÞ«_•eÕ×8µ)Õiõv2Íï_Ô#ÍTÞaÚ–0õµ¤ÄJ¨Ö£ö ô}|4ÞÙn×ûŠ,‰u‘¼œ÷ѱºœþ2]eLª»W¯:zyH¹Ý´†Ûé9qÜ÷RS41éÞÛÚñ}´5ƒª^d:FC1û!ò’Ö‡¨M若“ ì†Xc¼ ©w…ã#ß§ÖЯúsþ2žGTMúæùÅS’ÒAê³ÂÔò|TªÏ½ôl¯*_Á”z{dŠö÷^j¥»hk'©.üh‚ÖAúmŒò%ù¤öAz>‚ª`ýäîäS¬j9îKŠ© ¡‚<ð=4¤Güô,ŒzTéZ¿ÊPÿéµ$ŽvbQLmC?mY¼žõàã6ƒ>›áh€ÑBàÀß×L½;Á7f|“ñԖןu»™èoVò_Â#&z‰ ¥©6óUæœx¯ÔXd\ûʸ˜¤¾'Z'ÑϾ„Yg\ÕA(AeVJð>jÕ{)Ü}T ?+ŸF,±K­xÈ}ªõöÆæ³¸¾“f´Æ1è]å.ÃP% Qß x2*ö< Î#·ÓWPmWޤ8—øH^\_¿:3ÖK}B¢ÿ ÒVÜ¡‡äTÚªùšòÓQ²Ø*×÷Gû¨‡ï^:eê1•±w'ë ÚïÌ^Zc8¡çã}¡ôÓü˜cŒúo•h„j6 Îñ_¦ÏeÕ‡c>!^/™#ûÕ=HGú¸¹0FJ°[¥}cTS{é/jb=¤´$Î/îÇ<¦¬zéDJ# Ó‘8N5NøÆÚ£È•hÝÑxNÑ|½µ¸ÛÙе(n­´í‹{Žh˜ð¼Ÿò޶¦¦JÜ8¼ Bhá:%Ê9Lc„q ȱ(ÅÅýÀ—éý(?eLúéϯÆKÑ1å·¸m)-£>àö+µhùèzà+I×òâúÔ9½W=K”Hi± ª‡Nðÿu€] ±R%¬:*!Y i œ—ÀG¦£±¾Ëà“˜e@Q k±TBÔZNc¬U1ŽÍj¶#ÑG==±HŸ,O#ÔøÔÒû¨ÅT¿~h§¬âýjÛä¯4«Fó< äϤ¤M2ý^«®Ñ‡á»—jS±Òq5ÂŽÍC2Ì d´ìWóª] ªrÄælRfµX™Fn*°êÝH;·Ðv†ÕÄÿgi!96Ä4;B½v˜z€ÜaÁ?‹>þôUÃçÿÕ®­&^UÆöø_ Qůg)ãû‹®“)x#»‹)£9 tEë¹ì‰ùñ–Hý‹ZJò¿ôÕÞ:,晘ûÕlî+iìOàhsäþ'š» ¹t›?oþUÝUŽyH÷ÇXx‹ÀX ²¡Äà5l0ì4è$ÖÃÖ²ldu–:ž¹Iî’·ŽææËšv¦K³,é—ÈëáH{õK;èù^à!€á0UµeÄÒ¬údä“sìÆ›’åu|T”ü42nyo÷õKGvÎêQD:ãƒÄk–|;ß„¢CtI~]Àv <ì5ê6-FòºŽ(rN-švƒy»‚0I ËÖ·Pa˜FC4—?£mPpõ‰,lšÚgCØ«órŒGçá~ªû)§™eò"Ðê:3þ&÷ð$’‚ž$⥘Ü/”HaXqÿ,2Í&~vnº”ß`~ˆCȆ$’2§ÏÙÄ7ÿj;ÎU(©W¨÷ÿ¼XÚÿsw±XgÁÿˆß·,‘ÿ/€D|ç¢À@Ê,ñJ)âsYz.Ð,‹aŒ ˜AzÔÜ }kMÖ{Ï3W«×rÙôÃ˦§/›Æ.›ü—MÈ0ËTGB Ò,³:ꀤ*ÚIE$tŬÀ§Ð b©š.a$¦]D"#2Rd8õb$”Kº;Ú É_Óòø;$©KÇÏ¡PªG[Ò~ Ÿ‚TÂßd ßdNæL!{ M£ø5È;ÌHÚu‰ø à~k³x?Àé•P̓ç¦þî1H[#¡¤7p=:Á¿CÙ¬Šo•é*E¢óxe¨`Ó±.—¡) –p)šÂ™è sàSb=•ÌŽNPÉÌŒ„Ã0”Elb¤—?îoîü>É@¿e¤sÓ%â'³€¾™ø›îóìϘ“ñÚÔ,sòHWBùÒ{ç¡ð3‘ÇÄW^ǧð:(tZçyõŠø×S¿|A|ŠžÛ³T嵈Ô;õ:!F>`ô7‘+âö×@Á¤ÀE½³ÌÊH0º»$tCâ‰%HŠ"Á,Hr"Á5dD‚]Œx7 2©vQž‰ÍÐ×ßU’ç#A $'#Á4Hž¡<ð_D‚¥×ð“(H”‚F®ûHäúEHÖF‚I´+å›"ÁTHª"×wI¡ýÝ´ö2^çÄÿ´JŸEéãë³D 7®ƒÆ"Ò/Åý(¸YŠg™®sWijÝ4ç…nJ÷7Sç™&P‡øß¢À7¦Î«,¿tH[¤Ç®CGF¤ñà,Þ}î1qw2ºíXˆˆ=о½&±ÙÜÌ5[›%ƒd˜®31LJ¦ñoé÷ úýýÎö¶rÓ?á¦ßá¦ÿ–›>ÊM?ÂM?ÌM›å¦wpÓ÷rÓÛ¸¥úL½¬O×/Ñ»ôN½¨·ë­z‹>IoÔóz½^§×è= `Ü>s©µ÷Ê3ŸmÊšÅüÆîmV=ž±¶£öÍõNqÆÆ¶3í›êgV´ƒ¼{¦² }ưaÛÖ³éšaÍb´yë,N%çºg¬ [σ{zô°›¤sîêB‹ÿœ ¸}ÃäEèÿ¡‰>B¿ñ+œô2'}—£훀`šLS‚iB0ý27­8Óf&Ú7m™Hëš)%À\ZWûŒ¼I¾wëyæ}æJSãyæ*Iº@Æ~æý¦» õ7vY‹BVèFBý¾Bö.SHÉ Ñ»”¬’áSÌU ~•’áz|ŠÁª§dnå†vªÜ˜µŒD¹IÌZBDéÐ (ÞHJŸ¢tÚÃè¡ÏqèPûL&¡;ÛÝÝÔx6ØMhΖtÅÙîZÝ ñìëJöM%û¦RÏŸêV$~uÓ*ºñã@3D¿ß´5ÒœÑÜôT#aÿœùèÙÿÜÜ4˜Õ´³ñPîd¤/IytªRÞÎ@îð‡¿<éíþüõ —¦À¦z°¸­gõ¨¾«á^%=Ç<ØïNwFW½h©¡Æl«~FȪGµµÎK5öèŒ3:@qpêÕÎÝ4Ÿ¦ÔF@›Ô¬¢º¢:’¥A4+ Ðf5Ëùàê ÷|ZͲ:áíÚÃã;Â;nûOóÃã*¨£¦ipF†ÃûÔÎ9«1žÑÁY¦ŠÉÌjDÿϾ;• endstream endobj 37 0 obj 24777 endobj 38 0 obj << /Type /FontDescriptor /FontName /DAAAAA+Garamond-Italic /Flags 70 /FontBBox [ -216 -314 1128 993 ] /ItalicAngle -30 /Ascent 861 /Descent 263 /CapHeight 992 /StemV 80 /FontFile2 36 0 R >> endobj 39 0 obj << /Length 426 /Filter /FlateDecode >> stream xœ]“Án«0E÷Hüƒ—í¢OLH¥)M)‹¶O/혤HAYäï ÷Òêém@Çžæ˜q²Þmv¾éMò'´Õ^{sl|ôÒ^C¥æ §ÆÇ‘S7UÿƒxU粋£dÈßß.½žwþØšå2ŽŒIþ—>ÜÌݪnzÅ·PkhüÉÜ}¬÷\Ú_»îKÏê{“ÆQQ˜ZcÍ—²{-Ïj¤?ìê!¢éoCâ?!ï·NpÁ²·ª­õÒ••†ÒŸ4Ž–iZ˜åv[Ä‘úúÿ]—1ëp¬>Ë0FÛ!:Mç¶AÏ€ÁA!Ì s@NØ€œ9Ü™V„5à‰a¬¶æÎ°ásžœ-!Á¦ Ë“>9Ã&ŸG}rÈÙÉg OÆúäÜ¡cú84jéãШ¥ciúd³ôq8^KŸŒ9ôÉQZèãp¢B‡ÿ#“>½ }´…>:ú8œ›Ð'Ã/úÌVúäüè䃮eô‘Ô¢Q™|6ùgíg¦Æ±ÃMùêêÂ0ϸP˜ãq‚¯¿—®k;äMo’vØÕendstream endobj 40 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DAAAAA+Garamond-Italic /FirstChar 0 /LastChar 45 /Widths [ 750 406 427 406 406 291 218 354 302 270 218 427 625 291 218 250 531 322 406 229 250 416 531 500 322 822 625 729 718 781 500 333 572 760 427 770 708 583 635 625 218 343 687 500 802 562 ] /FontDescriptor 38 0 R /ToUnicode 39 0 R >> endobj 41 0 obj << /Length 42 0 R /Filter /FlateDecode /Length1 42080 >> stream xœÔ¼y@×½?zάš-£}AhG ! †}5`Œ1ÂÈÆxÃŽ ¼'NC¶:%nâ4Mâlµë¦M“Þ¶ÄÙHÚÛº½InÓÜ6î’½¹vïuÒ•[÷W7ݼsFà¤ï½ß{ïß§Ò™3GÃÑùnŸïr´êÀ6 Ó€Ò–=› ûzj]€ÿê¶ÜïúEn»€Ú Æ¶vìIl¼üM wïØ}dûõí–ÀàP×ĶÍ[5‹Oé¸é-täêH/|Àp³ˆÎ}{ö^,}½'Ð={vïݲ¹§¶CÀ-ÓèúW÷l>\&þ›àÖ :w]»y϶?Z5£ó¬µ…½ûöo;—xw¦¶øË¾§Ñùi4§E}ø¡DMŸ$E3¬‚ã¥J­µ:½Áh2[¬¶{©Ãér{¼¾2 X WTVE¢Õ±x¢&™ªM¯ªËÔ7d¥Æ¦æ–Ö¶öŽÎ®îžÕ½}ýkÀÿÏtQêïÀ‹ÿH-ð°ôÞÊß•¥PÿgË ÑjÑÊÿ›Üþþ½Ø\úß<þßgñ‰qþo‘èø.8 ‚ :j`T€pä@=Ï¢¾ ˜§A|Ì5ê»<(P†ú«@lDŸA3ø¨Ûˆ ÔÒ|¨UÖ€õà1ðø9œG¼›Á^pÝ㋨ï‡`ü Aý«@hÃàºç1ðÌÀ¿’Ó R  í`ïÁRÂI¼ Ü Œîžô™&0¶¡»ÞnŸçÀ!Àƒð!ûˆëˆ/‘ i öÒÓK×ú¶è¿¥äÏæ@}z˜DŸ¾œO€o‚ÿ‚ ¸†ÇàIø[Â@|@\&7’¤|T9Õ‰æªD÷p¡oD3ˆ¢9dA+è½ }×!tl@3Ý®´rÁap| Ýý¸ Üæ÷9ðUt| ÿ‚Vît¼~Þ¿¿ ` –ÀRè†u°öÃAx~~ ž…߆çà÷àoáà +QID‰Qb1EÜK æÀ÷ÁÀÁyð_à¿Á@3õÀ l€°ƒp=Ü·ÂkÐÚ‚·ÀÛà½ðAx>ßÀ3‡Â£I0è[؈ QOô›Ñ7Ù‰(u 1ƒŽ¯oï%}d€Œ‘µd Y §ÉÏ“_DÇ,ùùŸ ,è;Æ©£Ô ÔP?§.P¤i†ž¡ï@Ç"Ã2˜)æ(sšù5d“ /¸ œAßåŸ0P!îÄÃ`7ÑžD<›ÀŸ šX ß% ›¨_ Aüß@w/?#]ýÝÁ°`\¤?“`¢Õü#ü=†¿&-°‰Š0GÁЬ§‰}H'Ž¢×ïÐ3H6þ›øâ2‚#_O!î¿ÉúµKW–æ¤ H^»ÀçÕhvŸ×"Žž@œß‰¸õ[H‚Ü`T›®M%â±êh¤ª²"*üe>¯Çír:Jí%6«Ål2ô:­¨Q«”Ï)X†¦H‚ŠVoÛ˜kÖ?6Kù½•øÜ»ulþDÇØ¬ uµýó˜Yט<ÌõÏ#%4rûÿi¤T)] EWd*+\­^×ìZ¼®98²fµ?Ûâ͹fçåöj¹Mùå:q»Ñ'\­–‰×,sµÎ¶œ˜ikA÷{Rà›½ÍÛøÊ ð$/ ¦€Z³mÞ“°­Ê ¢­uÕ“P¨Ð¬f»¼-­³Þ<…Y²¬uóÖÙþ5í-%nw®²b6oñŽÏoÓ¬&,Íò¿™ešgYù߸vâ¯îp=YqnæøœÆÇÂÊ­Þ­›G‡gÉÍ9ü?´áÙvoËlûu—,•sð+ƒÃ³\óƒÃσ®¥é';§[Zrhä Ù:3s쟇WVt »Ñ|¼­Ç]x‚ÃòÜÐph‰ ûð(~•mÞVÜ3¶Ë5Ëy›¼3»Æl3³`àˆû¬­Kz~é"èjuÍ {ݳÙons‹ýI˜8òT§äêüç+•OŠÚâ>©Ö,7”ªO6¶]½&·äḅf½²ˆÏÈÛ‰ˆ?ëÚâB3öÎeµøe[-˜ÙR‹†¡G¢µÚ‰VflF\…—˜.½®™?Dbïüïÿ¹górS&þà&f„«Ì„®¯´gÃáÙPóÛŒˆ†fÖ Ÿ×TVœíöD×l7Z2Ð?Œ>”[AKîvcúÝ1'qt2;½f¸xîã%g çf‰1|åÜÊã:|ezåÊÕy£>-c ã¬Âõ©MúÖ‰U³Ðôÿpy[ñ:ŒVד]6Ó?ìß¶¬×HkHךèšÓkf×Pckàš5[·huéÈÔd~þÒ¥…K¨‰Zó¸k>™Ù+óâ•ù,ؘ߈ÿþ¯Ïùß‹ f2üô¬ŽÂI}ªÆcf4§œ°,žŠ™MñX*™J¢N“‘5XËx=þ€?P½–1ê ¬™5˜Ìø0¢n ôD!E÷Á«‡Èøùñ@ô±€¿&‘JúÊ)5§3kMF>ü{hxˆ×´ˆŽt¨ô % !M …’38 ÝwN¥¡¥fÔ©WÞy îs×TòjBíMéxŠ£(˜?á¬Þì²p”h vÝïІZR$D†™§¤RÊ ×98V XMTнpOÙŽÛº¼µ™&)–!³Šbœ"g¬¸é ¸¯ ¬Î~{œ`hef5b{ÇÒßÈ¿Ó „)ž“‚Ïw½êyµ›|Üóx÷órlçôNâí6X?‘MÄ&⣠^3¡{ÎsK%C¯s¼LlÏMlç;·ùØÌ|[ZÎÄöœ*‡Êaù¬“Bôè.çàqÏŽ=Ó4ŒÒÝOÑú}‘¾L+-ÒQÔu‚¦éçáµ`Bü‘Q=sI\@…K ;_$8"fº5‹g˜¦yÏcZÔRdª&•ÀÄC„ ÇDe æd‘îòc48¡ÉÌÕÂÐ_“Yˆ>Ž^Š4WC4ˆ5›Ð@'Ä,èîÀ„ÿ€N€O‘œÊ²›PÛ”‡’Õ„‘-Ml¼¾·‡"Òi'|]×_­0ÑjFIP4A™Ô[“Q÷¨N‰|/tⳂ‰¤K5½ÿro€£ÀZ›ÀÐ޾͗r‚ÙJ³*‚—ýÞý¡ÎÔi UOÔ¶§·\o¶U¨”¼“¡ŽátŒšl¿î:°º&kÖ: UmÜ~©MÃzHN ñ\± ¬Cz—>@X-‰Puø‰”h5Â7•o¨ß0¡Ù ×r”ŠŽVNJ¢ÎQ¤ Á6‰")Ê0­¨ui£ZIKkç BGUÛ8+´ µ#᪒æãAC­¡Ý0dØn  †z©¢¿b¬¢Pq¾‚†ïUb…«"ŠÎ©Š³Û¹ýÜûÜŸ8ŠÑ!9úÔe”·;N:HÇGñÃüäÔ|~ñ€6É‹óZs3ÀäÂä•|ú,Ï–üäÂ%ñÒ1õ /¾X“yHËâj6²$Ý 0 ‘0cRz=ˆ¬5‰d*¹,çh,+ }M¢(ä¤eqoOU”ƒpõ]פ[:X9ÓîémoÝ~À. e*‡òuý} ?Ä‚œ.¸6µ¿-Iˆ$åx¾ºþɲCúŽ”Õâáx D€La6@ÒV+ê¯Æ– ɇ©06źEoj‹Ç&>£×TÕñ4m±ù{ÌÎRH(yÆYÚåUQÐäj¨³WyÕ÷8}ÄP•ÀR˜Å ¨$üöÏÝy0ë·-~^UÃQ´!Q%žzøš=ÿ ~ϦçEH³…‹‰””¨ælV]<è- *8¿ XüíSû·>uóë½£7„ã›–~Åhiò㦥 YŠjì©Î•æžÇ Ï^6¼a  ¹Fî×,ds=$ÂÖ U÷¦RýÈ‚t!Å9¿%YI¥^Ù¢< ü´’Vîv¶GÛ‡Û·Ÿl§ÛŸ‡Aâ?Ä}ùù4^ÛK ˆ÷åÑÛžù¢9I#ÕƒõI‘ƒ#æ:^΢&T‹Õæ7'LÉ<'k™E‹K9³ â•Õáa&:%0öæ?1;~绎fÖFò™Ïu•T],ax ›øF`xG¾ÄÏRtÈÜè6ðP`üõëÛo½þå…çuÏÿøî¿ýË»ÔwN¶Zé“'Ãõ‹?}ýúo(7 žtÇÄ×Ó‰T•V(Lš´4 Ò-ÇÊL^‹WiÞöôè±ãß„};»2XWt.½O¾J&êã’KAXâ ZGV;¢v·—?0¾m$:Œ‡„qŽpIÂ9îGp½Y Kñ¹¡àkà2/"ò¿ûÆ"â"6çù…ÉùÉ|‹tQƒëX[Çc:£’寻ÊÒ©F+gêLïoÜpË·þ±ø·WŽ^;p¾ÐóÙÁÆcš>³éËðs-]ï-§Oÿ£±úÜ⟞9Ôûã ³gžýþ&ÍKï’¿¢[@ ò¿)ÕD“5­˜žS!Ï:†®'=dSÆ:Qúœ[hÚ¶ÓÄ»ÿ¤ÿmÿoüõ³ ?ô ™‘ûÏ\#­ª QñVˆTìëjÏX÷œ×AÝ­íÙõY";Bb¨?D¾ºº"5!g(ʆ&C¿1¡ZW42eW.åÅ÷*ZTkõ:ŒO29Y¹å±MÓêÌé|6Â0¸jÎ}2I=2K&sÌŒ¹IoÍ2aýV\B³I¿¬×ÂO¼! nf5ÄíãqŠbIÞТFöÛ}·K¯õ=|Kߣë"Žk}9DZõ%Ê}ëÀ¾Ó_¿©ë:âÒïÆl%ðJµ¶ .Þ¸Øû«vÎ VûvfŒÖ4í˜z$áiæÌAÕÂÝÍ?y2¿öì7x6(£Ö¥À—iò–³àœzÑñrê‡ ¤rÂõ.2!ßã4Æ>#‘ÒbºžNSRº?=†š”˜Ž¦O§ÉtºQZÖ›—.!C’?Z´)ó“ ;¹ -²“SSEZ¯LÚ05&õ ,¥F†‡H‰—[V”F=Éȵµd4è)‚AÙÊ$µ ÄÒwÆ}eµµee±AØHûúJ”¬’B@Ú¤ ¤õkKT÷8ì´@ë©q¯Eà,LýÈM:©Ø¢§TOŠM匚è`ÍâÅÅ×ÊJu‚‚¥<!B–V+#£6V­†¹V­Ò‰tåäÒEâ2j¦?ûsÿùÀOƒoWPß¼|)ü¦Šú¾òEÕ‹~ògÂϔĪ—Ô,GúÈ_P) *•RåW¨ª>´Ùª$p\DÎ0Dé‘*Áì1°Ï*!€W,=x— ®Ç#C8hNú“Éd[’J&Óâß9Ès;4Z ý¡±ÐtˆC…zÒ{ s†íÚqLü‹ÈFEI$úÅ"Á!ÛÖ,>7# ~ˆˆ€•FHk`BåeœŸÄo ¢Í§Ñó™†1 ÎcUáD `~L¢GÊ„”06v5‰€ß‡©ƒ¡ ›G„—åÅì 5Ä/Àc’w—éý»ÒµÁHdño••]7§Ú'Ë4¡âÔŽë3™.‡ã½mÑ ŸIÞx  ‘_ÜdOg«ËªSÉ-µµ-5&s|‹ ®ÝÜYWéõެ¾6Öz¸:¢0q†cV¥Ѩné÷ÔZZ €Ó’SÁvý²1·æ—ý#Ó#G.P##RBþÉxNÈ• qx)âÜ,“;s{qǤ¢ã`Ï|S tõEû¤¾±>ª¯o[ùAÇå:Äî>žÉoÛ ¾Ü+±°€¬âó„ ¯ÈøúÒ%¼’È*®Ýü•«~Õ¥ùy¼Æx5Ñ0(fª£æTÖL%ªˆÙ¶™Ñ‚Æ+¡ìG™±÷ÄÈK'hAe{WŠõBÜ©"æB0+)³ûKeq Cy ÁL°o†¥Œ•/xë iG-6Yz‰T©5UvuãÐ £%aŽU¬Z‰Ê‘¹³y¿ª7ê4’$SZûÝ}• mP)Z  RË ¢G©±ý¼ÉšQòY…qoµ]Áܽz¨®Gc´ZuÅ>’¿)è°Š6•­„¼ÈŸ´,#8Ã-.¥™…jΣ‰7,^úRLlÇZ†6GO°ÄÖ´d ‰Ü¼Våðâ3j£V0ªDVIjÕÆ.eK ÄWÉÍ  <.Ål‘j²5|.ƒÁ°fÂ%"}hè3 }h@G4,…ûäv…‰ãá‡ÃÄ/Â0sÑ 6bßêê.!(äeË)®n-O1 û*Úé‹!?mV«Ú<µ†¯¸QcìA'M4%î6¨Ù°–Sì ÕoO‘*V­ÔМJ‚ƒ;í Zá;+;aì_´Œªu•YäBuaÞêáL-ñð—_öð,Ï!¯ 4ÏðèÄkï[Zdä0¸%í‹•/6¿xˆ´¹WOQù½Õ¹FߪÆÜ*~07žËó0w;­éërÒ§ð¥†i^=áÒ|ÂdÙ¯vÍu]ÈáÝ»ÍÁFfúfNÌ‘úl=Q¿«9¿CÐ…°QÁö€­‘ÍÙÍÄæ]»Ü»Î ïºØ]}úˆBìÃW“Š£»ÌëœAŽÚgÔ{$E¿bLQPL+N(N+XŒ:\Š(êü¦bVÁrÌâ—nE¤阚¼‚äTDÒ,b-yi>H+·i+¬üUÚZ²èEüóï³ó¨»8°yK-;HX=bÄÑ ¬©è8ð„™|Põ ù¾(Ùeêêüt5ù^ç{]ïô’o™Þ1¿×üNõJó:Ôõj/õŠò‡úÉ÷”oëß5"õÔ lîkø³~â5ÿ?á÷WµOh¬NkÄJn²îµ~×JÞh}ͺd%5VhµÖ6lS}s„[òkÇÖ*Ö3~,t?‚T¡A *Ï$Ú×YÏœJ\Hš„” vûµÄ}¿öŒßˆŒKdj~rAŸ` _ÄS²ŽÈÎË1Ö|¾øŽ#mˆ5°rÀ<~€)8Y&sÀ²©/6üËñ•šÄ²(^-b,Ù Ëà3L<†ÌFV3r¼Á  ÈJÆâô[B>W¨sÆÚâuß½ÝL´7µfÊôŒ6l3éø½g‡%–"±ôëmþ%½ø;–l¾¯ÂUtV¬º]Åhü1³¦ÂÖÜëáTõÑÖsõa¥;pãHÒ³Ñæ°«XÎöÜgo•騩ýf±Tí6ü"é¾1QRe—ªÊ S)€K¿]ú ½ƒ4‚Ix·äŸÐMTÇÈ7__÷úÐëë_~{;óƒíoëß6¼]MétâØØøÆQýÜÒƒO‰ÛÇ]sKK‡£—~t´ˆ‰HíÚ‘‘±D­ ÷ÄöíQ0ˆ¢06>>&êPK7’'=¦úÏÂÑÑaüüv¸]èÏ5äZs®<çd˜Üµ9À8÷Eöe÷íÝGŒZ‰^ëöñ‚(ú µk5°qÞ,ˆÞlosïéÞs½t¡÷b/!öÂÞ9øuIwTõÝ¥±öXG/QÖ9X!Ùâ¹ÓþYÿ9?õüÓ¨qÞÑψtâÏ„ @ÝC¡ÎR)šzÄ‚Tè/ŒhP8Q …éÂåYˆä§&çóé46: yäÂÊh=ÕF1Z²ü–ÙîÈÏÉLöÊ$†ê´ŒÕUYÂÇnøäê ‡©_T Ç &ó$-à ¬3Ì2vO¦Ud1ÒbާÌŽÆÌE”GèMæÆÄÚY)„U1ËÅeû…Xd–#\è d¶à2‚­IᴠдyÒæYh{¶žwjwñ±¨Ó7ø¯×ðZF 4Þ&¯ ¤´×D¬¡ž’ÊROC™Y“5ô@Àˆ14Y]}ÊÚ€<*žUÚÇl¦Gãj–Uýë×u¼6lQAÒ =G[Œ<§¬ë{ò}à´iXã@¶ÀàX3tq«Sr&7ŸXüàS±Õ?hÛ\_av©¬‚æ°Z#VP1î®ÅÌQ›‹§RmŽ,~­— àpÀÉ ,Eh4FA‰¥Eò'tÜCR´­îìom-ìÞiؽ{gck똿Üà÷—·úË©TÙîýäÖ²\Ù^¸wï†Ô@n=¶?#[sy  >¤ˆRªH&às ÔæÌ˜ï¬®œMéVþTät„ÐèzzGâXV¡àTp½ß<êIëwqgpfpìò“`ð#%‰Ô%ùûýc¨‰´è¢“Y?Å?L¢¿U~¤ ³‚ÉrÀአ¢/]¹’‹‡ ¥‹È¨˜xšy}M²˜eÙºÉÐ!F¶„Ì4Å0^Âî‰G MrÊë§dÇoùª¨`T·èI Q“4ù’Ô›&ŽÝQö£W¿g *š¥xCp²4Ÿ&Í÷Øÿó?¼N ¡ËŸÈWÉë@ t€oKI¿=i'ìµ™ú†#µé&\z䲘aò”šÙ¶m;œ‡œo:åü‹“fÐÉJ#~¡ZÙ§’T.…å:©6áPg³}]â›ë2g„Îæ\ó\óš©æñ힃žcžû=ç=¿ò0ž[ÁÝžY„iá„0+\è¨ ý˜€»¡][@fËâ¥]M9ÔyÕÕÄÏê¨-–ìOÖ$Vôo 'qbfÆ({¦«Æ(.K`õËgñX|0VHlµhhIp4oífvwº•¬ ®ÓCþüÐOvì×k-é·iè-#÷ÝB°êPã‘þåÙ{³»>8–7(µ:݃ðIxíz³’Õ«Uñ*’É®­M½ýµ¸µZÁô7,¾Zf -W‚”,uZ¹øP¸ÏÿúÌW¾_Žõ,»È’“¤lÿ#•j¢ðg9(æÓö›Å"®²XHJÊ kç /ù;Õñ\­zsåŒ2·9G1==ü4BNX Å²%m×”9ˈ²9x“ôGSѶèîè( ¢0ú;1ž‡?ÍßË•‘?Ï3.¾Àíô4BÖx+Ū_¸—æÉ ¤Œ‚ŸJ••b¥Ô%vI#âˆÄ¼”|=ù~òÏIJ³j6F6öm$µ -¢Åšn•š´zn鯒ÅdN«í9·{4G2çbçcc—cTlI0ìiA½­EhX§q8‘æ;bÆøÀÅq!8Æçϼ†¦°çTÇéŽs¤«£Ð1ÝqB>a¢RGÇØr;Û9ÐWu`m8…åxr¾˜‡Ï/gâ'³óä?„Ãa9†ƒ¬y="jLN—ãlÎ9&1 W°†hr> ѳÎ:šJeŠ#˜|Âm(†!SQ“ˆÀŽžÜÝnÛ+¤HóºLçmD×.¯¨ mÖSë9Ç*Ëð‡Ÿ^ë6ÓP¥í®KíljFî:ÎFB1ÐZdHõŸ½µW˜®©¯ðWÝ›pšÏ„J¶bH˜;O^\s»HÒŒŠJKÚ«XC›ÐMC¥½½ßæmQ=[&*¹¬J«ª±‹*-Í %­]ú‘'²`«¤ŒUGÉø(Â8Ú'À,•L,s— º\%[‚ÏWPA•ª‘\°–Õ™ÎT$“’T ÓDEE1+‘ŸÔaü2ƒtù8Pä‡çlAWp°:!+»MEOšõj¤$IÃr- Ö•,Ö•U°&À+¨E­X³NŠÐÓ¶ÎHØ$íC«uH[–ضS‡exïhã:  í€B4~[«EiÉ_ÀM×ãÒƒRe§ Âê¾oñ¯¯HÛ‘ÖŒ„33¿Ü´Û‘%C@W# õe†Úr´:Þ¥ Ý` ÌK¡çmÏw¾j{µ“z¸óqÛãäŒm¦óaùªðýrbl|zœx¿ûÃn‚é†f\_RÓmÞÐQ1­NM$F«ÁD~thBÊlPM¸ÔÈ´éútDò”êØŽm;‡÷;H[# Hg*öœòà ²#S'Eèá]º»ô½gÀž× þ?U¡l.V¡L^ZÈÌ\‡ò Ûe‰ˆÛü•ùÈÇ•)“y, {Ër¼£Ì1.¬)NK¡y%S瀥ÐPtSLf9NÆ2Åp ¾.ƒÉÄû˱23ç °Õó˜0 $üVwÖŠøZ,éì ¤*Å̧ªƒ^„ñŒc"£¿õæŽz†-©.5‰rŽ=‘Xß<ÁÈVD³¼…;ßê6X B–°ÙxƒÎ.ø ®ÊÕ0bhÒ)”•iA1|èÉû™–Š6½J¥Ò)x DšÒÈðJŠP(-"k¬z.ÑSuu]]ÔóÞ×"Ò :‚ÖHBÅâš5ÕÂer–L Œ²ìKÒúG‡ßøVù@Ã}C_é#™‘ãã3[Žo¥h‚­ã/«½¿ö±Z²¶VªzÍ{ÁKxÏû·ÚGïB^ë+Ù‡# Ú9þþ-þ×üßx:ʯqUÁóU°j>$¥×ŽhÙdžŸ&‡G$MÐÚ Q¾¿sâLKË.úœë¼‹p¹F Ìd®y¥ö¨ ÍÁw%Ëk:‰ÎÃ?PÃ×ÔP­Nî§áÒ¸öL.@›\˜”ë&çã8DŽ 9N"?‹U xh:/ 2âyP~AV“XKæi¿\‚©,;™Å|HÃ\að¿y–Cm´ƒ(v,—³E%[„=$®ººÌ· rû¦¯½x÷éotöªÌ–Ü]¿ïðºMãî wlyiƒ+UéªûªÿšÁÆ&¦¤:ZjÍ!§ýÒ§Ÿ×óA+Ik9CD½ÄP{ûÉ~Xe6 qµj2³ff¨w´2p@ÒÍ#Gên»ý3wÝþŸµe$\Ùr%G©:j{;žX½t¼‘öFðæY½V;ÍÒÑd!™¬1×À\ Ljõ5TÃoÈ]¶58ªÎ.ˆ@Àv\€Â¾òDÿ}6.©­ÑS15U¯TÀÐA¯×É)à?ÐgÞÏr/.óŒ™ ‡y¿¥©ë«ûnÝkuT]3ö-`ê7™¦M§MtÔ~ì¹»œßu^p’ÎÈ$¦ªLö|÷ÀðÑœœ/Æ!=ů:ó2ùóÅTšNyàLd~òj.²м•t#–èe"Ë,±\¢´Ì EÒø˜KÈEù¸vêsñøOOÏ´íýöCÇŽvº5‚%”À „°cûM}·u§Ó‹_M †œ¿x~{W’úiŸK‹q|zz]c2¹{íΙu×|{SØæB¾ÜÁžˆ‚Ué®ß¼¹é†º5ÍÍO•7w¯Z}Ç÷Ì:Œe{—~IºÈ(pƒÏ?%y¡ –­JâÊàsÏäOlSP浸v¸îÀ.ªèm·¯·o·¿i§ì¸&$.‰ý☸Oü´xŸx^då&œ.ˆ”xç9pꃺ¬€’â°â}„±>òK'äp’¼¢HëÀ² —°®-3¯ÈÄ'CËËÕ›r鄽'wžÞ|à{Ÿ;ÞYrÇ2e™²\ÝÀW ½Gžk\Ûtà“¯l‰Ú+\¡içÄ#gÎÅqýBÛÂr\ìz?ø’äxy|'ŽžovÉÌ}™—3dSe†lí+Ë9Í9öNýNõ³}/÷}ÛªyNú²NØh©e½GÂëšKöP™fÙöû›ÏœGkuk[7ìï¯ß­y­æB é¬ÉÖäkÆk¦j¦k~]ÃÖD–ëFæ´È¯Èð ÛÌk¸ÒkÙB6'? ãfV5J¬Ä[—ãˆñ¼eÅ<ÍJšçãÒ‘ør‰ðvbeå°r!{ËœlÈSG/"Ã>µIÏA+³øþªVŠºÕ2BŒÌŒç¾»ç³k¶wzU õ}Y‘­¸nèÄêº5u7“«}o,þÇWI°qÿmGu!g1 ‡–Ã¥(Üaž¦¹š³¥¾óÀÖ”ýöÎoþÑo´ »-º—¿Óè¡‘éÜ}›Ð:^úoؾ Pö4ù(Ç#ÿß&©1ºù,Ø*¥¶X' peQê%‡áUõáPÃšŠ¦†HDjDÃÈÈ'©%PòGäªsµ S΂Ýa›3gÇ­°®l!;%íÇãÇË7XŽƒã"ãb¢ )2'˜Ó 9Ƙi†d˜lÃÕŠz’½Ýq˜ Í£X}‡è¯hÚeE§c©O‰ôFf¥ŽLFƈـ7l2?P)¹žŽ¡Ø²/ 8¹íO†È&£Šá‘ÜB‰³ÊV«!7„­ÒÌïô.Žàk>Øyí‘öÞÑò„Î’mS«ô*ceQM3O+uÕ7-6Ï®uJ$Ô*NAâý'ˆï=K¯“/Ñ­ ÚÁ¤ò÷2P“õ‘©ú­ÒÃ!Û†_þb Yœ§.ò9¤¶º¿P2·tY #å4Rù|ª&„¶B«†WÍ­úÁ*jÕøö’ƒ%ÇJî/9_òA Sr«ËAäDh¶XRM‡ðÉÅÐå—S¹BÑZ¹Äq “¡ÈJ9Ž+ dv)[¼ð¸¢ª<¯ +ªÂ ‹ý›uÞ’ÌÛ´2pÎë‹ü7µr]ðÕ’PHã@0¶ØYÁA ¿j’?\¶²WãÎÅžëY Ü b@Õ™×lí¯3ÕžñÙ-ÎðÎh©L-ävºRxýÉSOß:Öàxme;õš×éP¤ߨ´kˆ.uR&ËOljÝÚº e6ßÛóNhǰOèÉ|£$üþ¯=þÐ9§Þõòï‚ %a¬‘†·‚Ï+xîQ éä;Ÿ=˜C&ˆ”K¯¤=a:c"€©€¬Ù ÓEŒÙaI[Ð@—&ª‘4ýš1ͬ†ÑËiqDl ¶y-Z$}jÙá.B‰b¡‡ E¡R¹³Ý`جá5¼>î)ôŸY|ØÉбkBv£ÑÈP¢QÑz ×ß9Œç™\ú;YJŽƒVðeÉÝ×9{4‘(@Î!Ç)aKBª‡§ëa}}Èdj*ÅNlS´B9bM£-|´*›à*LÇÁÒ·;,Ö ËaËí–“Æb©€Mu³YPÑ'Ÿ¨8_ÁTT´ŸBJ*"£3„ËŠø ²Úšé0:»„Ä1ÆnU1ï©CÝ8¤q,,z'Íry Tø½ÿŠ\²þ@±–œYÉ`]õ¼Ì’1sÜ´\z‡Æ–y=Ix(Ú¯Ú:Rº‘S–wX[é¶•ë8ƒ@S¥¼»ÄG@Zg½Ã]ùlTßKæ?– U ­mÖ)JÖÈ©Î4èHã§¶«÷ítN3È­%µJ[¹O§„œ°Î»·QÅ”jŒœšà(A¡åB½[ü!ƒ›$š¿³_ ñºÛ—–È»H#8OI¹îõ;&Ö’­Öæá-ë·íýk~uõ;–·Óï®~·ÿI&e³XÒk “SSý©¡¡¤­°wo‰eª¿¿¶ÒiKIrhhlo‰õö§÷MY’% éÌu`=Ù”ÉI¸R¢‰¿&7;¶äs›Ñûs[øX.èÊùðÅ r4¾¨Ðå”X«>¨`v&$?“<™¤’%NRãqz6y^ðPœz^:\aꇖtgz8ýBšJ÷k:œDÇû #fü™hf:s"s:s.s1ÃõgÆ3û3·¡Ž ™2ìëÕ™²¨9¡!5/Ä᡽`“~Sÿ¦í›núô¦û6}eÓ_6qÌ&¸é¥¿î‚ý»ÆvvMï¢Ä]'v»"Å*3Ì0‘…âÛT1d6™?*c>tYÜ#ÁâüÇÍes,³Ôlj,µøbF~aÕ²nÂí—7.èqô¿.Wa¯DÃd%ƒeËŽb#_^±²'ˆNe癉£˹¯«õˆ¸ K®õ–ÝÊH1¶ê D}Ù©µ½‚·°”¦S¯°m,óµ)Ho ‡M»íU*B4'ãþ²;ïÞZ™ˆAJ÷(?Tb5{H.nRÝ^Š—ê<–U‘$VwŽ®å•6ŠP›'žºíN†Kʉy§Â;ÕÈ·$XVˆÎ“Ÿj7˜¼RÁ#ÝH2<­ (…Ó;÷챨C¥äX%4§ƒ¤x­ 2i­®4K8dºh˨(šP³*–`‡®œ~‚a8ä³Ã¥+Ko?%m`5ø‰×ÕÛ;»Yç æ–>#•ÛZš]--›Ñ`³ë››ÇlÔr;lõº¥;™ó碌*Çbö$ºå¢*©Œ`šÏ·ÀáTli¶ÙV;ê5Á¾àŽà¡à]Á¿™HðÆ ÄVH—$Hˆ‰þÄXât‚>‘€‰9ø¤d3vaZ8-¢à —…×…÷F˜ƒw<#­ž^M¬ÆîÄÔd1m*sŽË³¤89Z —_å©#¯alËò¤É“kPqõÅÇIO\€UŒô,GÞä„UË4®â †%½þ$å2taïÚº=]0«šÑêºã,O°[›Ó&I'’%.ve E8¨¬<åB#œJvÈ qiJ‚ê!§êy*i:À6Èàý0àx† MóFZùË“]_x"ڮ敥TS¬‚VˆžC`*Da´²õS%®Å-¶/Â/]gp!߀Xú#ô: ¶"MFH­Ã»ß0ÿf j†¹áF²«ãж}“LwÓÎkv_KïÍîíÎNÚM;ú㸛»÷º»÷î5îÈV±µ¿•lm1’dnLNb䆿ß#Q¼!¥+jsÕž\õP…Â`4‘~Å^ËÞà^rç=Ç­ö ½ÆÞa¶¶ÙÎÚ³›ŸIœJ¼šx7A#:Çž9áÿW?L«d>Ö}7ÑÍ• n$¿26]ãp@ˆ(UDÉÙØ†õs„M2åïï¼ D¤Ùêüt ôEâ’\Ù‡=`¬"á0¶>“yñÊÇ{âŠ~@>¬_öæä:[\ä°¼1YÜìS´*ØÇÃn"æ£þjÒd.¦Ød& ¤®ÆïI9>/ƒÁ íé-טڟhÎ=ò¶_¼h«ÔS«Öx}ŸíèiðÞrÉèP©[*{Oô÷ÞSaõèÔ“†’ÚÿˆÕ.¦ø¤!jem*‚ä5ͱ$a³rœºœsË›ž~AÛ¡w¼Ë ‚8F$àw€tHUÈ^°z(Ô£Zz”_ÓŽòz``×)~Õo3 Ó†Ó†Y#ú È›šÊ/\Âa¼È¼à—°àé0".&«œ°()EñJ ¨{?=o÷ ~¯/ʇtÖ"|ù³×G“$„B©Ïh'é‡'ipƒ5Ï‘nq‡ò‚„àxµÄŸs“€t“Ä‚ïnÉ¥Ø+Ú\¶¨M²õÛNÛfmlÁ6m;çmôy´ÉÐdá#gBXÏt%¢TtKЏt¥´n¹"+ï¡ mpP£1°lc¯n­YUQWUWÙ×Ò-§â”eûª¬Zdâî`6ÞܘJ‡Ýf<óíhæÇi30ƒMg¡ð¤Ý9aQG2{xÖÕj]&œ*¨O¨Ï«II]PO£æiõ¬úêPˆj—:ª–Ôýê1ÔŪqDã£t^\@>úÂ%..DKX‰y{YÏÇ>s -uÔ¢(fmk¹¿gÏÒ_åÌ´ZlNƒ¬vùŒÞ]‡_Dsµ-ý„þÍ€Ñð+ñ7« Ð2£½K7Ý2ÝÓæÍ–ZþÜBv²-3-¤­þ\ûõ°Eϲ7¬m1¬]ÛòÛµp­nKäâXâ«|¹0t±Š!;DA¢…ÛÛ…/n•A®¤Ü¦0è[š©¬Åys.Áç²û-ìåæ8Þ»•²ýÙ±ìtö|öb–Ñ {¾™ýꡳ8°vðÀÆû‡n>Žï:~î<A²žÆµÙiqá‚KóŘÏ|1¸X´Ù+—Ä«X™“e° ¦&ᔜ|˜ÌëË Òð2 z“9å—SAr”1PÜÝ(†‹ÈsyGšQ7½b*—±=@<–5”@S±²{Å^È¡³p%šTC‡–À‡:ì§ ùüÏÒΓð¦ C,T«¸¿RTl‰Í¾Ö]µ9eÔb­ÅÇZ `*âýqT;s°{¾ÙvØHž…”wÓ(KC‘Ä-wníQsZ$ ÙR½gëF￞ú÷(ÞJNø¯{×WÿX%Þ¡Èl —ÿ¼ô‹õ×êTjdµ¨V¨ÊÉ’¬ °•,¾xw蕟t_K^mØ’r°G_ˆíjvè=ÿ¶øøâ3¡€‚Ó1¤Ÿ&pñ±CÉr«n½­áË·Cûwn*Qã8Ihá}XGëTƒ³R•cÂ%8KœÄ«Îw¿sþÃI9¿Çi|}>"yÊ5>øšï‚ï¾%åc£ojRi *?cüx;SÃñÖóèϨRÅ4N§“xÍyÁùçºáÑX0’±½3ž7^4^6²À(£FÒhŒÇV  &§‡{T›žÄeç'±?…xçê–¦)¼§ieG[ÜÒ´,)ÝòŽbµv̬×á팆ðOÇ}eq»!Pê)q2Bz4©Ò·°*â–:•ˆp>É’þör5G½àÇ‚åNSÍßvçÃ[÷­·V> ËÖÕ¨t „~w¯(Bjñó‹·¸Ï}}(#•)ð^˜A¼Ië@¬9ëÖ#ýr¤òÒ±ƒJ‹EUƒ—ñYÊ Ýþ/‘¨)é4ªYTQ•¤º ¢Tªdv9í’ÎË;[äâ9÷Ræ^Q‰õ8ǦO!d´Re°²› -i4\Ñ&#ñÆbªËVùx¼}’ þۤбêEýæÞ Ø'Â1Ζ ŠGïZ«Ôšô ˆR¿ûŒãÔ­‚gT*¶f”Úšnv5j|T§Çüs`é}Ø<%°€´Äñ’¬ø¨IkžëôrtSTA U.ùT=·«øád~JÞª#ïŸü'2~r—ÚlyE“ßZ]±Šn —×Õ‡cIâi¿Ô®Ú¥…w‹qÐn4K¿§ÿ“V;ZùOK¾gc/Ç„l©¢œ8YË÷½ÉB–¼¿ô±R¢tß[fhæ"é¤ Æ´WD/œ×êÍy¿¢¡¼»jÔšÓcd0òXäÍD`d·DÁap NË;Bñ.Ûü5æ±o=ŸÇˆ½á¿I9M†w„Å$iÓ+D¼ž*ÆH¬É¯G¨å 7Vïôîíï|åÑt©?ž‰Lõü×-·¿ãžâÙÁgŽ÷EƒÎã/6|£0‹­¿ñ ÄÛO½pCÔ]»u¢cížý·~c]ÓЪö†Ü7~º¨Žì¹ã=·ß¶íÔúLþk?î[ûÓeå};ÿIO Û’I:ÞAÚ,š-iÅjMGr•Ø$TørAÙw¬ ˜\o.G¤ í†õ†m††ç ÿn` Goo€ œÆýÇ-UØ:,ûSûR„˜º+u"µ”¢nLÁÔ|_Òµ÷j6 Ü{±ýr;QhŸn'Ú#rîYÞÜ1€I¾¸ZóÿB„Ãð“q4P|àå.¤ —•y¦Ì2hpBœ'P“rÂW"’©e\ üÕÁTœè I›Èºùª…äÀÓÿÅž'žé#) «×öÐèsÁŠ&æ Nx}”b!)ˆu…om¸+»ïv›—Dί±® ¡A´5¦´£dI ›ZÔ.^¾m¨vüë³tw©˜W@çÝ •ݤÖP$MCŸ^åœxm`âÅö-ûóƒ·PÛug+´ü×ÉUfª9¹þø7í*AÞŽ4F=ø™T}¡üBˆx$t!p!H>x$øH9i Ë!RÏéy½@ w,0„B›- h‘:¡Ÿ­âªB$[õmH¹„¾q–PjÑ©ÛMs!!@¡ÿfeSl;»‰ÝËÞÈ>Ì*X¶´$þìLϦ‰t:sD Õ÷H¾‚ï´ïœÊú6û>¾ßŠ¥®Òh©TJ•"Ïéa¼IyWy¾˜/Ì^úÿ¸ˆm~:²ìúaŸ‡SSSe‰³þ⎠]Íò¶™«%÷ËeqX0–ëAÌ1YcÓŒäÎû>z{ój¥Yg_{úâ'vfúÌ~#Å(š OxàGÇ?ZÛ¶ëJ\uüæh¹…摹C¦šaz¥BÞí_ü%„“»NÔU–®G¤Õª*_.üûÌž_þº§ã0ƒ¼ªŠíÉÓŠÒÕ•ˆÂÒß©¨¿Ë¿kÀ÷7Á¦¦N[YÎ-'Sôr çs6"•ë$Š1–ÒNEGGãAM“³)ÒÔ×´©‰njê+»?ºÜo<ÎE°ËS\,¤Â?¼c“Í[uÔ|Õ¤p|>PÜG :¼œ˜\5Xü9kD)OÄ—ë_–C¹8XëB+)@¶·«Z+ˆpM-kóÞ¡>|rØF[ê¸þ5nÈ/¨ÍþÙÞz]Ë×[Vµ”›i¥ÞåfØR g#v'£QYJ§Z Oý¶ág ^§TX§gpñCꌫP5‹Õ™ç³‹Ï,~Ðà@ÿ‘!̵>¿B´õú\ŸÝhÐ ‘wßÒ%rmA¸âIðûl0 @TP¾uïîÓGž¥hÛä¤ÇMz•àG4 4WÞ£P`Ïó°›tßsQ„@„câ qV|E¤ÄW%ó93qiðV¼S“ y\À€J]1D¾pIÞ‚¹÷iå:Àè|9µÊ¦d§,»E_s9;øxÈ×ÜÙoìßݸyËQKï݃‹ï¿û•¾°×æŽì8zî¦-]ý–XðºL¸°á>ò²î¢#Ÿ…}}oq>jõ=¾u?9uëãmÁ°#7ÔéÛƒ«HJ–©ã2:è›Á“ÒQ”4éƒÔ_RDê€k=\¿Þ†t4I<(A)ÇÞÜWz^îy£‡ìÉÙÐ*\ƹfQ³qÕn•FQª¹8°‡Œ;Œ‡”ºld\Fal5f¤£^Fã–`w~#âIÇñhFƒR@ïÁ•,ßÊÏåÓùÞ#…¡ˆÌçåývźò¼ƒÖ*ÿú¾feǤ¼yN‹Y'* —C/Ÿ¨ü©‡b„@êWWŽÜ¬ì¸bPŸÄ»íØÊ¿Uct%Z~ã»WÝðD߾ɟѻgÊJÿø?÷Þÿ×C3ÚÜŒ¹ä®k Á}±Ô[–´Æ×oX׉˲¿ßÒì\q÷=¼ñY–1O½é¤ Í3„µìÞ Ÿß¦(èNåîý M‚’f(›ÞüŠÆÜÌO@ÅK¯X•$\TòßÙZߦ-Õy>âpéøìBë×îO–ÞPÇš…²îu¿j@æ?µôkò1ÄÝ   ¼(íhkjk;V µµ  tÔfßR¾U}ÉT½®ã­ÊÊR@—ªtj‘R@Þb£Ø“H02’«™«!jî–sÂbÙ$ú\¾˜¯ ™Jš>˜õÉ¥÷²òA$ÁúÇ—ñû¥ùtQ%™cËR-f^ÄUÇxo¼¿D_jyjQ²ÔÈ)Z¹ìt¥ª†(R\d,ÓÉ\`¹ðÆ SËa'D׉ ­ñ´“¹Žû?ºûòø¦Žká™»k¿Ú,Ù²%Ù’,cÙ–,y¶±lŒÌŽY Æ+¶Á`lã…-!ì $@ÈÒ䕼Ф$Ä$iCÚ|MÓ¼ýýš¦éiIÞëKÒðµ)i^‹üÍ̽² $¯ï½ß¯ï3wΙ;Ë™3gÎÌœ9b mÉ]2#ߨœ=u–#ɹçtÚeËuŠÜta-‹³Ne“Ö,¯<·=ܪשY ¢A¨DŽy=/rÛ–Ni §ê8‘FëIf§‚F“/ÆO[Œœ#Ù½"‰ÎÝUß„e®Yc3!«™f÷²= x5Ó±´A!˜ò»²žŒ3D¼ðÒ¤Pêìé<ž-bc0—X([")€h—ætÓö$Ž³Û“T±B:)–¥0`™=dJ ÂОæDéÜŒÁéŒPµT5L}J±ÇÑDõ)k0–hCw ïá¸wûkoì´J1v´cŸs#Û‡#ó¨ø‘òí-oßõžâ=å/·üê.!E™²%官²qKÃ]œè=©y¿Ø+ö‰ëÅ~q@‡ŠúVõmì;Ò¯‹ö59xá s·àÊHw8Ü£c÷Elî¡A'Ø#î¡ö<|·¿kpp§Ûor»ýŽMCCX‡Íëv W‡fÓÝwï4&AÐ .4›]nvI²¿4V¼4iˆJ#·\t13ÞgN¦cõdŸyÉÜØâÅKÛã÷îŠÝ‹ƒgíüÑ®F]ƒ£j8¼²¡dÿÜýÑÁ¡t#wÄM î,wØ=Ë]ï^íÞä~Ä-¸Ý‘hKt8z=ÊD¢ÍÑõÑoG¯D¯F¹è(<Ñ z=Ø÷& ½@¸,P‚¿Ñº†5×'mdKØ*âù_¬JìC•‰‰CÏk×>û„AÅ5²¥Ý:~}J>…èûF!¾ñb˜yä8ö¯Ÿ8Ì0ÊḶÁÄ»‰b†â¢qÉMŽ“NBµÖá0¢%Lâ´S^ü$fSb®€è:é(Z:øòRk>éÉeé߃y‡Ö±°B- EÂ$Î|\Éë‚-iju€ÍJ6Ú†îŸÇò 1lц•F­˜\rÏü E;sc|ã[€P›^´…‡y¥÷±?ž>EÅ tz¸"MAó‚>¨£*œ‘ëÔ*,ëãoVJ– ®Îrólü­Œ™Ys,f-p ÏSïÀ6¨ž¢ÓëVÃ1U¤q8DõÍ\4÷Xñ¹–\onG#¹ry?ñèæ\˜ûv‘ëDZ<äD¼)n¿~3ün˜o!Ö{†ÃÇÃì·ÉZK’¶È%SÉ6 QÇnÄ·ÙÉ…öü€â»Ê­†<‡¬tД8ý [—D¢0UÁó'*¡( §É^dlõ•/ž™*ÐôÃëKW•m‹ÙÌ‚F›2[Å/I $ç¹Ñ2[Íš©UEsëN¼¿d^ÁÙÚu¬]gP1*¿r±}Qϳû³:<ÛÇf~kË7 Tš>I§Õ™<%i1nQûrwqeº9 Ò7öý¹sÆÑœ©x_hYü5¸‹Î*àkÎ<q_°=eTrOþi5T¿hÑm¶?eÉN{Ÿ}»}Ø~ÕÎÚGᦳ‹›ÆG)@QlW\W0@!¢Ez8WÑ;« —uñ‘B¦ø1±q“ì&6Ž hIùôÖÝx„¡rË˳}å¥k—huâ´ä,{v zÉôY­tFyvvY¹oJÙ_ߨ^¶ˆ"•ãÎBkÀ勆 Äv›wì#ö*âÄÏ€œTڹݻO9*c30k›976³¾™TVÌ…€sÖ˜ƒZ))•tJ¦nº…Gc'qÀ)ÉüI¤ú” ~ ê´Åë÷OßwÃìýû#M-MÇš^kºÔôiÓXïh 4QMŸh=û?ìk<ز쿪½®¥úð£-ݱ=œÓâg Í=IÓ_‚ÊÉê3qΆíeHïDñ[Ä‘Evo1æ3ú‚¢„vâȽ¨X^¡KF'ñÎË$+8!>ÀG,›8ÀO# œ&ü1@´VÀôJÖþê›^9‹ñ ¬P<®óI®F[2%ñ^˜‘[“)hÑÏqBR¹ßÀB«¦©½¯¸—R¨vùY†ÝšÁjû•Ï(¹6½ŽÍPT5¬(ݙ̠‹’[44TsÚ…eše…u›šl¥(Çô`šÒ4-Ø> X­Vº¬y¬EY¨d5ŠyVŽáTB’347?3rÀ¦K2² £>=cntQèQê+N[šªf1M†VJ¥òÕŸøVƒwH?wò‰T=Gk7¢º*M¢Ž¡ZŸRíV Ìl|î©üÕ÷V§i9ƒÎ¨AKgÔp¼ÚÀ³6ƒk¸’«;©¥qjƒ5ªÿ–˲/×,p:¥BÉâ@ˆªÑÈ‹ý–ú'$I壵ÉÚó  ¸JY-j’±jݯÎ%_6c¹×ã„EO•© Ggf®Æ"05µ"èW(À×!  a0©HØ#6kCú[ì-ܼ&þAzCCÏE Nù©Än´lIÁ5>üÈš‘œÒhñi ]0qØ—ùy6Z0:Žbm%„fÍ8½4uA±èɶzª#O®˜>§¬¦0¹;8EI C6w¶§,œï*‡SUF•1ùiZ^c CrgtÓ¨AéðS§5OeItk…Q¡åS­Â¦øß6W$/·¨s§™c¿¥·£Õ›xAdºmÇ{z¨g];V /!áAã=@ÌK@;Ø'ÀððoàÛ»ªÃ€ÂÆj+Šø}€ñútD÷¦:«kÔKÕjFí'&×'nã~"qz¼×i’0€ÚxµA¶âÅK‡ÚxfñšÙॷël-Uî’•Ïï®ÝµcîڷʲŽ@}궺šmÖ)Û¶-ÛV ©«jï{9â÷톋O¬“3Ÿ~~ãÈúW´‹'~a¬zÎ8öñØù f œ‡¯žGÆvŸu<÷¬stlwd¸ÿä1çs³yë‹Ï™^|ñ¹g;;×Îr˜fÍr:vlmÿfSÿæ“^ïÖê~SuuM·ëT¿ƒ{ö|Lc©ìXaElêÒBêë±±}T[¬¡¡¾6¶ti=õÜÒgÇ–žTàôŒãä±â~ØßŸ»ùcÜóOàÀð*p r`;ޏ~€k9Ї€Ëd`MWµw¡³÷¬Ã§Ì‚³t‹‹šõ.zmÑ¥EÜ¢Q¸ëÅËÍW›©fœ¹ÚübDY«VÒÊ!¹V?I±%¶õkÔc•×åÛ¦är)Öy© ÷î‘ü(o`cÿ §I’}¾9‹ê#髺»{O=ûlgMMÔåpy³<®S'O=sÒ­©™ÕÝß_M.¤¾¡}ã^­ß(ÞðF"0– ½E!bs²¦b{^:“HÍÄ7¶Ðb>„MFXŠƒ²ÌI¹ÌÁý4®dÉŸ8¤ jUøÂ?æÜ– ª¨ñ¾Ïä[Å!Ì‘ø*}€V÷´lN…ò’ tPEeÊg¯F¨­l,²î²Aª•W3œÀWIQ¤útaZ‘»¬Z/|+Ãèu×›Šwj*œÅùM ƒ¨Õ2â”Rã¼Nÿ ½&×l€¬RÐÝ]DAoŸ›™lš•¢çST)«øUîtÎ4¨h:µNh˜­š·lŽR3]ƺ É«QUµ Û' ¼F“Óß Íœ°ûN|mƒZÁsÊOcÓ¢72ËŠÊ¢eï–Ý(cË~4÷FVAIÁÌ‚¿0J•PY¬†ìY¯À(÷bøù™ü •Jòf€Ÿƒ ÁVP oDL}ùò/çÓb>óùµùÃùLþ(ü^D]km±n·[G¬¬Õ/™£?Á:î)"Vt—LÒ„1Úo6~â'O}ÈmÔŒŸÂ°’™w`,N AƹQ‹³NwÂÒjqü;ѽ «‘¿7¾öC¥Ÿ‹ÏyóCžõýäX[û£^û¦ѻܖ>A[œ>w~iuF³ùxÛÊDzÒPÌÝ.kŸÅTÍ›_6=#wºÑíT½=…ºu¾¹8þRüEß<úÊÙÇ»›¢õ+Ê·>”;72ð›o÷*âK¾|öëšfÄV¬(Ûz(w^EÿoFP8Ö^û+›Ž¤ñE`ø—ˆÍ•™¹5Xh  3 ƒ®’©´«.Ûæ€Ø,rÏ©ŠÕàCœ9Bv,/(,xþ Ô Ü9GÐÇ~Ô[b6ªÐUÖi Î Æ‚]ÁÍÁKÁ+A>ˆfH’.fÇÖ4ü²nè®p¼æ ^s@Ç(¼1+Àt8ýðâÆ²Ãþ…û Q@…?qFR{Ãz²ráÝõk×*Ê&áÙcr¿‘qRX [Þ(’ŒUc jOP2ÄÌcîLYƵ½4ê'ÞË™õ’³°Z$7®燒N$Þ7L\+C¢yɃFJ È½(Ïc"­t³¹¦E¿rvÍëéÆŒòms§.nƒpߨÆRÓòÝë¬K¥¡Bð6Nlªå£zïÅ"wÚ43›ªûÒŸè±ùÚõ<›¬J~<'{ã½}¡?hVªx•²tÕ­£­zÍÌŽ_l*Ï2(9NAQ{OBm¶BçÊø3Æ £Å¢TêÉqÍ(ÔcP¯)œV=wê|º õ•yó‘$óÓ¸žC®Ì‹„Î.».Ù2Ų×ò #X e£B´Zñ; Û®Öè¬J¯H—F.è.ëøâÈ5KXü­´ñÆxÛ—\%C‘ˆþ „}Iw(ræêܦ ~Ñ]Uê!ÓÂ]{ÍéUu•B5ÊxÄn,~߬Ž?ì~ìƒ/–é‡ò 6ǯoyuÅ`ü×mØT™ŒUb⪑eATF²¨Õ€ÊXí6@×n¾.娻î†xG9à¦nˆ7”‹ÜîÂÙ¢‹d QŒ—%t&X‹7M´øì„·HÇ*òÝ9¼wÂÚ~é^I£Þˆ—vˆ’Þ…»©û§2ØÒ¾‹E1, 9¨IÊ›ŸmK¦âwac“,Ͱ E±Hº£ l^ï”Öy…ö¾4MuﮦøiâV³onúÞüUÑ"¯¸z·6Ì1¬9xõÍ;qì@-œ¢‘\ûê4Z“¬¦( ëÒ>àêRO„ë™’›K™Ÿfr}™ð2¶©H\=»yí&Ù£û$ÆÍ¤½Å!OPÒé"ºžø^ ð±?ë•Õ¿PãÐ)¤ÇÍ.$® dÃ\/Ô‰fDNØ*MÌÔÄ7Cƒ*O·Ó)@H#ä(MåœÝ¢b~žMA¦ÇT5ÛÕa8Ö·øÞàû–Jnå… +ôASF¯Õlmf9<­vLþEõ¶úÎtA¯¢É­•¦±éæÏ ô¼`µ&)•£ðJD•jÊÊJ-)IÉRæáuW.Ť&¥h²’RS•®U¶(G”´C¹MI%T¾íœ˜™vaãŸÖ;š&Ë¢x·#¡ÆŒ~ü¤­ø`NÖ‰%.XÐXCXÂL€,ðÒ¢›wy±Q[—73a«¢¨ë­»ë'Í[f[Z-‚Eµ4»üž\E«WgõœS=5µ??OÌÕnn¦áþª©iäU¬Ê€„b®c]QWç™ÞDkŽ'¶§uNQ,mu]\‹v÷zt+d°Ùö´2–’Õöâ™ÉJ@ƒÁ±kt/«Gc9ªÀï"G*ÄŠ*Š °ù_3ÒSÅ©†ò*z9ØT@Q~PàõU kÖ‹°OxT vUùÆrª|‡Õú5ë+mÕ¸©{¨II#aß“,¶¹ŸT©"O æ•æaóˆù‚™ä˜¿ 0bn1Óæ·ÃOêl0`¶Q¢Íi Ø"6Fl°Âf«žž°ªÔ¿^2â,Ý™÷KWWŠ?–LÏœÑûý£ðê‹T•‰¢ª¤»Ó1¬±6BéîüÄ~”´.7AèÿU‡Ä4 O(Èb)îlu§ÿŸ¯?ùjI±gù¾”¢Ùï=ýì‹Â9P\’^Y;måö µ^ÔÕÎLË úçß3pè0µ­ÀáÛ[s÷[Ïl©îËuäÍ2g߷䉟çþ;ò\ûòò®ªî]9u^zRXг›3Ó²;×–w<8°õALÛ iLa×5pEÌàMN G"t-M]B´O‹hùN$B¬{Œ¹™h#O-²äæ–¦¡,²îòE¦–æe ÇßdUú'v!«Ýà?"YŠ ha7Û3Ì[;ÛMívô–±sZµiÚ´j{{5]ËIÖž‚9±|¼¡¤41°ÝdCí–Z[‚jç’i?¢­­ŽÖLË(É‹åíÍ£ÑôEì-…Ã…O^(|§ðz!÷R!,,ìio6w¢ñW‹†à( E’X7÷á{MÃÒ‡uÍ4š[šéææžu²~Þ«•.Îã+V’¬JÊ×d«íÆwª„„]6»Ê&‡hið[2¼t½a\”¬$LúU@lwH^¦ñœ¼“MJáÃ>a‚FÖmÕã_s Ê­^S ¥~ïò¡d Ÿ¬*IË0‹ZVeJ÷š-èR†¿™ÄPFÇ*^ÍÂWæÜ4¯³r³úÐÅ‹6…U©8eÊ‹ü8½ßdehžß1]PÓPãÞueªÏ8WYÍQŒ P©!Ô©Ô“ fäV-w§hô\ú"CfY )µÀñh¢.|vÅ7â¯÷2Dï‚ø[%©œÆ Vë‘Ä BË,š’u²2­¾¢7ጺ4 A2iìSöMÖŒV<‹Á/σÅc×Ïê“ËGÇþí¬)9Æ'…Kr8–³/çŸsÎÙÏ缕óVô½íèsÁp,+æ ðÅ  Æ’ì/S„ÈÅ[}/úûèQFÝ¥¢±Š\ˆˆ8“’ÐÃhDö ΚÌÄd š¨ó@eä*Òäqz"ž>·ÝsÉsÕÃzFáùs À~Ã~î<ü-X"Þ¸v,Ÿ}äšñ°Äˆõ„1á4ú$¥¸bYãÉ´|ë+µŸ0ɨñK0,ê{9%–¯Ì¸e³ÖDD“¬žü— ß)-+§(‹¢ÆãÉ]ÑšZp_ÙæwûkÏ«{äñãU§×פ:Y.Žfo86w~Ç÷·˜R‹3_‹ÿíáÕAŽãPÇyL"+¤¿´9ºÎ(Ö'›:3 Ž•SžÿÉ®¡ÿ¹Î¡æÈ ,W”R1ðÀÔº½;¿ÖøÌ '$›5†Áèïâêõ¨7§Žý3±˜ B[¤æJÖ¯³í£¯d_ñ]ɹ’Ë\Êúqö}ô¥ìK¾K9—r™\$部 dºAÔ™¹pÎ\¦›£;s£a:Ã~I >\+%çaÁKYjVÇ ˜M˜©~¢ ®%ÖI-Î&÷m‹íÁIS÷ h™¸ÙÍi¿¹,u0õH*šÚ…ÑÜ+d×鱈¯Ôúòéüüá›6ï:¼¹¡nÞ(|÷Ŷú:Xç_ÿÙ5‘œ/Ãlì,‘ì“6â?›Ø˜OXÅŒB@ ‚XpL’Ýâ05à)¢ŸBËêï’AúÄ-|–'|HÌcœ,dûÕøfTôS™²Ú»·°˜.žØÊ'Yâ-ÿqI ˜*hL\éÇ›NòLøª:µd4¬ÏS°†¼v#¯±f–¬´ª·jÔV¦;”›^?Μµ vt<´Ë©…T†:¯±Ø=|q oQZ®[˜¼©_j¸ùKVÙ1Õ±0F© j_µ–)9X•Y47=WE©Ó—9ÌHØà¡RåšiÐsj§é£§Yk¥v¨ôW›ŠÔšÓ(UœB‘¨gÕiLê¢)þ÷îáyÖÒÿ]ËA£U¡Â¨µ¼ Vj)J43¹¡æÇæÇ‘8«°²Û^^“^9Zh2«P2¥–UÒæhq+ŽQ¤™JŒñ½ñ›ñ±-ÉHæ¦XB©€Z->wÌû#+2ÿ£ïÒ÷ÄV¾ïì©íÙÞ3Òs¡çjÏõÞÙè¡zzùùŽÚ]p×®ƒxýéEü§<æÐÇløÍŽéÔAXº5vŠ=„iÑwpɆM«6´665 †öíÛ±aÏžG³CÎÐcvö£ÑÆAÄUÌxÕ©ð'ìâöI ¹PöK¿4E(ŒLKŸ£näádXÃ^–4så5g‘¼ä¤o!rèCLû£¿$IÇ¿‚˜Qžtߊ•÷sÌ’Q4›ˆà)_3G²Œdu[ÞåöAr}‹(´{¶òtLr&ÞÅzÙÄáAPÉë§´Z´øì†…jC,3MÃ*x­©´böÈî‡R, õ‹•,¥@3ŠJ¡òx’Ss‹’Ìñß%«ô¬J£×§ÔŠîg :]ŠF…Ö6*$;ò¢.%ÑΞUy¿QëÃåºÚ×·/®0ª4FE‰Iñ½'þÓ-Ó u:•¨ XšS›ÜÑø¦¿Â´N‘†,¯T,d)†CK šÚ©üê™E[*²E rZëúÚýøÓ…Úðˆ’x^ô|¿`;«Ð1©¥!šK\ß)&A:}ÉýS„•Žè¬ô$2PP*ñí`cЊIËâ à]$hmõßí·1‹N7§«ë_ÿ žkDTøD\ImaÓ@:’ÑŒ”Ñ€Ig¨*¿Sn|ÉmþÆ›×,áÄzW>_ÖŽÿòâ¨Ë)ùŠ‹¨•N•SåjXœÒµÔV&kÍ˪ú·%eDwU±i¶UִЮ—>=Ñ{ùßï ÉÚ@hÁ½lyeÑ^è>´r[E:†™ï1kÖFÒ Ëq­¢ªA†¦¨V–1±,ÃP4äý2<Xx0¢vñ€7PWQxRDZm„õ+#ÖLeJòÍO Ä6­¶—óXÍ È|ï¯?aü›A¿2 ß\ßhŽÄûñÐ!ØÅ|Ÿ~€üeVÄJÇšý¼ÈS<Åý^å©ã<äQye7ËbßD¬EøÖ#wˆ üõ2vôõñ}1,?:˜7˜Ã@œG¼ÀÀÓ<%‘\w€öAÅ|‰: jQ]U]WqNU¯ê˜êÛªÕÕe TÃ*ŠØý y WìáBõ!\¨Þ¥O~\?ëëã&ê›`¿Ç’ô§cï±÷°<šAŸŽ¬Vy÷UPӣѭV»ÉjµW––îôØMÝSµÚÙJ_IÌ P³féc5}i¥bze­·C»«ÇëYæ¹áaK=yßI‚HÓWðõªàâ+´Fk5‡5Ç5´M†g¨ñDá ß^S>FÁb19*ùäËï¹·˜üüŠl.Š0IN1’ÉF’_ äØf{B’mF|z)bbÓKyå;^z~áÂt¡ò™Œˆ£)Î*¤n7iÒ)œ7Gà§Π­6»ºj¶‚†Õk‹L³š–d%Å¿¸« M£Pi6Ή_LO_ébxæ3=KiNTB4 ÞùñcC/Ϭêîý¯rPÕ9”HÊUòÍ ‚F ”¶œ›â¿|r™@Á‚§©sÓ’-Å’{)?a>gë€ ­pÿùš RëD‘gvƒ^Ï1©iF“‰†)ÉIf3¥Õ( ^[õœ EÒ&S«™2¡•#5Ei;.° Tè°‰ ʬ¶¯H{,Yc=®3“´ %êMf5[DKÿ€~XO]ÖCQõzEÓf3°Ú"–ZK‹…¶XÒdSVVò[BdÓÅ~ôŽŠÂå•}x­,‘’¼c÷ô!Þ{@¼dkF%^¤'&]cˆÆ.dva^E»ŒØ¹ CÆ)ˆÛ›à‚úeõðÍeõõï|XKãgëbËâEKbKú¯uñ7à¡:øVý"<oÁ®>¾¦>ÞbWÄ»áCƒñèýìƒh$#6S¡‰¦Q ElŸy·Ž¾„×§ëÉêÔ™‡|çë½B]P³bûà±±1ɾ)óc*˜Ñ°âÀ¢’"jHÞFÁ‚T¨(,„¾ÂBÔ¿{'µù1õù<­…ÖÍf÷ b[Þ ªÕÉ;ëä/o"œÀI÷›<“`øë Û º]¡øÓA—« är…˜A/ q‡‚Þ`ÇâŸÑÅ?òK%?’ÿÝ3Ÿ7ëÊþ lù‘ñgµÇ`âÇÇßü€Ï@8@¡Èç>¸ùÁ¤ß%‡àÖ‹9ü+½ý1;]æãŸí¥N-æ| …Íb˜ßAaõÌvPJ禃:ªØº±§/€”F‰Ò[Q<ýH§ê@ zwч†~ÌÃy£ð(¼6QïŠË@ðz-(¢OƒTúÂØgìÚ±ÿ‹ÊȤ¶ƒ¹(® ¹NTV Ê;•ñzâ" ‰Eu@﹘÷"ó°!¿¹.´>Œq§Áí(ý2Î ¼¨î1ô>“7}ŒüåÜa0› ›ªû)å—)ߨ;(¼ ¹A¸,d#c£r“ØÀT6ò0öjÏhT’ݨ®Ÿ"¿ ág´÷4؃PçA‚võõ½‡)až`8÷ ÿ;áIÅÇÊï¨ÎiÜÚZ÷sñšþ’¡ÉØlê7O3¿’´+é´¥ØÊ[’-)mw¥žN;œö{©ýÇÛÎçGéþô×2ö»ºþâÞéY•YâÕyN Mù<{¥ï…œhÎ…¼oû£ì|OþÎü?ûCªÐÕUaV‘®¸·ä‰’3%7Ã3Ã}á‘©w•æ–.)][úO„ ƒ— †Ð¢€ü`*¢ƒ©Ôç€&±yTÞ8­¼>N7èM‚)4‹¾%Ã4âv—e˜Ai>’a¨ÁŸd˜Các2̃^Èã’\ºn 0æž"ÜI`Ž„?H`ž„%°@àçŒ52vÂïÊ0"¢G ¦Pÿ×Ê0è«I†”æ!f­>%à U†yðú_dXAæV;ó+V2EHò—`èTdX V+ŽÈ°FuQ—a-Xa–òTâv%eX…Û’T@`5 ¯&°–ÀRý±­BmÒ lHZC`Is7Í$Ÿ½N"á8™|+µÑFà3N#i.ØA`©n¹$ÍÏ1,HõüÀRžİZ 'íRã:‹²ºkU×`×–Žvg{ë`«seoßæþ®U«óz{z7÷u8—lîë]ÕßÚ·zsŽsî`»3É¢¹èQ˜ç¬ìîv’ÔÎþŽŽþ íyÖ´ö·®ëíiÚÙ5àluö·¶w¬kí_ëìíüêÜ7®îZ¹Ú¹®u³³­eºªk`°£Õ®«Ç¹²£°ùk†ú»Ú»Vvõö ä%JYÔ±j¨»µ<ãÜñòrTâ}iGÿúÔÌ aÿË•óA/èë@+èFPØ 5 ¬=à÷ÈMÄ-ƒÈïíèÙÚéÇèçéïЯ!wž~™þ¨]`rƒÈmA9´'I‹¿r‚•(§>°}‰S­F¡N0…áQxú –¨¥èG_õ¡t›A Ÿ‹ÒàüòAýá_K B‡B+Qíº‘?‘÷yë@~ò7Úä}i‰5¤5­¨½¤mÏ¡°.ò=®õ ‰kG)בtkQX/èüÕ}# éBxX`œÛfä·‘/qMW‘RI}%Üu¡ü1ÞpÆ¡ô¾qÚ~’¶ä†±k2€Úw{[‘|‡npø5Îý’ö;oûêöø¥¤>r©NDå†@àŽtÿcú¿^§Y(ÝJôÅt‚Ï!ÒÂ;qqg~Õ$~#©Ë*ô¾á¢“Ô£CA‚{\òj‰¯;Ñ—R:)¼ ½Èm•z­ùëÈhžøj€à`ˆŒÌ6‚³Ù(TJ3›ø=ò×~òArÒ¼5¾ùÝ„›l”KDuì ü ƒÐÎ*‚ÇDÿ縹µ?W*‘ú³Cî7©Î]rk¤’úHïn }6$· §$½º™Ôúö’¼·`q€”,QIΤüñ÷=$äN¼âÒ{I˜“”Ú!×u³Ì¥ÚåºÌ#ø"4%…$pZ@¸šSæ´·÷H”Ô·‡´e€ðTÜ L¥ë zú~ðmŒ¹¯¦„/ë}©.“ËÂq]è}%«¸× Añx­‘yC=R}ðwkH _†çÉã¾Ð˜„‰NÂu¾ŒŽ7’Ö¬–ñâ$c´œ~p};'ÍT]$‡[éSc/â*¸ÜUžù­r í2h%c®c<<žûdL¶ÞÂðø$_÷ž5@(¯•`¢‹àSâ¢Ýr}:ä™J*·mRýÝM¨tiíf‚‹°‰”ûmä‹ãqé«É{’¸ýèo#ùË“±<ÁKò¬C)púu¨?z¢4¸G:ÈÛh–k'¥ísÇ©ÿç¥Lí˜:!ͤ í¤eåÌG‚Ù.yŽÿ¯ô¹S¦Åžqž0Q.ž#ÛeY¼—ŒôÛåãœñÔý“èVjßàßÅ®Ý:’‚®zoÉo‚Nâ˜N™KON‰e„2‡Æqþ«ÇÛ#Õk2u'ä9 ÿëŠÅ} ýg-š Y¤íwöÆ0Î= ï y'Z³’ø’ÜØs[ôƒÛ×#‰œˆŒ0D¤縔Òj4Áþ+½ŸÈO“x¬n{cbŒ%ò»³%lI-$<àËWd‰k½ ×ÿ­ÚN`ùÎVÊsz›ü6¹FR{0MÏ¡ñÿJZ‚d¥b´†)FòH òè=€þœd4ÎAÏô—…B¦ Åh•‚%–b$µ+<žcTnãíí˜ÌœSd«,Ü>žúh•¿Þ@(®Kæ‰qÑÚé”Ã;ä¶9ÿ[³j"Î[}'fRÜ&'yΕ×â=èÙF°)Qé,áôŒÏCN4ƒâѲEŽéjµ\ÏÎñ9³˜P¬“Hnr2wÃí\FÚ9 Ï ÿbW;ŽÙ>µðÞ&NHl·ÙVy,Iœ‹g´ÄlŽs’$S‰/Mæd·|w;o˜(IZ×®$ëIúë©Ö!’7Û2þÅá ƒr˜„«~yÿ£±)Éé É¡C–Ûn—°ñ<õ'Yr–0)­ ÚenÐ+K¿'é»H &Å'jói%œlâ«v™ŠVÊ+©ÄWC„‡åÜ2®:~˜ï'sÐÀø¬ç”iµƒÌ}Ëä‘'…ý£ð×!ó‘ NÖNF D]·QÅ ¡ iÅâ— ’V—,í'èðÎö·Ê8è"-”°|+z'ñœVBi^yK%lA½ÿ|üÏW ?ÿÉ;–°„Ç/‹{ÿ¶o:nÙË$»™_‘g7™û'½3v&Ÿ™ÃÔ0åèF1­Dbl'­úª<*ÔOx$.õ«RM†iù,¯ê¿äß(å?ÓåuŒRSÎõ…‡×…˜y¦{ž3›BŽJ •CyQ¿:¨,ä‡ï¥ÜÄwŸ9“¥ŸiÇžó܉i޶sè8³t•c~xæú<ô–v&ÖŽ¼Ôˆ¹;ÅÑ4q\j»Ôwé}¥íJß•ôw(üj¹ƒJ¿8³Áá| Þ|I 9¾+Ï„…•gCŽg¥V‚ È]Fî:r ÑsD¡Á0¬Œx¡xÑy1r±öâö‹×/rNŒ\¼z‘u^„à}ñýÚ÷¯¾ý}›¾Tï:Fî0r *u°åPŠò+ňCO?r—ÉÛ6X™ §†Oœº|êú)œONENÕžj9ÅèCñ8Vp¢€ôÂ(ÀNX4²óÂN ìwvÓ`÷ñÝ—wÓbe2LG¥¥ lGOtðcà@Î\r kF®¹mÈ ð“HÊÑ:ŠÁëðÂë—_¿úúõ×ðzàu CÔ«ðCø3$8àš—ÚBŽ®ŽvGñ(4œm8‚}ýKÈ/yòP ꙫó!”Í¡“AÇɆ2GWCÐQ²¾á‡(FQ ¿øHCŠ£d”ʈ:2í^Gñ&”cI߉(Î*)2õ|I~(À ñU5|âø‰‘N\>Á¶œè;±ýÄð æDŠÇÖºílÀ%§¡Ý±¹b…®A×MÕtãbAi¸Ðp¹ájÃõvóº2´F\sµR ßCüê`€ž¾‡¨DƒÚö^¤%ZƒŠ Q%jœ §Ê©á¼Ÿ§x.ÛQ¬ãü\3·û6w…ãx?·€£ À9 ¬–Bàƒ½ˆËQì ýÄ ”£¸‚ꥎQ¯a > EƒÃ "3£pàÌÌ òÖIÞjÉ[%y’—"yÉK’<ƒäé%O-y*Éã$‰,Fþo»€Ü«È=‹ÜIäN ÷$rG{¹CÈ=ˆÜVä6!·¹>云ëB® ¹äêI¾k¤ìÛ%¯Eò’%Ï*y&ÉÓIžRòXÉ£#.ä_Eî r¿Dî5例ÜSÈm›Ô+ôŠáJ%< xDÃOgyú#~øûüð£üð#üð.~x;?¼’n懗ñn!Cp v!UH¬B’` ‚(hµ €àœ‘ +Áœ6çÈÅ.Tµ…ËGXW1Ìs–TYሑžCÍY\5R⛃zqÑH±oΈ¢¶¡þyÆPèµw‚%õ¨É8hmÄ0½þ<¢¢þ=lØÞs KòÝùÏ:ùΩÝ|ÑÜÚs¼ã¼£“Gas£ a4ü ~˜Yá´FžÓzK¸#Cø%…ÜždF×â*TVýó¨ŠM_!ùg)•պŖ«Jû¦‘&”¦[ï±½Ìø4Pùb#jWÕˆ9•[™[‰£Ð€ÁQZ¬“£¬÷”¦Û^†OËQ" Ö#|‚Ÿ Iz߃&/Ãp`Ðçkh’k848u3‡ˆ7480„Ò#o`g懂zÆêQÊ2cõHäþ–§«z„ÇV9 ÃU°68(áîùȉ-h~™q?z¸ª'—ˆ†èÿAý-d endstream endobj 42 0 obj 29894 endobj 43 0 obj << /Type /FontDescriptor /FontName /CAAAAA+Garamond /Flags 6 /FontBBox [ -138 -306 1062 987 ] /ItalicAngle 0 /Ascent 861 /Descent 263 /CapHeight 986 /StemV 80 /FontFile2 41 0 R >> endobj 44 0 obj << /Length 581 /Filter /FlateDecode >> stream xœ]”Ínâ@„ï–üsLžî B"$û£%ûÆXKÁ¶Œ9ðökWM¢Õ^°ÊÓÝS_7îÙö°;4õ`f?û¶<†Áœë¦êí½÷e0§p©›4±bªº>%åµèÒd6æ·!\͹5«Uš3û5܆þaž6U{ Ïxù£¯B_7óô{{ä«ã½ë>Â54ƒÉÒd½6U8O5¿Ý÷âÌ é/‡jŒ¨‡Ç˘øOÈû£ FøÂÒ[ÙVáÖeè‹æÒd•ek³Úï×išêÿÓEÌ:Ë?E?EÛ1:˼[OB æ ¥ðB2á6sŠ"gÎbAÁÒKŠ%Ä"WˆW˜Cly";æì Þ(¶§°“°sàÀ’gþ y¶äÉ`ɓÎ%ORKž®mäyƒˆ<¼‡<–Šikä©’GaT#º£äñ£’GÑ%Ðy<Æù Ì‘ÇãR¿xs‘¥]俞dzZü~ÐGÇÒ‘vÜ’“CCy„¥ã|Ðkyh'ò°ZäAß\äA5OA«> endobj 46 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 47 0 obj << /F1 35 0 R /F2 45 0 R /F3 40 0 R /F4 46 0 R >> endobj 48 0 obj << /Im19 19 0 R /Im10 10 0 R /Im3 3 0 R >> endobj 49 0 obj << /Font 47 0 R /XObject 48 0 R /ProcSet [ /PDF /ImageC /ImageI ] >> endobj 50 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 1 0 R >> endobj 51 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 4 0 R >> endobj 52 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 6 0 R >> endobj 53 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 8 0 R >> endobj 54 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 11 0 R >> endobj 55 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 13 0 R >> endobj 56 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 15 0 R >> endobj 57 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 17 0 R >> endobj 58 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 20 0 R >> endobj 59 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 22 0 R >> endobj 60 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 24 0 R >> endobj 61 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 26 0 R >> endobj 62 0 obj << /Type /Page /Parent 30 0 R /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Contents 28 0 R >> endobj 30 0 obj << /Type /Pages /Resources 49 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R ] /Count 13 >> endobj 63 0 obj << /Type /Catalog /Pages 30 0 R >> endobj 64 0 obj << /Author /Creator /Producer /CreationDate (D:20040421140903+02'00') >> endobj xref 0 65 0000000000 65535 f 0000000017 00000 n 0000002208 00000 n 0000002235 00000 n 0000050128 00000 n 0000054814 00000 n 0000054841 00000 n 0000060531 00000 n 0000060558 00000 n 0000065166 00000 n 0000065193 00000 n 0000069924 00000 n 0000075496 00000 n 0000075524 00000 n 0000080722 00000 n 0000080750 00000 n 0000086378 00000 n 0000086406 00000 n 0000089939 00000 n 0000089967 00000 n 0000107114 00000 n 0000111321 00000 n 0000111349 00000 n 0000117106 00000 n 0000117134 00000 n 0000123202 00000 n 0000123230 00000 n 0000128301 00000 n 0000128329 00000 n 0000132198 00000 n 0000200028 00000 n 0000132226 00000 n 0000139046 00000 n 0000139072 00000 n 0000139310 00000 n 0000139874 00000 n 0000140341 00000 n 0000165226 00000 n 0000165253 00000 n 0000165501 00000 n 0000166010 00000 n 0000166424 00000 n 0000196426 00000 n 0000196453 00000 n 0000196691 00000 n 0000197355 00000 n 0000197936 00000 n 0000198050 00000 n 0000198137 00000 n 0000198213 00000 n 0000198316 00000 n 0000198447 00000 n 0000198578 00000 n 0000198709 00000 n 0000198840 00000 n 0000198972 00000 n 0000199104 00000 n 0000199236 00000 n 0000199368 00000 n 0000199500 00000 n 0000199632 00000 n 0000199764 00000 n 0000199896 00000 n 0000200396 00000 n 0000200457 00000 n trailer << /Size 65 /Root 63 0 R /Info 64 0 R >> startxref 200744 %%EOF jgoodies-forms-1.6.0/docs/api/0000755000175000017500000000000012003555424014712 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/package-list0000644000175000017500000000030012003555424017172 0ustar tonytonycom.jgoodies.forms.builder com.jgoodies.forms.debug com.jgoodies.forms.extras com.jgoodies.forms.factories com.jgoodies.forms.internal com.jgoodies.forms.layout com.jgoodies.forms.util jgoodies-forms-1.6.0/docs/api/resources/0000755000175000017500000000000012003555424016724 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/resources/inherit.gif0000644000175000017500000000007112003555424021053 0ustar tonytonyGIF89a€ÿÿÿ,„ ¡½®DršjñÔ;߀Q@–¦…N;jgoodies-forms-1.6.0/docs/api/allclasses-noframe.html0000644000175000017500000001472012003555424021357 0ustar tonytony All Classes (JGoodies Forms 1.6 API) All Classes
AbstractBuilder
AbstractButtonPanelBuilder
AbstractFormBuilder
AbstractUnitConverter
Borders
Borders.EmptyBorder
BoundedSize
ButtonBarBuilder
ButtonBarBuilder2
ButtonStackBuilder
CC
CellConstraints
CellConstraints.Alignment
ColumnSpec
ComponentFactory
ConstantSize
ConstantSize.Unit
DefaultComponentFactory
DefaultFormBuilder
DefaultUnitConverter
FocusTraversalUtilsAccessor
FormDebugPanel
FormDebugUtils
FormLayout
FormLayout.LayoutInfo
FormLayout.Measure
FormLayoutUtils
FormLayoutUtils.ConstraintIterator
Forms
FormSpec
FormSpec.DefaultAlignment
FormSpecParser
FormSpecParser.FormLayoutParseException
FormSpecs
FormUtils
I15dPanelBuilder
LayoutMap
LayoutStyle
ListViewBuilder
MacLayoutStyle
PanelBuilder
PrototypeSize
RowSpec
Size
Sizes
UnitConverter
jgoodies-forms-1.6.0/docs/api/index-all.html0000644000175000017500000105562512003555424017473 0ustar tonytony Index (JGoodies Forms 1.6 API)
A B C D E F G H I L M N O P R S T U V X Z

A

abbreviation() - Method in class com.jgoodies.forms.layout.CellConstraints.Alignment
Returns the first character of this Alignment's name.
abbreviation() - Method in class com.jgoodies.forms.layout.ConstantSize.Unit
Returns the first character of this Unit's name.
abbreviation() - Method in class com.jgoodies.forms.layout.FormSpec.DefaultAlignment
Returns the first character of this Alignment's name.
AbstractBuilder - Class in com.jgoodies.forms.builder
An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.
AbstractBuilder(FormLayout, Container) - Constructor for class com.jgoodies.forms.builder.AbstractBuilder
Constructs an AbstractBuilder for the given FormLayout and layout container.
AbstractButtonPanelBuilder - Class in com.jgoodies.forms.builder
The abstract superclass for ButtonBarBuilder.
AbstractButtonPanelBuilder(FormLayout, JPanel) - Constructor for class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Constructs an AbstractButtonPanelBuilder for the given FormLayout and layout container.
AbstractFormBuilder - Class in com.jgoodies.forms.builder
An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.
AbstractFormBuilder(FormLayout, Container) - Constructor for class com.jgoodies.forms.builder.AbstractFormBuilder
Constructs an AbstractFormBuilder for the given FormLayout and layout container.
AbstractUnitConverter - Class in com.jgoodies.forms.util
An abstract implementation of the UnitConverter interface that minimizes the effort required to convert font-dependent sizes to pixels.
AbstractUnitConverter() - Constructor for class com.jgoodies.forms.util.AbstractUnitConverter
 
add(Component) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Adds a component to the container using the default cell constraints.
add(Component, CellConstraints) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Adds a component to the panel using the given cell constraints.
add(Component, String) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Adds a component to the panel using the given encoded cell constraints.
add(Component) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Adds a component to the container using the default cell constraints.
add(JLabel, CellConstraints, Component, CellConstraints) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a label and component to the panel using the given cell constraints.
add(Component, CellConstraints) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a component to the panel using the given cell constraints.
addButton(JComponent) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
 
addButton(JComponent...) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Adds one or many sequences of related buttons.
addButton(Action...) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.
addButton(JComponent) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
Adds a button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
addButton(JComponent...) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
 
addButton(Action...) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
 
addButton(JComponent) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Adds a command button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
addButton(JComponent...) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Adds a sequence of related button components.
addButton(Action) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Adds a JButton for the given Action that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
addButton(Action...) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated.  
addButton(JComponent) - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
Adds a button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
addButton(JComponent...) - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
 
addButton(Action...) - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
 
addFixed(JComponent) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
Adds a fixed size component with narrow margin.
addFixed(JComponent) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Adds a fixed size component with narrow margin.
addFixed(JComponent) - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
Adds a fixed size component.
addGlue() - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
Adds a glue that will be given the extra space, if this button bar is larger than its preferred size.
addGlue() - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Adds a glue that will be given the extra space, if this button bar is larger than its preferred size.
addGlue() - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
Adds a glue that will be given the extra space, if this box is larger than its preferred size.
addGroupedColumn(int) - Method in class com.jgoodies.forms.layout.FormLayout
Adds the specified column index to the last column group.
addGroupedRow(int) - Method in class com.jgoodies.forms.layout.FormLayout
Adds the specified row index to the last row group.
addGrowing(JComponent) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
Adds a component that grows if the container grows.
addGrowing(JComponent) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Adds a button or other component that grows if the container grows.
addGrowing(JComponent...) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Adds a sequence of related growing buttons where each is separated by a default gap.
addI15dLabel(String, CellConstraints) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds an internationalized (i15d) textual label to the form using the specified constraints.
addI15dLabel(String, String) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds an internationalized (i15d) textual label to the form using the specified constraints.
addI15dLabel(String, CellConstraints, Component, CellConstraints) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds an internationalized (i15d) label and component to the panel using the given cell constraints.
addI15dROLabel(String, CellConstraints) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds an internationalized (i15d) textual label to the form using the specified constraints that is intended to label a read-only component.
addI15dROLabel(String, String) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds an internationalized (i15d) textual label to the form using the specified constraints that is intended to label a read-only component.
addI15dROLabel(String, CellConstraints, Component, CellConstraints) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds an internationalized (i15d) label and component to the panel using the given cell constraints.
addI15dSeparator(String, CellConstraints) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds an internationalized (i15d) titled separator to the form using the specified constraints.
addI15dSeparator(String, String) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds an internationalized (i15d) titled separator to the form using the specified constraints.
addI15dTitle(String, CellConstraints) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds a title to the form using the specified constraints.
addI15dTitle(String, String) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Adds a title to the form using the specified constraints.
addLabel(String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a textual label to the form using the default constraints.
addLabel(String, CellConstraints) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a textual label to the form using the specified constraints.
addLabel(String, String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a textual label to the form using the specified constraints.
addLabel(String, CellConstraints, Component, CellConstraints) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a label and component to the panel using the given cell constraints.
addLayoutComponent(String, Component) - Method in class com.jgoodies.forms.layout.FormLayout
Throws an UnsupportedOperationException.
addLayoutComponent(Component, Object) - Method in class com.jgoodies.forms.layout.FormLayout
Adds the specified component to the layout, using the specified constraints object.
addRelatedGap() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Adds the standard gap for related components.
addRelatedGap() - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
Adds the standard horizontal gap for related components.
addRelatedGap() - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated.  
addRelatedGap() - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
 
addROLabel(String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a textual label intended for labeling read-only components to the form using the default constraints.
addROLabel(String, CellConstraints) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a textual label intended for labeling read-only components to the form using the specified constraints.
addROLabel(String, String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a textual label intended for labeling read-only components to the form using the specified constraints.
addROLabel(String, CellConstraints, Component, CellConstraints) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a label and component to the panel using the given cell constraints.
addSeparator(String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a titled separator to the form that spans all columns.
addSeparator(String, CellConstraints) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a titled separator to the form using the specified constraints.
addSeparator(String, String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a titled separator to the form using the specified constraints.
addSeparator(String, int) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a titled separator to the form that spans the specified columns.
addStrut(ConstantSize) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
Adds a horizontal strut of the specified width.
addStrut(ConstantSize) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Adds a horizontal strut of the specified width.
addStrut(ConstantSize) - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
Adds a strut of a specified size.
addTitle(String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a title label to the form using the default constraints.
addTitle(String, CellConstraints) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a title label to the form using the specified constraints.
addTitle(String, String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Adds a title label to the form using the specified constraints.
addUnrelatedGap() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Adds the standard gap for unrelated components.
addUnrelatedGap() - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
Adds the standard horizontal gap for unrelated components.
addUnrelatedGap() - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated.  
addUnrelatedGap() - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
 
append(Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a component to the panel using the default constraints with a column span of 1.
append(Component, int) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a component to the panel using the default constraints with the given columnSpan.
append(Component, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds two components to the panel; each component will span a single data column.
append(Component, Component, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds three components to the panel; each component will span a single data column.
append(String) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a text label to the panel and proceeds to the next column.
append(String, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a text label and component to the panel.
append(String, Component, boolean) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a text label and component to the panel; the component will span the specified number columns.
append(String, Component, int) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a text label and component to the panel; the component will span the specified number columns.
append(String, Component, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a text label and two components to the panel; each component will span a single column.
append(String, Component, Component, int) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a text label and two components to the panel; each component will span a single column.
append(String, Component, Component, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a text label and three components to the panel; each component will span a single column.
append(String, Component, Component, Component, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a text label and four components to the panel; each component will span a single column.
appendColumn(ColumnSpec) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Appends the given column specification to the builder's layout.
appendColumn(ColumnSpec) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends the given column specification to the builder's layout.
appendColumn(String) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a column specification to the builder's layout that represents the given string encoding.
appendColumn(ColumnSpec) - Method in class com.jgoodies.forms.layout.FormLayout
Appends the given column specification to the right hand side of all columns.
appendGlueColumn() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Appends a glue column.
appendGlueColumn() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a glue column.
appendGlueRow() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Appends a glue row.
appendGlueRow() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a glue row.
appendI15d(String) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized (i15d) text label to the panel using the given resource key and proceeds to the next column.
appendI15d(String, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized (i15d) text label and component to the panel.
appendI15d(String, Component, boolean) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized (i15d) text label and component to the panel.
appendI15d(String, Component, int) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized (i15d) text label to the panel using the given resource key; then proceeds to the next data column and adds a component with the given column span.
appendI15d(String, Component, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized (i15d) text label and two components to the panel; each component will span a single column.
appendI15d(String, Component, Component, int) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized (i15d) text label and two components to the panel; each component will span a single column.
appendI15d(String, Component, Component, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized (i15d) text label and three components to the panel; each component will span a single column.
appendI15d(String, Component, Component, Component, Component) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized (i15d) text label and four components to the panel; each component will span a single column.
appendI15dSeparator(String) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Appends an internationalized titled separator for the given resource key that spans all columns.
appendI15dTitle(String) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds an internationalized title label to the panel and proceeds to the next column.
appendLabelComponentsGapColumn() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a column that is the default gap between a label and its associated component.
appendParagraphGapRow() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a row that is the default gap for paragraphs.
appendRelatedComponentsGapColumn() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Appends a column that is the default gap for related components.
appendRelatedComponentsGapColumn() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a column that is the default gap for related components.
appendRelatedComponentsGapRow() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Appends a row that is the default gap for related components.
appendRelatedComponentsGapRow() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a row that is the default gap for related components.
appendRow(RowSpec) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Appends the given row specification to the builder's layout.
appendRow(RowSpec) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends the given row specification to the builder's layout.
appendRow(String) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a row specification to the builder's layout that represents the given string encoding.
appendRow(RowSpec) - Method in class com.jgoodies.forms.layout.FormLayout
Appends the given row specification to the bottom of all rows.
appendSeparator() - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a separator without text that spans all columns.
appendSeparator(String) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a separator with the given text that spans all columns.
appendTitle(String) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Adds a title label to the panel and proceeds to the next column.
appendUnrelatedComponentsGapColumn() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Appends a column that is the default gap for unrelated components.
appendUnrelatedComponentsGapColumn() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a column that is the default gap for unrelated components.
appendUnrelatedComponentsGapRow() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Appends a row that is the default gap for unrelated components.
appendUnrelatedComponentsGapRow() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Appends a row that is the default gap for unrelated components.

B

background(Color) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Sets the panel's background color and makes the panel opaque.
background(Color) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
 
background(Color) - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
 
background(Color) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
 
background(Color) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
 
background(Color) - Method in class com.jgoodies.forms.builder.PanelBuilder
Sets the panel's background color and the panel to be opaque.
BALANCED_AVERAGE_CHARACTER_TEST_STRING - Static variable in class com.jgoodies.forms.util.DefaultUnitConverter
 
border(Border) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Sets the panel's border.
border(Border) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
 
border(Border) - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
 
border(Border) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
 
border(String) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
 
border(Border) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
 
border(String) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
 
border(Border) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Sets an optional border that surrounds the list view including the label and details.
border(Border) - Method in class com.jgoodies.forms.builder.PanelBuilder
Sets the panel's border.
border(String) - Method in class com.jgoodies.forms.builder.PanelBuilder
Sets the panel's border as an EmptyBorder using the given specification for the top, left, bottom, right in DLU.
border(Border, JComponent) - Static method in class com.jgoodies.forms.factories.Forms
 
border(String, JComponent) - Static method in class com.jgoodies.forms.factories.Forms
 
Borders - Class in com.jgoodies.forms.factories
Provides constants and factory methods for Borders that use instances of ConstantSize to define the margins.
Borders.EmptyBorder - Class in com.jgoodies.forms.factories
An empty border that uses 4 instances of ConstantSize to define the top, left, bottom and right gap.
bottom() - Method in class com.jgoodies.forms.factories.Borders.EmptyBorder
Returns this border's bottom size.
BOTTOM - Static variable in class com.jgoodies.forms.factories.CC
 
BOTTOM - Static variable in class com.jgoodies.forms.layout.CellConstraints
Put the component in the bottom.
BOTTOM - Static variable in class com.jgoodies.forms.layout.RowSpec
By default put the components in the bottom.
bounded(Size, Size, Size) - Static method in class com.jgoodies.forms.layout.Sizes
Creates and returns a BoundedSize for the given basis using the specified lower and upper bounds.
BoundedSize - Class in com.jgoodies.forms.layout
Describes sizes that provide lower and upper bounds as used by the JGoodies FormLayout.
BoundedSize(Size, Size, Size) - Constructor for class com.jgoodies.forms.layout.BoundedSize
Constructs a BoundedSize for the given basis using the specified lower and upper bounds.
build() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Returns the panel used to build the form and lazily builds a focus traversal group for all contained AbstractButtons.
build() - Method in class com.jgoodies.forms.builder.ListViewBuilder
Lazily builds and returns the list view panel.
build() - Method in class com.jgoodies.forms.builder.PanelBuilder
Returns the panel used to build the form.
buildGroupedButtonBar(AbstractButton...) - Static method in class com.jgoodies.forms.factories.Forms
Builds and returns a button bar that consists of the given buttons.
BUTTON_BAR_GAP_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.BUTTON_BAR_PAD
BUTTON_BAR_PAD - Static variable in class com.jgoodies.forms.factories.Borders
A standardized Border that describes the gap between a component and a button bar in its bottom.
BUTTON_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical horizontal column for a fixed size button.
BUTTON_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical row for a fixed size button.
buttonBar(JComponent...) - Static method in class com.jgoodies.forms.factories.Forms
 
ButtonBarBuilder - Class in com.jgoodies.forms.builder
A non-visual builder for building consistent button bars that comply with popular style guides.
ButtonBarBuilder() - Constructor for class com.jgoodies.forms.builder.ButtonBarBuilder
Constructs an empty ButtonBarBuilder on a JPanel.
ButtonBarBuilder(JPanel) - Constructor for class com.jgoodies.forms.builder.ButtonBarBuilder
Constructs an empty ButtonBarBuilder on the given panel.
ButtonBarBuilder2 - Class in com.jgoodies.forms.builder
Deprecated. Replaced by the ButtonBarBuilder
ButtonBarBuilder2() - Constructor for class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Constructs an empty ButtonBarBuilder2 on a JPanel.
ButtonBarBuilder2(JPanel) - Constructor for class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Constructs an empty ButtonBarBuilder2 on the given panel.
ButtonStackBuilder - Class in com.jgoodies.forms.builder
A non-visual builder that assists you in building consistent button stacks using the FormLayout.
ButtonStackBuilder() - Constructor for class com.jgoodies.forms.builder.ButtonStackBuilder
Constructs a ButtonStackBuilder on a default JPanel using a pre-configured FormLayout as layout manager.
ButtonStackBuilder(JPanel) - Constructor for class com.jgoodies.forms.builder.ButtonStackBuilder
Constructs a ButtonStackBuilder on the given panel using a pre-configured FormLayout as layout manager.

C

CC - Class in com.jgoodies.forms.factories
A factory for CellConstraints objects.
CC() - Constructor for class com.jgoodies.forms.factories.CC
 
cellConstraints() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Returns the CellConstraints object that is used as a cursor and holds the current column span and row span.
CellConstraints - Class in com.jgoodies.forms.layout
Defines constraints for components that are laid out with the FormLayout.
CellConstraints() - Constructor for class com.jgoodies.forms.layout.CellConstraints
Constructs a default instance of CellConstraints.
CellConstraints(int, int) - Constructor for class com.jgoodies.forms.layout.CellConstraints
Constructs an instance of CellConstraints for the given cell position.
CellConstraints(int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Constructor for class com.jgoodies.forms.layout.CellConstraints
Constructs an instance of CellConstraints for the given cell position, anchor, and fill.
CellConstraints(int, int, int, int) - Constructor for class com.jgoodies.forms.layout.CellConstraints
Constructs an instance of CellConstraints for the given cell position and size.
CellConstraints(int, int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Constructor for class com.jgoodies.forms.layout.CellConstraints
Constructs an instance of CellConstraints for the given cell position and size, anchor, and fill.
CellConstraints(int, int, int, int, CellConstraints.Alignment, CellConstraints.Alignment, Insets) - Constructor for class com.jgoodies.forms.layout.CellConstraints
Constructs an instance of CellConstraints for the complete set of available properties.
CellConstraints(String) - Constructor for class com.jgoodies.forms.layout.CellConstraints
Constructs an instance of CellConstraints from the given encoded string properties.
CellConstraints.Alignment - Class in com.jgoodies.forms.layout
An ordinal-based serializable typesafe enumeration for component alignment types as used by the FormLayout.
CENTER - Static variable in class com.jgoodies.forms.factories.CC
 
CENTER - Static variable in class com.jgoodies.forms.layout.CellConstraints
Put the component in the center.
CENTER - Static variable in class com.jgoodies.forms.layout.ColumnSpec
By default put the components in the center.
CENTER - Static variable in class com.jgoodies.forms.layout.RowSpec
By default put the components in the center.
centered(JComponent) - Static method in class com.jgoodies.forms.factories.Forms
 
CENTIMETER - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
centimeterAsPixel(double, Component) - Static method in class com.jgoodies.forms.layout.Sizes
Converts Centimeters and returns pixels using the resolution of the given component's graphics object.
centimeterAsPixel(double, Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts Centimeters and returns pixels using the resolution of the given component's graphics object.
centimeterAsPixel(double, int) - Static method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts Centimeters and returns pixels using the specified resolution.
centimeterAsPixel(double, Component) - Method in interface com.jgoodies.forms.util.UnitConverter
Converts Centimeters and returns pixels using the resolution of the given component's graphics object.
checkBoxBar(JCheckBox...) - Static method in class com.jgoodies.forms.factories.Forms
Builds and returns a panel where the given check boxes are laid out in a row.
clearLookAndFeelBasedCaches() - Static method in class com.jgoodies.forms.util.FormUtils
Clears cached internal Forms state that is based on the Look&Feel, for example dialog base units.
clone() - Method in class com.jgoodies.forms.layout.CellConstraints
Creates a copy of this cell constraints object.
CM - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
columnContainsComponent(Container, int) - Static method in class com.jgoodies.forms.extras.FormLayoutUtils
Checks and answers whether the given FormLayout container contains a component in the specified column.
columnContainsKey(String) - Method in class com.jgoodies.forms.layout.LayoutMap
Returns true if this map or a parent map - if any - contains a mapping for the specified key.
columnGet(String) - Method in class com.jgoodies.forms.layout.LayoutMap
Looks up and returns the String associated with the given key.
columnOrigins - Variable in class com.jgoodies.forms.layout.FormLayout.LayoutInfo
Holds the origins of the columns.
columnPut(String, String) - Method in class com.jgoodies.forms.layout.LayoutMap
Associates the specified column String with the specified key in this map.
columnPut(String, ColumnSpec) - Method in class com.jgoodies.forms.layout.LayoutMap
 
columnPut(String, Size) - Method in class com.jgoodies.forms.layout.LayoutMap
 
columnRemove(String) - Method in class com.jgoodies.forms.layout.LayoutMap
Removes the column value mapping for this key from this map if it is present.
ColumnSpec - Class in com.jgoodies.forms.layout
Specifies columns in FormLayout by their default orientation, start size and resizing behavior.
ColumnSpec(FormSpec.DefaultAlignment, Size, double) - Constructor for class com.jgoodies.forms.layout.ColumnSpec
Constructs a ColumnSpec for the given default alignment, size and resize weight.
ColumnSpec(Size) - Constructor for class com.jgoodies.forms.layout.ColumnSpec
Constructs a ColumnSpec for the given size using the default alignment, and no resizing.
com.jgoodies.forms.builder - package com.jgoodies.forms.builder
Contains optional builder classes of the Forms framework.
com.jgoodies.forms.debug - package com.jgoodies.forms.debug
Consists of optional classes that help you find, understand and fix layout problems
com.jgoodies.forms.extras - package com.jgoodies.forms.extras
Contains optional Forms framework classes that ship only with the JGoodies Forms source distribution and are not yet part of the binary Forms library.
com.jgoodies.forms.factories - package com.jgoodies.forms.factories
Consists of optional Forms framework factory classes that assist you in building consistent forms quickly
com.jgoodies.forms.internal - package com.jgoodies.forms.internal
 
com.jgoodies.forms.layout - package com.jgoodies.forms.layout
Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints
com.jgoodies.forms.util - package com.jgoodies.forms.util
Consists of Forms framework helper classes for unit conversion and layout styles
ComponentFactory - Interface in com.jgoodies.forms.factories
An interface that defines the factory methods as used by the PanelBuilder and its subclasses.
compressible() - Method in class com.jgoodies.forms.layout.BoundedSize
Describes if this Size can be compressed, if container space gets scarce.
compressible() - Method in class com.jgoodies.forms.layout.ConstantSize
Describes if this Size can be compressed, if container space gets scarce.
compressible() - Method in class com.jgoodies.forms.layout.PrototypeSize
Describes if this Size can be compressed, if container space gets scarce.
compressible() - Method in interface com.jgoodies.forms.layout.Size
Describes if this Size can be compressed, if container space gets scarce.
computeAverageCharWidth(FontMetrics, String) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Computes and returns the average character width of the specified test string using the given FontMetrics.
constant(String, boolean) - Static method in class com.jgoodies.forms.layout.Sizes
Creates and returns an instance of ConstantSize from the given encoded size and unit description.
ConstantSize - Class in com.jgoodies.forms.layout
An implementation of the Size interface that represents constant sizes described by a value and unit, for example: 10 pixel, 15 point or 4 dialog units.
ConstantSize(int, ConstantSize.Unit) - Constructor for class com.jgoodies.forms.layout.ConstantSize
Constructs a ConstantSize for the given size and unit.
ConstantSize(double, ConstantSize.Unit) - Constructor for class com.jgoodies.forms.layout.ConstantSize
Constructs a ConstantSize for the given size and unit.
ConstantSize.Unit - Class in com.jgoodies.forms.layout
An ordinal-based serializable typesafe enumeration for units as used in instances of ConstantSize.
createButton(Action) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Creates and returns a button that is bound to the given Action.
createButton(Action) - Method in interface com.jgoodies.forms.factories.ComponentFactory
Creates and returns a button that is bound to the given Action.
createButton(Action) - Method in class com.jgoodies.forms.factories.DefaultComponentFactory
Creates and returns a button that is bound to the given Action.
createComponentFactory() - Method in class com.jgoodies.forms.builder.AbstractBuilder
Invoked when the per-instance component factory is lazily initialized.
createEmptyBorder(ConstantSize, ConstantSize, ConstantSize, ConstantSize) - Static method in class com.jgoodies.forms.factories.Borders
Creates and returns an EmptyBorder with the specified gaps.
createEmptyBorder(String) - Static method in class com.jgoodies.forms.factories.Borders
Creates and returns a Border using sizes as specified by the given string.
createGap(ConstantSize) - Static method in class com.jgoodies.forms.layout.ColumnSpec
Creates and returns a ColumnSpec that represents a gap with the specified ConstantSize.
createGap(ConstantSize) - Static method in class com.jgoodies.forms.layout.RowSpec
Creates and returns a RowSpec that represents a gap with the specified ConstantSize.
createHeaderLabel(String) - Method in interface com.jgoodies.forms.factories.ComponentFactory
Creates and returns a label intended for pane headers that uses a larger font than the control font and a special foreground color.
createHeaderLabel(String) - Method in class com.jgoodies.forms.factories.DefaultComponentFactory
 
createLabel(String) - Method in interface com.jgoodies.forms.factories.ComponentFactory
Creates and returns a label with an optional mnemonic.
createLabel(String) - Method in class com.jgoodies.forms.factories.DefaultComponentFactory
Creates and returns a label with an optional mnemonic.
createLeftAdjustedConstraints(int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Creates and returns a CellConstraints object at the current cursor position that uses the given column span and is adjusted to the left.
createLeftToRightBuilder() - Static method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Creates and returns an empty ButtonBarBuilder2 with a left to right button order.
createReadOnlyLabel(String) - Method in interface com.jgoodies.forms.factories.ComponentFactory
Creates and returns a label with an optional mnemonic that is intended to label a read-only component.
createReadOnlyLabel(String) - Method in class com.jgoodies.forms.factories.DefaultComponentFactory
Creates and returns a label with an optional mnemonic that is intended to label a read-only component.
createSeparator(String, int) - Method in interface com.jgoodies.forms.factories.ComponentFactory
Creates and returns a labeled separator.
createSeparator(String) - Method in class com.jgoodies.forms.factories.DefaultComponentFactory
Creates and returns a labeled separator with the label in the left-hand side.
createSeparator(String, int) - Method in class com.jgoodies.forms.factories.DefaultComponentFactory
Creates and returns a labeled separator.
createSeparator(JLabel) - Method in class com.jgoodies.forms.factories.DefaultComponentFactory
Creates and returns a labeled separator.
createTitle(String) - Method in interface com.jgoodies.forms.factories.ComponentFactory
Creates and returns a title label that uses the foreground color and font of a TitledBorder.
createTitle(String) - Method in class com.jgoodies.forms.factories.DefaultComponentFactory
Creates and returns a title label that uses the foreground color and font of a TitledBorder.
currentCellConstraints - Variable in class com.jgoodies.forms.builder.AbstractBuilder
Holds an instance of CellConstraints that will be used to specify the location, extent and alignments of the component to be added next.

D

decode(String) - Static method in class com.jgoodies.forms.layout.ColumnSpec
Parses the encoded column specification and returns a ColumnSpec object that represents the string.
decode(String, LayoutMap) - Static method in class com.jgoodies.forms.layout.ColumnSpec
Parses the encoded column specifications and returns a ColumnSpec object that represents the string.
decode(String) - Static method in class com.jgoodies.forms.layout.RowSpec
Parses the encoded row specification and returns a RowSpec object that represents the string.
decode(String, LayoutMap) - Static method in class com.jgoodies.forms.layout.RowSpec
Parses the encoded row specifications and returns a RowSpec object that represents the string.
decodeSpecs(String) - Static method in class com.jgoodies.forms.layout.ColumnSpec
Parses and splits encoded column specifications using the default LayoutMap and returns an array of ColumnSpec objects.
decodeSpecs(String, LayoutMap) - Static method in class com.jgoodies.forms.layout.ColumnSpec
Splits and parses the encoded column specifications using the given LayoutMap and returns an array of ColumnSpec objects.
decodeSpecs(String) - Static method in class com.jgoodies.forms.layout.RowSpec
Parses and splits encoded row specifications using the default LayoutMap and returns an array of RowSpec objects.
decodeSpecs(String, LayoutMap) - Static method in class com.jgoodies.forms.layout.RowSpec
Parses and splits encoded row specifications using the given LayoutMap and returns an array of RowSpec objects.
DEFAULT - Static variable in class com.jgoodies.forms.factories.CC
 
DEFAULT - Static variable in class com.jgoodies.forms.layout.CellConstraints
Use the column's or row's default alignment.
DEFAULT - Static variable in class com.jgoodies.forms.layout.ColumnSpec
Unless overridden the default alignment for a column is FILL.
DEFAULT - Static variable in class com.jgoodies.forms.layout.RowSpec
Unless overridden the default alignment for a row is CENTER.
DEFAULT - Static variable in class com.jgoodies.forms.layout.Sizes
Use the maximum of all component sizes as column or row size; measures preferred sizes when asked for the preferred size and minimum sizes when asked for the minimum size.
DEFAULT_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
An unmodifiable ColumnSpec that determines its preferred width by computing the maximum of all column component preferred widths and its minimum width by computing all column component minimum widths.
DEFAULT_GROW - Static variable in class com.jgoodies.forms.layout.FormSpec
The default resize weight.
DEFAULT_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
An unmodifiable RowSpec that determines its preferred height by computing the maximum of all column component preferred heights and its minimum height by computing all column component minimum heights.
DefaultComponentFactory - Class in com.jgoodies.forms.factories
A singleton implementation of the ComponentFactory interface that creates UI components as required by the PanelBuilder.
DefaultComponentFactory() - Constructor for class com.jgoodies.forms.factories.DefaultComponentFactory
 
DefaultFormBuilder - Class in com.jgoodies.forms.builder
Provides a means to build form-oriented panels quickly and consistently using the FormLayout.
DefaultFormBuilder(FormLayout) - Constructor for class com.jgoodies.forms.builder.DefaultFormBuilder
Constructs a DefaultFormBuilder for the given layout.
DefaultFormBuilder(FormLayout, JPanel) - Constructor for class com.jgoodies.forms.builder.DefaultFormBuilder
Constructs a DefaultFormBuilder for the given layout and panel.
DefaultFormBuilder(FormLayout, ResourceBundle) - Constructor for class com.jgoodies.forms.builder.DefaultFormBuilder
Constructs a DefaultFormBuilder for the given layout and resource bundle.
DefaultFormBuilder(FormLayout, ResourceBundle, JPanel) - Constructor for class com.jgoodies.forms.builder.DefaultFormBuilder
Constructs a DefaultFormBuilder for the given layout, resource bundle, and panel.
DefaultFormBuilder(FormLayout, StringLocalizer) - Constructor for class com.jgoodies.forms.builder.DefaultFormBuilder
Constructs a DefaultFormBuilder for the given layout and resource bundle.
DefaultFormBuilder(FormLayout, StringLocalizer, JPanel) - Constructor for class com.jgoodies.forms.builder.DefaultFormBuilder
Constructs a DefaultFormBuilder for the given layout, resource bundle, and panel.
defaultRowSpec(RowSpec) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Sets the row specification that shall be used for component rows.
DefaultUnitConverter - Class in com.jgoodies.forms.util
This is the default implementation of the UnitConverter interface.
detailsView(JComponent) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Sets an optional details view that is located under the list view.
DIALOG - Static variable in class com.jgoodies.forms.factories.Borders
A standardized Border that describes the border around a dialog content that has no tabs.
DIALOG_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.DIALOG
DIALOG_UNITS_X - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
DIALOG_UNITS_Y - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
dialogUnitXAsPixel(int, Component) - Static method in class com.jgoodies.forms.layout.Sizes
Converts horizontal dialog units and returns pixels.
dialogUnitXAsPixel(int, Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts horizontal dialog units and returns pixels.
dialogUnitXAsPixel(int, double) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts horizontal dialog units and returns pixels.
dialogUnitXAsPixel(int, Component) - Method in interface com.jgoodies.forms.util.UnitConverter
Converts horizontal dialog units and returns pixels.
dialogUnitYAsPixel(int, Component) - Static method in class com.jgoodies.forms.layout.Sizes
Converts vertical dialog units and returns pixels.
dialogUnitYAsPixel(int, Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts vertical dialog units and returns pixels.
dialogUnitYAsPixel(int, double) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts vertical dialog units and returns pixels.
dialogUnitYAsPixel(int, Component) - Method in interface com.jgoodies.forms.util.UnitConverter
Converts vertical dialog units and returns pixels.
DLU14 - Static variable in class com.jgoodies.forms.factories.Borders
A prepared Border with 14dlu on all sides.
DLU14_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.DLU14
DLU2 - Static variable in class com.jgoodies.forms.factories.Borders
A prepared and reusable Border with 2dlu on all sides.
DLU21 - Static variable in class com.jgoodies.forms.factories.Borders
A prepared Border with 21dlu on all sides.
DLU21_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.DLU21
DLU2_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.DLU2
DLU4 - Static variable in class com.jgoodies.forms.factories.Borders
A prepared and reusable Border with 4dlu on all sides.
DLU4_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.DLU4
DLU7 - Static variable in class com.jgoodies.forms.factories.Borders
A prepared and reusable Border with 7dlu on all sides.
DLU7_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.DLU7
DLU9 - Static variable in class com.jgoodies.forms.factories.Borders
A prepared and reusable Border with 9dlu on all sides.
DLUX - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
dluX(int) - Static method in class com.jgoodies.forms.layout.Sizes
Creates and returns a ConstantSize for the specified value in horizontal dialog units.
DLUX1 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX11 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX14 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX2 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX21 - Static variable in class com.jgoodies.forms.layout.Sizes
21 horizontal dialog units.
DLUX3 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX4 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX5 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX6 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX7 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX8 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUX9 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
dluY(int) - Static method in class com.jgoodies.forms.layout.Sizes
Creates and returns a ConstantSize for the specified value in vertical dialog units.
DLUY1 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY11 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY14 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY2 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY21 - Static variable in class com.jgoodies.forms.layout.Sizes
21 vertical dialog units.
DLUY3 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY4 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY5 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY6 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY7 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY8 - Static variable in class com.jgoodies.forms.layout.Sizes
 
DLUY9 - Static variable in class com.jgoodies.forms.layout.Sizes
 
dumpAll(Container) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Dumps all layout state to the console: column and row specifications, column and row groups, grid bounds and cell constraints.
dumpColumnGroups(FormLayout) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Dumps the layout's column groups to the console.
dumpColumnSpecs(FormLayout) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Dumps the layout's column specifications to the console.
dumpConstraints(Container) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Dumps the component constraints to the console.
dumpGridBounds(Container) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Dumps the container's grid info to the console if and only if the container's layout is a FormLayout.
dumpGridBounds(FormLayout.LayoutInfo) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Dumps the grid layout info to the console.
dumpRowGroups(FormLayout) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Dumps the layout's row groups to the console.
dumpRowSpecs(FormLayout) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Dumps the layout's row specifications to the console.

E

EMPTY - Static variable in class com.jgoodies.forms.factories.Borders
A prepared and reusable EmptyBorder without gaps.
EMPTY_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.EMPTY
encode() - Method in class com.jgoodies.forms.layout.BoundedSize
Returns a parseable string representation of this bounded size.
encode() - Method in class com.jgoodies.forms.layout.ConstantSize
Returns a parseable string representation of this constant size.
encode() - Method in class com.jgoodies.forms.layout.ConstantSize.Unit
Returns a parseable string representation of this unit.
encode() - Method in class com.jgoodies.forms.layout.FormSpec
Returns a short and parseable string representation of this form specification.
encode() - Method in class com.jgoodies.forms.layout.PrototypeSize
Returns a parseable string representation of this prototype size.
encode() - Method in interface com.jgoodies.forms.layout.Size
Returns a String respresentation of this Size object that can be parsed by the Forms parser.
equals(Object) - Method in class com.jgoodies.forms.layout.BoundedSize
Indicates whether some other BoundedSize is "equal to" this one.
equals(Object) - Method in class com.jgoodies.forms.layout.ConstantSize
Indicates whether some other ConstantSize is "equal to" this one.
equals(Object) - Method in class com.jgoodies.forms.layout.PrototypeSize
Indicates whether some other ConstantSize is "equal to" this one.

F

fail(String, int, String) - Static method in class com.jgoodies.forms.layout.FormSpecParser
 
FILL - Static variable in class com.jgoodies.forms.factories.CC
 
FILL - Static variable in class com.jgoodies.forms.layout.CellConstraints
Fill the cell either horizontally or vertically.
FILL - Static variable in class com.jgoodies.forms.layout.ColumnSpec
By default fill the component into the column.
FILL - Static variable in class com.jgoodies.forms.layout.RowSpec
By default fill the component into the row.
filterView(JComponent) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Sets an optional view that will be placed in the upper right corner of the built list view panel.
filterViewColSpec(String) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Changes the FormLayout column specification used to lay out the filter view.
focusGrouped - Variable in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Indicates whether a focus group has been built in AbstractButtonPanelBuilder.build().
FocusTraversalUtilsAccessor - Class in com.jgoodies.forms.internal
Provides access to the FocusTraversalUtils class that ships with the JGoodies Standard Dialog Library (JSDL).
FormDebugPanel - Class in com.jgoodies.forms.debug
A panel that paints grid bounds if and only if the panel's layout manager is a FormLayout.
FormDebugPanel() - Constructor for class com.jgoodies.forms.debug.FormDebugPanel
Constructs a FormDebugPanel with all options turned off.
FormDebugPanel(FormLayout) - Constructor for class com.jgoodies.forms.debug.FormDebugPanel
Constructs a FormDebugPanel on the given FormLayout instance that paints the grid in the foreground and paints no diagonals.
FormDebugPanel(boolean, boolean) - Constructor for class com.jgoodies.forms.debug.FormDebugPanel
Constructs a FormDebugPanel on the given FormLayout using the specified settings that are otherwise turned off.
FormDebugPanel(FormLayout, boolean, boolean) - Constructor for class com.jgoodies.forms.debug.FormDebugPanel
Constructs a FormDebugPanel on the given FormLayout using the specified settings that are otherwise turned off.
FormDebugUtils - Class in com.jgoodies.forms.debug
Provides static methods that help you understand and fix layout problems when using the FormLayout.
FormLayout - Class in com.jgoodies.forms.layout
FormLayout is a powerful, flexible and precise general purpose layout manager.
FormLayout() - Constructor for class com.jgoodies.forms.layout.FormLayout
Constructs an empty FormLayout.
FormLayout(String) - Constructor for class com.jgoodies.forms.layout.FormLayout
Constructs a FormLayout using the given encoded column specifications.
FormLayout(String, LayoutMap) - Constructor for class com.jgoodies.forms.layout.FormLayout
Constructs a FormLayout using the given encoded column specifications and LayoutMap.
FormLayout(String, String) - Constructor for class com.jgoodies.forms.layout.FormLayout
Constructs a FormLayout using the given encoded column and row specifications and the default LayoutMap.
FormLayout(String, String, LayoutMap) - Constructor for class com.jgoodies.forms.layout.FormLayout
Constructs a FormLayout using the given encoded column and row specifications and the given LayoutMap.
FormLayout(ColumnSpec[]) - Constructor for class com.jgoodies.forms.layout.FormLayout
Constructs a FormLayout using the given column specifications.
FormLayout(ColumnSpec[], RowSpec[]) - Constructor for class com.jgoodies.forms.layout.FormLayout
Constructs a FormLayout using the given column and row specifications.
FormLayout.LayoutInfo - Class in com.jgoodies.forms.layout
Stores column and row origins.
FormLayout.Measure - Interface in com.jgoodies.forms.layout
An interface that describes how to measure a Component.
FormLayoutUtils - Class in com.jgoodies.forms.extras
Consists only of static methods that provide convenience behavior for working with the FormLayout.
FormLayoutUtils.ConstraintIterator - Class in com.jgoodies.forms.extras
Iterates over a FormLayout container's CellConstraints.
FormLayoutUtils.ConstraintIterator(Container) - Constructor for class com.jgoodies.forms.extras.FormLayoutUtils.ConstraintIterator
Constructs a ConstraintIterator for the given FormLayout container.
Forms - Class in com.jgoodies.forms.factories
Provides convenience behavior for building forms.
FormSpec - Class in com.jgoodies.forms.layout
An abstract class that specifies columns and rows in FormLayout by their default alignment, start size and resizing behavior.
FormSpec(FormSpec.DefaultAlignment, Size, double) - Constructor for class com.jgoodies.forms.layout.FormSpec
Constructs a FormSpec for the given default alignment, size, and resize weight.
FormSpec(FormSpec.DefaultAlignment, String) - Constructor for class com.jgoodies.forms.layout.FormSpec
Constructs a FormSpec from the specified encoded description.
FormSpec.DefaultAlignment - Class in com.jgoodies.forms.layout
An ordinal-based serializable typesafe enumeration for the column and row default alignment types.
FormSpecParser - Class in com.jgoodies.forms.layout
Parses encoded column and row specifications.
FormSpecParser.FormLayoutParseException - Exception in com.jgoodies.forms.layout
Used by the parser for encoded column and row specifications.
FormSpecs - Class in com.jgoodies.forms.layout
Provides frequently used column and row specifications.
FormUtils - Class in com.jgoodies.forms.util
A library-internal class that consists only of static utility methods.

G

getAverageCharacterWidthTestString() - Method in class com.jgoodies.forms.util.DefaultUnitConverter
Returns the string used to compute the average character width.
getBasis() - Method in class com.jgoodies.forms.layout.BoundedSize
Returns the base size, which is not-null.
getBorderInsets(Component, Insets) - Method in class com.jgoodies.forms.factories.Borders.EmptyBorder
Returns the insets of the border.
getBorderInsets(Component) - Method in class com.jgoodies.forms.factories.Borders.EmptyBorder
Returns the insets of the border.
getButtonBarPad() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a pad used to separate a button bar from a component.
getButtonBarPad() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getColumn() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
 
getColumn() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Returns the cursor's column.
getColumnCount() - Method in class com.jgoodies.forms.builder.AbstractBuilder
Returns the number of columns in the form.
getColumnCount() - Method in class com.jgoodies.forms.layout.FormLayout
Returns the number of columns in this layout.
getColumnGroups() - Method in class com.jgoodies.forms.layout.FormLayout
Returns a deep copy of the column groups.
getColumnIncrementSign() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Returns the sign (-1 or 1) used to increment the cursor's column when moving to the next column.
getColumnSpec(int) - Method in class com.jgoodies.forms.layout.FormLayout
Returns the ColumnSpec at the specified column index.
getComponentFactory() - Method in class com.jgoodies.forms.builder.AbstractBuilder
Returns this builder's component factory.
getComponentFactoryDefault() - Static method in class com.jgoodies.forms.builder.AbstractBuilder
Returns the factory that is used as default for new builder's as they are created.
getConstraints(Component) - Method in class com.jgoodies.forms.layout.FormLayout
Looks up and returns the constraints for the specified component.
getContainer() - Method in class com.jgoodies.forms.builder.AbstractBuilder
Returns the container used to build the form.
getCurrent() - Static method in class com.jgoodies.forms.util.LayoutStyle
Returns the current LayoutStyle.
getDefaultAlignment() - Method in class com.jgoodies.forms.layout.FormSpec
Returns the default alignment.
getDefaultButtonHeight() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns this style's default button height.
getDefaultButtonHeight() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getDefaultButtonWidth() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns this style's default button width.
getDefaultButtonWidth() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getDefaultDialogFont() - Method in class com.jgoodies.forms.util.DefaultUnitConverter
Returns the dialog font that is used to compute the dialog base units.
getDefaultRowSpec() - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Obsolete; will be deleted from the next version
getDefaultScreenResolution() - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Computes and returns the default resolution.
getDefaultUnit() - Static method in class com.jgoodies.forms.layout.Sizes
Returns the Unit that is used if an encoded ConstantSize contains no unit string.
getDialogBaseUnitsX(Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Gets and returns the horizontal dialog base units.
getDialogBaseUnitsX(Component) - Method in class com.jgoodies.forms.util.DefaultUnitConverter
Returns the cached or computed horizontal dialog base units.
getDialogBaseUnitsY(Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Gets and returns the vertical dialog base units.
getDialogBaseUnitsY(Component) - Method in class com.jgoodies.forms.util.DefaultUnitConverter
Returns the cached or computed vertical dialog base units for the given component.
getDialogMarginX() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns this style's horizontal margin for general dialogs.
getDialogMarginX() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getDialogMarginY() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns this style's vertical margin for general dialogs.
getDialogMarginY() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getHeight() - Method in class com.jgoodies.forms.layout.FormLayout.LayoutInfo
Returns the layout's height, the size between the first and last row.
getHonorsVisibility() - Method in class com.jgoodies.forms.layout.FormLayout
Returns whether invisible components shall be taken into account by this layout.
getI15dString(String) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
Looks up and returns the internationalized (i15d) string for the given resource key, for example from a ResourceBundle or ResourceMap.
getInstance() - Static method in class com.jgoodies.forms.factories.DefaultComponentFactory
Returns the sole instance of this factory class.
getInstance() - Static method in class com.jgoodies.forms.util.DefaultUnitConverter
Lazily instantiates and returns the sole instance.
getLabelComponentPadX() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a gap used to separate a label and associated control.
getLabelComponentPadX() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getLabelComponentPadY() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a gap used to separate a label and associated control.
getLabelComponentPadY() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getLabelForFeatureEnabledDefault() - Static method in class com.jgoodies.forms.builder.PanelBuilder
Returns the global default for the enablement of the setLabelFor feature.
getLayout() - Method in class com.jgoodies.forms.builder.AbstractBuilder
Returns the FormLayout instance used to build this form.
getLayoutAlignmentX(Container) - Method in class com.jgoodies.forms.layout.FormLayout
Returns the alignment along the x axis.
getLayoutAlignmentY(Container) - Method in class com.jgoodies.forms.layout.FormLayout
Returns the alignment along the y axis.
getLayoutInfo(Container) - Static method in class com.jgoodies.forms.debug.FormDebugUtils
Computes and returns the layout's grid origins.
getLayoutInfo(Container) - Method in class com.jgoodies.forms.layout.FormLayout
Computes and returns the horizontal and vertical grid origins.
getLeadingColumn() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Returns the index of the leading column.
getLeadingColumn() - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Returns the leading column.
getLeadingColumnOffset() - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Obsolete; will be deleted from the next version
getLineGapSpec() - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Obsolete; will be deleted from the next version
getLinePad() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a narrow vertical pad used to separate lines.
getLinePad() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getLowerBound() - Method in class com.jgoodies.forms.layout.BoundedSize
Returns the optional lower bound.
getNarrowLinePad() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a narrow vertical pad used to separate lines.
getNarrowLinePad() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getOpaqueDefault() - Static method in class com.jgoodies.forms.builder.PanelBuilder
 
getPanel() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Returns the panel used to build the form and lazily builds a focus traversal group for all contained AbstractButtons.
getPanel() - Method in class com.jgoodies.forms.builder.PanelBuilder
Returns the panel used to build the form.
getParagraphPad() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a pad used to separate paragraphs.
getParagraphPad() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getPixelSize(Component) - Method in class com.jgoodies.forms.layout.ConstantSize
Converts the size if necessary and returns the value in pixels.
getPrototype() - Method in class com.jgoodies.forms.layout.PrototypeSize
Returns this size's prototype string.
getRelatedComponentsPadX() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a horizontal gap used to separate related controls.
getRelatedComponentsPadX() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getRelatedComponentsPadY() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a vertical gap used to separate related controls.
getRelatedComponentsPadY() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getResizeWeight() - Method in class com.jgoodies.forms.layout.FormSpec
Returns the current resize weight.
getRoot() - Static method in class com.jgoodies.forms.layout.LayoutMap
Lazily initializes and returns the LayoutMap that is used for variable expansion, if no custom LayoutMap is provided.
getRow() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Returns the cursor's row.
getRow() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Returns the cursor's row.
getRowCount() - Method in class com.jgoodies.forms.builder.AbstractBuilder
Returns the number of rows in the form.
getRowCount() - Method in class com.jgoodies.forms.layout.FormLayout
Returns the number of rows in this layout.
getRowGroups() - Method in class com.jgoodies.forms.layout.FormLayout
Returns a deep copy of the row groups.
getRowSpec(int) - Method in class com.jgoodies.forms.layout.FormLayout
Returns the RowSpec at the specified row index.
getScreenResolution(Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Returns the components screen resolution or the default screen resolution if the component is null or has no toolkit assigned yet.
getSize() - Method in class com.jgoodies.forms.layout.FormSpec
Returns the size.
getTabbedDialogMarginX() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns this style's horizontal margin for dialogs that consist of a tabbed pane.
getTabbedDialogMarginX() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getTabbedDialogMarginY() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns this style's vertical margin for dialogs that consist of a tabbed pane.
getTabbedDialogMarginY() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getUnit() - Method in class com.jgoodies.forms.layout.ConstantSize
Returns this size's unit.
getUnitConverter() - Static method in class com.jgoodies.forms.layout.Sizes
Returns the current UnitConverter.
getUnrelatedComponentsPadX() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a horizontal gap used to separate unrelated controls.
getUnrelatedComponentsPadX() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getUnrelatedComponentsPadY() - Method in class com.jgoodies.forms.util.LayoutStyle
Returns a vertical gap used to separate unrelated controls.
getUnrelatedComponentsPadY() - Method in class com.jgoodies.forms.util.MacLayoutStyle
 
getUpperBound() - Method in class com.jgoodies.forms.layout.BoundedSize
Returns the optional upper bound.
getValue() - Method in class com.jgoodies.forms.layout.ConstantSize
Returns this size's value.
getWidth() - Method in class com.jgoodies.forms.layout.FormLayout.LayoutInfo
Returns the layout's width, the size between the first and the last column origin.
getX() - Method in class com.jgoodies.forms.layout.FormLayout.LayoutInfo
Returns the layout's horizontal origin, the origin of the first column.
getY() - Method in class com.jgoodies.forms.layout.FormLayout.LayoutInfo
Returns the layout's vertical origin, the origin of the first row.
GLUE_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
An unmodifiable ColumnSpec that has an initial width of 0 pixels and that grows.
GLUE_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
An unmodifiable RowSpec that has an initial height of 0 pixels and that grows.
gridHeight - Variable in class com.jgoodies.forms.layout.CellConstraints
Describes the component's vertical grid extent (number of cells).
gridWidth - Variable in class com.jgoodies.forms.layout.CellConstraints
Describes the component's horizontal grid extend (number of cells).
gridX - Variable in class com.jgoodies.forms.layout.CellConstraints
Describes the component's horizontal grid origin (starts at 1).
gridY - Variable in class com.jgoodies.forms.layout.CellConstraints
Describes the component's vertical grid origin (starts at 1).
GROWING_BUTTON_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical horizontal column for a growing button.

H

hAlign - Variable in class com.jgoodies.forms.layout.CellConstraints
Describes the component's horizontal alignment.
hashCode() - Method in class com.jgoodies.forms.layout.BoundedSize
Returns a hash code value for the object.
hashCode() - Method in class com.jgoodies.forms.layout.ConstantSize
Returns a hash code value for the object.
hashCode() - Method in class com.jgoodies.forms.layout.PrototypeSize
Returns a hash code value for the object.
hasNext() - Method in class com.jgoodies.forms.extras.FormLayoutUtils.ConstraintIterator
Returns true if the iteration has more elements.
headerLabel(String) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Creates a header label for the given marked text and sets it as label view.
honorsVisibility - Variable in class com.jgoodies.forms.layout.CellConstraints
Describes whether individual components shall be taken into account by the FormLayout if 1) they are invisible and 2) the FormLayout does not honor the visibility.
horizontal(String, JComponent...) - Static method in class com.jgoodies.forms.factories.Forms
 

I

I15dPanelBuilder - Class in com.jgoodies.forms.builder
A general purpose builder class that uses the FormLayout to lay out JPanels.
I15dPanelBuilder(FormLayout, ResourceBundle) - Constructor for class com.jgoodies.forms.builder.I15dPanelBuilder
Constructs an I15dPanelBuilder for the given layout and resource bundle.
I15dPanelBuilder(FormLayout, ResourceBundle, JPanel) - Constructor for class com.jgoodies.forms.builder.I15dPanelBuilder
Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
I15dPanelBuilder(FormLayout, StringLocalizer) - Constructor for class com.jgoodies.forms.builder.I15dPanelBuilder
Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
I15dPanelBuilder(FormLayout, StringLocalizer, JPanel) - Constructor for class com.jgoodies.forms.builder.I15dPanelBuilder
Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
IN - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
INCH - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
inchAsPixel(double, Component) - Static method in class com.jgoodies.forms.layout.Sizes
Converts Inches and returns pixels using the specified resolution.
inchAsPixel(double, Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts Inches and returns pixels using the specified resolution.
inchAsPixel(double, int) - Static method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts Inches and returns pixels using the specified resolution.
inchAsPixel(double, Component) - Method in interface com.jgoodies.forms.util.UnitConverter
Converts Inches and returns pixels using the specified resolution.
insertColumn(int, ColumnSpec) - Method in class com.jgoodies.forms.layout.FormLayout
Inserts the specified column at the specified position.
insertRow(int, RowSpec) - Method in class com.jgoodies.forms.layout.FormLayout
Inserts the specified column at the specified position.
insets - Variable in class com.jgoodies.forms.layout.CellConstraints
Describes the component's Insets in it's display area.
invalidateLayout(Container) - Method in class com.jgoodies.forms.layout.FormLayout
Invalidates the layout, indicating that if the layout manager has cached information it should be discarded.
isDebugToolTipsEnabled() - Static method in class com.jgoodies.forms.builder.I15dPanelBuilder
Returns whether the debug tool tips are enabled or not.
isGroupedColumn(FormLayout, int) - Static method in class com.jgoodies.forms.extras.FormLayoutUtils
Checks and answers whether the specified column is grouped in the given FormLayout.
isGroupedRow(FormLayout, int) - Static method in class com.jgoodies.forms.extras.FormLayoutUtils
Checks and answers whether the specified row is grouped in the given FormLayout.
isHorizontal() - Method in class com.jgoodies.forms.layout.ColumnSpec
Returns if this is a horizontal specification (vs. vertical).
isHorizontal() - Method in class com.jgoodies.forms.layout.RowSpec
Returns if this is a horizontal specification (vs. vertical).
isLabelForApplicable(JLabel, Component) - Method in class com.jgoodies.forms.builder.PanelBuilder
Checks and answers whether the given component shall be set as component for a previously added label using JLabel.setLabelFor(Component).
isLafAqua() - Static method in class com.jgoodies.forms.util.FormUtils
Lazily checks and answers whether the Aqua look&feel is active.
isLeftToRight() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Returns whether this builder fills the form left-to-right or right-to-left.
isLeftToRight() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Returns whether this builder fills the form left-to-right or right-to-left.
isLeftToRightButtonOrder() - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Returns whether button sequences will be ordered from left to right or from right to left.
isRowGroupingEnabled() - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Obsolete; will be deleted from the next version

L

label(String) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Creates a plain label for the given marked text and sets it as label view.
LABEL_COMPONENT_GAP_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical horizontal gap between a label and an associated component.
LABEL_COMPONENT_GAP_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical horizontal gap between a label and an associated component.
labelForFeatureEnabled(boolean) - Method in class com.jgoodies.forms.builder.PanelBuilder
Enables or disables the setLabelFor feature for this PanelBuilder.
labelView(JComponent) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Sets the mandatory label view.
layoutContainer(Container) - Method in class com.jgoodies.forms.layout.FormLayout
Lays out the specified container using this form layout.
LayoutMap - Class in com.jgoodies.forms.layout
Provides a hierarchical variable expansion useful to improve layout consistency, style guide compliance, and layout readability.
LayoutMap() - Constructor for class com.jgoodies.forms.layout.LayoutMap
Constructs a LayoutMap that has the root LayoutMap as parent.
LayoutMap(LayoutMap) - Constructor for class com.jgoodies.forms.layout.LayoutMap
Constructs a LayoutMap with the given optional parent.
LayoutStyle - Class in com.jgoodies.forms.util
An abstract class that describes a layout and design style guide.
LayoutStyle() - Constructor for class com.jgoodies.forms.util.LayoutStyle
 
leadingColumnOffset(int) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Sets the offset of the leading column, often 0 or 1.
left() - Method in class com.jgoodies.forms.factories.Borders.EmptyBorder
Returns this border's left size.
LEFT - Static variable in class com.jgoodies.forms.factories.CC
 
LEFT - Static variable in class com.jgoodies.forms.layout.CellConstraints
Put the component in the left.
LEFT - Static variable in class com.jgoodies.forms.layout.ColumnSpec
By default put components in the left.
LINE_GAP_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes the logical vertical default gap between two rows in the grid.
lineGapSize(ConstantSize) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Sets the size of gaps between component lines using the given constant size.
listBar(JComponent...) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Builds a button bar using the given buttons and sets it as list bar.
listBarView(JComponent) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Sets an optional list bar - often a button bar - that will be located in the lower left corner of the list view.
listExtrasView(JComponent) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Sets an optional view that is located in the lower right corner of the list view, aligned with the list bar.
listView(JComponent) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Sets the given component as the the mandatory list view.
ListViewBuilder - Class in com.jgoodies.forms.builder
Builds list/table views from a set of mandatory and optional components: label, filter/search, list (table), list buttons, list extras, details view (or preview).
ListViewBuilder() - Constructor for class com.jgoodies.forms.builder.ListViewBuilder
Constructs a ListViewBuilder using the AbstractBuilder's default component factory.
ListViewBuilder(ComponentFactory) - Constructor for class com.jgoodies.forms.builder.ListViewBuilder
Constructs a ListViewBuilder using the given component factory.
listViewRowSpec(String) - Method in class com.jgoodies.forms.builder.ListViewBuilder
Changes the FormLayout row specification used to lay out the list view.

M

MacLayoutStyle - Class in com.jgoodies.forms.util
A LayoutStyle that aims to provide layout constants as defined by Microsoft's User Experience Guidelines.
maximumLayoutSize(Container) - Method in class com.jgoodies.forms.layout.FormLayout
Returns the maximum dimensions for this layout given the components in the specified target container.
maximumSize(Container, List, FormLayout.Measure, FormLayout.Measure, FormLayout.Measure) - Method in class com.jgoodies.forms.layout.BoundedSize
Returns this size as pixel size.
maximumSize(Container, List, FormLayout.Measure, FormLayout.Measure, FormLayout.Measure) - Method in class com.jgoodies.forms.layout.ConstantSize
Returns this size as pixel size.
maximumSize(Container, List, FormLayout.Measure, FormLayout.Measure, FormLayout.Measure) - Method in class com.jgoodies.forms.layout.PrototypeSize
Computes and returns the width of this Size's prototype in pixel.
maximumSize(Container, List, FormLayout.Measure, FormLayout.Measure, FormLayout.Measure) - Method in interface com.jgoodies.forms.layout.Size
Computes and returns this Size's maximum pixel size applied to the given list of components using the specified measures.
MILLIMETER - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
millimeterAsPixel(double, Component) - Static method in class com.jgoodies.forms.layout.Sizes
Converts Millimeters and returns pixels using the resolution of the given component's graphics object.
millimeterAsPixel(double, Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts Millimeters and returns pixels using the resolution of the given component's graphics object.
millimeterAsPixel(double, int) - Static method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts Millimeters and returns pixels using the specified resolution.
millimeterAsPixel(double, Component) - Method in interface com.jgoodies.forms.util.UnitConverter
Converts Millimeters and returns pixels using the resolution of the given component's graphics object.
MIN_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
An unmodifiable ColumnSpec that determines its width by computing the maximum of all column component minimum widths.
MIN_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
An unmodifiable RowSpec that determines its height by computing the maximum of all column component minimum heights.
MINIMUM - Static variable in class com.jgoodies.forms.layout.Sizes
Use the maximum of all component minimum sizes as column or row size.
minimumLayoutSize(Container) - Method in class com.jgoodies.forms.layout.FormLayout
Determines the minimum size of the parent container using this form layout.
MM - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
MODERN_AVERAGE_CHARACTER_TEST_STRING - Static variable in class com.jgoodies.forms.util.DefaultUnitConverter
 

N

NARROW_LINE_GAP_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical vertical narrow gap between two rows in the grid.
nextColumn() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Moves to the next column, does the same as #nextColumn(1).
nextColumn() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Moves to the next column, does the same as #nextColumn(1).
nextColumn(int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Moves to the next column.
nextConstraints() - Method in class com.jgoodies.forms.extras.FormLayoutUtils.ConstraintIterator
Returns the next element in the iteration.
nextLine() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Moves to the next line: increases the row and resets the column; does the same as #nextLine(1).
nextLine(int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Moves the cursor down several lines: increases the row by the specified number of lines and sets the cursor to the leading column.
nextRow() - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Increases the row by one; does the same as #nextRow(1).
nextRow() - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Increases the row by one; does the same as #nextRow(1).
nextRow(int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Increases the row by the specified rows.
NO_GROW - Static variable in class com.jgoodies.forms.layout.FormSpec
Gives a column or row a fixed size.

O

OLD_AVERAGE_CHARACTER_TEST_STRING - Static variable in class com.jgoodies.forms.util.DefaultUnitConverter
 
opaque(boolean) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Sets the panel's opaque state.
opaque(boolean) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder
 
opaque(boolean) - Method in class com.jgoodies.forms.builder.ButtonStackBuilder
 
opaque(boolean) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
 
opaque(boolean) - Method in class com.jgoodies.forms.builder.I15dPanelBuilder
 
opaque(boolean) - Method in class com.jgoodies.forms.builder.PanelBuilder
Sets the panel's opaque state.

P

paint(Graphics) - Method in class com.jgoodies.forms.debug.FormDebugPanel
Paints the panel.
paintComponent(Graphics) - Method in class com.jgoodies.forms.debug.FormDebugPanel
Paints the component and - if background painting is enabled - the grid.
paintRowsDefault - Static variable in class com.jgoodies.forms.debug.FormDebugPanel
 
PanelBuilder - Class in com.jgoodies.forms.builder
An general purpose panel builder that uses the FormLayout to lay out JPanels.
PanelBuilder(FormLayout) - Constructor for class com.jgoodies.forms.builder.PanelBuilder
Constructs a PanelBuilder for the given layout.
PanelBuilder(FormLayout, JPanel) - Constructor for class com.jgoodies.forms.builder.PanelBuilder
Constructs a PanelBuilder for the given FormLayout and layout container.
PARAGRAPH_GAP_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes the logical vertical default gap between two paragraphs in the layout grid.
paragraphGapSize(ConstantSize) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Sets the size of gaps between paragraphs using the given constant size.
PIXEL - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
pixel(int) - Static method in class com.jgoodies.forms.layout.Sizes
Creates and returns a ConstantSize for the specified pixel value.
POINT - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
pointAsPixel(int, Component) - Static method in class com.jgoodies.forms.layout.Sizes
Converts DTP Points and returns pixels using the resolution of the given component's graphics object.
pointAsPixel(int, Component) - Method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts DTP Points and returns pixels using the resolution of the given component's graphics object.
pointAsPixel(int, int) - Static method in class com.jgoodies.forms.util.AbstractUnitConverter
Converts DTP Points and returns pixels using the specified resolution.
pointAsPixel(int, Component) - Method in interface com.jgoodies.forms.util.UnitConverter
Converts DTP Points and returns pixels using the resolution of the given component's graphics object.
PREF_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
An unmodifiable ColumnSpec that determines its width by computing the maximum of all column component preferred widths.
PREF_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
An unmodifiable RowSpec that determines its height by computing the maximum of all column component preferred heights.
PREFERRED - Static variable in class com.jgoodies.forms.layout.Sizes
Use the maximum of all component preferred sizes as column or row size.
preferredLayoutSize(Container) - Method in class com.jgoodies.forms.layout.FormLayout
Determines the preferred size of the parent container using this form layout.
PROPERTY_AVERAGE_CHARACTER_WIDTH_TEST_STRING - Static variable in class com.jgoodies.forms.util.DefaultUnitConverter
 
PROPERTY_DEFAULT_DIALOG_FONT - Static variable in class com.jgoodies.forms.util.DefaultUnitConverter
 
PrototypeSize - Class in com.jgoodies.forms.layout
A Size implementation that computes its width and height by a prototype String.
PrototypeSize(String) - Constructor for class com.jgoodies.forms.layout.PrototypeSize
Constructs a PrototypeSize for the given String.
PT - Static variable in class com.jgoodies.forms.layout.ConstantSize
 
PX - Static variable in class com.jgoodies.forms.layout.ConstantSize
 

R

radioButtonBar(JRadioButton...) - Static method in class com.jgoodies.forms.factories.Forms
Builds and returns a panel where the given radio buttons are laid out in a row.
rc(int, int) - Static method in class com.jgoodies.forms.factories.CC
Sets row and column origins; sets height and width to 1; uses the default alignments.
rc(int, int, String) - Static method in class com.jgoodies.forms.factories.CC
Sets row and column origins; sets height and width to 1; decodes vertical and horizontal alignments from the given string.
rc(int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Static method in class com.jgoodies.forms.factories.CC
Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
rc(int, int) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets row and column origins; sets height and width to 1; uses the default alignments.
rc(int, int, String) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets row and column origins; sets height and width to 1; decodes vertical and horizontal alignments from the given string.
rc(int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
rchw(int, int, int, int) - Static method in class com.jgoodies.forms.factories.CC
Sets the row, column, height, and width; uses default alignments.
rchw(int, int, int, int, String) - Static method in class com.jgoodies.forms.factories.CC
Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
rchw(int, int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Static method in class com.jgoodies.forms.factories.CC
Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
rchw(int, int, int, int) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the row, column, height, and width; uses default alignments.
rchw(int, int, int, int, String) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
rchw(int, int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
rcw(int, int, int) - Static method in class com.jgoodies.forms.factories.CC
Sets the row, column, height, and width; uses a height (row span) of 1 and the vertical and horizontal default alignments.
rcw(int, int, int, String) - Static method in class com.jgoodies.forms.factories.CC
Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
rcw(int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Static method in class com.jgoodies.forms.factories.CC
Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
rcw(int, int, int) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the row, column, height, and width; uses a height (row span) of 1 and the vertical and horizontal default alignments.
rcw(int, int, int, String) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
rcw(int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
RELATED_GAP_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical horizontal gap between two related components.
RELATED_GAP_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical vertical gap between two related components.
removeColumn(int) - Method in class com.jgoodies.forms.layout.FormLayout
Removes the column with the given column index from the layout.
removeLayoutComponent(Component) - Method in class com.jgoodies.forms.layout.FormLayout
Removes the specified component from this layout.
removeRow(int) - Method in class com.jgoodies.forms.layout.FormLayout
Removes the row with the given row index from the layout.
right() - Method in class com.jgoodies.forms.factories.Borders.EmptyBorder
Returns this border's right size.
RIGHT - Static variable in class com.jgoodies.forms.factories.CC
 
RIGHT - Static variable in class com.jgoodies.forms.layout.CellConstraints
Put the component in the right.
RIGHT - Static variable in class com.jgoodies.forms.layout.ColumnSpec
By default put components in the right.
rowContainsComponent(Container, int) - Static method in class com.jgoodies.forms.extras.FormLayoutUtils
Checks and answers whether the given FormLayout container contains a component in the specified row.
rowContainsKey(String) - Method in class com.jgoodies.forms.layout.LayoutMap
Returns true if this map or a parent map - if any - contains a RowSpec mapping for the specified key.
rowGet(String) - Method in class com.jgoodies.forms.layout.LayoutMap
Looks up and returns the RowSpec associated with the given key.
rowGroupingEnabled(boolean) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Enables or disables the grouping of new data rows.
rowOrigins - Variable in class com.jgoodies.forms.layout.FormLayout.LayoutInfo
Holds the origins of the rows.
rowPut(String, String) - Method in class com.jgoodies.forms.layout.LayoutMap
 
rowPut(String, RowSpec) - Method in class com.jgoodies.forms.layout.LayoutMap
Associates the specified ColumnSpec with the specified key in this map.
rowPut(String, Size) - Method in class com.jgoodies.forms.layout.LayoutMap
 
rowRemove(String) - Method in class com.jgoodies.forms.layout.LayoutMap
Removes the row value mapping for this key from this map if it is present.
RowSpec - Class in com.jgoodies.forms.layout
Specifies rows in FormLayout by their default orientation, start size and resizing behavior.
RowSpec(FormSpec.DefaultAlignment, Size, double) - Constructor for class com.jgoodies.forms.layout.RowSpec
Constructs a RowSpec from the given default orientation, size, and resize weight.
RowSpec(Size) - Constructor for class com.jgoodies.forms.layout.RowSpec
Constructs a RowSpec for the given size using the default alignment, and no resizing.

S

setAlignment(CellConstraints.Alignment, CellConstraints.Alignment) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the horizontal and vertical alignment.
setAverageCharacterWidthTestString(String) - Method in class com.jgoodies.forms.util.DefaultUnitConverter
Sets a string that will be used to compute the average character width.
setBackground(Color) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Sets the panel's background color and makes the panel opaque.
setBorder(Border) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Sets the panel's border.
setBorder(Border) - Method in class com.jgoodies.forms.builder.PanelBuilder
Deprecated. Replaced by PanelBuilder.border(Border)
setBounds(int, int, int, int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the cell bounds (location and extent) to the given column, row, column span and row span.
setColumn(int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the cursor to the given column.
setColumnGroups(int[][]) - Method in class com.jgoodies.forms.layout.FormLayout
Sets the column groups, where each column in a group gets the same group wide width.
setColumnSpan(int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the cursor's column span.
setColumnSpec(int, ColumnSpec) - Method in class com.jgoodies.forms.layout.FormLayout
Sets the ColumnSpec at the specified column index.
setComponentFactory(ComponentFactory) - Method in class com.jgoodies.forms.builder.AbstractBuilder
Sets a new component factory for this builder, overriding the default as provided by AbstractBuilder.getComponentFactoryDefault().
setComponentFactoryDefault(ComponentFactory) - Static method in class com.jgoodies.forms.builder.AbstractBuilder
Sets the global default that is used to initialize the per-instance component factory.
setConstraints(Component, CellConstraints) - Method in class com.jgoodies.forms.layout.FormLayout
Sets the constraints for the specified component in this layout.
setCurrent(LayoutStyle) - Static method in class com.jgoodies.forms.util.LayoutStyle
Set a new LayoutStyle.
setDebugToolTipsEnabled(boolean) - Static method in class com.jgoodies.forms.builder.I15dPanelBuilder
Enables or disables the debug tool tips.
setDefaultButtonBarGapBorder() - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Sets a default border that has a gap in the bar's north.
setDefaultDialogBorder() - Method in class com.jgoodies.forms.builder.PanelBuilder
Deprecated. Replaced by #border(Borders.DIALOG)
setDefaultDialogFont(Font) - Method in class com.jgoodies.forms.util.DefaultUnitConverter
Sets a dialog font that will be used to compute the dialog base units.
setDefaultRowSpec(RowSpec) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Replaced by DefaultFormBuilder.defaultRowSpec(RowSpec)
setDefaultUnit(ConstantSize.Unit) - Static method in class com.jgoodies.forms.layout.Sizes
Sets the Unit that shall be used if an encoded ConstantSize provides no unit string.
setExtent(int, int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the cursor's extent to the given column span and row span.
setGridColor(Color) - Method in class com.jgoodies.forms.debug.FormDebugPanel
Sets the debug grid's color.
setHAlignment(CellConstraints.Alignment) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the horizontal alignment.
setHonorsVisibility(boolean) - Method in class com.jgoodies.forms.layout.FormLayout
Specifies whether invisible components shall be taken into account by this layout for computing the layout size and setting component bounds.
setHonorsVisibility(Component, Boolean) - Method in class com.jgoodies.forms.layout.FormLayout
Specifies whether the given component shall be taken into account for sizing and positioning.
setLabelFor(JLabel, Component) - Method in class com.jgoodies.forms.builder.PanelBuilder
Sets label as labeling label for component or an appropriate child.
setLabelForFeatureEnabledDefault(boolean) - Static method in class com.jgoodies.forms.builder.PanelBuilder
Sets the default value for the setLabelFor feature enablement.
setLeadingColumnOffset(int) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Replaced by DefaultFormBuilder.leadingColumnOffset(int)
setLeftToRight(boolean) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Sets the form fill direction to left-to-right or right-to-left.
setLeftToRight(boolean) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the form fill direction to left-to-right or right-to-left.
setLeftToRightButtonOrder(boolean) - Method in class com.jgoodies.forms.builder.ButtonBarBuilder2
Deprecated. Sets the order for button sequences to either left to right, or right to left.
setLineGapSize(ConstantSize) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Replaced by DefaultFormBuilder.lineGapSize(ConstantSize)
setOpaque(boolean) - Method in class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Sets the panel's opaque state.
setOpaque(boolean) - Method in class com.jgoodies.forms.builder.PanelBuilder
Deprecated. Replaced by PanelBuilder.opaque(boolean)
setOpaqueDefault(boolean) - Static method in class com.jgoodies.forms.builder.PanelBuilder
Sets the global default value for a builder's opaque state that can be overridden per builder.
setOrigin(int, int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the cursor's origin to the given column and row.
setPaintDiagonals(boolean) - Method in class com.jgoodies.forms.debug.FormDebugPanel
Enables or disables to paint the panel's diagonals.
setPaintInBackground(boolean) - Method in class com.jgoodies.forms.debug.FormDebugPanel
Specifies to paint in background or foreground.
setPaintRows(boolean) - Method in class com.jgoodies.forms.debug.FormDebugPanel
Enables or disables painting of rows.
setParagraphGapSize(ConstantSize) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Replaced by DefaultFormBuilder.lineGapSize(ConstantSize)
setRow(int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the cursor to the given row.
setRowGroupingEnabled(boolean) - Method in class com.jgoodies.forms.builder.DefaultFormBuilder
Deprecated. Replaced by DefaultFormBuilder.rowGroupingEnabled(boolean)
setRowGroups(int[][]) - Method in class com.jgoodies.forms.layout.FormLayout
Sets the row groups, where each row in such a group gets the same group wide height.
setRowSpan(int) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the cursor's row span.
setRowSpec(int, RowSpec) - Method in class com.jgoodies.forms.layout.FormLayout
Sets the RowSpec at the specified row index.
setUnitConverter(UnitConverter) - Static method in class com.jgoodies.forms.layout.Sizes
Sets a new UnitConverter that will be used to convert font-dependent sizes to pixel sizes.
setVAlignment(CellConstraints.Alignment) - Method in class com.jgoodies.forms.builder.AbstractFormBuilder
Sets the vertical alignment.
single(String, String, JComponent) - Static method in class com.jgoodies.forms.factories.Forms
 
Size - Interface in com.jgoodies.forms.layout
An interface that describes sizes as used by the FormLayout: component measuring sizes, constant sizes with value and unit, and bounded sizes that provide lower and upper bounds for a size.
sizeOf(Component) - Method in interface com.jgoodies.forms.layout.FormLayout.Measure
Computes and returns the size of the given Component.
Sizes - Class in com.jgoodies.forms.layout
Consists only of static methods that create and convert sizes as required by the FormLayout.

T

TABBED_DIALOG - Static variable in class com.jgoodies.forms.factories.Borders
A standardized Border that describes the border around a dialog content that uses tabs.
TABBED_DIALOG_BORDER - Static variable in class com.jgoodies.forms.factories.Borders
Deprecated. Replaced by Borders.TABBED_DIALOG
top() - Method in class com.jgoodies.forms.factories.Borders.EmptyBorder
Returns this border's top size.
TOP - Static variable in class com.jgoodies.forms.factories.CC
 
TOP - Static variable in class com.jgoodies.forms.layout.CellConstraints
Put the component in the top.
TOP - Static variable in class com.jgoodies.forms.layout.RowSpec
By default put the components in the top.
toShortString() - Method in class com.jgoodies.forms.layout.CellConstraints
Returns a short string representation of this constraints object.
toShortString(FormLayout) - Method in class com.jgoodies.forms.layout.CellConstraints
Returns a short string representation of this constraints object.
toShortString() - Method in class com.jgoodies.forms.layout.FormSpec
Returns a string representation of this form specification.
toString() - Method in class com.jgoodies.forms.layout.BoundedSize
Returns a string representation of this size object.
toString() - Method in class com.jgoodies.forms.layout.CellConstraints.Alignment
Returns this Alignment's name.
toString() - Method in class com.jgoodies.forms.layout.CellConstraints
Constructs and returns a string representation of this constraints object.
toString() - Method in class com.jgoodies.forms.layout.ConstantSize
Returns a string representation of this size object.
toString() - Method in class com.jgoodies.forms.layout.ConstantSize.Unit
Returns a string representation of this unit object.
toString() - Method in class com.jgoodies.forms.layout.FormSpec.DefaultAlignment
Returns this Alignment's name.
toString() - Method in class com.jgoodies.forms.layout.FormSpec
Returns a string representation of this form specification.
toString() - Method in class com.jgoodies.forms.layout.LayoutMap
Returns a string representation of this LayoutMap that lists the column and row associations.
toString() - Method in class com.jgoodies.forms.layout.PrototypeSize
Returns a string representation of this size object.
tryToBuildAFocusGroup(AbstractButton...) - Static method in class com.jgoodies.forms.internal.FocusTraversalUtilsAccessor
Tries to group the given buttons using the FocusTraversalUtils class - if available.

U

UnitConverter - Interface in com.jgoodies.forms.util
An interface that describes how to convert general sizes to pixel sizes.
UNRELATED_GAP_COLSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical horizontal gap between two unrelated components.
UNRELATED_GAP_ROWSPEC - Static variable in class com.jgoodies.forms.layout.FormSpecs
Describes a logical vertical gap between two unrelated components.

V

vAlign - Variable in class com.jgoodies.forms.layout.CellConstraints
Describes the component's vertical alignment.
vertical(String, JComponent...) - Static method in class com.jgoodies.forms.factories.Forms
 

X

xy(int, int) - Static method in class com.jgoodies.forms.factories.CC
Sets column and row origins; sets width and height to 1; uses the default alignments.
xy(int, int, String) - Static method in class com.jgoodies.forms.factories.CC
Sets column and row origins; sets width and height to 1; decodes horizontal and vertical alignments from the given string.
xy(int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Static method in class com.jgoodies.forms.factories.CC
Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
xy(int, int) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets column and row origins; sets width and height to 1; uses the default alignments.
xy(int, int, String) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets column and row origins; sets width and height to 1; decodes horizontal and vertical alignments from the given string.
xy(int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
xyw(int, int, int) - Static method in class com.jgoodies.forms.factories.CC
Sets the column, row, width, and height; uses a height (row span) of 1 and the horizontal and vertical default alignments.
xyw(int, int, int, String) - Static method in class com.jgoodies.forms.factories.CC
Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
xyw(int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Static method in class com.jgoodies.forms.factories.CC
Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
xyw(int, int, int) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the column, row, width, and height; uses a height (row span) of 1 and the horizontal and vertical default alignments.
xyw(int, int, int, String) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
xyw(int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
xywh(int, int, int, int) - Static method in class com.jgoodies.forms.factories.CC
Sets the column, row, width, and height; uses default alignments.
xywh(int, int, int, int, String) - Static method in class com.jgoodies.forms.factories.CC
Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
xywh(int, int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Static method in class com.jgoodies.forms.factories.CC
Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
xywh(int, int, int, int) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the column, row, width, and height; uses default alignments.
xywh(int, int, int, int, String) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
xywh(int, int, int, int, CellConstraints.Alignment, CellConstraints.Alignment) - Method in class com.jgoodies.forms.layout.CellConstraints
Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.

Z

ZERO - Static variable in class com.jgoodies.forms.layout.Sizes
 

A B C D E F G H I L M N O P R S T U V X Z

Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/constant-values.html0000644000175000017500000002416612003555424020737 0ustar tonytony Constant Field Values (JGoodies Forms 1.6 API)

Constant Field Values


Contents
com.jgoodies.*

com.jgoodies.forms.layout.FormSpec
public static final double DEFAULT_GROW 1.0
public static final double NO_GROW 0.0

com.jgoodies.forms.util.DefaultUnitConverter
public static final String BALANCED_AVERAGE_CHARACTER_TEST_STRING "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
public static final String MODERN_AVERAGE_CHARACTER_TEST_STRING "abcdefghijklmnopqrstuvwxyz0123456789"
public static final String OLD_AVERAGE_CHARACTER_TEST_STRING "X"
public static final String PROPERTY_AVERAGE_CHARACTER_WIDTH_TEST_STRING "averageCharacterWidthTestString"
public static final String PROPERTY_DEFAULT_DIALOG_FONT "defaultDialogFont"



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/stylesheet.css0000644000175000017500000000261412003555424017620 0ustar tonytony/* Javadoc style sheet */ /* Define colors, fonts and other style attributes here to override the defaults */ /* Page background color */ body { background-color: #FFFFFF; color:#000000 } /* Headings */ h1 { font-size: 145% } /* Table colors */ .TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ .TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ .TableRowColor { background: #FFFFFF; color:#000000 } /* White */ /* Font used in left-hand frame lists */ .FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } .FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } .FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } /* Navigation bar fonts and colors */ .NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ .NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ .NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} .NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} .NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} .NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} jgoodies-forms-1.6.0/docs/api/allclasses-frame.html0000644000175000017500000001655012003555424021025 0ustar tonytony All Classes (JGoodies Forms 1.6 API) All Classes
AbstractBuilder
AbstractButtonPanelBuilder
AbstractFormBuilder
AbstractUnitConverter
Borders
Borders.EmptyBorder
BoundedSize
ButtonBarBuilder
ButtonBarBuilder2
ButtonStackBuilder
CC
CellConstraints
CellConstraints.Alignment
ColumnSpec
ComponentFactory
ConstantSize
ConstantSize.Unit
DefaultComponentFactory
DefaultFormBuilder
DefaultUnitConverter
FocusTraversalUtilsAccessor
FormDebugPanel
FormDebugUtils
FormLayout
FormLayout.LayoutInfo
FormLayout.Measure
FormLayoutUtils
FormLayoutUtils.ConstraintIterator
Forms
FormSpec
FormSpec.DefaultAlignment
FormSpecParser
FormSpecParser.FormLayoutParseException
FormSpecs
FormUtils
I15dPanelBuilder
LayoutMap
LayoutStyle
ListViewBuilder
MacLayoutStyle
PanelBuilder
PrototypeSize
RowSpec
Size
Sizes
UnitConverter
jgoodies-forms-1.6.0/docs/api/com/0000755000175000017500000000000012003555422015466 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/0000755000175000017500000000000012003555422017271 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/0000755000175000017500000000000012003555424020421 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/0000755000175000017500000000000012003555424022400 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/package-frame.html0000644000175000017500000000333512003555424025755 0ustar tonytony com.jgoodies.forms.factories (JGoodies Forms 1.6 API) com.jgoodies.forms.factories
Interfaces 
ComponentFactory
Classes 
Borders
Borders.EmptyBorder
CC
DefaultComponentFactory
Forms
jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/Forms.html0000644000175000017500000006362712003555424024372 0ustar tonytony Forms (JGoodies Forms 1.6 API)

com.jgoodies.forms.factories
Class Forms

java.lang.Object
  extended by com.jgoodies.forms.factories.Forms

public class Forms
extends Object

Provides convenience behavior for building forms.

Version:
$Revision: 1.1 $
Author:
Karsten Lentzsch

Method Summary
static JComponent border(Border border, JComponent component)
           
static JComponent border(String emptyBorderSpec, JComponent component)
           
protected static JComponent buildGroupedButtonBar(AbstractButton... buttons)
          Builds and returns a button bar that consists of the given buttons.
static JComponent buttonBar(JComponent... buttons)
           
static JComponent centered(JComponent component)
           
static JComponent checkBoxBar(JCheckBox... checkBoxes)
          Builds and returns a panel where the given check boxes are laid out in a row.
static JComponent horizontal(String gapColSpec, JComponent... components)
           
static JComponent radioButtonBar(JRadioButton... radioButtons)
          Builds and returns a panel where the given radio buttons are laid out in a row.
static JComponent single(String columnSpec, String rowSpec, JComponent component)
           
static JComponent vertical(String gapRowSpec, JComponent... components)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

single

public static JComponent single(String columnSpec,
                                String rowSpec,
                                JComponent component)

centered

public static JComponent centered(JComponent component)

border

public static JComponent border(Border border,
                                JComponent component)

border

public static JComponent border(String emptyBorderSpec,
                                JComponent component)

horizontal

public static JComponent horizontal(String gapColSpec,
                                    JComponent... components)

vertical

public static JComponent vertical(String gapRowSpec,
                                  JComponent... components)

buttonBar

public static JComponent buttonBar(JComponent... buttons)

checkBoxBar

public static JComponent checkBoxBar(JCheckBox... checkBoxes)
Builds and returns a panel where the given check boxes are laid out in a row.

If class com.jgoodies.jsdl.common.focus.FocusTraversalUtils from the JSDL Common library is in the class path, it is used to group the radio buttons. Focus is transferred to/from the selected button in a group; and cursor-left/-right change the selection in the group.

Returns:
the built panel

radioButtonBar

public static JComponent radioButtonBar(JRadioButton... radioButtons)
Builds and returns a panel where the given radio buttons are laid out in a row.

If class com.jgoodies.jsdl.common.focus.FocusTraversalUtils from the JSDL Common library is in the class path, it is used to group the radio buttons. Focus is transferred to/from the selected button in a group; and cursor-left/-right change the selection in the group.

Returns:
the built panel

buildGroupedButtonBar

protected static JComponent buildGroupedButtonBar(AbstractButton... buttons)
Builds and returns a button bar that consists of the given buttons. Aims to build a focus group via the FocusTraversalUtils, if in the classpath.

Returns:
the built panel


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/DefaultComponentFactory.html0000644000175000017500000010032312003555424030064 0ustar tonytony DefaultComponentFactory (JGoodies Forms 1.6 API)

com.jgoodies.forms.factories
Class DefaultComponentFactory

java.lang.Object
  extended by com.jgoodies.forms.factories.DefaultComponentFactory
All Implemented Interfaces:
ComponentFactory

public class DefaultComponentFactory
extends Object
implements ComponentFactory

A singleton implementation of the ComponentFactory interface that creates UI components as required by the PanelBuilder.

The texts used in methods #createLabel(String) and #createTitle(String) can contain an optional mnemonic marker. The mnemonic and mnemonic index are indicated by a single ampersand (&). For example "&Save", or "Save &as". To use the ampersand itself duplicate it, for example "Look&&Feel".

Version:
$Revision: 1.21 $
Author:
Karsten Lentzsch

Constructor Summary
DefaultComponentFactory()
           
 
Method Summary
 JButton createButton(Action action)
          Creates and returns a button that is bound to the given Action.
 JLabel createHeaderLabel(String markedText)
          Creates and returns a label intended for pane headers that uses a larger font than the control font and a special foreground color.
 JLabel createLabel(String textWithMnemonic)
          Creates and returns a label with an optional mnemonic.
 JLabel createReadOnlyLabel(String textWithMnemonic)
          Creates and returns a label with an optional mnemonic that is intended to label a read-only component.
 JComponent createSeparator(JLabel label)
          Creates and returns a labeled separator.
 JComponent createSeparator(String textWithMnemonic)
          Creates and returns a labeled separator with the label in the left-hand side.
 JComponent createSeparator(String textWithMnemonic, int alignment)
          Creates and returns a labeled separator.
 JLabel createTitle(String textWithMnemonic)
          Creates and returns a title label that uses the foreground color and font of a TitledBorder.
static DefaultComponentFactory getInstance()
          Returns the sole instance of this factory class.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

DefaultComponentFactory

public DefaultComponentFactory()
Method Detail

getInstance

public static DefaultComponentFactory getInstance()
Returns the sole instance of this factory class.

Returns:
the sole instance of this factory class

createLabel

public JLabel createLabel(String textWithMnemonic)
Creates and returns a label with an optional mnemonic.

 createLabel("Name");       // No mnemonic
 createLabel("N&ame");      // Mnemonic is 'a'
 createLabel("Save &as");   // Mnemonic is the second 'a'
 createLabel("Look&&Feel"); // No mnemonic, text is Look&Feel
 

Specified by:
createLabel in interface ComponentFactory
Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
an label with optional mnemonic

createReadOnlyLabel

public JLabel createReadOnlyLabel(String textWithMnemonic)
Creates and returns a label with an optional mnemonic that is intended to label a read-only component.

 createReadOnlyLabel("Name");       // No mnemonic
 createReadOnlyLabel("N&ame");      // Mnemonic is 'a'
 createReadOnlyLabel("Save &as");   // Mnemonic is the second 'a'
 createReadOnlyLabel("Look&&Feel"); // No mnemonic, text is Look&Feel
 

Specified by:
createReadOnlyLabel in interface ComponentFactory
Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
an label with optional mnemonic intended for read-only components
Since:
1.3

createButton

public JButton createButton(Action action)
Creates and returns a button that is bound to the given Action. Useful to return customized buttons, for example, the JGoodies JGButton is bound to some custom Action properties.

This default implementation just returns a JButton.

Specified by:
createButton in interface ComponentFactory
Parameters:
action - provides [bound] visual properties for the button
Returns:
the created button
Since:
1.4

createTitle

public JLabel createTitle(String textWithMnemonic)
Creates and returns a title label that uses the foreground color and font of a TitledBorder.

 createTitle("Name");       // No mnemonic
 createTitle("N&ame");      // Mnemonic is 'a'
 createTitle("Save &as");   // Mnemonic is the second 'a'
 createTitle("Look&&Feel"); // No mnemonic, text is Look&Feel
 

Specified by:
createTitle in interface ComponentFactory
Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
an emphasized title label

createHeaderLabel

public JLabel createHeaderLabel(String markedText)
Description copied from interface: ComponentFactory
Creates and returns a label intended for pane headers that uses a larger font than the control font and a special foreground color. For example, on the Windows platform this method may use the font, size, and color of the TaskDialog main instruction as described by the MS User Experience Guide.

If the label text is marked with the mnemonic marker '&', the mnemonic and mnemonic index will be configured. For example if markedText is "&Charge Codes", the text will be set to "Charge Codes", the mnemonic is 'C', and the mnemonic index is 0.

A simple implementation may just delegate to ComponentFactory.createTitle(String).

Specified by:
createHeaderLabel in interface ComponentFactory
Parameters:
markedText - the label text with optional mnemonic marker
Returns:
a label intended for pane headers

createSeparator

public JComponent createSeparator(String textWithMnemonic)
Creates and returns a labeled separator with the label in the left-hand side. Useful to separate paragraphs in a panel; often a better choice than a TitledBorder.

 createSeparator("Name");       // No mnemonic
 createSeparator("N&ame");      // Mnemonic is 'a'
 createSeparator("Save &as");   // Mnemonic is the second 'a'
 createSeparator("Look&&Feel"); // No mnemonic, text is Look&Feel
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
a title label with separator on the side

createSeparator

public JComponent createSeparator(String textWithMnemonic,
                                  int alignment)
Creates and returns a labeled separator. Useful to separate paragraphs in a panel, which is often a better choice than a TitledBorder.

 final int LEFT = SwingConstants.LEFT;
 createSeparator("Name",       LEFT); // No mnemonic
 createSeparator("N&ame",      LEFT); // Mnemonic is 'a'
 createSeparator("Save &as",   LEFT); // Mnemonic is the second 'a'
 createSeparator("Look&&Feel", LEFT); // No mnemonic, text is Look&Feel
 

Specified by:
createSeparator in interface ComponentFactory
Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
alignment - text alignment, one of SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.RIGHT
Returns:
a separator with title label

createSeparator

public JComponent createSeparator(JLabel label)
Creates and returns a labeled separator. Useful to separate paragraphs in a panel, which is often a better choice than a TitledBorder.

The label's position is determined by the label's horizontal alignment, which must be one of: SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.RIGHT.

TODO: Since this method has been marked public in version 1.0.6, we need to precisely describe the semantic of this method.

TODO: Check if we can relax the constraint for the label alignment and also accept LEADING and TRAILING.

Parameters:
label - the title label component
Returns:
a separator with title label
Throws:
NullPointerException - if the label is null
IllegalArgumentException - if the label's horizontal alignment is not one of: SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.RIGHT.
Since:
1.0.6


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/CC.html0000644000175000017500000016252212003555424023563 0ustar tonytony CC (JGoodies Forms 1.6 API)

com.jgoodies.forms.factories
Class CC

java.lang.Object
  extended by com.jgoodies.forms.factories.CC
All Implemented Interfaces:
Serializable, Cloneable

public final class CC
extends Object
implements Cloneable, Serializable

A factory for CellConstraints objects. Examples:
The following cell constraints locate a component in the third column of the fifth row; column and row span are 1; the component will be aligned with the column's right-hand side and the row's bottom.

 CC.xy  (3, 5);
 CC.xy  (3, 5, CC.RIGHT, CC.BOTTOM);
 CC.xy  (3, 5, "right, bottom");

 CC.xyw (3, 5, 1);
 CC.xyw (3, 5, 1, CC.RIGHT, CC.BOTTOM);
 CC.xyw (3, 5, 1, "right, bottom");

 CC.xywh(3, 5, 1, 1);
 CC.xywh(3, 5, 1, 1, CC.RIGHT, CC.BOTTOM);
 CC.xywh(3, 5, 1, 1, "right, bottom");
 
See also the examples in the FormLayout class comment.

Since:
1.3
Version:
$Revision: 1.4 $
Author:
Karsten Lentzsch
See Also:
Serialized Form

Field Summary
static CellConstraints.Alignment BOTTOM
           
static CellConstraints.Alignment CENTER
           
static CellConstraints.Alignment DEFAULT
           
static CellConstraints.Alignment FILL
           
static CellConstraints.Alignment LEFT
           
static CellConstraints.Alignment RIGHT
           
static CellConstraints.Alignment TOP
           
 
Constructor Summary
CC()
           
 
Method Summary
static CellConstraints rc(int row, int col)
          Sets row and column origins; sets height and width to 1; uses the default alignments.
static CellConstraints rc(int row, int col, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
static CellConstraints rc(int row, int col, String encodedAlignments)
          Sets row and column origins; sets height and width to 1; decodes vertical and horizontal alignments from the given string.
static CellConstraints rchw(int row, int col, int rowSpan, int colSpan)
          Sets the row, column, height, and width; uses default alignments.
static CellConstraints rchw(int row, int col, int rowSpan, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
static CellConstraints rchw(int row, int col, int rowSpan, int colSpan, String encodedAlignments)
          Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
static CellConstraints rcw(int row, int col, int colSpan)
          Sets the row, column, height, and width; uses a height (row span) of 1 and the vertical and horizontal default alignments.
static CellConstraints rcw(int row, int col, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
static CellConstraints rcw(int row, int col, int colSpan, String encodedAlignments)
          Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
static CellConstraints xy(int col, int row)
          Sets column and row origins; sets width and height to 1; uses the default alignments.
static CellConstraints xy(int col, int row, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
static CellConstraints xy(int col, int row, String encodedAlignments)
          Sets column and row origins; sets width and height to 1; decodes horizontal and vertical alignments from the given string.
static CellConstraints xyw(int col, int row, int colSpan)
          Sets the column, row, width, and height; uses a height (row span) of 1 and the horizontal and vertical default alignments.
static CellConstraints xyw(int col, int row, int colSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
static CellConstraints xyw(int col, int row, int colSpan, String encodedAlignments)
          Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
static CellConstraints xywh(int col, int row, int colSpan, int rowSpan)
          Sets the column, row, width, and height; uses default alignments.
static CellConstraints xywh(int col, int row, int colSpan, int rowSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
static CellConstraints xywh(int col, int row, int colSpan, int rowSpan, String encodedAlignments)
          Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT

public static final CellConstraints.Alignment DEFAULT

FILL

public static final CellConstraints.Alignment FILL

LEFT

public static final CellConstraints.Alignment LEFT

RIGHT

public static final CellConstraints.Alignment RIGHT

CENTER

public static final CellConstraints.Alignment CENTER

TOP

public static final CellConstraints.Alignment TOP

BOTTOM

public static final CellConstraints.Alignment BOTTOM
Constructor Detail

CC

public CC()
Method Detail

xy

public static CellConstraints xy(int col,
                                 int row)
Sets column and row origins; sets width and height to 1; uses the default alignments.

Examples:

 CC.xy(1, 1);
 CC.xy(1, 3);
 

Parameters:
col - the new column index
row - the new row index
Returns:
this

xy

public static CellConstraints xy(int col,
                                 int row,
                                 String encodedAlignments)
Sets column and row origins; sets width and height to 1; decodes horizontal and vertical alignments from the given string.

Examples:

 CC.xy(1, 3, "left, bottom");
 CC.xy(1, 3, "l, b");
 CC.xy(1, 3, "center, fill");
 CC.xy(1, 3, "c, f");
 

Parameters:
col - the new column index
row - the new row index
encodedAlignments - describes the horizontal and vertical alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

xy

public static CellConstraints xy(int col,
                                 int row,
                                 CellConstraints.Alignment colAlign,
                                 CellConstraints.Alignment rowAlign)
Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.

Examples:

 CC.xy(1, 3, CellConstraints.LEFT,   CellConstraints.BOTTOM);
 CC.xy(1, 3, CellConstraints.CENTER, CellConstraints.FILL);
 

Parameters:
col - the new column index
row - the new row index
colAlign - horizontal component alignment
rowAlign - vertical component alignment
Returns:
this

xyw

public static CellConstraints xyw(int col,
                                  int row,
                                  int colSpan)
Sets the column, row, width, and height; uses a height (row span) of 1 and the horizontal and vertical default alignments.

Examples:

 CC.xyw(1, 3, 7);
 CC.xyw(1, 3, 2);
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
Returns:
this

xyw

public static CellConstraints xyw(int col,
                                  int row,
                                  int colSpan,
                                  String encodedAlignments)
Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string. The row span (height) is set to 1.

Examples:

 CC.xyw(1, 3, 7, "left, bottom");
 CC.xyw(1, 3, 7, "l, b");
 CC.xyw(1, 3, 2, "center, fill");
 CC.xyw(1, 3, 2, "c, f");
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
encodedAlignments - describes the horizontal and vertical alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

xyw

public static CellConstraints xyw(int col,
                                  int row,
                                  int colSpan,
                                  CellConstraints.Alignment colAlign,
                                  CellConstraints.Alignment rowAlign)
Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects. The row span (height) is set to 1.

Examples:

 CC.xyw(1, 3, 2, CellConstraints.LEFT,   CellConstraints.BOTTOM);
 CC.xyw(1, 3, 7, CellConstraints.CENTER, CellConstraints.FILL);
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
colAlign - horizontal component alignment
rowAlign - vertical component alignment
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

xywh

public static CellConstraints xywh(int col,
                                   int row,
                                   int colSpan,
                                   int rowSpan)
Sets the column, row, width, and height; uses default alignments.

Examples:

 CC.xywh(1, 3, 2, 1);
 CC.xywh(1, 3, 7, 3);
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
rowSpan - the row span or grid height
Returns:
this

xywh

public static CellConstraints xywh(int col,
                                   int row,
                                   int colSpan,
                                   int rowSpan,
                                   String encodedAlignments)
Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.

Examples:

 CC.xywh(1, 3, 2, 1, "left, bottom");
 CC.xywh(1, 3, 2, 1, "l, b");
 CC.xywh(1, 3, 7, 3, "center, fill");
 CC.xywh(1, 3, 7, 3, "c, f");
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
rowSpan - the row span or grid height
encodedAlignments - describes the horizontal and vertical alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

xywh

public static CellConstraints xywh(int col,
                                   int row,
                                   int colSpan,
                                   int rowSpan,
                                   CellConstraints.Alignment colAlign,
                                   CellConstraints.Alignment rowAlign)
Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.

Examples:

 CC.xywh(1, 3, 2, 1, CellConstraints.LEFT,   CellConstraints.BOTTOM);
 CC.xywh(1, 3, 7, 3, CellConstraints.CENTER, CellConstraints.FILL);
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
rowSpan - the row span or grid height
colAlign - horizontal component alignment
rowAlign - vertical component alignment
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

rc

public static CellConstraints rc(int row,
                                 int col)
Sets row and column origins; sets height and width to 1; uses the default alignments.

Examples:

 CC.rc(1, 1);
 CC.rc(3, 1);
 

Parameters:
row - the new row index
col - the new column index
Returns:
this

rc

public static CellConstraints rc(int row,
                                 int col,
                                 String encodedAlignments)
Sets row and column origins; sets height and width to 1; decodes vertical and horizontal alignments from the given string.

Examples:

 CC.rc(3, 1, "bottom, left");
 CC.rc(3, 1, "b, l");
 CC.rc(3, 1, "fill, center");
 CC.rc(3, 1, "f, c");
 

Parameters:
row - the new row index
col - the new column index
encodedAlignments - describes the vertical and horizontal alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

rc

public static CellConstraints rc(int row,
                                 int col,
                                 CellConstraints.Alignment rowAlign,
                                 CellConstraints.Alignment colAlign)
Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.

Examples:

 CC.rc(3, 1, CellConstraints.BOTTOM, CellConstraints.LEFT);
 CC.rc(3, 1, CellConstraints.FILL,   CellConstraints.CENTER);
 

Parameters:
row - the new row index
col - the new column index
rowAlign - vertical component alignment
colAlign - horizontal component alignment
Returns:
this

rcw

public static CellConstraints rcw(int row,
                                  int col,
                                  int colSpan)
Sets the row, column, height, and width; uses a height (row span) of 1 and the vertical and horizontal default alignments.

Examples:

 CC.rcw(3, 1, 7);
 CC.rcw(3, 1, 2);
 

Parameters:
row - the new row index
col - the new column index
colSpan - the column span or grid width
Returns:
this

rcw

public static CellConstraints rcw(int row,
                                  int col,
                                  int colSpan,
                                  String encodedAlignments)
Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string. The row span (height) is set to 1.

Examples:

 CC.rcw(3, 1, 7, "bottom, left");
 CC.rcw(3, 1, 7, "b, l");
 CC.rcw(3, 1, 2, "fill, center");
 CC.rcw(3, 1, 2, "f, c");
 

Parameters:
row - the new row index
col - the new column index
colSpan - the column span or grid width
encodedAlignments - describes the vertical and horizontal alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

rcw

public static CellConstraints rcw(int row,
                                  int col,
                                  int colSpan,
                                  CellConstraints.Alignment rowAlign,
                                  CellConstraints.Alignment colAlign)
Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects. The row span (height) is set to 1.

Examples:

 CC.rcw(3, 1, 2, CellConstraints.BOTTOM, CellConstraints.LEFT);
 CC.rcw(3, 1, 7, CellConstraints.FILL,   CellConstraints.CENTER);
 

Parameters:
row - the new row index
col - the new column index
colSpan - the column span or grid width
rowAlign - vertical component alignment
colAlign - horizontal component alignment
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

rchw

public static CellConstraints rchw(int row,
                                   int col,
                                   int rowSpan,
                                   int colSpan)
Sets the row, column, height, and width; uses default alignments.

Examples:

 CC.rchw(1, 3, 2, 1);
 CC.rchw(1, 3, 7, 3);
 

Parameters:
row - the new row index
col - the new column index
rowSpan - the row span or grid height
colSpan - the column span or grid width
Returns:
this

rchw

public static CellConstraints rchw(int row,
                                   int col,
                                   int rowSpan,
                                   int colSpan,
                                   String encodedAlignments)
Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.

Examples:

 CC.rchw(3, 1, 1, 2, "bottom, left");
 CC.rchw(3, 1, 1, 2, "b, l");
 CC.rchw(3, 1, 3, 7, "fill, center");
 CC.rchw(3, 1, 3, 7, "f, c");
 

Parameters:
row - the new row index
col - the new column index
rowSpan - the row span or grid height
colSpan - the column span or grid width
encodedAlignments - describes the vertical and horizontal alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

rchw

public static CellConstraints rchw(int row,
                                   int col,
                                   int rowSpan,
                                   int colSpan,
                                   CellConstraints.Alignment rowAlign,
                                   CellConstraints.Alignment colAlign)
Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.

Examples:

 CC.rchw(3, 1, 1, 2, CellConstraints.BOTTOM, CellConstraints.LEFT);
 CC.rchw(3, 1, 3, 7, CellConstraints.FILL,   CellConstraints.CENTER);
 

Parameters:
row - the new row index
col - the new column index
rowSpan - the row span or grid height
colSpan - the column span or grid width
rowAlign - vertical component alignment
colAlign - horizontal component alignment
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/Borders.html0000644000175000017500000011722012003555424024671 0ustar tonytony Borders (JGoodies Forms 1.6 API)

com.jgoodies.forms.factories
Class Borders

java.lang.Object
  extended by com.jgoodies.forms.factories.Borders

public final class Borders
extends Object

Provides constants and factory methods for Borders that use instances of ConstantSize to define the margins.

Examples:

 Borders.DLU2
 Borders.createEmptyBorder(Sizes.DLUY4, Sizes.DLUX2, Sizes.DLUY4, Sizes.DLUX2);
 Borders.createEmptyBorder("4dlu, 2dlu, 4dlu, 2dlu");
 

Version:
$Revision: 1.14 $
Author:
Karsten Lentzsch
See Also:
Borders.EmptyBorder, Sizes

Nested Class Summary
static class Borders.EmptyBorder
          An empty border that uses 4 instances of ConstantSize to define the top, left, bottom and right gap.
 
Field Summary
static Border BUTTON_BAR_GAP_BORDER
          Deprecated. Replaced by BUTTON_BAR_PAD
static Border BUTTON_BAR_PAD
          A standardized Border that describes the gap between a component and a button bar in its bottom.
static Border DIALOG
          A standardized Border that describes the border around a dialog content that has no tabs.
static Border DIALOG_BORDER
          Deprecated. Replaced by DIALOG
static Border DLU14
          A prepared Border with 14dlu on all sides.
static Border DLU14_BORDER
          Deprecated. Replaced by DLU14
static Border DLU2
          A prepared and reusable Border with 2dlu on all sides.
static Border DLU2_BORDER
          Deprecated. Replaced by DLU2
static Border DLU21
          A prepared Border with 21dlu on all sides.
static Border DLU21_BORDER
          Deprecated. Replaced by DLU21
static Border DLU4
          A prepared and reusable Border with 4dlu on all sides.
static Border DLU4_BORDER
          Deprecated. Replaced by DLU4
static Border DLU7
          A prepared and reusable Border with 7dlu on all sides.
static Border DLU7_BORDER
          Deprecated. Replaced by DLU7
static Border DLU9
          A prepared and reusable Border with 9dlu on all sides.
static Border EMPTY
          A prepared and reusable EmptyBorder without gaps.
static Border EMPTY_BORDER
          Deprecated. Replaced by EMPTY
static Border TABBED_DIALOG
          A standardized Border that describes the border around a dialog content that uses tabs.
static Border TABBED_DIALOG_BORDER
          Deprecated. Replaced by TABBED_DIALOG
 
Method Summary
static Border createEmptyBorder(ConstantSize top, ConstantSize left, ConstantSize bottom, ConstantSize right)
          Creates and returns an EmptyBorder with the specified gaps.
static Border createEmptyBorder(String encodedSizes)
          Creates and returns a Border using sizes as specified by the given string.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

EMPTY

public static final Border EMPTY
A prepared and reusable EmptyBorder without gaps.


DLU2

public static final Border DLU2
A prepared and reusable Border with 2dlu on all sides.


DLU4

public static final Border DLU4
A prepared and reusable Border with 4dlu on all sides.


DLU7

public static final Border DLU7
A prepared and reusable Border with 7dlu on all sides.


DLU9

public static final Border DLU9
A prepared and reusable Border with 9dlu on all sides.

Since:
1.6

DLU14

public static final Border DLU14
A prepared Border with 14dlu on all sides.


DLU21

public static final Border DLU21
A prepared Border with 21dlu on all sides.

Since:
1.2

BUTTON_BAR_PAD

public static final Border BUTTON_BAR_PAD
A standardized Border that describes the gap between a component and a button bar in its bottom.


DIALOG

public static final Border DIALOG
A standardized Border that describes the border around a dialog content that has no tabs.

See Also:
TABBED_DIALOG

TABBED_DIALOG

public static final Border TABBED_DIALOG
A standardized Border that describes the border around a dialog content that uses tabs.

See Also:
DIALOG

EMPTY_BORDER

@Deprecated
public static final Border EMPTY_BORDER
Deprecated. Replaced by EMPTY
A prepared and reusable EmptyBorder without gaps.


DLU2_BORDER

@Deprecated
public static final Border DLU2_BORDER
Deprecated. Replaced by DLU2
A prepared and reusable Border with 2dlu on all sides.


DLU4_BORDER

@Deprecated
public static final Border DLU4_BORDER
Deprecated. Replaced by DLU4
A prepared and reusable Border with 4dlu on all sides.


DLU7_BORDER

@Deprecated
public static final Border DLU7_BORDER
Deprecated. Replaced by DLU7
A prepared and reusable Border with 7dlu on all sides.


DLU14_BORDER

@Deprecated
public static final Border DLU14_BORDER
Deprecated. Replaced by DLU14
A prepared Border with 14dlu on all sides.


DLU21_BORDER

@Deprecated
public static final Border DLU21_BORDER
Deprecated. Replaced by DLU21
A prepared Border with 21dlu on all sides.

Since:
1.2

BUTTON_BAR_GAP_BORDER

@Deprecated
public static final Border BUTTON_BAR_GAP_BORDER
Deprecated. Replaced by BUTTON_BAR_PAD
A standardized Border that describes the gap between a component and a button bar in its bottom.


DIALOG_BORDER

@Deprecated
public static final Border DIALOG_BORDER
Deprecated. Replaced by DIALOG
A standardized Border that describes the border around a dialog content that has no tabs.

See Also:
TABBED_DIALOG

TABBED_DIALOG_BORDER

@Deprecated
public static final Border TABBED_DIALOG_BORDER
Deprecated. Replaced by TABBED_DIALOG
A standardized Border that describes the border around a dialog content that uses tabs.

See Also:
DIALOG
Method Detail

createEmptyBorder

public static Border createEmptyBorder(ConstantSize top,
                                       ConstantSize left,
                                       ConstantSize bottom,
                                       ConstantSize right)
Creates and returns an EmptyBorder with the specified gaps.

Parameters:
top - the top gap
left - the left-hand side gap
bottom - the bottom gap
right - the right-hand side gap
Returns:
an EmptyBorder with the specified gaps
Throws:
NullPointerException - if top, left, bottom, or right is null
See Also:
createEmptyBorder(String)

createEmptyBorder

public static Border createEmptyBorder(String encodedSizes)
Creates and returns a Border using sizes as specified by the given string. This string is a comma-separated encoding of 4 ConstantSizes.

Parameters:
encodedSizes - top, left, bottom, right gap encoded as String
Returns:
an EmptyBorder with the specified gaps
See Also:
createEmptyBorder(ConstantSize, ConstantSize, ConstantSize, ConstantSize)


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/package-tree.html0000644000175000017500000002072312003555424025622 0ustar tonytony com.jgoodies.forms.factories Class Hierarchy (JGoodies Forms 1.6 API)

Hierarchy For Package com.jgoodies.forms.factories

Package Hierarchies:
All Packages

Class Hierarchy

Interface Hierarchy



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/package-use.html0000644000175000017500000002205312003555424025455 0ustar tonytony Uses of Package com.jgoodies.forms.factories (JGoodies Forms 1.6 API)

Uses of Package
com.jgoodies.forms.factories

Packages that use com.jgoodies.forms.factories
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.factories Consists of optional Forms framework factory classes that assist you in building consistent forms quickly 
 

Classes in com.jgoodies.forms.factories used by com.jgoodies.forms.builder
ComponentFactory
          An interface that defines the factory methods as used by the PanelBuilder and its subclasses.
 

Classes in com.jgoodies.forms.factories used by com.jgoodies.forms.factories
ComponentFactory
          An interface that defines the factory methods as used by the PanelBuilder and its subclasses.
DefaultComponentFactory
          A singleton implementation of the ComponentFactory interface that creates UI components as required by the PanelBuilder.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/class-use/0000755000175000017500000000000012003555424024277 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/class-use/Forms.html0000644000175000017500000001376612003555424026270 0ustar tonytony Uses of Class com.jgoodies.forms.factories.Forms (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.factories.Forms

No usage of com.jgoodies.forms.factories.Forms



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/class-use/DefaultComponentFactory.html0000644000175000017500000002053112003555424031765 0ustar tonytony Uses of Class com.jgoodies.forms.factories.DefaultComponentFactory (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.factories.DefaultComponentFactory

Packages that use DefaultComponentFactory
com.jgoodies.forms.factories Consists of optional Forms framework factory classes that assist you in building consistent forms quickly 
 

Uses of DefaultComponentFactory in com.jgoodies.forms.factories
 

Methods in com.jgoodies.forms.factories that return DefaultComponentFactory
static DefaultComponentFactory DefaultComponentFactory.getInstance()
          Returns the sole instance of this factory class.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/class-use/CC.html0000644000175000017500000001373012003555424025456 0ustar tonytony Uses of Class com.jgoodies.forms.factories.CC (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.factories.CC

No usage of com.jgoodies.forms.factories.CC



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/class-use/Borders.html0000644000175000017500000001401212003555424026563 0ustar tonytony Uses of Class com.jgoodies.forms.factories.Borders (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.factories.Borders

No usage of com.jgoodies.forms.factories.Borders



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/class-use/ComponentFactory.html0000644000175000017500000003470112003555424030464 0ustar tonytony Uses of Interface com.jgoodies.forms.factories.ComponentFactory (JGoodies Forms 1.6 API)

Uses of Interface
com.jgoodies.forms.factories.ComponentFactory

Packages that use ComponentFactory
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.factories Consists of optional Forms framework factory classes that assist you in building consistent forms quickly 
 

Uses of ComponentFactory in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder that return ComponentFactory
protected  ComponentFactory AbstractBuilder.createComponentFactory()
          Invoked when the per-instance component factory is lazily initialized.
 ComponentFactory AbstractBuilder.getComponentFactory()
          Returns this builder's component factory.
static ComponentFactory AbstractBuilder.getComponentFactoryDefault()
          Returns the factory that is used as default for new builder's as they are created.
 

Methods in com.jgoodies.forms.builder with parameters of type ComponentFactory
 void AbstractBuilder.setComponentFactory(ComponentFactory newFactory)
          Sets a new component factory for this builder, overriding the default as provided by AbstractBuilder.getComponentFactoryDefault().
static void AbstractBuilder.setComponentFactoryDefault(ComponentFactory factory)
          Sets the global default that is used to initialize the per-instance component factory.
 

Constructors in com.jgoodies.forms.builder with parameters of type ComponentFactory
ListViewBuilder(ComponentFactory factory)
          Constructs a ListViewBuilder using the given component factory.
 

Uses of ComponentFactory in com.jgoodies.forms.factories
 

Classes in com.jgoodies.forms.factories that implement ComponentFactory
 class DefaultComponentFactory
          A singleton implementation of the ComponentFactory interface that creates UI components as required by the PanelBuilder.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/class-use/Borders.EmptyBorder.html0000644000175000017500000001420212003555424031017 0ustar tonytony Uses of Class com.jgoodies.forms.factories.Borders.EmptyBorder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.factories.Borders.EmptyBorder

No usage of com.jgoodies.forms.factories.Borders.EmptyBorder



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/package-summary.html0000644000175000017500000002402012003555424026352 0ustar tonytony com.jgoodies.forms.factories (JGoodies Forms 1.6 API)

Package com.jgoodies.forms.factories

Consists of optional Forms framework factory classes that assist you in building consistent forms quickly

See:
          Description

Interface Summary
ComponentFactory An interface that defines the factory methods as used by the PanelBuilder and its subclasses.
 

Class Summary
Borders Provides constants and factory methods for Borders that use instances of ConstantSize to define the margins.
Borders.EmptyBorder An empty border that uses 4 instances of ConstantSize to define the top, left, bottom and right gap.
CC A factory for CellConstraints objects.
DefaultComponentFactory A singleton implementation of the ComponentFactory interface that creates UI components as required by the PanelBuilder.
Forms Provides convenience behavior for building forms.
 

Package com.jgoodies.forms.factories Description

Consists of optional Forms framework factory classes that assist you in building consistent forms quickly.

Related Documentation

For more information see:

See Also:
com.jgoodies.forms.layout, com.jgoodies.forms.builder


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/ComponentFactory.html0000644000175000017500000005060212003555424026563 0ustar tonytony ComponentFactory (JGoodies Forms 1.6 API)

com.jgoodies.forms.factories
Interface ComponentFactory

All Known Implementing Classes:
DefaultComponentFactory

public interface ComponentFactory

An interface that defines the factory methods as used by the PanelBuilder and its subclasses.

The String arguments passed to the methods #createLabel(String), #createTitle(String), and #createSeparator(String, int) can contain an optional mnemonic marker. The mnemonic and mnemonic index are indicated by a single ampersand (&). For example "&Save", or "Save &as". To use the ampersand itself duplicate it, for example "Look&&Feel".

Version:
$Revision: 1.10 $
Author:
Karsten Lentzsch
See Also:
DefaultComponentFactory, PanelBuilder

Method Summary
 JButton createButton(Action action)
          Creates and returns a button that is bound to the given Action.
 JLabel createHeaderLabel(String markedText)
          Creates and returns a label intended for pane headers that uses a larger font than the control font and a special foreground color.
 JLabel createLabel(String textWithMnemonic)
          Creates and returns a label with an optional mnemonic.
 JLabel createReadOnlyLabel(String textWithMnemonic)
          Creates and returns a label with an optional mnemonic that is intended to label a read-only component.
 JComponent createSeparator(String textWithMnemonic, int alignment)
          Creates and returns a labeled separator.
 JLabel createTitle(String textWithMnemonic)
          Creates and returns a title label that uses the foreground color and font of a TitledBorder.
 

Method Detail

createButton

JButton createButton(Action action)
Creates and returns a button that is bound to the given Action. Useful to return customized buttons, for example, the JGoodies JGButton is bound to some custom Action properties.

Parameters:
action - provides [bound] visual properties for the button
Returns:
the created button
Since:
1.4

createLabel

JLabel createLabel(String textWithMnemonic)
Creates and returns a label with an optional mnemonic.

 createLabel("Name");       // No mnemonic
 createLabel("N&ame");      // Mnemonic is 'a'
 createLabel("Save &as");   // Mnemonic is the second 'a'
 createLabel("Look&&Feel"); // No mnemonic, text is Look&Feel
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
an label with optional mnemonic

createReadOnlyLabel

JLabel createReadOnlyLabel(String textWithMnemonic)
Creates and returns a label with an optional mnemonic that is intended to label a read-only component.

 createReadOnlyLabel("Name");       // No mnemonic
 createReadOnlyLabel("N&ame");      // Mnemonic is 'a'
 createReadOnlyLabel("Save &as");   // Mnemonic is the second 'a'
 createReadOnlyLabel("Look&&Feel"); // No mnemonic, text is Look&Feel
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
an label with optional mnemonic intended for read-only components
Since:
1.3

createTitle

JLabel createTitle(String textWithMnemonic)
Creates and returns a title label that uses the foreground color and font of a TitledBorder.

 createTitle("Name");       // No mnemonic
 createTitle("N&ame");      // Mnemonic is 'a'
 createTitle("Save &as");   // Mnemonic is the second 'a'
 createTitle("Look&&Feel"); // No mnemonic, text is Look&Feel
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
an emphasized title label

createHeaderLabel

JLabel createHeaderLabel(String markedText)
Creates and returns a label intended for pane headers that uses a larger font than the control font and a special foreground color. For example, on the Windows platform this method may use the font, size, and color of the TaskDialog main instruction as described by the MS User Experience Guide.

If the label text is marked with the mnemonic marker '&', the mnemonic and mnemonic index will be configured. For example if markedText is "&Charge Codes", the text will be set to "Charge Codes", the mnemonic is 'C', and the mnemonic index is 0.

A simple implementation may just delegate to createTitle(String).

Parameters:
markedText - the label text with optional mnemonic marker
Returns:
a label intended for pane headers
Since:
1.6

createSeparator

JComponent createSeparator(String textWithMnemonic,
                           int alignment)
Creates and returns a labeled separator. Useful to separate paragraphs in a panel, which is often a better choice than a TitledBorder.

 final int LEFT = SwingConstants.LEFT;
 createSeparator("Name",       LEFT); // No mnemonic
 createSeparator("N&ame",      LEFT); // Mnemonic is 'a'
 createSeparator("Save &as",   LEFT); // Mnemonic is the second 'a'
 createSeparator("Look&&Feel", LEFT); // No mnemonic, text is Look&Feel
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
alignment - text alignment, one of SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.RIGHT
Returns:
a title label with separator on the side


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/factories/Borders.EmptyBorder.html0000644000175000017500000005273212003555424027132 0ustar tonytony Borders.EmptyBorder (JGoodies Forms 1.6 API)

com.jgoodies.forms.factories
Class Borders.EmptyBorder

java.lang.Object
  extended by javax.swing.border.AbstractBorder
      extended by com.jgoodies.forms.factories.Borders.EmptyBorder
All Implemented Interfaces:
Serializable, Border
Enclosing class:
Borders

public static final class Borders.EmptyBorder
extends AbstractBorder

An empty border that uses 4 instances of ConstantSize to define the top, left, bottom and right gap.

See Also:
Serialized Form

Method Summary
 ConstantSize bottom()
          Returns this border's bottom size.
 Insets getBorderInsets(Component c)
          Returns the insets of the border.
 Insets getBorderInsets(Component c, Insets insets)
          Returns the insets of the border.
 ConstantSize left()
          Returns this border's left size.
 ConstantSize right()
          Returns this border's right size.
 ConstantSize top()
          Returns this border's top size.
 
Methods inherited from class javax.swing.border.AbstractBorder
getBaseline, getBaselineResizeBehavior, getInteriorRectangle, getInteriorRectangle, isBorderOpaque, paintBorder
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

getBorderInsets

public Insets getBorderInsets(Component c,
                              Insets insets)
Returns the insets of the border.

Overrides:
getBorderInsets in class AbstractBorder
Parameters:
c - the component for which this border insets value applies
insets - the insets to be reinitialized
Returns:
the insets object

getBorderInsets

public Insets getBorderInsets(Component c)
Returns the insets of the border.

Specified by:
getBorderInsets in interface Border
Overrides:
getBorderInsets in class AbstractBorder
Parameters:
c - the component for which this border insets value applies
Returns:
the border's Insets

top

public ConstantSize top()
Returns this border's top size.

Returns:
this border's top size

left

public ConstantSize left()
Returns this border's left size.

Returns:
this border's left size

bottom

public ConstantSize bottom()
Returns this border's bottom size.

Returns:
this border's bottom size

right

public ConstantSize right()
Returns this border's right size.

Returns:
this border's right size


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/internal/0000755000175000017500000000000012003555424022235 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/internal/package-frame.html0000644000175000017500000000173612003555424025615 0ustar tonytony com.jgoodies.forms.internal (JGoodies Forms 1.6 API) com.jgoodies.forms.internal
Classes 
FocusTraversalUtilsAccessor
jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/internal/FocusTraversalUtilsAccessor.html0000644000175000017500000002721112003555424030575 0ustar tonytony FocusTraversalUtilsAccessor (JGoodies Forms 1.6 API)

com.jgoodies.forms.internal
Class FocusTraversalUtilsAccessor

java.lang.Object
  extended by com.jgoodies.forms.internal.FocusTraversalUtilsAccessor

public final class FocusTraversalUtilsAccessor
extends Object

Provides access to the FocusTraversalUtils class that ships with the JGoodies Standard Dialog Library (JSDL). Note: This class is not part of the public Forms API. It's intended for implementation purposes only. The class's API may change at any time.

Version:
$Revision: 1.1 $
Author:
Karsten Lentzsch

Method Summary
static void tryToBuildAFocusGroup(AbstractButton... buttons)
          Tries to group the given buttons using the FocusTraversalUtils class - if available.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

tryToBuildAFocusGroup

public static void tryToBuildAFocusGroup(AbstractButton... buttons)
Tries to group the given buttons using the FocusTraversalUtils class - if available. Does nothing, if this class is not in the class path.



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/internal/package-tree.html0000644000175000017500000001464712003555424025467 0ustar tonytony com.jgoodies.forms.internal Class Hierarchy (JGoodies Forms 1.6 API)

Hierarchy For Package com.jgoodies.forms.internal

Package Hierarchies:
All Packages

Class Hierarchy



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/internal/package-use.html0000644000175000017500000001326512003555424025317 0ustar tonytony Uses of Package com.jgoodies.forms.internal (JGoodies Forms 1.6 API)

Uses of Package
com.jgoodies.forms.internal

No usage of com.jgoodies.forms.internal



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/internal/class-use/0000755000175000017500000000000012003555424024134 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/internal/class-use/FocusTraversalUtilsAccessor.html0000644000175000017500000001431012003555424032470 0ustar tonytony Uses of Class com.jgoodies.forms.internal.FocusTraversalUtilsAccessor (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.internal.FocusTraversalUtilsAccessor

No usage of com.jgoodies.forms.internal.FocusTraversalUtilsAccessor



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/internal/package-summary.html0000644000175000017500000001502712003555424026216 0ustar tonytony com.jgoodies.forms.internal (JGoodies Forms 1.6 API)

Package com.jgoodies.forms.internal

Class Summary
FocusTraversalUtilsAccessor Provides access to the FocusTraversalUtils class that ships with the JGoodies Standard Dialog Library (JSDL).
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/0000755000175000017500000000000012003555424021507 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/package-frame.html0000644000175000017500000000205612003555424025063 0ustar tonytony com.jgoodies.forms.debug (JGoodies Forms 1.6 API) com.jgoodies.forms.debug
Classes 
FormDebugPanel
FormDebugUtils
jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/FormDebugUtils.html0000644000175000017500000005420712003555424025300 0ustar tonytony FormDebugUtils (JGoodies Forms 1.6 API)

com.jgoodies.forms.debug
Class FormDebugUtils

java.lang.Object
  extended by com.jgoodies.forms.debug.FormDebugUtils

public final class FormDebugUtils
extends Object

Provides static methods that help you understand and fix layout problems when using the FormLayout. Dumps information about the layout grid, layout groups and cell constraints to the console.

Implicit values are mapped to concrete. For example, implicit alignments in column and row specifications will be visible. And cell constraint alignments that use or override the column and row defaults are visible too.

 ColumnSpec("p")   -> ColumnSpec("fill:pref:0");
 ColumnSpec("p:1") -> ColumnSpec("fill:pref:1");

 RowSpec("p")      -> RowSpec("center:pref:0");
 RowSpec("p:1")    -> RowSpec("center:pref:1");
 

Version:
$Revision: 1.10 $
Author:
Karsten Lentzsch
See Also:
FormDebugPanel

Method Summary
static void dumpAll(Container container)
          Dumps all layout state to the console: column and row specifications, column and row groups, grid bounds and cell constraints.
static void dumpColumnGroups(FormLayout layout)
          Dumps the layout's column groups to the console.
static void dumpColumnSpecs(FormLayout layout)
          Dumps the layout's column specifications to the console.
static void dumpConstraints(Container container)
          Dumps the component constraints to the console.
static void dumpGridBounds(Container container)
          Dumps the container's grid info to the console if and only if the container's layout is a FormLayout.
static void dumpGridBounds(FormLayout.LayoutInfo layoutInfo)
          Dumps the grid layout info to the console.
static void dumpRowGroups(FormLayout layout)
          Dumps the layout's row groups to the console.
static void dumpRowSpecs(FormLayout layout)
          Dumps the layout's row specifications to the console.
static FormLayout.LayoutInfo getLayoutInfo(Container container)
          Computes and returns the layout's grid origins.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

dumpAll

public static void dumpAll(Container container)
Dumps all layout state to the console: column and row specifications, column and row groups, grid bounds and cell constraints.

Parameters:
container - the layout container

dumpColumnSpecs

public static void dumpColumnSpecs(FormLayout layout)
Dumps the layout's column specifications to the console.

Parameters:
layout - the FormLayout to inspect

dumpRowSpecs

public static void dumpRowSpecs(FormLayout layout)
Dumps the layout's row specifications to the console.

Parameters:
layout - the FormLayout to inspect

dumpColumnGroups

public static void dumpColumnGroups(FormLayout layout)
Dumps the layout's column groups to the console.

Parameters:
layout - the FormLayout to inspect

dumpRowGroups

public static void dumpRowGroups(FormLayout layout)
Dumps the layout's row groups to the console.

Parameters:
layout - the FormLayout to inspect

dumpGridBounds

public static void dumpGridBounds(Container container)
Dumps the container's grid info to the console if and only if the container's layout is a FormLayout.

Parameters:
container - the container to inspect
Throws:
IllegalArgumentException - if the layout is not FormLayout

dumpGridBounds

public static void dumpGridBounds(FormLayout.LayoutInfo layoutInfo)
Dumps the grid layout info to the console.

Parameters:
layoutInfo - provides the column and row origins

dumpConstraints

public static void dumpConstraints(Container container)
Dumps the component constraints to the console.

Parameters:
container - the layout container to inspect

getLayoutInfo

public static FormLayout.LayoutInfo getLayoutInfo(Container container)
Computes and returns the layout's grid origins.

Parameters:
container - the layout container to inspect
Returns:
an object that comprises the cell origins and extents
Throws:
NullPointerException - if container is NullPointerException
IllegalArgumentException - if container's layout is not FormLayout


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/package-tree.html0000644000175000017500000002036012003555424024726 0ustar tonytony com.jgoodies.forms.debug Class Hierarchy (JGoodies Forms 1.6 API)

Hierarchy For Package com.jgoodies.forms.debug

Package Hierarchies:
All Packages

Class Hierarchy



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/FormDebugPanel.html0000644000175000017500000031230612003555424025234 0ustar tonytony FormDebugPanel (JGoodies Forms 1.6 API)

com.jgoodies.forms.debug
Class FormDebugPanel

java.lang.Object
  extended by java.awt.Component
      extended by java.awt.Container
          extended by javax.swing.JComponent
              extended by javax.swing.JPanel
                  extended by com.jgoodies.forms.debug.FormDebugPanel
All Implemented Interfaces:
ImageObserver, MenuContainer, Serializable, Accessible

public class FormDebugPanel
extends JPanel

A panel that paints grid bounds if and only if the panel's layout manager is a FormLayout. You can tweak the debug paint process by setting a custom grid color, painting optional diagonals and painting the grid in the background or foreground.

This class is not intended to be extended. However, it is not marked as final to allow users to subclass it for debugging purposes. In general it is recommended to use JPanel instances, not extend them. You can see this implementation style in the Forms tutorial classes. Rarely there's a need to extend JPanel; for example if you provide a custom behavior for #paintComponent or #updateUI.

Version:
$Revision: 1.10 $
Author:
Karsten Lentzsch
See Also:
FormDebugUtils, Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from class javax.swing.JPanel
JPanel.AccessibleJPanel
 
Nested classes/interfaces inherited from class javax.swing.JComponent
JComponent.AccessibleJComponent
 
Nested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainer
 
Nested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
 
Field Summary
static boolean paintRowsDefault
           
 
Fields inherited from class javax.swing.JComponent
accessibleContext, listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
 
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
FormDebugPanel()
          Constructs a FormDebugPanel with all options turned off.
FormDebugPanel(boolean paintInBackground, boolean paintDiagonals)
          Constructs a FormDebugPanel on the given FormLayout using the specified settings that are otherwise turned off.
FormDebugPanel(FormLayout layout)
          Constructs a FormDebugPanel on the given FormLayout instance that paints the grid in the foreground and paints no diagonals.
FormDebugPanel(FormLayout layout, boolean paintInBackground, boolean paintDiagonals)
          Constructs a FormDebugPanel on the given FormLayout using the specified settings that are otherwise turned off.
 
Method Summary
 void paint(Graphics g)
          Paints the panel.
protected  void paintComponent(Graphics g)
          Paints the component and - if background painting is enabled - the grid.
 void setGridColor(Color color)
          Sets the debug grid's color.
 void setPaintDiagonals(boolean b)
          Enables or disables to paint the panel's diagonals.
 void setPaintInBackground(boolean b)
          Specifies to paint in background or foreground.
 void setPaintRows(boolean b)
          Enables or disables painting of rows.
 
Methods inherited from class javax.swing.JPanel
getAccessibleContext, getUI, getUIClassID, paramString, setUI, updateUI
 
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paintBorder, paintChildren, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
 
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusBackward, transferFocusDownCycle, validate, validateTree
 
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusUpCycle
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

paintRowsDefault

public static boolean paintRowsDefault
Constructor Detail

FormDebugPanel

public FormDebugPanel()
Constructs a FormDebugPanel with all options turned off.


FormDebugPanel

public FormDebugPanel(FormLayout layout)
Constructs a FormDebugPanel on the given FormLayout instance that paints the grid in the foreground and paints no diagonals.

Parameters:
layout - the panel's FormLayout instance

FormDebugPanel

public FormDebugPanel(boolean paintInBackground,
                      boolean paintDiagonals)
Constructs a FormDebugPanel on the given FormLayout using the specified settings that are otherwise turned off.

Parameters:
paintInBackground - true to paint grid lines in the background, false to paint the grid in the foreground
paintDiagonals - true to paint diagonals, false to not paint them

FormDebugPanel

public FormDebugPanel(FormLayout layout,
                      boolean paintInBackground,
                      boolean paintDiagonals)
Constructs a FormDebugPanel on the given FormLayout using the specified settings that are otherwise turned off.

Parameters:
layout - the panel's FormLayout instance
paintInBackground - true to paint grid lines in the background, false to paint the grid in the foreground
paintDiagonals - true to paint diagonals, false to not paint them
Method Detail

setPaintInBackground

public void setPaintInBackground(boolean b)
Specifies to paint in background or foreground.

Parameters:
b - true to paint in the background, false for the foreground

setPaintDiagonals

public void setPaintDiagonals(boolean b)
Enables or disables to paint the panel's diagonals.

Parameters:
b - true to paint diagonals, false to not paint them

setPaintRows

public void setPaintRows(boolean b)
Enables or disables painting of rows. Enabled by default. Note that the top and bottom are always painted.

Parameters:
b - true to paint all rows, false to paint only the top and bottom

setGridColor

public void setGridColor(Color color)
Sets the debug grid's color.

Parameters:
color - the color used to paint the debug grid

paintComponent

protected void paintComponent(Graphics g)
Paints the component and - if background painting is enabled - the grid. If foreground painting is enabled, the grid will be painted in #paint.

Overrides:
paintComponent in class JComponent
Parameters:
g - the Graphics object to paint on
See Also:
paint(Graphics)

paint

public void paint(Graphics g)
Paints the panel. If the panel's layout manager is a FormLayout and foreground painting is enabled, it paints the form's grid lines. If the grid shall be painted in the background, the grid will be painted in #paintComponent.

Overrides:
paint in class JComponent
Parameters:
g - the Graphics object to paint on
See Also:
paintComponent(Graphics)


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/package-use.html0000644000175000017500000001324312003555424024565 0ustar tonytony Uses of Package com.jgoodies.forms.debug (JGoodies Forms 1.6 API)

Uses of Package
com.jgoodies.forms.debug

No usage of com.jgoodies.forms.debug



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/class-use/0000755000175000017500000000000012003555424023406 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/class-use/FormDebugUtils.html0000644000175000017500000001405012003555424027167 0ustar tonytony Uses of Class com.jgoodies.forms.debug.FormDebugUtils (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.debug.FormDebugUtils

No usage of com.jgoodies.forms.debug.FormDebugUtils



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/class-use/FormDebugPanel.html0000644000175000017500000001405012003555424027126 0ustar tonytony Uses of Class com.jgoodies.forms.debug.FormDebugPanel (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.debug.FormDebugPanel

No usage of com.jgoodies.forms.debug.FormDebugPanel



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/debug/package-summary.html0000644000175000017500000002015412003555424025465 0ustar tonytony com.jgoodies.forms.debug (JGoodies Forms 1.6 API)

Package com.jgoodies.forms.debug

Consists of optional classes that help you find, understand and fix layout problems

See:
          Description

Class Summary
FormDebugPanel A panel that paints grid bounds if and only if the panel's layout manager is a FormLayout.
FormDebugUtils Provides static methods that help you understand and fix layout problems when using the FormLayout.
 

Package com.jgoodies.forms.debug Description

Consists of optional classes that help you find, understand and fix layout problems.

Related Documentation

For more information see:

See Also:
com.jgoodies.forms.layout, com.jgoodies.forms.builder


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/0000755000175000017500000000000012003555424022047 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/I15dPanelBuilder.html0000644000175000017500000021723712003555424025742 0ustar tonytony I15dPanelBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class I15dPanelBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
      extended by com.jgoodies.forms.builder.AbstractFormBuilder
          extended by com.jgoodies.forms.builder.PanelBuilder
              extended by com.jgoodies.forms.builder.I15dPanelBuilder
Direct Known Subclasses:
DefaultFormBuilder

public class I15dPanelBuilder
extends PanelBuilder

A general purpose builder class that uses the FormLayout to lay out JPanels. In addition to its superclass PanelBuilder this class provides convenience behavior to map resource keys to their associated internationalized (i15d) strings when adding labels, titles and titled separators.

The localized texts used in methods #addI15d* can be marked texts, i.e. strings with an optional mnemonic marker. See the MnemonicUtils class comment for details.

For debugging purposes you can automatically set a tooltip for the created labels that show its resource key. In case of an inproper resource localization, the label will show the wrong text, and the tooltip will help you identify the resource key with the broken localization. This feature can be enabled by calling setDebugToolTipsEnabled. If you want to enable it in a deployed application, you can set the system parameter I15dPanelBuilder.debugToolTipsEnabled to "true".

Subclasses must implement the conversion from resource key to the localized string in #getI15dString(String). For example class I15dPanelBuilder gets a ResourceBundle during construction, and requests strings from that bundle.

Since:
1.1
Version:
$Revision: 1.12 $
Author:
Karsten Lentzsch
See Also:
ResourceBundle

Field Summary
 
Fields inherited from class com.jgoodies.forms.builder.AbstractBuilder
currentCellConstraints
 
Constructor Summary
I15dPanelBuilder(FormLayout layout, ResourceBundle bundle)
          Constructs an I15dPanelBuilder for the given layout and resource bundle.
I15dPanelBuilder(FormLayout layout, ResourceBundle bundle, JPanel container)
          Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
I15dPanelBuilder(FormLayout layout, com.jgoodies.common.internal.StringLocalizer localizer)
          Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
I15dPanelBuilder(FormLayout layout, com.jgoodies.common.internal.StringLocalizer localizer, JPanel container)
          Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
 
Method Summary
 JLabel addI15dLabel(String resourceKey, CellConstraints constraints)
          Adds an internationalized (i15d) textual label to the form using the specified constraints.
 JLabel addI15dLabel(String resourceKey, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds an internationalized (i15d) label and component to the panel using the given cell constraints.
 JLabel addI15dLabel(String resourceKey, String encodedConstraints)
          Adds an internationalized (i15d) textual label to the form using the specified constraints.
 JLabel addI15dROLabel(String resourceKey, CellConstraints constraints)
          Adds an internationalized (i15d) textual label to the form using the specified constraints that is intended to label a read-only component.
 JLabel addI15dROLabel(String resourceKey, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds an internationalized (i15d) label and component to the panel using the given cell constraints.
 JLabel addI15dROLabel(String resourceKey, String encodedConstraints)
          Adds an internationalized (i15d) textual label to the form using the specified constraints that is intended to label a read-only component.
 JComponent addI15dSeparator(String resourceKey, CellConstraints constraints)
          Adds an internationalized (i15d) titled separator to the form using the specified constraints.
 JComponent addI15dSeparator(String resourceKey, String encodedConstraints)
          Adds an internationalized (i15d) titled separator to the form using the specified constraints.
 JLabel addI15dTitle(String resourceKey, CellConstraints constraints)
          Adds a title to the form using the specified constraints.
 JLabel addI15dTitle(String resourceKey, String encodedConstraints)
          Adds a title to the form using the specified constraints.
 I15dPanelBuilder background(Color background)
          Sets the panel's background color and the panel to be opaque.
 I15dPanelBuilder border(Border border)
          Sets the panel's border.
 I15dPanelBuilder border(String emptyBorderSpec)
          Sets the panel's border as an EmptyBorder using the given specification for the top, left, bottom, right in DLU.
protected  String getI15dString(String resourceKey)
          Looks up and returns the internationalized (i15d) string for the given resource key, for example from a ResourceBundle or ResourceMap.
static boolean isDebugToolTipsEnabled()
          Returns whether the debug tool tips are enabled or not.
 I15dPanelBuilder opaque(boolean b)
          Sets the panel's opaque state.
static void setDebugToolTipsEnabled(boolean b)
          Enables or disables the debug tool tips.
 
Methods inherited from class com.jgoodies.forms.builder.PanelBuilder
add, add, addLabel, addLabel, addLabel, addLabel, addROLabel, addROLabel, addROLabel, addROLabel, addSeparator, addSeparator, addSeparator, addSeparator, addTitle, addTitle, addTitle, build, getLabelForFeatureEnabledDefault, getOpaqueDefault, getPanel, isLabelForApplicable, labelForFeatureEnabled, setBorder, setDefaultDialogBorder, setLabelFor, setLabelForFeatureEnabledDefault, setOpaque, setOpaqueDefault
 
Methods inherited from class com.jgoodies.forms.builder.AbstractFormBuilder
add, add, appendColumn, appendColumn, appendGlueColumn, appendGlueRow, appendLabelComponentsGapColumn, appendParagraphGapRow, appendRelatedComponentsGapColumn, appendRelatedComponentsGapRow, appendRow, appendRow, appendUnrelatedComponentsGapColumn, appendUnrelatedComponentsGapRow, cellConstraints, createLeftAdjustedConstraints, getColumn, getColumnIncrementSign, getLeadingColumn, getRow, isLeftToRight, nextColumn, nextColumn, nextLine, nextLine, nextRow, nextRow, setAlignment, setBounds, setColumn, setColumnSpan, setExtent, setHAlignment, setLeftToRight, setOrigin, setRow, setRowSpan, setVAlignment
 
Methods inherited from class com.jgoodies.forms.builder.AbstractBuilder
createComponentFactory, getColumnCount, getComponentFactory, getComponentFactoryDefault, getContainer, getLayout, getRowCount, setComponentFactory, setComponentFactoryDefault
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

I15dPanelBuilder

public I15dPanelBuilder(FormLayout layout,
                        ResourceBundle bundle)
Constructs an I15dPanelBuilder for the given layout and resource bundle. Uses an instance of JPanel as layout container.

Parameters:
layout - the FormLayout used to layout the container
bundle - the ResourceBundle used to look up i15d strings
Throws:
NullPointerException - if layout or bundle, is null

I15dPanelBuilder

public I15dPanelBuilder(FormLayout layout,
                        ResourceBundle bundle,
                        JPanel container)
Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.

Parameters:
layout - the FormLayout used to layout the container
bundle - the ResourceBundle used to lookup i15d strings
container - the layout container
Throws:
NullPointerException - if layout, bundle, or container is null

I15dPanelBuilder

public I15dPanelBuilder(FormLayout layout,
                        com.jgoodies.common.internal.StringLocalizer localizer)
Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.

Parameters:
layout - the FormLayout used to layout the container
localizer - used to lookup i15d strings
Throws:
NullPointerException - if layout is null

I15dPanelBuilder

public I15dPanelBuilder(FormLayout layout,
                        com.jgoodies.common.internal.StringLocalizer localizer,
                        JPanel container)
Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.

Parameters:
layout - the FormLayout used to layout the container
localizer - used to lookup i15d strings
container - the layout container
Throws:
NullPointerException - if layout or container is null
Method Detail

isDebugToolTipsEnabled

public static boolean isDebugToolTipsEnabled()
Returns whether the debug tool tips are enabled or not.

Returns:
true if debug tool tips are enabled, false if disabled

setDebugToolTipsEnabled

public static void setDebugToolTipsEnabled(boolean b)
Enables or disables the debug tool tips.

Parameters:
b - true to enable, false to disable

background

public I15dPanelBuilder background(Color background)
Description copied from class: PanelBuilder
Sets the panel's background color and the panel to be opaque.

Overrides:
background in class PanelBuilder
Parameters:
background - the color to set as new background
See Also:
JComponent.setBackground(Color)

border

public I15dPanelBuilder border(Border border)
Description copied from class: PanelBuilder
Sets the panel's border.

Overrides:
border in class PanelBuilder
Parameters:
border - the border to set
See Also:
JComponent.setBorder(Border)

border

public I15dPanelBuilder border(String emptyBorderSpec)
Description copied from class: PanelBuilder
Sets the panel's border as an EmptyBorder using the given specification for the top, left, bottom, right in DLU. For example "1dlu, 2dlu, 3dlu, 4dlu" sets an empty border with 1dlu in the top, 2dlu in the left side, 3dlu at the bottom, and 4dlu in the right hand side.

Equivalent to setBorder(Borders.createEmptyBorder(emptyBorderSpec)).

Overrides:
border in class PanelBuilder
Parameters:
emptyBorderSpec - describes the top, left, bottom, right sizes of the EmptyBorder to create
See Also:
Borders.createEmptyBorder(String)

opaque

public I15dPanelBuilder opaque(boolean b)
Description copied from class: PanelBuilder
Sets the panel's opaque state.

Overrides:
opaque in class PanelBuilder
Parameters:
b - true for opaque, false for non-opaque
See Also:
JComponent.setOpaque(boolean)

addI15dLabel

public final JLabel addI15dLabel(String resourceKey,
                                 CellConstraints constraints)
Adds an internationalized (i15d) textual label to the form using the specified constraints.

Parameters:
resourceKey - the resource key for the label's text
constraints - the label's cell constraints
Returns:
the added label

addI15dLabel

public final JLabel addI15dLabel(String resourceKey,
                                 String encodedConstraints)
Adds an internationalized (i15d) textual label to the form using the specified constraints.

Parameters:
resourceKey - the resource key for the label's text
encodedConstraints - a string representation for the constraints
Returns:
the added label

addI15dLabel

public final JLabel addI15dLabel(String resourceKey,
                                 CellConstraints labelConstraints,
                                 Component component,
                                 CellConstraints componentConstraints)
Adds an internationalized (i15d) label and component to the panel using the given cell constraints. Sets the label as the component label using JLabel.setLabelFor(java.awt.Component).

Note: The CellConstraints objects for the label and the component must be different. Cell constraints are implicitly cloned by the FormLayout when added to the container. However, in this case you may be tempted to reuse a CellConstraints object in the same way as with many other builder methods that require a single CellConstraints parameter. The pitfall is that the methods CellConstraints.xy**(...) just set the coordinates but do not create a new instance. And so the second invocation of xy***(...) overrides the settings performed in the first invocation before the object is cloned by the FormLayout.

Wrong:

 builder.addI15dLabel("name.key",
             CC.xy(1, 7),         // will be modified by the code below
             nameField,
             CC.xy(3, 7)          // sets the single instance to (3, 7)
            );
 
Correct:
 builder.addI15dLabel("name.key",
             CC.xy(1, 7).clone(), // cloned before the next modification
             nameField,
             CC.xy(3, 7)          // sets this instance to (3, 7)
            );
 

Parameters:
resourceKey - the resource key for the label
labelConstraints - the label's cell constraints
component - the component to add
componentConstraints - the component's cell constraints
Returns:
the added label
Throws:
IllegalArgumentException - if the same cell constraints instance is used for the label and the component
See Also:
JLabel.setLabelFor(java.awt.Component)

addI15dROLabel

public final JLabel addI15dROLabel(String resourceKey,
                                   CellConstraints constraints)
Adds an internationalized (i15d) textual label to the form using the specified constraints that is intended to label a read-only component.

Parameters:
resourceKey - the resource key for the label's text
constraints - the label's cell constraints
Returns:
the added label
Since:
1.3

addI15dROLabel

public final JLabel addI15dROLabel(String resourceKey,
                                   String encodedConstraints)
Adds an internationalized (i15d) textual label to the form using the specified constraints that is intended to label a read-only component.

Parameters:
resourceKey - the resource key for the label's text
encodedConstraints - a string representation for the constraints
Returns:
the added label
Since:
1.3

addI15dROLabel

public final JLabel addI15dROLabel(String resourceKey,
                                   CellConstraints labelConstraints,
                                   Component component,
                                   CellConstraints componentConstraints)
Adds an internationalized (i15d) label and component to the panel using the given cell constraints. Intended for read-only components. Sets the label as the component label using JLabel.setLabelFor(java.awt.Component).

Note: The CellConstraints objects for the label and the component must be different. Cell constraints are implicitly cloned by the FormLayout when added to the container. However, in this case you may be tempted to reuse a CellConstraints object in the same way as with many other builder methods that require a single CellConstraints parameter. The pitfall is that the methods CellConstraints.xy**(...) just set the coordinates but do not create a new instance. And so the second invocation of xy***(...) overrides the settings performed in the first invocation before the object is cloned by the FormLayout.

Wrong:

 builder.addI15dROLabel("name.key",
             CC.xy(1, 7),         // will be modified by the code below
             nameField,
             CC.xy(3, 7)          // sets the single instance to (3, 7)
            );
 
Correct:
 builder.addI15dROLabel("name.key",
             CC.xy(1, 7).clone(), // cloned before the next modification
             nameField,
             CC.xy(3, 7)          // sets this instance to (3, 7)
            );
 
Better:
 builder.addI15dROLabel("name.key",
             CC.xy(1, 7)          // creates a CellConstraints object
             nameField,
             CC.xy(3, 7)          // creates another CellConstraints object
            );
 

Parameters:
resourceKey - the resource key for the label
labelConstraints - the label's cell constraints
component - the component to add
componentConstraints - the component's cell constraints
Returns:
the added label
Throws:
IllegalArgumentException - if the same cell constraints instance is used for the label and the component
Since:
1.3
See Also:
JLabel.setLabelFor(java.awt.Component)

addI15dSeparator

public final JComponent addI15dSeparator(String resourceKey,
                                         CellConstraints constraints)
Adds an internationalized (i15d) titled separator to the form using the specified constraints.

Parameters:
resourceKey - the resource key for the separator title
constraints - the separator's cell constraints
Returns:
the added titled separator

addI15dSeparator

public final JComponent addI15dSeparator(String resourceKey,
                                         String encodedConstraints)
Adds an internationalized (i15d) titled separator to the form using the specified constraints.

Parameters:
resourceKey - the resource key for the separator title
encodedConstraints - a string representation for the constraints
Returns:
the added titled separator

addI15dTitle

public final JLabel addI15dTitle(String resourceKey,
                                 CellConstraints constraints)
Adds a title to the form using the specified constraints.

Parameters:
resourceKey - the resource key for the separator title
constraints - the separator's cell constraints
Returns:
the added title label

addI15dTitle

public final JLabel addI15dTitle(String resourceKey,
                                 String encodedConstraints)
Adds a title to the form using the specified constraints.

Parameters:
resourceKey - the resource key for the separator title
encodedConstraints - a string representation for the constraints
Returns:
the added title label

getI15dString

protected final String getI15dString(String resourceKey)
Looks up and returns the internationalized (i15d) string for the given resource key, for example from a ResourceBundle or ResourceMap.

Parameters:
resourceKey - the key to look for in the resource map
Returns:
the associated internationalized string, or the resource key itself in case of a missing resource
Throws:
IllegalStateException - if the localization is not possible, for example, because no ResourceBundle or StringLocalizer has been set


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/package-frame.html0000644000175000017500000000407012003555424025421 0ustar tonytony com.jgoodies.forms.builder (JGoodies Forms 1.6 API) com.jgoodies.forms.builder
Classes 
AbstractBuilder
AbstractButtonPanelBuilder
AbstractFormBuilder
ButtonBarBuilder
ButtonBarBuilder2
ButtonStackBuilder
DefaultFormBuilder
I15dPanelBuilder
ListViewBuilder
PanelBuilder
jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/ButtonStackBuilder.html0000644000175000017500000012204312003555422026505 0ustar tonytony ButtonStackBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class ButtonStackBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
      extended by com.jgoodies.forms.builder.AbstractButtonPanelBuilder
          extended by com.jgoodies.forms.builder.ButtonStackBuilder

public final class ButtonStackBuilder
extends AbstractButtonPanelBuilder

A non-visual builder that assists you in building consistent button stacks using the FormLayout.

This builder sets a hint for narrow margin for the gridded buttons. This can reduce the button stack's width if some buttons have long texts. For example, a stack with 'OK', 'Cancel', 'Configure…' will likely exceed the minimum button width. The narrow margins help getting narrow stacks. Note that some look&feels do not support the narrow margin feature, and conversely, others have only narrow margins. The JGoodies look&feels honor the setting, the Mac Aqua l&f uses narrow margins all the time.

Example:
The following example builds a button stack with Close, Up and Down, where Up and Down are related, and Close is not related to the other buttons, which makes a wide gap for the unrelated and a smaller gap for the related buttons.

 private JPanel createCloseUpDownButtonStack(
         JButton close, JButton up, JButton down) {
     return new ButtonStackBuilder()
                .addGridded(close)
                .addUnrelatedGap()
                .addGridded(up)
                .addRelatedGap()
                .addGridded(down)
                .build();
 }
 

Version:
$Revision: 1.15 $
Author:
Karsten Lentzsch
See Also:
ButtonBarBuilder, LayoutStyle

Field Summary
 
Fields inherited from class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
focusGrouped
 
Fields inherited from class com.jgoodies.forms.builder.AbstractBuilder
currentCellConstraints
 
Constructor Summary
ButtonStackBuilder()
          Constructs a ButtonStackBuilder on a default JPanel using a pre-configured FormLayout as layout manager.
ButtonStackBuilder(JPanel panel)
          Constructs a ButtonStackBuilder on the given panel using a pre-configured FormLayout as layout manager.
 
Method Summary
 ButtonStackBuilder addButton(Action... actions)
          Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.
 ButtonStackBuilder addButton(JComponent... buttons)
          Adds one or many sequences of related buttons.
 ButtonStackBuilder addButton(JComponent button)
          Adds a button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
 ButtonStackBuilder addFixed(JComponent component)
          Adds a fixed size component.
 ButtonStackBuilder addGlue()
          Adds a glue that will be given the extra space, if this box is larger than its preferred size.
 ButtonStackBuilder addRelatedGap()
          Adds the standard gap for related components.
 ButtonStackBuilder addStrut(ConstantSize size)
          Adds a strut of a specified size.
 ButtonStackBuilder addUnrelatedGap()
          Adds the standard gap for unrelated components.
 ButtonStackBuilder background(Color background)
          Sets the panel's background color and makes the panel opaque.
 ButtonStackBuilder border(Border border)
          Sets the panel's border.
 ButtonStackBuilder opaque(boolean b)
          Sets the panel's opaque state.
 
Methods inherited from class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
add, appendColumn, appendGlueColumn, appendGlueRow, appendRelatedComponentsGapColumn, appendRelatedComponentsGapRow, appendRow, appendUnrelatedComponentsGapColumn, appendUnrelatedComponentsGapRow, build, createButton, getColumn, getPanel, getRow, isLeftToRight, nextColumn, nextRow, setBackground, setBorder, setLeftToRight, setOpaque
 
Methods inherited from class com.jgoodies.forms.builder.AbstractBuilder
createComponentFactory, getColumnCount, getComponentFactory, getComponentFactoryDefault, getContainer, getLayout, getRowCount, setComponentFactory, setComponentFactoryDefault
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ButtonStackBuilder

public ButtonStackBuilder()
Constructs a ButtonStackBuilder on a default JPanel using a pre-configured FormLayout as layout manager.


ButtonStackBuilder

public ButtonStackBuilder(JPanel panel)
Constructs a ButtonStackBuilder on the given panel using a pre-configured FormLayout as layout manager.

Parameters:
panel - the layout container
Method Detail

addButton

public ButtonStackBuilder addButton(JComponent button)
Adds a button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().

Although a JButton is expected, any JComponent is accepted to allow custom button component types.

Specified by:
addButton in class AbstractButtonPanelBuilder
Parameters:
button - the component to add
Returns:
this builder
Throws:
NullPointerException - if button is null

addButton

public ButtonStackBuilder addButton(JComponent... buttons)
Description copied from class: AbstractButtonPanelBuilder
Adds one or many sequences of related buttons. A new sequence starts when a button is null. The next sequence is separated by an unrelated gap. Each button has the minimum width as specified by LayoutStyle.getDefaultButtonWidth(). The gap width between the buttons is LayoutStyle.getRelatedComponentsPadX().

Although JButtons are expected, general JComponents are accepted to allow custom button component types.

Examples:

 builder.addButtons(newButton, editButton, deleteButton);
 builder.addButtons(newButton, editButton, deleteButton, null, printButton);
 

Overrides:
addButton in class AbstractButtonPanelBuilder
Parameters:
buttons - the buttons to add
Returns:
this builder
See Also:
AbstractButtonPanelBuilder.addButton(JComponent)

addButton

public ButtonStackBuilder addButton(Action... actions)
Description copied from class: AbstractButtonPanelBuilder
Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.

Overrides:
addButton in class AbstractButtonPanelBuilder
Parameters:
actions - an array of buttons to add

addFixed

public ButtonStackBuilder addFixed(JComponent component)
Adds a fixed size component.

Parameters:
component - the component to add

addGlue

public ButtonStackBuilder addGlue()
Adds a glue that will be given the extra space, if this box is larger than its preferred size.


addRelatedGap

public ButtonStackBuilder addRelatedGap()
Description copied from class: AbstractButtonPanelBuilder
Adds the standard gap for related components.

Specified by:
addRelatedGap in class AbstractButtonPanelBuilder

addUnrelatedGap

public ButtonStackBuilder addUnrelatedGap()
Description copied from class: AbstractButtonPanelBuilder
Adds the standard gap for unrelated components.

Specified by:
addUnrelatedGap in class AbstractButtonPanelBuilder

addStrut

public ButtonStackBuilder addStrut(ConstantSize size)
Adds a strut of a specified size.

Parameters:
size - a constant that describes the gap

background

public ButtonStackBuilder background(Color background)
Description copied from class: AbstractButtonPanelBuilder
Sets the panel's background color and makes the panel opaque.

Overrides:
background in class AbstractButtonPanelBuilder
Parameters:
background - the color to set as new background
See Also:
JComponent.setBackground(Color)

border

public ButtonStackBuilder border(Border border)
Description copied from class: AbstractButtonPanelBuilder
Sets the panel's border.

Overrides:
border in class AbstractButtonPanelBuilder
Parameters:
border - the border to set
See Also:
JComponent.setBorder(Border)

opaque

public ButtonStackBuilder opaque(boolean b)
Description copied from class: AbstractButtonPanelBuilder
Sets the panel's opaque state.

Overrides:
opaque in class AbstractButtonPanelBuilder
Parameters:
b - true for opaque, false for non-opaque
See Also:
JComponent.setOpaque(boolean)


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/PanelBuilder.html0000644000175000017500000027054712003555424025322 0ustar tonytony PanelBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class PanelBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
      extended by com.jgoodies.forms.builder.AbstractFormBuilder
          extended by com.jgoodies.forms.builder.PanelBuilder
Direct Known Subclasses:
I15dPanelBuilder

public class PanelBuilder
extends AbstractFormBuilder

An general purpose panel builder that uses the FormLayout to lay out JPanels. It provides convenience methods to set a default border and to add labels, titles and titled separators.

The PanelBuilder is the working horse for layouts when more specialized builders like the ButtonBarBuilder or DefaultFormBuilder are inappropriate.

The Forms tutorial includes several examples that present and compare different style to build with the PanelBuilder: static row numbers vs. row variable, explicit CellConstraints vs. builder cursor, static rows vs. dynamically added rows. Also, you may check out the Tips & Tricks section of the Forms HTML documentation.

The text arguments passed to the methods #addLabel, #addTitle, and #addSeparator can contain an optional mnemonic marker. The mnemonic and mnemonic index are indicated by a single ampersand (&). For example "&Save", or "Save &as". To use the ampersand itself duplicate it, for example "Look&&Feel".

Example:
This example creates a panel with 3 columns and 3 rows.

 FormLayout layout = new FormLayout(
      "pref, $lcgap, 50dlu, $rgap, default",  // columns
      "pref, $lg, pref, $lg, pref");          // rows

 PanelBuilder builder = new PanelBuilder(layout);
 builder.addLabel("&Title:",        CC.xy  (1, 1));
 builder.add(new JTextField(),      CC.xywh(3, 1, 3, 1));
 builder.addLabel("&Price:",        CC.xy  (1, 3));
 builder.add(new JTextField(),      CC.xy  (3, 3));
 builder.addLabel("&Author:",       CC.xy  (1, 5));
 builder.add(new JTextField(),      CC.xy  (3, 5));
 builder.add(new JButton("?"), CC.xy  (5, 5));
 return builder.getPanel();
 

Version:
$Revision: 1.21 $
Author:
Karsten Lentzsch
See Also:
ComponentFactory, I15dPanelBuilder, DefaultFormBuilder

Field Summary
 
Fields inherited from class com.jgoodies.forms.builder.AbstractBuilder
currentCellConstraints
 
Constructor Summary
PanelBuilder(FormLayout layout)
          Constructs a PanelBuilder for the given layout.
PanelBuilder(FormLayout layout, JPanel panel)
          Constructs a PanelBuilder for the given FormLayout and layout container.
 
Method Summary
 Component add(Component component, CellConstraints cellConstraints)
          Adds a component to the panel using the given cell constraints.
 JLabel add(JLabel label, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds a label and component to the panel using the given cell constraints.
 JLabel addLabel(String textWithMnemonic)
          Adds a textual label to the form using the default constraints.
 JLabel addLabel(String textWithMnemonic, CellConstraints constraints)
          Adds a textual label to the form using the specified constraints.
 JLabel addLabel(String textWithMnemonic, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds a label and component to the panel using the given cell constraints.
 JLabel addLabel(String textWithMnemonic, String encodedConstraints)
          Adds a textual label to the form using the specified constraints.
 JLabel addROLabel(String textWithMnemonic)
          Adds a textual label intended for labeling read-only components to the form using the default constraints.
 JLabel addROLabel(String textWithMnemonic, CellConstraints constraints)
          Adds a textual label intended for labeling read-only components to the form using the specified constraints.
 JLabel addROLabel(String textWithMnemonic, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds a label and component to the panel using the given cell constraints.
 JLabel addROLabel(String textWithMnemonic, String encodedConstraints)
          Adds a textual label intended for labeling read-only components to the form using the specified constraints.
 JComponent addSeparator(String textWithMnemonic)
          Adds a titled separator to the form that spans all columns.
 JComponent addSeparator(String textWithMnemonic, CellConstraints constraints)
          Adds a titled separator to the form using the specified constraints.
 JComponent addSeparator(String textWithMnemonic, int columnSpan)
          Adds a titled separator to the form that spans the specified columns.
 JComponent addSeparator(String textWithMnemonic, String encodedConstraints)
          Adds a titled separator to the form using the specified constraints.
 JLabel addTitle(String textWithMnemonic)
          Adds a title label to the form using the default constraints.
 JLabel addTitle(String textWithMnemonic, CellConstraints constraints)
          Adds a title label to the form using the specified constraints.
 JLabel addTitle(String textWithMnemonic, String encodedConstraints)
          Adds a title label to the form using the specified constraints.
 PanelBuilder background(Color background)
          Sets the panel's background color and the panel to be opaque.
 PanelBuilder border(Border border)
          Sets the panel's border.
 PanelBuilder border(String emptyBorderSpec)
          Sets the panel's border as an EmptyBorder using the given specification for the top, left, bottom, right in DLU.
 JPanel build()
          Returns the panel used to build the form.
static boolean getLabelForFeatureEnabledDefault()
          Returns the global default for the enablement of the setLabelFor feature.
static boolean getOpaqueDefault()
           
 JPanel getPanel()
          Returns the panel used to build the form.
protected  boolean isLabelForApplicable(JLabel label, Component component)
          Checks and answers whether the given component shall be set as component for a previously added label using JLabel.setLabelFor(Component).
 PanelBuilder labelForFeatureEnabled(boolean b)
          Enables or disables the setLabelFor feature for this PanelBuilder.
 PanelBuilder opaque(boolean b)
          Sets the panel's opaque state.
 void setBorder(Border border)
          Deprecated. Replaced by border(Border)
 void setDefaultDialogBorder()
          Deprecated. Replaced by #border(Borders.DIALOG)
protected  void setLabelFor(JLabel label, Component component)
          Sets label as labeling label for component or an appropriate child.
static void setLabelForFeatureEnabledDefault(boolean b)
          Sets the default value for the setLabelFor feature enablement.
 void setOpaque(boolean b)
          Deprecated. Replaced by opaque(boolean)
static void setOpaqueDefault(boolean b)
          Sets the global default value for a builder's opaque state that can be overridden per builder.
 
Methods inherited from class com.jgoodies.forms.builder.AbstractFormBuilder
add, add, appendColumn, appendColumn, appendGlueColumn, appendGlueRow, appendLabelComponentsGapColumn, appendParagraphGapRow, appendRelatedComponentsGapColumn, appendRelatedComponentsGapRow, appendRow, appendRow, appendUnrelatedComponentsGapColumn, appendUnrelatedComponentsGapRow, cellConstraints, createLeftAdjustedConstraints, getColumn, getColumnIncrementSign, getLeadingColumn, getRow, isLeftToRight, nextColumn, nextColumn, nextLine, nextLine, nextRow, nextRow, setAlignment, setBounds, setColumn, setColumnSpan, setExtent, setHAlignment, setLeftToRight, setOrigin, setRow, setRowSpan, setVAlignment
 
Methods inherited from class com.jgoodies.forms.builder.AbstractBuilder
createComponentFactory, getColumnCount, getComponentFactory, getComponentFactoryDefault, getContainer, getLayout, getRowCount, setComponentFactory, setComponentFactoryDefault
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

PanelBuilder

public PanelBuilder(FormLayout layout)
Constructs a PanelBuilder for the given layout. Uses an instance of JPanel as layout container with the given layout as layout manager.

Parameters:
layout - the FormLayout to use
Throws:
NullPointerException - if layout is null

PanelBuilder

public PanelBuilder(FormLayout layout,
                    JPanel panel)
Constructs a PanelBuilder for the given FormLayout and layout container.

Parameters:
layout - the FormLayout to use
panel - the layout container to build on
Throws:
NullPointerException - if layout or container is null
Method Detail

getLabelForFeatureEnabledDefault

public static boolean getLabelForFeatureEnabledDefault()
Returns the global default for the enablement of the setLabelFor feature. This can be overridden per PanelBuilder using labelForFeatureEnabled(boolean). The feature is globally disabled by default.

Returns:
true for globally enabled, false for globally disabled

setLabelForFeatureEnabledDefault

public static void setLabelForFeatureEnabledDefault(boolean b)
Sets the default value for the setLabelFor feature enablement. This can be overridden per PanelBuilder using labelForFeatureEnabled(boolean). The default value is used to set the initial PanelBuilder setting for this feature. The feature is globally disabled by default.

Parameters:
b - true for globally enabled, false for globally disabled

getOpaqueDefault

public static boolean getOpaqueDefault()
Returns:
the global default value for a builder's opaque state that can be overridden per builder

setOpaqueDefault

public static void setOpaqueDefault(boolean b)
Sets the global default value for a builder's opaque state that can be overridden per builder. Since the Forms 1.6, the default value is false, in other words, panels will not be opaque.

Parameters:
b - the new value

getPanel

public final JPanel getPanel()
Returns the panel used to build the form.

Returns:
the panel used by this builder to build the form

setBorder

@Deprecated
public void setBorder(Border border)
Deprecated. Replaced by border(Border)

Sets the panel's border.

Parameters:
border - the border to set
See Also:
JComponent.setBorder(Border)

setDefaultDialogBorder

@Deprecated
public void setDefaultDialogBorder()
Deprecated. Replaced by #border(Borders.DIALOG)

Sets the default dialog border.

See Also:
Borders

setOpaque

@Deprecated
public void setOpaque(boolean b)
Deprecated. Replaced by opaque(boolean)

Sets the panel's opaque state.

Parameters:
b - true for opaque, false for non-opaque
Since:
1.1
See Also:
JComponent.setOpaque(boolean)

background

public PanelBuilder background(Color background)
Sets the panel's background color and the panel to be opaque.

Parameters:
background - the color to set as new background
Since:
1.1
See Also:
JComponent.setBackground(Color)

border

public PanelBuilder border(Border border)
Sets the panel's border.

Parameters:
border - the border to set
See Also:
JComponent.setBorder(Border)

border

public PanelBuilder border(String emptyBorderSpec)
Sets the panel's border as an EmptyBorder using the given specification for the top, left, bottom, right in DLU. For example "1dlu, 2dlu, 3dlu, 4dlu" sets an empty border with 1dlu in the top, 2dlu in the left side, 3dlu at the bottom, and 4dlu in the right hand side.

Equivalent to setBorder(Borders.createEmptyBorder(emptyBorderSpec)).

Parameters:
emptyBorderSpec - describes the top, left, bottom, right sizes of the EmptyBorder to create
See Also:
Borders.createEmptyBorder(String)

opaque

public PanelBuilder opaque(boolean b)
Sets the panel's opaque state.

Parameters:
b - true for opaque, false for non-opaque
Since:
1.1
See Also:
JComponent.setOpaque(boolean)

labelForFeatureEnabled

public PanelBuilder labelForFeatureEnabled(boolean b)
Enables or disables the setLabelFor feature for this PanelBuilder. The value is initialized from the global default value getLabelForFeatureEnabledDefault(). It is globally disabled by default.

Parameters:
b - true for enabled, false for disabled

build

public final JPanel build()
Returns the panel used to build the form.

Returns:
the panel used by this builder to build the form

addLabel

public final JLabel addLabel(String textWithMnemonic)
Adds a textual label to the form using the default constraints.

 addLabel("Name:");       // No Mnemonic
 addLabel("N&ame:");      // Mnemonic is 'a'
 addLabel("Save &as:");   // Mnemonic is the second 'a'
 addLabel("Look&&Feel:"); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
the new label
See Also:
ComponentFactory

addLabel

public final JLabel addLabel(String textWithMnemonic,
                             CellConstraints constraints)
Adds a textual label to the form using the specified constraints.

 addLabel("Name:",       CC.xy(1, 1)); // No Mnemonic
 addLabel("N&ame:",      CC.xy(1, 1)); // Mnemonic is 'a'
 addLabel("Save &as:",   CC.xy(1, 1)); // Mnemonic is the second 'a'
 addLabel("Look&&Feel:", CC.xy(1, 1)); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
constraints - the label's cell constraints
Returns:
the new label
See Also:
ComponentFactory

addLabel

public final JLabel addLabel(String textWithMnemonic,
                             String encodedConstraints)
Adds a textual label to the form using the specified constraints.

 addLabel("Name:",       "1, 1"); // No Mnemonic
 addLabel("N&ame:",      "1, 1"); // Mnemonic is 'a'
 addLabel("Save &as:",   "1, 1"); // Mnemonic is the second 'a'
 addLabel("Look&&Feel:", "1, 1"); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
encodedConstraints - a string representation for the constraints
Returns:
the new label
See Also:
ComponentFactory

addLabel

public final JLabel addLabel(String textWithMnemonic,
                             CellConstraints labelConstraints,
                             Component component,
                             CellConstraints componentConstraints)
Adds a label and component to the panel using the given cell constraints. Sets the given label as the component label using JLabel.setLabelFor(java.awt.Component).

Note: The CellConstraints objects for the label and the component must be different. Cell constraints are implicitly cloned by the FormLayout when added to the container. However, in this case you may be tempted to reuse a CellConstraints object in the same way as with many other builder methods that require a single CellConstraints parameter. The pitfall is that the methods CellConstraints.xy*(...) just set the coordinates but do not create a new instance. And so the second invocation of xy*(...) overrides the settings performed in the first invocation before the object is cloned by the FormLayout.

Wrong:

 builder.addLabel(
     "&Name:",            // Mnemonic is 'N'
     cc.xy(1, 7),         // will be modified by the code below
     nameField,
     cc.xy(3, 7)          // sets the single instance to (3, 7)
 );
 
Correct:
 builder.addLabel(
     "&Name:",
     CC.xy(1, 7),         // creates an instance
     nameField,
     CC.xy(3, 7)          // creates another instance
 );
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
labelConstraints - the label's cell constraints
component - the component to add
componentConstraints - the component's cell constraints
Returns:
the added label
Throws:
IllegalArgumentException - if the same cell constraints instance is used for the label and the component
See Also:
JLabel.setLabelFor(java.awt.Component), ComponentFactory, DefaultFormBuilder

addROLabel

public final JLabel addROLabel(String textWithMnemonic)
Adds a textual label intended for labeling read-only components to the form using the default constraints.

 addROLabel("Name:");       // No Mnemonic
 addROLabel("N&ame:");      // Mnemonic is 'a'
 addROLabel("Save &as:");   // Mnemonic is the second 'a'
 addROLabel("Look&&Feel:"); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
the new label
Since:
1.3

addROLabel

public final JLabel addROLabel(String textWithMnemonic,
                               CellConstraints constraints)
Adds a textual label intended for labeling read-only components to the form using the specified constraints.

 addROLabel("Name:",       CC.xy(1, 1)); // No Mnemonic
 addROLabel("N&ame:",      CC.xy(1, 1)); // Mnemonic is 'a'
 addROLabel("Save &as:",   CC.xy(1, 1)); // Mnemonic is the second 'a'
 addROLabel("Look&&Feel:", CC.xy(1, 1)); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
constraints - the label's cell constraints
Returns:
the new label
Since:
1.3

addROLabel

public final JLabel addROLabel(String textWithMnemonic,
                               String encodedConstraints)
Adds a textual label intended for labeling read-only components to the form using the specified constraints.

 addROLabel("Name:",       "1, 1"); // No Mnemonic
 addROLabel("N&ame:",      "1, 1"); // Mnemonic is 'a'
 addROLabel("Save &as:",   "1, 1"); // Mnemonic is the second 'a'
 addROLabel("Look&&Feel:", "1, 1"); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
encodedConstraints - a string representation for the constraints
Returns:
the new label
Since:
1.3

addROLabel

public final JLabel addROLabel(String textWithMnemonic,
                               CellConstraints labelConstraints,
                               Component component,
                               CellConstraints componentConstraints)
Adds a label and component to the panel using the given cell constraints. Sets the given label as the component label using JLabel.setLabelFor(java.awt.Component).

Note: The CellConstraints objects for the label and the component must be different. Cell constraints are implicitly cloned by the FormLayout when added to the container. However, in this case you may be tempted to reuse a CellConstraints object in the same way as with many other builder methods that require a single CellConstraints parameter. The pitfall is that the methods CellConstraints.xy*(...) just set the coordinates but do not create a new instance. And so the second invocation of xy*(...) overrides the settings performed in the first invocation before the object is cloned by the FormLayout.

Wrong:

 builder.addROLabel(
     "&Name:",            // Mnemonic is 'N'
     cc.xy(1, 7),         // will be modified by the code below
     nameField,
     cc.xy(3, 7)          // sets the single instance to (3, 7)
 );
 
Correct:
 builder.addROLabel(
     "&Name:",
     CC.xy(1, 7),          // creates an instance
     nameField,
     CC.xy(3, 7)           // creates another instance
 );
 

Parameters:
textWithMnemonic - the label's text - may contain an ampersand (&) to mark a mnemonic
labelConstraints - the label's cell constraints
component - the component to add
componentConstraints - the component's cell constraints
Returns:
the added label
Throws:
IllegalArgumentException - if the same cell constraints instance is used for the label and the component
Since:
1.3
See Also:
JLabel.setLabelFor(java.awt.Component), DefaultFormBuilder

addTitle

public final JLabel addTitle(String textWithMnemonic)
Adds a title label to the form using the default constraints.

 addTitle("Name");       // No mnemonic
 addTitle("N&ame");      // Mnemonic is 'a'
 addTitle("Save &as");   // Mnemonic is the second 'a'
 addTitle("Look&&Feel"); // No mnemonic, text is Look&Feel
 

Parameters:
textWithMnemonic - the title label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
the added title label
See Also:
ComponentFactory

addTitle

public final JLabel addTitle(String textWithMnemonic,
                             CellConstraints constraints)
Adds a title label to the form using the specified constraints.

 addTitle("Name",       CC.xy(1, 1)); // No mnemonic
 addTitle("N&ame",      CC.xy(1, 1)); // Mnemonic is 'a'
 addTitle("Save &as",   CC.xy(1, 1)); // Mnemonic is the second 'a'
 addTitle("Look&&Feel", CC.xy(1, 1)); // No mnemonic, text is Look&Feel
 

Parameters:
textWithMnemonic - the title label's text - may contain an ampersand (&) to mark a mnemonic
constraints - the separator's cell constraints
Returns:
the added title label
See Also:
ComponentFactory

addTitle

public final JLabel addTitle(String textWithMnemonic,
                             String encodedConstraints)
Adds a title label to the form using the specified constraints.

 addTitle("Name",       "1, 1"); // No mnemonic
 addTitle("N&ame",      "1, 1"); // Mnemonic is 'a'
 addTitle("Save &as",   "1, 1"); // Mnemonic is the second 'a'
 addTitle("Look&&Feel", "1, 1"); // No mnemonic, text is Look&Feel
 

Parameters:
textWithMnemonic - the title label's text - may contain an ampersand (&) to mark a mnemonic
encodedConstraints - a string representation for the constraints
Returns:
the added title label
See Also:
ComponentFactory

addSeparator

public final JComponent addSeparator(String textWithMnemonic)
Adds a titled separator to the form that spans all columns.

 addSeparator("Name");       // No Mnemonic
 addSeparator("N&ame");      // Mnemonic is 'a'
 addSeparator("Save &as");   // Mnemonic is the second 'a'
 addSeparator("Look&&Feel"); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the separator label's text - may contain an ampersand (&) to mark a mnemonic
Returns:
the added separator

addSeparator

public final JComponent addSeparator(String textWithMnemonic,
                                     CellConstraints constraints)
Adds a titled separator to the form using the specified constraints.

 addSeparator("Name",       CC.xy(1, 1)); // No Mnemonic
 addSeparator("N&ame",      CC.xy(1, 1)); // Mnemonic is 'a'
 addSeparator("Save &as",   CC.xy(1, 1)); // Mnemonic is the second 'a'
 addSeparator("Look&&Feel", CC.xy(1, 1)); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the separator label's text - may contain an ampersand (&) to mark a mnemonic
constraints - the separator's cell constraints
Returns:
the added separator

addSeparator

public final JComponent addSeparator(String textWithMnemonic,
                                     String encodedConstraints)
Adds a titled separator to the form using the specified constraints.

 addSeparator("Name",       "1, 1"); // No Mnemonic
 addSeparator("N&ame",      "1, 1"); // Mnemonic is 'a'
 addSeparator("Save &as",   "1, 1"); // Mnemonic is the second 'a'
 addSeparator("Look&&Feel", "1, 1"); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the separator label's text - may contain an ampersand (&) to mark a mnemonic
encodedConstraints - a string representation for the constraints
Returns:
the added separator

addSeparator

public final JComponent addSeparator(String textWithMnemonic,
                                     int columnSpan)
Adds a titled separator to the form that spans the specified columns.

 addSeparator("Name",       3); // No Mnemonic
 addSeparator("N&ame",      3); // Mnemonic is 'a'
 addSeparator("Save &as",   3); // Mnemonic is the second 'a'
 addSeparator("Look&&Feel", 3); // No mnemonic, text is "look&feel"
 

Parameters:
textWithMnemonic - the separator label's text - may contain an ampersand (&) to mark a mnemonic
columnSpan - the number of columns the separator spans
Returns:
the added separator

add

public final JLabel add(JLabel label,
                        CellConstraints labelConstraints,
                        Component component,
                        CellConstraints componentConstraints)
Adds a label and component to the panel using the given cell constraints. Sets the given label as the component label using JLabel.setLabelFor(java.awt.Component).

Note: The CellConstraints objects for the label and the component must be different. Cell constraints are implicitly cloned by the FormLayout when added to the container. However, in this case you may be tempted to reuse a CellConstraints object in the same way as with many other builder methods that require a single CellConstraints parameter. The pitfall is that the methods CellConstraints.xy*(...) just set the coordinates but do not create a new instance. And so the second invocation of xy*(...) overrides the settings performed in the first invocation before the object is cloned by the FormLayout.

Wrong:

 CellConstraints cc = new CellConstraints();
 builder.add(
     nameLabel,
     cc.xy(1, 7),         // will be modified by the code below
     nameField,
     cc.xy(3, 7)          // sets the single instance to (3, 7)
 );
 
Correct:
 builder.add(
     nameLabel,
     CC.xy(1, 7),         // creates an instance
     nameField,
     CC.xy(3, 7)          // creates another instance
 );
 

Parameters:
label - the label to add
labelConstraints - the label's cell constraints
component - the component to add
componentConstraints - the component's cell constraints
Returns:
the added label
Throws:
IllegalArgumentException - if the same cell constraints instance is used for the label and the component
See Also:
JLabel.setLabelFor(java.awt.Component), DefaultFormBuilder

add

public Component add(Component component,
                     CellConstraints cellConstraints)
Adds a component to the panel using the given cell constraints. In addition to the superclass behavior, this implementation tracks the most recently added label, and associates it with the next added component that is applicable for being set as component for the label.

Overrides:
add in class AbstractFormBuilder
Parameters:
component - the component to add
cellConstraints - the component's cell constraints
Returns:
the added component
See Also:
isLabelForApplicable(JLabel, Component)

isLabelForApplicable

protected boolean isLabelForApplicable(JLabel label,
                                       Component component)
Checks and answers whether the given component shall be set as component for a previously added label using JLabel.setLabelFor(Component). This default implementation checks whether the component is focusable, and - if a JComponent - whether it is already labeled by a JLabel. Subclasses may override.

Parameters:
label - the candidate for labeling component
component - the component that could be labeled by label
Returns:
true if focusable, false otherwise

setLabelFor

protected void setLabelFor(JLabel label,
                           Component component)
Sets label as labeling label for component or an appropriate child. In case of a JScrollPane as given component, this default implementation labels the view of the scroll pane's viewport.

Parameters:
label - the labeling label
component - the component to be labeled, or the parent of the labeled component


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/package-tree.html0000644000175000017500000001772312003555424025277 0ustar tonytony com.jgoodies.forms.builder Class Hierarchy (JGoodies Forms 1.6 API)

Hierarchy For Package com.jgoodies.forms.builder

Package Hierarchies:
All Packages

Class Hierarchy



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/package-use.html0000644000175000017500000002620612003555424025130 0ustar tonytony Uses of Package com.jgoodies.forms.builder (JGoodies Forms 1.6 API)

Uses of Package
com.jgoodies.forms.builder

Packages that use com.jgoodies.forms.builder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Classes in com.jgoodies.forms.builder used by com.jgoodies.forms.builder
AbstractBuilder
          An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.
AbstractButtonPanelBuilder
          The abstract superclass for ButtonBarBuilder.
AbstractFormBuilder
          An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.
ButtonBarBuilder
          A non-visual builder for building consistent button bars that comply with popular style guides.
ButtonBarBuilder2
          Deprecated. Replaced by the ButtonBarBuilder
ButtonStackBuilder
          A non-visual builder that assists you in building consistent button stacks using the FormLayout.
DefaultFormBuilder
          Provides a means to build form-oriented panels quickly and consistently using the FormLayout.
I15dPanelBuilder
          A general purpose builder class that uses the FormLayout to lay out JPanels.
ListViewBuilder
          Builds list/table views from a set of mandatory and optional components: label, filter/search, list (table), list buttons, list extras, details view (or preview).
PanelBuilder
          An general purpose panel builder that uses the FormLayout to lay out JPanels.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/0000755000175000017500000000000012003555424023746 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/I15dPanelBuilder.html0000644000175000017500000002625512003555424027637 0ustar tonytony Uses of Class com.jgoodies.forms.builder.I15dPanelBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.I15dPanelBuilder

Packages that use I15dPanelBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of I15dPanelBuilder in com.jgoodies.forms.builder
 

Subclasses of I15dPanelBuilder in com.jgoodies.forms.builder
 class DefaultFormBuilder
          Provides a means to build form-oriented panels quickly and consistently using the FormLayout.
 

Methods in com.jgoodies.forms.builder that return I15dPanelBuilder
 I15dPanelBuilder I15dPanelBuilder.background(Color background)
           
 I15dPanelBuilder I15dPanelBuilder.border(Border border)
           
 I15dPanelBuilder I15dPanelBuilder.border(String emptyBorderSpec)
           
 I15dPanelBuilder I15dPanelBuilder.opaque(boolean b)
           
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/ButtonStackBuilder.html0000644000175000017500000003555112003555424030415 0ustar tonytony Uses of Class com.jgoodies.forms.builder.ButtonStackBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.ButtonStackBuilder

Packages that use ButtonStackBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of ButtonStackBuilder in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder that return ButtonStackBuilder
 ButtonStackBuilder ButtonStackBuilder.addButton(Action... actions)
           
 ButtonStackBuilder ButtonStackBuilder.addButton(JComponent... buttons)
           
 ButtonStackBuilder ButtonStackBuilder.addButton(JComponent button)
          Adds a button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
 ButtonStackBuilder ButtonStackBuilder.addFixed(JComponent component)
          Adds a fixed size component.
 ButtonStackBuilder ButtonStackBuilder.addGlue()
          Adds a glue that will be given the extra space, if this box is larger than its preferred size.
 ButtonStackBuilder ButtonStackBuilder.addRelatedGap()
           
 ButtonStackBuilder ButtonStackBuilder.addStrut(ConstantSize size)
          Adds a strut of a specified size.
 ButtonStackBuilder ButtonStackBuilder.addUnrelatedGap()
           
 ButtonStackBuilder ButtonStackBuilder.background(Color background)
           
 ButtonStackBuilder ButtonStackBuilder.border(Border border)
           
 ButtonStackBuilder ButtonStackBuilder.opaque(boolean b)
           
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/PanelBuilder.html0000644000175000017500000003044212003555424027205 0ustar tonytony Uses of Class com.jgoodies.forms.builder.PanelBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.PanelBuilder

Packages that use PanelBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of PanelBuilder in com.jgoodies.forms.builder
 

Subclasses of PanelBuilder in com.jgoodies.forms.builder
 class DefaultFormBuilder
          Provides a means to build form-oriented panels quickly and consistently using the FormLayout.
 class I15dPanelBuilder
          A general purpose builder class that uses the FormLayout to lay out JPanels.
 

Methods in com.jgoodies.forms.builder that return PanelBuilder
 PanelBuilder PanelBuilder.background(Color background)
          Sets the panel's background color and the panel to be opaque.
 PanelBuilder PanelBuilder.border(Border border)
          Sets the panel's border.
 PanelBuilder PanelBuilder.border(String emptyBorderSpec)
          Sets the panel's border as an EmptyBorder using the given specification for the top, left, bottom, right in DLU.
 PanelBuilder PanelBuilder.labelForFeatureEnabled(boolean b)
          Enables or disables the setLabelFor feature for this PanelBuilder.
 PanelBuilder PanelBuilder.opaque(boolean b)
          Sets the panel's opaque state.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/AbstractFormBuilder.html0000644000175000017500000002235412003555424030540 0ustar tonytony Uses of Class com.jgoodies.forms.builder.AbstractFormBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.AbstractFormBuilder

Packages that use AbstractFormBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of AbstractFormBuilder in com.jgoodies.forms.builder
 

Subclasses of AbstractFormBuilder in com.jgoodies.forms.builder
 class DefaultFormBuilder
          Provides a means to build form-oriented panels quickly and consistently using the FormLayout.
 class I15dPanelBuilder
          A general purpose builder class that uses the FormLayout to lay out JPanels.
 class PanelBuilder
          An general purpose panel builder that uses the FormLayout to lay out JPanels.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/DefaultFormBuilder.html0000644000175000017500000003323212003555424030356 0ustar tonytony Uses of Class com.jgoodies.forms.builder.DefaultFormBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.DefaultFormBuilder

Packages that use DefaultFormBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of DefaultFormBuilder in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder that return DefaultFormBuilder
 DefaultFormBuilder DefaultFormBuilder.background(Color background)
           
 DefaultFormBuilder DefaultFormBuilder.border(Border border)
           
 DefaultFormBuilder DefaultFormBuilder.border(String emptyBorderSpec)
           
 DefaultFormBuilder DefaultFormBuilder.defaultRowSpec(RowSpec defaultRowSpec)
          Sets the row specification that shall be used for component rows.
 DefaultFormBuilder DefaultFormBuilder.leadingColumnOffset(int columnOffset)
          Sets the offset of the leading column, often 0 or 1.
 DefaultFormBuilder DefaultFormBuilder.lineGapSize(ConstantSize lineGapSize)
          Sets the size of gaps between component lines using the given constant size.
 DefaultFormBuilder DefaultFormBuilder.opaque(boolean b)
           
 DefaultFormBuilder DefaultFormBuilder.paragraphGapSize(ConstantSize paragraphGapSize)
          Sets the size of gaps between paragraphs using the given constant size.
 DefaultFormBuilder DefaultFormBuilder.rowGroupingEnabled(boolean enabled)
          Enables or disables the grouping of new data rows.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/AbstractBuilder.html0000644000175000017500000003001412003555424027704 0ustar tonytony Uses of Class com.jgoodies.forms.builder.AbstractBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.AbstractBuilder

Packages that use AbstractBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of AbstractBuilder in com.jgoodies.forms.builder
 

Subclasses of AbstractBuilder in com.jgoodies.forms.builder
 class AbstractButtonPanelBuilder
          The abstract superclass for ButtonBarBuilder.
 class AbstractFormBuilder
          An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.
 class ButtonBarBuilder
          A non-visual builder for building consistent button bars that comply with popular style guides.
 class ButtonBarBuilder2
          Deprecated. Replaced by the ButtonBarBuilder
 class ButtonStackBuilder
          A non-visual builder that assists you in building consistent button stacks using the FormLayout.
 class DefaultFormBuilder
          Provides a means to build form-oriented panels quickly and consistently using the FormLayout.
 class I15dPanelBuilder
          A general purpose builder class that uses the FormLayout to lay out JPanels.
 class PanelBuilder
          An general purpose panel builder that uses the FormLayout to lay out JPanels.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/ButtonBarBuilder.html0000644000175000017500000003717012003555424030053 0ustar tonytony Uses of Class com.jgoodies.forms.builder.ButtonBarBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.ButtonBarBuilder

Packages that use ButtonBarBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of ButtonBarBuilder in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder that return ButtonBarBuilder
 ButtonBarBuilder ButtonBarBuilder.addButton(Action... actions)
           
 ButtonBarBuilder ButtonBarBuilder.addButton(JComponent... buttons)
           
 ButtonBarBuilder ButtonBarBuilder.addButton(JComponent button)
          Adds a button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
 ButtonBarBuilder ButtonBarBuilder.addFixed(JComponent component)
          Adds a fixed size component with narrow margin.
 ButtonBarBuilder ButtonBarBuilder.addGlue()
          Adds a glue that will be given the extra space, if this button bar is larger than its preferred size.
 ButtonBarBuilder ButtonBarBuilder.addGrowing(JComponent component)
          Adds a component that grows if the container grows.
 ButtonBarBuilder ButtonBarBuilder.addRelatedGap()
          Adds the standard horizontal gap for related components.
 ButtonBarBuilder ButtonBarBuilder.addStrut(ConstantSize width)
          Adds a horizontal strut of the specified width.
 ButtonBarBuilder ButtonBarBuilder.addUnrelatedGap()
          Adds the standard horizontal gap for unrelated components.
 ButtonBarBuilder ButtonBarBuilder.background(Color background)
           
 ButtonBarBuilder ButtonBarBuilder.border(Border border)
           
 ButtonBarBuilder ButtonBarBuilder.opaque(boolean b)
           
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/ListViewBuilder.html0000644000175000017500000004121512003555424027714 0ustar tonytony Uses of Class com.jgoodies.forms.builder.ListViewBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.ListViewBuilder

Packages that use ListViewBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of ListViewBuilder in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder that return ListViewBuilder
 ListViewBuilder ListViewBuilder.border(Border border)
          Sets an optional border that surrounds the list view including the label and details.
 ListViewBuilder ListViewBuilder.detailsView(JComponent detailsView)
          Sets an optional details view that is located under the list view.
 ListViewBuilder ListViewBuilder.filterView(JComponent filterView)
          Sets an optional view that will be placed in the upper right corner of the built list view panel.
 ListViewBuilder ListViewBuilder.filterViewColSpec(String colSpec)
          Changes the FormLayout column specification used to lay out the filter view.
 ListViewBuilder ListViewBuilder.headerLabel(String markedText)
          Creates a header label for the given marked text and sets it as label view.
 ListViewBuilder ListViewBuilder.label(String markedText)
          Creates a plain label for the given marked text and sets it as label view.
 ListViewBuilder ListViewBuilder.labelView(JComponent labelView)
          Sets the mandatory label view.
 ListViewBuilder ListViewBuilder.listBar(JComponent... buttons)
          Builds a button bar using the given buttons and sets it as list bar.
 ListViewBuilder ListViewBuilder.listBarView(JComponent listBarView)
          Sets an optional list bar - often a button bar - that will be located in the lower left corner of the list view.
 ListViewBuilder ListViewBuilder.listExtrasView(JComponent listExtrasView)
          Sets an optional view that is located in the lower right corner of the list view, aligned with the list bar.
 ListViewBuilder ListViewBuilder.listView(JComponent listView)
          Sets the given component as the the mandatory list view.
 ListViewBuilder ListViewBuilder.listViewRowSpec(String rowSpec)
          Changes the FormLayout row specification used to lay out the list view.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/ButtonBarBuilder2.html0000644000175000017500000004314312003555424030132 0ustar tonytony Uses of Class com.jgoodies.forms.builder.ButtonBarBuilder2 (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.ButtonBarBuilder2

Packages that use ButtonBarBuilder2
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of ButtonBarBuilder2 in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder that return ButtonBarBuilder2
 ButtonBarBuilder2 ButtonBarBuilder2.addButton(Action... actions)
          Deprecated.  
 ButtonBarBuilder2 ButtonBarBuilder2.addButton(Action action)
          Deprecated. Adds a JButton for the given Action that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
 ButtonBarBuilder2 ButtonBarBuilder2.addButton(JComponent... buttons)
          Deprecated. Adds a sequence of related button components.
 ButtonBarBuilder2 ButtonBarBuilder2.addButton(JComponent button)
          Deprecated. Adds a command button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
 ButtonBarBuilder2 ButtonBarBuilder2.addFixed(JComponent component)
          Deprecated. Adds a fixed size component with narrow margin.
 ButtonBarBuilder2 ButtonBarBuilder2.addGlue()
          Deprecated. Adds a glue that will be given the extra space, if this button bar is larger than its preferred size.
 ButtonBarBuilder2 ButtonBarBuilder2.addGrowing(JComponent... buttons)
          Deprecated. Adds a sequence of related growing buttons where each is separated by a default gap.
 ButtonBarBuilder2 ButtonBarBuilder2.addGrowing(JComponent component)
          Deprecated. Adds a button or other component that grows if the container grows.
 ButtonBarBuilder2 ButtonBarBuilder2.addRelatedGap()
          Deprecated.  
 ButtonBarBuilder2 ButtonBarBuilder2.addStrut(ConstantSize width)
          Deprecated. Adds a horizontal strut of the specified width.
 ButtonBarBuilder2 ButtonBarBuilder2.addUnrelatedGap()
          Deprecated.  
static ButtonBarBuilder2 ButtonBarBuilder2.createLeftToRightBuilder()
          Deprecated. Creates and returns an empty ButtonBarBuilder2 with a left to right button order.
 ButtonBarBuilder2 ButtonBarBuilder2.setDefaultButtonBarGapBorder()
          Deprecated. Sets a default border that has a gap in the bar's north.
 ButtonBarBuilder2 ButtonBarBuilder2.setLeftToRightButtonOrder(boolean newButtonOrder)
          Deprecated. Sets the order for button sequences to either left to right, or right to left.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/class-use/AbstractButtonPanelBuilder.html0000644000175000017500000003710112003555424032064 0ustar tonytony Uses of Class com.jgoodies.forms.builder.AbstractButtonPanelBuilder (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.builder.AbstractButtonPanelBuilder

Packages that use AbstractButtonPanelBuilder
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
 

Uses of AbstractButtonPanelBuilder in com.jgoodies.forms.builder
 

Subclasses of AbstractButtonPanelBuilder in com.jgoodies.forms.builder
 class ButtonBarBuilder
          A non-visual builder for building consistent button bars that comply with popular style guides.
 class ButtonBarBuilder2
          Deprecated. Replaced by the ButtonBarBuilder
 class ButtonStackBuilder
          A non-visual builder that assists you in building consistent button stacks using the FormLayout.
 

Methods in com.jgoodies.forms.builder that return AbstractButtonPanelBuilder
protected  AbstractButtonPanelBuilder AbstractButtonPanelBuilder.addButton(Action... actions)
          Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.
protected  AbstractButtonPanelBuilder AbstractButtonPanelBuilder.addButton(JComponent... buttons)
          Adds one or many sequences of related buttons.
protected abstract  AbstractButtonPanelBuilder AbstractButtonPanelBuilder.addButton(JComponent button)
           
protected abstract  AbstractButtonPanelBuilder AbstractButtonPanelBuilder.addRelatedGap()
          Adds the standard gap for related components.
protected abstract  AbstractButtonPanelBuilder AbstractButtonPanelBuilder.addUnrelatedGap()
          Adds the standard gap for unrelated components.
protected  AbstractButtonPanelBuilder AbstractButtonPanelBuilder.background(Color background)
          Sets the panel's background color and makes the panel opaque.
protected  AbstractButtonPanelBuilder AbstractButtonPanelBuilder.border(Border border)
          Sets the panel's border.
protected  AbstractButtonPanelBuilder AbstractButtonPanelBuilder.opaque(boolean b)
          Sets the panel's opaque state.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/AbstractFormBuilder.html0000644000175000017500000016641012003555422026641 0ustar tonytony AbstractFormBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class AbstractFormBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
      extended by com.jgoodies.forms.builder.AbstractFormBuilder
Direct Known Subclasses:
PanelBuilder

public abstract class AbstractFormBuilder
extends AbstractBuilder

An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.

Builders hide details of the FormLayout and provide convenience behavior that assists you in constructing a form. This class provides a cell cursor that helps you traverse a form while you add components. Also, it offers several methods to append custom and logical columns and rows.

Version:
$Revision: 1.16 $
Author:
Karsten Lentzsch
See Also:
ButtonBarBuilder, ButtonStackBuilder, PanelBuilder, I15dPanelBuilder, DefaultFormBuilder

Field Summary
 
Fields inherited from class com.jgoodies.forms.builder.AbstractBuilder
currentCellConstraints
 
Constructor Summary
AbstractFormBuilder(FormLayout layout, Container container)
          Constructs an AbstractFormBuilder for the given FormLayout and layout container.
 
Method Summary
 Component add(Component component)
          Adds a component to the container using the default cell constraints.
 Component add(Component component, CellConstraints cellConstraints)
          Adds a component to the panel using the given cell constraints.
 Component add(Component component, String encodedCellConstraints)
          Adds a component to the panel using the given encoded cell constraints.
 void appendColumn(ColumnSpec columnSpec)
          Appends the given column specification to the builder's layout.
 void appendColumn(String encodedColumnSpec)
          Appends a column specification to the builder's layout that represents the given string encoding.
 void appendGlueColumn()
          Appends a glue column.
 void appendGlueRow()
          Appends a glue row.
 void appendLabelComponentsGapColumn()
          Appends a column that is the default gap between a label and its associated component.
 void appendParagraphGapRow()
          Appends a row that is the default gap for paragraphs.
 void appendRelatedComponentsGapColumn()
          Appends a column that is the default gap for related components.
 void appendRelatedComponentsGapRow()
          Appends a row that is the default gap for related components.
 void appendRow(RowSpec rowSpec)
          Appends the given row specification to the builder's layout.
 void appendRow(String encodedRowSpec)
          Appends a row specification to the builder's layout that represents the given string encoding.
 void appendUnrelatedComponentsGapColumn()
          Appends a column that is the default gap for unrelated components.
 void appendUnrelatedComponentsGapRow()
          Appends a row that is the default gap for unrelated components.
protected  CellConstraints cellConstraints()
          Returns the CellConstraints object that is used as a cursor and holds the current column span and row span.
protected  CellConstraints createLeftAdjustedConstraints(int columnSpan)
          Creates and returns a CellConstraints object at the current cursor position that uses the given column span and is adjusted to the left.
 int getColumn()
          Returns the cursor's column.
protected  int getColumnIncrementSign()
          Returns the sign (-1 or 1) used to increment the cursor's column when moving to the next column.
protected  int getLeadingColumn()
          Returns the index of the leading column.
 int getRow()
          Returns the cursor's row.
 boolean isLeftToRight()
          Returns whether this builder fills the form left-to-right or right-to-left.
 void nextColumn()
          Moves to the next column, does the same as #nextColumn(1).
 void nextColumn(int columns)
          Moves to the next column.
 void nextLine()
          Moves to the next line: increases the row and resets the column; does the same as #nextLine(1).
 void nextLine(int lines)
          Moves the cursor down several lines: increases the row by the specified number of lines and sets the cursor to the leading column.
 void nextRow()
          Increases the row by one; does the same as #nextRow(1).
 void nextRow(int rows)
          Increases the row by the specified rows.
 void setAlignment(CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign)
          Sets the horizontal and vertical alignment.
 void setBounds(int column, int row, int columnSpan, int rowSpan)
          Sets the cell bounds (location and extent) to the given column, row, column span and row span.
 void setColumn(int column)
          Sets the cursor to the given column.
 void setColumnSpan(int columnSpan)
          Sets the cursor's column span.
 void setExtent(int columnSpan, int rowSpan)
          Sets the cursor's extent to the given column span and row span.
 void setHAlignment(CellConstraints.Alignment alignment)
          Sets the horizontal alignment.
 void setLeftToRight(boolean b)
          Sets the form fill direction to left-to-right or right-to-left.
 void setOrigin(int column, int row)
          Sets the cursor's origin to the given column and row.
 void setRow(int row)
          Sets the cursor to the given row.
 void setRowSpan(int rowSpan)
          Sets the cursor's row span.
 void setVAlignment(CellConstraints.Alignment alignment)
          Sets the vertical alignment.
 
Methods inherited from class com.jgoodies.forms.builder.AbstractBuilder
createComponentFactory, getColumnCount, getComponentFactory, getComponentFactoryDefault, getContainer, getLayout, getRowCount, setComponentFactory, setComponentFactoryDefault
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

AbstractFormBuilder

public AbstractFormBuilder(FormLayout layout,
                           Container container)
Constructs an AbstractFormBuilder for the given FormLayout and layout container.

Parameters:
layout - the FormLayout to use
container - the layout container
Throws:
NullPointerException - if layout or container is null
Method Detail

isLeftToRight

public final boolean isLeftToRight()
Returns whether this builder fills the form left-to-right or right-to-left. The initial value of this property is set during the builder construction from the layout container's componentOrientation property.

Returns:
true indicates left-to-right, false indicates right-to-left
See Also:
setLeftToRight(boolean), ComponentOrientation

setLeftToRight

public final void setLeftToRight(boolean b)
Sets the form fill direction to left-to-right or right-to-left. The initial value of this property is set during the builder construction from the layout container's componentOrientation property.

Parameters:
b - true indicates left-to-right, false right-to-left
See Also:
isLeftToRight(), ComponentOrientation

getColumn

public final int getColumn()
Returns the cursor's column.

Returns:
the cursor's column

setColumn

public final void setColumn(int column)
Sets the cursor to the given column.

Parameters:
column - the cursor's new column index

getRow

public final int getRow()
Returns the cursor's row.

Returns:
the cursor's row

setRow

public final void setRow(int row)
Sets the cursor to the given row.

Parameters:
row - the cursor's new row index

setColumnSpan

public final void setColumnSpan(int columnSpan)
Sets the cursor's column span.

Parameters:
columnSpan - the cursor's new column span (grid width)

setRowSpan

public final void setRowSpan(int rowSpan)
Sets the cursor's row span.

Parameters:
rowSpan - the cursor's new row span (grid height)

setOrigin

public final void setOrigin(int column,
                            int row)
Sets the cursor's origin to the given column and row.

Parameters:
column - the new column index
row - the new row index

setExtent

public final void setExtent(int columnSpan,
                            int rowSpan)
Sets the cursor's extent to the given column span and row span.

Parameters:
columnSpan - the new column span (grid width)
rowSpan - the new row span (grid height)

setBounds

public final void setBounds(int column,
                            int row,
                            int columnSpan,
                            int rowSpan)
Sets the cell bounds (location and extent) to the given column, row, column span and row span.

Parameters:
column - the new column index (grid x)
row - the new row index (grid y)
columnSpan - the new column span (grid width)
rowSpan - the new row span (grid height)

setHAlignment

public final void setHAlignment(CellConstraints.Alignment alignment)
Sets the horizontal alignment.

Parameters:
alignment - the new horizontal alignment

setVAlignment

public final void setVAlignment(CellConstraints.Alignment alignment)
Sets the vertical alignment.

Parameters:
alignment - the new vertical alignment

setAlignment

public final void setAlignment(CellConstraints.Alignment hAlign,
                               CellConstraints.Alignment vAlign)
Sets the horizontal and vertical alignment.

Parameters:
hAlign - the new horizontal alignment
vAlign - the new vertical alignment

nextColumn

public final void nextColumn()
Moves to the next column, does the same as #nextColumn(1).


nextColumn

public final void nextColumn(int columns)
Moves to the next column.

Parameters:
columns - number of columns to move

nextRow

public final void nextRow()
Increases the row by one; does the same as #nextRow(1).


nextRow

public final void nextRow(int rows)
Increases the row by the specified rows.

Parameters:
rows - number of rows to move

nextLine

public final void nextLine()
Moves to the next line: increases the row and resets the column; does the same as #nextLine(1).


nextLine

public final void nextLine(int lines)
Moves the cursor down several lines: increases the row by the specified number of lines and sets the cursor to the leading column.

Parameters:
lines - number of rows to move

appendColumn

public final void appendColumn(ColumnSpec columnSpec)
Appends the given column specification to the builder's layout.

Parameters:
columnSpec - the column specification object to append
See Also:
appendColumn(String)

appendColumn

public final void appendColumn(String encodedColumnSpec)
Appends a column specification to the builder's layout that represents the given string encoding.

Parameters:
encodedColumnSpec - the column specification to append in encoded form
See Also:
appendColumn(ColumnSpec)

appendGlueColumn

public final void appendGlueColumn()
Appends a glue column.

See Also:
appendLabelComponentsGapColumn(), appendRelatedComponentsGapColumn(), appendUnrelatedComponentsGapColumn()

appendLabelComponentsGapColumn

public final void appendLabelComponentsGapColumn()
Appends a column that is the default gap between a label and its associated component.

Since:
1.0.3
See Also:
appendGlueColumn(), appendRelatedComponentsGapColumn(), appendUnrelatedComponentsGapColumn()

appendRelatedComponentsGapColumn

public final void appendRelatedComponentsGapColumn()
Appends a column that is the default gap for related components.

See Also:
appendGlueColumn(), appendLabelComponentsGapColumn(), appendUnrelatedComponentsGapColumn()

appendUnrelatedComponentsGapColumn

public final void appendUnrelatedComponentsGapColumn()
Appends a column that is the default gap for unrelated components.

See Also:
appendGlueColumn(), appendLabelComponentsGapColumn(), appendRelatedComponentsGapColumn()

appendRow

public final void appendRow(RowSpec rowSpec)
Appends the given row specification to the builder's layout.

Parameters:
rowSpec - the row specification object to append
See Also:
appendRow(String)

appendRow

public final void appendRow(String encodedRowSpec)
Appends a row specification to the builder's layout that represents the given string encoding.

Parameters:
encodedRowSpec - the row specification to append in encoded form
See Also:
appendRow(RowSpec)

appendGlueRow

public final void appendGlueRow()
Appends a glue row.

See Also:
appendRelatedComponentsGapRow(), appendUnrelatedComponentsGapRow(), appendParagraphGapRow()

appendRelatedComponentsGapRow

public final void appendRelatedComponentsGapRow()
Appends a row that is the default gap for related components.

See Also:
appendGlueRow(), appendUnrelatedComponentsGapRow(), appendParagraphGapRow()

appendUnrelatedComponentsGapRow

public final void appendUnrelatedComponentsGapRow()
Appends a row that is the default gap for unrelated components.

See Also:
appendGlueRow(), appendRelatedComponentsGapRow(), appendParagraphGapRow()

appendParagraphGapRow

public final void appendParagraphGapRow()
Appends a row that is the default gap for paragraphs.

Since:
1.0.3
See Also:
appendGlueRow(), appendRelatedComponentsGapRow(), appendUnrelatedComponentsGapRow()

add

public Component add(Component component,
                     CellConstraints cellConstraints)
Adds a component to the panel using the given cell constraints.

Parameters:
component - the component to add
cellConstraints - the component's cell constraints
Returns:
the added component

add

public final Component add(Component component,
                           String encodedCellConstraints)
Adds a component to the panel using the given encoded cell constraints.

Parameters:
component - the component to add
encodedCellConstraints - the component's encoded cell constraints
Returns:
the added component

add

public final Component add(Component component)
Adds a component to the container using the default cell constraints. Note that when building from left to right, this method won't adjust the cell constraints if the column span is larger than 1. In this case you should use add(Component, CellConstraints) with a cell constraints object created by createLeftAdjustedConstraints(int).

Parameters:
component - the component to add
Returns:
the added component
See Also:
add(Component, CellConstraints), createLeftAdjustedConstraints(int)

cellConstraints

protected final CellConstraints cellConstraints()
Returns the CellConstraints object that is used as a cursor and holds the current column span and row span.

Returns:
the builder's current CellConstraints object

getLeadingColumn

protected int getLeadingColumn()
Returns the index of the leading column.

Subclasses may override this method, for example, if the form has a leading gap column that should not be filled with components.

Returns:
the leading column

getColumnIncrementSign

protected final int getColumnIncrementSign()
Returns the sign (-1 or 1) used to increment the cursor's column when moving to the next column.

Returns:
-1 for right-to-left, 1 for left-to-right

createLeftAdjustedConstraints

protected final CellConstraints createLeftAdjustedConstraints(int columnSpan)
Creates and returns a CellConstraints object at the current cursor position that uses the given column span and is adjusted to the left. Useful when building from right to left.

Parameters:
columnSpan - the column span to be used in the constraints
Returns:
CellConstraints adjusted to the left hand side


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/package-summary.html0000644000175000017500000002627012003555424026032 0ustar tonytony com.jgoodies.forms.builder (JGoodies Forms 1.6 API)

Package com.jgoodies.forms.builder

Contains optional builder classes of the Forms framework.

See:
          Description

Class Summary
AbstractBuilder An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.
AbstractButtonPanelBuilder The abstract superclass for ButtonBarBuilder.
AbstractFormBuilder An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.
ButtonBarBuilder A non-visual builder for building consistent button bars that comply with popular style guides.
ButtonBarBuilder2 Deprecated. Replaced by the ButtonBarBuilder
ButtonStackBuilder A non-visual builder that assists you in building consistent button stacks using the FormLayout.
DefaultFormBuilder Provides a means to build form-oriented panels quickly and consistently using the FormLayout.
I15dPanelBuilder A general purpose builder class that uses the FormLayout to lay out JPanels.
ListViewBuilder Builds list/table views from a set of mandatory and optional components: label, filter/search, list (table), list buttons, list extras, details view (or preview).
PanelBuilder An general purpose panel builder that uses the FormLayout to lay out JPanels.
 

Package com.jgoodies.forms.builder Description

Contains optional builder classes of the Forms framework. These non-visual builders assist you in building forms or in writing new form builder classes.

Related Documentation

For more information see:

See Also:
com.jgoodies.forms.layout, com.jgoodies.forms.factories


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/DefaultFormBuilder.html0000644000175000017500000037241512003555424026470 0ustar tonytony DefaultFormBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class DefaultFormBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
      extended by com.jgoodies.forms.builder.AbstractFormBuilder
          extended by com.jgoodies.forms.builder.PanelBuilder
              extended by com.jgoodies.forms.builder.I15dPanelBuilder
                  extended by com.jgoodies.forms.builder.DefaultFormBuilder

public final class DefaultFormBuilder
extends I15dPanelBuilder

Provides a means to build form-oriented panels quickly and consistently using the FormLayout. This builder combines frequently used panel building steps: add a new row, add a label, proceed to the next data column, then add a component.

The extra value lies in the #append methods that append gap rows and component rows if necessary and then add the given components. They are built upon the superclass behavior #appendRow and the set of #add methods. A set of component appenders allows to add a textual label and associated component in a single step.

This builder can map resource keys to internationalized (i15d) texts when creating text labels, titles and titled separators. Therefore you must specify a ResourceBundle in the constructor. The builder methods throw an IllegalStateException if one of the mapping builder methods is invoked and no bundle has been set.

You can configure the build process by setting a leading column, enabling the row grouping and by modifying the gaps between normal lines and between paragraphs. The leading column will be honored if the cursor proceeds to the next row. All appended components start in the specified lead column, except appended separators that span all columns.

It is temptive to use the DefaultFormBuilder all the time and to let it add rows automatically. Use a simpler style if it increases the code readability. Explicit row specifications and cell constraints make your layout easier to understand - but harder to maintain. See also the accompanying tutorial sources and the Tips & Tricks that are part of the Forms documentation.

Sometimes a form consists of many standardized rows but has a few rows that require a customization. The DefaultFormBuilder can do everything that the superclasses AbstractFormBuilder and PanelBuilder can do; among other things: appending new rows and moving the cursor. Again, ask yourself if the DefaultFormBuilder is the appropriate builder. As a rule of thumb you should have more components than builder commands. There are different ways to add custom rows. Find below example code that presents and compares the pros and cons of three approaches.

The texts for labels and titles can be marked texts, i.e. strings with an optional mnemonic marker. See the MnemonicUtils class comment for details.

Example:

 public void build() {
     FormLayout layout = new FormLayout(
         "right:max(40dlu;pref), 3dlu, 80dlu, 7dlu, " // 1st major colum
       + "right:max(40dlu;pref), 3dlu, 80dlu",        // 2nd major column
         "");                                         // add rows dynamically
     DefaultFormBuilder builder = new DefaultFormBuilder(layout)
                .border(Borders.DIALOG);

     builder.appendSeparator("Flange");

     builder.append("Identifier", identifierField);
     builder.nextLine();

     builder.append("PTI [kW]",   new JTextField());
     builder.append("Power [kW]", new JTextField());

     builder.append("s [mm]",     new JTextField());
     builder.nextLine();

     builder.appendSeparator("Diameters");

     builder.append("da [mm]",    new JTextField());
     builder.append("di [mm]",    new JTextField());

     builder.append("da2 [mm]",   new JTextField());
     builder.append("di2 [mm]",   new JTextField());

     builder.append("R [mm]",     new JTextField());
     builder.append("D [mm]",     new JTextField());

     builder.appendSeparator("Criteria");

     builder.append("Location",   buildLocationComboBox());
     builder.append("k-factor",   new JTextField());

     builder.appendSeparator("Bolts");

     builder.append("Material",   ViewerUIFactory.buildMaterialComboBox());
     builder.nextLine();

     builder.append("Numbers",    new JTextField());
     builder.nextLine();

     builder.append("ds [mm]",    new JTextField());
 }
 

Custom Row Example:

 public JComponent buildPanel() {
     initComponents();

     FormLayout layout = new FormLayout(
             "right:pref, 3dlu, default:grow",
             "");
     DefaultFormBuilder builder = new DefaultFormBuilder(layout)
            .border(Borders.DIALOG)
          .rowGroupingEnabled(true);

     // In this approach, we add a gap and a custom row.
     // The advantage of this approach is, that we can express
     // the row spec and comment area cell constraints freely.
     // The disadvantage is the misalignment of the leading label.
     // Also the row's height may be inconsistent with other rows.
     builder.appendSeparator("Single Custom Row");
     builder.append("Name", name1Field);
     builder.appendRow(builder.getLineGapSpec());
     builder.appendRow(new RowSpec("top:31dlu")); // Assumes line is 14, gap is 3
     builder.nextLine(2);
     builder.append("Comment");
     builder.add(new JScrollPane(comment1Area),
                 CC.xy(builder.getColumn(), builder.getRow(), "fill, fill"));
     builder.nextLine();

     // In this approach, we append a standard row with gap before it.
     // The advantage is, that the leading label is aligned well.
     // The disadvantage is that the comment area now spans
     // multiple cells and is slightly less flexible.
     // Also the row's height may be inconsistent with other rows.
     builder.appendSeparator("Standard + Custom Row");
     builder.append("Name", name2Field);
     builder.append("Comment");
     builder.appendRow(new RowSpec("17dlu")); // Assumes line is 14, gap is 3
     builder.add(new JScrollPane(comment2Area),
                 CC.xywh(builder.getColumn(), builder.getRow(), 1, 2));
     builder.nextLine(2);

     // In this approach, we append two standard rows with associated gaps.
     // The advantage is, that the leading label is aligned well,
     // and the height is consistent with other rows.
     // The disadvantage is that the comment area now spans
     // multiple cells and is slightly less flexible.
     builder.appendSeparator("Two Standard Rows");
     builder.append("Name", name3Field);
     builder.append("Comment");
     builder.nextLine();
     builder.append("");
     builder.nextRow(-2);
     builder.add(new JScrollPane(comment3Area),
                 CC.xywh(builder.getColumn(), builder.getRow(), 1, 3));

     return builder.build();
 }
 

TODO: Consider adding a method for appending a component that spans the remaining columns in the current row. Method name candidates are #appendFullSpan and #appendRemaining.

Since:
1.0.3
Version:
$Revision: 1.16 $
Author:
Karsten Lentzsch
See Also:
AbstractFormBuilder, FormSpecs, FormLayout

Field Summary
 
Fields inherited from class com.jgoodies.forms.builder.AbstractBuilder
currentCellConstraints
 
Constructor Summary
DefaultFormBuilder(FormLayout layout)
          Constructs a DefaultFormBuilder for the given layout.
DefaultFormBuilder(FormLayout layout, JPanel container)
          Constructs a DefaultFormBuilder for the given layout and panel.
DefaultFormBuilder(FormLayout layout, ResourceBundle bundle)
          Constructs a DefaultFormBuilder for the given layout and resource bundle.
DefaultFormBuilder(FormLayout layout, ResourceBundle bundle, JPanel container)
          Constructs a DefaultFormBuilder for the given layout, resource bundle, and panel.
DefaultFormBuilder(FormLayout layout, com.jgoodies.common.internal.StringLocalizer localizer)
          Constructs a DefaultFormBuilder for the given layout and resource bundle.
DefaultFormBuilder(FormLayout layout, com.jgoodies.common.internal.StringLocalizer localizer, JPanel container)
          Constructs a DefaultFormBuilder for the given layout, resource bundle, and panel.
 
Method Summary
 void append(Component component)
          Adds a component to the panel using the default constraints with a column span of 1.
 void append(Component c1, Component c2)
          Adds two components to the panel; each component will span a single data column.
 void append(Component c1, Component c2, Component c3)
          Adds three components to the panel; each component will span a single data column.
 void append(Component component, int columnSpan)
          Adds a component to the panel using the default constraints with the given columnSpan.
 JLabel append(String textWithMnemonic)
          Adds a text label to the panel and proceeds to the next column.
 JLabel append(String textWithMnemonic, Component component)
          Adds a text label and component to the panel.
 JLabel append(String textWithMnemonic, Component c, boolean nextLine)
          Adds a text label and component to the panel; the component will span the specified number columns.
 JLabel append(String textWithMnemonic, Component c1, Component c2)
          Adds a text label and two components to the panel; each component will span a single column.
 JLabel append(String textWithMnemonic, Component c1, Component c2, Component c3)
          Adds a text label and three components to the panel; each component will span a single column.
 JLabel append(String textWithMnemonic, Component c1, Component c2, Component c3, Component c4)
          Adds a text label and four components to the panel; each component will span a single column.
 JLabel append(String textWithMnemonic, Component c1, Component c2, int colSpan)
          Adds a text label and two components to the panel; each component will span a single column.
 JLabel append(String textWithMnemonic, Component c, int columnSpan)
          Adds a text label and component to the panel; the component will span the specified number columns.
 JLabel appendI15d(String resourceKey)
          Adds an internationalized (i15d) text label to the panel using the given resource key and proceeds to the next column.
 JLabel appendI15d(String resourceKey, Component component)
          Adds an internationalized (i15d) text label and component to the panel.
 JLabel appendI15d(String resourceKey, Component component, boolean nextLine)
          Adds an internationalized (i15d) text label and component to the panel.
 JLabel appendI15d(String resourceKey, Component c1, Component c2)
          Adds an internationalized (i15d) text label and two components to the panel; each component will span a single column.
 JLabel appendI15d(String resourceKey, Component c1, Component c2, Component c3)
          Adds an internationalized (i15d) text label and three components to the panel; each component will span a single column.
 JLabel appendI15d(String resourceKey, Component c1, Component c2, Component c3, Component c4)
          Adds an internationalized (i15d) text label and four components to the panel; each component will span a single column.
 JLabel appendI15d(String resourceKey, Component c1, Component c2, int colSpan)
          Adds an internationalized (i15d) text label and two components to the panel; each component will span a single column.
 JLabel appendI15d(String resourceKey, Component c, int columnSpan)
          Adds an internationalized (i15d) text label to the panel using the given resource key; then proceeds to the next data column and adds a component with the given column span.
 JComponent appendI15dSeparator(String resourceKey)
          Appends an internationalized titled separator for the given resource key that spans all columns.
 JLabel appendI15dTitle(String resourceKey)
          Adds an internationalized title label to the panel and proceeds to the next column.
 JComponent appendSeparator()
          Adds a separator without text that spans all columns.
 JComponent appendSeparator(String text)
          Adds a separator with the given text that spans all columns.
 JLabel appendTitle(String textWithMnemonic)
          Adds a title label to the panel and proceeds to the next column.
 DefaultFormBuilder background(Color background)
          Sets the panel's background color and the panel to be opaque.
 DefaultFormBuilder border(Border border)
          Sets the panel's border.
 DefaultFormBuilder border(String emptyBorderSpec)
          Sets the panel's border as an EmptyBorder using the given specification for the top, left, bottom, right in DLU.
 DefaultFormBuilder defaultRowSpec(RowSpec defaultRowSpec)
          Sets the row specification that shall be used for component rows.
 RowSpec getDefaultRowSpec()
          Deprecated. Obsolete; will be deleted from the next version
protected  int getLeadingColumn()
          Returns the leading column.
 int getLeadingColumnOffset()
          Deprecated. Obsolete; will be deleted from the next version
 RowSpec getLineGapSpec()
          Deprecated. Obsolete; will be deleted from the next version
 boolean isRowGroupingEnabled()
          Deprecated. Obsolete; will be deleted from the next version
 DefaultFormBuilder leadingColumnOffset(int columnOffset)
          Sets the offset of the leading column, often 0 or 1.
 DefaultFormBuilder lineGapSize(ConstantSize lineGapSize)
          Sets the size of gaps between component lines using the given constant size.
 DefaultFormBuilder opaque(boolean b)
          Sets the panel's opaque state.
 DefaultFormBuilder paragraphGapSize(ConstantSize paragraphGapSize)
          Sets the size of gaps between paragraphs using the given constant size.
 DefaultFormBuilder rowGroupingEnabled(boolean enabled)
          Enables or disables the grouping of new data rows.
 void setDefaultRowSpec(RowSpec defaultRowSpec)
          Deprecated. Replaced by defaultRowSpec(RowSpec)
 void setLeadingColumnOffset(int columnOffset)
          Deprecated. Replaced by leadingColumnOffset(int)
 void setLineGapSize(ConstantSize lineGapSize)
          Deprecated. Replaced by lineGapSize(ConstantSize)
 void setParagraphGapSize(ConstantSize paragraphGapSize)
          Deprecated. Replaced by lineGapSize(ConstantSize)
 void setRowGroupingEnabled(boolean enabled)
          Deprecated. Replaced by rowGroupingEnabled(boolean)
 
Methods inherited from class com.jgoodies.forms.builder.I15dPanelBuilder
addI15dLabel, addI15dLabel, addI15dLabel, addI15dROLabel, addI15dROLabel, addI15dROLabel, addI15dSeparator, addI15dSeparator, addI15dTitle, addI15dTitle, getI15dString, isDebugToolTipsEnabled, setDebugToolTipsEnabled
 
Methods inherited from class com.jgoodies.forms.builder.PanelBuilder
add, add, addLabel, addLabel, addLabel, addLabel, addROLabel, addROLabel, addROLabel, addROLabel, addSeparator, addSeparator, addSeparator, addSeparator, addTitle, addTitle, addTitle, build, getLabelForFeatureEnabledDefault, getOpaqueDefault, getPanel, isLabelForApplicable, labelForFeatureEnabled, setBorder, setDefaultDialogBorder, setLabelFor, setLabelForFeatureEnabledDefault, setOpaque, setOpaqueDefault
 
Methods inherited from class com.jgoodies.forms.builder.AbstractFormBuilder
add, add, appendColumn, appendColumn, appendGlueColumn, appendGlueRow, appendLabelComponentsGapColumn, appendParagraphGapRow, appendRelatedComponentsGapColumn, appendRelatedComponentsGapRow, appendRow, appendRow, appendUnrelatedComponentsGapColumn, appendUnrelatedComponentsGapRow, cellConstraints, createLeftAdjustedConstraints, getColumn, getColumnIncrementSign, getRow, isLeftToRight, nextColumn, nextColumn, nextLine, nextLine, nextRow, nextRow, setAlignment, setBounds, setColumn, setColumnSpan, setExtent, setHAlignment, setLeftToRight, setOrigin, setRow, setRowSpan, setVAlignment
 
Methods inherited from class com.jgoodies.forms.builder.AbstractBuilder
createComponentFactory, getColumnCount, getComponentFactory, getComponentFactoryDefault, getContainer, getLayout, getRowCount, setComponentFactory, setComponentFactoryDefault
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

DefaultFormBuilder

public DefaultFormBuilder(FormLayout layout)
Constructs a DefaultFormBuilder for the given layout.

Parameters:
layout - the FormLayout to be used
Throws:
NullPointerException - if layout is null

DefaultFormBuilder

public DefaultFormBuilder(FormLayout layout,
                          JPanel container)
Constructs a DefaultFormBuilder for the given layout and panel.

Parameters:
layout - the FormLayout to be used
container - the layout container
Throws:
NullPointerException - if layout or container is null

DefaultFormBuilder

public DefaultFormBuilder(FormLayout layout,
                          ResourceBundle bundle)
Constructs a DefaultFormBuilder for the given layout and resource bundle.

Parameters:
layout - the FormLayout to be used
bundle - the ResourceBundle used to lookup i15d strings
Throws:
NullPointerException - if layout is null

DefaultFormBuilder

public DefaultFormBuilder(FormLayout layout,
                          ResourceBundle bundle,
                          JPanel container)
Constructs a DefaultFormBuilder for the given layout, resource bundle, and panel.

Parameters:
layout - the FormLayout to be used
container - the layout container
bundle - the ResourceBundle used to lookup i15d strings
Throws:
NullPointerException - if layout or container is null

DefaultFormBuilder

public DefaultFormBuilder(FormLayout layout,
                          com.jgoodies.common.internal.StringLocalizer localizer)
Constructs a DefaultFormBuilder for the given layout and resource bundle.

Parameters:
layout - the FormLayout to be used
localizer - used to lookup i15d strings
Throws:
NullPointerException - if layout is null

DefaultFormBuilder

public DefaultFormBuilder(FormLayout layout,
                          com.jgoodies.common.internal.StringLocalizer localizer,
                          JPanel container)
Constructs a DefaultFormBuilder for the given layout, resource bundle, and panel.

Parameters:
layout - the FormLayout to be used
container - the layout container
localizer - used to lookup i15d strings
Throws:
NullPointerException - if layout or container is null
Method Detail

background

public DefaultFormBuilder background(Color background)
Description copied from class: PanelBuilder
Sets the panel's background color and the panel to be opaque.

Overrides:
background in class I15dPanelBuilder
Parameters:
background - the color to set as new background
See Also:
JComponent.setBackground(Color)

border

public DefaultFormBuilder border(Border border)
Description copied from class: PanelBuilder
Sets the panel's border.

Overrides:
border in class I15dPanelBuilder
Parameters:
border - the border to set
See Also:
JComponent.setBorder(Border)

border

public DefaultFormBuilder border(String emptyBorderSpec)
Description copied from class: PanelBuilder
Sets the panel's border as an EmptyBorder using the given specification for the top, left, bottom, right in DLU. For example "1dlu, 2dlu, 3dlu, 4dlu" sets an empty border with 1dlu in the top, 2dlu in the left side, 3dlu at the bottom, and 4dlu in the right hand side.

Equivalent to setBorder(Borders.createEmptyBorder(emptyBorderSpec)).

Overrides:
border in class I15dPanelBuilder
Parameters:
emptyBorderSpec - describes the top, left, bottom, right sizes of the EmptyBorder to create
See Also:
Borders.createEmptyBorder(String)

opaque

public DefaultFormBuilder opaque(boolean b)
Description copied from class: PanelBuilder
Sets the panel's opaque state.

Overrides:
opaque in class I15dPanelBuilder
Parameters:
b - true for opaque, false for non-opaque
See Also:
JComponent.setOpaque(boolean)

defaultRowSpec

public DefaultFormBuilder defaultRowSpec(RowSpec defaultRowSpec)
Sets the row specification that shall be used for component rows. It is FormSpecs.PREF_ROWSPEC by default.

Parameters:
defaultRowSpec - the RowSpec to be used for component rows

lineGapSize

public DefaultFormBuilder lineGapSize(ConstantSize lineGapSize)
Sets the size of gaps between component lines using the given constant size.

Examples:

 .lineGapSize(Sizes.ZERO);
 .lineGapSize(Sizes.DLUY9);
 .lineGapSize(Sizes.pixel(1));
 

Parameters:
lineGapSize - the ConstantSize that describes the size of the gaps between component lines

paragraphGapSize

public DefaultFormBuilder paragraphGapSize(ConstantSize paragraphGapSize)
Sets the size of gaps between paragraphs using the given constant size.

Examples:

 .setParagraphGapSize(Sizes.DLUY14);
 .setParagraphGapSize(Sizes.dluY(22));
 .setParagraphGapSize(Sizes.pixel(42));
 

Parameters:
paragraphGapSize - the ConstantSize that describes the size of the gaps between paragraphs

leadingColumnOffset

public DefaultFormBuilder leadingColumnOffset(int columnOffset)
Sets the offset of the leading column, often 0 or 1.

Parameters:
columnOffset - the new offset of the leading column

rowGroupingEnabled

public DefaultFormBuilder rowGroupingEnabled(boolean enabled)
Enables or disables the grouping of new data rows.

Parameters:
enabled - indicates grouping enabled, false disabled

getDefaultRowSpec

@Deprecated
public RowSpec getDefaultRowSpec()
Deprecated. Obsolete; will be deleted from the next version

Returns the row specification that is used for component rows.

Returns:
the RowSpec used for component rows
Since:
1.2

setDefaultRowSpec

@Deprecated
public void setDefaultRowSpec(RowSpec defaultRowSpec)
Deprecated. Replaced by defaultRowSpec(RowSpec)

Sets the row specification that shall be used for component rows. It is FormSpecs.PREF_ROWSPEC by default.

Parameters:
defaultRowSpec - the RowSpec to be used for component rows
Since:
1.2

getLineGapSpec

@Deprecated
public RowSpec getLineGapSpec()
Deprecated. Obsolete; will be deleted from the next version

Returns the row specification that is used to separate component row.

Returns:
the RowSpec that is used to separate component rows

setLineGapSize

@Deprecated
public void setLineGapSize(ConstantSize lineGapSize)
Deprecated. Replaced by lineGapSize(ConstantSize)

Sets the size of gaps between component lines using the given constant size.

Examples:

 .setLineGapSize(Sizes.ZERO);
 .setLineGapSize(Sizes.DLUY9);
 .setLineGapSize(Sizes.pixel(1));
 

Parameters:
lineGapSize - the ConstantSize that describes the size of the gaps between component lines

setParagraphGapSize

@Deprecated
public void setParagraphGapSize(ConstantSize paragraphGapSize)
Deprecated. Replaced by lineGapSize(ConstantSize)

Sets the size of gaps between paragraphs using the given constant size.

Examples:

 .setParagraphGapSize(Sizes.DLUY14);
 .setParagraphGapSize(Sizes.dluY(22));
 .setParagraphGapSize(Sizes.pixel(42));
 

Parameters:
paragraphGapSize - the ConstantSize that describes the size of the gaps between paragraphs

getLeadingColumnOffset

@Deprecated
public int getLeadingColumnOffset()
Deprecated. Obsolete; will be deleted from the next version

Returns the offset of the leading column, often 0 or 1.

Returns:
the offset of the leading column

setLeadingColumnOffset

@Deprecated
public void setLeadingColumnOffset(int columnOffset)
Deprecated. Replaced by leadingColumnOffset(int)

Sets the offset of the leading column, often 0 or 1.

Parameters:
columnOffset - the new offset of the leading column

isRowGroupingEnabled

@Deprecated
public boolean isRowGroupingEnabled()
Deprecated. Obsolete; will be deleted from the next version

Returns whether new data rows are being grouped or not.

Returns:
true indicates grouping enabled, false disabled

setRowGroupingEnabled

@Deprecated
public void setRowGroupingEnabled(boolean enabled)
Deprecated. Replaced by rowGroupingEnabled(boolean)

Enables or disables the grouping of new data rows.

Parameters:
enabled - indicates grouping enabled, false disabled

append

public void append(Component component)
Adds a component to the panel using the default constraints with a column span of 1. Then proceeds to the next data column.

Parameters:
component - the component to add

append

public void append(Component component,
                   int columnSpan)
Adds a component to the panel using the default constraints with the given columnSpan. Proceeds to the next data column.

Parameters:
component - the component to append
columnSpan - the column span used to add

append

public void append(Component c1,
                   Component c2)
Adds two components to the panel; each component will span a single data column. Proceeds to the next data column.

Parameters:
c1 - the first component to add
c2 - the second component to add

append

public void append(Component c1,
                   Component c2,
                   Component c3)
Adds three components to the panel; each component will span a single data column. Proceeds to the next data column.

Parameters:
c1 - the first component to add
c2 - the second component to add
c3 - the third component to add

append

public JLabel append(String textWithMnemonic)
Adds a text label to the panel and proceeds to the next column.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
Returns:
the added label

append

public JLabel append(String textWithMnemonic,
                     Component component)
Adds a text label and component to the panel. Then proceeds to the next data column.

The created label is labeling the given component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
component - the component to add
Returns:
the added label

append

public JLabel append(String textWithMnemonic,
                     Component c,
                     boolean nextLine)
Adds a text label and component to the panel; the component will span the specified number columns. Proceeds to the next data column, and goes to the next line if the boolean flag is set.

The created label is labeling the given component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
c - the component to add
nextLine - true forces a next line
Returns:
the added label
See Also:
JLabel.setLabelFor(java.awt.Component)

append

public JLabel append(String textWithMnemonic,
                     Component c,
                     int columnSpan)
Adds a text label and component to the panel; the component will span the specified number columns. Proceeds to the next data column.

The created label is labeling the given component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
c - the component to add
columnSpan - number of columns the component shall span
Returns:
the added label
See Also:
JLabel.setLabelFor(java.awt.Component)

append

public JLabel append(String textWithMnemonic,
                     Component c1,
                     Component c2)
Adds a text label and two components to the panel; each component will span a single column. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
c1 - the first component to add
c2 - the second component to add
Returns:
the added label

append

public JLabel append(String textWithMnemonic,
                     Component c1,
                     Component c2,
                     int colSpan)
Adds a text label and two components to the panel; each component will span a single column. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
c1 - the first component to add
c2 - the second component to add
colSpan - the column span for the second component
Returns:
the created label

append

public JLabel append(String textWithMnemonic,
                     Component c1,
                     Component c2,
                     Component c3)
Adds a text label and three components to the panel; each component will span a single column. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
c1 - the first component to add
c2 - the second component to add
c3 - the third component to add
Returns:
the added label

append

public JLabel append(String textWithMnemonic,
                     Component c1,
                     Component c2,
                     Component c3,
                     Component c4)
Adds a text label and four components to the panel; each component will span a single column. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
c1 - the first component to add
c2 - the second component to add
c3 - the third component to add
c4 - the fourth component to add
Returns:
the added label

appendI15d

public JLabel appendI15d(String resourceKey)
Adds an internationalized (i15d) text label to the panel using the given resource key and proceeds to the next column.

Parameters:
resourceKey - the resource key for the the label's text
Returns:
the added label

appendI15d

public JLabel appendI15d(String resourceKey,
                         Component component)
Adds an internationalized (i15d) text label and component to the panel. Then proceeds to the next data column.

The created label is labeling the given component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
resourceKey - the resource key for the text to add
component - the component to add
Returns:
the added label

appendI15d

public JLabel appendI15d(String resourceKey,
                         Component component,
                         boolean nextLine)
Adds an internationalized (i15d) text label and component to the panel. Then proceeds to the next data column. Goes to the next line if the boolean flag is set.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
resourceKey - the resource key for the text to add
component - the component to add
nextLine - true forces a next line
Returns:
the added label

appendI15d

public JLabel appendI15d(String resourceKey,
                         Component c,
                         int columnSpan)
Adds an internationalized (i15d) text label to the panel using the given resource key; then proceeds to the next data column and adds a component with the given column span. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
resourceKey - the resource key for the text to add
c - the component to add
columnSpan - number of columns the component shall span
Returns:
the added label

appendI15d

public JLabel appendI15d(String resourceKey,
                         Component c1,
                         Component c2)
Adds an internationalized (i15d) text label and two components to the panel; each component will span a single column. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
resourceKey - the resource key for the text to add
c1 - the first component to add
c2 - the second component to add
Returns:
the added label

appendI15d

public JLabel appendI15d(String resourceKey,
                         Component c1,
                         Component c2,
                         int colSpan)
Adds an internationalized (i15d) text label and two components to the panel; each component will span a single column. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
resourceKey - the resource key for the text to add
c1 - the first component to add
c2 - the second component to add
colSpan - the column span for the second component
Returns:
the added label

appendI15d

public JLabel appendI15d(String resourceKey,
                         Component c1,
                         Component c2,
                         Component c3)
Adds an internationalized (i15d) text label and three components to the panel; each component will span a single column. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
resourceKey - the resource key for the text to add
c1 - the first component to add
c2 - the second component to add
c3 - the third component to add
Returns:
the added label

appendI15d

public JLabel appendI15d(String resourceKey,
                         Component c1,
                         Component c2,
                         Component c3,
                         Component c4)
Adds an internationalized (i15d) text label and four components to the panel; each component will span a single column. Proceeds to the next data column.

The created label is labeling the first component; so the component gets the focus if the (optional) label mnemonic is pressed.

Parameters:
resourceKey - the resource key for the text to add
c1 - the first component to add
c2 - the second component to add
c3 - the third component to add
c4 - the third component to add
Returns:
the added label

appendTitle

public JLabel appendTitle(String textWithMnemonic)
Adds a title label to the panel and proceeds to the next column.

Parameters:
textWithMnemonic - the label's text - may mark a mnemonic
Returns:
the added title label

appendI15dTitle

public JLabel appendI15dTitle(String resourceKey)
Adds an internationalized title label to the panel and proceeds to the next column.

Parameters:
resourceKey - the resource key for the title's text
Returns:
the added title label

appendSeparator

public JComponent appendSeparator()
Adds a separator without text that spans all columns.

Returns:
the added titled separator

appendSeparator

public JComponent appendSeparator(String text)
Adds a separator with the given text that spans all columns.

Parameters:
text - the separator title text
Returns:
the added titled separator

appendI15dSeparator

public JComponent appendI15dSeparator(String resourceKey)
Appends an internationalized titled separator for the given resource key that spans all columns.

Parameters:
resourceKey - the resource key for the separator title's text
Returns:
the added titled separator

getLeadingColumn

protected int getLeadingColumn()
Returns the leading column. Unlike the superclass this method honors the column offset.

Overrides:
getLeadingColumn in class AbstractFormBuilder
Returns:
the leading column


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/AbstractBuilder.html0000644000175000017500000006540612003555422026020 0ustar tonytony AbstractBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class AbstractBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
Direct Known Subclasses:
AbstractButtonPanelBuilder, AbstractFormBuilder

public abstract class AbstractBuilder
extends Object

An abstract class that minimizes the effort required to implement non-visual builders that use the FormLayout.

Builders hide details of the FormLayout and provide convenience behavior that assists you in constructing a form, bar, stack. This class provides a cell cursor that helps you traverse a form while you add components. Also, it offers several methods to append custom and logical columns and rows.

Version:
$Revision: 1.3 $
Author:
Karsten Lentzsch
See Also:
ButtonBarBuilder, ButtonStackBuilder, PanelBuilder, I15dPanelBuilder, DefaultFormBuilder

Field Summary
protected  CellConstraints currentCellConstraints
          Holds an instance of CellConstraints that will be used to specify the location, extent and alignments of the component to be added next.
 
Constructor Summary
protected AbstractBuilder(FormLayout layout, Container container)
          Constructs an AbstractBuilder for the given FormLayout and layout container.
 
Method Summary
protected  ComponentFactory createComponentFactory()
          Invoked when the per-instance component factory is lazily initialized.
 int getColumnCount()
          Returns the number of columns in the form.
 ComponentFactory getComponentFactory()
          Returns this builder's component factory.
static ComponentFactory getComponentFactoryDefault()
          Returns the factory that is used as default for new builder's as they are created.
 Container getContainer()
          Returns the container used to build the form.
 FormLayout getLayout()
          Returns the FormLayout instance used to build this form.
 int getRowCount()
          Returns the number of rows in the form.
 void setComponentFactory(ComponentFactory newFactory)
          Sets a new component factory for this builder, overriding the default as provided by getComponentFactoryDefault().
static void setComponentFactoryDefault(ComponentFactory factory)
          Sets the global default that is used to initialize the per-instance component factory.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

currentCellConstraints

protected final CellConstraints currentCellConstraints
Holds an instance of CellConstraints that will be used to specify the location, extent and alignments of the component to be added next.

Constructor Detail

AbstractBuilder

protected AbstractBuilder(FormLayout layout,
                          Container container)
Constructs an AbstractBuilder for the given FormLayout and layout container.

Parameters:
layout - the FormLayout to use
container - the layout container
Throws:
NullPointerException - if layout or container is null
Method Detail

getComponentFactoryDefault

public static ComponentFactory getComponentFactoryDefault()
Returns the factory that is used as default for new builder's as they are created. This default itself is lazily initialized as the DefaultComponentFactory.

Returns:
the factory that is used as default for new builder instances

setComponentFactoryDefault

public static void setComponentFactoryDefault(ComponentFactory factory)
Sets the global default that is used to initialize the per-instance component factory.

Parameters:
factory - the factory to be used for all new builder instances that do not override the default

getContainer

public final Container getContainer()
Returns the container used to build the form.

Returns:
the layout container

getLayout

public final FormLayout getLayout()
Returns the FormLayout instance used to build this form.

Returns:
the FormLayout

getColumnCount

public final int getColumnCount()
Returns the number of columns in the form.

Returns:
the number of columns

getRowCount

public final int getRowCount()
Returns the number of rows in the form.

Returns:
the number of rows

getComponentFactory

public final ComponentFactory getComponentFactory()
Returns this builder's component factory. If no factory has been set before, it is lazily initialized from the global default as returned by getComponentFactoryDefault().

Returns:
the component factory
See Also:
setComponentFactory(ComponentFactory)

setComponentFactory

public final void setComponentFactory(ComponentFactory newFactory)
Sets a new component factory for this builder, overriding the default as provided by getComponentFactoryDefault().

Parameters:
newFactory - the component factory to be used for this builder
See Also:
getComponentFactory()

createComponentFactory

protected ComponentFactory createComponentFactory()
Invoked when the per-instance component factory is lazily initialized. This implementation returns the global default factory.

Subclasses may override to use a factory other than the global default. However, in most cases it is sufficient to just set a new gobal default using setComponentFactoryDefault(ComponentFactory).

Returns:
the factory used during the lazy initialization of the per-instance component factory


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/ButtonBarBuilder.html0000644000175000017500000012643612003555422026156 0ustar tonytony ButtonBarBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class ButtonBarBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
      extended by com.jgoodies.forms.builder.AbstractButtonPanelBuilder
          extended by com.jgoodies.forms.builder.ButtonBarBuilder

public final class ButtonBarBuilder
extends AbstractButtonPanelBuilder

A non-visual builder for building consistent button bars that comply with popular style guides. Utilizes the JGoodies FormLayout and honors the platform's LayoutStyle regarding button sizes, and gaps.

Examples:

 // 1) Build and return a bar with three related buttons 
 return new ButtonBarBuilder()
     .addButton(newButton)
     .addRelatedGap()
     .addButton(editButton)
     .addRelatedGap()
     .addButton(deleteButton)
     .build();

 // 2) Short hand for example 1) 
 return new ButtonBarBuilder()
     .addButton(newButton, editButton, deleteButton)
     .build();

 // 3) Build and return a bar with two sections
 return new ButtonBarBuilder()
     .addButton(newButton, editButton, deleteButton)
     .addUnrelatedGap()
     .addButton(moveUpButton, moveDownButton)
     .build();

 // 4) Short hand for example 3)
 return new ButtonBarBuilder()
     .addButton(newButton, editButton, deleteButton, 
                null, 
                moveUpButton, moveDownButton)
     .build();

 // 5) Build and return a complex button bar
 return new ButtonBarBuilder()
     .addButton(newButton, editButton, deleteButton)
     .addUnrelatedGap()
     .addButton(moveUpButton, moveDownButton)
     .addGlue()
     .addGrowing(legendComponent)
     .build();
 

Version:
$Revision: 1.18 $
Author:
Karsten Lentzsch
See Also:
ButtonStackBuilder, LayoutStyle

Field Summary
 
Fields inherited from class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
focusGrouped
 
Fields inherited from class com.jgoodies.forms.builder.AbstractBuilder
currentCellConstraints
 
Constructor Summary
ButtonBarBuilder()
          Constructs an empty ButtonBarBuilder on a JPanel.
ButtonBarBuilder(JPanel panel)
          Constructs an empty ButtonBarBuilder on the given panel.
 
Method Summary
 ButtonBarBuilder addButton(Action... actions)
          Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.
 ButtonBarBuilder addButton(JComponent... buttons)
          Adds one or many sequences of related buttons.
 ButtonBarBuilder addButton(JComponent button)
          Adds a button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
 ButtonBarBuilder addFixed(JComponent component)
          Adds a fixed size component with narrow margin.
 ButtonBarBuilder addGlue()
          Adds a glue that will be given the extra space, if this button bar is larger than its preferred size.
 ButtonBarBuilder addGrowing(JComponent component)
          Adds a component that grows if the container grows.
 ButtonBarBuilder addRelatedGap()
          Adds the standard horizontal gap for related components.
 ButtonBarBuilder addStrut(ConstantSize width)
          Adds a horizontal strut of the specified width.
 ButtonBarBuilder addUnrelatedGap()
          Adds the standard horizontal gap for unrelated components.
 ButtonBarBuilder background(Color background)
          Sets the panel's background color and makes the panel opaque.
 ButtonBarBuilder border(Border border)
          Sets the panel's border.
 ButtonBarBuilder opaque(boolean b)
          Sets the panel's opaque state.
 
Methods inherited from class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
add, appendColumn, appendGlueColumn, appendGlueRow, appendRelatedComponentsGapColumn, appendRelatedComponentsGapRow, appendRow, appendUnrelatedComponentsGapColumn, appendUnrelatedComponentsGapRow, build, createButton, getColumn, getPanel, getRow, isLeftToRight, nextColumn, nextRow, setBackground, setBorder, setLeftToRight, setOpaque
 
Methods inherited from class com.jgoodies.forms.builder.AbstractBuilder
createComponentFactory, getColumnCount, getComponentFactory, getComponentFactoryDefault, getContainer, getLayout, getRowCount, setComponentFactory, setComponentFactoryDefault
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ButtonBarBuilder

public ButtonBarBuilder()
Constructs an empty ButtonBarBuilder on a JPanel.


ButtonBarBuilder

public ButtonBarBuilder(JPanel panel)
Constructs an empty ButtonBarBuilder on the given panel.

Parameters:
panel - the layout container
Method Detail

addButton

public ButtonBarBuilder addButton(JComponent button)
Adds a button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().

Although a JButton is expected, any JComponent is accepted to allow custom button component types.

Specified by:
addButton in class AbstractButtonPanelBuilder
Parameters:
button - the component to add
Returns:
this builder
Throws:
NullPointerException - if button is null

addButton

public ButtonBarBuilder addButton(JComponent... buttons)
Description copied from class: AbstractButtonPanelBuilder
Adds one or many sequences of related buttons. A new sequence starts when a button is null. The next sequence is separated by an unrelated gap. Each button has the minimum width as specified by LayoutStyle.getDefaultButtonWidth(). The gap width between the buttons is LayoutStyle.getRelatedComponentsPadX().

Although JButtons are expected, general JComponents are accepted to allow custom button component types.

Examples:

 builder.addButtons(newButton, editButton, deleteButton);
 builder.addButtons(newButton, editButton, deleteButton, null, printButton);
 

Overrides:
addButton in class AbstractButtonPanelBuilder
Parameters:
buttons - the buttons to add
Returns:
this builder
See Also:
AbstractButtonPanelBuilder.addButton(JComponent)

addButton

public ButtonBarBuilder addButton(Action... actions)
Description copied from class: AbstractButtonPanelBuilder
Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.

Overrides:
addButton in class AbstractButtonPanelBuilder
Parameters:
actions - an array of buttons to add

addFixed

public ButtonBarBuilder addFixed(JComponent component)
Adds a fixed size component with narrow margin. Unlike the buttons, this component is laid out without a minimum width. In other words, the width is determined only by the component's preferred width.

Parameters:
component - the component to add
Returns:
this builder

addGrowing

public ButtonBarBuilder addGrowing(JComponent component)
Adds a component that grows if the container grows. The component's initial size (before it grows) is specified by the LayoutStyle.getDefaultButtonWidth().

Parameters:
component - the component to add
Returns:
this builder

addGlue

public ButtonBarBuilder addGlue()
Adds a glue that will be given the extra space, if this button bar is larger than its preferred size.

Returns:
this builder

addRelatedGap

public ButtonBarBuilder addRelatedGap()
Adds the standard horizontal gap for related components.

Specified by:
addRelatedGap in class AbstractButtonPanelBuilder
Returns:
this builder
See Also:
LayoutStyle.getRelatedComponentsPadX()

addUnrelatedGap

public ButtonBarBuilder addUnrelatedGap()
Adds the standard horizontal gap for unrelated components.

Specified by:
addUnrelatedGap in class AbstractButtonPanelBuilder
Returns:
this builder
See Also:
LayoutStyle.getUnrelatedComponentsPadX()

addStrut

public ButtonBarBuilder addStrut(ConstantSize width)
Adds a horizontal strut of the specified width. For related and unrelated components use addRelatedGap() and addUnrelatedGap() respectively.

Parameters:
width - describes the gap width
Returns:
this builder
See Also:
ColumnSpec.createGap(ConstantSize)

background

public ButtonBarBuilder background(Color background)
Description copied from class: AbstractButtonPanelBuilder
Sets the panel's background color and makes the panel opaque.

Overrides:
background in class AbstractButtonPanelBuilder
Parameters:
background - the color to set as new background
See Also:
JComponent.setBackground(Color)

border

public ButtonBarBuilder border(Border border)
Description copied from class: AbstractButtonPanelBuilder
Sets the panel's border.

Overrides:
border in class AbstractButtonPanelBuilder
Parameters:
border - the border to set
See Also:
JComponent.setBorder(Border)

opaque

public ButtonBarBuilder opaque(boolean b)
Description copied from class: AbstractButtonPanelBuilder
Sets the panel's opaque state.

Overrides:
opaque in class AbstractButtonPanelBuilder
Parameters:
b - true for opaque, false for non-opaque
See Also:
JComponent.setOpaque(boolean)


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/ListViewBuilder.html0000644000175000017500000010503312003555424026014 0ustar tonytony ListViewBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class ListViewBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.ListViewBuilder

public final class ListViewBuilder
extends Object

Builds list/table views from a set of mandatory and optional components: label, filter/search, list (table), list buttons, list extras, details view (or preview).

Examples:

 return new ListViewBuilder()
     .label("&Contacts:")
     .listView(contactsTable)
     .listBar(newButton, editButton, deleteButton)
     .build();

 return new ListViewBuilder()
     .border(Borders.DLU14)
     .labelView(contactsLabel)
     .filterView(contactsSearchField)
     .listView(contactsTable)
     .listBar(newButton, editButton, deleteButton, null, printButton)
     .detailsView(contactDetailsView)
     .build();
 

Since:
1.6
Version:
$Revision: 1.2 $
Author:
Karsten Lentzsch

Constructor Summary
ListViewBuilder()
          Constructs a ListViewBuilder using the AbstractBuilder's default component factory.
ListViewBuilder(ComponentFactory factory)
          Constructs a ListViewBuilder using the given component factory.
 
Method Summary
 ListViewBuilder border(Border border)
          Sets an optional border that surrounds the list view including the label and details.
 JComponent build()
          Lazily builds and returns the list view panel.
 ListViewBuilder detailsView(JComponent detailsView)
          Sets an optional details view that is located under the list view.
 ListViewBuilder filterView(JComponent filterView)
          Sets an optional view that will be placed in the upper right corner of the built list view panel.
 ListViewBuilder filterViewColSpec(String colSpec)
          Changes the FormLayout column specification used to lay out the filter view.
 ListViewBuilder headerLabel(String markedText)
          Creates a header label for the given marked text and sets it as label view.
 ListViewBuilder label(String markedText)
          Creates a plain label for the given marked text and sets it as label view.
 ListViewBuilder labelView(JComponent labelView)
          Sets the mandatory label view.
 ListViewBuilder listBar(JComponent... buttons)
          Builds a button bar using the given buttons and sets it as list bar.
 ListViewBuilder listBarView(JComponent listBarView)
          Sets an optional list bar - often a button bar - that will be located in the lower left corner of the list view.
 ListViewBuilder listExtrasView(JComponent listExtrasView)
          Sets an optional view that is located in the lower right corner of the list view, aligned with the list bar.
 ListViewBuilder listView(JComponent listView)
          Sets the given component as the the mandatory list view.
 ListViewBuilder listViewRowSpec(String rowSpec)
          Changes the FormLayout row specification used to lay out the list view.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ListViewBuilder

public ListViewBuilder()
Constructs a ListViewBuilder using the AbstractBuilder's default component factory. The factory is required by label(String) and headerLabel(String).


ListViewBuilder

public ListViewBuilder(ComponentFactory factory)
Constructs a ListViewBuilder using the given component factory. The factory is required by label(String) and headerLabel(String).

Parameters:
factory - the component factory used to create labels and headers
Method Detail

border

public ListViewBuilder border(Border border)
Sets an optional border that surrounds the list view including the label and details.

Parameters:
border - the border to set

labelView

public ListViewBuilder labelView(JComponent labelView)
Sets the mandatory label view. Useful to set a bound label that updates its text when the list content changes, for example to provide the number of list elements.

Parameters:
labelView - the component that shall label the list view, often a bound label

label

public ListViewBuilder label(String markedText)
Creates a plain label for the given marked text and sets it as label view. Equivalent to:
 labelView(aComponentFactory.createLabel(markedText));
 

Parameters:
markedText - the label's text, may contain a mnemonic marker

headerLabel

public ListViewBuilder headerLabel(String markedText)
Creates a header label for the given marked text and sets it as label view. Equivalent to:
 labelView(aComponentFactory.createHeaderLabel(markedText));
 

Parameters:
markedText - the label's text, may contain a mnemonic marker

filterView

public ListViewBuilder filterView(JComponent filterView)
Sets an optional view that will be placed in the upper right corner of the built list view panel. This can be a search field, a panel with filtering check boxes ("Only valid items"), etc.

Parameters:
filterView - the view to be added.

filterViewColSpec

public ListViewBuilder filterViewColSpec(String colSpec)
Changes the FormLayout column specification used to lay out the filter view. The default value is "[100dlu, p]", which is a column where the width is determined by the filter view's preferred width, but a minimum width of 100dlu is ensured. The filter view won't grow horizontally, if the container gets more space.

Parameters:
colSpec - specifies the horizontal layout of the filter view
Throws:
NullPointerException - if colSpec is null

listView

public ListViewBuilder listView(JComponent listView)
Sets the given component as the the mandatory list view. If listView is a JTable, JList, or JTree, it is automatically wrapped with a JScrollPane, before the scroll pane is set as list view.

Parameters:
listView - the component to be used as scrollable list view
Throws:
NullPointerException - if listView is null

listViewRowSpec

public ListViewBuilder listViewRowSpec(String rowSpec)
Changes the FormLayout row specification used to lay out the list view. The default value is "fill:[100dlu, pref]:grow", which is a row that is filled by the list view; the height is determined by the list view's preferred height, but a minimum of 100dlu is ensured. The list view grows vertically, if the container gets more vertical space.

Examples:

 .listViewRowSpec("fill:100dlu");  // fixed height
 .listViewRowSpec("f:100dlu:g");   // fixed start height, grows
 .listViewRowSpec("f:p");          // no minimum height
 

Parameters:
rowSpec - specifies the vertical layout of the list view
Throws:
NullPointerException - if rowSpec is null

listBarView

public ListViewBuilder listBarView(JComponent listBarView)
Sets an optional list bar - often a button bar - that will be located in the lower left corner of the list view. If the list bar view consists only of buttons, use listBar(JComponent...) instead.

Parameters:
listBarView - the component to set

listBar

public ListViewBuilder listBar(JComponent... buttons)
Builds a button bar using the given buttons and sets it as list bar. Although JButtons are expected, any JComponent is accepted to allow custom button component types.

Equivalent to listBarView(Forms.buildButtonBar(buttons)).

Parameters:
buttons - the buttons in the list bar
Throws:
NullPointerException - if buttons is null
IllegalArgumentException - if no buttons are provided
See Also:
ButtonBarBuilder.addButton(JComponent...)

listExtrasView

public ListViewBuilder listExtrasView(JComponent listExtrasView)
Sets an optional view that is located in the lower right corner of the list view, aligned with the list bar.

Parameters:
listExtrasView - the component to set

detailsView

public ListViewBuilder detailsView(JComponent detailsView)
Sets an optional details view that is located under the list view. Often this is the details view or preview of a master-details view.

Parameters:
detailsView - the component to set

build

public JComponent build()
Lazily builds and returns the list view panel.

Returns:
the built panel


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/ButtonBarBuilder2.html0000644000175000017500000014440212003555422026231 0ustar tonytony ButtonBarBuilder2 (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class ButtonBarBuilder2

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
      extended by com.jgoodies.forms.builder.AbstractButtonPanelBuilder
          extended by com.jgoodies.forms.builder.ButtonBarBuilder2

Deprecated. Replaced by the ButtonBarBuilder

@Deprecated
public class ButtonBarBuilder2
extends AbstractButtonPanelBuilder

A non-visual builder for building consistent button bars that comply with popular style guides. Utilizes the JGoodies FormLayout and honors the platform's LayoutStyle regarding button sizes, gap widths, and the default button order.

This is an improved version of the older ButtonBarBuilder. The ButtonBarBuilder2 has a simpler, safer, and more convenient API, see below for a comparison.

ButtonBarBuilder2 vs. ButtonBarBuilder:
ButtonBarBuilder2 uses only 3 component types that can be added: button, standard, and growing button, where ButtonBarBuilder has button, fixed, and growing. Also, the ButtonBarBuilder2 doesn't group buttons. The layout of the ButtonBarBuilder and ButtonBarBuilder2 is the same if all buttons are smaller than LayoutStyle.getDefaultButtonWidth(). If some buttons are wider, ButtonBarBuilder2 will make only these buttons wider, where the old ButtonBarBuilder makes all (gridded) buttons wider.

Examples:

 // Build a right-aligned bar for: OK, Cancel, Apply
 ButtonBarBuilder2 builder = new ButtonBarBuilder2();
 builder.addGlue();
 builder.addButton(okButton);
 builder.addRelatedGap();
 builder.addButton(cancelButton);
 builder.addRelatedGap();
 builder.addButton(applyButton);
 return builder.getPanel();

 // Add a sequence of related buttons
 ButtonBarBuilder2 builder = new ButtonBarBuilder2();
 builder.addGlue();
 builder.addButton(okButton, cancelButton, applyButton);
 return builder.getPanel();

 // Add a sequence of related buttons for given Actions
 ButtonBarBuilder2 builder = new ButtonBarBuilder2();
 builder.addGlue();
 builder.addButton(okAction, cancelAction, applyAction);
 return builder.getPanel();
 
Buttons are added to a builder individually or as a sequence. To honor the platform's button order (left-to-right vs. right-to-left) this builder uses the leftToRightButtonOrder property. It is initialized with the current LayoutStyle's button order, which in turn is left-to-right on most platforms and right-to-left on the Mac OS X. Builder methods that create sequences of buttons (e.g. addButton(JComponent[]) honor the button order. If you want to ignore the default button order, you can either add individual buttons, or create a ButtonBarBuilder2 instance with the order set to left-to-right. For the latter see createLeftToRightBuilder(). Also see the button order example below.

Example:
The following example builds a button bar with Help button on the left-hand side and OK, Cancel, Apply buttons on the right-hand side.

 private JPanel createHelpOKCancelApplyBar(
         JButton help, JButton ok, JButton cancel, JButton apply) {
     ButtonBarBuilder2 builder = new ButtonBarBuilder2();
     builder.addButton(help);
     builder.addUnrelatedGap();
     builder.addGlue();
     builder.addButton(new JButton[]{ok, cancel, apply});
     return builder.getPanel();
 }
 

Button Order Example:
The following example builds three button bars where one honors the platform's button order and the other two ignore it.

 public JComponent buildPanel() {
     FormLayout layout = new FormLayout("pref");
     DefaultFormBuilder rowBuilder = new DefaultFormBuilder(layout);
     rowBuilder.border(Borders.DIALOG);

     rowBuilder.append(buildButtonSequence(new ButtonBarBuilder2()));
     rowBuilder.append(buildButtonSequence(ButtonBarBuilder2.createLeftToRightBuilder()));
     rowBuilder.append(buildIndividualButtons(new ButtonBarBuilder2()));

     return rowBuilder.getPanel();
 }

 private Component buildButtonSequence(ButtonBarBuilder2 builder) {
     builder.addButton(new JButton[] {
             new JButton("One"),
             new JButton("Two"),
             new JButton("Three")
     });
     return builder.getPanel();
 }

 private Component buildIndividualButtons(ButtonBarBuilder2 builder) {
     builder.addButton(new JButton("One"));
     builder.addRelatedGap();
     builder.addButton(new JButton("Two"));
     builder.addRelatedGap();
     builder.addButton(new JButton("Three"));
     return builder.getPanel();
 }
 

Version:
$Revision: 1.18 $
Author:
Karsten Lentzsch
See Also:
ButtonStackBuilder, LayoutStyle

Field Summary
 
Fields inherited from class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
focusGrouped
 
Fields inherited from class com.jgoodies.forms.builder.AbstractBuilder
currentCellConstraints
 
Constructor Summary
ButtonBarBuilder2()
          Deprecated. Constructs an empty ButtonBarBuilder2 on a JPanel.
ButtonBarBuilder2(JPanel panel)
          Deprecated. Constructs an empty ButtonBarBuilder2 on the given panel.
 
Method Summary
 ButtonBarBuilder2 addButton(Action... actions)
          Deprecated. Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.
 ButtonBarBuilder2 addButton(Action action)
          Deprecated. Adds a JButton for the given Action that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
 ButtonBarBuilder2 addButton(JComponent... buttons)
          Deprecated. Adds a sequence of related button components.
 ButtonBarBuilder2 addButton(JComponent button)
          Deprecated. Adds a command button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().
 ButtonBarBuilder2 addFixed(JComponent component)
          Deprecated. Adds a fixed size component with narrow margin.
 ButtonBarBuilder2 addGlue()
          Deprecated. Adds a glue that will be given the extra space, if this button bar is larger than its preferred size.
 ButtonBarBuilder2 addGrowing(JComponent... buttons)
          Deprecated. Adds a sequence of related growing buttons where each is separated by a default gap.
 ButtonBarBuilder2 addGrowing(JComponent component)
          Deprecated. Adds a button or other component that grows if the container grows.
 ButtonBarBuilder2 addRelatedGap()
          Deprecated. Adds the standard gap for related components.
 ButtonBarBuilder2 addStrut(ConstantSize width)
          Deprecated. Adds a horizontal strut of the specified width.
 ButtonBarBuilder2 addUnrelatedGap()
          Deprecated. Adds the standard gap for unrelated components.
static ButtonBarBuilder2 createLeftToRightBuilder()
          Deprecated. Creates and returns an empty ButtonBarBuilder2 with a left to right button order.
 boolean isLeftToRightButtonOrder()
          Deprecated. Returns whether button sequences will be ordered from left to right or from right to left.
 ButtonBarBuilder2 setDefaultButtonBarGapBorder()
          Deprecated. Sets a default border that has a gap in the bar's north.
 ButtonBarBuilder2 setLeftToRightButtonOrder(boolean newButtonOrder)
          Deprecated. Sets the order for button sequences to either left to right, or right to left.
 
Methods inherited from class com.jgoodies.forms.builder.AbstractButtonPanelBuilder
add, appendColumn, appendGlueColumn, appendGlueRow, appendRelatedComponentsGapColumn, appendRelatedComponentsGapRow, appendRow, appendUnrelatedComponentsGapColumn, appendUnrelatedComponentsGapRow, background, border, build, createButton, getColumn, getPanel, getRow, isLeftToRight, nextColumn, nextRow, opaque, setBackground, setBorder, setLeftToRight, setOpaque
 
Methods inherited from class com.jgoodies.forms.builder.AbstractBuilder
createComponentFactory, getColumnCount, getComponentFactory, getComponentFactoryDefault, getContainer, getLayout, getRowCount, setComponentFactory, setComponentFactoryDefault
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ButtonBarBuilder2

public ButtonBarBuilder2()
Deprecated. 
Constructs an empty ButtonBarBuilder2 on a JPanel.


ButtonBarBuilder2

public ButtonBarBuilder2(JPanel panel)
Deprecated. 
Constructs an empty ButtonBarBuilder2 on the given panel.

Parameters:
panel - the layout container
Method Detail

createLeftToRightBuilder

public static ButtonBarBuilder2 createLeftToRightBuilder()
Deprecated. 
Creates and returns an empty ButtonBarBuilder2 with a left to right button order.

Returns:
a button bar builder with button order set to left-to-right

isLeftToRightButtonOrder

public boolean isLeftToRightButtonOrder()
Deprecated. 
Returns whether button sequences will be ordered from left to right or from right to left.

Returns:
true if button sequences are ordered from left to right

setLeftToRightButtonOrder

public ButtonBarBuilder2 setLeftToRightButtonOrder(boolean newButtonOrder)
Deprecated. 
Sets the order for button sequences to either left to right, or right to left.

Parameters:
newButtonOrder - true if button sequences shall be ordered from left to right
Returns:
this builder

setDefaultButtonBarGapBorder

public ButtonBarBuilder2 setDefaultButtonBarGapBorder()
Deprecated. 
Sets a default border that has a gap in the bar's north.

Returns:
this builder

addGlue

public ButtonBarBuilder2 addGlue()
Deprecated. 
Adds a glue that will be given the extra space, if this button bar is larger than its preferred size.

Returns:
this builder

addRelatedGap

public ButtonBarBuilder2 addRelatedGap()
Deprecated. 
Description copied from class: AbstractButtonPanelBuilder
Adds the standard gap for related components.

Specified by:
addRelatedGap in class AbstractButtonPanelBuilder

addUnrelatedGap

public ButtonBarBuilder2 addUnrelatedGap()
Deprecated. 
Description copied from class: AbstractButtonPanelBuilder
Adds the standard gap for unrelated components.

Specified by:
addUnrelatedGap in class AbstractButtonPanelBuilder

addStrut

public ButtonBarBuilder2 addStrut(ConstantSize width)
Deprecated. 
Adds a horizontal strut of the specified width. For related and unrelated components use addRelatedGap() and addUnrelatedGap() respectively.

Parameters:
width - describes the gap width
Returns:
this builder
See Also:
ColumnSpec.createGap(ConstantSize)

addButton

public ButtonBarBuilder2 addButton(JComponent button)
Deprecated. 
Adds a command button component that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().

Although a JButton is expected, any JComponent is accepted to allow custom button component types.

Specified by:
addButton in class AbstractButtonPanelBuilder
Parameters:
button - the component to add
Returns:
this builder
Throws:
NullPointerException - if button is null

addButton

public ButtonBarBuilder2 addButton(JComponent... buttons)
Deprecated. 
Adds a sequence of related button components. Each button has the minimum width as specified by LayoutStyle.getDefaultButtonWidth(). The gap width between the buttons is LayoutStyle.getRelatedComponentsPadX().

Uses this builder's button order (left-to-right vs. right-to-left). If you want to use a fixed order, add individual buttons instead.

Although JButtons are expected, general JComponents are accepted to allow custom button component types.

Overrides:
addButton in class AbstractButtonPanelBuilder
Parameters:
buttons - an array of buttons to add
Returns:
this builder
Throws:
NullPointerException - if the button array or a button is null
IllegalArgumentException - if the button array is empty
See Also:
addButton(JComponent)

addButton

public ButtonBarBuilder2 addButton(Action action)
Deprecated. 
Adds a JButton for the given Action that has a minimum width specified by the LayoutStyle.getDefaultButtonWidth().

Parameters:
action - the action that describes the button to add
Returns:
this builder
Throws:
NullPointerException - if action is null
See Also:
addButton(JComponent)

addButton

public ButtonBarBuilder2 addButton(Action... actions)
Deprecated. 
Description copied from class: AbstractButtonPanelBuilder
Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.

Overrides:
addButton in class AbstractButtonPanelBuilder
Parameters:
actions - an array of buttons to add

addGrowing

public ButtonBarBuilder2 addGrowing(JComponent component)
Deprecated. 
Adds a button or other component that grows if the container grows. The component's initial size (before it grows) is specified by the LayoutStyle.getDefaultButtonWidth().

Parameters:
component - the component to add
Returns:
this builder

addGrowing

public ButtonBarBuilder2 addGrowing(JComponent... buttons)
Deprecated. 
Adds a sequence of related growing buttons where each is separated by a default gap. Honors this builder's button order. If you want to use a fixed left to right order, add individual buttons.

Parameters:
buttons - an array of buttons to add
Returns:
this builder
See Also:
LayoutStyle

addFixed

public ButtonBarBuilder2 addFixed(JComponent component)
Deprecated. 
Adds a fixed size component with narrow margin. Unlike the gridded components, this component keeps its individual preferred dimension.

Parameters:
component - the component to add
Returns:
this builder


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/builder/AbstractButtonPanelBuilder.html0000644000175000017500000015063012003555422030166 0ustar tonytony AbstractButtonPanelBuilder (JGoodies Forms 1.6 API)

com.jgoodies.forms.builder
Class AbstractButtonPanelBuilder

java.lang.Object
  extended by com.jgoodies.forms.builder.AbstractBuilder
      extended by com.jgoodies.forms.builder.AbstractButtonPanelBuilder
Direct Known Subclasses:
ButtonBarBuilder, ButtonBarBuilder2, ButtonStackBuilder

public abstract class AbstractButtonPanelBuilder
extends AbstractBuilder

The abstract superclass for ButtonBarBuilder. Provides a cell cursor for traversing the button bar/stack while components are added. It also offers convenience methods to append logical columns and rows.

TODO: Mention the ButtonStackBuilder2 subclass as soon as it is available.

Since:
1.2
Version:
$Revision: 1.11 $
Author:
Karsten Lentzsch

Field Summary
protected  boolean focusGrouped
          Indicates whether a focus group has been built in build().
 
Fields inherited from class com.jgoodies.forms.builder.AbstractBuilder
currentCellConstraints
 
Constructor Summary
protected AbstractButtonPanelBuilder(FormLayout layout, JPanel container)
          Constructs an AbstractButtonPanelBuilder for the given FormLayout and layout container.
 
Method Summary
protected  Component add(Component component)
          Adds a component to the container using the default cell constraints.
protected  AbstractButtonPanelBuilder addButton(Action... actions)
          Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.
protected  AbstractButtonPanelBuilder addButton(JComponent... buttons)
          Adds one or many sequences of related buttons.
protected abstract  AbstractButtonPanelBuilder addButton(JComponent button)
           
protected abstract  AbstractButtonPanelBuilder addRelatedGap()
          Adds the standard gap for related components.
protected abstract  AbstractButtonPanelBuilder addUnrelatedGap()
          Adds the standard gap for unrelated components.
protected  void appendColumn(ColumnSpec columnSpec)
          Appends the given column specification to the builder's layout.
protected  void appendGlueColumn()
          Appends a glue column.
protected  void appendGlueRow()
          Appends a glue row.
protected  void appendRelatedComponentsGapColumn()
          Appends a column that is the default gap for related components.
protected  void appendRelatedComponentsGapRow()
          Appends a row that is the default gap for related components.
protected  void appendRow(RowSpec rowSpec)
          Appends the given row specification to the builder's layout.
protected  void appendUnrelatedComponentsGapColumn()
          Appends a column that is the default gap for unrelated components.
protected  void appendUnrelatedComponentsGapRow()
          Appends a row that is the default gap for unrelated components.
protected  AbstractButtonPanelBuilder background(Color background)
          Sets the panel's background color and makes the panel opaque.
protected  AbstractButtonPanelBuilder border(Border border)
          Sets the panel's border.
 JPanel build()
          Returns the panel used to build the form and lazily builds a focus traversal group for all contained AbstractButtons.
protected  JButton createButton(Action action)
          Creates and returns a button that is bound to the given Action.
protected  int getColumn()
           
 JPanel getPanel()
          Returns the panel used to build the form and lazily builds a focus traversal group for all contained AbstractButtons.
protected  int getRow()
          Returns the cursor's row.
 boolean isLeftToRight()
          Returns whether this builder fills the form left-to-right or right-to-left.
protected  void nextColumn()
          Moves to the next column, does the same as #nextColumn(1).
protected  void nextRow()
          Increases the row by one; does the same as #nextRow(1).
protected  AbstractButtonPanelBuilder opaque(boolean b)
          Sets the panel's opaque state.
 void setBackground(Color background)
          Sets the panel's background color and makes the panel opaque.
 void setBorder(Border border)
          Sets the panel's border.
 void setLeftToRight(boolean b)
          Sets the form fill direction to left-to-right or right-to-left.
 void setOpaque(boolean b)
          Sets the panel's opaque state.
 
Methods inherited from class com.jgoodies.forms.builder.AbstractBuilder
createComponentFactory, getColumnCount, getComponentFactory, getComponentFactoryDefault, getContainer, getLayout, getRowCount, setComponentFactory, setComponentFactoryDefault
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

focusGrouped

protected boolean focusGrouped
Indicates whether a focus group has been built in build(). Reset to false whenever a component is added.

Constructor Detail

AbstractButtonPanelBuilder

protected AbstractButtonPanelBuilder(FormLayout layout,
                                     JPanel container)
Constructs an AbstractButtonPanelBuilder for the given FormLayout and layout container.

Parameters:
layout - the FormLayout to use
container - the layout container
Throws:
NullPointerException - if layout or container is null
Method Detail

getPanel

public JPanel getPanel()
Returns the panel used to build the form and lazily builds a focus traversal group for all contained AbstractButtons.

Returns:
the panel used by this builder to build the form

build

public JPanel build()
Returns the panel used to build the form and lazily builds a focus traversal group for all contained AbstractButtons.

Returns:
the panel used by this builder to build the form

background

protected AbstractButtonPanelBuilder background(Color background)
Sets the panel's background color and makes the panel opaque.

Parameters:
background - the color to set as new background
See Also:
JComponent.setBackground(Color)

border

protected AbstractButtonPanelBuilder border(Border border)
Sets the panel's border.

Parameters:
border - the border to set
See Also:
JComponent.setBorder(Border)

opaque

protected AbstractButtonPanelBuilder opaque(boolean b)
Sets the panel's opaque state.

Parameters:
b - true for opaque, false for non-opaque
See Also:
JComponent.setOpaque(boolean)

setBackground

public void setBackground(Color background)
Sets the panel's background color and makes the panel opaque.

Parameters:
background - the color to set as new background
See Also:
JComponent.setBackground(Color)

setBorder

public void setBorder(Border border)
Sets the panel's border.

Parameters:
border - the border to set
See Also:
JComponent.setBorder(Border)

setOpaque

public void setOpaque(boolean b)
Sets the panel's opaque state.

Parameters:
b - true for opaque, false for non-opaque
Since:
1.1
See Also:
JComponent.setOpaque(boolean)

isLeftToRight

public final boolean isLeftToRight()
Returns whether this builder fills the form left-to-right or right-to-left. The initial value of this property is set during the builder construction from the layout container's componentOrientation property.

Returns:
true indicates left-to-right, false indicates right-to-left
See Also:
setLeftToRight(boolean), ComponentOrientation

setLeftToRight

public final void setLeftToRight(boolean b)
Sets the form fill direction to left-to-right or right-to-left. The initial value of this property is set during the builder construction from the layout container's componentOrientation property.

Parameters:
b - true indicates left-to-right, false right-to-left
See Also:
isLeftToRight(), ComponentOrientation

nextColumn

protected final void nextColumn()
Moves to the next column, does the same as #nextColumn(1).


getColumn

protected final int getColumn()

getRow

protected final int getRow()
Returns the cursor's row.

Returns:
the cursor's row

nextRow

protected final void nextRow()
Increases the row by one; does the same as #nextRow(1).


appendColumn

protected final void appendColumn(ColumnSpec columnSpec)
Appends the given column specification to the builder's layout.

Parameters:
columnSpec - the column specification object to append

appendGlueColumn

protected final void appendGlueColumn()
Appends a glue column.

See Also:
appendRelatedComponentsGapColumn(), appendUnrelatedComponentsGapColumn()

appendRelatedComponentsGapColumn

protected final void appendRelatedComponentsGapColumn()
Appends a column that is the default gap for related components.

See Also:
appendGlueColumn(), appendUnrelatedComponentsGapColumn()

appendUnrelatedComponentsGapColumn

protected final void appendUnrelatedComponentsGapColumn()
Appends a column that is the default gap for unrelated components.

See Also:
appendGlueColumn(), appendRelatedComponentsGapColumn()

appendRow

protected final void appendRow(RowSpec rowSpec)
Appends the given row specification to the builder's layout.

Parameters:
rowSpec - the row specification object to append

appendGlueRow

protected final void appendGlueRow()
Appends a glue row.

See Also:
appendRelatedComponentsGapRow(), appendUnrelatedComponentsGapRow()

appendRelatedComponentsGapRow

protected final void appendRelatedComponentsGapRow()
Appends a row that is the default gap for related components.

See Also:
appendGlueRow(), appendUnrelatedComponentsGapRow()

appendUnrelatedComponentsGapRow

protected final void appendUnrelatedComponentsGapRow()
Appends a row that is the default gap for unrelated components.

See Also:
appendGlueRow(), appendRelatedComponentsGapRow()

add

protected Component add(Component component)
Adds a component to the container using the default cell constraints. Note that when building from left to right, this method won't adjust the cell constraints if the column span is larger than 1.

Parameters:
component - the component to add
Returns:
the added component

addButton

protected abstract AbstractButtonPanelBuilder addButton(JComponent button)

addButton

protected AbstractButtonPanelBuilder addButton(JComponent... buttons)
Adds one or many sequences of related buttons. A new sequence starts when a button is null. The next sequence is separated by an unrelated gap. Each button has the minimum width as specified by LayoutStyle.getDefaultButtonWidth(). The gap width between the buttons is LayoutStyle.getRelatedComponentsPadX().

Although JButtons are expected, general JComponents are accepted to allow custom button component types.

Examples:

 builder.addButtons(newButton, editButton, deleteButton);
 builder.addButtons(newButton, editButton, deleteButton, null, printButton);
 

Parameters:
buttons - the buttons to add
Returns:
this builder
Throws:
NullPointerException - if buttons is null
IllegalArgumentException - if buttons is empty
See Also:
addButton(JComponent)

addButton

protected AbstractButtonPanelBuilder addButton(Action... actions)
Constructs an array of JButtons from the given Action array, and adds them as a sequence of related buttons separated by a default gap.

Parameters:
actions - an array of buttons to add

addRelatedGap

protected abstract AbstractButtonPanelBuilder addRelatedGap()
Adds the standard gap for related components.


addUnrelatedGap

protected abstract AbstractButtonPanelBuilder addUnrelatedGap()
Adds the standard gap for unrelated components.


createButton

protected JButton createButton(Action action)
Creates and returns a button that is bound to the given Action. This is a hook that allows to return customized buttons. For example, the JGoodies JGButton configures the accessible name and accessible description from Actions that provide these information.

This default implementation delegates the button creation to this builder's component factory, see ComponentFactory.createButton(Action)).

Parameters:
action - provides bound visual properties for the button
Returns:
the created button
Since:
1.4


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/0000755000175000017500000000000012003555424021736 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/FormSpec.html0000644000175000017500000006602612003555424024354 0ustar tonytony FormSpec (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class FormSpec

java.lang.Object
  extended by com.jgoodies.forms.layout.FormSpec
All Implemented Interfaces:
Serializable
Direct Known Subclasses:
ColumnSpec, RowSpec

public abstract class FormSpec
extends Object
implements Serializable

An abstract class that specifies columns and rows in FormLayout by their default alignment, start size and resizing behavior. API users will use the subclasses ColumnSpec and RowSpec.

Also implements the parser for encoded column and row specifications and provides parser convenience behavior for its subclasses ColumnSpec and RowSpec.

TODO: Consider extracting the parser role to a separate class.

Version:
$Revision: 1.25 $
Author:
Karsten Lentzsch
See Also:
ColumnSpec, RowSpec, FormLayout, CellConstraints, Serialized Form

Nested Class Summary
static class FormSpec.DefaultAlignment
          An ordinal-based serializable typesafe enumeration for the column and row default alignment types.
 
Field Summary
static double DEFAULT_GROW
          The default resize weight.
static double NO_GROW
          Gives a column or row a fixed size.
 
Constructor Summary
protected FormSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a FormSpec for the given default alignment, size, and resize weight.
protected FormSpec(FormSpec.DefaultAlignment defaultAlignment, String encodedDescription)
          Constructs a FormSpec from the specified encoded description.
 
Method Summary
 String encode()
          Returns a short and parseable string representation of this form specification.
 FormSpec.DefaultAlignment getDefaultAlignment()
          Returns the default alignment.
 double getResizeWeight()
          Returns the current resize weight.
 Size getSize()
          Returns the size.
 String toShortString()
          Returns a string representation of this form specification.
 String toString()
          Returns a string representation of this form specification.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

NO_GROW

public static final double NO_GROW
Gives a column or row a fixed size.

See Also:
Constant Field Values

DEFAULT_GROW

public static final double DEFAULT_GROW
The default resize weight.

See Also:
Constant Field Values
Constructor Detail

FormSpec

protected FormSpec(FormSpec.DefaultAlignment defaultAlignment,
                   Size size,
                   double resizeWeight)
Constructs a FormSpec for the given default alignment, size, and resize weight. The resize weight must be a non-negative double; you can use NONE as a convenience value for no resize.

Parameters:
defaultAlignment - the spec's default alignment
size - a constant, component or bounded size
resizeWeight - the spec resize weight
Throws:
NullPointerException - if the size is null
IllegalArgumentException - if the resizeWeight is negative

FormSpec

protected FormSpec(FormSpec.DefaultAlignment defaultAlignment,
                   String encodedDescription)
Constructs a FormSpec from the specified encoded description. The description will be parsed to set initial values.

Parameters:
defaultAlignment - the default alignment
encodedDescription - the encoded description
Method Detail

getDefaultAlignment

public final FormSpec.DefaultAlignment getDefaultAlignment()
Returns the default alignment.

Returns:
the default alignment

getSize

public final Size getSize()
Returns the size.

Returns:
the size

getResizeWeight

public final double getResizeWeight()
Returns the current resize weight.

Returns:
the resize weight.

toString

public final String toString()
Returns a string representation of this form specification. The string representation consists of three elements separated by a colon (":"), first the alignment, second the size, and third the resize spec.

This method does not return an encoded version of this object; the contrary is the case. Many instances will return a string that cannot be parsed.

Note: The string representation may change at any time. For parsing use encode() instead.

Overrides:
toString in class Object
Returns:
a string representation of the form specification.

toShortString

public final String toShortString()
Returns a string representation of this form specification. The string representation consists of three elements separated by a colon (":"), first the alignment, second the size, and third the resize spec.

This method does not return an encoded version of this object; the contrary is the case. Many instances will return a string that cannot be parsed.

Note: The string representation may change at any time. For parsing use encode() instead.

Returns:
a string representation of the form specification.

encode

public final String encode()
Returns a short and parseable string representation of this form specification. The string will omit the alignment and resize specifications if these are the default values.

Returns:
a string representation of the form specification.
Since:
1.2
See Also:
for a more verbose string representation


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/package-frame.html0000644000175000017500000000667412003555424025324 0ustar tonytony com.jgoodies.forms.layout (JGoodies Forms 1.6 API) com.jgoodies.forms.layout
Interfaces 
FormLayout.Measure
Size
Classes 
BoundedSize
CellConstraints
CellConstraints.Alignment
ColumnSpec
ConstantSize
ConstantSize.Unit
FormLayout
FormLayout.LayoutInfo
FormSpec
FormSpec.DefaultAlignment
FormSpecParser
FormSpecs
LayoutMap
PrototypeSize
RowSpec
Sizes
Exceptions 
FormSpecParser.FormLayoutParseException
jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/CellConstraints.html0000644000175000017500000024643112003555424025745 0ustar tonytony CellConstraints (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class CellConstraints

java.lang.Object
  extended by com.jgoodies.forms.layout.CellConstraints
All Implemented Interfaces:
Serializable, Cloneable

public final class CellConstraints
extends Object
implements Cloneable, Serializable

Defines constraints for components that are laid out with the FormLayout. Defines the components display area: grid x, grid y, grid width (column span), grid height (row span), horizontal alignment and vertical alignment.

Most methods return this object to enable method chaining.

You can set optional insets in a constructor. This is useful if you need to use a pixel-size insets to align perceived component bounds with pixel data, for example an icon. Anyway, this is rarely used. The insets don't affect the size computation for columns and rows. I consider renaming the insets to offsets to better indicate the motivation for this option.

Examples:
The following cell constraints locate a component in the third column of the fifth row; column and row span are 1; the component will be aligned with the column's right-hand side and the row's bottom.

 CellConstraints cc = new CellConstraints();
 cc.xy  (3, 5);
 cc.xy  (3, 5, CellConstraints.RIGHT, CellConstraints.BOTTOM);
 cc.xy  (3, 5, "right, bottom");

 cc.xyw (3, 5, 1);
 cc.xyw (3, 5, 1, CellConstraints.RIGHT, CellConstraints.BOTTOM);
 cc.xyw (3, 5, 1, "right, bottom");

 cc.xywh(3, 5, 1, 1);
 cc.xywh(3, 5, 1, 1, CellConstraints.RIGHT, CellConstraints.BOTTOM);
 cc.xywh(3, 5, 1, 1, "right, bottom");
 
See also the examples in the FormLayout class comment.

TODO: Explain in the JavaDocs that the insets are actually offsets. And describe that these offsets are not taken into account when FormLayout computes the column and row sizes.

TODO: Rename the inset to offsets.

Version:
$Revision: 1.15 $
Author:
Karsten Lentzsch
See Also:
CC, Serialized Form

Nested Class Summary
static class CellConstraints.Alignment
          An ordinal-based serializable typesafe enumeration for component alignment types as used by the FormLayout.
 
Field Summary
static CellConstraints.Alignment BOTTOM
          Put the component in the bottom.
static CellConstraints.Alignment CENTER
          Put the component in the center.
static CellConstraints.Alignment DEFAULT
          Use the column's or row's default alignment.
static CellConstraints.Alignment FILL
          Fill the cell either horizontally or vertically.
 int gridHeight
          Describes the component's vertical grid extent (number of cells).
 int gridWidth
          Describes the component's horizontal grid extend (number of cells).
 int gridX
          Describes the component's horizontal grid origin (starts at 1).
 int gridY
          Describes the component's vertical grid origin (starts at 1).
 CellConstraints.Alignment hAlign
          Describes the component's horizontal alignment.
 Boolean honorsVisibility
          Describes whether individual components shall be taken into account by the FormLayout if 1) they are invisible and 2) the FormLayout does not honor the visibility.
 Insets insets
          Describes the component's Insets in it's display area.
static CellConstraints.Alignment LEFT
          Put the component in the left.
static CellConstraints.Alignment RIGHT
          Put the component in the right.
static CellConstraints.Alignment TOP
          Put the component in the top.
 CellConstraints.Alignment vAlign
          Describes the component's vertical alignment.
 
Constructor Summary
CellConstraints()
          Constructs a default instance of CellConstraints.
CellConstraints(int gridX, int gridY)
          Constructs an instance of CellConstraints for the given cell position.
CellConstraints(int gridX, int gridY, CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign)
          Constructs an instance of CellConstraints for the given cell position, anchor, and fill.
CellConstraints(int gridX, int gridY, int gridWidth, int gridHeight)
          Constructs an instance of CellConstraints for the given cell position and size.
CellConstraints(int gridX, int gridY, int gridWidth, int gridHeight, CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign)
          Constructs an instance of CellConstraints for the given cell position and size, anchor, and fill.
CellConstraints(int gridX, int gridY, int gridWidth, int gridHeight, CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign, Insets insets)
          Constructs an instance of CellConstraints for the complete set of available properties.
CellConstraints(String encodedConstraints)
          Constructs an instance of CellConstraints from the given encoded string properties.
 
Method Summary
 Object clone()
          Creates a copy of this cell constraints object.
 CellConstraints rc(int row, int col)
          Sets row and column origins; sets height and width to 1; uses the default alignments.
 CellConstraints rc(int row, int col, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
 CellConstraints rc(int row, int col, String encodedAlignments)
          Sets row and column origins; sets height and width to 1; decodes vertical and horizontal alignments from the given string.
 CellConstraints rchw(int row, int col, int rowSpan, int colSpan)
          Sets the row, column, height, and width; uses default alignments.
 CellConstraints rchw(int row, int col, int rowSpan, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
 CellConstraints rchw(int row, int col, int rowSpan, int colSpan, String encodedAlignments)
          Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
 CellConstraints rcw(int row, int col, int colSpan)
          Sets the row, column, height, and width; uses a height (row span) of 1 and the vertical and horizontal default alignments.
 CellConstraints rcw(int row, int col, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
 CellConstraints rcw(int row, int col, int colSpan, String encodedAlignments)
          Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
 String toShortString()
          Returns a short string representation of this constraints object.
 String toShortString(FormLayout layout)
          Returns a short string representation of this constraints object.
 String toString()
          Constructs and returns a string representation of this constraints object.
 CellConstraints xy(int col, int row)
          Sets column and row origins; sets width and height to 1; uses the default alignments.
 CellConstraints xy(int col, int row, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
 CellConstraints xy(int col, int row, String encodedAlignments)
          Sets column and row origins; sets width and height to 1; decodes horizontal and vertical alignments from the given string.
 CellConstraints xyw(int col, int row, int colSpan)
          Sets the column, row, width, and height; uses a height (row span) of 1 and the horizontal and vertical default alignments.
 CellConstraints xyw(int col, int row, int colSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
 CellConstraints xyw(int col, int row, int colSpan, String encodedAlignments)
          Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
 CellConstraints xywh(int col, int row, int colSpan, int rowSpan)
          Sets the column, row, width, and height; uses default alignments.
 CellConstraints xywh(int col, int row, int colSpan, int rowSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
 CellConstraints xywh(int col, int row, int colSpan, int rowSpan, String encodedAlignments)
          Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

DEFAULT

public static final CellConstraints.Alignment DEFAULT
Use the column's or row's default alignment.


FILL

public static final CellConstraints.Alignment FILL
Fill the cell either horizontally or vertically.


LEFT

public static final CellConstraints.Alignment LEFT
Put the component in the left.


RIGHT

public static final CellConstraints.Alignment RIGHT
Put the component in the right.


CENTER

public static final CellConstraints.Alignment CENTER
Put the component in the center.


TOP

public static final CellConstraints.Alignment TOP
Put the component in the top.


BOTTOM

public static final CellConstraints.Alignment BOTTOM
Put the component in the bottom.


gridX

public int gridX
Describes the component's horizontal grid origin (starts at 1).


gridY

public int gridY
Describes the component's vertical grid origin (starts at 1).


gridWidth

public int gridWidth
Describes the component's horizontal grid extend (number of cells).


gridHeight

public int gridHeight
Describes the component's vertical grid extent (number of cells).


hAlign

public CellConstraints.Alignment hAlign
Describes the component's horizontal alignment.


vAlign

public CellConstraints.Alignment vAlign
Describes the component's vertical alignment.


insets

public Insets insets
Describes the component's Insets in it's display area.


honorsVisibility

public Boolean honorsVisibility
Describes whether individual components shall be taken into account by the FormLayout if 1) they are invisible and 2) the FormLayout does not honor the visibility. See FormLayout.setHonorsVisibility(boolean) and FormLayout.setHonorsVisibility(Component, Boolean) for a full description of this feature.

Constructor Detail

CellConstraints

public CellConstraints()
Constructs a default instance of CellConstraints.


CellConstraints

public CellConstraints(int gridX,
                       int gridY)
Constructs an instance of CellConstraints for the given cell position.

Examples:

 new CellConstraints(1, 3);
 new CellConstraints(1, 3);
 

Parameters:
gridX - the component's horizontal grid origin
gridY - the component's vertical grid origin

CellConstraints

public CellConstraints(int gridX,
                       int gridY,
                       CellConstraints.Alignment hAlign,
                       CellConstraints.Alignment vAlign)
Constructs an instance of CellConstraints for the given cell position, anchor, and fill.

Examples:

 new CellConstraints(1, 3, CellConstraints.LEFT,   CellConstraints.BOTTOM);
 new CellConstraints(1, 3, CellConstraints.CENTER, CellConstraints.FILL);
 

Parameters:
gridX - the component's horizontal grid origin
gridY - the component's vertical grid origin
hAlign - the component's horizontal alignment
vAlign - the component's vertical alignment

CellConstraints

public CellConstraints(int gridX,
                       int gridY,
                       int gridWidth,
                       int gridHeight)
Constructs an instance of CellConstraints for the given cell position and size.

Examples:

 new CellConstraints(1, 3, 2, 1);
 new CellConstraints(1, 3, 7, 3);
 

Parameters:
gridX - the component's horizontal grid origin
gridY - the component's vertical grid origin
gridWidth - the component's horizontal extent
gridHeight - the component's vertical extent

CellConstraints

public CellConstraints(int gridX,
                       int gridY,
                       int gridWidth,
                       int gridHeight,
                       CellConstraints.Alignment hAlign,
                       CellConstraints.Alignment vAlign)
Constructs an instance of CellConstraints for the given cell position and size, anchor, and fill.

Examples:

 new CellConstraints(1, 3, 2, 1, CellConstraints.LEFT,   CellConstraints.BOTTOM);
 new CellConstraints(1, 3, 7, 3, CellConstraints.CENTER, CellConstraints.FILL);
 

Parameters:
gridX - the component's horizontal grid origin
gridY - the component's vertical grid origin
gridWidth - the component's horizontal extent
gridHeight - the component's vertical extent
hAlign - the component's horizontal alignment
vAlign - the component's vertical alignment

CellConstraints

public CellConstraints(int gridX,
                       int gridY,
                       int gridWidth,
                       int gridHeight,
                       CellConstraints.Alignment hAlign,
                       CellConstraints.Alignment vAlign,
                       Insets insets)
Constructs an instance of CellConstraints for the complete set of available properties.

Examples:

 new CellConstraints(1, 3, 2, 1, CellConstraints.LEFT,   CellConstraints.BOTTOM, new Insets(0, 1, 0, 3));
 new CellConstraints(1, 3, 7, 3, CellConstraints.CENTER, CellConstraints.FILL,   new Insets(0, 1, 0, 0));
 

Parameters:
gridX - the component's horizontal grid origin
gridY - the component's vertical grid origin
gridWidth - the component's horizontal extent
gridHeight - the component's vertical extent
hAlign - the component's horizontal alignment
vAlign - the component's vertical alignment
insets - the component's display area Insets
Throws:
IndexOutOfBoundsException - if the grid origin or extent is negative
NullPointerException - if the horizontal or vertical alignment is null
IllegalArgumentException - if an alignment orientation is invalid

CellConstraints

public CellConstraints(String encodedConstraints)
Constructs an instance of CellConstraints from the given encoded string properties.

Examples:

 new CellConstraints("1, 3");
 new CellConstraints("1, 3, left, bottom");
 new CellConstraints("1, 3, 2, 1, left, bottom");
 new CellConstraints("1, 3, 2, 1, l, b");
 

Parameters:
encodedConstraints - the constraints encoded as string
Method Detail

xy

public CellConstraints xy(int col,
                          int row)
Sets column and row origins; sets width and height to 1; uses the default alignments.

Examples:

 cc.xy(1, 1);
 cc.xy(1, 3);
 

Parameters:
col - the new column index
row - the new row index
Returns:
this

xy

public CellConstraints xy(int col,
                          int row,
                          String encodedAlignments)
Sets column and row origins; sets width and height to 1; decodes horizontal and vertical alignments from the given string.

Examples:

 cc.xy(1, 3, "left, bottom");
 cc.xy(1, 3, "l, b");
 cc.xy(1, 3, "center, fill");
 cc.xy(1, 3, "c, f");
 

Parameters:
col - the new column index
row - the new row index
encodedAlignments - describes the horizontal and vertical alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

xy

public CellConstraints xy(int col,
                          int row,
                          CellConstraints.Alignment colAlign,
                          CellConstraints.Alignment rowAlign)
Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.

Examples:

 cc.xy(1, 3, CellConstraints.LEFT,   CellConstraints.BOTTOM);
 cc.xy(1, 3, CellConstraints.CENTER, CellConstraints.FILL);
 

Parameters:
col - the new column index
row - the new row index
colAlign - horizontal component alignment
rowAlign - vertical component alignment
Returns:
this

xyw

public CellConstraints xyw(int col,
                           int row,
                           int colSpan)
Sets the column, row, width, and height; uses a height (row span) of 1 and the horizontal and vertical default alignments.

Examples:

 cc.xyw(1, 3, 7);
 cc.xyw(1, 3, 2);
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
Returns:
this

xyw

public CellConstraints xyw(int col,
                           int row,
                           int colSpan,
                           String encodedAlignments)
Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string. The row span (height) is set to 1.

Examples:

 cc.xyw(1, 3, 7, "left, bottom");
 cc.xyw(1, 3, 7, "l, b");
 cc.xyw(1, 3, 2, "center, fill");
 cc.xyw(1, 3, 2, "c, f");
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
encodedAlignments - describes the horizontal and vertical alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

xyw

public CellConstraints xyw(int col,
                           int row,
                           int colSpan,
                           CellConstraints.Alignment colAlign,
                           CellConstraints.Alignment rowAlign)
Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects. The row span (height) is set to 1.

Examples:

 cc.xyw(1, 3, 2, CellConstraints.LEFT,   CellConstraints.BOTTOM);
 cc.xyw(1, 3, 7, CellConstraints.CENTER, CellConstraints.FILL);
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
colAlign - horizontal component alignment
rowAlign - vertical component alignment
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

xywh

public CellConstraints xywh(int col,
                            int row,
                            int colSpan,
                            int rowSpan)
Sets the column, row, width, and height; uses default alignments.

Examples:

 cc.xywh(1, 3, 2, 1);
 cc.xywh(1, 3, 7, 3);
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
rowSpan - the row span or grid height
Returns:
this

xywh

public CellConstraints xywh(int col,
                            int row,
                            int colSpan,
                            int rowSpan,
                            String encodedAlignments)
Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.

Examples:

 cc.xywh(1, 3, 2, 1, "left, bottom");
 cc.xywh(1, 3, 2, 1, "l, b");
 cc.xywh(1, 3, 7, 3, "center, fill");
 cc.xywh(1, 3, 7, 3, "c, f");
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
rowSpan - the row span or grid height
encodedAlignments - describes the horizontal and vertical alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

xywh

public CellConstraints xywh(int col,
                            int row,
                            int colSpan,
                            int rowSpan,
                            CellConstraints.Alignment colAlign,
                            CellConstraints.Alignment rowAlign)
Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.

Examples:

 cc.xywh(1, 3, 2, 1, CellConstraints.LEFT,   CellConstraints.BOTTOM);
 cc.xywh(1, 3, 7, 3, CellConstraints.CENTER, CellConstraints.FILL);
 

Parameters:
col - the new column index
row - the new row index
colSpan - the column span or grid width
rowSpan - the row span or grid height
colAlign - horizontal component alignment
rowAlign - vertical component alignment
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid

rc

public CellConstraints rc(int row,
                          int col)
Sets row and column origins; sets height and width to 1; uses the default alignments.

Examples:

 cc.rc(1, 1);
 cc.rc(3, 1);
 

Parameters:
row - the new row index
col - the new column index
Returns:
this
Since:
1.1

rc

public CellConstraints rc(int row,
                          int col,
                          String encodedAlignments)
Sets row and column origins; sets height and width to 1; decodes vertical and horizontal alignments from the given string.

Examples:

 cc.rc(3, 1, "bottom, left");
 cc.rc(3, 1, "b, l");
 cc.rc(3, 1, "fill, center");
 cc.rc(3, 1, "f, c");
 

Parameters:
row - the new row index
col - the new column index
encodedAlignments - describes the vertical and horizontal alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid
Since:
1.1

rc

public CellConstraints rc(int row,
                          int col,
                          CellConstraints.Alignment rowAlign,
                          CellConstraints.Alignment colAlign)
Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.

Examples:

 cc.rc(3, 1, CellConstraints.BOTTOM, CellConstraints.LEFT);
 cc.rc(3, 1, CellConstraints.FILL,   CellConstraints.CENTER);
 

Parameters:
row - the new row index
col - the new column index
rowAlign - vertical component alignment
colAlign - horizontal component alignment
Returns:
this
Since:
1.1

rcw

public CellConstraints rcw(int row,
                           int col,
                           int colSpan)
Sets the row, column, height, and width; uses a height (row span) of 1 and the vertical and horizontal default alignments.

Examples:

 cc.rcw(3, 1, 7);
 cc.rcw(3, 1, 2);
 

Parameters:
row - the new row index
col - the new column index
colSpan - the column span or grid width
Returns:
this
Since:
1.1

rcw

public CellConstraints rcw(int row,
                           int col,
                           int colSpan,
                           String encodedAlignments)
Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string. The row span (height) is set to 1.

Examples:

 cc.rcw(3, 1, 7, "bottom, left");
 cc.rcw(3, 1, 7, "b, l");
 cc.rcw(3, 1, 2, "fill, center");
 cc.rcw(3, 1, 2, "f, c");
 

Parameters:
row - the new row index
col - the new column index
colSpan - the column span or grid width
encodedAlignments - describes the vertical and horizontal alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid
Since:
1.1

rcw

public CellConstraints rcw(int row,
                           int col,
                           int colSpan,
                           CellConstraints.Alignment rowAlign,
                           CellConstraints.Alignment colAlign)
Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects. The row span (height) is set to 1.

Examples:

 cc.rcw(3, 1, 2, CellConstraints.BOTTOM, CellConstraints.LEFT);
 cc.rcw(3, 1, 7, CellConstraints.FILL,   CellConstraints.CENTER);
 

Parameters:
row - the new row index
col - the new column index
colSpan - the column span or grid width
rowAlign - vertical component alignment
colAlign - horizontal component alignment
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid
Since:
1.1

rchw

public CellConstraints rchw(int row,
                            int col,
                            int rowSpan,
                            int colSpan)
Sets the row, column, height, and width; uses default alignments.

Examples:

 cc.rchw(1, 3, 2, 1);
 cc.rchw(1, 3, 7, 3);
 

Parameters:
row - the new row index
col - the new column index
rowSpan - the row span or grid height
colSpan - the column span or grid width
Returns:
this
Since:
1.1

rchw

public CellConstraints rchw(int row,
                            int col,
                            int rowSpan,
                            int colSpan,
                            String encodedAlignments)
Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.

Examples:

 cc.rchw(3, 1, 1, 2, "bottom, left");
 cc.rchw(3, 1, 1, 2, "b, l");
 cc.rchw(3, 1, 3, 7, "fill, center");
 cc.rchw(3, 1, 3, 7, "f, c");
 

Parameters:
row - the new row index
col - the new column index
rowSpan - the row span or grid height
colSpan - the column span or grid width
encodedAlignments - describes the vertical and horizontal alignments
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid
Since:
1.1

rchw

public CellConstraints rchw(int row,
                            int col,
                            int rowSpan,
                            int colSpan,
                            CellConstraints.Alignment rowAlign,
                            CellConstraints.Alignment colAlign)
Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.

Examples:

 cc.rchw(3, 1, 1, 2, CellConstraints.BOTTOM, CellConstraints.LEFT);
 cc.rchw(3, 1, 3, 7, CellConstraints.FILL,   CellConstraints.CENTER);
 

Parameters:
row - the new row index
col - the new column index
rowSpan - the row span or grid height
colSpan - the column span or grid width
rowAlign - vertical component alignment
colAlign - horizontal component alignment
Returns:
this
Throws:
IllegalArgumentException - if an alignment orientation is invalid
Since:
1.1

clone

public Object clone()
Creates a copy of this cell constraints object.

Overrides:
clone in class Object
Returns:
a copy of this cell constraints object

toString

public String toString()
Constructs and returns a string representation of this constraints object.

Overrides:
toString in class Object
Returns:
string representation of this constraints object

toShortString

public String toShortString()
Returns a short string representation of this constraints object.

Returns:
a short string representation of this constraints object

toShortString

public String toShortString(FormLayout layout)
Returns a short string representation of this constraints object. This method can use the given FormLayout to display extra information how default alignments are mapped to concrete alignments. Therefore it asks the related column and row as specified by this constraints object.

Parameters:
layout - the layout to be presented as a string
Returns:
a short string representation of this constraints object


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/FormLayout.Measure.html0000644000175000017500000002230412003555424026326 0ustar tonytony FormLayout.Measure (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Interface FormLayout.Measure

Enclosing class:
FormLayout

public static interface FormLayout.Measure

An interface that describes how to measure a Component. Used to abstract from horizontal and vertical dimensions as well as minimum and preferred sizes.

Since:
1.1

Method Summary
 int sizeOf(Component component)
          Computes and returns the size of the given Component.
 

Method Detail

sizeOf

int sizeOf(Component component)
Computes and returns the size of the given Component.

Parameters:
component - the component to measure
Returns:
the component's size


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/FormSpecParser.html0000644000175000017500000003224412003555424025524 0ustar tonytony FormSpecParser (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class FormSpecParser

java.lang.Object
  extended by com.jgoodies.forms.layout.FormSpecParser

public final class FormSpecParser
extends Object

Parses encoded column and row specifications. Returns ColumnSpec or RowSpec arrays if successful, and aims to provide useful information in case of a syntax error.

Version:
$Revision: 1.12 $
Author:
Karsten Lentzsch
See Also:
ColumnSpec, RowSpec

Nested Class Summary
static class FormSpecParser.FormLayoutParseException
          Used by the parser for encoded column and row specifications.
 
Method Summary
static void fail(String source, int index, String description)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

fail

public static void fail(String source,
                        int index,
                        String description)


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/LayoutMap.html0000644000175000017500000012356012003555424024546 0ustar tonytony LayoutMap (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class LayoutMap

java.lang.Object
  extended by com.jgoodies.forms.layout.LayoutMap

public final class LayoutMap
extends Object

Provides a hierarchical variable expansion useful to improve layout consistency, style guide compliance, and layout readability.

A LayoutMap maps variable names to layout expression Strings. The FormLayout, ColumnSpec, and RowSpec parsers expand variables before an encoded layout specification is parsed and converted into ColumnSpec and RowSpec values. Variables start with the '$' character. The variable name can be wrapped by braces ('{' and '}'). For example, you can write: new FormLayout("pref, $lcg, pref") or new FormLayout("pref, ${lcg}, pref").

LayoutMaps build a chain; each LayoutMap has an optional parent map. The root is defined by getRoot(). Application-wide variables should be defined in the root LayoutMap. If you want to override application-wide variables locally, obtain a LayoutMap using new LayoutMap(), configure it, and provide it as argument to the FormLayout, ColumnSpec, and RowSpec constructors/factory methods.

By default the root LayoutMap provides the following associations:
Variable NameAbbreviationsOrientationDescription
label-component-gaplcg, lcgapbothgap between a label and the labeled component
related-gaprg, rgapbothgap between two related components
unrelated-gapug, ugapbothgap between two unrelated components
buttonbhorizontalbutton column with minimum width
line-gaplg, lgapverticalgap between two lines
narrow-line-gapnlg, nlgapverticalnarrow gap between two lines
paragraphpg, pgapverticalgap between two paragraphs/sections

Examples:

 // Predefined variables
 new FormLayout(
     "pref, $lcgap, pref, $rgap, pref",
     "p, $lgap, p, $lgap, p");

 // Custom variables
 LayoutMap.getRoot().columnPut("half", "39dlu");
 LayoutMap.getRoot().columnPut("full", "80dlu");
 LayoutMap.getRoot().rowPut("table", "fill:0:grow");
 LayoutMap.getRoot().rowPut("table50", "fill:50dlu:grow");
 new FormLayout(
     "pref, $lcgap, $half, 2dlu, $half",
     "p, $lcgap, $table50");
 new FormLayout(
     "pref, $lcgap, $full",
     "p, $lcgap, $table50");

 // Nested variables
 LayoutMap.getRoot().columnPut("c-gap-c", "$half, 2dlu, $half");
 new FormLayout(
     "pref, $lcgap, ${c-gap-c}", // -> "pref, $lcgap, $half, 2dlu, $half",
     "p, $lcgap, $table");
 
LayoutMap holds two internal Maps that associate key Strings with expression Strings for the columns and rows respectively. Null values are not allowed.

Tips:

  • You should carefully override predefined variables, because variable users may expect that these don't change.
  • Set custom variables in the root LayoutMap.
  • Avoid aliases for custom variables.

Since:
1.2
Version:
$Revision: 1.24 $
Author:
Karsten Lentzsch
See Also:
FormLayout, ColumnSpec, RowSpec

Constructor Summary
LayoutMap()
          Constructs a LayoutMap that has the root LayoutMap as parent.
LayoutMap(LayoutMap parent)
          Constructs a LayoutMap with the given optional parent.
 
Method Summary
 boolean columnContainsKey(String key)
          Returns true if this map or a parent map - if any - contains a mapping for the specified key.
 String columnGet(String key)
          Looks up and returns the String associated with the given key.
 String columnPut(String key, ColumnSpec value)
           
 String columnPut(String key, Size value)
           
 String columnPut(String key, String value)
          Associates the specified column String with the specified key in this map.
 String columnRemove(String key)
          Removes the column value mapping for this key from this map if it is present.
static LayoutMap getRoot()
          Lazily initializes and returns the LayoutMap that is used for variable expansion, if no custom LayoutMap is provided.
 boolean rowContainsKey(String key)
          Returns true if this map or a parent map - if any - contains a RowSpec mapping for the specified key.
 String rowGet(String key)
          Looks up and returns the RowSpec associated with the given key.
 String rowPut(String key, RowSpec value)
          Associates the specified ColumnSpec with the specified key in this map.
 String rowPut(String key, Size value)
           
 String rowPut(String key, String value)
           
 String rowRemove(String key)
          Removes the row value mapping for this key from this map if it is present.
 String toString()
          Returns a string representation of this LayoutMap that lists the column and row associations.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

LayoutMap

public LayoutMap()
Constructs a LayoutMap that has the root LayoutMap as parent.


LayoutMap

public LayoutMap(LayoutMap parent)
Constructs a LayoutMap with the given optional parent.

Parameters:
parent - the parent LayoutMap, may be null
Method Detail

getRoot

public static LayoutMap getRoot()
Lazily initializes and returns the LayoutMap that is used for variable expansion, if no custom LayoutMap is provided.

Returns:
the LayoutMap that is used, if no custom LayoutMap is provided

columnContainsKey

public boolean columnContainsKey(String key)
Returns true if this map or a parent map - if any - contains a mapping for the specified key.

Parameters:
key - key whose presence in this LayoutMap chain is to be tested.
Returns:
true if this map contains a column mapping for the specified key.
Throws:
NullPointerException - if the key is null.
See Also:
Map.containsKey(Object)

columnGet

public String columnGet(String key)
Looks up and returns the String associated with the given key. First looks for an association in this LayoutMap. If there's no association, the lookup continues with the parent map - if any.

Parameters:
key - key whose associated value is to be returned.
Returns:
the column String associated with the key, or null if no LayoutMap in the parent chain contains an association.
Throws:
NullPointerException - if key is null
See Also:
Map.get(Object)

columnPut

public String columnPut(String key,
                        String value)
Associates the specified column String with the specified key in this map. If the map previously contained a mapping for this key, the old value is replaced by the specified value. The value set in this map overrides an association - if any - in the chain of parent LayoutMaps.

The value must not be null. To remove an association from this map use columnRemove(String).

Parameters:
key - key with which the specified value is to be associated.
value - column expression value to be associated with the specified key.
Returns:
previous String associated with specified key, or null if there was no mapping for key.
Throws:
NullPointerException - if the key or value is null.
See Also:
Map.put(Object, Object)

columnPut

public String columnPut(String key,
                        ColumnSpec value)

columnPut

public String columnPut(String key,
                        Size value)

columnRemove

public String columnRemove(String key)
Removes the column value mapping for this key from this map if it is present.

Returns the value to which the map previously associated the key, or null if the map contained no mapping for this key. The map will not contain a String mapping for the specified key once the call returns.

Parameters:
key - key whose mapping is to be removed from the map.
Returns:
previous value associated with specified key, or null if there was no mapping for key.
Throws:
NullPointerException - if key is null.
See Also:
Map.remove(Object)

rowContainsKey

public boolean rowContainsKey(String key)
Returns true if this map or a parent map - if any - contains a RowSpec mapping for the specified key.

Parameters:
key - key whose presence in this LayoutMap chain is to be tested.
Returns:
true if this map contains a row mapping for the specified key.
Throws:
NullPointerException - if the key is null.
See Also:
Map.containsKey(Object)

rowGet

public String rowGet(String key)
Looks up and returns the RowSpec associated with the given key. First looks for an association in this LayoutMap. If there's no association, the lookup continues with the parent map - if any.

Parameters:
key - key whose associated value is to be returned.
Returns:
the row specification associated with the key, or null if no LayoutMap in the parent chain contains an association.
Throws:
NullPointerException - if key is null
See Also:
Map.get(Object)

rowPut

public String rowPut(String key,
                     String value)

rowPut

public String rowPut(String key,
                     RowSpec value)
Associates the specified ColumnSpec with the specified key in this map. If the map previously contained a mapping for this key, the old value is replaced by the specified value. The RowSpec set in this map override an association - if any - in the chain of parent LayoutMaps.

The RowSpec must not be null. To remove an association from this map use rowRemove(String).

Parameters:
key - key with which the specified value is to be associated.
value - ColumnSpec to be associated with the specified key.
Returns:
previous ColumnSpec associated with specified key, or null if there was no mapping for key.
Throws:
NullPointerException - if the key or value is null.
See Also:
Map.put(Object, Object)

rowPut

public String rowPut(String key,
                     Size value)

rowRemove

public String rowRemove(String key)
Removes the row value mapping for this key from this map if it is present.

Returns the value to which the map previously associated the key, or null if the map contained no mapping for this key. The map will not contain a String mapping for the specified key once the call returns.

Parameters:
key - key whose mapping is to be removed from the map.
Returns:
previous value associated with specified key, or null if there was no mapping for key.
Throws:
NullPointerException - if key is null.
See Also:
Map.remove(Object)

toString

public String toString()
Returns a string representation of this LayoutMap that lists the column and row associations.

Overrides:
toString in class Object
Returns:
a string representation


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/FormLayout.html0000644000175000017500000026761012003555424024741 0ustar tonytony FormLayout (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class FormLayout

java.lang.Object
  extended by com.jgoodies.forms.layout.FormLayout
All Implemented Interfaces:
LayoutManager, LayoutManager2, Serializable

public final class FormLayout
extends Object
implements LayoutManager2, Serializable

FormLayout is a powerful, flexible and precise general purpose layout manager. It aligns components vertically and horizontally in a dynamic rectangular grid of cells, with each component occupying one or more cells. A whitepaper about the FormLayout ships with the product documentation and is available online.

To use FormLayout you first define the grid by specifying the columns and rows. In a second step you add components to the grid. You can specify columns and rows via human-readable String descriptions or via arrays of ColumnSpec and RowSpec instances.

Each component managed by a FormLayout is associated with an instance of CellConstraints. The constraints object specifies where a component should be located on the form's grid and how the component should be positioned. In addition to its constraints object the FormLayout also considers each component's minimum and preferred sizes in order to determine a component's size.

FormLayout has been designed to work with non-visual builders that help you specify the layout and fill the grid. For example, the ButtonBarBuilder assists you in building button bars; it creates a standardized FormLayout and provides a minimal API that specializes in adding buttons and Actions. Other builders can create frequently used panel design, for example a form that consists of rows of label-component pairs.

FormLayout has been prepared to work with different types of sizes as defined by the Size interface.

Example 1 (Plain FormLayout):
The following example creates a panel with 3 data columns and 3 data rows; the columns and rows are specified before components are added to the form.

 FormLayout layout = new FormLayout(
      "right:pref, 6dlu, 50dlu, 4dlu, default",  // columns
      "pref, 3dlu, pref, 3dlu, pref");           // rows

 JPanel panel = new JPanel(layout);
 panel.add(new JLabel("Label1"),   CC.xy  (1, 1));
 panel.add(new JTextField(),       CC.xywh(3, 1, 3, 1));
 panel.add(new JLabel("Label2"),   CC.xy  (1, 3));
 panel.add(new JTextField(),       CC.xy  (3, 3));
 panel.add(new JLabel("Label3"),   CC.xy  (1, 5));
 panel.add(new JTextField(),       CC.xy  (3, 5));
 panel.add(new JButton("/u2026"),  CC.xy  (5, 5));
 return panel;
 

Example 2 (Using PanelBuilder):
This example creates the same panel as above using the PanelBuilder to add components to the form.

 FormLayout layout = new FormLayout(
      "right:pref, 6dlu, 50dlu, 4dlu, default",  // columns
      "pref, 3dlu, pref, 3dlu, pref");           // rows

 PanelBuilder builder = new PanelBuilder(layout);
 builder.addLabel("Label1",         CC.xy  (1, 1));
 builder.add(new JTextField(),      CC.xywh(3, 1, 3, 1));
 builder.addLabel("Label2",         CC.xy  (1, 3));
 builder.add(new JTextField(),      CC.xy  (3, 3));
 builder.addLabel("Label3",         CC.xy  (1, 5));
 builder.add(new JTextField(),      CC.xy  (3, 5));
 builder.add(new JButton("/u2026"), CC.xy  (5, 5));
 return builder.getPanel();
 

Example 3 (Using DefaultFormBuilder):
This example utilizes the DefaultFormBuilder that ships with the source distribution.

 FormLayout layout = new FormLayout(
      "right:pref, 6dlu, 50dlu, 4dlu, default"); // 5 columns; add rows later

 DefaultFormBuilder builder = new DefaultFormBuilder(layout);
 builder.append("Label1", new JTextField(), 3);
 builder.append("Label2", new JTextField());
 builder.append("Label3", new JTextField());
 builder.append(new JButton("/u2026"));
 return builder.getPanel();
 

Version:
$Revision: 1.30 $
Author:
Karsten Lentzsch
See Also:
ColumnSpec, RowSpec, CellConstraints, AbstractFormBuilder, ButtonBarBuilder, DefaultFormBuilder, FormSpecs, Size, Sizes, Serialized Form

Nested Class Summary
static class FormLayout.LayoutInfo
          Stores column and row origins.
static interface FormLayout.Measure
          An interface that describes how to measure a Component.
 
Constructor Summary
FormLayout()
          Constructs an empty FormLayout.
FormLayout(ColumnSpec[] colSpecs)
          Constructs a FormLayout using the given column specifications.
FormLayout(ColumnSpec[] colSpecs, RowSpec[] rowSpecs)
          Constructs a FormLayout using the given column and row specifications.
FormLayout(String encodedColumnSpecs)
          Constructs a FormLayout using the given encoded column specifications.
FormLayout(String encodedColumnSpecs, LayoutMap layoutMap)
          Constructs a FormLayout using the given encoded column specifications and LayoutMap.
FormLayout(String encodedColumnSpecs, String encodedRowSpecs)
          Constructs a FormLayout using the given encoded column and row specifications and the default LayoutMap.
FormLayout(String encodedColumnSpecs, String encodedRowSpecs, LayoutMap layoutMap)
          Constructs a FormLayout using the given encoded column and row specifications and the given LayoutMap.
 
Method Summary
 void addGroupedColumn(int columnIndex)
          Adds the specified column index to the last column group.
 void addGroupedRow(int rowIndex)
          Adds the specified row index to the last row group.
 void addLayoutComponent(Component comp, Object constraints)
          Adds the specified component to the layout, using the specified constraints object.
 void addLayoutComponent(String name, Component component)
          Throws an UnsupportedOperationException.
 void appendColumn(ColumnSpec columnSpec)
          Appends the given column specification to the right hand side of all columns.
 void appendRow(RowSpec rowSpec)
          Appends the given row specification to the bottom of all rows.
 int getColumnCount()
          Returns the number of columns in this layout.
 int[][] getColumnGroups()
          Returns a deep copy of the column groups.
 ColumnSpec getColumnSpec(int columnIndex)
          Returns the ColumnSpec at the specified column index.
 CellConstraints getConstraints(Component component)
          Looks up and returns the constraints for the specified component.
 boolean getHonorsVisibility()
          Returns whether invisible components shall be taken into account by this layout.
 float getLayoutAlignmentX(Container parent)
          Returns the alignment along the x axis.
 float getLayoutAlignmentY(Container parent)
          Returns the alignment along the y axis.
 FormLayout.LayoutInfo getLayoutInfo(Container parent)
          Computes and returns the horizontal and vertical grid origins.
 int getRowCount()
          Returns the number of rows in this layout.
 int[][] getRowGroups()
          Returns a deep copy of the row groups.
 RowSpec getRowSpec(int rowIndex)
          Returns the RowSpec at the specified row index.
 void insertColumn(int columnIndex, ColumnSpec columnSpec)
          Inserts the specified column at the specified position.
 void insertRow(int rowIndex, RowSpec rowSpec)
          Inserts the specified column at the specified position.
 void invalidateLayout(Container target)
          Invalidates the layout, indicating that if the layout manager has cached information it should be discarded.
 void layoutContainer(Container parent)
          Lays out the specified container using this form layout.
 Dimension maximumLayoutSize(Container target)
          Returns the maximum dimensions for this layout given the components in the specified target container.
 Dimension minimumLayoutSize(Container parent)
          Determines the minimum size of the parent container using this form layout.
 Dimension preferredLayoutSize(Container parent)
          Determines the preferred size of the parent container using this form layout.
 void removeColumn(int columnIndex)
          Removes the column with the given column index from the layout.
 void removeLayoutComponent(Component comp)
          Removes the specified component from this layout.
 void removeRow(int rowIndex)
          Removes the row with the given row index from the layout.
 void setColumnGroups(int[][] colGroupIndices)
          Sets the column groups, where each column in a group gets the same group wide width.
 void setColumnSpec(int columnIndex, ColumnSpec columnSpec)
          Sets the ColumnSpec at the specified column index.
 void setConstraints(Component component, CellConstraints constraints)
          Sets the constraints for the specified component in this layout.
 void setHonorsVisibility(boolean b)
          Specifies whether invisible components shall be taken into account by this layout for computing the layout size and setting component bounds.
 void setHonorsVisibility(Component component, Boolean b)
          Specifies whether the given component shall be taken into account for sizing and positioning.
 void setRowGroups(int[][] rowGroupIndices)
          Sets the row groups, where each row in such a group gets the same group wide height.
 void setRowSpec(int rowIndex, RowSpec rowSpec)
          Sets the RowSpec at the specified row index.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

FormLayout

public FormLayout()
Constructs an empty FormLayout. Columns and rows must be added before components can be added to the layout container.

This constructor is intended to be used in environments that add columns and rows dynamically.


FormLayout

public FormLayout(String encodedColumnSpecs)
Constructs a FormLayout using the given encoded column specifications. The constructed layout has no rows; these must be added before components can be added to the layout container. The string decoding uses the default LayoutMap.

This constructor is intended to be used with builder classes that add rows dynamically, such as the DefaultFormBuilder.

Examples:

 // Label, gap, component
 FormLayout layout = new FormLayout(
      "pref, 4dlu, pref");

 // Right-aligned label, gap, component, gap, component
 FormLayout layout = new FormLayout(
      "right:pref, 4dlu, 50dlu, 4dlu, 50dlu");

 // Left-aligned labels, gap, components, gap, components
 FormLayout layout = new FormLayout(
      "left:pref, 4dlu, pref, 4dlu, pref");
 
See the class comment for more examples.

Parameters:
encodedColumnSpecs - comma separated encoded column specifications
Throws:
NullPointerException - if encodedColumnSpecs is null
See Also:
LayoutMap.getRoot()

FormLayout

public FormLayout(String encodedColumnSpecs,
                  LayoutMap layoutMap)
Constructs a FormLayout using the given encoded column specifications and LayoutMap. The constructed layout has no rows; these must be added before components can be added to the layout container.

This constructor is intended to be used with builder classes that add rows dynamically, such as the DefaultFormBuilder.

Examples:

 // Label, gap, component
 FormLayout layout = new FormLayout(
      "pref, 4dlu, pref",
      myLayoutMap);

 // Right-aligned label, gap, component, gap, component
 FormLayout layout = new FormLayout(
      "right:pref, @lcgap, 50dlu, 4dlu, 50dlu",
      myLayoutMap);

 // Left-aligned labels, gap, components, gap, components
 FormLayout layout = new FormLayout(
      "left:pref, @lcgap, pref, @myGap, pref",
      myLayoutMap);
 
See the class comment for more examples.

Parameters:
encodedColumnSpecs - comma separated encoded column specifications
layoutMap - expands layout column and row variables
Throws:
NullPointerException - if encodedColumnSpecs or layoutMap is null
Since:
1.2
See Also:
LayoutMap.getRoot()

FormLayout

public FormLayout(String encodedColumnSpecs,
                  String encodedRowSpecs)
Constructs a FormLayout using the given encoded column and row specifications and the default LayoutMap.

This constructor is recommended for most hand-coded layouts.

Examples:

 FormLayout layout = new FormLayout(
      "pref, 4dlu, pref",               // columns
      "p, 3dlu, p");                    // rows

 FormLayout layout = new FormLayout(
      "right:pref, 4dlu, pref",         // columns
      "p, 3dlu, p, 3dlu, fill:p:grow"); // rows

 FormLayout layout = new FormLayout(
      "left:pref, 4dlu, 50dlu",         // columns
      "p, 2px, p, 3dlu, p, 9dlu, p");   // rows

 FormLayout layout = new FormLayout(
      "max(75dlu;pref), 4dlu, default", // columns
      "p, 3dlu, p, 3dlu, p, 3dlu, p");  // rows
 
See the class comment for more examples.

Parameters:
encodedColumnSpecs - comma separated encoded column specifications
encodedRowSpecs - comma separated encoded row specifications
Throws:
NullPointerException - if encodedColumnSpecs or encodedRowSpecs is null
See Also:
LayoutMap.getRoot()

FormLayout

public FormLayout(String encodedColumnSpecs,
                  String encodedRowSpecs,
                  LayoutMap layoutMap)
Constructs a FormLayout using the given encoded column and row specifications and the given LayoutMap.

Examples:

 FormLayout layout = new FormLayout(
      "pref, 4dlu, pref",               // columns
      "p, 3dlu, p",                     // rows
      myLayoutMap);                     // custom LayoutMap

 FormLayout layout = new FormLayout(
      "right:pref, 4dlu, pref",         // columns
      "p, @lgap, p, @lgap, fill:p:grow",// rows
      myLayoutMap);                     // custom LayoutMap

 FormLayout layout = new FormLayout(
      "left:pref, 4dlu, 50dlu",         // columns
      "p, 2px, p, 3dlu, p, 9dlu, p",    // rows
      myLayoutMap);                     // custom LayoutMap

 FormLayout layout = new FormLayout(
      "max(75dlu;pref), 4dlu, default", // columns
      "p, 3dlu, p, 3dlu, p, 3dlu, p",   // rows
      myLayoutMap);                     // custom LayoutMap
 
See the class comment for more examples.

Parameters:
encodedColumnSpecs - comma separated encoded column specifications
encodedRowSpecs - comma separated encoded row specifications
layoutMap - expands layout column and row variables
Throws:
NullPointerException - if encodedColumnSpecs, encodedRowSpecs, or layoutMap is null
Since:
1.2

FormLayout

public FormLayout(ColumnSpec[] colSpecs)
Constructs a FormLayout using the given column specifications. The constructed layout has no rows; these must be added before components can be added to the layout container.

Parameters:
colSpecs - an array of column specifications.
Throws:
NullPointerException - if colSpecs is null
Since:
1.1

FormLayout

public FormLayout(ColumnSpec[] colSpecs,
                  RowSpec[] rowSpecs)
Constructs a FormLayout using the given column and row specifications.

Parameters:
colSpecs - an array of column specifications.
rowSpecs - an array of row specifications.
Throws:
NullPointerException - if colSpecs or rowSpecs is null
Method Detail

getColumnCount

public int getColumnCount()
Returns the number of columns in this layout.

Returns:
the number of columns

getColumnSpec

public ColumnSpec getColumnSpec(int columnIndex)
Returns the ColumnSpec at the specified column index.

Parameters:
columnIndex - the column index of the requested ColumnSpec
Returns:
the ColumnSpec at the specified column
Throws:
IndexOutOfBoundsException - if the column index is out of range

setColumnSpec

public void setColumnSpec(int columnIndex,
                          ColumnSpec columnSpec)
Sets the ColumnSpec at the specified column index.

Parameters:
columnIndex - the index of the column to be changed
columnSpec - the ColumnSpec to be set
Throws:
NullPointerException - if columnSpec is null
IndexOutOfBoundsException - if the column index is out of range

appendColumn

public void appendColumn(ColumnSpec columnSpec)
Appends the given column specification to the right hand side of all columns.

Parameters:
columnSpec - the column specification to be added
Throws:
NullPointerException - if columnSpec is null

insertColumn

public void insertColumn(int columnIndex,
                         ColumnSpec columnSpec)
Inserts the specified column at the specified position. Shifts components that intersect the new column to the right hand side and readjusts column groups.

The component shift works as follows: components that were located on the right hand side of the inserted column are shifted one column to the right; component column span is increased by one if it intersects the new column.

Column group indices that are greater or equal than the given column index will be increased by one.

Parameters:
columnIndex - index of the column to be inserted
columnSpec - specification of the column to be inserted
Throws:
IndexOutOfBoundsException - if the column index is out of range

removeColumn

public void removeColumn(int columnIndex)
Removes the column with the given column index from the layout. Components will be rearranged and column groups will be readjusted. Therefore, the column must not contain components and must not be part of a column group.

The component shift works as follows: components that were located on the right hand side of the removed column are moved one column to the left; component column span is decreased by one if it intersects the removed column.

Column group indices that are greater than the column index will be decreased by one.

Note: If one of the constraints mentioned above is violated, this layout's state becomes illegal and it is unsafe to work with this layout. A typical layout implementation can ensure that these constraints are not violated. However, in some cases you may need to check these conditions before you invoke this method. The Forms extras contain source code for class FormLayoutUtils that provides the required test methods:
#columnContainsComponents(Container, int) and
#isGroupedColumn(FormLayout, int).

Parameters:
columnIndex - index of the column to remove
Throws:
IndexOutOfBoundsException - if the column index is out of range
IllegalStateException - if the column contains components or if the column is already grouped
See Also:
FormLayoutUtils.columnContainsComponent(Container, int), FormLayoutUtils.isGroupedColumn(FormLayout, int)

getRowCount

public int getRowCount()
Returns the number of rows in this layout.

Returns:
the number of rows

getRowSpec

public RowSpec getRowSpec(int rowIndex)
Returns the RowSpec at the specified row index.

Parameters:
rowIndex - the row index of the requested RowSpec
Returns:
the RowSpec at the specified row
Throws:
IndexOutOfBoundsException - if the row index is out of range

setRowSpec

public void setRowSpec(int rowIndex,
                       RowSpec rowSpec)
Sets the RowSpec at the specified row index.

Parameters:
rowIndex - the index of the row to be changed
rowSpec - the RowSpec to be set
Throws:
NullPointerException - if rowSpec is null
IndexOutOfBoundsException - if the row index is out of range

appendRow

public void appendRow(RowSpec rowSpec)
Appends the given row specification to the bottom of all rows.

Parameters:
rowSpec - the row specification to be added to the form layout
Throws:
NullPointerException - if rowSpec is null

insertRow

public void insertRow(int rowIndex,
                      RowSpec rowSpec)
Inserts the specified column at the specified position. Shifts components that intersect the new column to the right and readjusts column groups.

The component shift works as follows: components that were located on the right hand side of the inserted column are shifted one column to the right; component column span is increased by one if it intersects the new column.

Column group indices that are greater or equal than the given column index will be increased by one.

Parameters:
rowIndex - index of the row to be inserted
rowSpec - specification of the row to be inserted
Throws:
IndexOutOfBoundsException - if the row index is out of range

removeRow

public void removeRow(int rowIndex)
Removes the row with the given row index from the layout. Components will be rearranged and row groups will be readjusted. Therefore, the row must not contain components and must not be part of a row group.

The component shift works as follows: components that were located below the removed row are moved up one row; component row span is decreased by one if it intersects the removed row.

Row group indices that are greater than the row index will be decreased by one.

Note: If one of the constraints mentioned above is violated, this layout's state becomes illegal and it is unsafe to work with this layout. A typical layout implementation can ensure that these constraints are not violated. However, in some cases you may need to check these conditions before you invoke this method. The Forms extras contain source code for class FormLayoutUtils that provides the required test methods:
#rowContainsComponents(Container, int) and
#isGroupedRow(FormLayout, int).

Parameters:
rowIndex - index of the row to remove
Throws:
IndexOutOfBoundsException - if the row index is out of range
IllegalStateException - if the row contains components or if the row is already grouped
See Also:
FormLayoutUtils.rowContainsComponent(Container, int), FormLayoutUtils.isGroupedRow(FormLayout, int)

getConstraints

public CellConstraints getConstraints(Component component)
Looks up and returns the constraints for the specified component. A copy of the actualCellConstraints object is returned.

Parameters:
component - the component to be queried
Returns:
the CellConstraints for the specified component
Throws:
NullPointerException - if component is null
IllegalStateException - if component has not been added to the container

setConstraints

public void setConstraints(Component component,
                           CellConstraints constraints)
Sets the constraints for the specified component in this layout.

Parameters:
component - the component to be modified
constraints - the constraints to be applied
Throws:
NullPointerException - if component or constraints is null

getColumnGroups

public int[][] getColumnGroups()
Returns a deep copy of the column groups.

Returns:
the column groups as two-dimensional int array

setColumnGroups

public void setColumnGroups(int[][] colGroupIndices)
Sets the column groups, where each column in a group gets the same group wide width. Each group is described by an array of integers that are interpreted as column indices. The parameter is an array of such group descriptions.

Examples:

 // Group columns 1, 3 and 4.
 setColumnGroups(new int[][]{ {1, 3, 4}});

 // Group columns 1, 3, 4, and group columns 7 and 9
 setColumnGroups(new int[][]{ {1, 3, 4}, {7, 9}});
 

Parameters:
colGroupIndices - a two-dimensional array of column groups indices
Throws:
IndexOutOfBoundsException - if an index is outside the grid
IllegalArgumentException - if a column index is used twice

addGroupedColumn

public void addGroupedColumn(int columnIndex)
Adds the specified column index to the last column group. In case there are no groups, a new group will be created.

Parameters:
columnIndex - the column index to be set grouped

getRowGroups

public int[][] getRowGroups()
Returns a deep copy of the row groups.

Returns:
the row groups as two-dimensional int array

setRowGroups

public void setRowGroups(int[][] rowGroupIndices)
Sets the row groups, where each row in such a group gets the same group wide height. Each group is described by an array of integers that are interpreted as row indices. The parameter is an array of such group descriptions.

Examples:

 // Group rows 1 and 2.
 setRowGroups(new int[][]{ {1, 2}});

 // Group rows 1 and 2, and group rows 5, 7, and 9.
 setRowGroups(new int[][]{ {1, 2}, {5, 7, 9}});
 

Parameters:
rowGroupIndices - a two-dimensional array of row group indices.
Throws:
IndexOutOfBoundsException - if an index is outside the grid

addGroupedRow

public void addGroupedRow(int rowIndex)
Adds the specified row index to the last row group. In case there are no groups, a new group will be created.

Parameters:
rowIndex - the index of the row that should be grouped

getHonorsVisibility

public boolean getHonorsVisibility()
Returns whether invisible components shall be taken into account by this layout. This container-wide setting can be overridden per component. See setHonorsVisibility(boolean) for details.

Returns:
true if the component visibility is honored by this FormLayout, false if it is ignored. This setting can be overridden for individual CellConstraints using setHonorsVisibility(Component, Boolean).
Since:
1.2

setHonorsVisibility

public void setHonorsVisibility(boolean b)
Specifies whether invisible components shall be taken into account by this layout for computing the layout size and setting component bounds. If set to true invisible components will be ignored by the layout. If set to false components will be taken into account regardless of their visibility. Visible components are always used for sizing and positioning.

The default value for this setting is true. It is useful to set the value to false (in other words to ignore the visibility) if you switch the component visibility dynamically and want the container to retain the size and component positions.

This container-wide default setting can be overridden per component using setHonorsVisibility(Component, Boolean).

Components are taken into account, if

  1. they are visible, or
  2. they have no individual setting and the container-wide settings ignores the visibility (honorsVisibility set to false), or
  3. the individual component ignores the visibility.

Parameters:
b - true to honor the visibility, i.e. to exclude invisible components from the sizing and positioning, false to ignore the visibility, in other words to layout visible and invisible components
Since:
1.2

setHonorsVisibility

public void setHonorsVisibility(Component component,
                                Boolean b)
Specifies whether the given component shall be taken into account for sizing and positioning. This setting overrides the container-wide default. See setHonorsVisibility(boolean) for details.

Parameters:
component - the component that shall get an individual setting
b - Boolean.TRUE to override the container default and honor the visibility for the given component, Boolean.FALSE to override the container default and ignore the visibility for the given component, null to use the container default value as specified by getHonorsVisibility().
Since:
1.2

addLayoutComponent

public void addLayoutComponent(String name,
                               Component component)
Throws an UnsupportedOperationException. Does not add the specified component with the specified name to the layout.

Specified by:
addLayoutComponent in interface LayoutManager
Parameters:
name - indicates entry's position and anchor
component - component to add
Throws:
UnsupportedOperationException - always

addLayoutComponent

public void addLayoutComponent(Component comp,
                               Object constraints)
Adds the specified component to the layout, using the specified constraints object. Note that constraints are mutable and are, therefore, cloned when cached.

Specified by:
addLayoutComponent in interface LayoutManager2
Parameters:
comp - the component to be added
constraints - the component's cell constraints
Throws:
NullPointerException - if constraints is null
IllegalArgumentException - if constraints is neither a String, nor a CellConstraints object, or a String that is rejected by the CellConstraints construction

removeLayoutComponent

public void removeLayoutComponent(Component comp)
Removes the specified component from this layout.

Most applications do not call this method directly.

Specified by:
removeLayoutComponent in interface LayoutManager
Parameters:
comp - the component to be removed.
See Also:
Container.remove(java.awt.Component), Container.removeAll()

minimumLayoutSize

public Dimension minimumLayoutSize(Container parent)
Determines the minimum size of the parent container using this form layout.

Most applications do not call this method directly.

Specified by:
minimumLayoutSize in interface LayoutManager
Parameters:
parent - the container in which to do the layout
Returns:
the minimum size of the parent container
See Also:
Container.doLayout()

preferredLayoutSize

public Dimension preferredLayoutSize(Container parent)
Determines the preferred size of the parent container using this form layout.

Most applications do not call this method directly.

Specified by:
preferredLayoutSize in interface LayoutManager
Parameters:
parent - the container in which to do the layout
Returns:
the preferred size of the parent container
See Also:
Container.getPreferredSize()

maximumLayoutSize

public Dimension maximumLayoutSize(Container target)
Returns the maximum dimensions for this layout given the components in the specified target container.

Specified by:
maximumLayoutSize in interface LayoutManager2
Parameters:
target - the container which needs to be laid out
Returns:
the maximum dimensions for this layout
See Also:
Container, minimumLayoutSize(Container), preferredLayoutSize(Container)

getLayoutAlignmentX

public float getLayoutAlignmentX(Container parent)
Returns the alignment along the x axis. This specifies how the component would like to be aligned relative to other components. The value should be a number between 0 and 1 where 0 represents alignment along the origin, 1 is aligned the farthest away from the origin, 0.5 is centered, etc.

Specified by:
getLayoutAlignmentX in interface LayoutManager2
Parameters:
parent - the parent container
Returns:
the value 0.5f to indicate center alignment

getLayoutAlignmentY

public float getLayoutAlignmentY(Container parent)
Returns the alignment along the y axis. This specifies how the component would like to be aligned relative to other components. The value should be a number between 0 and 1 where 0 represents alignment along the origin, 1 is aligned the farthest away from the origin, 0.5 is centered, etc.

Specified by:
getLayoutAlignmentY in interface LayoutManager2
Parameters:
parent - the parent container
Returns:
the value 0.5f to indicate center alignment

invalidateLayout

public void invalidateLayout(Container target)
Invalidates the layout, indicating that if the layout manager has cached information it should be discarded.

Specified by:
invalidateLayout in interface LayoutManager2
Parameters:
target - the container that holds the layout to be invalidated

layoutContainer

public void layoutContainer(Container parent)
Lays out the specified container using this form layout. This method reshapes components in the specified container in order to satisfy the constraints of this FormLayout object.

Most applications do not call this method directly.

The form layout performs the following steps:

  1. find components that occupy exactly one column or row
  2. compute minimum widths and heights
  3. compute preferred widths and heights
  4. give cols and row equal size if they share a group
  5. compress default columns and rows if total is less than pref size
  6. give cols and row equal size if they share a group
  7. distribute free space
  8. set components bounds

Specified by:
layoutContainer in interface LayoutManager
Parameters:
parent - the container in which to do the layout
See Also:
Container, Container.doLayout()

getLayoutInfo

public FormLayout.LayoutInfo getLayoutInfo(Container parent)
Computes and returns the horizontal and vertical grid origins. Performs the same layout process as #layoutContainer but does not layout the components.

This method has been added only to make it easier to debug the form layout. You must not call this method directly; It may be removed in a future release or the visibility may be reduced.

Parameters:
parent - the Container to inspect
Returns:
an object that comprises the grid x and y origins


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/ConstantSize.Unit.html0000644000175000017500000003533712003555424026201 0ustar tonytony ConstantSize.Unit (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class ConstantSize.Unit

java.lang.Object
  extended by com.jgoodies.forms.layout.ConstantSize.Unit
All Implemented Interfaces:
Serializable
Enclosing class:
ConstantSize

public static final class ConstantSize.Unit
extends Object
implements Serializable

An ordinal-based serializable typesafe enumeration for units as used in instances of ConstantSize.

See Also:
Serialized Form

Method Summary
 String abbreviation()
          Returns the first character of this Unit's name.
 String encode()
          Returns a parseable string representation of this unit.
 String toString()
          Returns a string representation of this unit object.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Method Detail

toString

public String toString()
Returns a string representation of this unit object. Note: This implementation may change at any time. It is intended for debugging purposes. For parsing, use encode() instead.

Overrides:
toString in class Object
Returns:
a string representation of the constant size

encode

public String encode()
Returns a parseable string representation of this unit.

Returns:
a String that can be parsed by the Forms parser
Since:
1.2

abbreviation

public String abbreviation()
Returns the first character of this Unit's name. Used to identify it in short format strings.

Returns:
the first character of this Unit's name.


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/package-tree.html0000644000175000017500000003133512003555424025161 0ustar tonytony com.jgoodies.forms.layout Class Hierarchy (JGoodies Forms 1.6 API)

Hierarchy For Package com.jgoodies.forms.layout

Package Hierarchies:
All Packages

Class Hierarchy

Interface Hierarchy



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/FormSpec.DefaultAlignment.html0000644000175000017500000003216312003555424027571 0ustar tonytony FormSpec.DefaultAlignment (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class FormSpec.DefaultAlignment

java.lang.Object
  extended by com.jgoodies.forms.layout.FormSpec.DefaultAlignment
All Implemented Interfaces:
Serializable
Enclosing class:
FormSpec

public static final class FormSpec.DefaultAlignment
extends Object
implements Serializable

An ordinal-based serializable typesafe enumeration for the column and row default alignment types.

See Also:
Serialized Form

Method Summary
 char abbreviation()
          Returns the first character of this Alignment's name.
 String toString()
          Returns this Alignment's name.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Method Detail

toString

public String toString()
Returns this Alignment's name.

Overrides:
toString in class Object
Returns:
this alignment's name.

abbreviation

public char abbreviation()
Returns the first character of this Alignment's name. Used to identify it in short format strings.

Returns:
the name's first character.


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/package-use.html0000644000175000017500000005327312003555424025023 0ustar tonytony Uses of Package com.jgoodies.forms.layout (JGoodies Forms 1.6 API)

Uses of Package
com.jgoodies.forms.layout

Packages that use com.jgoodies.forms.layout
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.debug Consists of optional classes that help you find, understand and fix layout problems 
com.jgoodies.forms.extras Contains optional Forms framework classes that ship only with the JGoodies Forms source distribution and are not yet part of the binary Forms library. 
com.jgoodies.forms.factories Consists of optional Forms framework factory classes that assist you in building consistent forms quickly 
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles 
 

Classes in com.jgoodies.forms.layout used by com.jgoodies.forms.builder
CellConstraints
          Defines constraints for components that are laid out with the FormLayout.
CellConstraints.Alignment
          An ordinal-based serializable typesafe enumeration for component alignment types as used by the FormLayout.
ColumnSpec
          Specifies columns in FormLayout by their default orientation, start size and resizing behavior.
ConstantSize
          An implementation of the Size interface that represents constant sizes described by a value and unit, for example: 10 pixel, 15 point or 4 dialog units.
FormLayout
          FormLayout is a powerful, flexible and precise general purpose layout manager.
RowSpec
          Specifies rows in FormLayout by their default orientation, start size and resizing behavior.
 

Classes in com.jgoodies.forms.layout used by com.jgoodies.forms.debug
FormLayout
          FormLayout is a powerful, flexible and precise general purpose layout manager.
FormLayout.LayoutInfo
          Stores column and row origins.
 

Classes in com.jgoodies.forms.layout used by com.jgoodies.forms.extras
CellConstraints
          Defines constraints for components that are laid out with the FormLayout.
FormLayout
          FormLayout is a powerful, flexible and precise general purpose layout manager.
 

Classes in com.jgoodies.forms.layout used by com.jgoodies.forms.factories
CellConstraints
          Defines constraints for components that are laid out with the FormLayout.
CellConstraints.Alignment
          An ordinal-based serializable typesafe enumeration for component alignment types as used by the FormLayout.
ConstantSize
          An implementation of the Size interface that represents constant sizes described by a value and unit, for example: 10 pixel, 15 point or 4 dialog units.
 

Classes in com.jgoodies.forms.layout used by com.jgoodies.forms.layout
CellConstraints
          Defines constraints for components that are laid out with the FormLayout.
CellConstraints.Alignment
          An ordinal-based serializable typesafe enumeration for component alignment types as used by the FormLayout.
ColumnSpec
          Specifies columns in FormLayout by their default orientation, start size and resizing behavior.
ConstantSize
          An implementation of the Size interface that represents constant sizes described by a value and unit, for example: 10 pixel, 15 point or 4 dialog units.
ConstantSize.Unit
          An ordinal-based serializable typesafe enumeration for units as used in instances of ConstantSize.
FormLayout
          FormLayout is a powerful, flexible and precise general purpose layout manager.
FormLayout.LayoutInfo
          Stores column and row origins.
FormLayout.Measure
          An interface that describes how to measure a Component.
FormSpec
          An abstract class that specifies columns and rows in FormLayout by their default alignment, start size and resizing behavior.
FormSpec.DefaultAlignment
          An ordinal-based serializable typesafe enumeration for the column and row default alignment types.
LayoutMap
          Provides a hierarchical variable expansion useful to improve layout consistency, style guide compliance, and layout readability.
RowSpec
          Specifies rows in FormLayout by their default orientation, start size and resizing behavior.
Size
          An interface that describes sizes as used by the FormLayout: component measuring sizes, constant sizes with value and unit, and bounded sizes that provide lower and upper bounds for a size.
 

Classes in com.jgoodies.forms.layout used by com.jgoodies.forms.util
ConstantSize
          An implementation of the Size interface that represents constant sizes described by a value and unit, for example: 10 pixel, 15 point or 4 dialog units.
Size
          An interface that describes sizes as used by the FormLayout: component measuring sizes, constant sizes with value and unit, and bounded sizes that provide lower and upper bounds for a size.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/Sizes.html0000644000175000017500000015001612003555424023724 0ustar tonytony Sizes (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class Sizes

java.lang.Object
  extended by com.jgoodies.forms.layout.Sizes

public final class Sizes
extends Object

Consists only of static methods that create and convert sizes as required by the FormLayout. The conversion of sizes that are not based on pixel is delegated to an implementation of UnitConverter. The conversion methods require the layout container as parameter to read its current font and resolution.

Version:
$Revision: 1.19 $
Author:
Karsten Lentzsch
See Also:
Size, UnitConverter, DefaultUnitConverter

Field Summary
static com.jgoodies.forms.layout.Sizes.ComponentSize DEFAULT
          Use the maximum of all component sizes as column or row size; measures preferred sizes when asked for the preferred size and minimum sizes when asked for the minimum size.
static ConstantSize DLUX1
           
static ConstantSize DLUX11
           
static ConstantSize DLUX14
           
static ConstantSize DLUX2
           
static ConstantSize DLUX21
          21 horizontal dialog units.
static ConstantSize DLUX3
           
static ConstantSize DLUX4
           
static ConstantSize DLUX5
           
static ConstantSize DLUX6
           
static ConstantSize DLUX7
           
static ConstantSize DLUX8
           
static ConstantSize DLUX9
           
static ConstantSize DLUY1
           
static ConstantSize DLUY11
           
static ConstantSize DLUY14
           
static ConstantSize DLUY2
           
static ConstantSize DLUY21
          21 vertical dialog units.
static ConstantSize DLUY3
           
static ConstantSize DLUY4
           
static ConstantSize DLUY5
           
static ConstantSize DLUY6
           
static ConstantSize DLUY7
           
static ConstantSize DLUY8
           
static ConstantSize DLUY9
           
static com.jgoodies.forms.layout.Sizes.ComponentSize MINIMUM
          Use the maximum of all component minimum sizes as column or row size.
static com.jgoodies.forms.layout.Sizes.ComponentSize PREFERRED
          Use the maximum of all component preferred sizes as column or row size.
static ConstantSize ZERO
           
 
Method Summary
static Size bounded(Size basis, Size lowerBound, Size upperBound)
          Creates and returns a BoundedSize for the given basis using the specified lower and upper bounds.
static int centimeterAsPixel(double cm, Component component)
          Converts Centimeters and returns pixels using the resolution of the given component's graphics object.
static ConstantSize constant(String encodedValueAndUnit, boolean horizontal)
          Creates and returns an instance of ConstantSize from the given encoded size and unit description.
static int dialogUnitXAsPixel(int dluX, Component component)
          Converts horizontal dialog units and returns pixels.
static int dialogUnitYAsPixel(int dluY, Component component)
          Converts vertical dialog units and returns pixels.
static ConstantSize dluX(int value)
          Creates and returns a ConstantSize for the specified value in horizontal dialog units.
static ConstantSize dluY(int value)
          Creates and returns a ConstantSize for the specified value in vertical dialog units.
static ConstantSize.Unit getDefaultUnit()
          Returns the Unit that is used if an encoded ConstantSize contains no unit string.
static UnitConverter getUnitConverter()
          Returns the current UnitConverter.
static int inchAsPixel(double in, Component component)
          Converts Inches and returns pixels using the specified resolution.
static int millimeterAsPixel(double mm, Component component)
          Converts Millimeters and returns pixels using the resolution of the given component's graphics object.
static ConstantSize pixel(int value)
          Creates and returns a ConstantSize for the specified pixel value.
static int pointAsPixel(int pt, Component component)
          Converts DTP Points and returns pixels using the resolution of the given component's graphics object.
static void setDefaultUnit(ConstantSize.Unit unit)
          Sets the Unit that shall be used if an encoded ConstantSize provides no unit string.
static void setUnitConverter(UnitConverter newUnitConverter)
          Sets a new UnitConverter that will be used to convert font-dependent sizes to pixel sizes.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

ZERO

public static final ConstantSize ZERO

DLUX1

public static final ConstantSize DLUX1

DLUX2

public static final ConstantSize DLUX2

DLUX3

public static final ConstantSize DLUX3

DLUX4

public static final ConstantSize DLUX4

DLUX5

public static final ConstantSize DLUX5

DLUX6

public static final ConstantSize DLUX6

DLUX7

public static final ConstantSize DLUX7

DLUX8

public static final ConstantSize DLUX8

DLUX9

public static final ConstantSize DLUX9

DLUX11

public static final ConstantSize DLUX11

DLUX14

public static final ConstantSize DLUX14

DLUX21

public static final ConstantSize DLUX21
21 horizontal dialog units.

Since:
1.2

DLUY1

public static final ConstantSize DLUY1

DLUY2

public static final ConstantSize DLUY2

DLUY3

public static final ConstantSize DLUY3

DLUY4

public static final ConstantSize DLUY4

DLUY5

public static final ConstantSize DLUY5

DLUY6

public static final ConstantSize DLUY6

DLUY7

public static final ConstantSize DLUY7

DLUY8

public static final ConstantSize DLUY8

DLUY9

public static final ConstantSize DLUY9

DLUY11

public static final ConstantSize DLUY11

DLUY14

public static final ConstantSize DLUY14

DLUY21

public static final ConstantSize DLUY21
21 vertical dialog units.

Since:
1.2

MINIMUM

public static final com.jgoodies.forms.layout.Sizes.ComponentSize MINIMUM
Use the maximum of all component minimum sizes as column or row size.


PREFERRED

public static final com.jgoodies.forms.layout.Sizes.ComponentSize PREFERRED
Use the maximum of all component preferred sizes as column or row size.


DEFAULT

public static final com.jgoodies.forms.layout.Sizes.ComponentSize DEFAULT
Use the maximum of all component sizes as column or row size; measures preferred sizes when asked for the preferred size and minimum sizes when asked for the minimum size.

Method Detail

constant

public static ConstantSize constant(String encodedValueAndUnit,
                                    boolean horizontal)
Creates and returns an instance of ConstantSize from the given encoded size and unit description.

Parameters:
encodedValueAndUnit - value and unit in string representation
horizontal - true for horizontal, false for vertical
Returns:
a ConstantSize for the given value and unit

dluX

public static ConstantSize dluX(int value)
Creates and returns a ConstantSize for the specified value in horizontal dialog units.

Parameters:
value - size value in horizontal dialog units
Returns:
the associated ConstantSize

dluY

public static ConstantSize dluY(int value)
Creates and returns a ConstantSize for the specified value in vertical dialog units.

Parameters:
value - size value in vertical dialog units
Returns:
the associated ConstantSize

pixel

public static ConstantSize pixel(int value)
Creates and returns a ConstantSize for the specified pixel value.

Parameters:
value - value in pixel
Returns:
the associated ConstantSize

bounded

public static Size bounded(Size basis,
                           Size lowerBound,
                           Size upperBound)
Creates and returns a BoundedSize for the given basis using the specified lower and upper bounds.

Parameters:
basis - the base size
lowerBound - the lower bound size
upperBound - the upper bound size
Returns:
a BoundedSize for the given basis and bounds
Throws:
NullPointerException - if basis is null, or if both lowerBound and upperBound are null.

inchAsPixel

public static int inchAsPixel(double in,
                              Component component)
Converts Inches and returns pixels using the specified resolution.

Parameters:
in - the Inches
component - the component that provides the graphics object
Returns:
the given Inches as pixels

millimeterAsPixel

public static int millimeterAsPixel(double mm,
                                    Component component)
Converts Millimeters and returns pixels using the resolution of the given component's graphics object.

Parameters:
mm - Millimeters
component - the component that provides the graphics object
Returns:
the given Millimeters as pixels

centimeterAsPixel

public static int centimeterAsPixel(double cm,
                                    Component component)
Converts Centimeters and returns pixels using the resolution of the given component's graphics object.

Parameters:
cm - Centimeters
component - the component that provides the graphics object
Returns:
the given Centimeters as pixels

pointAsPixel

public static int pointAsPixel(int pt,
                               Component component)
Converts DTP Points and returns pixels using the resolution of the given component's graphics object.

Parameters:
pt - DTP Points
component - the component that provides the graphics object
Returns:
the given Points as pixels

dialogUnitXAsPixel

public static int dialogUnitXAsPixel(int dluX,
                                     Component component)
Converts horizontal dialog units and returns pixels. Honors the resolution, dialog font size, platform, and l&f.

Parameters:
dluX - the horizontal dialog units
component - the component that provides the graphics object
Returns:
the given horizontal dialog units as pixels

dialogUnitYAsPixel

public static int dialogUnitYAsPixel(int dluY,
                                     Component component)
Converts vertical dialog units and returns pixels. Honors the resolution, dialog font size, platform, and l&f.

Parameters:
dluY - the vertical dialog units
component - the component that provides the graphics object
Returns:
the given vertical dialog units as pixels

getUnitConverter

public static UnitConverter getUnitConverter()
Returns the current UnitConverter. If it has not been initialized before it will get an instance of DefaultUnitConverter.

Returns:
the current UnitConverter

setUnitConverter

public static void setUnitConverter(UnitConverter newUnitConverter)
Sets a new UnitConverter that will be used to convert font-dependent sizes to pixel sizes.

Parameters:
newUnitConverter - the unit converter to be set

getDefaultUnit

public static ConstantSize.Unit getDefaultUnit()
Returns the Unit that is used if an encoded ConstantSize contains no unit string.

Returns:
the Unit if no unit string is provided
Since:
1.2

setDefaultUnit

public static void setDefaultUnit(ConstantSize.Unit unit)
Sets the Unit that shall be used if an encoded ConstantSize provides no unit string.

Parameters:
unit - the new default Unit, null for dialog units
Throws:
IllegalArgumentException - if unit is ConstantSize.DLUX or ConstantSize.DLUY.
Since:
1.2


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/RowSpec.html0000644000175000017500000010736112003555424024216 0ustar tonytony RowSpec (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class RowSpec

java.lang.Object
  extended by com.jgoodies.forms.layout.FormSpec
      extended by com.jgoodies.forms.layout.RowSpec
All Implemented Interfaces:
Serializable

public final class RowSpec
extends FormSpec

Specifies rows in FormLayout by their default orientation, start size and resizing behavior.

Examples:
The following examples specify a centered row with a size of 14 dlu that won't grow.

 new RowSpec(Sizes.dluX(14));
 new RowSpec(RowSpec.CENTER, Sizes.dluX(14), 0.0);
 new RowSpec(rowSpec.CENTER, Sizes.dluX(14), RowSpec.NO_GROW);
 RowSpec.parse("14dlu");
 RowSpec.parse("14dlu:0");
 RowSpec.parse("center:14dlu:0");
 

The FormSpecs provides predefined frequently used RowSpec instances.

Version:
$Revision: 1.20 $
Author:
Karsten Lentzsch
See Also:
FormSpecs, Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from class com.jgoodies.forms.layout.FormSpec
FormSpec.DefaultAlignment
 
Field Summary
static FormSpec.DefaultAlignment BOTTOM
          By default put the components in the bottom.
static FormSpec.DefaultAlignment CENTER
          By default put the components in the center.
static FormSpec.DefaultAlignment DEFAULT
          Unless overridden the default alignment for a row is CENTER.
static FormSpec.DefaultAlignment FILL
          By default fill the component into the row.
static FormSpec.DefaultAlignment TOP
          By default put the components in the top.
 
Fields inherited from class com.jgoodies.forms.layout.FormSpec
DEFAULT_GROW, NO_GROW
 
Constructor Summary
RowSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a RowSpec from the given default orientation, size, and resize weight.
RowSpec(Size size)
          Constructs a RowSpec for the given size using the default alignment, and no resizing.
 
Method Summary
static RowSpec createGap(ConstantSize gapHeight)
          Creates and returns a RowSpec that represents a gap with the specified ConstantSize.
static RowSpec decode(String encodedRowSpec)
          Parses the encoded row specification and returns a RowSpec object that represents the string.
static RowSpec decode(String encodedRowSpec, LayoutMap layoutMap)
          Parses the encoded row specifications and returns a RowSpec object that represents the string.
static RowSpec[] decodeSpecs(String encodedRowSpecs)
          Parses and splits encoded row specifications using the default LayoutMap and returns an array of RowSpec objects.
static RowSpec[] decodeSpecs(String encodedRowSpecs, LayoutMap layoutMap)
          Parses and splits encoded row specifications using the given LayoutMap and returns an array of RowSpec objects.
protected  boolean isHorizontal()
          Returns if this is a horizontal specification (vs. vertical).
 
Methods inherited from class com.jgoodies.forms.layout.FormSpec
encode, getDefaultAlignment, getResizeWeight, getSize, toShortString, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

TOP

public static final FormSpec.DefaultAlignment TOP
By default put the components in the top.


CENTER

public static final FormSpec.DefaultAlignment CENTER
By default put the components in the center.


BOTTOM

public static final FormSpec.DefaultAlignment BOTTOM
By default put the components in the bottom.


FILL

public static final FormSpec.DefaultAlignment FILL
By default fill the component into the row.


DEFAULT

public static final FormSpec.DefaultAlignment DEFAULT
Unless overridden the default alignment for a row is CENTER.

Constructor Detail

RowSpec

public RowSpec(FormSpec.DefaultAlignment defaultAlignment,
               Size size,
               double resizeWeight)
Constructs a RowSpec from the given default orientation, size, and resize weight.

The resize weight must be a non-negative double; you can use NO_FILL as a convenience value for no resize.

Parameters:
defaultAlignment - the row's default alignment
size - constant size, component size, or bounded size
resizeWeight - the row's non-negative resize weight
Throws:
IllegalArgumentException - if the size is invalid or the resize weight is negative

RowSpec

public RowSpec(Size size)
Constructs a RowSpec for the given size using the default alignment, and no resizing.

Parameters:
size - constant size, component size, or bounded size
Throws:
IllegalArgumentException - if the size is invalid
Method Detail

createGap

public static RowSpec createGap(ConstantSize gapHeight)
Creates and returns a RowSpec that represents a gap with the specified ConstantSize.

Parameters:
gapHeight - specifies the gap height
Returns:
a RowSpec that describes a vertical gap with the given height
Throws:
NullPointerException - if gapHeight is null
Since:
1.2

decode

public static RowSpec decode(String encodedRowSpec)
Parses the encoded row specification and returns a RowSpec object that represents the string. Variables are expanded using the default LayoutMap.

Parameters:
encodedRowSpec - the encoded row specification
Returns:
a RowSpec instance for the given specification
Throws:
NullPointerException - if encodedRowSpec is null
Since:
1.2
See Also:
decode(String, LayoutMap), LayoutMap.getRoot()

decode

public static RowSpec decode(String encodedRowSpec,
                             LayoutMap layoutMap)
Parses the encoded row specifications and returns a RowSpec object that represents the string. Variables are expanded using the given LayoutMap.

Parameters:
encodedRowSpec - the encoded column specification
layoutMap - expands layout row variables
Returns:
a RowSpec instance for the given specification
Throws:
NullPointerException - if encodedRowSpec or layoutMap is null
Since:
1.2
See Also:
decodeSpecs(String, LayoutMap)

decodeSpecs

public static RowSpec[] decodeSpecs(String encodedRowSpecs)
Parses and splits encoded row specifications using the default LayoutMap and returns an array of RowSpec objects.

Parameters:
encodedRowSpecs - comma separated encoded row specifications
Returns:
an array of decoded row specifications
Throws:
NullPointerException - if encodedRowSpecs is null
See Also:
decodeSpecs(String, LayoutMap), decode(String), LayoutMap.getRoot()

decodeSpecs

public static RowSpec[] decodeSpecs(String encodedRowSpecs,
                                    LayoutMap layoutMap)
Parses and splits encoded row specifications using the given LayoutMap and returns an array of RowSpec objects.

Parameters:
encodedRowSpecs - comma separated encoded row specifications
layoutMap - expands layout row variables
Returns:
an array of decoded row specifications
Throws:
NullPointerException - encodedRowSpecs or layoutMap is null
Since:
1.2
See Also:
RowSpec(String)

isHorizontal

protected boolean isHorizontal()
Returns if this is a horizontal specification (vs. vertical). Used to distinct between horizontal and vertical dialog units, which have different conversion factors.

Returns:
always false (for vertical)


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/0000755000175000017500000000000012003555424023635 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormSpec.html0000644000175000017500000002062612003555424026247 0ustar tonytony Uses of Class com.jgoodies.forms.layout.FormSpec (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.FormSpec

Packages that use FormSpec
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of FormSpec in com.jgoodies.forms.layout
 

Subclasses of FormSpec in com.jgoodies.forms.layout
 class ColumnSpec
          Specifies columns in FormLayout by their default orientation, start size and resizing behavior.
 class RowSpec
          Specifies rows in FormLayout by their default orientation, start size and resizing behavior.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/CellConstraints.html0000644000175000017500000020045512003555424027640 0ustar tonytony Uses of Class com.jgoodies.forms.layout.CellConstraints (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.CellConstraints

Packages that use CellConstraints
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.extras Contains optional Forms framework classes that ship only with the JGoodies Forms source distribution and are not yet part of the binary Forms library. 
com.jgoodies.forms.factories Consists of optional Forms framework factory classes that assist you in building consistent forms quickly 
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of CellConstraints in com.jgoodies.forms.builder
 

Fields in com.jgoodies.forms.builder declared as CellConstraints
protected  CellConstraints AbstractBuilder.currentCellConstraints
          Holds an instance of CellConstraints that will be used to specify the location, extent and alignments of the component to be added next.
 

Methods in com.jgoodies.forms.builder that return CellConstraints
protected  CellConstraints AbstractFormBuilder.cellConstraints()
          Returns the CellConstraints object that is used as a cursor and holds the current column span and row span.
protected  CellConstraints AbstractFormBuilder.createLeftAdjustedConstraints(int columnSpan)
          Creates and returns a CellConstraints object at the current cursor position that uses the given column span and is adjusted to the left.
 

Methods in com.jgoodies.forms.builder with parameters of type CellConstraints
 Component PanelBuilder.add(Component component, CellConstraints cellConstraints)
          Adds a component to the panel using the given cell constraints.
 Component AbstractFormBuilder.add(Component component, CellConstraints cellConstraints)
          Adds a component to the panel using the given cell constraints.
 JLabel PanelBuilder.add(JLabel label, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds a label and component to the panel using the given cell constraints.
 JLabel I15dPanelBuilder.addI15dLabel(String resourceKey, CellConstraints constraints)
          Adds an internationalized (i15d) textual label to the form using the specified constraints.
 JLabel I15dPanelBuilder.addI15dLabel(String resourceKey, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds an internationalized (i15d) label and component to the panel using the given cell constraints.
 JLabel I15dPanelBuilder.addI15dROLabel(String resourceKey, CellConstraints constraints)
          Adds an internationalized (i15d) textual label to the form using the specified constraints that is intended to label a read-only component.
 JLabel I15dPanelBuilder.addI15dROLabel(String resourceKey, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds an internationalized (i15d) label and component to the panel using the given cell constraints.
 JComponent I15dPanelBuilder.addI15dSeparator(String resourceKey, CellConstraints constraints)
          Adds an internationalized (i15d) titled separator to the form using the specified constraints.
 JLabel I15dPanelBuilder.addI15dTitle(String resourceKey, CellConstraints constraints)
          Adds a title to the form using the specified constraints.
 JLabel PanelBuilder.addLabel(String textWithMnemonic, CellConstraints constraints)
          Adds a textual label to the form using the specified constraints.
 JLabel PanelBuilder.addLabel(String textWithMnemonic, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds a label and component to the panel using the given cell constraints.
 JLabel PanelBuilder.addROLabel(String textWithMnemonic, CellConstraints constraints)
          Adds a textual label intended for labeling read-only components to the form using the specified constraints.
 JLabel PanelBuilder.addROLabel(String textWithMnemonic, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints)
          Adds a label and component to the panel using the given cell constraints.
 JComponent PanelBuilder.addSeparator(String textWithMnemonic, CellConstraints constraints)
          Adds a titled separator to the form using the specified constraints.
 JLabel PanelBuilder.addTitle(String textWithMnemonic, CellConstraints constraints)
          Adds a title label to the form using the specified constraints.
 

Uses of CellConstraints in com.jgoodies.forms.extras
 

Methods in com.jgoodies.forms.extras that return CellConstraints
 CellConstraints FormLayoutUtils.ConstraintIterator.nextConstraints()
          Returns the next element in the iteration.
 

Uses of CellConstraints in com.jgoodies.forms.factories
 

Methods in com.jgoodies.forms.factories that return CellConstraints
static CellConstraints CC.rc(int row, int col)
          Sets row and column origins; sets height and width to 1; uses the default alignments.
static CellConstraints CC.rc(int row, int col, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
static CellConstraints CC.rc(int row, int col, String encodedAlignments)
          Sets row and column origins; sets height and width to 1; decodes vertical and horizontal alignments from the given string.
static CellConstraints CC.rchw(int row, int col, int rowSpan, int colSpan)
          Sets the row, column, height, and width; uses default alignments.
static CellConstraints CC.rchw(int row, int col, int rowSpan, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
static CellConstraints CC.rchw(int row, int col, int rowSpan, int colSpan, String encodedAlignments)
          Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
static CellConstraints CC.rcw(int row, int col, int colSpan)
          Sets the row, column, height, and width; uses a height (row span) of 1 and the vertical and horizontal default alignments.
static CellConstraints CC.rcw(int row, int col, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
static CellConstraints CC.rcw(int row, int col, int colSpan, String encodedAlignments)
          Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
static CellConstraints CC.xy(int col, int row)
          Sets column and row origins; sets width and height to 1; uses the default alignments.
static CellConstraints CC.xy(int col, int row, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
static CellConstraints CC.xy(int col, int row, String encodedAlignments)
          Sets column and row origins; sets width and height to 1; decodes horizontal and vertical alignments from the given string.
static CellConstraints CC.xyw(int col, int row, int colSpan)
          Sets the column, row, width, and height; uses a height (row span) of 1 and the horizontal and vertical default alignments.
static CellConstraints CC.xyw(int col, int row, int colSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
static CellConstraints CC.xyw(int col, int row, int colSpan, String encodedAlignments)
          Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
static CellConstraints CC.xywh(int col, int row, int colSpan, int rowSpan)
          Sets the column, row, width, and height; uses default alignments.
static CellConstraints CC.xywh(int col, int row, int colSpan, int rowSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
static CellConstraints CC.xywh(int col, int row, int colSpan, int rowSpan, String encodedAlignments)
          Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
 

Uses of CellConstraints in com.jgoodies.forms.layout
 

Methods in com.jgoodies.forms.layout that return CellConstraints
 CellConstraints FormLayout.getConstraints(Component component)
          Looks up and returns the constraints for the specified component.
 CellConstraints CellConstraints.rc(int row, int col)
          Sets row and column origins; sets height and width to 1; uses the default alignments.
 CellConstraints CellConstraints.rc(int row, int col, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
 CellConstraints CellConstraints.rc(int row, int col, String encodedAlignments)
          Sets row and column origins; sets height and width to 1; decodes vertical and horizontal alignments from the given string.
 CellConstraints CellConstraints.rchw(int row, int col, int rowSpan, int colSpan)
          Sets the row, column, height, and width; uses default alignments.
 CellConstraints CellConstraints.rchw(int row, int col, int rowSpan, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
 CellConstraints CellConstraints.rchw(int row, int col, int rowSpan, int colSpan, String encodedAlignments)
          Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
 CellConstraints CellConstraints.rcw(int row, int col, int colSpan)
          Sets the row, column, height, and width; uses a height (row span) of 1 and the vertical and horizontal default alignments.
 CellConstraints CellConstraints.rcw(int row, int col, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
 CellConstraints CellConstraints.rcw(int row, int col, int colSpan, String encodedAlignments)
          Sets the row, column, height, and width; decodes the vertical and horizontal alignments from the given string.
 CellConstraints CellConstraints.xy(int col, int row)
          Sets column and row origins; sets width and height to 1; uses the default alignments.
 CellConstraints CellConstraints.xy(int col, int row, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
 CellConstraints CellConstraints.xy(int col, int row, String encodedAlignments)
          Sets column and row origins; sets width and height to 1; decodes horizontal and vertical alignments from the given string.
 CellConstraints CellConstraints.xyw(int col, int row, int colSpan)
          Sets the column, row, width, and height; uses a height (row span) of 1 and the horizontal and vertical default alignments.
 CellConstraints CellConstraints.xyw(int col, int row, int colSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
 CellConstraints CellConstraints.xyw(int col, int row, int colSpan, String encodedAlignments)
          Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
 CellConstraints CellConstraints.xywh(int col, int row, int colSpan, int rowSpan)
          Sets the column, row, width, and height; uses default alignments.
 CellConstraints CellConstraints.xywh(int col, int row, int colSpan, int rowSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
 CellConstraints CellConstraints.xywh(int col, int row, int colSpan, int rowSpan, String encodedAlignments)
          Sets the column, row, width, and height; decodes the horizontal and vertical alignments from the given string.
 

Methods in com.jgoodies.forms.layout with parameters of type CellConstraints
 void FormLayout.setConstraints(Component component, CellConstraints constraints)
          Sets the constraints for the specified component in this layout.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormLayout.Measure.html0000644000175000017500000003266612003555424030241 0ustar tonytony Uses of Interface com.jgoodies.forms.layout.FormLayout.Measure (JGoodies Forms 1.6 API)

Uses of Interface
com.jgoodies.forms.layout.FormLayout.Measure

Packages that use FormLayout.Measure
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of FormLayout.Measure in com.jgoodies.forms.layout
 

Methods in com.jgoodies.forms.layout with parameters of type FormLayout.Measure
 int Size.maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure)
          Computes and returns this Size's maximum pixel size applied to the given list of components using the specified measures.
 int PrototypeSize.maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure)
          Computes and returns the width of this Size's prototype in pixel.
 int ConstantSize.maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure)
          Returns this size as pixel size.
 int BoundedSize.maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure)
          Returns this size as pixel size.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormSpecParser.html0000644000175000017500000001406212003555424027421 0ustar tonytony Uses of Class com.jgoodies.forms.layout.FormSpecParser (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.FormSpecParser

No usage of com.jgoodies.forms.layout.FormSpecParser



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/LayoutMap.html0000644000175000017500000003607112003555424026445 0ustar tonytony Uses of Class com.jgoodies.forms.layout.LayoutMap (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.LayoutMap

Packages that use LayoutMap
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of LayoutMap in com.jgoodies.forms.layout
 

Methods in com.jgoodies.forms.layout that return LayoutMap
static LayoutMap LayoutMap.getRoot()
          Lazily initializes and returns the LayoutMap that is used for variable expansion, if no custom LayoutMap is provided.
 

Methods in com.jgoodies.forms.layout with parameters of type LayoutMap
static RowSpec RowSpec.decode(String encodedRowSpec, LayoutMap layoutMap)
          Parses the encoded row specifications and returns a RowSpec object that represents the string.
static ColumnSpec ColumnSpec.decode(String encodedColumnSpec, LayoutMap layoutMap)
          Parses the encoded column specifications and returns a ColumnSpec object that represents the string.
static RowSpec[] RowSpec.decodeSpecs(String encodedRowSpecs, LayoutMap layoutMap)
          Parses and splits encoded row specifications using the given LayoutMap and returns an array of RowSpec objects.
static ColumnSpec[] ColumnSpec.decodeSpecs(String encodedColumnSpecs, LayoutMap layoutMap)
          Splits and parses the encoded column specifications using the given LayoutMap and returns an array of ColumnSpec objects.
 

Constructors in com.jgoodies.forms.layout with parameters of type LayoutMap
FormLayout(String encodedColumnSpecs, LayoutMap layoutMap)
          Constructs a FormLayout using the given encoded column specifications and LayoutMap.
FormLayout(String encodedColumnSpecs, String encodedRowSpecs, LayoutMap layoutMap)
          Constructs a FormLayout using the given encoded column and row specifications and the given LayoutMap.
LayoutMap(LayoutMap parent)
          Constructs a LayoutMap with the given optional parent.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormLayout.html0000644000175000017500000007212112003555424026627 0ustar tonytony Uses of Class com.jgoodies.forms.layout.FormLayout (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.FormLayout

Packages that use FormLayout
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.debug Consists of optional classes that help you find, understand and fix layout problems 
com.jgoodies.forms.extras Contains optional Forms framework classes that ship only with the JGoodies Forms source distribution and are not yet part of the binary Forms library. 
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of FormLayout in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder that return FormLayout
 FormLayout AbstractBuilder.getLayout()
          Returns the FormLayout instance used to build this form.
 

Constructors in com.jgoodies.forms.builder with parameters of type FormLayout
AbstractBuilder(FormLayout layout, Container container)
          Constructs an AbstractBuilder for the given FormLayout and layout container.
AbstractButtonPanelBuilder(FormLayout layout, JPanel container)
          Constructs an AbstractButtonPanelBuilder for the given FormLayout and layout container.
AbstractFormBuilder(FormLayout layout, Container container)
          Constructs an AbstractFormBuilder for the given FormLayout and layout container.
DefaultFormBuilder(FormLayout layout)
          Constructs a DefaultFormBuilder for the given layout.
DefaultFormBuilder(FormLayout layout, JPanel container)
          Constructs a DefaultFormBuilder for the given layout and panel.
DefaultFormBuilder(FormLayout layout, ResourceBundle bundle)
          Constructs a DefaultFormBuilder for the given layout and resource bundle.
DefaultFormBuilder(FormLayout layout, ResourceBundle bundle, JPanel container)
          Constructs a DefaultFormBuilder for the given layout, resource bundle, and panel.
DefaultFormBuilder(FormLayout layout, com.jgoodies.common.internal.StringLocalizer localizer)
          Constructs a DefaultFormBuilder for the given layout and resource bundle.
DefaultFormBuilder(FormLayout layout, com.jgoodies.common.internal.StringLocalizer localizer, JPanel container)
          Constructs a DefaultFormBuilder for the given layout, resource bundle, and panel.
I15dPanelBuilder(FormLayout layout, ResourceBundle bundle)
          Constructs an I15dPanelBuilder for the given layout and resource bundle.
I15dPanelBuilder(FormLayout layout, ResourceBundle bundle, JPanel container)
          Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
I15dPanelBuilder(FormLayout layout, com.jgoodies.common.internal.StringLocalizer localizer)
          Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
I15dPanelBuilder(FormLayout layout, com.jgoodies.common.internal.StringLocalizer localizer, JPanel container)
          Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, and layout container.
PanelBuilder(FormLayout layout)
          Constructs a PanelBuilder for the given layout.
PanelBuilder(FormLayout layout, JPanel panel)
          Constructs a PanelBuilder for the given FormLayout and layout container.
 

Uses of FormLayout in com.jgoodies.forms.debug
 

Methods in com.jgoodies.forms.debug with parameters of type FormLayout
static void FormDebugUtils.dumpColumnGroups(FormLayout layout)
          Dumps the layout's column groups to the console.
static void FormDebugUtils.dumpColumnSpecs(FormLayout layout)
          Dumps the layout's column specifications to the console.
static void FormDebugUtils.dumpRowGroups(FormLayout layout)
          Dumps the layout's row groups to the console.
static void FormDebugUtils.dumpRowSpecs(FormLayout layout)
          Dumps the layout's row specifications to the console.
 

Constructors in com.jgoodies.forms.debug with parameters of type FormLayout
FormDebugPanel(FormLayout layout)
          Constructs a FormDebugPanel on the given FormLayout instance that paints the grid in the foreground and paints no diagonals.
FormDebugPanel(FormLayout layout, boolean paintInBackground, boolean paintDiagonals)
          Constructs a FormDebugPanel on the given FormLayout using the specified settings that are otherwise turned off.
 

Uses of FormLayout in com.jgoodies.forms.extras
 

Methods in com.jgoodies.forms.extras with parameters of type FormLayout
static boolean FormLayoutUtils.isGroupedColumn(FormLayout layout, int columnIndex)
          Checks and answers whether the specified column is grouped in the given FormLayout.
static boolean FormLayoutUtils.isGroupedRow(FormLayout layout, int rowIndex)
          Checks and answers whether the specified row is grouped in the given FormLayout.
 

Uses of FormLayout in com.jgoodies.forms.layout
 

Methods in com.jgoodies.forms.layout with parameters of type FormLayout
 String CellConstraints.toShortString(FormLayout layout)
          Returns a short string representation of this constraints object.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/ConstantSize.Unit.html0000644000175000017500000004516712003555424030102 0ustar tonytony Uses of Class com.jgoodies.forms.layout.ConstantSize.Unit (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.ConstantSize.Unit

Packages that use ConstantSize.Unit
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of ConstantSize.Unit in com.jgoodies.forms.layout
 

Fields in com.jgoodies.forms.layout declared as ConstantSize.Unit
static ConstantSize.Unit ConstantSize.CENTIMETER
           
static ConstantSize.Unit ConstantSize.CM
           
static ConstantSize.Unit ConstantSize.DIALOG_UNITS_X
           
static ConstantSize.Unit ConstantSize.DIALOG_UNITS_Y
           
static ConstantSize.Unit ConstantSize.DLUX
           
static ConstantSize.Unit ConstantSize.DLUY
           
static ConstantSize.Unit ConstantSize.IN
           
static ConstantSize.Unit ConstantSize.INCH
           
static ConstantSize.Unit ConstantSize.MILLIMETER
           
static ConstantSize.Unit ConstantSize.MM
           
static ConstantSize.Unit ConstantSize.PIXEL
           
static ConstantSize.Unit ConstantSize.POINT
           
static ConstantSize.Unit ConstantSize.PT
           
static ConstantSize.Unit ConstantSize.PX
           
 

Methods in com.jgoodies.forms.layout that return ConstantSize.Unit
static ConstantSize.Unit Sizes.getDefaultUnit()
          Returns the Unit that is used if an encoded ConstantSize contains no unit string.
 ConstantSize.Unit ConstantSize.getUnit()
          Returns this size's unit.
 

Methods in com.jgoodies.forms.layout with parameters of type ConstantSize.Unit
static void Sizes.setDefaultUnit(ConstantSize.Unit unit)
          Sets the Unit that shall be used if an encoded ConstantSize provides no unit string.
 

Constructors in com.jgoodies.forms.layout with parameters of type ConstantSize.Unit
ConstantSize(double value, ConstantSize.Unit unit)
          Constructs a ConstantSize for the given size and unit.
ConstantSize(int value, ConstantSize.Unit unit)
          Constructs a ConstantSize for the given size and unit.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormSpec.DefaultAlignment.html0000644000175000017500000004311112003555424031463 0ustar tonytony Uses of Class com.jgoodies.forms.layout.FormSpec.DefaultAlignment (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.FormSpec.DefaultAlignment

Packages that use FormSpec.DefaultAlignment
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of FormSpec.DefaultAlignment in com.jgoodies.forms.layout
 

Fields in com.jgoodies.forms.layout declared as FormSpec.DefaultAlignment
static FormSpec.DefaultAlignment RowSpec.BOTTOM
          By default put the components in the bottom.
static FormSpec.DefaultAlignment RowSpec.CENTER
          By default put the components in the center.
static FormSpec.DefaultAlignment ColumnSpec.CENTER
          By default put the components in the center.
static FormSpec.DefaultAlignment RowSpec.DEFAULT
          Unless overridden the default alignment for a row is CENTER.
static FormSpec.DefaultAlignment ColumnSpec.DEFAULT
          Unless overridden the default alignment for a column is FILL.
static FormSpec.DefaultAlignment RowSpec.FILL
          By default fill the component into the row.
static FormSpec.DefaultAlignment ColumnSpec.FILL
          By default fill the component into the column.
static FormSpec.DefaultAlignment ColumnSpec.LEFT
          By default put components in the left.
static FormSpec.DefaultAlignment ColumnSpec.RIGHT
          By default put components in the right.
static FormSpec.DefaultAlignment RowSpec.TOP
          By default put the components in the top.
 

Methods in com.jgoodies.forms.layout that return FormSpec.DefaultAlignment
 FormSpec.DefaultAlignment FormSpec.getDefaultAlignment()
          Returns the default alignment.
 

Constructors in com.jgoodies.forms.layout with parameters of type FormSpec.DefaultAlignment
ColumnSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a ColumnSpec for the given default alignment, size and resize weight.
FormSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a FormSpec for the given default alignment, size, and resize weight.
FormSpec(FormSpec.DefaultAlignment defaultAlignment, String encodedDescription)
          Constructs a FormSpec from the specified encoded description.
RowSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a RowSpec from the given default orientation, size, and resize weight.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/Sizes.html0000644000175000017500000001373012003555424025624 0ustar tonytony Uses of Class com.jgoodies.forms.layout.Sizes (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.Sizes

No usage of com.jgoodies.forms.layout.Sizes



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/RowSpec.html0000644000175000017500000007200412003555424026110 0ustar tonytony Uses of Class com.jgoodies.forms.layout.RowSpec (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.RowSpec

Packages that use RowSpec
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of RowSpec in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder that return RowSpec
 RowSpec DefaultFormBuilder.getDefaultRowSpec()
          Deprecated. Obsolete; will be deleted from the next version
 RowSpec DefaultFormBuilder.getLineGapSpec()
          Deprecated. Obsolete; will be deleted from the next version
 

Methods in com.jgoodies.forms.builder with parameters of type RowSpec
 void AbstractFormBuilder.appendRow(RowSpec rowSpec)
          Appends the given row specification to the builder's layout.
protected  void AbstractButtonPanelBuilder.appendRow(RowSpec rowSpec)
          Appends the given row specification to the builder's layout.
 DefaultFormBuilder DefaultFormBuilder.defaultRowSpec(RowSpec defaultRowSpec)
          Sets the row specification that shall be used for component rows.
 void DefaultFormBuilder.setDefaultRowSpec(RowSpec defaultRowSpec)
          Deprecated. Replaced by DefaultFormBuilder.defaultRowSpec(RowSpec)
 

Uses of RowSpec in com.jgoodies.forms.layout
 

Fields in com.jgoodies.forms.layout declared as RowSpec
static RowSpec FormSpecs.BUTTON_ROWSPEC
          Describes a logical row for a fixed size button.
static RowSpec FormSpecs.DEFAULT_ROWSPEC
          An unmodifiable RowSpec that determines its preferred height by computing the maximum of all column component preferred heights and its minimum height by computing all column component minimum heights.
static RowSpec FormSpecs.GLUE_ROWSPEC
          An unmodifiable RowSpec that has an initial height of 0 pixels and that grows.
static RowSpec FormSpecs.LABEL_COMPONENT_GAP_ROWSPEC
          Describes a logical horizontal gap between a label and an associated component.
static RowSpec FormSpecs.LINE_GAP_ROWSPEC
          Describes the logical vertical default gap between two rows in the grid.
static RowSpec FormSpecs.MIN_ROWSPEC
          An unmodifiable RowSpec that determines its height by computing the maximum of all column component minimum heights.
static RowSpec FormSpecs.NARROW_LINE_GAP_ROWSPEC
          Describes a logical vertical narrow gap between two rows in the grid.
static RowSpec FormSpecs.PARAGRAPH_GAP_ROWSPEC
          Describes the logical vertical default gap between two paragraphs in the layout grid.
static RowSpec FormSpecs.PREF_ROWSPEC
          An unmodifiable RowSpec that determines its height by computing the maximum of all column component preferred heights.
static RowSpec FormSpecs.RELATED_GAP_ROWSPEC
          Describes a logical vertical gap between two related components.
static RowSpec FormSpecs.UNRELATED_GAP_ROWSPEC
          Describes a logical vertical gap between two unrelated components.
 

Methods in com.jgoodies.forms.layout that return RowSpec
static RowSpec RowSpec.createGap(ConstantSize gapHeight)
          Creates and returns a RowSpec that represents a gap with the specified ConstantSize.
static RowSpec RowSpec.decode(String encodedRowSpec)
          Parses the encoded row specification and returns a RowSpec object that represents the string.
static RowSpec RowSpec.decode(String encodedRowSpec, LayoutMap layoutMap)
          Parses the encoded row specifications and returns a RowSpec object that represents the string.
static RowSpec[] RowSpec.decodeSpecs(String encodedRowSpecs)
          Parses and splits encoded row specifications using the default LayoutMap and returns an array of RowSpec objects.
static RowSpec[] RowSpec.decodeSpecs(String encodedRowSpecs, LayoutMap layoutMap)
          Parses and splits encoded row specifications using the given LayoutMap and returns an array of RowSpec objects.
 RowSpec FormLayout.getRowSpec(int rowIndex)
          Returns the RowSpec at the specified row index.
 

Methods in com.jgoodies.forms.layout with parameters of type RowSpec
 void FormLayout.appendRow(RowSpec rowSpec)
          Appends the given row specification to the bottom of all rows.
 void FormLayout.insertRow(int rowIndex, RowSpec rowSpec)
          Inserts the specified column at the specified position.
 String LayoutMap.rowPut(String key, RowSpec value)
          Associates the specified ColumnSpec with the specified key in this map.
 void FormLayout.setRowSpec(int rowIndex, RowSpec rowSpec)
          Sets the RowSpec at the specified row index.
 

Constructors in com.jgoodies.forms.layout with parameters of type RowSpec
FormLayout(ColumnSpec[] colSpecs, RowSpec[] rowSpecs)
          Constructs a FormLayout using the given column and row specifications.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/CellConstraints.Alignment.html0000644000175000017500000011441012003555424031550 0ustar tonytony Uses of Class com.jgoodies.forms.layout.CellConstraints.Alignment (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.CellConstraints.Alignment

Packages that use CellConstraints.Alignment
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.factories Consists of optional Forms framework factory classes that assist you in building consistent forms quickly 
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of CellConstraints.Alignment in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder with parameters of type CellConstraints.Alignment
 void AbstractFormBuilder.setAlignment(CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign)
          Sets the horizontal and vertical alignment.
 void AbstractFormBuilder.setHAlignment(CellConstraints.Alignment alignment)
          Sets the horizontal alignment.
 void AbstractFormBuilder.setVAlignment(CellConstraints.Alignment alignment)
          Sets the vertical alignment.
 

Uses of CellConstraints.Alignment in com.jgoodies.forms.factories
 

Fields in com.jgoodies.forms.factories declared as CellConstraints.Alignment
static CellConstraints.Alignment CC.BOTTOM
           
static CellConstraints.Alignment CC.CENTER
           
static CellConstraints.Alignment CC.DEFAULT
           
static CellConstraints.Alignment CC.FILL
           
static CellConstraints.Alignment CC.LEFT
           
static CellConstraints.Alignment CC.RIGHT
           
static CellConstraints.Alignment CC.TOP
           
 

Methods in com.jgoodies.forms.factories with parameters of type CellConstraints.Alignment
static CellConstraints CC.rc(int row, int col, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
static CellConstraints CC.rchw(int row, int col, int rowSpan, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
static CellConstraints CC.rcw(int row, int col, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
static CellConstraints CC.xy(int col, int row, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
static CellConstraints CC.xyw(int col, int row, int colSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
static CellConstraints CC.xywh(int col, int row, int colSpan, int rowSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
 

Uses of CellConstraints.Alignment in com.jgoodies.forms.layout
 

Fields in com.jgoodies.forms.layout declared as CellConstraints.Alignment
static CellConstraints.Alignment CellConstraints.BOTTOM
          Put the component in the bottom.
static CellConstraints.Alignment CellConstraints.CENTER
          Put the component in the center.
static CellConstraints.Alignment CellConstraints.DEFAULT
          Use the column's or row's default alignment.
static CellConstraints.Alignment CellConstraints.FILL
          Fill the cell either horizontally or vertically.
 CellConstraints.Alignment CellConstraints.hAlign
          Describes the component's horizontal alignment.
static CellConstraints.Alignment CellConstraints.LEFT
          Put the component in the left.
static CellConstraints.Alignment CellConstraints.RIGHT
          Put the component in the right.
static CellConstraints.Alignment CellConstraints.TOP
          Put the component in the top.
 CellConstraints.Alignment CellConstraints.vAlign
          Describes the component's vertical alignment.
 

Methods in com.jgoodies.forms.layout with parameters of type CellConstraints.Alignment
 CellConstraints CellConstraints.rc(int row, int col, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row and column origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
 CellConstraints CellConstraints.rchw(int row, int col, int rowSpan, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
 CellConstraints CellConstraints.rcw(int row, int col, int colSpan, CellConstraints.Alignment rowAlign, CellConstraints.Alignment colAlign)
          Sets the row, column, height, and width; sets the vertical and horizontal alignment using the specified alignment objects.
 CellConstraints CellConstraints.xy(int col, int row, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column and row origins; sets width and height to 1; set horizontal and vertical alignment using the specified objects.
 CellConstraints CellConstraints.xyw(int col, int row, int colSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
 CellConstraints CellConstraints.xywh(int col, int row, int colSpan, int rowSpan, CellConstraints.Alignment colAlign, CellConstraints.Alignment rowAlign)
          Sets the column, row, width, and height; sets the horizontal and vertical alignment using the specified alignment objects.
 

Constructors in com.jgoodies.forms.layout with parameters of type CellConstraints.Alignment
CellConstraints(int gridX, int gridY, CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign)
          Constructs an instance of CellConstraints for the given cell position, anchor, and fill.
CellConstraints(int gridX, int gridY, int gridWidth, int gridHeight, CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign)
          Constructs an instance of CellConstraints for the given cell position and size, anchor, and fill.
CellConstraints(int gridX, int gridY, int gridWidth, int gridHeight, CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign, Insets insets)
          Constructs an instance of CellConstraints for the complete set of available properties.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/ConstantSize.html0000644000175000017500000015027212003555424027156 0ustar tonytony Uses of Class com.jgoodies.forms.layout.ConstantSize (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.ConstantSize

Packages that use ConstantSize
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.factories Consists of optional Forms framework factory classes that assist you in building consistent forms quickly 
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles 
 

Uses of ConstantSize in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder with parameters of type ConstantSize
 ButtonStackBuilder ButtonStackBuilder.addStrut(ConstantSize size)
          Adds a strut of a specified size.
 ButtonBarBuilder2 ButtonBarBuilder2.addStrut(ConstantSize width)
          Deprecated. Adds a horizontal strut of the specified width.
 ButtonBarBuilder ButtonBarBuilder.addStrut(ConstantSize width)
          Adds a horizontal strut of the specified width.
 DefaultFormBuilder DefaultFormBuilder.lineGapSize(ConstantSize lineGapSize)
          Sets the size of gaps between component lines using the given constant size.
 DefaultFormBuilder DefaultFormBuilder.paragraphGapSize(ConstantSize paragraphGapSize)
          Sets the size of gaps between paragraphs using the given constant size.
 void DefaultFormBuilder.setLineGapSize(ConstantSize lineGapSize)
          Deprecated. Replaced by DefaultFormBuilder.lineGapSize(ConstantSize)
 void DefaultFormBuilder.setParagraphGapSize(ConstantSize paragraphGapSize)
          Deprecated. Replaced by DefaultFormBuilder.lineGapSize(ConstantSize)
 

Uses of ConstantSize in com.jgoodies.forms.factories
 

Methods in com.jgoodies.forms.factories that return ConstantSize
 ConstantSize Borders.EmptyBorder.bottom()
          Returns this border's bottom size.
 ConstantSize Borders.EmptyBorder.left()
          Returns this border's left size.
 ConstantSize Borders.EmptyBorder.right()
          Returns this border's right size.
 ConstantSize Borders.EmptyBorder.top()
          Returns this border's top size.
 

Methods in com.jgoodies.forms.factories with parameters of type ConstantSize
static Border Borders.createEmptyBorder(ConstantSize top, ConstantSize left, ConstantSize bottom, ConstantSize right)
          Creates and returns an EmptyBorder with the specified gaps.
 

Uses of ConstantSize in com.jgoodies.forms.layout
 

Fields in com.jgoodies.forms.layout declared as ConstantSize
static ConstantSize Sizes.DLUX1
           
static ConstantSize Sizes.DLUX11
           
static ConstantSize Sizes.DLUX14
           
static ConstantSize Sizes.DLUX2
           
static ConstantSize Sizes.DLUX21
          21 horizontal dialog units.
static ConstantSize Sizes.DLUX3
           
static ConstantSize Sizes.DLUX4
           
static ConstantSize Sizes.DLUX5
           
static ConstantSize Sizes.DLUX6
           
static ConstantSize Sizes.DLUX7
           
static ConstantSize Sizes.DLUX8
           
static ConstantSize Sizes.DLUX9
           
static ConstantSize Sizes.DLUY1
           
static ConstantSize Sizes.DLUY11
           
static ConstantSize Sizes.DLUY14
           
static ConstantSize Sizes.DLUY2
           
static ConstantSize Sizes.DLUY21
          21 vertical dialog units.
static ConstantSize Sizes.DLUY3
           
static ConstantSize Sizes.DLUY4
           
static ConstantSize Sizes.DLUY5
           
static ConstantSize Sizes.DLUY6
           
static ConstantSize Sizes.DLUY7
           
static ConstantSize Sizes.DLUY8
           
static ConstantSize Sizes.DLUY9
           
static ConstantSize Sizes.ZERO
           
 

Methods in com.jgoodies.forms.layout that return ConstantSize
static ConstantSize Sizes.constant(String encodedValueAndUnit, boolean horizontal)
          Creates and returns an instance of ConstantSize from the given encoded size and unit description.
static ConstantSize Sizes.dluX(int value)
          Creates and returns a ConstantSize for the specified value in horizontal dialog units.
static ConstantSize Sizes.dluY(int value)
          Creates and returns a ConstantSize for the specified value in vertical dialog units.
static ConstantSize Sizes.pixel(int value)
          Creates and returns a ConstantSize for the specified pixel value.
 

Methods in com.jgoodies.forms.layout with parameters of type ConstantSize
static RowSpec RowSpec.createGap(ConstantSize gapHeight)
          Creates and returns a RowSpec that represents a gap with the specified ConstantSize.
static ColumnSpec ColumnSpec.createGap(ConstantSize gapWidth)
          Creates and returns a ColumnSpec that represents a gap with the specified ConstantSize.
 

Uses of ConstantSize in com.jgoodies.forms.util
 

Methods in com.jgoodies.forms.util that return ConstantSize
 ConstantSize MacLayoutStyle.getButtonBarPad()
           
abstract  ConstantSize LayoutStyle.getButtonBarPad()
          Returns a pad used to separate a button bar from a component.
 ConstantSize MacLayoutStyle.getDialogMarginX()
           
abstract  ConstantSize LayoutStyle.getDialogMarginX()
          Returns this style's horizontal margin for general dialogs.
 ConstantSize MacLayoutStyle.getDialogMarginY()
           
abstract  ConstantSize LayoutStyle.getDialogMarginY()
          Returns this style's vertical margin for general dialogs.
 ConstantSize MacLayoutStyle.getLabelComponentPadX()
           
abstract  ConstantSize LayoutStyle.getLabelComponentPadX()
          Returns a gap used to separate a label and associated control.
 ConstantSize MacLayoutStyle.getLabelComponentPadY()
           
abstract  ConstantSize LayoutStyle.getLabelComponentPadY()
          Returns a gap used to separate a label and associated control.
 ConstantSize MacLayoutStyle.getLinePad()
           
abstract  ConstantSize LayoutStyle.getLinePad()
          Returns a narrow vertical pad used to separate lines.
 ConstantSize MacLayoutStyle.getNarrowLinePad()
           
abstract  ConstantSize LayoutStyle.getNarrowLinePad()
          Returns a narrow vertical pad used to separate lines.
 ConstantSize MacLayoutStyle.getParagraphPad()
           
abstract  ConstantSize LayoutStyle.getParagraphPad()
          Returns a pad used to separate paragraphs.
 ConstantSize MacLayoutStyle.getRelatedComponentsPadX()
           
abstract  ConstantSize LayoutStyle.getRelatedComponentsPadX()
          Returns a horizontal gap used to separate related controls.
 ConstantSize MacLayoutStyle.getRelatedComponentsPadY()
           
abstract  ConstantSize LayoutStyle.getRelatedComponentsPadY()
          Returns a vertical gap used to separate related controls.
 ConstantSize MacLayoutStyle.getTabbedDialogMarginX()
           
abstract  ConstantSize LayoutStyle.getTabbedDialogMarginX()
          Returns this style's horizontal margin for dialogs that consist of a tabbed pane.
 ConstantSize MacLayoutStyle.getTabbedDialogMarginY()
           
abstract  ConstantSize LayoutStyle.getTabbedDialogMarginY()
          Returns this style's vertical margin for dialogs that consist of a tabbed pane.
 ConstantSize MacLayoutStyle.getUnrelatedComponentsPadX()
           
abstract  ConstantSize LayoutStyle.getUnrelatedComponentsPadX()
          Returns a horizontal gap used to separate unrelated controls.
 ConstantSize MacLayoutStyle.getUnrelatedComponentsPadY()
           
abstract  ConstantSize LayoutStyle.getUnrelatedComponentsPadY()
          Returns a vertical gap used to separate unrelated controls.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/ColumnSpec.html0000644000175000017500000006315312003555424026603 0ustar tonytony Uses of Class com.jgoodies.forms.layout.ColumnSpec (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.ColumnSpec

Packages that use ColumnSpec
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework. 
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of ColumnSpec in com.jgoodies.forms.builder
 

Methods in com.jgoodies.forms.builder with parameters of type ColumnSpec
 void AbstractFormBuilder.appendColumn(ColumnSpec columnSpec)
          Appends the given column specification to the builder's layout.
protected  void AbstractButtonPanelBuilder.appendColumn(ColumnSpec columnSpec)
          Appends the given column specification to the builder's layout.
 

Uses of ColumnSpec in com.jgoodies.forms.layout
 

Fields in com.jgoodies.forms.layout declared as ColumnSpec
static ColumnSpec FormSpecs.BUTTON_COLSPEC
          Describes a logical horizontal column for a fixed size button.
static ColumnSpec FormSpecs.DEFAULT_COLSPEC
          An unmodifiable ColumnSpec that determines its preferred width by computing the maximum of all column component preferred widths and its minimum width by computing all column component minimum widths.
static ColumnSpec FormSpecs.GLUE_COLSPEC
          An unmodifiable ColumnSpec that has an initial width of 0 pixels and that grows.
static ColumnSpec FormSpecs.GROWING_BUTTON_COLSPEC
          Describes a logical horizontal column for a growing button.
static ColumnSpec FormSpecs.LABEL_COMPONENT_GAP_COLSPEC
          Describes a logical horizontal gap between a label and an associated component.
static ColumnSpec FormSpecs.MIN_COLSPEC
          An unmodifiable ColumnSpec that determines its width by computing the maximum of all column component minimum widths.
static ColumnSpec FormSpecs.PREF_COLSPEC
          An unmodifiable ColumnSpec that determines its width by computing the maximum of all column component preferred widths.
static ColumnSpec FormSpecs.RELATED_GAP_COLSPEC
          Describes a logical horizontal gap between two related components.
static ColumnSpec FormSpecs.UNRELATED_GAP_COLSPEC
          Describes a logical horizontal gap between two unrelated components.
 

Methods in com.jgoodies.forms.layout that return ColumnSpec
static ColumnSpec ColumnSpec.createGap(ConstantSize gapWidth)
          Creates and returns a ColumnSpec that represents a gap with the specified ConstantSize.
static ColumnSpec ColumnSpec.decode(String encodedColumnSpec)
          Parses the encoded column specification and returns a ColumnSpec object that represents the string.
static ColumnSpec ColumnSpec.decode(String encodedColumnSpec, LayoutMap layoutMap)
          Parses the encoded column specifications and returns a ColumnSpec object that represents the string.
static ColumnSpec[] ColumnSpec.decodeSpecs(String encodedColumnSpecs)
          Parses and splits encoded column specifications using the default LayoutMap and returns an array of ColumnSpec objects.
static ColumnSpec[] ColumnSpec.decodeSpecs(String encodedColumnSpecs, LayoutMap layoutMap)
          Splits and parses the encoded column specifications using the given LayoutMap and returns an array of ColumnSpec objects.
 ColumnSpec FormLayout.getColumnSpec(int columnIndex)
          Returns the ColumnSpec at the specified column index.
 

Methods in com.jgoodies.forms.layout with parameters of type ColumnSpec
 void FormLayout.appendColumn(ColumnSpec columnSpec)
          Appends the given column specification to the right hand side of all columns.
 String LayoutMap.columnPut(String key, ColumnSpec value)
           
 void FormLayout.insertColumn(int columnIndex, ColumnSpec columnSpec)
          Inserts the specified column at the specified position.
 void FormLayout.setColumnSpec(int columnIndex, ColumnSpec columnSpec)
          Sets the ColumnSpec at the specified column index.
 

Constructors in com.jgoodies.forms.layout with parameters of type ColumnSpec
FormLayout(ColumnSpec[] colSpecs)
          Constructs a FormLayout using the given column specifications.
FormLayout(ColumnSpec[] colSpecs, RowSpec[] rowSpecs)
          Constructs a FormLayout using the given column and row specifications.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormSpecParser.FormLayoutParseException.htmljgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormSpecParser.FormLayoutParseExce0000644000175000017500000001445412003555424032363 0ustar tonytony Uses of Class com.jgoodies.forms.layout.FormSpecParser.FormLayoutParseException (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.FormSpecParser.FormLayoutParseException

No usage of com.jgoodies.forms.layout.FormSpecParser.FormLayoutParseException



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/PrototypeSize.html0000644000175000017500000001405012003555424027363 0ustar tonytony Uses of Class com.jgoodies.forms.layout.PrototypeSize (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.PrototypeSize

No usage of com.jgoodies.forms.layout.PrototypeSize



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormSpecs.html0000644000175000017500000001400012003555424026417 0ustar tonytony Uses of Class com.jgoodies.forms.layout.FormSpecs (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.FormSpecs

No usage of com.jgoodies.forms.layout.FormSpecs



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/FormLayout.LayoutInfo.html0000644000175000017500000002672112003555424030724 0ustar tonytony Uses of Class com.jgoodies.forms.layout.FormLayout.LayoutInfo (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.FormLayout.LayoutInfo

Packages that use FormLayout.LayoutInfo
com.jgoodies.forms.debug Consists of optional classes that help you find, understand and fix layout problems 
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
 

Uses of FormLayout.LayoutInfo in com.jgoodies.forms.debug
 

Methods in com.jgoodies.forms.debug that return FormLayout.LayoutInfo
static FormLayout.LayoutInfo FormDebugUtils.getLayoutInfo(Container container)
          Computes and returns the layout's grid origins.
 

Methods in com.jgoodies.forms.debug with parameters of type FormLayout.LayoutInfo
static void FormDebugUtils.dumpGridBounds(FormLayout.LayoutInfo layoutInfo)
          Dumps the grid layout info to the console.
 

Uses of FormLayout.LayoutInfo in com.jgoodies.forms.layout
 

Methods in com.jgoodies.forms.layout that return FormLayout.LayoutInfo
 FormLayout.LayoutInfo FormLayout.getLayoutInfo(Container parent)
          Computes and returns the horizontal and vertical grid origins.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/BoundedSize.html0000644000175000017500000001402412003555424026737 0ustar tonytony Uses of Class com.jgoodies.forms.layout.BoundedSize (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.layout.BoundedSize

No usage of com.jgoodies.forms.layout.BoundedSize



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/class-use/Size.html0000644000175000017500000005673612003555424025456 0ustar tonytony Uses of Interface com.jgoodies.forms.layout.Size (JGoodies Forms 1.6 API)

Uses of Interface
com.jgoodies.forms.layout.Size

Packages that use Size
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles 
 

Uses of Size in com.jgoodies.forms.layout
 

Classes in com.jgoodies.forms.layout that implement Size
 class BoundedSize
          Describes sizes that provide lower and upper bounds as used by the JGoodies FormLayout.
 class ConstantSize
          An implementation of the Size interface that represents constant sizes described by a value and unit, for example: 10 pixel, 15 point or 4 dialog units.
 class PrototypeSize
          A Size implementation that computes its width and height by a prototype String.
 

Methods in com.jgoodies.forms.layout that return Size
static Size Sizes.bounded(Size basis, Size lowerBound, Size upperBound)
          Creates and returns a BoundedSize for the given basis using the specified lower and upper bounds.
 Size BoundedSize.getBasis()
          Returns the base size, which is not-null.
 Size BoundedSize.getLowerBound()
          Returns the optional lower bound.
 Size FormSpec.getSize()
          Returns the size.
 Size BoundedSize.getUpperBound()
          Returns the optional upper bound.
 

Methods in com.jgoodies.forms.layout with parameters of type Size
static Size Sizes.bounded(Size basis, Size lowerBound, Size upperBound)
          Creates and returns a BoundedSize for the given basis using the specified lower and upper bounds.
 String LayoutMap.columnPut(String key, Size value)
           
 String LayoutMap.rowPut(String key, Size value)
           
 

Constructors in com.jgoodies.forms.layout with parameters of type Size
BoundedSize(Size basis, Size lowerBound, Size upperBound)
          Constructs a BoundedSize for the given basis using the specified lower and upper bounds.
ColumnSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a ColumnSpec for the given default alignment, size and resize weight.
ColumnSpec(Size size)
          Constructs a ColumnSpec for the given size using the default alignment, and no resizing.
FormSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a FormSpec for the given default alignment, size, and resize weight.
RowSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a RowSpec from the given default orientation, size, and resize weight.
RowSpec(Size size)
          Constructs a RowSpec for the given size using the default alignment, and no resizing.
 

Uses of Size in com.jgoodies.forms.util
 

Methods in com.jgoodies.forms.util that return Size
 Size MacLayoutStyle.getDefaultButtonHeight()
           
abstract  Size LayoutStyle.getDefaultButtonHeight()
          Returns this style's default button height.
 Size MacLayoutStyle.getDefaultButtonWidth()
           
abstract  Size LayoutStyle.getDefaultButtonWidth()
          Returns this style's default button width.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/package-summary.html0000644000175000017500000003406512003555424025722 0ustar tonytony com.jgoodies.forms.layout (JGoodies Forms 1.6 API)

Package com.jgoodies.forms.layout

Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints

See:
          Description

Interface Summary
FormLayout.Measure An interface that describes how to measure a Component.
Size An interface that describes sizes as used by the FormLayout: component measuring sizes, constant sizes with value and unit, and bounded sizes that provide lower and upper bounds for a size.
 

Class Summary
BoundedSize Describes sizes that provide lower and upper bounds as used by the JGoodies FormLayout.
CellConstraints Defines constraints for components that are laid out with the FormLayout.
CellConstraints.Alignment An ordinal-based serializable typesafe enumeration for component alignment types as used by the FormLayout.
ColumnSpec Specifies columns in FormLayout by their default orientation, start size and resizing behavior.
ConstantSize An implementation of the Size interface that represents constant sizes described by a value and unit, for example: 10 pixel, 15 point or 4 dialog units.
ConstantSize.Unit An ordinal-based serializable typesafe enumeration for units as used in instances of ConstantSize.
FormLayout FormLayout is a powerful, flexible and precise general purpose layout manager.
FormLayout.LayoutInfo Stores column and row origins.
FormSpec An abstract class that specifies columns and rows in FormLayout by their default alignment, start size and resizing behavior.
FormSpec.DefaultAlignment An ordinal-based serializable typesafe enumeration for the column and row default alignment types.
FormSpecParser Parses encoded column and row specifications.
FormSpecs Provides frequently used column and row specifications.
LayoutMap Provides a hierarchical variable expansion useful to improve layout consistency, style guide compliance, and layout readability.
PrototypeSize A Size implementation that computes its width and height by a prototype String.
RowSpec Specifies rows in FormLayout by their default orientation, start size and resizing behavior.
Sizes Consists only of static methods that create and convert sizes as required by the FormLayout.
 

Exception Summary
FormSpecParser.FormLayoutParseException Used by the parser for encoded column and row specifications.
 

Package com.jgoodies.forms.layout Description

Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints.

Related Documentation

For more information see:



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/CellConstraints.Alignment.html0000644000175000017500000003241412003555424027654 0ustar tonytony CellConstraints.Alignment (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class CellConstraints.Alignment

java.lang.Object
  extended by com.jgoodies.forms.layout.CellConstraints.Alignment
All Implemented Interfaces:
Serializable
Enclosing class:
CellConstraints

public static final class CellConstraints.Alignment
extends Object
implements Serializable

An ordinal-based serializable typesafe enumeration for component alignment types as used by the FormLayout.

See Also:
Serialized Form

Method Summary
 char abbreviation()
          Returns the first character of this Alignment's name.
 String toString()
          Returns this Alignment's name.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Method Detail

toString

public String toString()
Returns this Alignment's name.

Overrides:
toString in class Object
Returns:
this alignment's name.

abbreviation

public char abbreviation()
Returns the first character of this Alignment's name. Used to identify it in short format strings.

Returns:
the name's first character.


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/ConstantSize.html0000644000175000017500000012175312003555424025261 0ustar tonytony ConstantSize (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class ConstantSize

java.lang.Object
  extended by com.jgoodies.forms.layout.ConstantSize
All Implemented Interfaces:
Size, Serializable

public final class ConstantSize
extends Object
implements Size, Serializable

An implementation of the Size interface that represents constant sizes described by a value and unit, for example: 10 pixel, 15 point or 4 dialog units. You can get instances of ConstantSize using the factory methods and constants in the Sizes class. Logical constant sizes that vary with the current layout style are delivered by the LayoutStyle class.

This class supports different size units:
Unit   Abbreviation   Size
Millimetermm0.1 cm
Centimetercm10.0 mm
Inchin25.4 mm
DTP Pointpt1/72 in
Pixelpx1/(resolution in dpi) in
Dialog Unitdluhonors l&f, resolution, and dialog font size

Examples:

 Sizes.ZERO;
 Sizes.DLUX9;
 Sizes.dluX(42);
 Sizes.pixel(99);
 

Version:
$Revision: 1.21 $
Author:
Karsten Lentzsch
See Also:
Size, Sizes, Serialized Form

Nested Class Summary
static class ConstantSize.Unit
          An ordinal-based serializable typesafe enumeration for units as used in instances of ConstantSize.
 
Field Summary
static ConstantSize.Unit CENTIMETER
           
static ConstantSize.Unit CM
           
static ConstantSize.Unit DIALOG_UNITS_X
           
static ConstantSize.Unit DIALOG_UNITS_Y
           
static ConstantSize.Unit DLUX
           
static ConstantSize.Unit DLUY
           
static ConstantSize.Unit IN
           
static ConstantSize.Unit INCH
           
static ConstantSize.Unit MILLIMETER
           
static ConstantSize.Unit MM
           
static ConstantSize.Unit PIXEL
           
static ConstantSize.Unit POINT
           
static ConstantSize.Unit PT
           
static ConstantSize.Unit PX
           
 
Constructor Summary
ConstantSize(double value, ConstantSize.Unit unit)
          Constructs a ConstantSize for the given size and unit.
ConstantSize(int value, ConstantSize.Unit unit)
          Constructs a ConstantSize for the given size and unit.
 
Method Summary
 boolean compressible()
          Describes if this Size can be compressed, if container space gets scarce.
 String encode()
          Returns a parseable string representation of this constant size.
 boolean equals(Object o)
          Indicates whether some other ConstantSize is "equal to" this one.
 int getPixelSize(Component component)
          Converts the size if necessary and returns the value in pixels.
 ConstantSize.Unit getUnit()
          Returns this size's unit.
 double getValue()
          Returns this size's value.
 int hashCode()
          Returns a hash code value for the object.
 int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure)
          Returns this size as pixel size.
 String toString()
          Returns a string representation of this size object.
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

PIXEL

public static final ConstantSize.Unit PIXEL

POINT

public static final ConstantSize.Unit POINT

DIALOG_UNITS_X

public static final ConstantSize.Unit DIALOG_UNITS_X

DIALOG_UNITS_Y

public static final ConstantSize.Unit DIALOG_UNITS_Y

MILLIMETER

public static final ConstantSize.Unit MILLIMETER

CENTIMETER

public static final ConstantSize.Unit CENTIMETER

INCH

public static final ConstantSize.Unit INCH

PX

public static final ConstantSize.Unit PX

PT

public static final ConstantSize.Unit PT

DLUX

public static final ConstantSize.Unit DLUX

DLUY

public static final ConstantSize.Unit DLUY

MM

public static final ConstantSize.Unit MM

CM

public static final ConstantSize.Unit CM

IN

public static final ConstantSize.Unit IN
Constructor Detail

ConstantSize

public ConstantSize(int value,
                    ConstantSize.Unit unit)
Constructs a ConstantSize for the given size and unit.

Parameters:
value - the size value interpreted in the given units
unit - the size's unit
Since:
1.1

ConstantSize

public ConstantSize(double value,
                    ConstantSize.Unit unit)
Constructs a ConstantSize for the given size and unit.

Parameters:
value - the size value interpreted in the given units
unit - the size's unit
Since:
1.1
Method Detail

getValue

public double getValue()
Returns this size's value.

Returns:
the size value
Since:
1.1

getUnit

public ConstantSize.Unit getUnit()
Returns this size's unit.

Returns:
the size unit
Since:
1.1

getPixelSize

public int getPixelSize(Component component)
Converts the size if necessary and returns the value in pixels.

Parameters:
component - the associated component
Returns:
the size in pixels

maximumSize

public int maximumSize(Container container,
                       List components,
                       FormLayout.Measure minMeasure,
                       FormLayout.Measure prefMeasure,
                       FormLayout.Measure defaultMeasure)
Returns this size as pixel size. Neither requires the component list nor the specified measures.

Invoked by FormSpec to determine the size of a column or row.

Specified by:
maximumSize in interface Size
Parameters:
container - the layout container
components - the list of components used to compute the size
minMeasure - the measure that determines the minimum sizes
prefMeasure - the measure that determines the preferred sizes
defaultMeasure - the measure that determines the default sizes
Returns:
the computed maximum size in pixel

compressible

public boolean compressible()
Describes if this Size can be compressed, if container space gets scarce. Used by the FormLayout size computations in #compressedSizes to check whether a column or row can be compressed or not.

ConstantSizes are incompressible.

Specified by:
compressible in interface Size
Returns:
false
Since:
1.1

equals

public boolean equals(Object o)
Indicates whether some other ConstantSize is "equal to" this one.

Overrides:
equals in class Object
Parameters:
o - the Object with which to compare
Returns:
true if this object is the same as the obj argument; false otherwise.
See Also:
Object.hashCode(), Hashtable

hashCode

public int hashCode()
Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.

Overrides:
hashCode in class Object
Returns:
a hash code value for this object.
See Also:
Object.equals(java.lang.Object), Hashtable

toString

public String toString()
Returns a string representation of this size object. Note: This string representation may change at any time. It is intended for debugging purposes. For parsing, use encode() instead.

Overrides:
toString in class Object
Returns:
a string representation of the constant size

encode

public String encode()
Returns a parseable string representation of this constant size.

Specified by:
encode in interface Size
Returns:
a String that can be parsed by the Forms parser
Since:
1.2


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/ColumnSpec.html0000644000175000017500000011146312003555424024702 0ustar tonytony ColumnSpec (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class ColumnSpec

java.lang.Object
  extended by com.jgoodies.forms.layout.FormSpec
      extended by com.jgoodies.forms.layout.ColumnSpec
All Implemented Interfaces:
Serializable

public final class ColumnSpec
extends FormSpec

Specifies columns in FormLayout by their default orientation, start size and resizing behavior.

Examples:
The following examples specify a column with FILL alignment, a size of 10 dlu that won't grow.

 new ColumnSpec(Sizes.dluX(10));
 new ColumnSpec(ColumnSpec.FILL, Sizes.dluX(10), 0.0);
 new ColumnSpec(ColumnSpec.FILL, Sizes.dluX(10), ColumnSpec.NO_GROW);
 ColumnSpec.parse("10dlu");
 ColumnSpec.parse("10dlu:0");
 ColumnSpec.parse("fill:10dlu:0");
 

The FormSpecs provides predefined frequently used ColumnSpec instances.

Version:
$Revision: 1.20 $
Author:
Karsten Lentzsch
See Also:
FormSpecs, Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from class com.jgoodies.forms.layout.FormSpec
FormSpec.DefaultAlignment
 
Field Summary
static FormSpec.DefaultAlignment CENTER
          By default put the components in the center.
static FormSpec.DefaultAlignment DEFAULT
          Unless overridden the default alignment for a column is FILL.
static FormSpec.DefaultAlignment FILL
          By default fill the component into the column.
static FormSpec.DefaultAlignment LEFT
          By default put components in the left.
static FormSpec.DefaultAlignment RIGHT
          By default put components in the right.
 
Fields inherited from class com.jgoodies.forms.layout.FormSpec
DEFAULT_GROW, NO_GROW
 
Constructor Summary
ColumnSpec(FormSpec.DefaultAlignment defaultAlignment, Size size, double resizeWeight)
          Constructs a ColumnSpec for the given default alignment, size and resize weight.
ColumnSpec(Size size)
          Constructs a ColumnSpec for the given size using the default alignment, and no resizing.
 
Method Summary
static ColumnSpec createGap(ConstantSize gapWidth)
          Creates and returns a ColumnSpec that represents a gap with the specified ConstantSize.
static ColumnSpec decode(String encodedColumnSpec)
          Parses the encoded column specification and returns a ColumnSpec object that represents the string.
static ColumnSpec decode(String encodedColumnSpec, LayoutMap layoutMap)
          Parses the encoded column specifications and returns a ColumnSpec object that represents the string.
static ColumnSpec[] decodeSpecs(String encodedColumnSpecs)
          Parses and splits encoded column specifications using the default LayoutMap and returns an array of ColumnSpec objects.
static ColumnSpec[] decodeSpecs(String encodedColumnSpecs, LayoutMap layoutMap)
          Splits and parses the encoded column specifications using the given LayoutMap and returns an array of ColumnSpec objects.
protected  boolean isHorizontal()
          Returns if this is a horizontal specification (vs. vertical).
 
Methods inherited from class com.jgoodies.forms.layout.FormSpec
encode, getDefaultAlignment, getResizeWeight, getSize, toShortString, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

LEFT

public static final FormSpec.DefaultAlignment LEFT
By default put components in the left.


CENTER

public static final FormSpec.DefaultAlignment CENTER
By default put the components in the center.


RIGHT

public static final FormSpec.DefaultAlignment RIGHT
By default put components in the right.


FILL

public static final FormSpec.DefaultAlignment FILL
By default fill the component into the column.


DEFAULT

public static final FormSpec.DefaultAlignment DEFAULT
Unless overridden the default alignment for a column is FILL.

Constructor Detail

ColumnSpec

public ColumnSpec(FormSpec.DefaultAlignment defaultAlignment,
                  Size size,
                  double resizeWeight)
Constructs a ColumnSpec for the given default alignment, size and resize weight.

The resize weight must be a non-negative double; you can use NO_GROW as a convenience value for no resize.

Parameters:
defaultAlignment - the column's default alignment
size - constant, component size or bounded size
resizeWeight - the column's non-negative resize weight
Throws:
NullPointerException - if the size is null
IllegalArgumentException - if the size is invalid or the resizeWeight is negative

ColumnSpec

public ColumnSpec(Size size)
Constructs a ColumnSpec for the given size using the default alignment, and no resizing.

Parameters:
size - constant size, component size, or bounded size
Throws:
IllegalArgumentException - if the size is invalid
Method Detail

createGap

public static ColumnSpec createGap(ConstantSize gapWidth)
Creates and returns a ColumnSpec that represents a gap with the specified ConstantSize.

Parameters:
gapWidth - specifies the gap width
Returns:
a ColumnSpec that describes a horizontal gap
Throws:
NullPointerException - if gapWidth is null
Since:
1.2

decode

public static ColumnSpec decode(String encodedColumnSpec)
Parses the encoded column specification and returns a ColumnSpec object that represents the string. Variables are expanded using the default LayoutMap.

Parameters:
encodedColumnSpec - the encoded column specification
Returns:
a ColumnSpec instance for the given specification
Throws:
NullPointerException - if encodedColumnSpec is null
Since:
1.2
See Also:
decode(String, LayoutMap), LayoutMap.getRoot()

decode

public static ColumnSpec decode(String encodedColumnSpec,
                                LayoutMap layoutMap)
Parses the encoded column specifications and returns a ColumnSpec object that represents the string. Variables are expanded using the given LayoutMap.

Parameters:
encodedColumnSpec - the encoded column specification
layoutMap - expands layout column variables
Returns:
a ColumnSpec instance for the given specification
Throws:
NullPointerException - if encodedColumnSpec or layoutMap is null
IllegalArgumentException - if encodedColumnSpec is empty or whitespace
Since:
1.2
See Also:
decodeSpecs(String, LayoutMap)

decodeSpecs

public static ColumnSpec[] decodeSpecs(String encodedColumnSpecs)
Parses and splits encoded column specifications using the default LayoutMap and returns an array of ColumnSpec objects.

Parameters:
encodedColumnSpecs - comma separated encoded column specifications
Returns:
an array of decoded column specifications
Throws:
NullPointerException - if encodedColumnSpecs is null
See Also:
decodeSpecs(String, LayoutMap), decode(String), LayoutMap.getRoot()

decodeSpecs

public static ColumnSpec[] decodeSpecs(String encodedColumnSpecs,
                                       LayoutMap layoutMap)
Splits and parses the encoded column specifications using the given LayoutMap and returns an array of ColumnSpec objects.

Parameters:
encodedColumnSpecs - comma separated encoded column specifications
layoutMap - expands layout column variables
Returns:
an array of decoded column specifications
Throws:
NullPointerException - if encodedColumnSpecs or layoutMap is null
Since:
1.2
See Also:
decodeSpecs(String), decode(String, LayoutMap)

isHorizontal

protected boolean isHorizontal()
Returns if this is a horizontal specification (vs. vertical). Used to distinct between horizontal and vertical dialog units, which have different conversion factors.

Returns:
always true (for horizontal)


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/FormSpecParser.FormLayoutParseException.html0000644000175000017500000003401112003555424032470 0ustar tonytony FormSpecParser.FormLayoutParseException (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class FormSpecParser.FormLayoutParseException

java.lang.Object
  extended by java.lang.Throwable
      extended by java.lang.Exception
          extended by java.lang.RuntimeException
              extended by com.jgoodies.forms.layout.FormSpecParser.FormLayoutParseException
All Implemented Interfaces:
Serializable
Enclosing class:
FormSpecParser

public static final class FormSpecParser.FormLayoutParseException
extends RuntimeException

Used by the parser for encoded column and row specifications.

See Also:
Serialized Form

Method Summary
 
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/PrototypeSize.html0000644000175000017500000006343612003555424025500 0ustar tonytony PrototypeSize (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class PrototypeSize

java.lang.Object
  extended by com.jgoodies.forms.layout.PrototypeSize
All Implemented Interfaces:
Size, Serializable

public final class PrototypeSize
extends Object
implements Size, Serializable

A Size implementation that computes its width and height by a prototype String.

Examples:

 new PrototypeSize("123-456-789");
 new FormLayout("p, 2dlu, 'MMMM'");
 

Since:
1.2
Version:
$Revision: 1.7 $
Author:
Karsten Lentzsch
See Also:
Size, Sizes, Serialized Form

Constructor Summary
PrototypeSize(String prototype)
          Constructs a PrototypeSize for the given String.
 
Method Summary
 boolean compressible()
          Describes if this Size can be compressed, if container space gets scarce.
 String encode()
          Returns a parseable string representation of this prototype size.
 boolean equals(Object o)
          Indicates whether some other ConstantSize is "equal to" this one.
 String getPrototype()
          Returns this size's prototype string.
 int hashCode()
          Returns a hash code value for the object.
 int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure)
          Computes and returns the width of this Size's prototype in pixel.
 String toString()
          Returns a string representation of this size object.
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Constructor Detail

PrototypeSize

public PrototypeSize(String prototype)
Constructs a PrototypeSize for the given String.

Parameters:
prototype - the String used to compute the width and height.
Throws:
NullPointerException - if prototype is null.
Since:
1.2
Method Detail

getPrototype

public String getPrototype()
Returns this size's prototype string.

Returns:
the prototype string

maximumSize

public int maximumSize(Container container,
                       List components,
                       FormLayout.Measure minMeasure,
                       FormLayout.Measure prefMeasure,
                       FormLayout.Measure defaultMeasure)
Computes and returns the width of this Size's prototype in pixel. Ignores the component list and measures. Obtains the FontMetrics from the given layout container for the default dialog font provided by DefaultUnitConverter.getDefaultDialogFont().

Invoked by FormSpec to determine the size of a column or row.

Specified by:
maximumSize in interface Size
Parameters:
container - the layout container
components - the list of components used to compute the size
minMeasure - the measure that determines the minimum sizes
prefMeasure - the measure that determines the preferred sizes
defaultMeasure - the measure that determines the default sizes
Returns:
the stringWidth for this size's prototype string computed by the container's FontMetrics for the DefaultUnitConverter's default dialog font

compressible

public boolean compressible()
Describes if this Size can be compressed, if container space gets scarce. Used by the FormLayout size computations in #compressedSizes to check whether a column or row can be compressed or not.

PrototypeSizes are incompressible.

Specified by:
compressible in interface Size
Returns:
false

encode

public String encode()
Returns a parseable string representation of this prototype size.

Specified by:
encode in interface Size
Returns:
a String that can be parsed by the Forms parser

equals

public boolean equals(Object o)
Indicates whether some other ConstantSize is "equal to" this one.

Overrides:
equals in class Object
Parameters:
o - the Object with which to compare
Returns:
true if this object is the same as the obj argument; false otherwise.
See Also:
Object.hashCode(), Hashtable

hashCode

public int hashCode()
Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.

Overrides:
hashCode in class Object
Returns:
a hash code value for this object.
See Also:
Object.equals(java.lang.Object), Hashtable

toString

public String toString()
Returns a string representation of this size object. Note: This string representation may change at any time. It is intended for debugging purposes. For parsing, use encode() instead.

Overrides:
toString in class Object
Returns:
a string representation of the constant size


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/FormSpecs.html0000644000175000017500000011055212003555424024531 0ustar tonytony FormSpecs (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class FormSpecs

java.lang.Object
  extended by com.jgoodies.forms.layout.FormSpecs

public final class FormSpecs
extends Object

Provides frequently used column and row specifications.

Since:
1.6 This class was the FormFactory before.
Version:
$Revision: 1.17 $
Author:
Karsten Lentzsch
See Also:
FormLayout, ColumnSpec

Field Summary
static ColumnSpec BUTTON_COLSPEC
          Describes a logical horizontal column for a fixed size button.
static RowSpec BUTTON_ROWSPEC
          Describes a logical row for a fixed size button.
static ColumnSpec DEFAULT_COLSPEC
          An unmodifiable ColumnSpec that determines its preferred width by computing the maximum of all column component preferred widths and its minimum width by computing all column component minimum widths.
static RowSpec DEFAULT_ROWSPEC
          An unmodifiable RowSpec that determines its preferred height by computing the maximum of all column component preferred heights and its minimum height by computing all column component minimum heights.
static ColumnSpec GLUE_COLSPEC
          An unmodifiable ColumnSpec that has an initial width of 0 pixels and that grows.
static RowSpec GLUE_ROWSPEC
          An unmodifiable RowSpec that has an initial height of 0 pixels and that grows.
static ColumnSpec GROWING_BUTTON_COLSPEC
          Describes a logical horizontal column for a growing button.
static ColumnSpec LABEL_COMPONENT_GAP_COLSPEC
          Describes a logical horizontal gap between a label and an associated component.
static RowSpec LABEL_COMPONENT_GAP_ROWSPEC
          Describes a logical horizontal gap between a label and an associated component.
static RowSpec LINE_GAP_ROWSPEC
          Describes the logical vertical default gap between two rows in the grid.
static ColumnSpec MIN_COLSPEC
          An unmodifiable ColumnSpec that determines its width by computing the maximum of all column component minimum widths.
static RowSpec MIN_ROWSPEC
          An unmodifiable RowSpec that determines its height by computing the maximum of all column component minimum heights.
static RowSpec NARROW_LINE_GAP_ROWSPEC
          Describes a logical vertical narrow gap between two rows in the grid.
static RowSpec PARAGRAPH_GAP_ROWSPEC
          Describes the logical vertical default gap between two paragraphs in the layout grid.
static ColumnSpec PREF_COLSPEC
          An unmodifiable ColumnSpec that determines its width by computing the maximum of all column component preferred widths.
static RowSpec PREF_ROWSPEC
          An unmodifiable RowSpec that determines its height by computing the maximum of all column component preferred heights.
static ColumnSpec RELATED_GAP_COLSPEC
          Describes a logical horizontal gap between two related components.
static RowSpec RELATED_GAP_ROWSPEC
          Describes a logical vertical gap between two related components.
static ColumnSpec UNRELATED_GAP_COLSPEC
          Describes a logical horizontal gap between two unrelated components.
static RowSpec UNRELATED_GAP_ROWSPEC
          Describes a logical vertical gap between two unrelated components.
 
Method Summary
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

MIN_COLSPEC

public static final ColumnSpec MIN_COLSPEC
An unmodifiable ColumnSpec that determines its width by computing the maximum of all column component minimum widths.

See Also:
PREF_COLSPEC, DEFAULT_COLSPEC

PREF_COLSPEC

public static final ColumnSpec PREF_COLSPEC
An unmodifiable ColumnSpec that determines its width by computing the maximum of all column component preferred widths.

See Also:
MIN_COLSPEC, DEFAULT_COLSPEC

DEFAULT_COLSPEC

public static final ColumnSpec DEFAULT_COLSPEC
An unmodifiable ColumnSpec that determines its preferred width by computing the maximum of all column component preferred widths and its minimum width by computing all column component minimum widths.

Useful to let a column shrink from preferred width to minimum width if the container space gets scarce.

See Also:
MIN_COLSPEC, PREF_COLSPEC

GLUE_COLSPEC

public static final ColumnSpec GLUE_COLSPEC
An unmodifiable ColumnSpec that has an initial width of 0 pixels and that grows. Useful to describe glue columns that fill the space between other columns.

See Also:
GLUE_ROWSPEC

LABEL_COMPONENT_GAP_COLSPEC

public static final ColumnSpec LABEL_COMPONENT_GAP_COLSPEC
Describes a logical horizontal gap between a label and an associated component. Useful for builders that automatically fill a grid with labels and components.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

Since:
1.0.3

RELATED_GAP_COLSPEC

public static final ColumnSpec RELATED_GAP_COLSPEC
Describes a logical horizontal gap between two related components. For example the OK and Cancel buttons are considered related.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
UNRELATED_GAP_COLSPEC

UNRELATED_GAP_COLSPEC

public static final ColumnSpec UNRELATED_GAP_COLSPEC
Describes a logical horizontal gap between two unrelated components.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
RELATED_GAP_COLSPEC

BUTTON_COLSPEC

public static final ColumnSpec BUTTON_COLSPEC
Describes a logical horizontal column for a fixed size button. This spec honors the current layout style's default button minimum width.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
GROWING_BUTTON_COLSPEC

GROWING_BUTTON_COLSPEC

public static final ColumnSpec GROWING_BUTTON_COLSPEC
Describes a logical horizontal column for a growing button. This spec does not use the layout style's default button minimum width.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
BUTTON_COLSPEC

MIN_ROWSPEC

public static final RowSpec MIN_ROWSPEC
An unmodifiable RowSpec that determines its height by computing the maximum of all column component minimum heights.

See Also:
PREF_ROWSPEC, DEFAULT_ROWSPEC

PREF_ROWSPEC

public static final RowSpec PREF_ROWSPEC
An unmodifiable RowSpec that determines its height by computing the maximum of all column component preferred heights.

See Also:
MIN_ROWSPEC, DEFAULT_ROWSPEC

DEFAULT_ROWSPEC

public static final RowSpec DEFAULT_ROWSPEC
An unmodifiable RowSpec that determines its preferred height by computing the maximum of all column component preferred heights and its minimum height by computing all column component minimum heights.

Useful to let a column shrink from preferred height to minimum height if the container space gets scarce.

See Also:
MIN_COLSPEC, PREF_COLSPEC

GLUE_ROWSPEC

public static final RowSpec GLUE_ROWSPEC
An unmodifiable RowSpec that has an initial height of 0 pixels and that grows. Useful to describe glue rows that fill the space between other rows.

See Also:
GLUE_COLSPEC

LABEL_COMPONENT_GAP_ROWSPEC

public static final RowSpec LABEL_COMPONENT_GAP_ROWSPEC
Describes a logical horizontal gap between a label and an associated component. Useful for builders that automatically fill a grid with labels and components.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

Since:
1.4

RELATED_GAP_ROWSPEC

public static final RowSpec RELATED_GAP_ROWSPEC
Describes a logical vertical gap between two related components. For example the OK and Cancel buttons are considered related.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
UNRELATED_GAP_ROWSPEC

UNRELATED_GAP_ROWSPEC

public static final RowSpec UNRELATED_GAP_ROWSPEC
Describes a logical vertical gap between two unrelated components.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
RELATED_GAP_ROWSPEC

NARROW_LINE_GAP_ROWSPEC

public static final RowSpec NARROW_LINE_GAP_ROWSPEC
Describes a logical vertical narrow gap between two rows in the grid. Useful if the vertical space is scarce or if an individual vertical gap shall be small than the default line gap.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
LINE_GAP_ROWSPEC, PARAGRAPH_GAP_ROWSPEC

LINE_GAP_ROWSPEC

public static final RowSpec LINE_GAP_ROWSPEC
Describes the logical vertical default gap between two rows in the grid. A little bit larger than the narrow line gap.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
NARROW_LINE_GAP_ROWSPEC, PARAGRAPH_GAP_ROWSPEC

PARAGRAPH_GAP_ROWSPEC

public static final RowSpec PARAGRAPH_GAP_ROWSPEC
Describes the logical vertical default gap between two paragraphs in the layout grid. This gap is larger than the default line gap.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

See Also:
NARROW_LINE_GAP_ROWSPEC, LINE_GAP_ROWSPEC

BUTTON_ROWSPEC

public static final RowSpec BUTTON_ROWSPEC
Describes a logical row for a fixed size button. This spec honors the current layout style's default button minimum height.

Note: In a future version this constant will likely be moved to a class LogicalSize or StyledSize.

Since:
1.2


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/FormLayout.LayoutInfo.html0000644000175000017500000003635712003555424027033 0ustar tonytony FormLayout.LayoutInfo (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class FormLayout.LayoutInfo

java.lang.Object
  extended by com.jgoodies.forms.layout.FormLayout.LayoutInfo
Enclosing class:
FormLayout

public static final class FormLayout.LayoutInfo
extends Object

Stores column and row origins.


Field Summary
 int[] columnOrigins
          Holds the origins of the columns.
 int[] rowOrigins
          Holds the origins of the rows.
 
Method Summary
 int getHeight()
          Returns the layout's height, the size between the first and last row.
 int getWidth()
          Returns the layout's width, the size between the first and the last column origin.
 int getX()
          Returns the layout's horizontal origin, the origin of the first column.
 int getY()
          Returns the layout's vertical origin, the origin of the first row.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

columnOrigins

public final int[] columnOrigins
Holds the origins of the columns.


rowOrigins

public final int[] rowOrigins
Holds the origins of the rows.

Method Detail

getX

public int getX()
Returns the layout's horizontal origin, the origin of the first column.

Returns:
the layout's horizontal origin, the origin of the first column.

getY

public int getY()
Returns the layout's vertical origin, the origin of the first row.

Returns:
the layout's vertical origin, the origin of the first row.

getWidth

public int getWidth()
Returns the layout's width, the size between the first and the last column origin.

Returns:
the layout's width.

getHeight

public int getHeight()
Returns the layout's height, the size between the first and last row.

Returns:
the layout's height.


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/BoundedSize.html0000644000175000017500000006755512003555424025061 0ustar tonytony BoundedSize (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Class BoundedSize

java.lang.Object
  extended by com.jgoodies.forms.layout.BoundedSize
All Implemented Interfaces:
Size, Serializable

public final class BoundedSize
extends Object
implements Size, Serializable

Describes sizes that provide lower and upper bounds as used by the JGoodies FormLayout.

Version:
$Revision: 1.21 $
Author:
Karsten Lentzsch
See Also:
Sizes, ConstantSize, Serialized Form

Constructor Summary
BoundedSize(Size basis, Size lowerBound, Size upperBound)
          Constructs a BoundedSize for the given basis using the specified lower and upper bounds.
 
Method Summary
 boolean compressible()
          Describes if this Size can be compressed, if container space gets scarce.
 String encode()
          Returns a parseable string representation of this bounded size.
 boolean equals(Object object)
          Indicates whether some other BoundedSize is "equal to" this one.
 Size getBasis()
          Returns the base size, which is not-null.
 Size getLowerBound()
          Returns the optional lower bound.
 Size getUpperBound()
          Returns the optional upper bound.
 int hashCode()
          Returns a hash code value for the object.
 int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure)
          Returns this size as pixel size.
 String toString()
          Returns a string representation of this size object.
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Constructor Detail

BoundedSize

public BoundedSize(Size basis,
                   Size lowerBound,
                   Size upperBound)
Constructs a BoundedSize for the given basis using the specified lower and upper bounds.

Parameters:
basis - the base size
lowerBound - the lower bound size
upperBound - the upper bound size
Throws:
NullPointerException - if basis, lowerBound, or upperBound is null
Since:
1.1
Method Detail

getBasis

public Size getBasis()
Returns the base size, which is not-null.

Returns:
the base size
Since:
1.1

getLowerBound

public Size getLowerBound()
Returns the optional lower bound.

Returns:
the optional lower bound
Since:
1.1

getUpperBound

public Size getUpperBound()
Returns the optional upper bound.

Returns:
the optional upper bound
Since:
1.1

maximumSize

public int maximumSize(Container container,
                       List components,
                       FormLayout.Measure minMeasure,
                       FormLayout.Measure prefMeasure,
                       FormLayout.Measure defaultMeasure)
Returns this size as pixel size. Neither requires the component list nor the specified measures. Honors the lower and upper bound.

Invoked by FormSpec to determine the size of a column or row.

Specified by:
maximumSize in interface Size
Parameters:
container - the layout container
components - the list of components to measure
minMeasure - the measure used to determine the minimum size
prefMeasure - the measure used to determine the preferred size
defaultMeasure - the measure used to determine the default size
Returns:
the maximum size in pixels
See Also:
FormSpec.maximumSize(Container, List, FormLayout.Measure, FormLayout.Measure, FormLayout.Measure)

compressible

public boolean compressible()
Describes if this Size can be compressed, if container space gets scarce. Used by the FormLayout size computations in #compressedSizes to check whether a column or row can be compressed or not.

BoundedSizes are compressible if the base Size is compressible.

Specified by:
compressible in interface Size
Returns:
true if and only if the basis is compressible
Since:
1.1

equals

public boolean equals(Object object)
Indicates whether some other BoundedSize is "equal to" this one.

Overrides:
equals in class Object
Parameters:
object - the object with which to compare
Returns:
true if this object is the same as the object argument, false otherwise.
See Also:
Object.hashCode(), Hashtable

hashCode

public int hashCode()
Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.

Overrides:
hashCode in class Object
Returns:
a hash code value for this object.
See Also:
Object.equals(Object), Hashtable

toString

public String toString()
Returns a string representation of this size object.

Note: This string representation may change at any time. It is intended for debugging purposes. For parsing, use encode() instead.

Overrides:
toString in class Object
Returns:
a string representation of this bounded size

encode

public String encode()
Returns a parseable string representation of this bounded size.

Specified by:
encode in interface Size
Returns:
a String that can be parsed by the Forms parser
Since:
1.2


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/layout/Size.html0000644000175000017500000003506212003555424023544 0ustar tonytony Size (JGoodies Forms 1.6 API)

com.jgoodies.forms.layout
Interface Size

All Known Implementing Classes:
BoundedSize, ConstantSize, PrototypeSize

public interface Size

An interface that describes sizes as used by the FormLayout: component measuring sizes, constant sizes with value and unit, and bounded sizes that provide lower and upper bounds for a size.

You can find a motivation for the different Size types in the Forms whitepaper that is part of the product documentation and that is available online too, see http://www.jgoodies.com/articles/forms.pdf.

Version:
$Revision: 1.12 $
Author:
Karsten Lentzsch
See Also:
Sizes, ConstantSize

Method Summary
 boolean compressible()
          Describes if this Size can be compressed, if container space gets scarce.
 String encode()
          Returns a String respresentation of this Size object that can be parsed by the Forms parser.
 int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure)
          Computes and returns this Size's maximum pixel size applied to the given list of components using the specified measures.
 

Method Detail

maximumSize

int maximumSize(Container container,
                List components,
                FormLayout.Measure minMeasure,
                FormLayout.Measure prefMeasure,
                FormLayout.Measure defaultMeasure)
Computes and returns this Size's maximum pixel size applied to the given list of components using the specified measures.

Invoked by FormSpec to determine the size of a column or row. This method is not intended to be called by API users, and it uses API invisible parameter types.

Parameters:
container - the layout container
components - the list of components used to compute the size
minMeasure - the measure that determines the minimum sizes
prefMeasure - the measure that determines the preferred sizes
defaultMeasure - the measure that determines the default sizes
Returns:
the maximum size in pixels for the given list of components

compressible

boolean compressible()
Describes if this Size can be compressed, if container space gets scarce. Used by the FormLayout size computations in #compressedSizes to check whether a column or row can be compressed or not.

The ComponentSize default is compressible, as well as BoundedSizes that are based on the default size.

Returns:
true for compressible Sizes
Since:
1.1

encode

String encode()
Returns a String respresentation of this Size object that can be parsed by the Forms parser.

Implementors should return a non-verbose string.

Returns:
a parseable String representation of this object.
Since:
1.2


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/0000755000175000017500000000000012003555424021727 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/package-frame.html0000644000175000017500000000213512003555424025301 0ustar tonytony com.jgoodies.forms.extras (JGoodies Forms 1.6 API) com.jgoodies.forms.extras
Classes 
FormLayoutUtils
FormLayoutUtils.ConstraintIterator
jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/package-tree.html0000644000175000017500000001513112003555424025146 0ustar tonytony com.jgoodies.forms.extras Class Hierarchy (JGoodies Forms 1.6 API)

Hierarchy For Package com.jgoodies.forms.extras

Package Hierarchies:
All Packages

Class Hierarchy



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/package-use.html0000644000175000017500000001325112003555424025004 0ustar tonytony Uses of Package com.jgoodies.forms.extras (JGoodies Forms 1.6 API)

Uses of Package
com.jgoodies.forms.extras

No usage of com.jgoodies.forms.extras



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/class-use/0000755000175000017500000000000012003555424023626 5ustar tonytony././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/class-use/FormLayoutUtils.ConstraintIterator.htmljgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/class-use/FormLayoutUtils.ConstraintIterator0000644000175000017500000001437212003555424032537 0ustar tonytony Uses of Class com.jgoodies.forms.extras.FormLayoutUtils.ConstraintIterator (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.extras.FormLayoutUtils.ConstraintIterator

No usage of com.jgoodies.forms.extras.FormLayoutUtils.ConstraintIterator



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/class-use/FormLayoutUtils.html0000644000175000017500000001407412003555424027644 0ustar tonytony Uses of Class com.jgoodies.forms.extras.FormLayoutUtils (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.extras.FormLayoutUtils

No usage of com.jgoodies.forms.extras.FormLayoutUtils



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/package-summary.html0000644000175000017500000002016412003555424025706 0ustar tonytony com.jgoodies.forms.extras (JGoodies Forms 1.6 API)

Package com.jgoodies.forms.extras

Contains optional Forms framework classes that ship only with the JGoodies Forms source distribution and are not yet part of the binary Forms library.

See:
          Description

Class Summary
FormLayoutUtils Consists only of static methods that provide convenience behavior for working with the FormLayout.
FormLayoutUtils.ConstraintIterator Iterates over a FormLayout container's CellConstraints.
 

Package com.jgoodies.forms.extras Description

Contains optional Forms framework classes that ship only with the JGoodies Forms source distribution and are not yet part of the binary Forms library. The API of these classes is work in progress and may change without notice. If you want to use a class from this package, you may consider copying it into your codebase.

Related Documentation

For more information see:

See Also:
com.jgoodies.forms.layout


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/FormLayoutUtils.ConstraintIterator.html0000644000175000017500000003642112003555424031602 0ustar tonytony FormLayoutUtils.ConstraintIterator (JGoodies Forms 1.6 API)

com.jgoodies.forms.extras
Class FormLayoutUtils.ConstraintIterator

java.lang.Object
  extended by com.jgoodies.forms.extras.FormLayoutUtils.ConstraintIterator
Enclosing class:
FormLayoutUtils

public static final class FormLayoutUtils.ConstraintIterator
extends Object

Iterates over a FormLayout container's CellConstraints. The container's child component collection and the layout's constraints collection must not be changed during the iteration; otherwise the behavior of this iterator is unspecified and unsafe.

See Also:
FormLayout, CellConstraints

Constructor Summary
FormLayoutUtils.ConstraintIterator(Container container)
          Constructs a ConstraintIterator for the given FormLayout container.
 
Method Summary
 boolean hasNext()
          Returns true if the iteration has more elements.
 CellConstraints nextConstraints()
          Returns the next element in the iteration.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

FormLayoutUtils.ConstraintIterator

public FormLayoutUtils.ConstraintIterator(Container container)
Constructs a ConstraintIterator for the given FormLayout container. Useful to iterate over the container's CellConstraints.

Parameters:
container - the layout container
Throws:
IllegalArgumentException - if the container's layout is not a FormLayout
Method Detail

hasNext

public boolean hasNext()
Returns true if the iteration has more elements. (In other words, returns true if next would return an element rather than throwing an exception.)

Returns:
true if the iterator has more elements.

nextConstraints

public CellConstraints nextConstraints()
Returns the next element in the iteration.

Returns:
the next element in the iteration.
Throws:
NoSuchElementException - iteration has no more elements.


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/extras/FormLayoutUtils.html0000644000175000017500000004461212003555424025746 0ustar tonytony FormLayoutUtils (JGoodies Forms 1.6 API)

com.jgoodies.forms.extras
Class FormLayoutUtils

java.lang.Object
  extended by com.jgoodies.forms.extras.FormLayoutUtils

public final class FormLayoutUtils
extends Object

Consists only of static methods that provide convenience behavior for working with the FormLayout.

Note: This class is not part of the binary Form library. It comes with the Forms distributions as an extra. The API is work in progress and may change without notice; this class may even be completely removed from future distributions. If you want to use this class, you may consider copying it into your codebase.

Version:
$Revision: 1.12 $
Author:
Karsten Lentzsch

Nested Class Summary
static class FormLayoutUtils.ConstraintIterator
          Iterates over a FormLayout container's CellConstraints.
 
Method Summary
static boolean columnContainsComponent(Container container, int columnIndex)
          Checks and answers whether the given FormLayout container contains a component in the specified column.
static boolean isGroupedColumn(FormLayout layout, int columnIndex)
          Checks and answers whether the specified column is grouped in the given FormLayout.
static boolean isGroupedRow(FormLayout layout, int rowIndex)
          Checks and answers whether the specified row is grouped in the given FormLayout.
static boolean rowContainsComponent(Container container, int rowIndex)
          Checks and answers whether the given FormLayout container contains a component in the specified row.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

columnContainsComponent

public static boolean columnContainsComponent(Container container,
                                              int columnIndex)
Checks and answers whether the given FormLayout container contains a component in the specified column.

For every container child component, we look up the associated CellConstraints object from the layout and compare its horizontal grid origin with the specified column index.

Parameters:
container - the layout container
columnIndex - the index of the column to test
Returns:
true if the column contains a component, false otherwise
Throws:
IllegalArgumentException - if the container's layout is not a FormLayout

rowContainsComponent

public static boolean rowContainsComponent(Container container,
                                           int rowIndex)
Checks and answers whether the given FormLayout container contains a component in the specified row.

For every container child component, we look up the associated CellConstraints object from the layout and compare its vertical grid origin with the specified row index.

Parameters:
container - the layout container
rowIndex - the index of the row to test
Returns:
true if the row contains a component, false otherwise
Throws:
IllegalArgumentException - if the container's layout is not a FormLayout

isGroupedColumn

public static boolean isGroupedColumn(FormLayout layout,
                                      int columnIndex)
Checks and answers whether the specified column is grouped in the given FormLayout. A column col is grouped, if and only if there's a column group group that includes col's index.

Parameters:
layout - the layout to be inspected
columnIndex - the index of the column to be checked
Returns:
true if the column is grouped, false if not

isGroupedRow

public static boolean isGroupedRow(FormLayout layout,
                                   int rowIndex)
Checks and answers whether the specified row is grouped in the given FormLayout. A row row is grouped, if and only if there's a row group group that includes row's index.

Parameters:
layout - the layout to be inspected
rowIndex - the index of the row to be checked
Returns:
true if the column is grouped, false if not


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/0000755000175000017500000000000012003555424021376 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/package-frame.html0000644000175000017500000000332012003555424024745 0ustar tonytony com.jgoodies.forms.util (JGoodies Forms 1.6 API) com.jgoodies.forms.util
Interfaces 
UnitConverter
Classes 
AbstractUnitConverter
DefaultUnitConverter
FormUtils
LayoutStyle
MacLayoutStyle
jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/FormUtils.html0000644000175000017500000003144512003555424024217 0ustar tonytony FormUtils (JGoodies Forms 1.6 API)

com.jgoodies.forms.util
Class FormUtils

java.lang.Object
  extended by com.jgoodies.forms.util.FormUtils

public final class FormUtils
extends Object

A library-internal class that consists only of static utility methods. Note: This class is not part of the public Forms API. It's intended for library implementation purposes only. The class's API may change at any time.

Since:
1.2
Version:
$Revision: 1.14 $
Author:
Karsten Lentzsch

Method Summary
static void clearLookAndFeelBasedCaches()
          Clears cached internal Forms state that is based on the Look&Feel, for example dialog base units.
static boolean isLafAqua()
          Lazily checks and answers whether the Aqua look&feel is active.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

isLafAqua

public static boolean isLafAqua()
Lazily checks and answers whether the Aqua look&feel is active.

Returns:
true if the current look&feel is Aqua

clearLookAndFeelBasedCaches

public static void clearLookAndFeelBasedCaches()
Clears cached internal Forms state that is based on the Look&Feel, for example dialog base units.

There's typically no need to call this method directly. It'll be invoked automatically, if the L&F has been changed via UIManager.setLookAndFeel(javax.swing.LookAndFeel) and cached data is requested. It's been made public to allow cache invalidation for cases where the L&F is changed temporarily by replacing the UIDefaults, for example in a visual editor.

Since:
1.2.1


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/package-tree.html0000644000175000017500000001711112003555424024615 0ustar tonytony com.jgoodies.forms.util Class Hierarchy (JGoodies Forms 1.6 API)

Hierarchy For Package com.jgoodies.forms.util

Package Hierarchies:
All Packages

Class Hierarchy

Interface Hierarchy



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/package-use.html0000644000175000017500000002251312003555424024454 0ustar tonytony Uses of Package com.jgoodies.forms.util (JGoodies Forms 1.6 API)

Uses of Package
com.jgoodies.forms.util

Packages that use com.jgoodies.forms.util
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles 
 

Classes in com.jgoodies.forms.util used by com.jgoodies.forms.layout
UnitConverter
          An interface that describes how to convert general sizes to pixel sizes.
 

Classes in com.jgoodies.forms.util used by com.jgoodies.forms.util
AbstractUnitConverter
          An abstract implementation of the UnitConverter interface that minimizes the effort required to convert font-dependent sizes to pixels.
DefaultUnitConverter
          This is the default implementation of the UnitConverter interface.
LayoutStyle
          An abstract class that describes a layout and design style guide.
UnitConverter
          An interface that describes how to convert general sizes to pixel sizes.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/class-use/0000755000175000017500000000000012003555424023275 5ustar tonytonyjgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/class-use/FormUtils.html0000644000175000017500000001375412003555424026121 0ustar tonytony Uses of Class com.jgoodies.forms.util.FormUtils (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.util.FormUtils

No usage of com.jgoodies.forms.util.FormUtils



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/class-use/MacLayoutStyle.html0000644000175000017500000001403612003555424027106 0ustar tonytony Uses of Class com.jgoodies.forms.util.MacLayoutStyle (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.util.MacLayoutStyle

No usage of com.jgoodies.forms.util.MacLayoutStyle



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/class-use/AbstractUnitConverter.html0000644000175000017500000002023612003555424030461 0ustar tonytony Uses of Class com.jgoodies.forms.util.AbstractUnitConverter (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.util.AbstractUnitConverter

Packages that use AbstractUnitConverter
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles 
 

Uses of AbstractUnitConverter in com.jgoodies.forms.util
 

Subclasses of AbstractUnitConverter in com.jgoodies.forms.util
 class DefaultUnitConverter
          This is the default implementation of the UnitConverter interface.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/class-use/LayoutStyle.html0000644000175000017500000002401212003555424026460 0ustar tonytony Uses of Class com.jgoodies.forms.util.LayoutStyle (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.util.LayoutStyle

Packages that use LayoutStyle
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles 
 

Uses of LayoutStyle in com.jgoodies.forms.util
 

Subclasses of LayoutStyle in com.jgoodies.forms.util
 class MacLayoutStyle
          A LayoutStyle that aims to provide layout constants as defined by Microsoft's User Experience Guidelines.
 

Methods in com.jgoodies.forms.util that return LayoutStyle
static LayoutStyle LayoutStyle.getCurrent()
          Returns the current LayoutStyle.
 

Methods in com.jgoodies.forms.util with parameters of type LayoutStyle
static void LayoutStyle.setCurrent(LayoutStyle newLayoutStyle)
          Set a new LayoutStyle.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/class-use/UnitConverter.html0000644000175000017500000002727712003555424027011 0ustar tonytony Uses of Interface com.jgoodies.forms.util.UnitConverter (JGoodies Forms 1.6 API)

Uses of Interface
com.jgoodies.forms.util.UnitConverter

Packages that use UnitConverter
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints 
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles 
 

Uses of UnitConverter in com.jgoodies.forms.layout
 

Methods in com.jgoodies.forms.layout that return UnitConverter
static UnitConverter Sizes.getUnitConverter()
          Returns the current UnitConverter.
 

Methods in com.jgoodies.forms.layout with parameters of type UnitConverter
static void Sizes.setUnitConverter(UnitConverter newUnitConverter)
          Sets a new UnitConverter that will be used to convert font-dependent sizes to pixel sizes.
 

Uses of UnitConverter in com.jgoodies.forms.util
 

Classes in com.jgoodies.forms.util that implement UnitConverter
 class AbstractUnitConverter
          An abstract implementation of the UnitConverter interface that minimizes the effort required to convert font-dependent sizes to pixels.
 class DefaultUnitConverter
          This is the default implementation of the UnitConverter interface.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/class-use/DefaultUnitConverter.html0000644000175000017500000002021212003555424030274 0ustar tonytony Uses of Class com.jgoodies.forms.util.DefaultUnitConverter (JGoodies Forms 1.6 API)

Uses of Class
com.jgoodies.forms.util.DefaultUnitConverter

Packages that use DefaultUnitConverter
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles 
 

Uses of DefaultUnitConverter in com.jgoodies.forms.util
 

Methods in com.jgoodies.forms.util that return DefaultUnitConverter
static DefaultUnitConverter DefaultUnitConverter.getInstance()
          Lazily instantiates and returns the sole instance.
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/MacLayoutStyle.html0000644000175000017500000011614412003555424025212 0ustar tonytony MacLayoutStyle (JGoodies Forms 1.6 API)

com.jgoodies.forms.util
Class MacLayoutStyle

java.lang.Object
  extended by com.jgoodies.forms.util.LayoutStyle
      extended by com.jgoodies.forms.util.MacLayoutStyle

public final class MacLayoutStyle
extends LayoutStyle

A LayoutStyle that aims to provide layout constants as defined by Microsoft's User Experience Guidelines.

Version:
$Revision: 1.12 $
Author:
Karsten Lentzsch

Method Summary
 ConstantSize getButtonBarPad()
          Returns a pad used to separate a button bar from a component.
 Size getDefaultButtonHeight()
          Returns this style's default button height.
 Size getDefaultButtonWidth()
          Returns this style's default button width.
 ConstantSize getDialogMarginX()
          Returns this style's horizontal margin for general dialogs.
 ConstantSize getDialogMarginY()
          Returns this style's vertical margin for general dialogs.
 ConstantSize getLabelComponentPadX()
          Returns a gap used to separate a label and associated control.
 ConstantSize getLabelComponentPadY()
          Returns a gap used to separate a label and associated control.
 ConstantSize getLinePad()
          Returns a narrow vertical pad used to separate lines.
 ConstantSize getNarrowLinePad()
          Returns a narrow vertical pad used to separate lines.
 ConstantSize getParagraphPad()
          Returns a pad used to separate paragraphs.
 ConstantSize getRelatedComponentsPadX()
          Returns a horizontal gap used to separate related controls.
 ConstantSize getRelatedComponentsPadY()
          Returns a vertical gap used to separate related controls.
 ConstantSize getTabbedDialogMarginX()
          Returns this style's horizontal margin for dialogs that consist of a tabbed pane.
 ConstantSize getTabbedDialogMarginY()
          Returns this style's vertical margin for dialogs that consist of a tabbed pane.
 ConstantSize getUnrelatedComponentsPadX()
          Returns a horizontal gap used to separate unrelated controls.
 ConstantSize getUnrelatedComponentsPadY()
          Returns a vertical gap used to separate unrelated controls.
 
Methods inherited from class com.jgoodies.forms.util.LayoutStyle
getCurrent, setCurrent
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

getDefaultButtonWidth

public Size getDefaultButtonWidth()
Description copied from class: LayoutStyle
Returns this style's default button width.

Specified by:
getDefaultButtonWidth in class LayoutStyle
Returns:
the default button width
See Also:
LayoutStyle.getDefaultButtonHeight()

getDefaultButtonHeight

public Size getDefaultButtonHeight()
Description copied from class: LayoutStyle
Returns this style's default button height.

Specified by:
getDefaultButtonHeight in class LayoutStyle
Returns:
the default button height
See Also:
LayoutStyle.getDefaultButtonWidth()

getDialogMarginX

public ConstantSize getDialogMarginX()
Description copied from class: LayoutStyle
Returns this style's horizontal margin for general dialogs.

Specified by:
getDialogMarginX in class LayoutStyle
Returns:
the horizontal margin for general dialogs
See Also:
LayoutStyle.getDialogMarginY(), LayoutStyle.getTabbedDialogMarginX()

getDialogMarginY

public ConstantSize getDialogMarginY()
Description copied from class: LayoutStyle
Returns this style's vertical margin for general dialogs.

Specified by:
getDialogMarginY in class LayoutStyle
Returns:
the vertical margin for general dialogs
See Also:
LayoutStyle.getDialogMarginX(), LayoutStyle.getTabbedDialogMarginY()

getTabbedDialogMarginX

public ConstantSize getTabbedDialogMarginX()
Description copied from class: LayoutStyle
Returns this style's horizontal margin for dialogs that consist of a tabbed pane.

Specified by:
getTabbedDialogMarginX in class LayoutStyle
Returns:
the horizontal margin for dialogs that consist of a tabbed pane
See Also:
LayoutStyle.getTabbedDialogMarginY(), LayoutStyle.getDialogMarginX()

getTabbedDialogMarginY

public ConstantSize getTabbedDialogMarginY()
Description copied from class: LayoutStyle
Returns this style's vertical margin for dialogs that consist of a tabbed pane.

Specified by:
getTabbedDialogMarginY in class LayoutStyle
Returns:
the vertical margin for dialogs that consist of a tabbed pane
See Also:
LayoutStyle.getTabbedDialogMarginX(), LayoutStyle.getDialogMarginY()

getLabelComponentPadX

public ConstantSize getLabelComponentPadX()
Description copied from class: LayoutStyle
Returns a gap used to separate a label and associated control.

Specified by:
getLabelComponentPadX in class LayoutStyle
Returns:
a gap between label and associated control
See Also:
LayoutStyle.getRelatedComponentsPadX(), LayoutStyle.getUnrelatedComponentsPadX()

getLabelComponentPadY

public ConstantSize getLabelComponentPadY()
Description copied from class: LayoutStyle
Returns a gap used to separate a label and associated control.

Specified by:
getLabelComponentPadY in class LayoutStyle
Returns:
a gap between label and associated control
See Also:
LayoutStyle.getRelatedComponentsPadY(), LayoutStyle.getUnrelatedComponentsPadY()

getRelatedComponentsPadX

public ConstantSize getRelatedComponentsPadX()
Description copied from class: LayoutStyle
Returns a horizontal gap used to separate related controls.

Specified by:
getRelatedComponentsPadX in class LayoutStyle
Returns:
a horizontal gap between related controls
See Also:
LayoutStyle.getLabelComponentPadX(), LayoutStyle.getRelatedComponentsPadY(), LayoutStyle.getUnrelatedComponentsPadX()

getRelatedComponentsPadY

public ConstantSize getRelatedComponentsPadY()
Description copied from class: LayoutStyle
Returns a vertical gap used to separate related controls.

Specified by:
getRelatedComponentsPadY in class LayoutStyle
Returns:
a vertical gap between related controls
See Also:
LayoutStyle.getRelatedComponentsPadX(), LayoutStyle.getUnrelatedComponentsPadY()

getUnrelatedComponentsPadX

public ConstantSize getUnrelatedComponentsPadX()
Description copied from class: LayoutStyle
Returns a horizontal gap used to separate unrelated controls.

Specified by:
getUnrelatedComponentsPadX in class LayoutStyle
Returns:
a horizontal gap between unrelated controls
See Also:
LayoutStyle.getLabelComponentPadX(), LayoutStyle.getUnrelatedComponentsPadY(), LayoutStyle.getRelatedComponentsPadX()

getUnrelatedComponentsPadY

public ConstantSize getUnrelatedComponentsPadY()
Description copied from class: LayoutStyle
Returns a vertical gap used to separate unrelated controls.

Specified by:
getUnrelatedComponentsPadY in class LayoutStyle
Returns:
a vertical gap between unrelated controls
See Also:
LayoutStyle.getUnrelatedComponentsPadX(), LayoutStyle.getRelatedComponentsPadY()

getNarrowLinePad

public ConstantSize getNarrowLinePad()
Description copied from class: LayoutStyle
Returns a narrow vertical pad used to separate lines.

Specified by:
getNarrowLinePad in class LayoutStyle
Returns:
a narrow vertical pad used to separate lines
See Also:
LayoutStyle.getLinePad(), LayoutStyle.getParagraphPad()

getLinePad

public ConstantSize getLinePad()
Description copied from class: LayoutStyle
Returns a narrow vertical pad used to separate lines.

Specified by:
getLinePad in class LayoutStyle
Returns:
a vertical pad used to separate lines
See Also:
LayoutStyle.getNarrowLinePad(), LayoutStyle.getParagraphPad()

getParagraphPad

public ConstantSize getParagraphPad()
Description copied from class: LayoutStyle
Returns a pad used to separate paragraphs.

Specified by:
getParagraphPad in class LayoutStyle
Returns:
a vertical pad used to separate paragraphs
See Also:
LayoutStyle.getNarrowLinePad(), LayoutStyle.getLinePad()

getButtonBarPad

public ConstantSize getButtonBarPad()
Description copied from class: LayoutStyle
Returns a pad used to separate a button bar from a component.

Specified by:
getButtonBarPad in class LayoutStyle
Returns:
a vertical pad used to separate paragraphs
See Also:
LayoutStyle.getRelatedComponentsPadY(), LayoutStyle.getUnrelatedComponentsPadY()


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/package-summary.html0000644000175000017500000002275712003555424025367 0ustar tonytony com.jgoodies.forms.util (JGoodies Forms 1.6 API)

Package com.jgoodies.forms.util

Consists of Forms framework helper classes for unit conversion and layout styles

See:
          Description

Interface Summary
UnitConverter An interface that describes how to convert general sizes to pixel sizes.
 

Class Summary
AbstractUnitConverter An abstract implementation of the UnitConverter interface that minimizes the effort required to convert font-dependent sizes to pixels.
DefaultUnitConverter This is the default implementation of the UnitConverter interface.
FormUtils A library-internal class that consists only of static utility methods.
LayoutStyle An abstract class that describes a layout and design style guide.
MacLayoutStyle A LayoutStyle that aims to provide layout constants as defined by Microsoft's User Experience Guidelines.
 

Package com.jgoodies.forms.util Description

Consists of Forms framework helper classes for unit conversion and layout styles.

Related Documentation

For more information see:

See Also:
com.jgoodies.forms.builder, com.jgoodies.forms.factories


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/AbstractUnitConverter.html0000644000175000017500000011305112003555424026560 0ustar tonytony AbstractUnitConverter (JGoodies Forms 1.6 API)

com.jgoodies.forms.util
Class AbstractUnitConverter

java.lang.Object
  extended by com.jgoodies.common.bean.Bean
      extended by com.jgoodies.forms.util.AbstractUnitConverter
All Implemented Interfaces:
com.jgoodies.common.bean.ObservableBean, com.jgoodies.common.bean.ObservableBean2, UnitConverter, Serializable
Direct Known Subclasses:
DefaultUnitConverter

public abstract class AbstractUnitConverter
extends com.jgoodies.common.bean.Bean
implements UnitConverter

An abstract implementation of the UnitConverter interface that minimizes the effort required to convert font-dependent sizes to pixels.

Version:
$Revision: 1.8 $
Author:
Karsten Lentzsch
See Also:
DefaultUnitConverter, Size, Sizes, Serialized Form

Field Summary
 
Fields inherited from class com.jgoodies.common.bean.Bean
changeSupport
 
Constructor Summary
AbstractUnitConverter()
           
 
Method Summary
 int centimeterAsPixel(double cm, Component component)
          Converts Centimeters and returns pixels using the resolution of the given component's graphics object.
protected static int centimeterAsPixel(double cm, int dpi)
          Converts Centimeters and returns pixels using the specified resolution.
protected  double computeAverageCharWidth(FontMetrics metrics, String testString)
          Computes and returns the average character width of the specified test string using the given FontMetrics.
 int dialogUnitXAsPixel(int dluX, Component c)
          Converts horizontal dialog units and returns pixels.
protected  int dialogUnitXAsPixel(int dluX, double dialogBaseUnitsX)
          Converts horizontal dialog units and returns pixels.
 int dialogUnitYAsPixel(int dluY, Component c)
          Converts vertical dialog units and returns pixels.
protected  int dialogUnitYAsPixel(int dluY, double dialogBaseUnitsY)
          Converts vertical dialog units and returns pixels.
protected  int getDefaultScreenResolution()
          Computes and returns the default resolution.
protected abstract  double getDialogBaseUnitsX(Component component)
          Gets and returns the horizontal dialog base units.
protected abstract  double getDialogBaseUnitsY(Component component)
          Gets and returns the vertical dialog base units.
protected  int getScreenResolution(Component c)
          Returns the components screen resolution or the default screen resolution if the component is null or has no toolkit assigned yet.
 int inchAsPixel(double in, Component component)
          Converts Inches and returns pixels using the specified resolution.
protected static int inchAsPixel(double in, int dpi)
          Converts Inches and returns pixels using the specified resolution.
 int millimeterAsPixel(double mm, Component component)
          Converts Millimeters and returns pixels using the resolution of the given component's graphics object.
protected static int millimeterAsPixel(double mm, int dpi)
          Converts Millimeters and returns pixels using the specified resolution.
 int pointAsPixel(int pt, Component component)
          Converts DTP Points and returns pixels using the resolution of the given component's graphics object.
protected static int pointAsPixel(int pt, int dpi)
          Converts DTP Points and returns pixels using the specified resolution.
 
Methods inherited from class com.jgoodies.common.bean.Bean
addPropertyChangeListener, addPropertyChangeListener, addVetoableChangeListener, addVetoableChangeListener, createPropertyChangeSupport, fireIndexedPropertyChange, fireIndexedPropertyChange, fireIndexedPropertyChange, fireMultiplePropertiesChanged, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, getPropertyChangeListeners, getPropertyChangeListeners, getVetoableChangeListeners, getVetoableChangeListeners, removePropertyChangeListener, removePropertyChangeListener, removeVetoableChangeListener, removeVetoableChangeListener
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

AbstractUnitConverter

public AbstractUnitConverter()
Method Detail

inchAsPixel

public int inchAsPixel(double in,
                       Component component)
Converts Inches and returns pixels using the specified resolution.

Specified by:
inchAsPixel in interface UnitConverter
Parameters:
in - the Inches
component - the component that provides the graphics object
Returns:
the given Inches as pixels

millimeterAsPixel

public int millimeterAsPixel(double mm,
                             Component component)
Converts Millimeters and returns pixels using the resolution of the given component's graphics object.

Specified by:
millimeterAsPixel in interface UnitConverter
Parameters:
mm - Millimeters
component - the component that provides the graphics object
Returns:
the given Millimeters as pixels

centimeterAsPixel

public int centimeterAsPixel(double cm,
                             Component component)
Converts Centimeters and returns pixels using the resolution of the given component's graphics object.

Specified by:
centimeterAsPixel in interface UnitConverter
Parameters:
cm - Centimeters
component - the component that provides the graphics object
Returns:
the given Centimeters as pixels

pointAsPixel

public int pointAsPixel(int pt,
                        Component component)
Converts DTP Points and returns pixels using the resolution of the given component's graphics object.

Specified by:
pointAsPixel in interface UnitConverter
Parameters:
pt - DTP Points
component - the component that provides the graphics object
Returns:
the given Points as pixels

dialogUnitXAsPixel

public int dialogUnitXAsPixel(int dluX,
                              Component c)
Converts horizontal dialog units and returns pixels. Honors the resolution, dialog font size, platform, and l&f.

Specified by:
dialogUnitXAsPixel in interface UnitConverter
Parameters:
dluX - the horizontal dialog units
c - a Component that provides the font and graphics
Returns:
the given horizontal dialog units as pixels

dialogUnitYAsPixel

public int dialogUnitYAsPixel(int dluY,
                              Component c)
Converts vertical dialog units and returns pixels. Honors the resolution, dialog font size, platform, and l&f.

Specified by:
dialogUnitYAsPixel in interface UnitConverter
Parameters:
dluY - the vertical dialog units
c - a Component that provides the font and graphics
Returns:
the given vertical dialog units as pixels

getDialogBaseUnitsX

protected abstract double getDialogBaseUnitsX(Component component)
Gets and returns the horizontal dialog base units. Implementations are encouraged to cache previously computed dialog base units.

Parameters:
component - a Component that provides the font and graphics
Returns:
the horizontal dialog base units

getDialogBaseUnitsY

protected abstract double getDialogBaseUnitsY(Component component)
Gets and returns the vertical dialog base units. Implementations are encouraged to cache previously computed dialog base units.

Parameters:
component - a Component that provides the font and graphics
Returns:
the vertical dialog base units

inchAsPixel

protected static final int inchAsPixel(double in,
                                       int dpi)
Converts Inches and returns pixels using the specified resolution.

Parameters:
in - the Inches
dpi - the resolution
Returns:
the given Inches as pixels

millimeterAsPixel

protected static final int millimeterAsPixel(double mm,
                                             int dpi)
Converts Millimeters and returns pixels using the specified resolution.

Parameters:
mm - Millimeters
dpi - the resolution
Returns:
the given Millimeters as pixels

centimeterAsPixel

protected static final int centimeterAsPixel(double cm,
                                             int dpi)
Converts Centimeters and returns pixels using the specified resolution.

Parameters:
cm - Centimeters
dpi - the resolution
Returns:
the given Centimeters as pixels

pointAsPixel

protected static final int pointAsPixel(int pt,
                                        int dpi)
Converts DTP Points and returns pixels using the specified resolution.

Parameters:
pt - DTP Points
dpi - the resolution in dpi
Returns:
the given Points as pixels

dialogUnitXAsPixel

protected int dialogUnitXAsPixel(int dluX,
                                 double dialogBaseUnitsX)
Converts horizontal dialog units and returns pixels.

Parameters:
dluX - the horizontal dialog units
dialogBaseUnitsX - the horizontal dialog base units
Returns:
the given dialog base units as pixels

dialogUnitYAsPixel

protected int dialogUnitYAsPixel(int dluY,
                                 double dialogBaseUnitsY)
Converts vertical dialog units and returns pixels.

Parameters:
dluY - the vertical dialog units
dialogBaseUnitsY - the vertical dialog base units
Returns:
the given dialog base units as pixels

computeAverageCharWidth

protected double computeAverageCharWidth(FontMetrics metrics,
                                         String testString)
Computes and returns the average character width of the specified test string using the given FontMetrics. The test string shall represent an "average" text.

Parameters:
metrics - used to compute the test string's width
testString - the string that shall represent an "average" text
Returns:
the test string's average character width.

getScreenResolution

protected int getScreenResolution(Component c)
Returns the components screen resolution or the default screen resolution if the component is null or has no toolkit assigned yet.

Parameters:
c - the component to ask for a toolkit
Returns:
the component's screen resolution

getDefaultScreenResolution

protected int getDefaultScreenResolution()
Computes and returns the default resolution.

Returns:
the default screen resolution


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/LayoutStyle.html0000644000175000017500000010500212003555424024560 0ustar tonytony LayoutStyle (JGoodies Forms 1.6 API)

com.jgoodies.forms.util
Class LayoutStyle

java.lang.Object
  extended by com.jgoodies.forms.util.LayoutStyle
Direct Known Subclasses:
MacLayoutStyle

public abstract class LayoutStyle
extends Object

An abstract class that describes a layout and design style guide. It provides constants used to lay out panels consistently.

Note: This class is work in progress and the API may change without notice. Therefore it is recommended to not write custom subclasses for production code. A future version of this class may collaborate with a class LogicalSize or StyledSize.

Version:
$Revision: 1.15 $
Author:
Karsten Lentzsch
See Also:
MacLayoutStyle, WindowsLayoutStyle, FormSpecs, Borders

Constructor Summary
LayoutStyle()
           
 
Method Summary
abstract  ConstantSize getButtonBarPad()
          Returns a pad used to separate a button bar from a component.
static LayoutStyle getCurrent()
          Returns the current LayoutStyle.
abstract  Size getDefaultButtonHeight()
          Returns this style's default button height.
abstract  Size getDefaultButtonWidth()
          Returns this style's default button width.
abstract  ConstantSize getDialogMarginX()
          Returns this style's horizontal margin for general dialogs.
abstract  ConstantSize getDialogMarginY()
          Returns this style's vertical margin for general dialogs.
abstract  ConstantSize getLabelComponentPadX()
          Returns a gap used to separate a label and associated control.
abstract  ConstantSize getLabelComponentPadY()
          Returns a gap used to separate a label and associated control.
abstract  ConstantSize getLinePad()
          Returns a narrow vertical pad used to separate lines.
abstract  ConstantSize getNarrowLinePad()
          Returns a narrow vertical pad used to separate lines.
abstract  ConstantSize getParagraphPad()
          Returns a pad used to separate paragraphs.
abstract  ConstantSize getRelatedComponentsPadX()
          Returns a horizontal gap used to separate related controls.
abstract  ConstantSize getRelatedComponentsPadY()
          Returns a vertical gap used to separate related controls.
abstract  ConstantSize getTabbedDialogMarginX()
          Returns this style's horizontal margin for dialogs that consist of a tabbed pane.
abstract  ConstantSize getTabbedDialogMarginY()
          Returns this style's vertical margin for dialogs that consist of a tabbed pane.
abstract  ConstantSize getUnrelatedComponentsPadX()
          Returns a horizontal gap used to separate unrelated controls.
abstract  ConstantSize getUnrelatedComponentsPadY()
          Returns a vertical gap used to separate unrelated controls.
static void setCurrent(LayoutStyle newLayoutStyle)
          Set a new LayoutStyle.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

LayoutStyle

public LayoutStyle()
Method Detail

getCurrent

public static LayoutStyle getCurrent()
Returns the current LayoutStyle.

Returns:
the current LayoutStyle

setCurrent

public static void setCurrent(LayoutStyle newLayoutStyle)
Set a new LayoutStyle.

Parameters:
newLayoutStyle - the style to be set

getDefaultButtonWidth

public abstract Size getDefaultButtonWidth()
Returns this style's default button width.

Returns:
the default button width
See Also:
getDefaultButtonHeight()

getDefaultButtonHeight

public abstract Size getDefaultButtonHeight()
Returns this style's default button height.

Returns:
the default button height
See Also:
getDefaultButtonWidth()

getDialogMarginX

public abstract ConstantSize getDialogMarginX()
Returns this style's horizontal margin for general dialogs.

Returns:
the horizontal margin for general dialogs
See Also:
getDialogMarginY(), getTabbedDialogMarginX()

getDialogMarginY

public abstract ConstantSize getDialogMarginY()
Returns this style's vertical margin for general dialogs.

Returns:
the vertical margin for general dialogs
See Also:
getDialogMarginX(), getTabbedDialogMarginY()

getTabbedDialogMarginX

public abstract ConstantSize getTabbedDialogMarginX()
Returns this style's horizontal margin for dialogs that consist of a tabbed pane.

Returns:
the horizontal margin for dialogs that consist of a tabbed pane
Since:
1.0.3
See Also:
getTabbedDialogMarginY(), getDialogMarginX()

getTabbedDialogMarginY

public abstract ConstantSize getTabbedDialogMarginY()
Returns this style's vertical margin for dialogs that consist of a tabbed pane.

Returns:
the vertical margin for dialogs that consist of a tabbed pane
Since:
1.0.3
See Also:
getTabbedDialogMarginX(), getDialogMarginY()

getLabelComponentPadX

public abstract ConstantSize getLabelComponentPadX()
Returns a gap used to separate a label and associated control.

Returns:
a gap between label and associated control
See Also:
getRelatedComponentsPadX(), getUnrelatedComponentsPadX()

getLabelComponentPadY

public abstract ConstantSize getLabelComponentPadY()
Returns a gap used to separate a label and associated control.

Returns:
a gap between label and associated control
Since:
1.4
See Also:
getRelatedComponentsPadY(), getUnrelatedComponentsPadY()

getRelatedComponentsPadX

public abstract ConstantSize getRelatedComponentsPadX()
Returns a horizontal gap used to separate related controls.

Returns:
a horizontal gap between related controls
See Also:
getLabelComponentPadX(), getRelatedComponentsPadY(), getUnrelatedComponentsPadX()

getRelatedComponentsPadY

public abstract ConstantSize getRelatedComponentsPadY()
Returns a vertical gap used to separate related controls.

Returns:
a vertical gap between related controls
See Also:
getRelatedComponentsPadX(), getUnrelatedComponentsPadY()

getUnrelatedComponentsPadX

public abstract ConstantSize getUnrelatedComponentsPadX()
Returns a horizontal gap used to separate unrelated controls.

Returns:
a horizontal gap between unrelated controls
See Also:
getLabelComponentPadX(), getUnrelatedComponentsPadY(), getRelatedComponentsPadX()

getUnrelatedComponentsPadY

public abstract ConstantSize getUnrelatedComponentsPadY()
Returns a vertical gap used to separate unrelated controls.

Returns:
a vertical gap between unrelated controls
See Also:
getUnrelatedComponentsPadX(), getRelatedComponentsPadY()

getNarrowLinePad

public abstract ConstantSize getNarrowLinePad()
Returns a narrow vertical pad used to separate lines.

Returns:
a narrow vertical pad used to separate lines
See Also:
getLinePad(), getParagraphPad()

getLinePad

public abstract ConstantSize getLinePad()
Returns a narrow vertical pad used to separate lines.

Returns:
a vertical pad used to separate lines
See Also:
getNarrowLinePad(), getParagraphPad()

getParagraphPad

public abstract ConstantSize getParagraphPad()
Returns a pad used to separate paragraphs.

Returns:
a vertical pad used to separate paragraphs
See Also:
getNarrowLinePad(), getLinePad()

getButtonBarPad

public abstract ConstantSize getButtonBarPad()
Returns a pad used to separate a button bar from a component.

Returns:
a vertical pad used to separate paragraphs
Since:
1.0.3
See Also:
getRelatedComponentsPadY(), getUnrelatedComponentsPadY()


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/UnitConverter.html0000644000175000017500000004136412003555424025103 0ustar tonytony UnitConverter (JGoodies Forms 1.6 API)

com.jgoodies.forms.util
Interface UnitConverter

All Known Implementing Classes:
AbstractUnitConverter, DefaultUnitConverter

public interface UnitConverter

An interface that describes how to convert general sizes to pixel sizes. For example, dialog units require a conversion that honors the font and resolution. The Sizes class delegates all size conversions to an implementation of this interface.

Version:
$Revision: 1.7 $
Author:
Karsten Lentzsch
See Also:
Sizes, ConstantSize, AbstractUnitConverter, DefaultUnitConverter

Method Summary
 int centimeterAsPixel(double cm, Component component)
          Converts Centimeters and returns pixels using the resolution of the given component's graphics object.
 int dialogUnitXAsPixel(int dluX, Component component)
          Converts horizontal dialog units and returns pixels.
 int dialogUnitYAsPixel(int dluY, Component component)
          Converts vertical dialog units and returns pixels.
 int inchAsPixel(double in, Component component)
          Converts Inches and returns pixels using the specified resolution.
 int millimeterAsPixel(double mm, Component component)
          Converts Millimeters and returns pixels using the resolution of the given component's graphics object.
 int pointAsPixel(int pt, Component component)
          Converts DTP Points and returns pixels using the resolution of the given component's graphics object.
 

Method Detail

inchAsPixel

int inchAsPixel(double in,
                Component component)
Converts Inches and returns pixels using the specified resolution.

Parameters:
in - the Inches
component - the component that provides the graphics object
Returns:
the given Inches as pixels

millimeterAsPixel

int millimeterAsPixel(double mm,
                      Component component)
Converts Millimeters and returns pixels using the resolution of the given component's graphics object.

Parameters:
mm - Millimeters
component - the component that provides the graphics object
Returns:
the given Millimeters as pixels

centimeterAsPixel

int centimeterAsPixel(double cm,
                      Component component)
Converts Centimeters and returns pixels using the resolution of the given component's graphics object.

Parameters:
cm - Centimeters
component - the component that provides the graphics object
Returns:
the given Centimeters as pixels

pointAsPixel

int pointAsPixel(int pt,
                 Component component)
Converts DTP Points and returns pixels using the resolution of the given component's graphics object.

Parameters:
pt - DTP Points
component - the component that provides the graphics object
Returns:
the given Points as pixels

dialogUnitXAsPixel

int dialogUnitXAsPixel(int dluX,
                       Component component)
Converts horizontal dialog units and returns pixels. Honors the resolution, dialog font size, platform and look&feel.

Parameters:
dluX - the horizontal dialog units
component - a component that provides the font and graphics
Returns:
the given horizontal dialog units as pixels

dialogUnitYAsPixel

int dialogUnitYAsPixel(int dluY,
                       Component component)
Converts vertical dialog units and returns pixels. Honors the resolution, dialog font size, platform and look&feel.

Parameters:
dluY - the vertical dialog units
component - a component that provides the font and graphics
Returns:
the given vertical dialog units as pixels


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/com/jgoodies/forms/util/DefaultUnitConverter.html0000644000175000017500000010216612003555424026406 0ustar tonytony DefaultUnitConverter (JGoodies Forms 1.6 API)

com.jgoodies.forms.util
Class DefaultUnitConverter

java.lang.Object
  extended by com.jgoodies.common.bean.Bean
      extended by com.jgoodies.forms.util.AbstractUnitConverter
          extended by com.jgoodies.forms.util.DefaultUnitConverter
All Implemented Interfaces:
com.jgoodies.common.bean.ObservableBean, com.jgoodies.common.bean.ObservableBean2, UnitConverter, Serializable

public final class DefaultUnitConverter
extends AbstractUnitConverter

This is the default implementation of the UnitConverter interface. It converts horizontal and vertical dialog base units to pixels.

The horizontal base unit is equal to the average width, in pixels, of the characters in the system font; the vertical base unit is equal to the height, in pixels, of the font. Each horizontal base unit is equal to 4 horizontal dialog units; each vertical base unit is equal to 8 vertical dialog units.

The DefaultUnitConverter computes dialog base units using a default font and a test string for the average character width. You can configure the font and the test string via the bound Bean properties defaultDialogFont and averageCharacterWidthTestString. See also Microsoft's suggestion for a custom computation custom computation. More information how to use dialog units in screen design can be found in Microsoft's Design Specifications and Guidelines.

Since the Forms 1.1 this converter logs font information at the CONFIG level.

Version:
$Revision: 1.23 $
Author:
Karsten Lentzsch
See Also:
UnitConverter, Size, Sizes, Serialized Form

Field Summary
static String BALANCED_AVERAGE_CHARACTER_TEST_STRING
           
static String MODERN_AVERAGE_CHARACTER_TEST_STRING
           
static String OLD_AVERAGE_CHARACTER_TEST_STRING
           
static String PROPERTY_AVERAGE_CHARACTER_WIDTH_TEST_STRING
           
static String PROPERTY_DEFAULT_DIALOG_FONT
           
 
Fields inherited from class com.jgoodies.common.bean.Bean
changeSupport
 
Method Summary
 String getAverageCharacterWidthTestString()
          Returns the string used to compute the average character width.
 Font getDefaultDialogFont()
          Returns the dialog font that is used to compute the dialog base units.
protected  double getDialogBaseUnitsX(Component component)
          Returns the cached or computed horizontal dialog base units.
protected  double getDialogBaseUnitsY(Component component)
          Returns the cached or computed vertical dialog base units for the given component.
static DefaultUnitConverter getInstance()
          Lazily instantiates and returns the sole instance.
 void setAverageCharacterWidthTestString(String newTestString)
          Sets a string that will be used to compute the average character width.
 void setDefaultDialogFont(Font newFont)
          Sets a dialog font that will be used to compute the dialog base units.
 
Methods inherited from class com.jgoodies.forms.util.AbstractUnitConverter
centimeterAsPixel, centimeterAsPixel, computeAverageCharWidth, dialogUnitXAsPixel, dialogUnitXAsPixel, dialogUnitYAsPixel, dialogUnitYAsPixel, getDefaultScreenResolution, getScreenResolution, inchAsPixel, inchAsPixel, millimeterAsPixel, millimeterAsPixel, pointAsPixel, pointAsPixel
 
Methods inherited from class com.jgoodies.common.bean.Bean
addPropertyChangeListener, addPropertyChangeListener, addVetoableChangeListener, addVetoableChangeListener, createPropertyChangeSupport, fireIndexedPropertyChange, fireIndexedPropertyChange, fireIndexedPropertyChange, fireMultiplePropertiesChanged, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, fireVetoableChange, getPropertyChangeListeners, getPropertyChangeListeners, getVetoableChangeListeners, getVetoableChangeListeners, removePropertyChangeListener, removePropertyChangeListener, removeVetoableChangeListener, removeVetoableChangeListener
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

PROPERTY_AVERAGE_CHARACTER_WIDTH_TEST_STRING

public static final String PROPERTY_AVERAGE_CHARACTER_WIDTH_TEST_STRING
See Also:
Constant Field Values

PROPERTY_DEFAULT_DIALOG_FONT

public static final String PROPERTY_DEFAULT_DIALOG_FONT
See Also:
Constant Field Values

OLD_AVERAGE_CHARACTER_TEST_STRING

public static final String OLD_AVERAGE_CHARACTER_TEST_STRING
Since:
1.6
See Also:
Constant Field Values

MODERN_AVERAGE_CHARACTER_TEST_STRING

public static final String MODERN_AVERAGE_CHARACTER_TEST_STRING
Since:
1.4
See Also:
Constant Field Values

BALANCED_AVERAGE_CHARACTER_TEST_STRING

public static final String BALANCED_AVERAGE_CHARACTER_TEST_STRING
Since:
1.4
See Also:
Constant Field Values
Method Detail

getInstance

public static DefaultUnitConverter getInstance()
Lazily instantiates and returns the sole instance.

Returns:
the lazily instantiated sole instance

getAverageCharacterWidthTestString

public String getAverageCharacterWidthTestString()
Returns the string used to compute the average character width. By default it is initialized to BALANCED_AVERAGE_CHARACTER_TEST_STRING.

Returns:
the test string used to compute the average character width

setAverageCharacterWidthTestString

public void setAverageCharacterWidthTestString(String newTestString)
Sets a string that will be used to compute the average character width. By default it is initialized to BALANCED_AVERAGE_CHARACTER_TEST_STRING. You can provide other test strings, for example:
  • "Xximeee"
  • "ABCEDEFHIJKLMNOPQRSTUVWXYZ"
  • "abcdefghijklmnopqrstuvwxyz"

Parameters:
newTestString - the test string to be used
Throws:
NullPointerException - if newTestString is null
IllegalArgumentException - if newTestString is empty or whitespace

getDefaultDialogFont

public Font getDefaultDialogFont()
Returns the dialog font that is used to compute the dialog base units. If a default dialog font has been set using setDefaultDialogFont(Font), this font will be returned. Otherwise a cached fallback will be lazily created.

Returns:
the font used to compute the dialog base units

setDefaultDialogFont

public void setDefaultDialogFont(Font newFont)
Sets a dialog font that will be used to compute the dialog base units.

Parameters:
newFont - the default dialog font to be set

getDialogBaseUnitsX

protected double getDialogBaseUnitsX(Component component)
Returns the cached or computed horizontal dialog base units.

Specified by:
getDialogBaseUnitsX in class AbstractUnitConverter
Parameters:
component - a Component that provides the font and graphics
Returns:
the horizontal dialog base units

getDialogBaseUnitsY

protected double getDialogBaseUnitsY(Component component)
Returns the cached or computed vertical dialog base units for the given component.

Specified by:
getDialogBaseUnitsY in class AbstractUnitConverter
Parameters:
component - a Component that provides the font and graphics
Returns:
the vertical dialog base units


Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/index.html0000644000175000017500000000264312003555424016714 0ustar tonytony JGoodies Forms 1.6 API <H2> Frame Alert</H2> <P> This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. <BR> Link to<A HREF="overview-summary.html">Non-frame version.</A> jgoodies-forms-1.6.0/docs/api/deprecated-list.html0000644000175000017500000003542712003555424020664 0ustar tonytony Deprecated List (JGoodies Forms 1.6 API)

Deprecated API


Contents
Deprecated Classes
com.jgoodies.forms.builder.ButtonBarBuilder2
          Replaced by the ButtonBarBuilder 
 

Deprecated Fields
com.jgoodies.forms.factories.Borders.BUTTON_BAR_GAP_BORDER
          Replaced by Borders.BUTTON_BAR_PAD 
com.jgoodies.forms.factories.Borders.DIALOG_BORDER
          Replaced by Borders.DIALOG 
com.jgoodies.forms.factories.Borders.DLU14_BORDER
          Replaced by Borders.DLU14 
com.jgoodies.forms.factories.Borders.DLU2_BORDER
          Replaced by Borders.DLU2 
com.jgoodies.forms.factories.Borders.DLU21_BORDER
          Replaced by Borders.DLU21 
com.jgoodies.forms.factories.Borders.DLU4_BORDER
          Replaced by Borders.DLU4 
com.jgoodies.forms.factories.Borders.DLU7_BORDER
          Replaced by Borders.DLU7 
com.jgoodies.forms.factories.Borders.EMPTY_BORDER
          Replaced by Borders.EMPTY 
com.jgoodies.forms.factories.Borders.TABBED_DIALOG_BORDER
          Replaced by Borders.TABBED_DIALOG 
 

Deprecated Methods
com.jgoodies.forms.builder.DefaultFormBuilder.getDefaultRowSpec()
          Obsolete; will be deleted from the next version 
com.jgoodies.forms.builder.DefaultFormBuilder.getLeadingColumnOffset()
          Obsolete; will be deleted from the next version 
com.jgoodies.forms.builder.DefaultFormBuilder.getLineGapSpec()
          Obsolete; will be deleted from the next version 
com.jgoodies.forms.builder.DefaultFormBuilder.isRowGroupingEnabled()
          Obsolete; will be deleted from the next version 
com.jgoodies.forms.builder.PanelBuilder.setBorder(Border)
          Replaced by PanelBuilder.border(Border) 
com.jgoodies.forms.builder.PanelBuilder.setDefaultDialogBorder()
          Replaced by #border(Borders.DIALOG) 
com.jgoodies.forms.builder.DefaultFormBuilder.setDefaultRowSpec(RowSpec)
          Replaced by DefaultFormBuilder.defaultRowSpec(RowSpec) 
com.jgoodies.forms.builder.DefaultFormBuilder.setLeadingColumnOffset(int)
          Replaced by DefaultFormBuilder.leadingColumnOffset(int) 
com.jgoodies.forms.builder.DefaultFormBuilder.setLineGapSize(ConstantSize)
          Replaced by DefaultFormBuilder.lineGapSize(ConstantSize) 
com.jgoodies.forms.builder.PanelBuilder.setOpaque(boolean)
          Replaced by PanelBuilder.opaque(boolean) 
com.jgoodies.forms.builder.DefaultFormBuilder.setParagraphGapSize(ConstantSize)
          Replaced by DefaultFormBuilder.lineGapSize(ConstantSize) 
com.jgoodies.forms.builder.DefaultFormBuilder.setRowGroupingEnabled(boolean)
          Replaced by DefaultFormBuilder.rowGroupingEnabled(boolean) 
 



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/overview-summary.html0000644000175000017500000002212512003555424021143 0ustar tonytony Overview (JGoodies Forms 1.6 API)

JGoodies Forms 1.6 API

This document describes the API of the JGoodies Forms, a framework that helps you lay out and implement elegant Swing panels quickly and consistently.

See:
          Description

Packages
com.jgoodies.forms.builder Contains optional builder classes of the Forms framework.
com.jgoodies.forms.debug Consists of optional classes that help you find, understand and fix layout problems
com.jgoodies.forms.extras Contains optional Forms framework classes that ship only with the JGoodies Forms source distribution and are not yet part of the binary Forms library.
com.jgoodies.forms.factories Consists of optional Forms framework factory classes that assist you in building consistent forms quickly
com.jgoodies.forms.internal  
com.jgoodies.forms.layout Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints
com.jgoodies.forms.util Consists of Forms framework helper classes for unit conversion and layout styles

 

This document describes the API of the JGoodies Forms, a framework that helps you lay out and implement elegant Swing panels quickly and consistently. Forms makes simple things easy and the hard stuff possible, the good design easy and the bad difficult.

Forms 1.5 requires Java 6 or later. Find Forms versions for older Java at here.

Getting Started

Forms ships with a tutorial and tutorial sources. The compiled tutorial is available as Forms Demo. And you can find more examples at www.JGoodies.com/freeware. As a next step you can study the JGoodies articles and presentations.

Open Issue

There's a weakness in the FormLayout that may require an API extension. Components that span multiple columns or rows do not affect the column width or row height resp., but can in some cases expand the container.
I'm looking for a means to let the layout grid honor these components that is both powerful and easy to understand. See item #3.5 in the accompanying FAQ for details and a workaround.



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/serialized-form.html0000644000175000017500000011245012003555424020677 0ustar tonytony Serialized Form (JGoodies Forms 1.6 API)

Serialized Form


Package com.jgoodies.forms.debug

Class com.jgoodies.forms.debug.FormDebugPanel extends JPanel implements Serializable

Serialized Fields

paintInBackground

boolean paintInBackground
Specifies whether the grid shall be painted in the background. Is off by default and so the grid is painted in the foreground.


paintDiagonals

boolean paintDiagonals
Specifies whether the container's diagonals should be painted.


paintRows

boolean paintRows
Specifies whether all rows shall be painted. Enabled by default.


gridColor

Color gridColor
Holds the color used to paint the debug grid.


Package com.jgoodies.forms.factories

Class com.jgoodies.forms.factories.Borders.EmptyBorder extends AbstractBorder implements Serializable

Serialized Fields

top

ConstantSize top

left

ConstantSize left

bottom

ConstantSize bottom

right

ConstantSize right

Class com.jgoodies.forms.factories.CC extends Object implements Serializable


Package com.jgoodies.forms.layout

Class com.jgoodies.forms.layout.BoundedSize extends Object implements Serializable

Serialized Fields

basis

Size basis
Holds the base size.


lowerBound

Size lowerBound
Holds an optional lower bound.


upperBound

Size upperBound
Holds an optional upper bound.

Class com.jgoodies.forms.layout.CellConstraints extends Object implements Serializable

Serialized Fields

gridX

int gridX
Describes the component's horizontal grid origin (starts at 1).


gridY

int gridY
Describes the component's vertical grid origin (starts at 1).


gridWidth

int gridWidth
Describes the component's horizontal grid extend (number of cells).


gridHeight

int gridHeight
Describes the component's vertical grid extent (number of cells).


hAlign

CellConstraints.Alignment hAlign
Describes the component's horizontal alignment.


vAlign

CellConstraints.Alignment vAlign
Describes the component's vertical alignment.


insets

Insets insets
Describes the component's Insets in it's display area.


honorsVisibility

Boolean honorsVisibility
Describes whether individual components shall be taken into account by the FormLayout if 1) they are invisible and 2) the FormLayout does not honor the visibility. See FormLayout.setHonorsVisibility(boolean) and FormLayout.setHonorsVisibility(Component, Boolean) for a full description of this feature.

Class com.jgoodies.forms.layout.CellConstraints.Alignment extends Object implements Serializable

Serialization Methods

readResolve

private Object readResolve()
Serialized Fields

ordinal

int ordinal

Class com.jgoodies.forms.layout.ColumnSpec extends FormSpec implements Serializable

Class com.jgoodies.forms.layout.ConstantSize extends Object implements Serializable

Serialized Fields

value

double value

unit

ConstantSize.Unit unit

Class com.jgoodies.forms.layout.ConstantSize.Unit extends Object implements Serializable

Serialization Methods

readResolve

private Object readResolve()
Serialized Fields

ordinal

int ordinal

Class com.jgoodies.forms.layout.FormLayout extends Object implements Serializable

Serialization Methods

writeObject

private void writeObject(ObjectOutputStream out)
                  throws IOException
In addition to the default serialization mechanism this class invalidates the component size cache. The cache will be populated again after the deserialization. Also, the fields colComponents and rowComponents have been marked as transient to exclude them from the serialization.

Throws:
IOException
Serialized Fields

colSpecs

List<E> colSpecs
Holds the column specifications.

See Also:
ColumnSpec, FormLayout.getColumnCount(), FormLayout.getColumnSpec(int), FormLayout.appendColumn(ColumnSpec), FormLayout.insertColumn(int, ColumnSpec), FormLayout.removeColumn(int)

rowSpecs

List<E> rowSpecs
Holds the row specifications.

See Also:
RowSpec, FormLayout.getRowCount(), FormLayout.getRowSpec(int), FormLayout.appendRow(RowSpec), FormLayout.insertRow(int, RowSpec), FormLayout.removeRow(int)

colGroupIndices

int[][] colGroupIndices
Holds the column groups as an array of arrays of column indices.

See Also:
FormLayout.getColumnGroups(), FormLayout.setColumnGroups(int[][]), FormLayout.addGroupedColumn(int)

rowGroupIndices

int[][] rowGroupIndices
Holds the row groups as an array of arrays of row indices.

See Also:
FormLayout.getRowGroups(), FormLayout.setRowGroups(int[][]), FormLayout.addGroupedRow(int)

constraintMap

Map<K,V> constraintMap
Maps components to their associated CellConstraints.

See Also:
CellConstraints, FormLayout.getConstraints(Component), FormLayout.setConstraints(Component, CellConstraints)

honorsVisibility

boolean honorsVisibility

componentSizeCache

com.jgoodies.forms.layout.FormLayout.ComponentSizeCache componentSizeCache
Caches component minimum and preferred sizes. All requests for component sizes shall be directed to the cache.


minimumWidthMeasure

FormLayout.Measure minimumWidthMeasure
These functional objects are used to measure component sizes. They abstract from horizontal and vertical orientation and so, allow to implement the layout algorithm for both orientations with a single set of methods.


minimumHeightMeasure

FormLayout.Measure minimumHeightMeasure

preferredWidthMeasure

FormLayout.Measure preferredWidthMeasure

preferredHeightMeasure

FormLayout.Measure preferredHeightMeasure

Class com.jgoodies.forms.layout.FormSpec extends Object implements Serializable

Serialized Fields

defaultAlignment

FormSpec.DefaultAlignment defaultAlignment
Holds the default alignment that will be used if a cell does not override this default.


size

Size size
Holds the size that describes how to size this column or row.


resizeWeight

double resizeWeight
Holds the resize weight; is 0 if not used.

Class com.jgoodies.forms.layout.FormSpec.DefaultAlignment extends Object implements Serializable

Serialization Methods

readResolve

private Object readResolve()
Serialized Fields

ordinal

int ordinal

Class com.jgoodies.forms.layout.FormSpecParser.FormLayoutParseException extends RuntimeException implements Serializable

Class com.jgoodies.forms.layout.PrototypeSize extends Object implements Serializable

Serialized Fields

prototype

String prototype

Class com.jgoodies.forms.layout.RowSpec extends FormSpec implements Serializable


Package com.jgoodies.forms.util

Class com.jgoodies.forms.util.AbstractUnitConverter extends com.jgoodies.common.bean.Bean implements Serializable

Class com.jgoodies.forms.util.DefaultUnitConverter extends AbstractUnitConverter implements Serializable

Serialized Fields

averageCharWidthTestString

String averageCharWidthTestString
Holds the string that is used to compute the average character width. Since 1.6 the default value is the balanced average character test string, where it was just "X" before.


defaultDialogFont

Font defaultDialogFont
Holds a custom font that is used to compute the global dialog base units. If not set, a fallback font is is lazily created in method #getCachedDefaultDialogFont, which in turn looks up a font in method #lookupDefaultDialogFont.


cachedGlobalDialogBaseUnits

com.jgoodies.forms.util.DefaultUnitConverter.DialogBaseUnits cachedGlobalDialogBaseUnits
Holds the lazily created cached global dialog base units that are used if a component is not (yet) available - for example in a Border.


cachedDialogBaseUnits

com.jgoodies.forms.util.DefaultUnitConverter.DialogBaseUnits cachedDialogBaseUnits
Holds the horizontal dialog base units that are valid for the FontMetrics stored in cachedFontMetrics.


cachedFontMetrics

FontMetrics cachedFontMetrics
Holds the FontMetrics used to compute the per-component dialog units. The latter are valid, if a FontMetrics equals this stored metrics.


cachedDefaultDialogFont

Font cachedDefaultDialogFont
Holds a cached default dialog font that is used as fallback, if no default dialog font has been set.

See Also:
DefaultUnitConverter.getDefaultDialogFont(), DefaultUnitConverter.setDefaultDialogFont(Font)



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/overview-frame.html0000644000175000017500000000362312003555424020542 0ustar tonytony Overview List (JGoodies Forms 1.6 API)
All Classes

Packages
com.jgoodies.forms.builder
com.jgoodies.forms.debug
com.jgoodies.forms.extras
com.jgoodies.forms.factories
com.jgoodies.forms.internal
com.jgoodies.forms.layout
com.jgoodies.forms.util

  jgoodies-forms-1.6.0/docs/api/help-doc.html0000644000175000017500000002350512003555424017300 0ustar tonytony API Help (JGoodies Forms 1.6 API)



How This API Document Is Organized

This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

Overview

The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

Package

Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types

Class/Interface

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary

  • Field Detail
  • Constructor Detail
  • Method Detail
Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

Annotation Type

Each annotation type has its own separate page with the following sections:

  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail

Enum

Each enum has its own separate page with the following sections:

  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail

Use

Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

Tree (Class Hierarchy)

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.

Deprecated API

The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

Index

The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

Prev/Next

These links take you to the next or previous class, interface, package, or related page.

Frames/No Frames

These links show and hide the HTML frames. All pages are available with or without frames.

Serialized Form

Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

Constant Field Values

The Constant Field Values page lists the static final fields and their values.

This help file applies to API documentation generated using the standard doclet.



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/api/overview-tree.html0000644000175000017500000005034612003555424020413 0ustar tonytony Class Hierarchy (JGoodies Forms 1.6 API)

Hierarchy For All Packages

Package Hierarchies:
com.jgoodies.forms.builder, com.jgoodies.forms.debug, com.jgoodies.forms.extras, com.jgoodies.forms.factories, com.jgoodies.forms.internal, com.jgoodies.forms.layout, com.jgoodies.forms.util

Class Hierarchy

Interface Hierarchy



Copyright © 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. jgoodies-forms-1.6.0/docs/tips.html0000644000175000017500000001662012003555436016016 0ustar tonytony JGoodies Forms :: Tips & Tricks
:: JGOODIES :: Forms

:: Tips & Tricks ::

Consistency

To design consistently over panels, team members, projects and platforms:
  • Favor factories over builders
  • Favor builders over a pure FormLayout use
  • Favor logical sizes over constant sizes
  • Avoid pixel-sizes
  • Make your layouts stable - use bounded sizes
  • Follow a layout style guide

Good Design Practices

  • Group columns where appropriate
  • Group component rows
  • Balance your design
  • Consider to use symmetry
  • Favor white space over separators
  • Favor separators over TitledBorders
  • Remove visual clutter
  • Reduce your design to its essence
  • Add white space where appropriate
  • Use aesthetic aspect ratios

Good Implementation Practices

  • Favor factories over builders
  • Favor specialized over general builders
  • Favor a panel border over border cols/rows
  • Favor a logical border over constant borders
  • Use a simple grid; extract complex sublayouts
  • Make your layout easy to read:
    • favor string col/row specifications over object specs
    • format your layout specification
    • format your builder code to reflect the layout grid
    • specify columns statically
  • Make simple layouts easy to understand:
    • specify rows statically if there are only a couple of rows
    • favor row numbers over row variables
    • favor static cell constraints over tricky builder cursor commands
    • You should have more components than builder commands
  • Make larger layouts easy to modify:
    • favor row variables over row numbers
    • favor the DefaultFormBuilder over PanelBuilder
  • Favor using and vending JPanels over extending JPanel

Precise Layout

  • Favor non-pixel sizes over pixel-sizes
  • Favor Forms builders over the FormLayout
  • Favor a single layout over nested layouts
  • Group component rows
  • Override a component's min/pref size methods judiciously
  • Avoid to set a component's min/pref (pixel) size
  • Use look&feels that provide a precise micro-design

General Advice on Builders

Write layout code that is easy to understand! Explicit row specifications and cell constraints make your layout easier to understand - but harder to maintain. It is temptive to use the DefaultFormBuilder all the time and to let it add rows automatically. Use a simpler style if it increases the code readability.

If the predefined builders don't fit your needs, write your own!

The given code is meant to assist you, but it should in no way stiffle your creativity. The Forms implementation just reflects the current state of my findings about good design and implementation practices. If you've found something other useful, don't hesitate to extend the Forms. I would appreciate if you send me your extension.

(c) 2012 JGoodies
 
jgoodies-forms-1.6.0/src/0000755000175000017500000000000012052333450013775 5ustar tonytonyjgoodies-forms-1.6.0/src/main/0000755000175000017500000000000012052333443014723 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/0000755000175000017500000000000012052333465015650 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/overview.html0000644000175000017500000000632311777333036020417 0ustar tonytony This document describes the API of the JGoodies Forms, a framework that helps you lay out and implement elegant Swing panels quickly and consistently. Forms makes simple things easy and the hard stuff possible, the good design easy and the bad difficult.

Forms 1.5 requires Java 6 or later. Find Forms versions for older Java at here.

Getting Started

Forms ships with a tutorial and tutorial sources. The compiled tutorial is available as Forms Demo. And you can find more examples at www.JGoodies.com/freeware. As a next step you can study the JGoodies articles and presentations.

Open Issue

There's a weakness in the FormLayout that may require an API extension. Components that span multiple columns or rows do not affect the column width or row height resp., but can in some cases expand the container.
I'm looking for a means to let the layout grid honor these components that is both powerful and easy to understand. See item #3.5 in the accompanying FAQ for details and a workaround. jgoodies-forms-1.6.0/src/main/java/META-INF/0000755000175000017500000000000012003555436017010 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/META-INF/MANIFEST.MF0000644000175000017500000000014712003555434020442 0ustar tonytonyManifest-Version: 1.0 Ant-Version: Apache Ant 1.8.2 Created-By: 1.7.0_05-b05 (Oracle Corporation) jgoodies-forms-1.6.0/src/main/java/com/0000755000175000017500000000000011731041650016421 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/0000755000175000017500000000000011731041650020224 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/0000755000175000017500000000000011753011232021347 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/factories/0000755000175000017500000000000011761072630023336 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/factories/package.html0000644000175000017500000000463211731041662025622 0ustar tonytony Consists of optional Forms framework factory classes that assist you in building consistent forms quickly.

Related Documentation

For more information see: @see com.jgoodies.forms.layout @see com.jgoodies.forms.builder jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/factories/DefaultComponentFactory.java0000644000175000017500000005243511743430140031003 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.factories; import static com.jgoodies.common.base.Preconditions.checkArgument; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Insets; import java.awt.LayoutManager; import javax.accessibility.AccessibleContext; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.SwingConstants; import javax.swing.UIManager; import com.jgoodies.common.base.Preconditions; import com.jgoodies.common.base.Strings; import com.jgoodies.common.swing.MnemonicUtils; import com.jgoodies.forms.layout.Sizes; import com.jgoodies.forms.util.FormUtils; /** * A singleton implementation of the {@link ComponentFactory} interface * that creates UI components as required by the * {@link com.jgoodies.forms.builder.PanelBuilder}.

* * The texts used in methods {@code #createLabel(String)} and * {@code #createTitle(String)} can contain an optional mnemonic marker. * The mnemonic and mnemonic index are indicated by a single ampersand * (&). For example "&Save", * or "Save &as". To use the ampersand itself * duplicate it, for example "Look&&Feel". * * @author Karsten Lentzsch * @version $Revision: 1.21 $ */ public class DefaultComponentFactory implements ComponentFactory { /** * Holds the single instance of this class. */ private static final DefaultComponentFactory INSTANCE = new DefaultComponentFactory(); // Instance ************************************************************* /** * Returns the sole instance of this factory class. * * @return the sole instance of this factory class */ public static DefaultComponentFactory getInstance() { return INSTANCE; } // Component Creation *************************************************** /** * Creates and returns a label with an optional mnemonic.

* *

     * createLabel("Name");       // No mnemonic
     * createLabel("N&ame");      // Mnemonic is 'a'
     * createLabel("Save &as");   // Mnemonic is the second 'a'
     * createLabel("Look&&Feel"); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return an label with optional mnemonic */ @Override public JLabel createLabel(String textWithMnemonic) { JLabel label = new FormsLabel(); MnemonicUtils.configure(label, textWithMnemonic); return label; } /** * Creates and returns a label with an optional mnemonic * that is intended to label a read-only component.

* *

     * createReadOnlyLabel("Name");       // No mnemonic
     * createReadOnlyLabel("N&ame");      // Mnemonic is 'a'
     * createReadOnlyLabel("Save &as");   // Mnemonic is the second 'a'
     * createReadOnlyLabel("Look&&Feel"); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return an label with optional mnemonic intended for read-only * components * * @since 1.3 */ @Override public JLabel createReadOnlyLabel(String textWithMnemonic) { JLabel label = new ReadOnlyLabel(); MnemonicUtils.configure(label, textWithMnemonic); return label; } /** * Creates and returns a button that is bound to the given Action. * Useful to return customized buttons, for example, the JGoodies * {@code JGButton} is bound to some custom Action properties.

* * This default implementation just returns a {@code JButton}. * * @param action provides [bound] visual properties for the button * @return the created button * * @since 1.4 */ @Override public JButton createButton(Action action) { return new JButton(action); } /** * Creates and returns a title label that uses the foreground color * and font of a {@code TitledBorder}.

* *

     * createTitle("Name");       // No mnemonic
     * createTitle("N&ame");      // Mnemonic is 'a'
     * createTitle("Save &as");   // Mnemonic is the second 'a'
     * createTitle("Look&&Feel"); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return an emphasized title label */ @Override public JLabel createTitle(String textWithMnemonic) { JLabel label = new TitleLabel(); MnemonicUtils.configure(label, textWithMnemonic); label.setVerticalAlignment(SwingConstants.CENTER); return label; } @Override public JLabel createHeaderLabel(String markedText) { return createTitle(markedText); } /** * Creates and returns a labeled separator with the label in the left-hand * side. Useful to separate paragraphs in a panel; often a better choice * than a {@code TitledBorder}.

* *

     * createSeparator("Name");       // No mnemonic
     * createSeparator("N&ame");      // Mnemonic is 'a'
     * createSeparator("Save &as");   // Mnemonic is the second 'a'
     * createSeparator("Look&&Feel"); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return a title label with separator on the side */ public JComponent createSeparator(String textWithMnemonic) { return createSeparator(textWithMnemonic, SwingConstants.LEFT); } /** * Creates and returns a labeled separator. Useful to separate * paragraphs in a panel, which is often a better choice than a * {@code TitledBorder}.

* *

     * final int LEFT = SwingConstants.LEFT;
     * createSeparator("Name",       LEFT); // No mnemonic
     * createSeparator("N&ame",      LEFT); // Mnemonic is 'a'
     * createSeparator("Save &as",   LEFT); // Mnemonic is the second 'a'
     * createSeparator("Look&&Feel", LEFT); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @param alignment text alignment, one of {@code SwingConstants.LEFT}, * {@code SwingConstants.CENTER}, {@code SwingConstants.RIGHT} * @return a separator with title label */ @Override public JComponent createSeparator(String textWithMnemonic, int alignment) { if (Strings.isBlank(textWithMnemonic)) { return new JSeparator(); } JLabel title = createTitle(textWithMnemonic); title.setHorizontalAlignment(alignment); return createSeparator(title); } /** * Creates and returns a labeled separator. Useful to separate * paragraphs in a panel, which is often a better choice than a * {@code TitledBorder}.

* * The label's position is determined by the label's horizontal alignment, * which must be one of: * {@code SwingConstants.LEFT}, * {@code SwingConstants.CENTER}, * {@code SwingConstants.RIGHT}.

* * TODO: Since this method has been marked public in version 1.0.6, * we need to precisely describe the semantic of this method.

* * TODO: Check if we can relax the constraint for the label alignment * and also accept LEADING and TRAILING. * * @param label the title label component * @return a separator with title label * * @throws NullPointerException if the label is {@code null} * @throws IllegalArgumentException if the label's horizontal alignment * is not one of: {@code SwingConstants.LEFT}, * {@code SwingConstants.CENTER}, * {@code SwingConstants.RIGHT}. * * @since 1.0.6 */ public JComponent createSeparator(JLabel label) { Preconditions.checkNotNull(label, "The label must not be null."); int horizontalAlignment = label.getHorizontalAlignment(); checkArgument( horizontalAlignment == SwingConstants.LEFT || horizontalAlignment == SwingConstants.CENTER || horizontalAlignment == SwingConstants.RIGHT, "The label's horizontal alignment must be one of: LEFT, CENTER, RIGHT."); JPanel panel = new JPanel(new TitledSeparatorLayout(!FormUtils.isLafAqua())); panel.setOpaque(false); panel.add(label); panel.add(new JSeparator()); if (horizontalAlignment == SwingConstants.CENTER) { panel.add(new JSeparator()); } return panel; } // Helper Classes ********************************************************* /** * Differs from its superclass JLabel in that it removes a trailing * colon (':') - if any - from the label's accessible name. * This in turn leads to improved accessible names for components * labeled by FormLabels via {@code #setLabelFor}. */ private static class FormsLabel extends JLabel { // Accessibility Support ---------------------------------------------- /** * Lazily creates and returns the {@link AccessibleContext} associated * with this label, an instance of {@code AccessibleFormsLabel}. * * @return this link's AccessibleContext */ @Override public AccessibleContext getAccessibleContext() { if (accessibleContext == null) { accessibleContext = new AccessibleFormsLabel(); } return accessibleContext; } /** * This class implements accessibility support for FormsLabels. * Cuts off trailing colons from the accessible name - if any. */ private final class AccessibleFormsLabel extends AccessibleJLabel { /** * Returns the accessible name of this label. * Unlike the superclass behavior, this implementation * cuts off a trailing colon (':') - if any. * * @return the label name * * @see AccessibleContext#setAccessibleName */ @Override public String getAccessibleName() { if (accessibleName != null) { return accessibleName; } String text = FormsLabel.this.getText(); if (text == null) { return super.getAccessibleName(); } return text.endsWith(":") ? text.substring(0, text.length()-1) : text; } } } /** * A FormsLabel subclasses intended to label read-only components. * Aims to set the disabled foreground color. */ private static final class ReadOnlyLabel extends FormsLabel { private static final String[] UIMANAGER_KEYS = {"Label.disabledForeground", "Label.disabledText", "Label[Disabled].textForeground", "textInactiveText"}; @Override public void updateUI() { super.updateUI(); setForeground(getDisabledForeground()); } private static Color getDisabledForeground() { Color foreground; for (String key : UIMANAGER_KEYS) { foreground = UIManager.getColor(key); if (foreground != null) { // System.out.println("Matching key=" + key + "; color=" + foreground); return foreground; } } return null; } } /** * A label that uses the TitleBorder font and color. */ private static final class TitleLabel extends FormsLabel { private TitleLabel() { // Just invoke the super constructor. } /** * TODO: For the Synth-based L&f we should consider asking * a {@code TitledBorder} instance for its font and color using * {@code #getTitleFont} and {@code #getTitleColor} resp. */ @Override public void updateUI() { super.updateUI(); Color foreground = getTitleColor(); if (foreground != null) { setForeground(foreground); } setFont(getTitleFont()); } private static Color getTitleColor() { return UIManager.getColor("TitledBorder.titleColor"); } /** * Looks up and returns the font used for title labels. * Since Mac Aqua uses an inappropriate titled border font, * we use a bold label font instead. Actually if the title * is used in a titled separator, the bold weight is questionable. * It seems that most native Aqua tools use a plain label in * titled separators. * * @return the font used for title labels */ private static Font getTitleFont() { return FormUtils.isLafAqua() ? UIManager.getFont("Label.font").deriveFont(Font.BOLD) : UIManager.getFont("TitledBorder.font"); } } /** * A layout for the title label and separator(s) in titled separators. */ private static final class TitledSeparatorLayout implements LayoutManager { private final boolean centerSeparators; /** * Constructs a TitledSeparatorLayout that either centers the separators * or aligns them along the font baseline of the title label. * * @param centerSeparators true to center, false to align along * the font baseline of the title label */ private TitledSeparatorLayout(boolean centerSeparators) { this.centerSeparators = centerSeparators; } /** * Does nothing. This layout manager looks up the components * from the layout container and used the component's index * in the child array to identify the label and separators. * * @param name the string to be associated with the component * @param comp the component to be added */ @Override public void addLayoutComponent(String name, Component comp) { // Does nothing. } /** * Does nothing. This layout manager looks up the components * from the layout container and used the component's index * in the child array to identify the label and separators. * * @param comp the component to be removed */ @Override public void removeLayoutComponent(Component comp) { // Does nothing. } /** * Computes and returns the minimum size dimensions * for the specified container. Forwards this request * to {@code #preferredLayoutSize}. * * @param parent the component to be laid out * @return the container's minimum size. * @see #preferredLayoutSize(Container) */ @Override public Dimension minimumLayoutSize(Container parent) { return preferredLayoutSize(parent); } /** * Computes and returns the preferred size dimensions * for the specified container. Returns the title label's * preferred size. * * @param parent the component to be laid out * @return the container's preferred size. * @see #minimumLayoutSize(Container) */ @Override public Dimension preferredLayoutSize(Container parent) { Component label = getLabel(parent); Dimension labelSize = label.getPreferredSize(); Insets insets = parent.getInsets(); int width = labelSize.width + insets.left + insets.right; int height = labelSize.height + insets.top + insets.bottom; return new Dimension(width, height); } /** * Lays out the specified container. * * @param parent the container to be laid out */ @Override public void layoutContainer(Container parent) { synchronized (parent.getTreeLock()) { // Look up the parent size and insets Dimension size = parent.getSize(); Insets insets = parent.getInsets(); int width = size.width - insets.left - insets.right; // Look up components and their sizes JLabel label = getLabel(parent); Dimension labelSize = label.getPreferredSize(); int labelWidth = labelSize.width; int labelHeight = labelSize.height; Component separator1 = parent.getComponent(1); int separatorHeight = separator1.getPreferredSize().height; FontMetrics metrics = label.getFontMetrics(label.getFont()); int ascent = metrics.getMaxAscent(); int hGapDlu = centerSeparators ? 3 : 1; int hGap = Sizes.dialogUnitXAsPixel(hGapDlu, label); int vOffset = centerSeparators ? 1 + (labelHeight - separatorHeight) / 2 : ascent - separatorHeight / 2; int alignment = label.getHorizontalAlignment(); int y = insets.top; if (alignment == SwingConstants.LEFT) { int x = insets.left; label.setBounds(x, y, labelWidth, labelHeight); x+= labelWidth; x+= hGap; int separatorWidth = size.width - insets.right - x; separator1.setBounds(x, y + vOffset, separatorWidth, separatorHeight); } else if (alignment == SwingConstants.RIGHT) { int x = insets.left + width - labelWidth; label.setBounds(x, y, labelWidth, labelHeight); x -= hGap; x--; int separatorWidth = x - insets.left; separator1.setBounds(insets.left, y + vOffset, separatorWidth, separatorHeight); } else { int xOffset = (width - labelWidth - 2*hGap) / 2; int x = insets.left; separator1.setBounds(x, y + vOffset, xOffset-1, separatorHeight); x += xOffset; x += hGap; label.setBounds(x, y, labelWidth, labelHeight); x += labelWidth; x += hGap; Component separator2 = parent.getComponent(2); int separatorWidth = size.width - insets.right - x; separator2.setBounds(x, y + vOffset,separatorWidth ,separatorHeight); } } } private static JLabel getLabel(Container parent) { return (JLabel) parent.getComponent(0); } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/factories/ComponentFactory.java0000644000175000017500000001543611743426344027511 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.factories; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; /** * An interface that defines the factory methods as used by the * {@link com.jgoodies.forms.builder.PanelBuilder} and its subclasses.

* * The String arguments passed to the methods {@code #createLabel(String)}, * {@code #createTitle(String)}, and * {@code #createSeparator(String, int)} can contain an optional * mnemonic marker. The mnemonic and mnemonic index are indicated * by a single ampersand (&). For example * "&Save", or "Save &as". * To use the ampersand itself duplicate it, for example * "Look&&Feel". * * @author Karsten Lentzsch * @version $Revision: 1.10 $ * * @see DefaultComponentFactory * @see com.jgoodies.forms.builder.PanelBuilder */ public interface ComponentFactory { /** * Creates and returns a button that is bound to the given Action. * Useful to return customized buttons, for example, the JGoodies * {@code JGButton} is bound to some custom Action properties. * * @param action provides [bound] visual properties for the button * @return the created button * * @since 1.4 */ JButton createButton(Action action); /** * Creates and returns a label with an optional mnemonic.

* *

	 * createLabel("Name");       // No mnemonic
	 * createLabel("N&ame");      // Mnemonic is 'a'
	 * createLabel("Save &as");   // Mnemonic is the second 'a'
	 * createLabel("Look&&Feel"); // No mnemonic, text is Look&Feel
	 * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return an label with optional mnemonic */ JLabel createLabel(String textWithMnemonic); /** * Creates and returns a label with an optional mnemonic * that is intended to label a read-only component.

* *

     * createReadOnlyLabel("Name");       // No mnemonic
     * createReadOnlyLabel("N&ame");      // Mnemonic is 'a'
     * createReadOnlyLabel("Save &as");   // Mnemonic is the second 'a'
     * createReadOnlyLabel("Look&&Feel"); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return an label with optional mnemonic intended for read-only * components * * @since 1.3 */ JLabel createReadOnlyLabel(String textWithMnemonic); /** * Creates and returns a title label that uses the foreground color * and font of a {@code TitledBorder}.

* *

     * createTitle("Name");       // No mnemonic
     * createTitle("N&ame");      // Mnemonic is 'a'
     * createTitle("Save &as");   // Mnemonic is the second 'a'
     * createTitle("Look&&Feel"); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return an emphasized title label */ JLabel createTitle(String textWithMnemonic); /** * Creates and returns a label intended for pane headers that uses * a larger font than the control font and a special foreground color. * For example, on the Windows platform this method may use the font, * size, and color of the TaskDialog main instruction as described * by the MS User Experience Guide.

* * If the label text is marked with the mnemonic marker '&', * the mnemonic and mnemonic index will be configured. * For example if {@code markedText} is "&Charge Codes", the text * will be set to "Charge Codes", the mnemonic is 'C', and the * mnemonic index is 0.

* * A simple implementation may just delegate to * {@link #createTitle(String)}. * * @param markedText the label text with optional mnemonic marker * @return a label intended for pane headers * * @since 1.6 */ JLabel createHeaderLabel(String markedText); /** * Creates and returns a labeled separator. Useful to separate * paragraphs in a panel, which is often a better choice than a * {@code TitledBorder}.

* *

     * final int LEFT = SwingConstants.LEFT;
     * createSeparator("Name",       LEFT); // No mnemonic
     * createSeparator("N&ame",      LEFT); // Mnemonic is 'a'
     * createSeparator("Save &as",   LEFT); // Mnemonic is the second 'a'
     * createSeparator("Look&&Feel", LEFT); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @param alignment text alignment, one of {@code SwingConstants.LEFT}, * {@code SwingConstants.CENTER}, {@code SwingConstants.RIGHT} * @return a title label with separator on the side */ JComponent createSeparator(String textWithMnemonic, int alignment); } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/factories/CC.java0000644000175000017500000004343311731041662024473 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.factories; import java.io.Serializable; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.CellConstraints.Alignment; /** * A factory for CellConstraints objects. * * Examples:
* The following cell constraints locate a component in the third * column of the fifth row; column and row span are 1; the component * will be aligned with the column's right-hand side and the row's * bottom. *
 * CC.xy  (3, 5);
 * CC.xy  (3, 5, CC.RIGHT, CC.BOTTOM);
 * CC.xy  (3, 5, "right, bottom");
 *
 * CC.xyw (3, 5, 1);
 * CC.xyw (3, 5, 1, CC.RIGHT, CC.BOTTOM);
 * CC.xyw (3, 5, 1, "right, bottom");
 *
 * CC.xywh(3, 5, 1, 1);
 * CC.xywh(3, 5, 1, 1, CC.RIGHT, CC.BOTTOM);
 * CC.xywh(3, 5, 1, 1, "right, bottom");
 * 
* See also the examples in the {@link FormLayout} class comment. * * @author Karsten Lentzsch * @version $Revision: 1.4 $ * * @since 1.3 */ public final class CC implements Cloneable, Serializable { // Constants ************************************************************ public static final Alignment DEFAULT = CellConstraints.DEFAULT; public static final Alignment FILL = CellConstraints.FILL; public static final Alignment LEFT = CellConstraints.LEFT; public static final Alignment RIGHT = CellConstraints.RIGHT; public static final Alignment CENTER = CellConstraints.CENTER; public static final Alignment TOP = CellConstraints.TOP; public static final Alignment BOTTOM = CellConstraints.BOTTOM; // Setters with Column-Row Order ****************************************** /** * Sets column and row origins; sets width and height to 1; * uses the default alignments.

* * Examples:

     * CC.xy(1, 1);
     * CC.xy(1, 3);
     * 
* * @param col the new column index * @param row the new row index * @return this */ public static CellConstraints xy(int col, int row) { return xywh(col, row, 1, 1); } /** * Sets column and row origins; sets width and height to 1; * decodes horizontal and vertical alignments from the given string.

* * Examples:

     * CC.xy(1, 3, "left, bottom");
     * CC.xy(1, 3, "l, b");
     * CC.xy(1, 3, "center, fill");
     * CC.xy(1, 3, "c, f");
     * 
* * @param col the new column index * @param row the new row index * @param encodedAlignments describes the horizontal and vertical alignments * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints xy(int col, int row, String encodedAlignments) { return xywh(col, row, 1, 1, encodedAlignments); } /** * Sets the column and row origins; sets width and height to 1; * set horizontal and vertical alignment using the specified objects.

* * Examples:

     * CC.xy(1, 3, CellConstraints.LEFT,   CellConstraints.BOTTOM);
     * CC.xy(1, 3, CellConstraints.CENTER, CellConstraints.FILL);
     * 
* * @param col the new column index * @param row the new row index * @param colAlign horizontal component alignment * @param rowAlign vertical component alignment * @return this */ public static CellConstraints xy(int col, int row, Alignment colAlign, Alignment rowAlign) { return xywh(col, row, 1, 1, colAlign, rowAlign); } /** * Sets the column, row, width, and height; uses a height (row span) of 1 * and the horizontal and vertical default alignments.

* * Examples:

     * CC.xyw(1, 3, 7);
     * CC.xyw(1, 3, 2);
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @return this */ public static CellConstraints xyw(int col, int row, int colSpan) { return xywh(col, row, colSpan, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT); } /** * Sets the column, row, width, and height; * decodes the horizontal and vertical alignments from the given string. * The row span (height) is set to 1.

* * Examples:

     * CC.xyw(1, 3, 7, "left, bottom");
     * CC.xyw(1, 3, 7, "l, b");
     * CC.xyw(1, 3, 2, "center, fill");
     * CC.xyw(1, 3, 2, "c, f");
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param encodedAlignments describes the horizontal and vertical alignments * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints xyw(int col, int row, int colSpan, String encodedAlignments) { return xywh(col, row, colSpan, 1, encodedAlignments); } /** * Sets the column, row, width, and height; sets the horizontal * and vertical alignment using the specified alignment objects. * The row span (height) is set to 1.

* * Examples:

     * CC.xyw(1, 3, 2, CellConstraints.LEFT,   CellConstraints.BOTTOM);
     * CC.xyw(1, 3, 7, CellConstraints.CENTER, CellConstraints.FILL);
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param colAlign horizontal component alignment * @param rowAlign vertical component alignment * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints xyw(int col, int row, int colSpan, Alignment colAlign, Alignment rowAlign) { return xywh(col, row, colSpan, 1, colAlign, rowAlign); } /** * Sets the column, row, width, and height; uses default alignments.

* * Examples:

     * CC.xywh(1, 3, 2, 1);
     * CC.xywh(1, 3, 7, 3);
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param rowSpan the row span or grid height * @return this */ public static CellConstraints xywh(int col, int row, int colSpan, int rowSpan) { return xywh(col, row, colSpan, rowSpan, CellConstraints.DEFAULT, CellConstraints.DEFAULT); } /** * Sets the column, row, width, and height; * decodes the horizontal and vertical alignments from the given string.

* * Examples:

     * CC.xywh(1, 3, 2, 1, "left, bottom");
     * CC.xywh(1, 3, 2, 1, "l, b");
     * CC.xywh(1, 3, 7, 3, "center, fill");
     * CC.xywh(1, 3, 7, 3, "c, f");
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param rowSpan the row span or grid height * @param encodedAlignments describes the horizontal and vertical alignments * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints xywh(int col, int row, int colSpan, int rowSpan, String encodedAlignments) { return new CellConstraints().xywh(col, row, colSpan, rowSpan, encodedAlignments); } /** * Sets the column, row, width, and height; sets the horizontal * and vertical alignment using the specified alignment objects.

* * Examples:

     * CC.xywh(1, 3, 2, 1, CellConstraints.LEFT,   CellConstraints.BOTTOM);
     * CC.xywh(1, 3, 7, 3, CellConstraints.CENTER, CellConstraints.FILL);
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param rowSpan the row span or grid height * @param colAlign horizontal component alignment * @param rowAlign vertical component alignment * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints xywh(int col, int row, int colSpan, int rowSpan, Alignment colAlign, Alignment rowAlign) { return new CellConstraints(col, row, colSpan, rowSpan, colAlign, rowAlign); } // Setters with Row-Column Order ****************************************** /** * Sets row and column origins; sets height and width to 1; * uses the default alignments.

* * Examples:

     * CC.rc(1, 1);
     * CC.rc(3, 1);
     * 
* * @param row the new row index * @param col the new column index * @return this */ public static CellConstraints rc(int row, int col) { return rchw(row, col, 1, 1); } /** * Sets row and column origins; sets height and width to 1; * decodes vertical and horizontal alignments from the given string.

* * Examples:

     * CC.rc(3, 1, "bottom, left");
     * CC.rc(3, 1, "b, l");
     * CC.rc(3, 1, "fill, center");
     * CC.rc(3, 1, "f, c");
     * 
* * @param row the new row index * @param col the new column index * @param encodedAlignments describes the vertical and horizontal alignments * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints rc(int row, int col, String encodedAlignments) { return rchw(row, col, 1, 1, encodedAlignments); } /** * Sets the row and column origins; sets width and height to 1; * set horizontal and vertical alignment using the specified objects.

* * Examples:

     * CC.rc(3, 1, CellConstraints.BOTTOM, CellConstraints.LEFT);
     * CC.rc(3, 1, CellConstraints.FILL,   CellConstraints.CENTER);
     * 
* * @param row the new row index * @param col the new column index * @param rowAlign vertical component alignment * @param colAlign horizontal component alignment * @return this */ public static CellConstraints rc(int row, int col, Alignment rowAlign, Alignment colAlign) { return rchw(row, col, 1, 1, rowAlign, colAlign); } /** * Sets the row, column, height, and width; uses a height (row span) of 1 * and the vertical and horizontal default alignments.

* * Examples:

     * CC.rcw(3, 1, 7);
     * CC.rcw(3, 1, 2);
     * 
* * @param row the new row index * @param col the new column index * @param colSpan the column span or grid width * @return this */ public static CellConstraints rcw(int row, int col, int colSpan) { return rchw(row, col, 1, colSpan, CellConstraints.DEFAULT, CellConstraints.DEFAULT); } /** * Sets the row, column, height, and width; * decodes the vertical and horizontal alignments from the given string. * The row span (height) is set to 1.

* * Examples:

     * CC.rcw(3, 1, 7, "bottom, left");
     * CC.rcw(3, 1, 7, "b, l");
     * CC.rcw(3, 1, 2, "fill, center");
     * CC.rcw(3, 1, 2, "f, c");
     * 
* * @param row the new row index * @param col the new column index * @param colSpan the column span or grid width * @param encodedAlignments describes the vertical and horizontal alignments * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints rcw(int row, int col, int colSpan, String encodedAlignments) { return rchw(row, col, 1, colSpan, encodedAlignments); } /** * Sets the row, column, height, and width; sets the vertical * and horizontal alignment using the specified alignment objects. * The row span (height) is set to 1.

* * Examples:

     * CC.rcw(3, 1, 2, CellConstraints.BOTTOM, CellConstraints.LEFT);
     * CC.rcw(3, 1, 7, CellConstraints.FILL,   CellConstraints.CENTER);
     * 
* * @param row the new row index * @param col the new column index * @param colSpan the column span or grid width * @param rowAlign vertical component alignment * @param colAlign horizontal component alignment * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints rcw(int row, int col, int colSpan, Alignment rowAlign, Alignment colAlign) { return rchw(row, col, 1, colSpan, rowAlign, colAlign); } /** * Sets the row, column, height, and width; uses default alignments.

* * Examples:

     * CC.rchw(1, 3, 2, 1);
     * CC.rchw(1, 3, 7, 3);
     * 
* * @param row the new row index * @param col the new column index * @param rowSpan the row span or grid height * @param colSpan the column span or grid width * @return this */ public static CellConstraints rchw(int row, int col, int rowSpan, int colSpan) { return rchw(row, col, rowSpan, colSpan, CellConstraints.DEFAULT, CellConstraints.DEFAULT); } /** * Sets the row, column, height, and width; * decodes the vertical and horizontal alignments from the given string.

* * Examples:

     * CC.rchw(3, 1, 1, 2, "bottom, left");
     * CC.rchw(3, 1, 1, 2, "b, l");
     * CC.rchw(3, 1, 3, 7, "fill, center");
     * CC.rchw(3, 1, 3, 7, "f, c");
     * 
* * @param row the new row index * @param col the new column index * @param rowSpan the row span or grid height * @param colSpan the column span or grid width * @param encodedAlignments describes the vertical and horizontal alignments * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints rchw(int row, int col, int rowSpan, int colSpan, String encodedAlignments) { return new CellConstraints().rchw(row, col, rowSpan, colSpan, encodedAlignments); } /** * Sets the row, column, height, and width; sets the vertical and * horizontal alignment using the specified alignment objects.

* * Examples:

     * CC.rchw(3, 1, 1, 2, CellConstraints.BOTTOM, CellConstraints.LEFT);
     * CC.rchw(3, 1, 3, 7, CellConstraints.FILL,   CellConstraints.CENTER);
     * 
* * @param row the new row index * @param col the new column index * @param rowSpan the row span or grid height * @param colSpan the column span or grid width * @param rowAlign vertical component alignment * @param colAlign horizontal component alignment * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid */ public static CellConstraints rchw(int row, int col, int rowSpan, int colSpan, Alignment rowAlign, Alignment colAlign) { return xywh(col, row, colSpan, rowSpan, colAlign, rowAlign); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/factories/Forms.java0000644000175000017500000001514011764270620025272 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.factories; import static com.jgoodies.common.base.Preconditions.checkArgument; import static com.jgoodies.common.base.Preconditions.checkNotBlank; import static com.jgoodies.common.base.Preconditions.checkNotNull; import javax.swing.AbstractButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JRadioButton; import javax.swing.border.Border; import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.internal.FocusTraversalUtilsAccessor; import com.jgoodies.forms.layout.FormLayout; /** * Provides convenience behavior for building forms. * * @author Karsten Lentzsch * @version $Revision: 1.1 $ */ public class Forms { private Forms() { // Overrides default constructor; prevents instantiation. } // Public API ************************************************************* public static JComponent single(String columnSpec, String rowSpec, JComponent component) { checkNotBlank(columnSpec, "The column specification must not be null, empty, or white space."); checkNotBlank(rowSpec, "The row specification must not be null, empty, or white space."); checkNotNull (component, "The component must not be null."); FormLayout layout = new FormLayout(columnSpec, rowSpec); PanelBuilder builder = new PanelBuilder(layout); builder.add(component, CC.xy(1, 1)); return builder.build(); } public static JComponent centered(JComponent component) { return single("fill:pref:grow", "f:p:g", component); } public static JComponent border(Border border, JComponent component) { JComponent container = single("fill:pref", "f:p", component); container.setBorder(border); return container; } public static JComponent border(String emptyBorderSpec, JComponent component) { return border(Borders.createEmptyBorder(emptyBorderSpec), component); } public static JComponent horizontal(String gapColSpec, JComponent... components) { checkNotBlank(gapColSpec, "The gap column specification must not be null, empty, or white space."); checkNotNull(components, "The component array must not be null."); FormLayout layout = new FormLayout(); PanelBuilder builder = new PanelBuilder(layout); return builder.build(); } public static JComponent vertical(String gapRowSpec, JComponent... components) { checkNotBlank(gapRowSpec, "The gap row specification must not be null, empty, or white space."); checkNotNull(components, "The component array must not be null."); FormLayout layout = new FormLayout(); PanelBuilder builder = new PanelBuilder(layout); return builder.build(); } public static JComponent buttonBar(JComponent... buttons) { return new ButtonBarBuilder() .addButton(buttons) .build(); } /** * Builds and returns a panel where the given check boxes are laid out * in a row.

* * If class {@code com.jgoodies.jsdl.common.focus.FocusTraversalUtils} * from the JSDL Common library is in the class path, * it is used to group the radio buttons. Focus is transferred to/from * the selected button in a group; and cursor-left/-right change * the selection in the group. * * @return the built panel */ public static JComponent checkBoxBar(JCheckBox... checkBoxes) { return buildGroupedButtonBar(checkBoxes); } /** * Builds and returns a panel where the given radio buttons are laid out * in a row.

* * If class {@code com.jgoodies.jsdl.common.focus.FocusTraversalUtils} * from the JSDL Common library is in the class path, * it is used to group the radio buttons. Focus is transferred to/from * the selected button in a group; and cursor-left/-right change * the selection in the group. * * @return the built panel */ public static JComponent radioButtonBar(JRadioButton... radioButtons) { return buildGroupedButtonBar(radioButtons); } // Implementation ********************************************************* /** * Builds and returns a button bar that consists of the given buttons. * Aims to build a focus group via the {@code FocusTraversalUtils}, * if in the classpath. * * @return the built panel */ protected static JComponent buildGroupedButtonBar(AbstractButton... buttons) { checkArgument(buttons.length > 1, "You must provide more than one button."); FormLayout layout = new FormLayout( buttons.length-1 + "*(pref, $rgap), pref", "p"); PanelBuilder builder = new PanelBuilder(layout); int columnCount = 1; for (AbstractButton button : buttons) { builder.add(button, CC.xy(columnCount, 1)); columnCount += 2; } FocusTraversalUtilsAccessor.tryToBuildAFocusGroup(buttons); return builder.build(); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/factories/Borders.java0000644000175000017500000003406711751077440025616 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.factories; import static com.jgoodies.common.base.Preconditions.checkArgument; import java.awt.Component; import java.awt.Insets; import javax.swing.border.AbstractBorder; import javax.swing.border.Border; import com.jgoodies.forms.layout.ConstantSize; import com.jgoodies.forms.layout.Sizes; import com.jgoodies.forms.util.LayoutStyle; /** * Provides constants and factory methods for {@code Border}s that use * instances of {@link ConstantSize} to define the margins.

* * Examples:
*

 * Borders.DLU2
 * Borders.createEmptyBorder(Sizes.DLUY4, Sizes.DLUX2, Sizes.DLUY4, Sizes.DLUX2);
 * Borders.createEmptyBorder("4dlu, 2dlu, 4dlu, 2dlu");
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.14 $ * * @see Border * @see Sizes */ public final class Borders { private Borders() { // Overrides default constructor; prevents instantiation. } // Constant Borders ***************************************************** /** * A prepared and reusable EmptyBorder without gaps. */ public static final Border EMPTY = new javax.swing.border.EmptyBorder(0, 0, 0, 0); /** * A prepared and reusable Border with 2dlu on all sides. */ public static final Border DLU2 = createEmptyBorder(Sizes.DLUY2, Sizes.DLUX2, Sizes.DLUY2, Sizes.DLUX2); /** * A prepared and reusable Border with 4dlu on all sides. */ public static final Border DLU4 = createEmptyBorder(Sizes.DLUY4, Sizes.DLUX4, Sizes.DLUY4, Sizes.DLUX4); /** * A prepared and reusable Border with 7dlu on all sides. */ public static final Border DLU7 = createEmptyBorder(Sizes.DLUY7, Sizes.DLUX7, Sizes.DLUY7, Sizes.DLUX7); /** * A prepared and reusable Border with 9dlu on all sides. * * @since 1.6 */ public static final Border DLU9 = createEmptyBorder(Sizes.DLUY9, Sizes.DLUX9, Sizes.DLUY9, Sizes.DLUX9); /** * A prepared Border with 14dlu on all sides. */ public static final Border DLU14 = createEmptyBorder(Sizes.DLUY14, Sizes.DLUX14, Sizes.DLUY14, Sizes.DLUX14); /** * A prepared Border with 21dlu on all sides. * * @since 1.2 */ public static final Border DLU21 = createEmptyBorder(Sizes.DLUY21, Sizes.DLUX21, Sizes.DLUY21, Sizes.DLUX21); /** * A standardized Border that describes the gap between a component * and a button bar in its bottom. */ public static final Border BUTTON_BAR_PAD = createEmptyBorder( LayoutStyle.getCurrent().getButtonBarPad(), Sizes.dluX(0), Sizes.dluY(0), Sizes.dluX(0)); /** * A standardized Border that describes the border around * a dialog content that has no tabs. * * @see #TABBED_DIALOG */ public static final Border DIALOG = createEmptyBorder( LayoutStyle.getCurrent().getDialogMarginY(), LayoutStyle.getCurrent().getDialogMarginX(), LayoutStyle.getCurrent().getDialogMarginY(), LayoutStyle.getCurrent().getDialogMarginX() ); /** * A standardized Border that describes the border around * a dialog content that uses tabs. * * @see #DIALOG */ public static final Border TABBED_DIALOG = createEmptyBorder( LayoutStyle.getCurrent().getTabbedDialogMarginY(), LayoutStyle.getCurrent().getTabbedDialogMarginX(), LayoutStyle.getCurrent().getTabbedDialogMarginY(), LayoutStyle.getCurrent().getTabbedDialogMarginX() ); // Deprecated Constant Borders ******************************************** /** * A prepared and reusable EmptyBorder without gaps. * * @deprecated Replaced by {@link #EMPTY} */ @Deprecated public static final Border EMPTY_BORDER = new javax.swing.border.EmptyBorder(0, 0, 0, 0); /** * A prepared and reusable Border with 2dlu on all sides. * * @deprecated Replaced by {@link #DLU2} */ @Deprecated public static final Border DLU2_BORDER = createEmptyBorder(Sizes.DLUY2, Sizes.DLUX2, Sizes.DLUY2, Sizes.DLUX2); /** * A prepared and reusable Border with 4dlu on all sides. * * @deprecated Replaced by {@link #DLU4} */ @Deprecated public static final Border DLU4_BORDER = createEmptyBorder(Sizes.DLUY4, Sizes.DLUX4, Sizes.DLUY4, Sizes.DLUX4); /** * A prepared and reusable Border with 7dlu on all sides. * * @deprecated Replaced by {@link #DLU7} */ @Deprecated public static final Border DLU7_BORDER = createEmptyBorder(Sizes.DLUY7, Sizes.DLUX7, Sizes.DLUY7, Sizes.DLUX7); /** * A prepared Border with 14dlu on all sides. * * @deprecated Replaced by {@link #DLU14} */ @Deprecated public static final Border DLU14_BORDER = createEmptyBorder(Sizes.DLUY14, Sizes.DLUX14, Sizes.DLUY14, Sizes.DLUX14); /** * A prepared Border with 21dlu on all sides. * * @deprecated Replaced by {@link #DLU21} * * @since 1.2 */ @Deprecated public static final Border DLU21_BORDER = createEmptyBorder(Sizes.DLUY21, Sizes.DLUX21, Sizes.DLUY21, Sizes.DLUX21); /** * A standardized Border that describes the gap between a component * and a button bar in its bottom. * * @deprecated Replaced by {@link #BUTTON_BAR_PAD} */ @Deprecated public static final Border BUTTON_BAR_GAP_BORDER = createEmptyBorder( LayoutStyle.getCurrent().getButtonBarPad(), Sizes.dluX(0), Sizes.dluY(0), Sizes.dluX(0)); /** * A standardized Border that describes the border around * a dialog content that has no tabs. * * @deprecated Replaced by {@link #DIALOG} * * @see #TABBED_DIALOG */ @Deprecated public static final Border DIALOG_BORDER = createEmptyBorder( LayoutStyle.getCurrent().getDialogMarginY(), LayoutStyle.getCurrent().getDialogMarginX(), LayoutStyle.getCurrent().getDialogMarginY(), LayoutStyle.getCurrent().getDialogMarginX() ); /** * A standardized Border that describes the border around * a dialog content that uses tabs. * * @deprecated Replaced by {@link #TABBED_DIALOG} * * @see #DIALOG */ @Deprecated public static final Border TABBED_DIALOG_BORDER = createEmptyBorder( LayoutStyle.getCurrent().getTabbedDialogMarginY(), LayoutStyle.getCurrent().getTabbedDialogMarginX(), LayoutStyle.getCurrent().getTabbedDialogMarginY(), LayoutStyle.getCurrent().getTabbedDialogMarginX() ); // Factory Methods ****************************************************** /** * Creates and returns an {@code EmptyBorder} with the specified * gaps. * * @param top the top gap * @param left the left-hand side gap * @param bottom the bottom gap * @param right the right-hand side gap * @return an {@code EmptyBorder} with the specified gaps * * @throws NullPointerException if top, left, bottom, or right is {@code null} * * @see #createEmptyBorder(String) */ public static Border createEmptyBorder(ConstantSize top, ConstantSize left, ConstantSize bottom, ConstantSize right) { return new EmptyBorder(top, left, bottom, right); } /** * Creates and returns a {@code Border} using sizes as specified by * the given string. This string is a comma-separated encoding of * 4 {@code ConstantSize}s. * * @param encodedSizes top, left, bottom, right gap encoded as String * @return an {@code EmptyBorder} with the specified gaps * * @see #createEmptyBorder(ConstantSize, ConstantSize, ConstantSize, ConstantSize) */ public static Border createEmptyBorder(String encodedSizes) { String[] token = encodedSizes.split("\\s*,\\s*"); int tokenCount = token.length; checkArgument(token.length == 4, "The border requires 4 sizes, but \"%s\" has %d.", encodedSizes, Integer.valueOf(tokenCount)); ConstantSize top = Sizes.constant(token[0], false); ConstantSize left = Sizes.constant(token[1], true); ConstantSize bottom = Sizes.constant(token[2], false); ConstantSize right = Sizes.constant(token[3], true); return createEmptyBorder(top, left, bottom, right); } /** * An empty border that uses 4 instances of {@link ConstantSize} * to define the top, left, bottom and right gap. */ public static final class EmptyBorder extends AbstractBorder { private final ConstantSize top; private final ConstantSize left; private final ConstantSize bottom; private final ConstantSize right; private EmptyBorder( ConstantSize top, ConstantSize left, ConstantSize bottom, ConstantSize right) { if ( top == null || left == null || bottom == null || right == null) { throw new NullPointerException("The top, left, bottom, and right must not be null."); } this.top = top; this.left = left; this.bottom = bottom; this.right = right; } /** * Returns the insets of the border. * * @param c the component for which this border insets value applies * @param insets the insets to be reinitialized * @return the {@code insets} object */ @Override public Insets getBorderInsets(Component c, Insets insets) { insets.top = top.getPixelSize(c); insets.left = left.getPixelSize(c); insets.bottom = bottom.getPixelSize(c); insets.right = right.getPixelSize(c); return insets; } /** * Returns the insets of the border. * * @param c the component for which this border insets value applies * @return the border's Insets */ @Override public Insets getBorderInsets(Component c) { return getBorderInsets(c, new Insets(0, 0, 0, 0)); } /** * Returns this border's top size. * * @return this border's top size */ public ConstantSize top() { return top; } /** * Returns this border's left size. * * @return this border's left size */ public ConstantSize left() { return left; } /** * Returns this border's bottom size. * * @return this border's bottom size */ public ConstantSize bottom() { return bottom; } /** * Returns this border's right size. * * @return this border's right size */ public ConstantSize right() { return right; } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/internal/0000755000175000017500000000000011754644652023206 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/internal/FocusTraversalUtilsAccessor.java0000644000175000017500000001014211753011724031501 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.internal; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.swing.AbstractButton; /** * Provides access to the FocusTraversalUtils class that ships with the * JGoodies Standard Dialog Library (JSDL). * * Note: This class is not part of the public Forms API. * It's intended for implementation purposes only. * The class's API may change at any time. * * @author Karsten Lentzsch * @version $Revision: 1.1 $ */ public final class FocusTraversalUtilsAccessor { /** * The name of the {@code FocusTraversalUtils} from the JSDL Common library. * This utility can group buttons if the focus traversal policy supports * grouping, such as the {@code JGContainerOrderFocusTraversalPolicy} and * {@code JGLayoutFocusTraversalPolicy} from the JSDL Common. */ private static final String FOCUS_TRAVERSAL_UTILS_NAME = "com.jgoodies.jsdl.common.focus.FocusTraversalUtils"; /** * Holds the public static method * {@code com.jgoodies.jsdl.common.focus.FocusTraversalUtils#group}. */ private static Method groupMethod = null; static { groupMethod = getGroupMethod(); } private FocusTraversalUtilsAccessor() { // Overrides default constructor; prevents instantiation. } // Implementation ********************************************************* /** * Tries to group the given buttons using the FocusTraversalUtils class * - if available. Does nothing, if this class is not in the class path. */ public static void tryToBuildAFocusGroup(AbstractButton... buttons) { if (groupMethod == null) { return; } try { groupMethod.invoke(null, (Object) buttons); } catch (IllegalAccessException e) { // Do nothing } catch (InvocationTargetException e) { // Do nothing } } // Private Helper Code **************************************************** private static Method getGroupMethod() { try { Class clazz = Class.forName(FOCUS_TRAVERSAL_UTILS_NAME); return clazz.getMethod("group", new Class[] {AbstractButton[].class}); } catch (ClassNotFoundException e) { // Ignore } catch (SecurityException e) { // Ignore } catch (NoSuchMethodException e) { // Ignore } return null; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/debug/0000755000175000017500000000000011731041706022442 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/debug/package.html0000644000175000017500000000460311731041706024726 0ustar tonytony Consists of optional classes that help you find, understand and fix layout problems.

Related Documentation

For more information see: @see com.jgoodies.forms.layout @see com.jgoodies.forms.builder jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/debug/FormDebugUtils.java0000644000175000017500000002332211731041706026202 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.debug; import static com.jgoodies.common.base.Preconditions.checkArgument; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.awt.Component; import java.awt.Container; import javax.swing.JLabel; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.ColumnSpec; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.RowSpec; /** * Provides static methods that help you understand and fix layout problems * when using the {@link FormLayout}. Dumps information about the layout grid, * layout groups and cell constraints to the console.

* * Implicit values are mapped to concrete. For example, implicit alignments * in column and row specifications will be visible. And cell constraint * alignments that use or override the column and row defaults are visible too. *

 * ColumnSpec("p")   -> ColumnSpec("fill:pref:0");
 * ColumnSpec("p:1") -> ColumnSpec("fill:pref:1");
 *
 * RowSpec("p")      -> RowSpec("center:pref:0");
 * RowSpec("p:1")    -> RowSpec("center:pref:1");
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.10 $ * * @see FormDebugPanel */ public final class FormDebugUtils { private FormDebugUtils() { // Overrides default constructor; prevents instantiation. } // Console Dump ********************************************************* /** * Dumps all layout state to the console: column and row specifications, * column and row groups, grid bounds and cell constraints. * * @param container the layout container */ public static void dumpAll(Container container) { if (!(container.getLayout() instanceof FormLayout)) { System.out.println("The container's layout is not a FormLayout."); return; } FormLayout layout = (FormLayout) container.getLayout(); dumpColumnSpecs(layout); dumpRowSpecs(layout); System.out.println(); dumpColumnGroups(layout); dumpRowGroups(layout); System.out.println(); dumpConstraints(container); dumpGridBounds(container); } /** * Dumps the layout's column specifications to the console. * * @param layout the {@code FormLayout} to inspect */ public static void dumpColumnSpecs(FormLayout layout) { System.out.print("COLUMN SPECS:"); for (int col = 1; col <= layout.getColumnCount(); col++) { ColumnSpec colSpec = layout.getColumnSpec(col); System.out.print(colSpec.toShortString()); if (col < layout.getColumnCount()) { System.out.print(", "); } } System.out.println(); } /** * Dumps the layout's row specifications to the console. * * @param layout the {@code FormLayout} to inspect */ public static void dumpRowSpecs(FormLayout layout) { System.out.print("ROW SPECS: "); for (int row = 1; row <= layout.getRowCount(); row++) { RowSpec rowSpec = layout.getRowSpec(row); System.out.print(rowSpec.toShortString()); if (row < layout.getRowCount()) { System.out.print(", "); } } System.out.println(); } /** * Dumps the layout's column groups to the console. * * @param layout the {@code FormLayout} to inspect */ public static void dumpColumnGroups(FormLayout layout) { dumpGroups("COLUMN GROUPS: ", layout.getColumnGroups()); } /** * Dumps the layout's row groups to the console. * * @param layout the {@code FormLayout} to inspect */ public static void dumpRowGroups(FormLayout layout) { dumpGroups("ROW GROUPS: ", layout.getRowGroups()); } /** * Dumps the container's grid info to the console if and only * if the container's layout is a {@code FormLayout}. * * @param container the container to inspect * @throws IllegalArgumentException if the layout is not FormLayout */ public static void dumpGridBounds(Container container) { System.out.println("GRID BOUNDS"); dumpGridBounds(getLayoutInfo(container)); } /** * Dumps the grid layout info to the console. * * @param layoutInfo provides the column and row origins */ public static void dumpGridBounds(FormLayout.LayoutInfo layoutInfo) { System.out.print("COLUMN ORIGINS: "); for (int columnOrigin : layoutInfo.columnOrigins) { System.out.print(columnOrigin + " "); } System.out.println(); System.out.print("ROW ORIGINS: "); for (int rowOrigin : layoutInfo.rowOrigins) { System.out.print(rowOrigin + " "); } System.out.println(); } /** * Dumps the component constraints to the console. * * @param container the layout container to inspect */ public static void dumpConstraints(Container container) { System.out.println("COMPONENT CONSTRAINTS"); if (!(container.getLayout() instanceof FormLayout)) { System.out.println("The container's layout is not a FormLayout."); return; } FormLayout layout = (FormLayout) container.getLayout(); int childCount = container.getComponentCount(); for (int i = 0; i < childCount; i++) { Component child = container.getComponent(i); CellConstraints cc = layout.getConstraints(child); String ccString = cc == null ? "no constraints" : cc.toShortString(layout); System.out.print(ccString); System.out.print("; "); String childType = child.getClass().getName(); System.out.print(childType); if (child instanceof JLabel) { JLabel label = (JLabel) child; System.out.print(" \"" + label.getText() + "\""); } if (child.getName() != null) { System.out.print("; name="); System.out.print(child.getName()); } System.out.println(); } System.out.println(); } // Helper Code ********************************************************** /** * Dumps the given groups to the console. * * @param title a string title for the dump * @param allGroups a two-dimensional array with all groups */ private static void dumpGroups(String title, int[][] allGroups) { System.out.print(title + " {"); for (int group = 0; group < allGroups.length; group++) { int[] groupIndices = allGroups[group]; System.out.print(" {"); for (int i = 0; i < groupIndices.length; i++) { System.out.print(groupIndices[i]); if (i < groupIndices.length - 1) { System.out.print(", "); } } System.out.print("} "); if (group < allGroups.length - 1) { System.out.print(", "); } } System.out.println("}"); } /** * Computes and returns the layout's grid origins. * * @param container the layout container to inspect * @return an object that comprises the cell origins and extents * @throws NullPointerException if {@code container} is {@link NullPointerException} * @throws IllegalArgumentException if {@code container}'s layout is not FormLayout */ public static FormLayout.LayoutInfo getLayoutInfo(Container container) { checkNotNull(container, "The container must not be null."); checkArgument(container.getLayout() instanceof FormLayout, "The container must use an instance of FormLayout."); FormLayout layout = (FormLayout) container.getLayout(); return layout.getLayoutInfo(container); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/debug/FormDebugPanel.java0000644000175000017500000002247711731041706026153 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.debug; import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; import com.jgoodies.forms.layout.FormLayout; /** * A panel that paints grid bounds if and only if the panel's layout manager * is a {@link FormLayout}. You can tweak the debug paint process by setting * a custom grid color, painting optional diagonals and painting the grid * in the background or foreground.

* * This class is not intended to be extended. However, it is not * marked as {@code final} to allow users to subclass it for * debugging purposes. In general it is recommended to use JPanel * instances, not extend them. You can see this implementation style * in the Forms tutorial classes. Rarely there's a need to extend JPanel; * for example if you provide a custom behavior for * {@code #paintComponent} or {@code #updateUI}. * * @author Karsten Lentzsch * @version $Revision: 1.10 $ * * @see FormDebugUtils */ public class FormDebugPanel extends JPanel { public static boolean paintRowsDefault = true; /** * The default color used to paint the form's debug grid. */ private static final Color DEFAULT_GRID_COLOR = Color.red; /** * Specifies whether the grid shall be painted in the background. * Is off by default and so the grid is painted in the foreground. */ private boolean paintInBackground; /** * Specifies whether the container's diagonals should be painted. */ private boolean paintDiagonals; /** * Specifies whether all rows shall be painted. Enabled by default. */ private boolean paintRows = paintRowsDefault; /** * Holds the color used to paint the debug grid. */ private Color gridColor = DEFAULT_GRID_COLOR; // Instance Creation **************************************************** /** * Constructs a FormDebugPanel with all options turned off. */ public FormDebugPanel() { this(null); } /** * Constructs a FormDebugPanel on the given FormLayout instance * that paints the grid in the foreground and paints no diagonals. * * @param layout the panel's FormLayout instance */ public FormDebugPanel(FormLayout layout) { this(layout, false, false); } /** * Constructs a FormDebugPanel on the given FormLayout * using the specified settings that are otherwise turned off. * * @param paintInBackground * true to paint grid lines in the background, * false to paint the grid in the foreground * @param paintDiagonals * true to paint diagonals, * false to not paint them */ public FormDebugPanel(boolean paintInBackground, boolean paintDiagonals) { this(null, paintInBackground, paintDiagonals); } /** * Constructs a FormDebugPanel on the given FormLayout using * the specified settings that are otherwise turned off. * * @param layout * the panel's FormLayout instance * @param paintInBackground * true to paint grid lines in the background, * false to paint the grid in the foreground * @param paintDiagonals * true to paint diagonals, * false to not paint them */ public FormDebugPanel(FormLayout layout, boolean paintInBackground, boolean paintDiagonals) { super(layout); setPaintInBackground(paintInBackground); setPaintDiagonals(paintDiagonals); setGridColor(DEFAULT_GRID_COLOR); } // Accessors ************************************************************ /** * Specifies to paint in background or foreground. * * @param b true to paint in the background, false for the foreground */ public void setPaintInBackground(boolean b) { paintInBackground = b; } /** * Enables or disables to paint the panel's diagonals. * * @param b true to paint diagonals, false to not paint them */ public void setPaintDiagonals(boolean b) { paintDiagonals = b; } /** * Enables or disables painting of rows. Enabled by default. * Note that the top and bottom are always painted. * * @param b true to paint all rows, false to paint only the top and * bottom */ public void setPaintRows(boolean b) { paintRows = b; } /** * Sets the debug grid's color. * * @param color the color used to paint the debug grid */ public void setGridColor(Color color) { gridColor = color; } // Painting ************************************************************* /** * Paints the component and - if background painting is enabled - the grid. * If foreground painting is enabled, the grid will be painted in * {@code #paint}. * * @param g the Graphics object to paint on * * @see #paint(Graphics) */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (paintInBackground) { paintGrid(g); } } /** * Paints the panel. If the panel's layout manager is a FormLayout * and foreground painting is enabled, it paints the form's grid lines. * If the grid shall be painted in the background, the grid will be * painted in {@code #paintComponent}. * * @param g the Graphics object to paint on * * @see #paintComponent(Graphics) */ @Override public void paint(Graphics g) { super.paint(g); if (!paintInBackground) { paintGrid(g); } } /** * Paints the form's grid lines and diagonals. * * @param g the Graphics object used to paint */ private void paintGrid(Graphics g) { if (!(getLayout() instanceof FormLayout)) { return; } FormLayout.LayoutInfo layoutInfo = FormDebugUtils.getLayoutInfo(this); int left = layoutInfo.getX(); int top = layoutInfo.getY(); int width = layoutInfo.getWidth(); int height = layoutInfo.getHeight(); g.setColor(gridColor); // Paint the column bounds. int last = layoutInfo.columnOrigins.length - 1; for (int col = 0; col <= last; col++) { boolean firstOrLast = (col == 0) || (col == last); int x = layoutInfo.columnOrigins[col]; int start = firstOrLast ? 0 : top; int stop = firstOrLast ? getHeight() : (top + height); for (int i=start; i < stop; i+=5) { int length = Math.min(3, stop - i); g.fillRect(x, i, 1, length); } } // Paint the row bounds. last = layoutInfo.rowOrigins.length - 1; for (int row = 0; row <= last; row++) { boolean firstOrLast = (row == 0) || (row == last); int y = layoutInfo.rowOrigins[row]; int start = firstOrLast ? 0 : left; int stop = firstOrLast ? getWidth() : (left + width); if (firstOrLast || paintRows) { for (int i=start; i < stop; i+=5) { int length = Math.min(3, stop - i); g.fillRect(i, y, length, 1); } } } if (paintDiagonals) { g.drawLine(left, top, left + width, top + height); g.drawLine(left, top + height, left + width, top); } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/0000755000175000017500000000000011772633204023007 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/package.html0000644000175000017500000000471311731041700025262 0ustar tonytony Contains optional builder classes of the Forms framework. These non-visual builders assist you in building forms or in writing new form builder classes.

Related Documentation

For more information see: @see com.jgoodies.forms.layout @see com.jgoodies.forms.factories jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/ListViewBuilder.java0000644000175000017500000003242711764270620026737 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import static com.jgoodies.common.base.Preconditions.checkNotNull; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTree; import javax.swing.border.Border; import com.jgoodies.forms.factories.CC; import com.jgoodies.forms.factories.ComponentFactory; import com.jgoodies.forms.factories.Forms; import com.jgoodies.forms.layout.FormLayout; /** * Builds list/table views from a set of mandatory and optional components: * label, filter/search, * list (table), * list buttons, list extras, * details view (or preview).

* * Examples:

 * return new ListViewBuilder()
 *     .label("&Contacts:")
 *     .listView(contactsTable)
 *     .listBar(newButton, editButton, deleteButton)
 *     .build();
 *
 * return new ListViewBuilder()
 *     .border(Borders.DLU14)
 *     .labelView(contactsLabel)
 *     .filterView(contactsSearchField)
 *     .listView(contactsTable)
 *     .listBar(newButton, editButton, deleteButton, null, printButton)
 *     .detailsView(contactDetailsView)
 *     .build();
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.2 $ * * @since 1.6 */ public final class ListViewBuilder { private final ComponentFactory factory; private JComponent labelView; private JComponent filterView; private JComponent listView; private JComponent listBarView; private JComponent listExtrasView; private JComponent detailsView; private Border border; private String filterViewColSpec = "[100dlu, p]"; private String listViewRowSpec = "fill:100dlu:grow"; /** * Holds the panel that has been lazily built in {@code #buildPanel}. */ private JComponent panel; // Instance Creation ****************************************************** /** * Constructs a ListViewBuilder using the AbstractBuilder's * default component factory. The factory is required by * {@link #label(String)} and {@link #headerLabel(String)}. */ public ListViewBuilder() { this(AbstractBuilder.getComponentFactoryDefault()); } /** * Constructs a ListViewBuilder using the given component factory. * The factory is required by * {@link #label(String)} and {@link #headerLabel(String)}. * * @param factory the component factory used to create labels and headers */ public ListViewBuilder(ComponentFactory factory) { this.factory = factory; } // API ******************************************************************** /** * Sets an optional border that surrounds the list view including * the label and details. * * @param border the border to set */ public ListViewBuilder border(Border border) { this.border = border; invalidatePanel(); return this; } /** * Sets the mandatory label view. Useful to set a bound label that updates * its text when the list content changes, for example to provide the * number of list elements. * * @param labelView the component that shall label the list view, * often a bound label */ public ListViewBuilder labelView(JComponent labelView) { this.labelView = labelView; invalidatePanel(); return this; } /** * Creates a plain label for the given marked text and sets it as label view. * Equivalent to: *
     * labelView(aComponentFactory.createLabel(markedText));
     * 
* * @param markedText the label's text, may contain a mnemonic marker */ public ListViewBuilder label(String markedText) { labelView(factory.createLabel(markedText)); return this; } /** * Creates a header label for the given marked text and sets it as label view. * Equivalent to: *
     * labelView(aComponentFactory.createHeaderLabel(markedText));
     * 
* * @param markedText the label's text, may contain a mnemonic marker */ public ListViewBuilder headerLabel(String markedText) { labelView(factory.createHeaderLabel(markedText)); return this; } /** * Sets an optional view that will be placed in the upper right corner * of the built list view panel. This can be a search field, a panel * with filtering check boxes ("Only valid items"), etc. * * @param filterView the view to be added. */ public ListViewBuilder filterView(JComponent filterView) { this.filterView = filterView; invalidatePanel(); return this; } /** * Changes the FormLayout column specification used to lay out * the filter view. * The default value is {@code "[100dlu, p]"}, which is a column where * the width is determined by the filter view's preferred width, * but a minimum width of 100dlu is ensured. The filter view won't grow * horizontally, if the container gets more space. * * @param colSpec specifies the horizontal layout of the filter view * * @throws NullPointerException if {@code colSpec} is {@code null} */ public ListViewBuilder filterViewColSpec(String colSpec) { checkNotNull(colSpec, "The filter view column specification must not be null."); this.filterViewColSpec = colSpec; invalidatePanel(); return this; } /** * Sets the given component as the the mandatory list view. * If {@code listView} is a JTable, JList, or JTree, it is * automatically wrapped with a JScrollPane, before the scroll pane * is set as list view. * * @param listView the component to be used as scrollable list view * * @throws NullPointerException if {@code listView} is {@code null} */ public ListViewBuilder listView(JComponent listView) { checkNotNull(listView, "The list view must not be null."); if (listView instanceof JTable || listView instanceof JList || listView instanceof JTree) { this.listView = new JScrollPane(listView); } else { this.listView = listView; } invalidatePanel(); return this; } /** * Changes the FormLayout row specification used to lay out the list view. * The default value is {@code "fill:[100dlu, pref]:grow"}, which is a row * that is filled by the list view; the height is determined * by the list view's preferred height, but a minimum of 100dlu is ensured. * The list view grows vertically, if the container gets more vertical * space.

* * Examples: *

     * .listViewRowSpec("fill:100dlu");  // fixed height
     * .listViewRowSpec("f:100dlu:g");   // fixed start height, grows
     * .listViewRowSpec("f:p");          // no minimum height
     * 
* * @param rowSpec specifies the vertical layout of the list view * * @throws NullPointerException if {@code rowSpec} is {@code null} */ public ListViewBuilder listViewRowSpec(String rowSpec) { checkNotNull(rowSpec, "The list view row specification must not be null."); this.listViewRowSpec = rowSpec; invalidatePanel(); return this; } /** * Sets an optional list bar - often a button bar - * that will be located in the lower left corner of the list view. * If the list bar view consists only of buttons, * use {@link #listBar(JComponent...)} instead. * * @param listBarView the component to set */ public ListViewBuilder listBarView(JComponent listBarView) { this.listBarView = listBarView; invalidatePanel(); return this; } /** * Builds a button bar using the given buttons and sets it as list bar. * Although JButtons are expected, any JComponent is accepted * to allow custom button component types.

* * Equivalent to {@code listBarView(Forms.buildButtonBar(buttons))}. * * @param buttons the buttons in the list bar * * @throws NullPointerException if {@code buttons} is {@code null} * @throws IllegalArgumentException if no buttons are provided * * @see ButtonBarBuilder#addButton(JComponent...) */ public ListViewBuilder listBar(JComponent... buttons) { listBarView(Forms.buttonBar(buttons)); return this; } /** * Sets an optional view that is located in the lower right corner * of the list view, aligned with the list bar. * * @param listExtrasView the component to set */ public ListViewBuilder listExtrasView(JComponent listExtrasView) { this.listExtrasView = listExtrasView; invalidatePanel(); return this; } /** * Sets an optional details view that is located under the list view. * Often this is the details view or preview of a master-details view. * * @param detailsView the component to set */ public ListViewBuilder detailsView(JComponent detailsView) { this.detailsView = detailsView; invalidatePanel(); return this; } /** * Lazily builds and returns the list view panel. * * @return the built panel */ public JComponent build() { if (panel == null) { panel = buildPanel(); } return panel; } // Implementation ********************************************************* private void invalidatePanel() { panel = null; } private JComponent buildPanel() { checkNotNull(labelView, "The label must be set before #getPanel is invoked."); checkNotNull(listView, "The list view must be set before #getPanel is invoked."); String columnSpec = filterView != null ? "default:grow, 9dlu, " + filterViewColSpec : "default:grow, 0, 0"; FormLayout layout = new FormLayout( columnSpec, "[14dlu,p], $lcg, " + listViewRowSpec + ", p, p"); PanelBuilder builder = new PanelBuilder(layout); builder.border(border); builder.add(labelView, CC.xy (1, 1)); builder.add(listView, CC.xyw(1, 3, 3)); if (filterView != null) { builder.add(filterView, CC.xy (3, 1)); } if (listBarView != null || listExtrasView != null) { builder.add(buildDecoratedListBarAndExtras(), CC.xyw(1, 4, 3)); } if (detailsView != null) { builder.add(buildDecoratedDetailsView(), CC.xyw(1, 5, 3)); } return builder.build(); } private JComponent buildDecoratedListBarAndExtras() { FormLayout layout = new FormLayout( "left:default, 9dlu:grow, right:pref", "$rgap, p"); PanelBuilder builder = new PanelBuilder(layout); if (listBarView != null) { builder.add(listBarView, CC.xy(1, 2)); } if (listExtrasView != null) { builder.add(listExtrasView, CC.xy(3, 2)); } return builder.build(); } private JComponent buildDecoratedDetailsView() { FormLayout layout = new FormLayout( "fill:default:grow", "14, p"); PanelBuilder builder = new PanelBuilder(layout); builder.add(detailsView, CC.xy(1, 2)); return builder.build(); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/I15dPanelBuilder.java0000644000175000017500000005041111764270406026646 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import static com.jgoodies.common.base.Preconditions.checkState; import java.awt.Color; import java.awt.Component; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.Border; import com.jgoodies.common.base.Preconditions; import com.jgoodies.common.internal.StringLocalizer; import com.jgoodies.common.swing.MnemonicUtils; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * A general purpose builder class that uses the FormLayout to lay out JPanels. * In addition to its superclass {@link PanelBuilder} this class provides * convenience behavior to map * resource keys to their associated internationalized (i15d) strings * when adding labels, titles and titled separators.

* * The localized texts used in methods {@code #addI15d*} can be * marked texts, i.e. strings with an optional mnemonic marker. * See the {@link MnemonicUtils} class comment for details.

* * For debugging purposes you can automatically set a tooltip for the * created labels that show its resource key. In case of an inproper * resource localization, the label will show the wrong text, and the tooltip * will help you identify the resource key with the broken localization. * This feature can be enabled by calling {@code setDebugToolTipsEnabled}. * If you want to enable it in a deployed application, you can set the system * parameter {@code I15dPanelBuilder.debugToolTipsEnabled} to "true".

* * Subclasses must implement the conversion from resource key * to the localized string in {@code #getI15dString(String)}. * For example class I15dPanelBuilder gets a ResourceBundle during * construction, and requests strings from that bundle. * * @author Karsten Lentzsch * @version $Revision: 1.12 $ * * @see ResourceBundle * * @since 1.1 */ public class I15dPanelBuilder extends PanelBuilder { private static final String DEBUG_TOOL_TIPS_ENABLED_KEY = "I15dPanelBuilder.debugToolTipsEnabled"; private static boolean debugToolTipsEnabled = getDebugToolTipSystemProperty(); /** * Holds the ResourceBundle used to look up internationalized * (i15d) String resources. */ private final StringLocalizer localizer; // Instance Creation **************************************************** /** * Constructs an I15dPanelBuilder for the given layout and resource bundle. * Uses an instance of JPanel as layout container. * * @param layout the FormLayout used to layout the container * @param bundle the ResourceBundle used to look up i15d strings * * @throws NullPointerException if {@code layout} or {@code bundle}, * is {@code null} */ public I15dPanelBuilder(FormLayout layout, ResourceBundle bundle){ this(layout, bundle, new JPanel(null)); } /** * Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, * and layout container. * * @param layout the FormLayout used to layout the container * @param bundle the ResourceBundle used to lookup i15d strings * @param container the layout container * * @throws NullPointerException if {@code layout}, {@code bundle}, * or {@code container} is {@code null} */ public I15dPanelBuilder(FormLayout layout, ResourceBundle bundle, JPanel container){ this(layout, new ResourceBundleLocalizer(bundle), container); } /** * Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, * and layout container. * * @param layout the FormLayout used to layout the container * @param localizer used to lookup i15d strings * * @throws NullPointerException if {@code layout} is {@code null} */ public I15dPanelBuilder(FormLayout layout, StringLocalizer localizer){ this(layout, localizer, new JPanel(null)); } /** * Constructs an I15dPanelBuilder for the given FormLayout, resource bundle, * and layout container. * * @param layout the FormLayout used to layout the container * @param localizer used to lookup i15d strings * @param container the layout container * * @throws NullPointerException if {@code layout} or {@code container} is {@code null} */ public I15dPanelBuilder(FormLayout layout, StringLocalizer localizer, JPanel container){ super(layout, container); this.localizer = localizer; } // Debug ToolTip Settings ************************************************* /** * Returns whether the debug tool tips are enabled or not. * * @return true if debug tool tips are enabled, false if disabled */ public static boolean isDebugToolTipsEnabled() { return debugToolTipsEnabled; } /** * Enables or disables the debug tool tips. * * @param b true to enable, false to disable */ public static void setDebugToolTipsEnabled(boolean b) { debugToolTipsEnabled = b; } // Frequently Used Panel Properties *************************************** @Override public I15dPanelBuilder background(Color background) { super.background(background); return this; } @Override public I15dPanelBuilder border(Border border) { super.border(border); return this; } @Override public I15dPanelBuilder border(String emptyBorderSpec) { super.border(emptyBorderSpec); return this; } @Override public I15dPanelBuilder opaque(boolean b) { super.opaque(b); return this; } // Adding Labels and Separators ***************************************** /** * Adds an internationalized (i15d) textual label to the form using the * specified constraints. * * @param resourceKey the resource key for the label's text * @param constraints the label's cell constraints * @return the added label */ public final JLabel addI15dLabel(String resourceKey, CellConstraints constraints) { JLabel label = addLabel(getI15dString(resourceKey), constraints); if (isDebugToolTipsEnabled()) { label.setToolTipText(resourceKey); } return label; } /** * Adds an internationalized (i15d) textual label to the form using the * specified constraints. * * @param resourceKey the resource key for the label's text * @param encodedConstraints a string representation for the constraints * @return the added label */ public final JLabel addI15dLabel(String resourceKey, String encodedConstraints) { return addI15dLabel(resourceKey, new CellConstraints(encodedConstraints)); } /** * Adds an internationalized (i15d) label and component to the panel using * the given cell constraints. Sets the label as the component label * using {@link JLabel#setLabelFor(java.awt.Component)}.

* * Note: The {@link CellConstraints} objects for the label * and the component must be different. Cell constraints are implicitly * cloned by the {@code FormLayout} when added to the container. * However, in this case you may be tempted to reuse a * {@code CellConstraints} object in the same way as with many other * builder methods that require a single {@code CellConstraints} * parameter. * The pitfall is that the methods {@code CellConstraints.xy**(...)} * just set the coordinates but do not create a new instance. * And so the second invocation of {@code xy***(...)} overrides * the settings performed in the first invocation before the object * is cloned by the {@code FormLayout}.

* * Wrong:

     * builder.addI15dLabel("name.key",
     *             CC.xy(1, 7),         // will be modified by the code below
     *             nameField,
     *             CC.xy(3, 7)          // sets the single instance to (3, 7)
     *            );
     * 
* Correct:
     * builder.addI15dLabel("name.key",
     *             CC.xy(1, 7).clone(), // cloned before the next modification
     *             nameField,
     *             CC.xy(3, 7)          // sets this instance to (3, 7)
     *            );
     * 
* * @param resourceKey the resource key for the label * @param labelConstraints the label's cell constraints * @param component the component to add * @param componentConstraints the component's cell constraints * @return the added label * @throws IllegalArgumentException if the same cell constraints instance * is used for the label and the component * @see JLabel#setLabelFor(java.awt.Component) */ public final JLabel addI15dLabel( String resourceKey, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints) { JLabel label = addLabel(getI15dString(resourceKey), labelConstraints, component, componentConstraints); if (isDebugToolTipsEnabled()) { label.setToolTipText(resourceKey); } return label; } // Adding Labels for Read-Only Fields ************************************* /** * Adds an internationalized (i15d) textual label to the form using the * specified constraints that is intended to label a read-only component. * * @param resourceKey the resource key for the label's text * @param constraints the label's cell constraints * @return the added label * * @since 1.3 */ public final JLabel addI15dROLabel(String resourceKey, CellConstraints constraints) { JLabel label = addROLabel(getI15dString(resourceKey), constraints); if (isDebugToolTipsEnabled()) { label.setToolTipText(resourceKey); } return label; } /** * Adds an internationalized (i15d) textual label to the form using the * specified constraints that is intended to label a read-only component. * * @param resourceKey the resource key for the label's text * @param encodedConstraints a string representation for the constraints * @return the added label * * @since 1.3 */ public final JLabel addI15dROLabel(String resourceKey, String encodedConstraints) { return addI15dROLabel(resourceKey, new CellConstraints(encodedConstraints)); } /** * Adds an internationalized (i15d) label and component to the panel using * the given cell constraints. Intended for read-only components. * Sets the label as the component label * using {@link JLabel#setLabelFor(java.awt.Component)}.

* * Note: The {@link CellConstraints} objects for the label * and the component must be different. Cell constraints are implicitly * cloned by the {@code FormLayout} when added to the container. * However, in this case you may be tempted to reuse a * {@code CellConstraints} object in the same way as with many other * builder methods that require a single {@code CellConstraints} * parameter. * The pitfall is that the methods {@code CellConstraints.xy**(...)} * just set the coordinates but do not create a new instance. * And so the second invocation of {@code xy***(...)} overrides * the settings performed in the first invocation before the object * is cloned by the {@code FormLayout}.

* * Wrong:

     * builder.addI15dROLabel("name.key",
     *             CC.xy(1, 7),         // will be modified by the code below
     *             nameField,
     *             CC.xy(3, 7)          // sets the single instance to (3, 7)
     *            );
     * 
* Correct:
     * builder.addI15dROLabel("name.key",
     *             CC.xy(1, 7).clone(), // cloned before the next modification
     *             nameField,
     *             CC.xy(3, 7)          // sets this instance to (3, 7)
     *            );
     * 
* Better:
     * builder.addI15dROLabel("name.key",
     *             CC.xy(1, 7)          // creates a CellConstraints object
     *             nameField,
     *             CC.xy(3, 7)          // creates another CellConstraints object
     *            );
     * 
* * @param resourceKey the resource key for the label * @param labelConstraints the label's cell constraints * @param component the component to add * @param componentConstraints the component's cell constraints * @return the added label * * @throws IllegalArgumentException if the same cell constraints instance * is used for the label and the component * * @see JLabel#setLabelFor(java.awt.Component) * * @since 1.3 */ public final JLabel addI15dROLabel( String resourceKey, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints) { JLabel label = addROLabel( getI15dString(resourceKey), labelConstraints, component, componentConstraints); if (isDebugToolTipsEnabled()) { label.setToolTipText(resourceKey); } return label; } // Adding Titled Separators *********************************************** /** * Adds an internationalized (i15d) titled separator to the form using the * specified constraints. * * @param resourceKey the resource key for the separator title * @param constraints the separator's cell constraints * @return the added titled separator */ public final JComponent addI15dSeparator(String resourceKey, CellConstraints constraints) { JComponent component = addSeparator(getI15dString(resourceKey), constraints); if (isDebugToolTipsEnabled()) { component.setToolTipText(resourceKey); } return component; } /** * Adds an internationalized (i15d) titled separator to the form using * the specified constraints. * * @param resourceKey the resource key for the separator title * @param encodedConstraints a string representation for the constraints * @return the added titled separator */ public final JComponent addI15dSeparator(String resourceKey, String encodedConstraints) { return addI15dSeparator(resourceKey, new CellConstraints(encodedConstraints)); } /** * Adds a title to the form using the specified constraints. * * @param resourceKey the resource key for the separator title * @param constraints the separator's cell constraints * @return the added title label */ public final JLabel addI15dTitle(String resourceKey, CellConstraints constraints) { JLabel label = addTitle(getI15dString(resourceKey), constraints); if (isDebugToolTipsEnabled()) { label.setToolTipText(resourceKey); } return label; } /** * Adds a title to the form using the specified constraints. * * @param resourceKey the resource key for the separator title * @param encodedConstraints a string representation for the constraints * @return the added title label */ public final JLabel addI15dTitle(String resourceKey, String encodedConstraints) { return addI15dTitle(resourceKey, new CellConstraints(encodedConstraints)); } // Helper Code ************************************************************ /** * Looks up and returns the internationalized (i15d) string for the given * resource key, for example from a {@code ResourceBundle} or * {@code ResourceMap}. * * @param resourceKey the key to look for in the resource map * @return the associated internationalized string, or the resource key * itself in case of a missing resource * @throws IllegalStateException if the localization is not possible, * for example, because no ResourceBundle or StringLocalizer * has been set */ protected final String getI15dString(String resourceKey) { checkState(localizer != null, "To use the internationalization support " + "a ResourceBundle or StringLocalizer " + "must be provided during the builder construction."); try { return localizer.getString(resourceKey); } catch (MissingResourceException ex) { Logger.getLogger(getClass().getName()).log( Level.WARNING, "Missing internationalized label", ex); return resourceKey; } } private static boolean getDebugToolTipSystemProperty() { try { String value = System.getProperty(DEBUG_TOOL_TIPS_ENABLED_KEY); return "true".equalsIgnoreCase(value); } catch (SecurityException e) { return false; } } // Helper Class ********************************************************** private static final class ResourceBundleLocalizer implements StringLocalizer { private final ResourceBundle bundle; private ResourceBundleLocalizer(ResourceBundle bundle) { this.bundle = Preconditions.checkNotNull(bundle, "The resource bundle must not be null."); } /** * Looks up and returns the internationalized (i15d) string for the given * resource key from the ResourceBundle that has been provided during * the builder construction. * * @param resourceKey the key to look for in the resource bundle * @return the associated internationalized string, or the resource key * itself in case of a missing resource * @throws IllegalStateException if no ResourceBundle * has been set */ @Override public String getString(String resourceKey) { try { return bundle.getString(resourceKey); } catch (MissingResourceException mre) { return resourceKey; } } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/ButtonStackBuilder.java0000644000175000017500000001711511766702530027431 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.awt.Color; import javax.swing.Action; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.border.Border; import com.jgoodies.forms.layout.ColumnSpec; import com.jgoodies.forms.layout.ConstantSize; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.FormSpec; import com.jgoodies.forms.layout.FormSpecs; import com.jgoodies.forms.layout.RowSpec; import com.jgoodies.forms.util.LayoutStyle; /** * A non-visual builder that assists you in building consistent button stacks * using the {@link FormLayout}.

* * This builder sets a hint for narrow margin for the gridded buttons. * This can reduce the button stack's width if some buttons have long texts. * For example, a stack with 'OK', 'Cancel', 'Configure…' will likely * exceed the minimum button width. The narrow margins help getting narrow * stacks. * Note that some look&feels do not support the narrow margin feature, * and conversely, others have only narrow margins. The JGoodies look&feels * honor the setting, the Mac Aqua l&f uses narrow margins all the time.

* * Example:
* The following example builds a button stack with Close, Up and * Down, where Up and Down are related, and Close is not related * to the other buttons, which makes a wide gap for the unrelated and * a smaller gap for the related buttons. *

 * private JPanel createCloseUpDownButtonStack(
 *         JButton close, JButton up, JButton down) {
 *     return new ButtonStackBuilder()
 *     		.addGridded(close)
 *     		.addUnrelatedGap()
 *     		.addGridded(up)
 *     		.addRelatedGap()
 *     		.addGridded(down)
 *     		.build();
 * }
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.15 $ * * @see ButtonBarBuilder * @see com.jgoodies.forms.util.LayoutStyle */ public final class ButtonStackBuilder extends AbstractButtonPanelBuilder { /** * Specifies the FormLayout's the single button stack column. */ private static final ColumnSpec[] COL_SPECS = new ColumnSpec[] { FormSpecs.BUTTON_COLSPEC }; /** * Specifies the rows of the initial FormLayout used in constructors. */ private static final RowSpec[] ROW_SPECS = new RowSpec[]{}; // Instance Creation **************************************************** /** * Constructs a ButtonStackBuilder on a default JPanel * using a pre-configured FormLayout as layout manager. */ public ButtonStackBuilder() { this(new JPanel(null)); } /** * Constructs a ButtonStackBuilder on the given panel * using a pre-configured FormLayout as layout manager. * * @param panel the layout container */ public ButtonStackBuilder(JPanel panel) { super(new FormLayout(COL_SPECS, ROW_SPECS), panel); } // Adding Components **************************************************** /** * Adds a button component that has a minimum width * specified by the {@link LayoutStyle#getDefaultButtonWidth()}.

* * Although a JButton is expected, any JComponent is accepted * to allow custom button component types. * * @param button the component to add * * @return this builder * * @throws NullPointerException if {@code button} is {@code null} */ @Override public ButtonStackBuilder addButton(JComponent button) { checkNotNull(button, "The button must not be null."); getLayout().appendRow(FormSpecs.PREF_ROWSPEC); getLayout().addGroupedRow(getRow()); add(button); nextRow(); return this; } @Override public ButtonStackBuilder addButton(JComponent... buttons) { super.addButton(buttons); return this; } // Convenience Methods *************************************************** @Override public ButtonStackBuilder addButton(Action... actions) { super.addButton(actions); return this; } /** * Adds a fixed size component. * * @param component the component to add */ public ButtonStackBuilder addFixed(JComponent component) { getLayout().appendRow(FormSpecs.PREF_ROWSPEC); add(component); nextRow(); return this; } // Spacing **************************************************************** /** * Adds a glue that will be given the extra space, * if this box is larger than its preferred size. */ public ButtonStackBuilder addGlue() { appendGlueRow(); nextRow(); return this; } @Override public ButtonStackBuilder addRelatedGap() { appendRelatedComponentsGapRow(); nextRow(); return this; } @Override public ButtonStackBuilder addUnrelatedGap() { appendUnrelatedComponentsGapRow(); nextRow(); return this; } /** * Adds a strut of a specified size. * * @param size a constant that describes the gap */ public ButtonStackBuilder addStrut(ConstantSize size) { getLayout().appendRow(new RowSpec(RowSpec.TOP, size, FormSpec.NO_GROW)); nextRow(); return this; } // Configuration ********************************************************** @Override public ButtonStackBuilder background(Color background) { super.background(background); return this; } @Override public ButtonStackBuilder border(Border border) { super.border(border); return this; } @Override public ButtonStackBuilder opaque(boolean b) { super.opaque(b); return this; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/PanelBuilder.java0000644000175000017500000011103411764277250026226 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import static com.jgoodies.common.base.Preconditions.checkArgument; import java.awt.Color; import java.awt.Component; import java.lang.ref.WeakReference; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingConstants; import javax.swing.border.Border; import com.jgoodies.forms.factories.Borders; import com.jgoodies.forms.factories.ComponentFactory; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * An general purpose panel builder that uses the {@link FormLayout} * to lay out {@code JPanel}s. It provides convenience methods * to set a default border and to add labels, titles and titled separators.

* * The PanelBuilder is the working horse for layouts when more specialized * builders like the {@link ButtonBarBuilder} or {@link DefaultFormBuilder} * are inappropriate.

* * The Forms tutorial includes several examples that present and compare * different style to build with the PanelBuilder: static row numbers * vs. row variable, explicit CellConstraints vs. builder cursor, * static rows vs. dynamically added rows. Also, you may check out the * Tips & Tricks section of the Forms HTML documentation.

* * The text arguments passed to the methods {@code #addLabel}, * {@code #addTitle}, and {@code #addSeparator} can contain * an optional mnemonic marker. The mnemonic and mnemonic index * are indicated by a single ampersand (&). For example * "&Save", or "Save &as". * To use the ampersand itself duplicate it, for example * "Look&&Feel".

* * Example:
* This example creates a panel with 3 columns and 3 rows. *

 * FormLayout layout = new FormLayout(
 *      "pref, $lcgap, 50dlu, $rgap, default",  // columns
 *      "pref, $lg, pref, $lg, pref");          // rows
 *
 * PanelBuilder builder = new PanelBuilder(layout);
 * builder.addLabel("&Title:",        CC.xy  (1, 1));
 * builder.add(new JTextField(),      CC.xywh(3, 1, 3, 1));
 * builder.addLabel("&Price:",        CC.xy  (1, 3));
 * builder.add(new JTextField(),      CC.xy  (3, 3));
 * builder.addLabel("&Author:",       CC.xy  (1, 5));
 * builder.add(new JTextField(),      CC.xy  (3, 5));
 * builder.add(new JButton("\u2026"), CC.xy  (5, 5));
 * return builder.getPanel();
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.21 $ * * @see com.jgoodies.forms.factories.ComponentFactory * @see I15dPanelBuilder * @see DefaultFormBuilder */ public class PanelBuilder extends AbstractFormBuilder { // Constants ************************************************************** /** * A JComponent client property that is used to determine the label * labeling a component. Copied from the JLabel class. */ private static final String LABELED_BY_PROPERTY = "labeledBy"; // Static Fields ********************************************************** /** * The global default for the enablement of the setLabelFor feature. * Turned on by default. * * @see #setLabelForFeatureEnabledDefault(boolean) * @see #setLabelForFeatureEnabled(boolean) */ private static boolean labelForFeatureEnabledDefault = true; /** * Holds the global default opaque state that can be overridden * per builder. Since the Forms 1.6, the default value is {@code false}, * in other words, panels will not be opaque. */ private static boolean opaqueDefault = false; // Instance Fields ******************************************************** /** * The instance value for the setLabelFor feature. * Is initialized using the global default. * * @see #setLabelForFeatureEnabled(boolean) * @see #setLabelForFeatureEnabledDefault(boolean) */ private boolean labelForFeatureEnabled; /** * Refers to the most recently added label. * Used to invoke {@link JLabel#setLabelFor(java.awt.Component)} * for the next component added to the panel that is applicable for * this feature (for example focusable). After the association * has been set, the reference will be cleared. * * @see #add(Component, CellConstraints) */ private WeakReference mostRecentlyAddedLabelReference = null; // Instance Creation ****************************************************** /** * Constructs a {@code PanelBuilder} for the given * layout. Uses an instance of {@code JPanel} as layout container * with the given layout as layout manager. * * @param layout the FormLayout to use * * @throws NullPointerException if {@code layout} is {@code null} */ public PanelBuilder(FormLayout layout){ this(layout, new JPanel(null)); } /** * Constructs a {@code PanelBuilder} for the given * FormLayout and layout container. * * @param layout the FormLayout to use * @param panel the layout container to build on * * @throws NullPointerException if {@code layout} or {@code container} is {@code null} */ public PanelBuilder(FormLayout layout, JPanel panel){ super(layout, panel); opaque(getOpaqueDefault()); labelForFeatureEnabled = labelForFeatureEnabledDefault; } // Global Defaults ******************************************************** /** * Returns the global default for the enablement of the setLabelFor feature. * This can be overridden per PanelBuilder using * {@link #labelForFeatureEnabled(boolean)}. * The feature is globally disabled by default. * * @return true for globally enabled, false for globally disabled */ public static boolean getLabelForFeatureEnabledDefault() { return labelForFeatureEnabledDefault; } /** * Sets the default value for the setLabelFor feature enablement. * This can be overridden per PanelBuilder using * {@link #labelForFeatureEnabled(boolean)}. * The default value is used to set the initial PanelBuilder * setting for this feature. * The feature is globally disabled by default. * * @param b true for globally enabled, false for globally disabled */ public static void setLabelForFeatureEnabledDefault(boolean b) { labelForFeatureEnabledDefault = b; } /** * @return the global default value for a builder's opaque state * that can be overridden per builder */ public static boolean getOpaqueDefault() { return opaqueDefault; } /** * Sets the global default value for a builder's opaque state * that can be overridden per builder. * Since the Forms 1.6, the default value is {@code false}, * in other words, panels will not be opaque. * * @param b the new value */ public static void setOpaqueDefault(boolean b) { opaqueDefault = b; } // Accessors ************************************************************** /** * Returns the panel used to build the form. * * @return the panel used by this builder to build the form */ public final JPanel getPanel() { return (JPanel) getContainer(); } /** * Sets the panel's border. * * @param border the border to set * * @see JComponent#setBorder(Border) * @deprecated Replaced by {@link #border(Border)} */ @Deprecated public void setBorder(Border border) { getPanel().setBorder(border); } /** * Sets the default dialog border. * * @see Borders * @deprecated Replaced by {@code #border(Borders.DIALOG)} */ @Deprecated public void setDefaultDialogBorder() { border(Borders.DIALOG); } /** * Sets the panel's opaque state. * * @param b true for opaque, false for non-opaque * * @see JComponent#setOpaque(boolean) * * @since 1.1 * @deprecated Replaced by {@link #opaque(boolean)} */ @Deprecated public void setOpaque(boolean b) { getPanel().setOpaque(b); } // Frequently Used Panel Properties *************************************** /** * Sets the panel's background color and the panel to be opaque. * * @param background the color to set as new background * * @see JComponent#setBackground(Color) * * @since 1.1 */ public PanelBuilder background(Color background) { getPanel().setBackground(background); opaque(true); return this; } /** * Sets the panel's border. * * @param border the border to set * * @see JComponent#setBorder(Border) */ public PanelBuilder border(Border border) { getPanel().setBorder(border); return this; } /** * Sets the panel's border as an EmptyBorder using the given specification * for the top, left, bottom, right in DLU. For example * "1dlu, 2dlu, 3dlu, 4dlu" sets an empty border with 1dlu in the top, * 2dlu in the left side, 3dlu at the bottom, and 4dlu in the right hand * side.

* * Equivalent to {@code setBorder(Borders.createEmptyBorder(emptyBorderSpec))}. * * @param emptyBorderSpec describes the top, left, bottom, right sizes * of the EmptyBorder to create * * @see Borders#createEmptyBorder(String) */ public PanelBuilder border(String emptyBorderSpec) { border(Borders.createEmptyBorder(emptyBorderSpec)); return this; } /** * Sets the panel's opaque state. * * @param b true for opaque, false for non-opaque * * @see JComponent#setOpaque(boolean) * * @since 1.1 */ public PanelBuilder opaque(boolean b) { getPanel().setOpaque(b); return this; } /** * Enables or disables the setLabelFor feature for this PanelBuilder. * The value is initialized from the global default value * {@link #getLabelForFeatureEnabledDefault()}. It is globally disabled * by default. * * @param b true for enabled, false for disabled */ public PanelBuilder labelForFeatureEnabled(boolean b) { labelForFeatureEnabled = b; return this; } /** * Returns the panel used to build the form. * * @return the panel used by this builder to build the form */ public final JPanel build() { return getPanel(); } // Adding Labels ********************************************************** /** * Adds a textual label to the form using the default constraints.

* *

     * addLabel("Name:");       // No Mnemonic
     * addLabel("N&ame:");      // Mnemonic is 'a'
     * addLabel("Save &as:");   // Mnemonic is the second 'a'
     * addLabel("Look&&Feel:"); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return the new label * * @see ComponentFactory */ public final JLabel addLabel(String textWithMnemonic) { return addLabel(textWithMnemonic, cellConstraints()); } /** * Adds a textual label to the form using the specified constraints.

* *

     * addLabel("Name:",       CC.xy(1, 1)); // No Mnemonic
     * addLabel("N&ame:",      CC.xy(1, 1)); // Mnemonic is 'a'
     * addLabel("Save &as:",   CC.xy(1, 1)); // Mnemonic is the second 'a'
     * addLabel("Look&&Feel:", CC.xy(1, 1)); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @param constraints the label's cell constraints * @return the new label * * @see ComponentFactory */ public final JLabel addLabel(String textWithMnemonic, CellConstraints constraints) { JLabel label = getComponentFactory().createLabel(textWithMnemonic); add(label, constraints); return label; } /** * Adds a textual label to the form using the specified constraints.

* *

     * addLabel("Name:",       "1, 1"); // No Mnemonic
     * addLabel("N&ame:",      "1, 1"); // Mnemonic is 'a'
     * addLabel("Save &as:",   "1, 1"); // Mnemonic is the second 'a'
     * addLabel("Look&&Feel:", "1, 1"); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @param encodedConstraints a string representation for the constraints * @return the new label * * @see ComponentFactory */ public final JLabel addLabel(String textWithMnemonic, String encodedConstraints) { return addLabel(textWithMnemonic, new CellConstraints(encodedConstraints)); } /** * Adds a label and component to the panel using the given cell constraints. * Sets the given label as the component label using * {@link JLabel#setLabelFor(java.awt.Component)}.

* * Note: The {@link CellConstraints} objects for the label * and the component must be different. Cell constraints are implicitly * cloned by the {@code FormLayout} when added to the container. * However, in this case you may be tempted to reuse a * {@code CellConstraints} object in the same way as with many other * builder methods that require a single {@code CellConstraints} * parameter. * The pitfall is that the methods {@code CellConstraints.xy*(...)} * just set the coordinates but do not create a new instance. * And so the second invocation of {@code xy*(...)} overrides * the settings performed in the first invocation before the object * is cloned by the {@code FormLayout}.

* * Wrong:

     * builder.addLabel(
     *     "&Name:",            // Mnemonic is 'N'
     *     cc.xy(1, 7),         // will be modified by the code below
     *     nameField,
     *     cc.xy(3, 7)          // sets the single instance to (3, 7)
     * );
     * 
* Correct:
     * builder.addLabel(
     *     "&Name:",
     *     CC.xy(1, 7),         // creates an instance
     *     nameField,
     *     CC.xy(3, 7)          // creates another instance
     * );
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @param labelConstraints the label's cell constraints * @param component the component to add * @param componentConstraints the component's cell constraints * @return the added label * @throws IllegalArgumentException if the same cell constraints instance * is used for the label and the component * * @see JLabel#setLabelFor(java.awt.Component) * @see ComponentFactory * @see DefaultFormBuilder */ public final JLabel addLabel( String textWithMnemonic, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints) { if (labelConstraints == componentConstraints) { throw new IllegalArgumentException( "You must provide two CellConstraints instances, " + "one for the label and one for the component.\n" + "Consider using the CC class. See the JavaDocs for details."); } JLabel label = addLabel(textWithMnemonic, labelConstraints); add(component, componentConstraints); label.setLabelFor(component); return label; } // Adding Labels for Read-Only Components --------------------------------- /** * Adds a textual label intended for labeling read-only components * to the form using the default constraints.

* *

     * addROLabel("Name:");       // No Mnemonic
     * addROLabel("N&ame:");      // Mnemonic is 'a'
     * addROLabel("Save &as:");   // Mnemonic is the second 'a'
     * addROLabel("Look&&Feel:"); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @return the new label * * @since 1.3 */ public final JLabel addROLabel(String textWithMnemonic) { return addROLabel(textWithMnemonic, cellConstraints()); } /** * Adds a textual label intended for labeling read-only components * to the form using the specified constraints.

* *

     * addROLabel("Name:",       CC.xy(1, 1)); // No Mnemonic
     * addROLabel("N&ame:",      CC.xy(1, 1)); // Mnemonic is 'a'
     * addROLabel("Save &as:",   CC.xy(1, 1)); // Mnemonic is the second 'a'
     * addROLabel("Look&&Feel:", CC.xy(1, 1)); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @param constraints the label's cell constraints * @return the new label * * @since 1.3 */ public final JLabel addROLabel(String textWithMnemonic, CellConstraints constraints) { JLabel label = getComponentFactory().createReadOnlyLabel(textWithMnemonic); add(label, constraints); return label; } /** * Adds a textual label intended for labeling read-only components * to the form using the specified constraints.

* *

     * addROLabel("Name:",       "1, 1"); // No Mnemonic
     * addROLabel("N&ame:",      "1, 1"); // Mnemonic is 'a'
     * addROLabel("Save &as:",   "1, 1"); // Mnemonic is the second 'a'
     * addROLabel("Look&&Feel:", "1, 1"); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @param encodedConstraints a string representation for the constraints * @return the new label * * @since 1.3 */ public final JLabel addROLabel(String textWithMnemonic, String encodedConstraints) { return addROLabel(textWithMnemonic, new CellConstraints(encodedConstraints)); } /** * Adds a label and component to the panel using the given cell constraints. * Sets the given label as the component label using * {@link JLabel#setLabelFor(java.awt.Component)}.

* * Note: The {@link CellConstraints} objects for the label * and the component must be different. Cell constraints are implicitly * cloned by the FormLayout when added to the container. * However, in this case you may be tempted to reuse a * {@code CellConstraints} object in the same way as with many other * builder methods that require a single {@code CellConstraints} * parameter. * The pitfall is that the methods {@code CellConstraints.xy*(...)} * just set the coordinates but do not create a new instance. * And so the second invocation of {@code xy*(...)} overrides * the settings performed in the first invocation before the object * is cloned by the {@code FormLayout}.

* * Wrong:

     * builder.addROLabel(
     *     "&Name:",            // Mnemonic is 'N'
     *     cc.xy(1, 7),         // will be modified by the code below
     *     nameField,
     *     cc.xy(3, 7)          // sets the single instance to (3, 7)
     * );
     * 
* Correct:
     * builder.addROLabel(
     *     "&Name:",
     *     CC.xy(1, 7),          // creates an instance
     *     nameField,
     *     CC.xy(3, 7)           // creates another instance
     * );
     * 
* * @param textWithMnemonic the label's text - * may contain an ampersand (&) to mark a mnemonic * @param labelConstraints the label's cell constraints * @param component the component to add * @param componentConstraints the component's cell constraints * @return the added label * @throws IllegalArgumentException if the same cell constraints instance * is used for the label and the component * * @see JLabel#setLabelFor(java.awt.Component) * @see DefaultFormBuilder * * @since 1.3 */ public final JLabel addROLabel( String textWithMnemonic, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints) { checkConstraints(labelConstraints, componentConstraints); JLabel label = addROLabel(textWithMnemonic, labelConstraints); add(component, componentConstraints); label.setLabelFor(component); return label; } // Adding Titles ---------------------------------------------------------- /** * Adds a title label to the form using the default constraints.

* *

     * addTitle("Name");       // No mnemonic
     * addTitle("N&ame");      // Mnemonic is 'a'
     * addTitle("Save &as");   // Mnemonic is the second 'a'
     * addTitle("Look&&Feel"); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the title label's text - * may contain an ampersand (&) to mark a mnemonic * @return the added title label * * @see ComponentFactory */ public final JLabel addTitle(String textWithMnemonic) { return addTitle(textWithMnemonic, cellConstraints()); } /** * Adds a title label to the form using the specified constraints.

* *

     * addTitle("Name",       CC.xy(1, 1)); // No mnemonic
     * addTitle("N&ame",      CC.xy(1, 1)); // Mnemonic is 'a'
     * addTitle("Save &as",   CC.xy(1, 1)); // Mnemonic is the second 'a'
     * addTitle("Look&&Feel", CC.xy(1, 1)); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the title label's text - * may contain an ampersand (&) to mark a mnemonic * @param constraints the separator's cell constraints * @return the added title label * * @see ComponentFactory */ public final JLabel addTitle(String textWithMnemonic, CellConstraints constraints) { JLabel titleLabel = getComponentFactory().createTitle(textWithMnemonic); add(titleLabel, constraints); return titleLabel; } /** * Adds a title label to the form using the specified constraints.

* *

     * addTitle("Name",       "1, 1"); // No mnemonic
     * addTitle("N&ame",      "1, 1"); // Mnemonic is 'a'
     * addTitle("Save &as",   "1, 1"); // Mnemonic is the second 'a'
     * addTitle("Look&&Feel", "1, 1"); // No mnemonic, text is Look&Feel
     * 
* * @param textWithMnemonic the title label's text - * may contain an ampersand (&) to mark a mnemonic * @param encodedConstraints a string representation for the constraints * @return the added title label * * @see ComponentFactory */ public final JLabel addTitle(String textWithMnemonic, String encodedConstraints) { return addTitle(textWithMnemonic, new CellConstraints(encodedConstraints)); } // Adding Separators ------------------------------------------------------ /** * Adds a titled separator to the form that spans all columns.

* *

     * addSeparator("Name");       // No Mnemonic
     * addSeparator("N&ame");      // Mnemonic is 'a'
     * addSeparator("Save &as");   // Mnemonic is the second 'a'
     * addSeparator("Look&&Feel"); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the separator label's text - * may contain an ampersand (&) to mark a mnemonic * @return the added separator */ public final JComponent addSeparator(String textWithMnemonic) { return addSeparator(textWithMnemonic, getLayout().getColumnCount()); } /** * Adds a titled separator to the form using the specified constraints.

* *

     * addSeparator("Name",       CC.xy(1, 1)); // No Mnemonic
     * addSeparator("N&ame",      CC.xy(1, 1)); // Mnemonic is 'a'
     * addSeparator("Save &as",   CC.xy(1, 1)); // Mnemonic is the second 'a'
     * addSeparator("Look&&Feel", CC.xy(1, 1)); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the separator label's text - * may contain an ampersand (&) to mark a mnemonic * @param constraints the separator's cell constraints * @return the added separator */ public final JComponent addSeparator(String textWithMnemonic, CellConstraints constraints) { int titleAlignment = isLeftToRight() ? SwingConstants.LEFT : SwingConstants.RIGHT; JComponent titledSeparator = getComponentFactory().createSeparator(textWithMnemonic, titleAlignment); add(titledSeparator, constraints); return titledSeparator; } /** * Adds a titled separator to the form using the specified constraints.

* *

     * addSeparator("Name",       "1, 1"); // No Mnemonic
     * addSeparator("N&ame",      "1, 1"); // Mnemonic is 'a'
     * addSeparator("Save &as",   "1, 1"); // Mnemonic is the second 'a'
     * addSeparator("Look&&Feel", "1, 1"); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the separator label's text - * may contain an ampersand (&) to mark a mnemonic * @param encodedConstraints a string representation for the constraints * @return the added separator */ public final JComponent addSeparator(String textWithMnemonic, String encodedConstraints) { return addSeparator(textWithMnemonic, new CellConstraints(encodedConstraints)); } /** * Adds a titled separator to the form that spans the specified columns.

* *

     * addSeparator("Name",       3); // No Mnemonic
     * addSeparator("N&ame",      3); // Mnemonic is 'a'
     * addSeparator("Save &as",   3); // Mnemonic is the second 'a'
     * addSeparator("Look&&Feel", 3); // No mnemonic, text is "look&feel"
     * 
* * @param textWithMnemonic the separator label's text - * may contain an ampersand (&) to mark a mnemonic * @param columnSpan the number of columns the separator spans * @return the added separator */ public final JComponent addSeparator(String textWithMnemonic, int columnSpan) { return addSeparator(textWithMnemonic, createLeftAdjustedConstraints(columnSpan)); } /** * Adds a label and component to the panel using the given cell constraints. * Sets the given label as the component label using * {@link JLabel#setLabelFor(java.awt.Component)}.

* * Note: The {@link CellConstraints} objects for the label * and the component must be different. Cell constraints are implicitly * cloned by the {@code FormLayout} when added to the container. * However, in this case you may be tempted to reuse a * {@code CellConstraints} object in the same way as with many other * builder methods that require a single {@code CellConstraints} * parameter. * The pitfall is that the methods {@code CellConstraints.xy*(...)} * just set the coordinates but do not create a new instance. * And so the second invocation of {@code xy*(...)} overrides * the settings performed in the first invocation before the object * is cloned by the {@code FormLayout}.

* * Wrong:

     * CellConstraints cc = new CellConstraints();
     * builder.add(
     *     nameLabel,
     *     cc.xy(1, 7),         // will be modified by the code below
     *     nameField,
     *     cc.xy(3, 7)          // sets the single instance to (3, 7)
     * );
     * 
* Correct:
     * builder.add(
     *     nameLabel,
     *     CC.xy(1, 7),         // creates an instance
     *     nameField,
     *     CC.xy(3, 7)          // creates another instance
     * );
     * 
* * @param label the label to add * @param labelConstraints the label's cell constraints * @param component the component to add * @param componentConstraints the component's cell constraints * @return the added label * @throws IllegalArgumentException if the same cell constraints instance * is used for the label and the component * * @see JLabel#setLabelFor(java.awt.Component) * @see DefaultFormBuilder */ public final JLabel add(JLabel label, CellConstraints labelConstraints, Component component, CellConstraints componentConstraints) { checkConstraints(labelConstraints, componentConstraints); add(label, labelConstraints); add(component, componentConstraints); label.setLabelFor(component); return label; } // Accessing the ComponentFactory ***************************************** /** * Adds a component to the panel using the given cell constraints. * In addition to the superclass behavior, this implementation * tracks the most recently added label, and associates it with * the next added component that is applicable for being set as component * for the label. * * @param component the component to add * @param cellConstraints the component's cell constraints * @return the added component * * @see #isLabelForApplicable(JLabel, Component) */ @Override public Component add(Component component, CellConstraints cellConstraints) { Component result = super.add(component, cellConstraints); if (!labelForFeatureEnabled) { return result; } JLabel mostRecentlyAddedLabel = getMostRecentlyAddedLabel(); if ( mostRecentlyAddedLabel != null && isLabelForApplicable(mostRecentlyAddedLabel, component)) { setLabelFor(mostRecentlyAddedLabel, component); clearMostRecentlyAddedLabel(); } if (component instanceof JLabel) { setMostRecentlyAddedLabel((JLabel) component); } return result; } // Default Behavior ******************************************************* /** * Checks and answers whether the given component shall be set * as component for a previously added label using * {@link JLabel#setLabelFor(Component)}. * * This default implementation checks whether the component is focusable, * and - if a JComponent - whether it is already labeled by a JLabel. * Subclasses may override. * * @param label the candidate for labeling {@code component} * @param component the component that could be labeled by {@code label} * @return true if focusable, false otherwise */ protected boolean isLabelForApplicable(JLabel label, Component component) { // 1) Is the label labeling a component? if (label.getLabelFor() != null) { return false; } // 2) Is the component focusable? if (!component.isFocusable()) { return false; } // 3) Is the component labeled by another label? if (!(component instanceof JComponent)) { return true; } JComponent c = (JComponent) component; return c.getClientProperty(LABELED_BY_PROPERTY) == null; } /** * Sets {@code label} as labeling label for {@code component} or an * appropriate child. In case of a JScrollPane as given component, * this default implementation labels the view of the scroll pane's * viewport. * * @param label the labeling label * @param component the component to be labeled, or the parent of * the labeled component */ protected void setLabelFor(JLabel label, Component component) { Component labeledComponent; if (component instanceof JScrollPane) { JScrollPane scrollPane = (JScrollPane) component; labeledComponent = scrollPane.getViewport().getView(); } else { labeledComponent = component; } label.setLabelFor(labeledComponent); } // Helper Code ************************************************************ /** * Returns the most recently added JLabel that has a mnemonic set * - if any, {@code null}, if none has been set, or if it has * been cleared after setting an association before, or if it has been * cleared by the garbage collector. * * @return the most recently added JLabel that has a mnemonic set * and has not been associated with a component applicable for this * feature. {@code null} otherwise. */ private JLabel getMostRecentlyAddedLabel() { if (mostRecentlyAddedLabelReference == null) { return null; } JLabel label = (JLabel) mostRecentlyAddedLabelReference.get(); if (label == null) { return null; } return label; } /** * Sets the given label as most recently added label using a weak reference. * * @param label the label to be set */ private void setMostRecentlyAddedLabel(JLabel label) { mostRecentlyAddedLabelReference = new WeakReference(label); } /** * Clears the reference to the most recently added mnemonic label. */ private void clearMostRecentlyAddedLabel() { mostRecentlyAddedLabelReference = null; } private static void checkConstraints(CellConstraints c1, CellConstraints c2) { checkArgument(c1 != c2, "You must provide two CellConstraints instances, " + "one for the label and one for the component.\n" + "Consider using the CC factory. See the JavaDocs for details."); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/AbstractBuilder.java0000644000175000017500000001712411753010000026707 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.awt.Container; import com.jgoodies.forms.factories.ComponentFactory; import com.jgoodies.forms.factories.DefaultComponentFactory; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * An abstract class that minimizes the effort required to implement * non-visual builders that use the {@link FormLayout}.

* * Builders hide details of the FormLayout and provide convenience behavior * that assists you in constructing a form, bar, stack. * This class provides a cell cursor that helps you traverse a form while * you add components. Also, it offers several methods to append custom * and logical columns and rows. * * @author Karsten Lentzsch * @version $Revision: 1.3 $ * * @see ButtonBarBuilder * @see ButtonStackBuilder * @see PanelBuilder * @see I15dPanelBuilder * @see DefaultFormBuilder */ public abstract class AbstractBuilder { /** * Holds the global factory that is used as default for the * per-instance component factory. */ private static ComponentFactory componentFactoryDefault; /** * Holds the layout container that we are building. */ private final Container container; /** * Holds the FormLayout instance that is used * to specify, fill and layout this form. */ private final FormLayout layout; /** * Holds an instance of {@link CellConstraints} that will be used to * specify the location, extent and alignments of the component to be * added next. */ protected final CellConstraints currentCellConstraints; /** * Refers to a factory that is used to create labels, titles, * separators, and buttons. */ private ComponentFactory componentFactory; // Instance Creation **************************************************** /** * Constructs an AbstractBuilder * for the given FormLayout and layout container. * * @param layout the FormLayout to use * @param container the layout container * * @throws NullPointerException if {@code layout} or {@code container} is {@code null} */ protected AbstractBuilder(FormLayout layout, Container container) { this.layout = checkNotNull(layout, "The layout must not be null."); this.container = checkNotNull(container, "The layout container must not be null."); container.setLayout(layout); currentCellConstraints = new CellConstraints(); } // Accessors ************************************************************ /** * Returns the factory that is used as default for new builder's * as they are created. This default itself is lazily initialized * as the {@link DefaultComponentFactory}. * * @return the factory that is used as default for new builder instances */ public static ComponentFactory getComponentFactoryDefault() { if (componentFactoryDefault == null) { componentFactoryDefault = new DefaultComponentFactory(); } return componentFactoryDefault; } /** * Sets the global default that is used to initialize the per-instance * component factory. * * @param factory the factory to be used for all new builder instances * that do not override the default */ public static void setComponentFactoryDefault(ComponentFactory factory) { componentFactoryDefault = factory; } /** * Returns the container used to build the form. * * @return the layout container */ public final Container getContainer() { return container; } /** * Returns the FormLayout instance used to build this form. * * @return the FormLayout */ public final FormLayout getLayout() { return layout; } /** * Returns the number of columns in the form. * * @return the number of columns */ public final int getColumnCount() { return getLayout().getColumnCount(); } /** * Returns the number of rows in the form. * * @return the number of rows */ public final int getRowCount() { return getLayout().getRowCount(); } /** * Returns this builder's component factory. If no factory * has been set before, it is lazily initialized from the global * default as returned by {@link #getComponentFactoryDefault()}. * * @return the component factory * * @see #setComponentFactory(ComponentFactory) */ public final ComponentFactory getComponentFactory() { if (componentFactory == null) { componentFactory = createComponentFactory(); } return componentFactory; } /** * Sets a new component factory for this builder, * overriding the default as provided by * {@link #getComponentFactoryDefault()}. * * @param newFactory the component factory to be used for this builder * * @see #getComponentFactory() */ public final void setComponentFactory(ComponentFactory newFactory) { componentFactory = newFactory; } /** * Invoked when the per-instance component factory is lazily initialized. * This implementation returns the global default factory.

* * Subclasses may override to use a factory other than the global default. * However, in most cases it is sufficient to just set a new gobal default * using {@link #setComponentFactoryDefault(ComponentFactory)}. * * @return the factory used during the lazy initialization of * the per-instance component factory */ protected ComponentFactory createComponentFactory() { return getComponentFactoryDefault(); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/AbstractFormBuilder.java0000644000175000017500000004266211751011176027555 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import java.awt.Component; import java.awt.ComponentOrientation; import java.awt.Container; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.ColumnSpec; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.FormSpecs; import com.jgoodies.forms.layout.RowSpec; /** * An abstract class that minimizes the effort required to implement * non-visual builders that use the {@link FormLayout}.

* * Builders hide details of the FormLayout and provide convenience behavior * that assists you in constructing a form. * This class provides a cell cursor that helps you traverse a form while * you add components. Also, it offers several methods to append custom * and logical columns and rows. * * @author Karsten Lentzsch * @version $Revision: 1.16 $ * * @see ButtonBarBuilder * @see ButtonStackBuilder * @see PanelBuilder * @see I15dPanelBuilder * @see DefaultFormBuilder */ public abstract class AbstractFormBuilder extends AbstractBuilder { /** * Specifies if we fill the grid from left to right or right to left. * This value is initialized during the construction from the layout * container's component orientation. * * @see #isLeftToRight() * @see #setLeftToRight(boolean) * @see ComponentOrientation */ private boolean leftToRight; // Instance Creation **************************************************** /** * Constructs an AbstractFormBuilder * for the given FormLayout and layout container. * * @param layout the FormLayout to use * @param container the layout container * * @throws NullPointerException if {@code layout} or {@code container} is {@code null} */ public AbstractFormBuilder(FormLayout layout, Container container) { super(layout, container); ComponentOrientation orientation = container.getComponentOrientation(); leftToRight = orientation.isLeftToRight() || !orientation.isHorizontal(); } // Accessors ************************************************************ /** * Returns whether this builder fills the form left-to-right * or right-to-left. The initial value of this property is set * during the builder construction from the layout container's * {@code componentOrientation} property. * * @return true indicates left-to-right, false indicates right-to-left * * @see #setLeftToRight(boolean) * @see ComponentOrientation */ public final boolean isLeftToRight() { return leftToRight; } /** * Sets the form fill direction to left-to-right or right-to-left. * The initial value of this property is set during the builder construction * from the layout container's {@code componentOrientation} property. * * @param b true indicates left-to-right, false right-to-left * * @see #isLeftToRight() * @see ComponentOrientation */ public final void setLeftToRight(boolean b) { leftToRight = b; } // Accessing the Cursor Location and Extent ***************************** /** * Returns the cursor's column. * * @return the cursor's column */ public final int getColumn() { return currentCellConstraints.gridX; } /** * Sets the cursor to the given column. * * @param column the cursor's new column index */ public final void setColumn(int column) { currentCellConstraints.gridX = column; } /** * Returns the cursor's row. * * @return the cursor's row */ public final int getRow() { return currentCellConstraints.gridY; } /** * Sets the cursor to the given row. * * @param row the cursor's new row index */ public final void setRow(int row) { currentCellConstraints.gridY = row; } /** * Sets the cursor's column span. * * @param columnSpan the cursor's new column span (grid width) */ public final void setColumnSpan(int columnSpan) { currentCellConstraints.gridWidth = columnSpan; } /** * Sets the cursor's row span. * * @param rowSpan the cursor's new row span (grid height) */ public final void setRowSpan(int rowSpan) { currentCellConstraints.gridHeight = rowSpan; } /** * Sets the cursor's origin to the given column and row. * * @param column the new column index * @param row the new row index */ public final void setOrigin(int column, int row) { setColumn(column); setRow(row); } /** * Sets the cursor's extent to the given column span and row span. * * @param columnSpan the new column span (grid width) * @param rowSpan the new row span (grid height) */ public final void setExtent(int columnSpan, int rowSpan) { setColumnSpan(columnSpan); setRowSpan(rowSpan); } /** * Sets the cell bounds (location and extent) to the given column, row, * column span and row span. * * @param column the new column index (grid x) * @param row the new row index (grid y) * @param columnSpan the new column span (grid width) * @param rowSpan the new row span (grid height) */ public final void setBounds(int column, int row, int columnSpan, int rowSpan) { setColumn(column); setRow(row); setColumnSpan(columnSpan); setRowSpan(rowSpan); } // Accessing the Cursor Location and Extent ***************************** /** * Sets the horizontal alignment. * * @param alignment the new horizontal alignment */ public final void setHAlignment(CellConstraints.Alignment alignment) { cellConstraints().hAlign = alignment; } /** * Sets the vertical alignment. * * @param alignment the new vertical alignment */ public final void setVAlignment(CellConstraints.Alignment alignment) { cellConstraints().vAlign = alignment; } /** * Sets the horizontal and vertical alignment. * * @param hAlign the new horizontal alignment * @param vAlign the new vertical alignment */ public final void setAlignment(CellConstraints.Alignment hAlign, CellConstraints.Alignment vAlign) { setHAlignment(hAlign); setVAlignment(vAlign); } // Moving the Cursor ****************************************************** /** * Moves to the next column, does the same as #nextColumn(1). */ public final void nextColumn() { nextColumn(1); } /** * Moves to the next column. * * @param columns number of columns to move */ public final void nextColumn(int columns) { cellConstraints().gridX += columns * getColumnIncrementSign(); } /** * Increases the row by one; does the same as #nextRow(1). */ public final void nextRow() { nextRow(1); } /** * Increases the row by the specified rows. * * @param rows number of rows to move */ public final void nextRow(int rows) { cellConstraints().gridY += rows; } /** * Moves to the next line: increases the row and resets the column; * does the same as #nextLine(1). */ public final void nextLine() { nextLine(1); } /** * Moves the cursor down several lines: increases the row by the * specified number of lines and sets the cursor to the leading column. * * @param lines number of rows to move */ public final void nextLine(int lines) { nextRow(lines); setColumn(getLeadingColumn()); } // Appending Columns ****************************************************** /** * Appends the given column specification to the builder's layout. * * @param columnSpec the column specification object to append * * @see #appendColumn(String) */ public final void appendColumn(ColumnSpec columnSpec) { getLayout().appendColumn(columnSpec); } /** * Appends a column specification to the builder's layout * that represents the given string encoding. * * @param encodedColumnSpec the column specification to append in encoded form * * @see #appendColumn(ColumnSpec) */ public final void appendColumn(String encodedColumnSpec) { appendColumn(ColumnSpec.decode(encodedColumnSpec)); } /** * Appends a glue column. * * @see #appendLabelComponentsGapColumn() * @see #appendRelatedComponentsGapColumn() * @see #appendUnrelatedComponentsGapColumn() */ public final void appendGlueColumn() { appendColumn(FormSpecs.GLUE_COLSPEC); } /** * Appends a column that is the default gap between a label and * its associated component. * * @since 1.0.3 * * @see #appendGlueColumn() * @see #appendRelatedComponentsGapColumn() * @see #appendUnrelatedComponentsGapColumn() */ public final void appendLabelComponentsGapColumn() { appendColumn(FormSpecs.LABEL_COMPONENT_GAP_COLSPEC); } /** * Appends a column that is the default gap for related components. * * @see #appendGlueColumn() * @see #appendLabelComponentsGapColumn() * @see #appendUnrelatedComponentsGapColumn() */ public final void appendRelatedComponentsGapColumn() { appendColumn(FormSpecs.RELATED_GAP_COLSPEC); } /** * Appends a column that is the default gap for unrelated components. * * @see #appendGlueColumn() * @see #appendLabelComponentsGapColumn() * @see #appendRelatedComponentsGapColumn() */ public final void appendUnrelatedComponentsGapColumn() { appendColumn(FormSpecs.UNRELATED_GAP_COLSPEC); } // Appending Rows ******************************************************** /** * Appends the given row specification to the builder's layout. * * @param rowSpec the row specification object to append * * @see #appendRow(String) */ public final void appendRow(RowSpec rowSpec) { getLayout().appendRow(rowSpec); } /** * Appends a row specification to the builder's layout that represents * the given string encoding. * * @param encodedRowSpec the row specification to append in encoded form * * @see #appendRow(RowSpec) */ public final void appendRow(String encodedRowSpec) { appendRow(RowSpec.decode(encodedRowSpec)); } /** * Appends a glue row. * * @see #appendRelatedComponentsGapRow() * @see #appendUnrelatedComponentsGapRow() * @see #appendParagraphGapRow() */ public final void appendGlueRow() { appendRow(FormSpecs.GLUE_ROWSPEC); } /** * Appends a row that is the default gap for related components. * * @see #appendGlueRow() * @see #appendUnrelatedComponentsGapRow() * @see #appendParagraphGapRow() */ public final void appendRelatedComponentsGapRow() { appendRow(FormSpecs.RELATED_GAP_ROWSPEC); } /** * Appends a row that is the default gap for unrelated components. * * @see #appendGlueRow() * @see #appendRelatedComponentsGapRow() * @see #appendParagraphGapRow() */ public final void appendUnrelatedComponentsGapRow() { appendRow(FormSpecs.UNRELATED_GAP_ROWSPEC); } /** * Appends a row that is the default gap for paragraphs. * * @since 1.0.3 * * @see #appendGlueRow() * @see #appendRelatedComponentsGapRow() * @see #appendUnrelatedComponentsGapRow() */ public final void appendParagraphGapRow() { appendRow(FormSpecs.PARAGRAPH_GAP_ROWSPEC); } // Adding Components **************************************************** /** * Adds a component to the panel using the given cell constraints. * * @param component the component to add * @param cellConstraints the component's cell constraints * @return the added component */ public Component add(Component component, CellConstraints cellConstraints) { getContainer().add(component, cellConstraints); return component; } /** * Adds a component to the panel using the given encoded cell constraints. * * @param component the component to add * @param encodedCellConstraints the component's encoded cell constraints * @return the added component */ public final Component add(Component component, String encodedCellConstraints) { getContainer().add(component, new CellConstraints(encodedCellConstraints)); return component; } /** * Adds a component to the container using the default cell constraints. * Note that when building from left to right, this method won't adjust * the cell constraints if the column span is larger than 1. In this case * you should use {@link #add(Component, CellConstraints)} with a cell * constraints object created by {@link #createLeftAdjustedConstraints(int)}. * * @param component the component to add * @return the added component * * @see #add(Component, CellConstraints) * @see #createLeftAdjustedConstraints(int) */ public final Component add(Component component) { add(component, cellConstraints()); return component; } // Misc ***************************************************************** /** * Returns the CellConstraints object that is used as a cursor and * holds the current column span and row span. * * @return the builder's current {@link CellConstraints} object */ protected final CellConstraints cellConstraints() { return currentCellConstraints; } /** * Returns the index of the leading column.

* * Subclasses may override this method, for example, if the form * has a leading gap column that should not be filled with components. * * @return the leading column */ protected int getLeadingColumn() { return isLeftToRight() ? 1 : getColumnCount(); } /** * Returns the sign (-1 or 1) used to increment the cursor's column * when moving to the next column. * * @return -1 for right-to-left, 1 for left-to-right */ protected final int getColumnIncrementSign() { return isLeftToRight() ? 1 : -1; } /** * Creates and returns a {@code CellConstraints} object at * the current cursor position that uses the given column span * and is adjusted to the left. Useful when building from right to left. * * @param columnSpan the column span to be used in the constraints * @return CellConstraints adjusted to the left hand side */ protected final CellConstraints createLeftAdjustedConstraints(int columnSpan) { int firstColumn = isLeftToRight() ? getColumn() : getColumn() + 1 - columnSpan; return new CellConstraints(firstColumn, getRow(), columnSpan, cellConstraints().gridHeight); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/ButtonBarBuilder.java0000644000175000017500000002147311766702506027075 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.awt.Color; import javax.swing.Action; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.border.Border; import com.jgoodies.forms.layout.ColumnSpec; import com.jgoodies.forms.layout.ConstantSize; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.FormSpecs; import com.jgoodies.forms.layout.RowSpec; import com.jgoodies.forms.util.LayoutStyle; /** * A non-visual builder for building consistent button bars that comply * with popular style guides. Utilizes the JGoodies {@link FormLayout} * and honors the platform's {@link LayoutStyle} regarding button sizes, * and gaps.

* * Examples:

 * // 1) Build and return a bar with three related buttons 
 * return new ButtonBarBuilder()
 *     .addButton(newButton)
 *     .addRelatedGap()
 *     .addButton(editButton)
 *     .addRelatedGap()
 *     .addButton(deleteButton)
 *     .build();
 *
 * // 2) Short hand for example 1) 
 * return new ButtonBarBuilder()
 *     .addButton(newButton, editButton, deleteButton)
 *     .build();
 *
 * // 3) Build and return a bar with two sections
 * return new ButtonBarBuilder()
 *     .addButton(newButton, editButton, deleteButton)
 *     .addUnrelatedGap()
 *     .addButton(moveUpButton, moveDownButton)
 *     .build();
 *
 * // 4) Short hand for example 3)
 * return new ButtonBarBuilder()
 *     .addButton(newButton, editButton, deleteButton, 
 *                null, 
 *                moveUpButton, moveDownButton)
 *     .build();
 *
 * // 5) Build and return a complex button bar
 * return new ButtonBarBuilder()
 *     .addButton(newButton, editButton, deleteButton)
 *     .addUnrelatedGap()
 *     .addButton(moveUpButton, moveDownButton)
 *     .addGlue()
 *     .addGrowing(legendComponent)
 *     .build();
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.18 $ * * @see ButtonStackBuilder * @see com.jgoodies.forms.util.LayoutStyle */ public final class ButtonBarBuilder extends AbstractButtonPanelBuilder { /** * Specifies the columns of the initial FormLayout used in constructors. */ private static final ColumnSpec[] COL_SPECS = new ColumnSpec[]{}; /** * Specifies the FormLayout's the single button bar row. */ private static final RowSpec[] ROW_SPECS = new RowSpec[]{ RowSpec.decode("center:pref") }; // Instance Creation ****************************************************** /** * Constructs an empty ButtonBarBuilder on a JPanel. */ public ButtonBarBuilder() { this(new JPanel(null)); } /** * Constructs an empty ButtonBarBuilder on the given panel. * * @param panel the layout container */ public ButtonBarBuilder(JPanel panel) { super(new FormLayout(COL_SPECS, ROW_SPECS), panel); } // Buttons **************************************************************** /** * Adds a button component that has a minimum width * specified by the {@link LayoutStyle#getDefaultButtonWidth()}.

* * Although a JButton is expected, any JComponent is accepted * to allow custom button component types. * * @param button the component to add * * @return this builder * * @throws NullPointerException if {@code button} is {@code null} */ @Override public ButtonBarBuilder addButton(JComponent button) { checkNotNull(button, "The button to add must not be null."); getLayout().appendColumn(FormSpecs.BUTTON_COLSPEC); add(button); nextColumn(); return this; } @Override public ButtonBarBuilder addButton(JComponent... buttons) { super.addButton(buttons); return this; } @Override public ButtonBarBuilder addButton(Action... actions) { super.addButton(actions); return this; } // Other ****************************************************************** /** * Adds a fixed size component with narrow margin. Unlike the buttons, * this component is laid out without a minimum width. In other words, * the width is determined only by the component's preferred width. * * @param component the component to add * * @return this builder */ public ButtonBarBuilder addFixed(JComponent component) { getLayout().appendColumn(FormSpecs.PREF_COLSPEC); add(component); nextColumn(); return this; } /** * Adds a component that grows if the container grows. * The component's initial size (before it grows) is specified * by the {@link LayoutStyle#getDefaultButtonWidth()}. * * @param component the component to add * * @return this builder */ public ButtonBarBuilder addGrowing(JComponent component) { getLayout().appendColumn(FormSpecs.GROWING_BUTTON_COLSPEC); add(component); nextColumn(); return this; } // Spacing **************************************************************** /** * Adds a glue that will be given the extra space, * if this button bar is larger than its preferred size. * * @return this builder */ public ButtonBarBuilder addGlue() { appendGlueColumn(); nextColumn(); return this; } /** * Adds the standard horizontal gap for related components. * * @return this builder * * @see LayoutStyle#getRelatedComponentsPadX() */ @Override public ButtonBarBuilder addRelatedGap() { appendRelatedComponentsGapColumn(); nextColumn(); return this; } /** * Adds the standard horizontal gap for unrelated components. * * @return this builder * * @see LayoutStyle#getUnrelatedComponentsPadX() */ @Override public ButtonBarBuilder addUnrelatedGap() { appendUnrelatedComponentsGapColumn(); nextColumn(); return this; } /** * Adds a horizontal strut of the specified width. * For related and unrelated components use {@link #addRelatedGap()} * and {@link #addUnrelatedGap()} respectively. * * @param width describes the gap width * * @return this builder * * @see ColumnSpec#createGap(ConstantSize) */ public ButtonBarBuilder addStrut(ConstantSize width) { getLayout().appendColumn(ColumnSpec.createGap(width)); nextColumn(); return this; } // Configuration ********************************************************** @Override public ButtonBarBuilder background(Color background) { super.background(background); return this; } @Override public ButtonBarBuilder border(Border border) { super.border(border); return this; } @Override public ButtonBarBuilder opaque(boolean b) { super.opaque(b); return this; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/DefaultFormBuilder.java0000644000175000017500000011321711764277650027410 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import java.awt.Color; import java.awt.Component; import java.util.ResourceBundle; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.Border; import com.jgoodies.common.internal.StringLocalizer; import com.jgoodies.common.swing.MnemonicUtils; import com.jgoodies.forms.layout.ConstantSize; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.FormSpecs; import com.jgoodies.forms.layout.RowSpec; /** * Provides a means to build form-oriented panels quickly and consistently * using the {@link FormLayout}. This builder combines frequently used * panel building steps: add a new row, add a label, proceed to the next * data column, then add a component.

* * The extra value lies in the {@code #append} methods that * append gap rows and component rows if necessary and then add * the given components. They are built upon the superclass behavior * {@code #appendRow} and the set of {@code #add} methods. * A set of component appenders allows to add a textual label and * associated component in a single step.

* * This builder can map resource keys to internationalized (i15d) texts * when creating text labels, titles and titled separators. Therefore * you must specify a {@code ResourceBundle} in the constructor. * The builder methods throw an {@code IllegalStateException} if one * of the mapping builder methods is invoked and no bundle has been set.

* * You can configure the build process by setting a leading column, * enabling the row grouping and by modifying the gaps between normal * lines and between paragraphs. The leading column will be honored * if the cursor proceeds to the next row. All appended components * start in the specified lead column, except appended separators that * span all columns.

* * It is temptive to use the DefaultFormBuilder all the time and * to let it add rows automatically. Use a simpler style if it increases * the code readability. Explicit row specifications and cell constraints * make your layout easier to understand - but harder to maintain. * See also the accompanying tutorial sources and the Tips & Tricks * that are part of the Forms documentation.

* * Sometimes a form consists of many standardized rows but has a few * rows that require a customization. The DefaultFormBuilder can do everything * that the superclasses {@link com.jgoodies.forms.builder.AbstractFormBuilder} * and {@link com.jgoodies.forms.builder.PanelBuilder} can do; * among other things: appending new rows and moving the cursor. * Again, ask yourself if the DefaultFormBuilder is the appropriate builder. * As a rule of thumb you should have more components than builder commands. * There are different ways to add custom rows. Find below example code * that presents and compares the pros and cons of three approaches.

* * The texts for labels and titles can be marked texts, * i.e. strings with an optional mnemonic marker. * See the {@link MnemonicUtils} class comment for details.

* * Example: *

 * public void build() {
 *     FormLayout layout = new FormLayout(
 *         "right:max(40dlu;pref), 3dlu, 80dlu, 7dlu, " // 1st major colum
 *       + "right:max(40dlu;pref), 3dlu, 80dlu",        // 2nd major column
 *         "");                                         // add rows dynamically
 *     DefaultFormBuilder builder = new DefaultFormBuilder(layout)
 *     		.border(Borders.DIALOG);
 *
 *     builder.appendSeparator("Flange");
 *
 *     builder.append("Identifier", identifierField);
 *     builder.nextLine();
 *
 *     builder.append("PTI [kW]",   new JTextField());
 *     builder.append("Power [kW]", new JTextField());
 *
 *     builder.append("s [mm]",     new JTextField());
 *     builder.nextLine();
 *
 *     builder.appendSeparator("Diameters");
 *
 *     builder.append("da [mm]",    new JTextField());
 *     builder.append("di [mm]",    new JTextField());
 *
 *     builder.append("da2 [mm]",   new JTextField());
 *     builder.append("di2 [mm]",   new JTextField());
 *
 *     builder.append("R [mm]",     new JTextField());
 *     builder.append("D [mm]",     new JTextField());
 *
 *     builder.appendSeparator("Criteria");
 *
 *     builder.append("Location",   buildLocationComboBox());
 *     builder.append("k-factor",   new JTextField());
 *
 *     builder.appendSeparator("Bolts");
 *
 *     builder.append("Material",   ViewerUIFactory.buildMaterialComboBox());
 *     builder.nextLine();
 *
 *     builder.append("Numbers",    new JTextField());
 *     builder.nextLine();
 *
 *     builder.append("ds [mm]",    new JTextField());
 * }
 * 

* * Custom Row Example: *

 * public JComponent buildPanel() {
 *     initComponents();
 *
 *     FormLayout layout = new FormLayout(
 *             "right:pref, 3dlu, default:grow",
 *             "");
 *     DefaultFormBuilder builder = new DefaultFormBuilder(layout)
 *     	    .border(Borders.DIALOG)
 *          .rowGroupingEnabled(true);
 *
 *     // In this approach, we add a gap and a custom row.
 *     // The advantage of this approach is, that we can express
 *     // the row spec and comment area cell constraints freely.
 *     // The disadvantage is the misalignment of the leading label.
 *     // Also the row's height may be inconsistent with other rows.
 *     builder.appendSeparator("Single Custom Row");
 *     builder.append("Name", name1Field);
 *     builder.appendRow(builder.getLineGapSpec());
 *     builder.appendRow(new RowSpec("top:31dlu")); // Assumes line is 14, gap is 3
 *     builder.nextLine(2);
 *     builder.append("Comment");
 *     builder.add(new JScrollPane(comment1Area),
 *                 CC.xy(builder.getColumn(), builder.getRow(), "fill, fill"));
 *     builder.nextLine();
 *
 *     // In this approach, we append a standard row with gap before it.
 *     // The advantage is, that the leading label is aligned well.
 *     // The disadvantage is that the comment area now spans
 *     // multiple cells and is slightly less flexible.
 *     // Also the row's height may be inconsistent with other rows.
 *     builder.appendSeparator("Standard + Custom Row");
 *     builder.append("Name", name2Field);
 *     builder.append("Comment");
 *     builder.appendRow(new RowSpec("17dlu")); // Assumes line is 14, gap is 3
 *     builder.add(new JScrollPane(comment2Area),
 *                 CC.xywh(builder.getColumn(), builder.getRow(), 1, 2));
 *     builder.nextLine(2);
 *
 *     // In this approach, we append two standard rows with associated gaps.
 *     // The advantage is, that the leading label is aligned well,
 *     // and the height is consistent with other rows.
 *     // The disadvantage is that the comment area now spans
 *     // multiple cells and is slightly less flexible.
 *     builder.appendSeparator("Two Standard Rows");
 *     builder.append("Name", name3Field);
 *     builder.append("Comment");
 *     builder.nextLine();
 *     builder.append("");
 *     builder.nextRow(-2);
 *     builder.add(new JScrollPane(comment3Area),
 *                 CC.xywh(builder.getColumn(), builder.getRow(), 1, 3));
 *
 *     return builder.build();
 * }
 * 

* * TODO: Consider adding a method for appending a component that spans the * remaining columns in the current row. Method name candidates are * {@code #appendFullSpan} and {@code #appendRemaining}. * * @author Karsten Lentzsch * @version $Revision: 1.16 $ * @since 1.0.3 * * @see com.jgoodies.forms.builder.AbstractFormBuilder * @see com.jgoodies.forms.layout.FormSpecs * @see com.jgoodies.forms.layout.FormLayout */ public final class DefaultFormBuilder extends I15dPanelBuilder { /** * Holds the row specification that is reused to describe rows * that are intended for labels and components. * * @see #setDefaultRowSpec(RowSpec) */ private RowSpec defaultRowSpec = FormSpecs.PREF_ROWSPEC; /** * Holds the row specification that is reused to describe * the constant gaps between component lines. * * @see #setLineGapSize(ConstantSize) */ private RowSpec lineGapSpec = FormSpecs.LINE_GAP_ROWSPEC; /** * Holds the row specification that describes the constant gaps * between paragraphs. * * @see #setParagraphGapSize(ConstantSize) */ private RowSpec paragraphGapSpec = FormSpecs.PARAGRAPH_GAP_ROWSPEC; /** * Holds the offset of the leading column - often 0 or 1. * * @see #getLeadingColumnOffset() * @see #setLeadingColumnOffset(int) * @see #getLeadingColumn() */ private int leadingColumnOffset = 0; /** * Determines whether new data rows are being grouped or not. * * @see #isRowGroupingEnabled() * @see #setRowGroupingEnabled(boolean) */ private boolean rowGroupingEnabled = false; // Instance Creation **************************************************** /** * Constructs a {@code DefaultFormBuilder} for the given * layout. * * @param layout the {@code FormLayout} to be used * * @throws NullPointerException if {@code layout} is {@code null} */ public DefaultFormBuilder(FormLayout layout) { this(layout, new JPanel(null)); } /** * Constructs a {@code DefaultFormBuilder} for the given * layout and panel. * * @param layout the {@code FormLayout} to be used * @param container the layout container * * @throws NullPointerException if {@code layout} or {@code container} is {@code null} */ public DefaultFormBuilder(FormLayout layout, JPanel container) { this(layout, (StringLocalizer) null, container); } /** * Constructs a {@code DefaultFormBuilder} for the given * layout and resource bundle. * * @param layout the {@code FormLayout} to be used * @param bundle the {@code ResourceBundle} used to lookup i15d * strings * * @throws NullPointerException if {@code layout} is {@code null} */ public DefaultFormBuilder(FormLayout layout, ResourceBundle bundle) { super(layout, bundle); } /** * Constructs a {@code DefaultFormBuilder} for the given * layout, resource bundle, and panel. * * @param layout the {@code FormLayout} to be used * @param container the layout container * @param bundle the {@code ResourceBundle} used to lookup i15d * strings * * @throws NullPointerException if {@code layout} or {@code container} is {@code null} */ public DefaultFormBuilder(FormLayout layout, ResourceBundle bundle, JPanel container) { super(layout, bundle, container); } /** * Constructs a {@code DefaultFormBuilder} for the given * layout and resource bundle. * * @param layout the {@code FormLayout} to be used * @param localizer used to lookup i15d strings * * @throws NullPointerException if {@code layout} is {@code null} */ public DefaultFormBuilder(FormLayout layout, StringLocalizer localizer) { super(layout, localizer); } /** * Constructs a {@code DefaultFormBuilder} for the given * layout, resource bundle, and panel. * * @param layout the {@code FormLayout} to be used * @param container the layout container * @param localizer used to lookup i15d strings * * @throws NullPointerException if {@code layout} or {@code container} is {@code null} */ public DefaultFormBuilder(FormLayout layout, StringLocalizer localizer, JPanel container) { super(layout, localizer, container); } // Frequently Used Panel Properties *************************************** @Override public DefaultFormBuilder background(Color background) { super.background(background); return this; } @Override public DefaultFormBuilder border(Border border) { super.border(border); return this; } @Override public DefaultFormBuilder border(String emptyBorderSpec) { super.border(emptyBorderSpec); return this; } @Override public DefaultFormBuilder opaque(boolean b) { super.opaque(b); return this; } /** * Sets the row specification that shall be used for component rows. * It is {@link FormSpecs#PREF_ROWSPEC} by default. * * @param defaultRowSpec the RowSpec to be used for component rows */ public DefaultFormBuilder defaultRowSpec(RowSpec defaultRowSpec) { this.defaultRowSpec = defaultRowSpec; return this; } /** * Sets the size of gaps between component lines using the given * constant size.

* * Examples:

     * .lineGapSize(Sizes.ZERO);
     * .lineGapSize(Sizes.DLUY9);
     * .lineGapSize(Sizes.pixel(1));
     * 
* * @param lineGapSize the {@code ConstantSize} that describes * the size of the gaps between component lines */ public DefaultFormBuilder lineGapSize(ConstantSize lineGapSize) { RowSpec rowSpec = RowSpec.createGap(lineGapSize); this.lineGapSpec = rowSpec; return this; } /** * Sets the size of gaps between paragraphs using the given * constant size.

* * Examples:

     * .setParagraphGapSize(Sizes.DLUY14);
     * .setParagraphGapSize(Sizes.dluY(22));
     * .setParagraphGapSize(Sizes.pixel(42));
     * 
* * @param paragraphGapSize the {@code ConstantSize} that describes * the size of the gaps between paragraphs */ public DefaultFormBuilder paragraphGapSize(ConstantSize paragraphGapSize) { RowSpec rowSpec = RowSpec.createGap(paragraphGapSize); this.paragraphGapSpec = rowSpec; return this; } /** * Sets the offset of the leading column, often 0 or 1. * * @param columnOffset the new offset of the leading column */ public DefaultFormBuilder leadingColumnOffset(int columnOffset) { this.leadingColumnOffset = columnOffset; return this; } /** * Enables or disables the grouping of new data rows. * * @param enabled indicates grouping enabled, false disabled */ public DefaultFormBuilder rowGroupingEnabled(boolean enabled) { rowGroupingEnabled = enabled; return this; } // Configuration ********************************************************** /** * Returns the row specification that is used for component rows. * * @return the {@code RowSpec} used for component rows * * @since 1.2 * @deprecated Obsolete; will be deleted from the next version */ @Deprecated public RowSpec getDefaultRowSpec() { return defaultRowSpec; } /** * Sets the row specification that shall be used for component rows. * It is {@link FormSpecs#PREF_ROWSPEC} by default. * * @param defaultRowSpec the RowSpec to be used for component rows * * @since 1.2 * @deprecated Replaced by {@link #defaultRowSpec(RowSpec)} */ @Deprecated public void setDefaultRowSpec(RowSpec defaultRowSpec) { this.defaultRowSpec = defaultRowSpec; } /** * Returns the row specification that is used to separate component row. * * @return the {@code RowSpec} that is used to separate component rows * @deprecated Obsolete; will be deleted from the next version */ @Deprecated public RowSpec getLineGapSpec() { return lineGapSpec; } /** * Sets the size of gaps between component lines using the given * constant size.

* * Examples:

     * .setLineGapSize(Sizes.ZERO);
     * .setLineGapSize(Sizes.DLUY9);
     * .setLineGapSize(Sizes.pixel(1));
     * 
* * @param lineGapSize the {@code ConstantSize} that describes * the size of the gaps between component lines * @deprecated Replaced by {@link #lineGapSize(ConstantSize)} */ @Deprecated public void setLineGapSize(ConstantSize lineGapSize) { RowSpec rowSpec = RowSpec.createGap(lineGapSize); this.lineGapSpec = rowSpec; } /** * Sets the size of gaps between paragraphs using the given * constant size.

* * Examples:

     * .setParagraphGapSize(Sizes.DLUY14);
     * .setParagraphGapSize(Sizes.dluY(22));
     * .setParagraphGapSize(Sizes.pixel(42));
     * 
* * @param paragraphGapSize the {@code ConstantSize} that describes * the size of the gaps between paragraphs * @deprecated Replaced by {@link #lineGapSize(ConstantSize)} */ @Deprecated public void setParagraphGapSize(ConstantSize paragraphGapSize) { RowSpec rowSpec = RowSpec.createGap(paragraphGapSize); this.paragraphGapSpec = rowSpec; } /** * Returns the offset of the leading column, often 0 or 1. * * @return the offset of the leading column * @deprecated Obsolete; will be deleted from the next version */ @Deprecated public int getLeadingColumnOffset() { return leadingColumnOffset; } /** * Sets the offset of the leading column, often 0 or 1. * * @param columnOffset the new offset of the leading column * @deprecated Replaced by {@link #leadingColumnOffset(int)} */ @Deprecated public void setLeadingColumnOffset(int columnOffset) { this.leadingColumnOffset = columnOffset; } /** * Returns whether new data rows are being grouped or not. * * @return true indicates grouping enabled, false disabled * @deprecated Obsolete; will be deleted from the next version */ @Deprecated public boolean isRowGroupingEnabled() { return rowGroupingEnabled; } /** * Enables or disables the grouping of new data rows. * * @param enabled indicates grouping enabled, false disabled * @deprecated Replaced by {@link #rowGroupingEnabled(boolean)} */ @Deprecated public void setRowGroupingEnabled(boolean enabled) { rowGroupingEnabled = enabled; } // Filling Columns ****************************************************** /** * Adds a component to the panel using the default constraints * with a column span of 1. Then proceeds to the next data column. * * @param component the component to add */ public void append(Component component) { append(component, 1); } /** * Adds a component to the panel using the default constraints with * the given columnSpan. Proceeds to the next data column. * * @param component the component to append * @param columnSpan the column span used to add */ public void append(Component component, int columnSpan) { ensureCursorColumnInGrid(); ensureHasGapRow(lineGapSpec); ensureHasComponentLine(); add(component, createLeftAdjustedConstraints(columnSpan)); nextColumn(columnSpan + 1); } /** * Adds two components to the panel; each component will span a single * data column. Proceeds to the next data column. * * @param c1 the first component to add * @param c2 the second component to add */ public void append(Component c1, Component c2) { append(c1); append(c2); } /** * Adds three components to the panel; each component will span a single * data column. Proceeds to the next data column. * * @param c1 the first component to add * @param c2 the second component to add * @param c3 the third component to add */ public void append(Component c1, Component c2, Component c3) { append(c1); append(c2); append(c3); } // Appending Labels with optional components ------------------------------ /** * Adds a text label to the panel and proceeds to the next column. * * @param textWithMnemonic the label's text - may mark a mnemonic * @return the added label */ public JLabel append(String textWithMnemonic) { JLabel label = getComponentFactory().createLabel(textWithMnemonic); append(label); return label; } /** * Adds a text label and component to the panel. * Then proceeds to the next data column.

* * The created label is labeling the given component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param textWithMnemonic the label's text - may mark a mnemonic * @param component the component to add * @return the added label */ public JLabel append(String textWithMnemonic, Component component) { return append(textWithMnemonic, component, 1); } /** * Adds a text label and component to the panel; the component will span * the specified number columns. Proceeds to the next data column, * and goes to the next line if the boolean flag is set.

* * The created label is labeling the given component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param textWithMnemonic the label's text - may mark a mnemonic * @param c the component to add * @param nextLine true forces a next line * @return the added label * @see JLabel#setLabelFor(java.awt.Component) */ public JLabel append(String textWithMnemonic, Component c, boolean nextLine) { JLabel label = append(textWithMnemonic, c); if (nextLine) { nextLine(); } return label; } /** * Adds a text label and component to the panel; the component will span * the specified number columns. Proceeds to the next data column.

* * The created label is labeling the given component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param textWithMnemonic the label's text - may mark a mnemonic * @param c the component to add * @param columnSpan number of columns the component shall span * @return the added label * @see JLabel#setLabelFor(java.awt.Component) */ public JLabel append(String textWithMnemonic, Component c, int columnSpan) { JLabel label = append(textWithMnemonic); label.setLabelFor(c); append(c, columnSpan); return label; } /** * Adds a text label and two components to the panel; each component * will span a single column. Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param textWithMnemonic the label's text - may mark a mnemonic * @param c1 the first component to add * @param c2 the second component to add * @return the added label */ public JLabel append(String textWithMnemonic, Component c1, Component c2) { JLabel label = append(textWithMnemonic, c1); append(c2); return label; } /** * Adds a text label and two components to the panel; each component * will span a single column. Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param textWithMnemonic the label's text - may mark a mnemonic * @param c1 the first component to add * @param c2 the second component to add * @param colSpan the column span for the second component * @return the created label */ public JLabel append(String textWithMnemonic, Component c1, Component c2, int colSpan) { JLabel label = append(textWithMnemonic, c1); append(c2, colSpan); return label; } /** * Adds a text label and three components to the panel; each component * will span a single column. Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param textWithMnemonic the label's text - may mark a mnemonic * @param c1 the first component to add * @param c2 the second component to add * @param c3 the third component to add * @return the added label */ public JLabel append(String textWithMnemonic, Component c1, Component c2, Component c3) { JLabel label = append(textWithMnemonic, c1, c2); append(c3); return label; } /** * Adds a text label and four components to the panel; each component * will span a single column. Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param textWithMnemonic the label's text - may mark a mnemonic * @param c1 the first component to add * @param c2 the second component to add * @param c3 the third component to add * @param c4 the fourth component to add * @return the added label */ public JLabel append(String textWithMnemonic, Component c1, Component c2, Component c3, Component c4) { JLabel label = append(textWithMnemonic, c1, c2, c3); append(c4); return label; } // Appending internationalized labels with optional components ------------ /** * Adds an internationalized (i15d) text label to the panel using * the given resource key and proceeds to the next column. * * @param resourceKey the resource key for the the label's text * @return the added label */ public JLabel appendI15d(String resourceKey) { return append(getI15dString(resourceKey)); } /** * Adds an internationalized (i15d) text label and component * to the panel. Then proceeds to the next data column.

* * The created label is labeling the given component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param resourceKey the resource key for the text to add * @param component the component to add * @return the added label */ public JLabel appendI15d(String resourceKey, Component component) { return append(getI15dString(resourceKey), component, 1); } /** * Adds an internationalized (i15d) text label and component * to the panel. Then proceeds to the next data column. * Goes to the next line if the boolean flag is set.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param resourceKey the resource key for the text to add * @param component the component to add * @param nextLine true forces a next line * @return the added label */ public JLabel appendI15d(String resourceKey, Component component, boolean nextLine) { return append(getI15dString(resourceKey), component, nextLine); } /** * Adds an internationalized (i15d) text label to the panel using * the given resource key; then proceeds to the next data column * and adds a component with the given column span. * Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param resourceKey the resource key for the text to add * @param c the component to add * @param columnSpan number of columns the component shall span * @return the added label */ public JLabel appendI15d(String resourceKey, Component c, int columnSpan) { return append(getI15dString(resourceKey), c, columnSpan); } /** * Adds an internationalized (i15d) text label and two components * to the panel; each component will span a single column. * Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param resourceKey the resource key for the text to add * @param c1 the first component to add * @param c2 the second component to add * @return the added label */ public JLabel appendI15d(String resourceKey, Component c1, Component c2) { return append(getI15dString(resourceKey), c1, c2); } /** * Adds an internationalized (i15d) text label and two components * to the panel; each component will span a single column. * Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param resourceKey the resource key for the text to add * @param c1 the first component to add * @param c2 the second component to add * @param colSpan the column span for the second component * @return the added label */ public JLabel appendI15d(String resourceKey, Component c1, Component c2, int colSpan) { return append(getI15dString(resourceKey), c1, c2, colSpan); } /** * Adds an internationalized (i15d) text label and three components * to the panel; each component will span a single column. * Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param resourceKey the resource key for the text to add * @param c1 the first component to add * @param c2 the second component to add * @param c3 the third component to add * @return the added label */ public JLabel appendI15d(String resourceKey, Component c1, Component c2, Component c3) { return append(getI15dString(resourceKey), c1, c2, c3); } /** * Adds an internationalized (i15d) text label and four components * to the panel; each component will span a single column. * Proceeds to the next data column.

* * The created label is labeling the first component; so the component * gets the focus if the (optional) label mnemonic is pressed. * * @param resourceKey the resource key for the text to add * @param c1 the first component to add * @param c2 the second component to add * @param c3 the third component to add * @param c4 the third component to add * @return the added label */ public JLabel appendI15d(String resourceKey, Component c1, Component c2, Component c3, Component c4) { return append(getI15dString(resourceKey), c1, c2, c3, c4); } // Adding Titles ---------------------------------------------------------- /** * Adds a title label to the panel and proceeds to the next column. * * @param textWithMnemonic the label's text - may mark a mnemonic * @return the added title label */ public JLabel appendTitle(String textWithMnemonic) { JLabel titleLabel = getComponentFactory().createTitle(textWithMnemonic); append(titleLabel); return titleLabel; } /** * Adds an internationalized title label to the panel and * proceeds to the next column. * * @param resourceKey the resource key for the title's text * @return the added title label */ public JLabel appendI15dTitle(String resourceKey) { return appendTitle(getI15dString(resourceKey)); } // Appending Separators --------------------------------------------------- /** * Adds a separator without text that spans all columns. * * @return the added titled separator */ public JComponent appendSeparator() { return appendSeparator(""); } /** * Adds a separator with the given text that spans all columns. * * @param text the separator title text * @return the added titled separator */ public JComponent appendSeparator(String text) { ensureCursorColumnInGrid(); ensureHasGapRow(paragraphGapSpec); ensureHasComponentLine(); setColumn(super.getLeadingColumn()); int columnSpan = getColumnCount(); setColumnSpan(getColumnCount()); JComponent titledSeparator = addSeparator(text); setColumnSpan(1); nextColumn(columnSpan); return titledSeparator; } /** * Appends an internationalized titled separator for * the given resource key that spans all columns. * * @param resourceKey the resource key for the separator title's text * @return the added titled separator */ public JComponent appendI15dSeparator(String resourceKey) { return appendSeparator(getI15dString(resourceKey)); } // Overriding Superclass Behavior *************************************** /** * Returns the leading column. Unlike the superclass this method * honors the column offset. * * @return the leading column */ @Override protected int getLeadingColumn() { int column = super.getLeadingColumn(); return column + getLeadingColumnOffset() * getColumnIncrementSign(); } // Adding Rows ********************************************************** /** * Ensures that the cursor is in the grid. In case it's beyond the * form's right hand side, the cursor is moved to the leading column * of the next line. */ private void ensureCursorColumnInGrid() { if ( isLeftToRight() && getColumn() > getColumnCount() || !isLeftToRight() && getColumn() < 1) { nextLine(); } } /** * Ensures that we have a gap row before the next component row. * Checks if the current row is the given {@code RowSpec} * and appends this row spec if necessary. * * @param gapRowSpec the row specification to check for */ private void ensureHasGapRow(RowSpec gapRowSpec) { if (getRow() == 1 || getRow() <= getRowCount()) { return; } if (getRow() <= getRowCount()) { RowSpec rowSpec = getCursorRowSpec(); if (rowSpec == gapRowSpec) { return; } } appendRow(gapRowSpec); nextLine(); } /** * Ensures that the form has a component row. Adds a component row * if the cursor is beyond the form's bottom. */ private void ensureHasComponentLine() { if (getRow() <= getRowCount()) { return; } appendRow(getDefaultRowSpec()); if (isRowGroupingEnabled()) { getLayout().addGroupedRow(getRow()); } } /** * Looks up and returns the row specification of the current row. * * @return the row specification of the current row */ private RowSpec getCursorRowSpec() { return getLayout().getRowSpec(getRow()); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/ButtonBarBuilder2.java0000644000175000017500000003757211766702524027166 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import static com.jgoodies.common.base.Preconditions.checkArgument; import static com.jgoodies.common.base.Preconditions.checkNotNull; import javax.swing.Action; import javax.swing.JComponent; import javax.swing.JPanel; import com.jgoodies.forms.factories.Borders; import com.jgoodies.forms.layout.ColumnSpec; import com.jgoodies.forms.layout.ConstantSize; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.FormSpecs; import com.jgoodies.forms.layout.RowSpec; import com.jgoodies.forms.util.LayoutStyle; import com.jgoodies.forms.util.MacLayoutStyle; /** * A non-visual builder for building consistent button bars that comply * with popular style guides. Utilizes the JGoodies {@link FormLayout} * and honors the platform's {@link LayoutStyle} regarding button sizes, * gap widths, and the default button order.

* * This is an improved version of the older {@code ButtonBarBuilder}. * The ButtonBarBuilder2 has a simpler, safer, and more convenient API, * see below for a comparison.

* * ButtonBarBuilder2 vs. ButtonBarBuilder:
* ButtonBarBuilder2 uses only 3 component types that can be added: * button, standard, and growing button, where * ButtonBarBuilder has button, fixed, and growing. * Also, the ButtonBarBuilder2 doesn't group buttons. * The layout of the ButtonBarBuilder and ButtonBarBuilder2 is the same * if all buttons are smaller than {@link LayoutStyle#getDefaultButtonWidth()}. * If some buttons are wider, ButtonBarBuilder2 will make only these buttons * wider, where the old ButtonBarBuilder makes all (gridded) buttons wider. * *

* Examples:

 * // Build a right-aligned bar for: OK, Cancel, Apply
 * ButtonBarBuilder2 builder = new ButtonBarBuilder2();
 * builder.addGlue();
 * builder.addButton(okButton);
 * builder.addRelatedGap();
 * builder.addButton(cancelButton);
 * builder.addRelatedGap();
 * builder.addButton(applyButton);
 * return builder.getPanel();
 *
 * // Add a sequence of related buttons
 * ButtonBarBuilder2 builder = new ButtonBarBuilder2();
 * builder.addGlue();
 * builder.addButton(okButton, cancelButton, applyButton);
 * return builder.getPanel();
 *
 * // Add a sequence of related buttons for given Actions
 * ButtonBarBuilder2 builder = new ButtonBarBuilder2();
 * builder.addGlue();
 * builder.addButton(okAction, cancelAction, applyAction);
 * return builder.getPanel();
 * 
* * Buttons are added to a builder individually or as a sequence. * * To honor the platform's button order (left-to-right vs. right-to-left) * this builder uses the leftToRightButtonOrder property. * It is initialized with the current LayoutStyle's button order, * which in turn is left-to-right on most platforms and right-to-left * on the Mac OS X. Builder methods that create sequences of buttons * (e.g. {@link #addButton(JComponent[])} honor the button order. * If you want to ignore the default button order, you can either * add individual buttons, or create a ButtonBarBuilder2 instance * with the order set to left-to-right. For the latter see * {@link #createLeftToRightBuilder()}. Also see the button order * example below.

* * Example:
* The following example builds a button bar with Help button on the * left-hand side and OK, Cancel, Apply buttons on the right-hand side. *

 * private JPanel createHelpOKCancelApplyBar(
 *         JButton help, JButton ok, JButton cancel, JButton apply) {
 *     ButtonBarBuilder2 builder = new ButtonBarBuilder2();
 *     builder.addButton(help);
 *     builder.addUnrelatedGap();
 *     builder.addGlue();
 *     builder.addButton(new JButton[]{ok, cancel, apply});
 *     return builder.getPanel();
 * }
 * 

* * Button Order Example:
* The following example builds three button bars where one honors * the platform's button order and the other two ignore it. *

 * public JComponent buildPanel() {
 *     FormLayout layout = new FormLayout("pref");
 *     DefaultFormBuilder rowBuilder = new DefaultFormBuilder(layout);
 *     rowBuilder.border(Borders.DIALOG);
 *
 *     rowBuilder.append(buildButtonSequence(new ButtonBarBuilder2()));
 *     rowBuilder.append(buildButtonSequence(ButtonBarBuilder2.createLeftToRightBuilder()));
 *     rowBuilder.append(buildIndividualButtons(new ButtonBarBuilder2()));
 *
 *     return rowBuilder.getPanel();
 * }
 *
 * private Component buildButtonSequence(ButtonBarBuilder2 builder) {
 *     builder.addButton(new JButton[] {
 *             new JButton("One"),
 *             new JButton("Two"),
 *             new JButton("Three")
 *     });
 *     return builder.getPanel();
 * }
 *
 * private Component buildIndividualButtons(ButtonBarBuilder2 builder) {
 *     builder.addButton(new JButton("One"));
 *     builder.addRelatedGap();
 *     builder.addButton(new JButton("Two"));
 *     builder.addRelatedGap();
 *     builder.addButton(new JButton("Three"));
 *     return builder.getPanel();
 * }
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.18 $ * * @see ButtonStackBuilder * @see com.jgoodies.forms.util.LayoutStyle * * @deprecated Replaced by the {@link ButtonBarBuilder} */ @Deprecated public class ButtonBarBuilder2 extends AbstractButtonPanelBuilder { /** * Specifies the columns of the initial FormLayout used in constructors. */ private static final ColumnSpec[] COL_SPECS = new ColumnSpec[]{}; /** * Specifies the FormLayout's the single button bar row. */ private static final RowSpec[] ROW_SPECS = new RowSpec[]{ RowSpec.decode("center:pref") }; /** * Describes how sequences of buttons are added to the button bar: * left-to-right or right-to-left. This setting is initialized using * the current {@link LayoutStyle}'s button order. It is honored * only by builder methods that build sequences of button, for example * {@link #addButton(JComponent[])}, and ignored if you add * individual button, for example using {@link #addButton(JComponent)}. * * @see #isLeftToRight() * @see #setLeftToRight(boolean) * @see #addGrowing(JComponent[]) */ private boolean leftToRight; // Instance Creation ****************************************************** /** * Constructs an empty ButtonBarBuilder2 on a JPanel. */ public ButtonBarBuilder2() { this(new JPanel(null)); } /** * Constructs an empty ButtonBarBuilder2 on the given panel. * * @param panel the layout container */ public ButtonBarBuilder2(JPanel panel) { super(new FormLayout(COL_SPECS, ROW_SPECS), panel); leftToRight = !(LayoutStyle.getCurrent() instanceof MacLayoutStyle); } /** * Creates and returns an empty ButtonBarBuilder2 with * a left to right button order. * * @return a button bar builder with button order set to left-to-right */ public static ButtonBarBuilder2 createLeftToRightBuilder() { ButtonBarBuilder2 builder = new ButtonBarBuilder2(); builder.setLeftToRightButtonOrder(true); return builder; } // Accessing Properties *************************************************** /** * Returns whether button sequences will be ordered from * left to right or from right to left. * * @return true if button sequences are ordered from left to right */ public boolean isLeftToRightButtonOrder() { return leftToRight; } /** * Sets the order for button sequences to either left to right, * or right to left. * * @param newButtonOrder true if button sequences shall be ordered * from left to right * * @return this builder */ public ButtonBarBuilder2 setLeftToRightButtonOrder(boolean newButtonOrder) { leftToRight = newButtonOrder; return this; } // Default Borders ****************************************************** /** * Sets a default border that has a gap in the bar's north. * * @return this builder */ public ButtonBarBuilder2 setDefaultButtonBarGapBorder() { border(Borders.BUTTON_BAR_PAD); return this; } // Spacing **************************************************************** /** * Adds a glue that will be given the extra space, * if this button bar is larger than its preferred size. * * @return this builder */ public ButtonBarBuilder2 addGlue() { appendGlueColumn(); nextColumn(); return this; } @Override public ButtonBarBuilder2 addRelatedGap() { appendRelatedComponentsGapColumn(); nextColumn(); return this; } @Override public ButtonBarBuilder2 addUnrelatedGap() { appendUnrelatedComponentsGapColumn(); nextColumn(); return this; } /** * Adds a horizontal strut of the specified width. * For related and unrelated components use {@link #addRelatedGap()} * and {@link #addUnrelatedGap()} respectively. * * @param width describes the gap width * * @return this builder * * @see ColumnSpec#createGap(ConstantSize) */ public ButtonBarBuilder2 addStrut(ConstantSize width) { getLayout().appendColumn(ColumnSpec.createGap(width)); nextColumn(); return this; } // Buttons **************************************************************** /** * Adds a command button component that has a minimum width * specified by the {@link LayoutStyle#getDefaultButtonWidth()}.

* * Although a JButton is expected, any JComponent is accepted * to allow custom button component types. * * @param button the component to add * * @return this builder * * @throws NullPointerException if {@code button} is {@code null} */ @Override public ButtonBarBuilder2 addButton(JComponent button) { getLayout().appendColumn(FormSpecs.BUTTON_COLSPEC); add(button); nextColumn(); return this; } /** * Adds a sequence of related button components. * Each button has the minimum width as specified by * {@link LayoutStyle#getDefaultButtonWidth()}. The gap width between * the buttons is {@link LayoutStyle#getRelatedComponentsPadX()}.

* * Uses this builder's button order (left-to-right vs. right-to-left). * If you want to use a fixed order, add individual buttons instead.

* * Although JButtons are expected, general JComponents are accepted * to allow custom button component types. * * @param buttons an array of buttons to add * * @return this builder * * @throws NullPointerException if the button array or a button is {@code null} * @throws IllegalArgumentException if the button array is empty * * @see #addButton(JComponent) */ @Override public ButtonBarBuilder2 addButton(JComponent... buttons) { checkNotNull(buttons, "The button array must not be null."); int length = buttons.length; checkArgument(length > 0, "The button array must not be empty."); for (int i = 0; i < length; i++) { int index = leftToRight ? i : length -1 - i; addButton(buttons[index]); if (i < buttons.length - 1) { addRelatedGap(); } } return this; } /** * Adds a JButton for the given Action that has a minimum width * specified by the {@link LayoutStyle#getDefaultButtonWidth()}. * * @param action the action that describes the button to add * * @return this builder * * @throws NullPointerException if {@code action} is {@code null} * * @see #addButton(JComponent) */ public ButtonBarBuilder2 addButton(Action action) { checkNotNull(action, "The button Action must not be null."); return addButton(createButton(action)); } @Override public ButtonBarBuilder2 addButton(Action... actions) { super.addButton(actions); return this; } // Other ****************************************************************** /** * Adds a button or other component that grows if the container grows. * The component's initial size (before it grows) is specified * by the {@link LayoutStyle#getDefaultButtonWidth()}. * * @param component the component to add * * @return this builder */ public ButtonBarBuilder2 addGrowing(JComponent component) { getLayout().appendColumn(FormSpecs.GROWING_BUTTON_COLSPEC); add(component); nextColumn(); return this; } /** * Adds a sequence of related growing buttons * where each is separated by a default gap. * Honors this builder's button order. If you * want to use a fixed left to right order, * add individual buttons. * * @param buttons an array of buttons to add * * @return this builder * * @see LayoutStyle */ public ButtonBarBuilder2 addGrowing(JComponent... buttons) { int length = buttons.length; for (int i = 0; i < length; i++) { int index = leftToRight ? i : length -1 - i; addGrowing(buttons[index]); if (i < buttons.length - 1) { addRelatedGap(); } } return this; } /** * Adds a fixed size component with narrow margin. Unlike the gridded * components, this component keeps its individual preferred dimension. * * @param component the component to add * * @return this builder */ public ButtonBarBuilder2 addFixed(JComponent component) { getLayout().appendColumn(FormSpecs.PREF_COLSPEC); add(component); nextColumn(); return this; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/builder/AbstractButtonPanelBuilder.java0000644000175000017500000004026411772633204031106 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.builder; import static com.jgoodies.common.base.Preconditions.checkArgument; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.awt.Color; import java.awt.Component; import java.awt.ComponentOrientation; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.border.Border; import com.jgoodies.forms.factories.ComponentFactory; import com.jgoodies.forms.internal.FocusTraversalUtilsAccessor; import com.jgoodies.forms.layout.ColumnSpec; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.FormSpecs; import com.jgoodies.forms.layout.RowSpec; import com.jgoodies.forms.util.LayoutStyle; /** * The abstract superclass for {@link ButtonBarBuilder}. * Provides a cell cursor for traversing * the button bar/stack while components are added. It also offers * convenience methods to append logical columns and rows.

* * TODO: Mention the ButtonStackBuilder2 subclass as soon as it is available. * * @author Karsten Lentzsch * @version $Revision: 1.11 $ * * @since 1.2 */ public abstract class AbstractButtonPanelBuilder extends AbstractBuilder { // Instance Fields ******************************************************** /** * Specifies if we fill the grid from left to right or right to left. * This value is initialized during the construction from the layout * container's component orientation. * * @see #isLeftToRight() * @see #setLeftToRight(boolean) * @see ComponentOrientation */ private boolean leftToRight; /** * Indicates whether a focus group has been built in {@link #build()}. * Reset to {@code false} whenever a component is added. */ protected boolean focusGrouped = false; // Instance Creation **************************************************** /** * Constructs an AbstractButtonPanelBuilder * for the given FormLayout and layout container. * * @param layout the FormLayout to use * @param container the layout container * * @throws NullPointerException if {@code layout} or {@code container} is {@code null} */ protected AbstractButtonPanelBuilder(FormLayout layout, JPanel container) { super(layout, container); opaque(false); ComponentOrientation orientation = container.getComponentOrientation(); leftToRight = orientation.isLeftToRight() || !orientation.isHorizontal(); } // Accessors ************************************************************** /** * Returns the panel used to build the form and lazily builds * a focus traversal group for all contained AbstractButtons. * * @return the panel used by this builder to build the form */ public JPanel getPanel() { return build(); } /** * Returns the panel used to build the form and lazily builds * a focus traversal group for all contained AbstractButtons. * * @return the panel used by this builder to build the form */ public JPanel build() { if (!focusGrouped) { List buttons = new ArrayList(); for (Component component : getContainer().getComponents()) { if (component instanceof AbstractButton) { buttons.add((AbstractButton) component); } } FocusTraversalUtilsAccessor.tryToBuildAFocusGroup(buttons.toArray(new AbstractButton[0])); focusGrouped = true; } return (JPanel) getContainer(); } // Frequently Used Panel Properties *************************************** /** * Sets the panel's background color and makes the panel opaque. * * @param background the color to set as new background * * @see JComponent#setBackground(Color) */ protected AbstractButtonPanelBuilder background(Color background) { getPanel().setBackground(background); opaque(true); return this; } /** * Sets the panel's border. * * @param border the border to set * * @see JComponent#setBorder(Border) */ protected AbstractButtonPanelBuilder border(Border border) { getPanel().setBorder(border); return this; } /** * Sets the panel's opaque state. * * @param b true for opaque, false for non-opaque * * @see JComponent#setOpaque(boolean) */ protected AbstractButtonPanelBuilder opaque(boolean b) { getPanel().setOpaque(b); return this; } /** * Sets the panel's background color and makes the panel opaque. * * @param background the color to set as new background * * @see JComponent#setBackground(Color) */ public void setBackground(Color background) { getPanel().setBackground(background); opaque(true); } /** * Sets the panel's border. * * @param border the border to set * * @see JComponent#setBorder(Border) */ public void setBorder(Border border) { getPanel().setBorder(border); } /** * Sets the panel's opaque state. * * @param b true for opaque, false for non-opaque * * @see JComponent#setOpaque(boolean) * * @since 1.1 */ public void setOpaque(boolean b) { getPanel().setOpaque(b); } // Accessing the Cursor Direction *************************************** /** * Returns whether this builder fills the form left-to-right * or right-to-left. The initial value of this property is set * during the builder construction from the layout container's * {@code componentOrientation} property. * * @return true indicates left-to-right, false indicates right-to-left * * @see #setLeftToRight(boolean) * @see ComponentOrientation */ public final boolean isLeftToRight() { return leftToRight; } /** * Sets the form fill direction to left-to-right or right-to-left. * The initial value of this property is set during the builder construction * from the layout container's {@code componentOrientation} property. * * @param b true indicates left-to-right, false right-to-left * * @see #isLeftToRight() * @see ComponentOrientation */ public final void setLeftToRight(boolean b) { leftToRight = b; } // Accessing the Cursor Location and Extent ***************************** /** * Moves to the next column, does the same as #nextColumn(1). */ protected final void nextColumn() { nextColumn(1); } /** * Moves to the next column. * * @param columns number of columns to move */ private void nextColumn(int columns) { currentCellConstraints.gridX += columns * getColumnIncrementSign(); } protected final int getColumn() { return currentCellConstraints.gridX; } /** * Returns the cursor's row. * * @return the cursor's row */ protected final int getRow() { return currentCellConstraints.gridY; } /** * Increases the row by one; does the same as #nextRow(1). */ protected final void nextRow() { nextRow(1); } /** * Increases the row by the specified rows. * * @param rows number of rows to move */ private void nextRow(int rows) { currentCellConstraints.gridY += rows; } // Appending Columns ****************************************************** /** * Appends the given column specification to the builder's layout. * * @param columnSpec the column specification object to append */ protected final void appendColumn(ColumnSpec columnSpec) { getLayout().appendColumn(columnSpec); } /** * Appends a glue column. * * @see #appendRelatedComponentsGapColumn() * @see #appendUnrelatedComponentsGapColumn() */ protected final void appendGlueColumn() { appendColumn(FormSpecs.GLUE_COLSPEC); } /** * Appends a column that is the default gap for related components. * * @see #appendGlueColumn() * @see #appendUnrelatedComponentsGapColumn() */ protected final void appendRelatedComponentsGapColumn() { appendColumn(FormSpecs.RELATED_GAP_COLSPEC); } /** * Appends a column that is the default gap for unrelated components. * * @see #appendGlueColumn() * @see #appendRelatedComponentsGapColumn() */ protected final void appendUnrelatedComponentsGapColumn() { appendColumn(FormSpecs.UNRELATED_GAP_COLSPEC); } // Appending Rows ******************************************************** /** * Appends the given row specification to the builder's layout. * * @param rowSpec the row specification object to append */ protected final void appendRow(RowSpec rowSpec) { getLayout().appendRow(rowSpec); } /** * Appends a glue row. * * @see #appendRelatedComponentsGapRow() * @see #appendUnrelatedComponentsGapRow() */ protected final void appendGlueRow() { appendRow(FormSpecs.GLUE_ROWSPEC); } /** * Appends a row that is the default gap for related components. * * @see #appendGlueRow() * @see #appendUnrelatedComponentsGapRow() */ protected final void appendRelatedComponentsGapRow() { appendRow(FormSpecs.RELATED_GAP_ROWSPEC); } /** * Appends a row that is the default gap for unrelated components. * * @see #appendGlueRow() * @see #appendRelatedComponentsGapRow() */ protected final void appendUnrelatedComponentsGapRow() { appendRow(FormSpecs.UNRELATED_GAP_ROWSPEC); } // Adding Components **************************************************** /** * Adds a component to the container using the default cell constraints. * Note that when building from left to right, this method won't adjust * the cell constraints if the column span is larger than 1. * * @param component the component to add * @return the added component */ protected Component add(Component component) { getContainer().add(component, currentCellConstraints); focusGrouped = false; return component; } abstract protected AbstractButtonPanelBuilder addButton(JComponent button); /** * Adds one or many sequences of related buttons. A new sequence starts * when a button is {@code null}. The next sequence is separated by an * unrelated gap. * Each button has the minimum width as specified by * {@link LayoutStyle#getDefaultButtonWidth()}. The gap width between * the buttons is {@link LayoutStyle#getRelatedComponentsPadX()}.

* * Although JButtons are expected, general JComponents are accepted * to allow custom button component types.

* * Examples: *

     * builder.addButtons(newButton, editButton, deleteButton);
     * builder.addButtons(newButton, editButton, deleteButton, null, printButton);
     * 
* * @param buttons the buttons to add * * @return this builder * * @throws NullPointerException if {@code buttons} is {@code null} * @throws IllegalArgumentException if {@code buttons} is empty * * @see #addButton(JComponent) */ protected AbstractButtonPanelBuilder addButton(JComponent... buttons) { checkNotNull(buttons, "The button array must not be null."); checkArgument(buttons.length > 0, "The button array must not be empty."); boolean needsGap = false; for (JComponent button : buttons) { if (button == null) { addUnrelatedGap(); needsGap = false; continue; } if (needsGap) { addRelatedGap(); } addButton(button); needsGap = true; } return this; } /** * Constructs an array of JButtons from the given Action array, * and adds them as a sequence of related buttons separated by a default gap. * * @param actions an array of buttons to add */ protected AbstractButtonPanelBuilder addButton(Action... actions) { checkNotNull(actions, "The Action array must not be null."); int length = actions.length; checkArgument(length > 0, "The Action array must not be empty."); JButton[] buttons = new JButton[length]; for (int i = 0; i < length; i++) { Action action = actions[i]; buttons[i] = action == null ? null : createButton(action); } return addButton(buttons); } /** * Adds the standard gap for related components. */ abstract protected AbstractButtonPanelBuilder addRelatedGap(); /** * Adds the standard gap for unrelated components. */ abstract protected AbstractButtonPanelBuilder addUnrelatedGap(); /** * Creates and returns a button that is bound to the given Action. * This is a hook that allows to return customized buttons. * For example, the JGoodies {@code JGButton} configures * the accessible name and accessible description from Actions * that provide these information.

* * This default implementation delegates the button creation * to this builder's component factory, * see {@link ComponentFactory#createButton(Action)}). * * @param action provides bound visual properties for the button * @return the created button * * @since 1.4 */ protected JButton createButton(Action action) { return getComponentFactory().createButton(action); } // Misc ***************************************************************** /** * Returns the sign (-1 or 1) used to increment the cursor's column * when moving to the next column. * * @return -1 for right-to-left, 1 for left-to-right */ private int getColumnIncrementSign() { return isLeftToRight() ? 1 : -1; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/0000755000175000017500000000000011751010232022661 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/package.html0000644000175000017500000000457111731041742025161 0ustar tonytony Contains the core classes of the JGoodies Forms framework: layout manager, column and row specifications, sizes and cell constraints.

Related Documentation

For more information see: jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/ConstantSize.java0000644000175000017500000004204011731041742026160 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkArgument; import java.awt.Component; import java.awt.Container; import java.io.Serializable; import java.util.List; /** * An implementation of the {@link Size} interface that represents constant * sizes described by a value and unit, for example: * 10 pixel, 15 point or 4 dialog units. * You can get instances of {@code ConstantSize} using * the factory methods and constants in the {@link Sizes} class. * Logical constant sizes that vary with the current layout style * are delivered by the {@link com.jgoodies.forms.util.LayoutStyle} class.

* * This class supports different size units: * * * * * * * * *
Unit  *  Abbreviation   * Size
Millimetermm0.1 cm
Centimetercm10.0 mm
Inchin25.4 mm
DTP Pointpt1/72 in
Pixelpx1/(resolution in dpi) in
Dialog Unitdluhonors l&f, resolution, and * dialog font size

* * Examples:

 * Sizes.ZERO;
 * Sizes.DLUX9;
 * Sizes.dluX(42);
 * Sizes.pixel(99);
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.21 $ * * @see Size * @see Sizes */ public final class ConstantSize implements Size, Serializable { // Public Units ********************************************************* public static final Unit PIXEL = new Unit("Pixel", "px", null, true); public static final Unit POINT = new Unit("Point", "pt", null, true); public static final Unit DIALOG_UNITS_X = new Unit("Dialog units X", "dluX", "dlu", true); public static final Unit DIALOG_UNITS_Y = new Unit("Dialog units Y", "dluY", "dlu", true); public static final Unit MILLIMETER = new Unit("Millimeter", "mm", null, false); public static final Unit CENTIMETER = new Unit("Centimeter", "cm", null, false); public static final Unit INCH = new Unit("Inch", "in", null, false); public static final Unit PX = PIXEL; public static final Unit PT = POINT; public static final Unit DLUX = DIALOG_UNITS_X; public static final Unit DLUY = DIALOG_UNITS_Y; public static final Unit MM = MILLIMETER; public static final Unit CM = CENTIMETER; public static final Unit IN = INCH; /** * An array of all enumeration values used to canonicalize * deserialized units. */ private static final Unit[] VALUES = { PIXEL, POINT, DIALOG_UNITS_X, DIALOG_UNITS_Y, MILLIMETER, CENTIMETER, INCH}; // Fields *************************************************************** private final double value; private final Unit unit; // Instance Creation **************************************************** /** * Constructs a ConstantSize for the given size and unit. * * @param value the size value interpreted in the given units * @param unit the size's unit * * @since 1.1 */ public ConstantSize(int value, Unit unit) { this.value = value; this.unit = unit; } /** * Constructs a ConstantSize for the given size and unit. * * @param value the size value interpreted in the given units * @param unit the size's unit * * @since 1.1 */ public ConstantSize(double value, Unit unit) { this.value = value; this.unit = unit; } /** * Creates and returns a ConstantSize from the given encoded size * and unit description. * * @param encodedValueAndUnit the size's value and unit as string, * trimmed and in lower case * @param horizontal true for horizontal, false for vertical * @return a constant size for the given encoding and unit description * * @throws IllegalArgumentException if the unit requires integer * but the value is not an integer */ static ConstantSize valueOf(String encodedValueAndUnit, boolean horizontal) { String[] split = ConstantSize.splitValueAndUnit(encodedValueAndUnit); String encodedValue = split[0]; String encodedUnit = split[1]; Unit unit = Unit.valueOf(encodedUnit, horizontal); double value = Double.parseDouble(encodedValue); if (unit.requiresIntegers) { checkArgument(value == (int) value, "%s value %s must be an integer.", unit, encodedValue); } return new ConstantSize(value, unit); } /** * Creates and returns a ConstantSize for the specified size value * in horizontal dialog units. * * @param value size value in horizontal dialog units * @return the associated Size instance */ static ConstantSize dluX(int value) { return new ConstantSize(value, DLUX); } /** * Creates and returns a ConstantSize for the specified size value * in vertical dialog units. * * @param value size value in vertical dialog units * @return the associated Size instance */ static ConstantSize dluY(int value) { return new ConstantSize(value, DLUY); } // Accessors ************************************************************ /** * Returns this size's value. * * @return the size value * * @since 1.1 */ public double getValue() { return value; } /** * Returns this size's unit. * * @return the size unit * * @since 1.1 */ public Unit getUnit() { return unit; } // Accessing the Value ************************************************** /** * Converts the size if necessary and returns the value in pixels. * * @param component the associated component * @return the size in pixels */ public int getPixelSize(Component component) { if (unit == PIXEL) { return intValue(); } else if (unit == POINT) { return Sizes.pointAsPixel(intValue(), component); } else if (unit == INCH) { return Sizes.inchAsPixel(value, component); } else if (unit == MILLIMETER) { return Sizes.millimeterAsPixel(value, component); } else if (unit == CENTIMETER) { return Sizes.centimeterAsPixel(value, component); } else if (unit == DIALOG_UNITS_X) { return Sizes.dialogUnitXAsPixel(intValue(), component); } else if (unit == DIALOG_UNITS_Y) { return Sizes.dialogUnitYAsPixel(intValue(), component); } else { throw new IllegalStateException("Invalid unit " + unit); } } // Implementing the Size Interface ************************************** /** * Returns this size as pixel size. Neither requires the component * list nor the specified measures.

* * Invoked by {@link com.jgoodies.forms.layout.FormSpec} to determine * the size of a column or row. * * @param container the layout container * @param components the list of components used to compute the size * @param minMeasure the measure that determines the minimum sizes * @param prefMeasure the measure that determines the preferred sizes * @param defaultMeasure the measure that determines the default sizes * @return the computed maximum size in pixel */ @Override public int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure) { return getPixelSize(container); } /** * Describes if this Size can be compressed, if container space gets scarce. * Used by the FormLayout size computations in {@code #compressedSizes} * to check whether a column or row can be compressed or not.

* * ConstantSizes are incompressible. * * @return {@code false} * * @since 1.1 */ @Override public boolean compressible() { return false; } // Overriding Object Behavior ******************************************* /** * Indicates whether some other ConstantSize is "equal to" this one. * * @param o the Object with which to compare * @return {@code true} if this object is the same as the obj * argument; {@code false} otherwise. * * @see java.lang.Object#hashCode() * @see java.util.Hashtable */ @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof ConstantSize)) { return false; } ConstantSize size = (ConstantSize) o; return this.value == size.value && this.unit == size.unit; } /** * Returns a hash code value for the object. This method is * supported for the benefit of hashtables such as those provided by * {@code java.util.Hashtable}. * * @return a hash code value for this object. * * @see java.lang.Object#equals(java.lang.Object) * @see java.util.Hashtable */ @Override public int hashCode() { return new Double(value).hashCode() + 37 * unit.hashCode(); } /** * Returns a string representation of this size object. * * Note: This string representation may change * at any time. It is intended for debugging purposes. For parsing, * use {@link #encode()} instead. * * @return a string representation of the constant size */ @Override public String toString() { return value == intValue() ? Integer.toString(intValue()) + unit.abbreviation() : Double.toString(value) + unit.abbreviation(); } /** * Returns a parseable string representation of this constant size. * * @return a String that can be parsed by the Forms parser * * @since 1.2 */ @Override public String encode() { return value == intValue() ? Integer.toString(intValue()) + unit.encode() : Double.toString(value) + unit.encode(); } // Helper Code ********************************************************** private int intValue() { return (int) Math.round(value); } /** * Splits a string that encodes size with unit into the size and unit * substrings. Returns an array of two strings. * * @param encodedValueAndUnit a strings that represents a size with unit, * trimmed and in lower case * @return the first element is size, the second is unit */ private static String[] splitValueAndUnit(String encodedValueAndUnit) { String[] result = new String[2]; int len = encodedValueAndUnit.length(); int firstLetterIndex = len; while (firstLetterIndex > 0 && Character.isLetter(encodedValueAndUnit.charAt(firstLetterIndex-1))) { firstLetterIndex--; } result[0] = encodedValueAndUnit.substring(0, firstLetterIndex); result[1] = encodedValueAndUnit.substring(firstLetterIndex); return result; } // Helper Class ********************************************************* /** * An ordinal-based serializable typesafe enumeration for units * as used in instances of {@link ConstantSize}. */ public static final class Unit implements Serializable { private final transient String name; private final transient String abbreviation; private final transient String parseAbbreviation; final transient boolean requiresIntegers; private Unit(String name, String abbreviation, String parseAbbreviation, boolean requiresIntegers) { this.name = name; this.abbreviation = abbreviation; this.parseAbbreviation = parseAbbreviation; this.requiresIntegers = requiresIntegers; } /** * Returns a Unit that corresponds to the specified string. * * @param name the encoded unit, trimmed and in lower case * @param horizontal true for a horizontal unit, false for vertical * @return the corresponding Unit * @throws IllegalArgumentException if no Unit exists for the string */ static Unit valueOf(String name, boolean horizontal) { if (name.length() == 0) { Unit defaultUnit = Sizes.getDefaultUnit(); if (defaultUnit != null) { return defaultUnit; } return horizontal ? DIALOG_UNITS_X : DIALOG_UNITS_Y; } else if (name.equals("px")) { return PIXEL; } else if (name.equals("dlu")) { return horizontal ? DIALOG_UNITS_X : DIALOG_UNITS_Y; } else if (name.equals("pt")) { return POINT; } else if (name.equals("in")) { return INCH; } else if (name.equals("mm")) { return MILLIMETER; } else if (name.equals("cm")) { return CENTIMETER; } else { throw new IllegalArgumentException( "Invalid unit name '" + name + "'. Must be one of: " + "px, dlu, pt, mm, cm, in"); } } /** * Returns a string representation of this unit object. * * Note: This implementation may change at any time. * It is intended for debugging purposes. For parsing, use * {@link #encode()} instead. * * @return a string representation of the constant size */ @Override public String toString() { return name; } /** * Returns a parseable string representation of this unit. * * @return a String that can be parsed by the Forms parser * * @since 1.2 */ public String encode() { return parseAbbreviation != null ? parseAbbreviation : abbreviation; } /** * Returns the first character of this Unit's name. * Used to identify it in short format strings. * * @return the first character of this Unit's name. */ public String abbreviation() { return abbreviation; } // Serialization ***************************************************** private static int nextOrdinal = 0; private final int ordinal = nextOrdinal++; private Object readResolve() { return VALUES[ordinal]; // Canonicalize } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/CellConstraints.java0000644000175000017500000014207511731041742026654 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkArgument; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.awt.Component; import java.awt.Insets; import java.awt.Rectangle; import java.io.Serializable; import java.util.Locale; import java.util.StringTokenizer; import com.jgoodies.forms.factories.CC; /** * Defines constraints for components that are laid out with the FormLayout. * Defines the components display area: grid x, grid y, * grid width (column span), grid height (row span), horizontal alignment * and vertical alignment.

* * Most methods return this object to enable method chaining.

* * You can set optional insets in a constructor. This is useful if you * need to use a pixel-size insets to align perceived component bounds * with pixel data, for example an icon. Anyway, this is rarely used. * The insets don't affect the size computation for columns and rows. * I consider renaming the insets to offsets to better indicate the * motivation for this option.

* * Examples:
* The following cell constraints locate a component in the third * column of the fifth row; column and row span are 1; the component * will be aligned with the column's right-hand side and the row's * bottom. *

 * CellConstraints cc = new CellConstraints();
 * cc.xy  (3, 5);
 * cc.xy  (3, 5, CellConstraints.RIGHT, CellConstraints.BOTTOM);
 * cc.xy  (3, 5, "right, bottom");
 *
 * cc.xyw (3, 5, 1);
 * cc.xyw (3, 5, 1, CellConstraints.RIGHT, CellConstraints.BOTTOM);
 * cc.xyw (3, 5, 1, "right, bottom");
 *
 * cc.xywh(3, 5, 1, 1);
 * cc.xywh(3, 5, 1, 1, CellConstraints.RIGHT, CellConstraints.BOTTOM);
 * cc.xywh(3, 5, 1, 1, "right, bottom");
 * 
* See also the examples in the {@link FormLayout} class comment.

* * TODO: Explain in the JavaDocs that the insets are actually offsets. * And describe that these offsets are not taken into account when * FormLayout computes the column and row sizes.

* * TODO: Rename the inset to offsets. * * @author Karsten Lentzsch * @version $Revision: 1.15 $ * * @see CC */ public final class CellConstraints implements Cloneable, Serializable { // Alignment Constants ************************************************* /* * Implementation Note: Do not change the order of the following constants. * The serialization of class Alignment is ordinal-based and relies on it. */ /** * Use the column's or row's default alignment. */ public static final Alignment DEFAULT = new Alignment("default", Alignment.BOTH); /** * Fill the cell either horizontally or vertically. */ public static final Alignment FILL = new Alignment("fill", Alignment.BOTH); /** * Put the component in the left. */ public static final Alignment LEFT = new Alignment("left", Alignment.HORIZONTAL); /** * Put the component in the right. */ public static final Alignment RIGHT = new Alignment("right", Alignment.HORIZONTAL); /** * Put the component in the center. */ public static final Alignment CENTER = new Alignment("center", Alignment.BOTH); /** * Put the component in the top. */ public static final Alignment TOP = new Alignment("top", Alignment.VERTICAL); /** * Put the component in the bottom. */ public static final Alignment BOTTOM = new Alignment("bottom", Alignment.VERTICAL); /** * An array of all enumeration values used to canonicalize * deserialized alignments. */ private static final Alignment[] VALUES = { DEFAULT, FILL, LEFT, RIGHT, CENTER, TOP, BOTTOM }; /** * A reusable {@code Insets} object to reduce object instantiation. */ private static final Insets EMPTY_INSETS = new Insets(0, 0, 0, 0); // Fields *************************************************************** /** * Describes the component's horizontal grid origin (starts at 1). */ public int gridX; /** * Describes the component's vertical grid origin (starts at 1). */ public int gridY; /** * Describes the component's horizontal grid extend (number of cells). */ public int gridWidth; /** * Describes the component's vertical grid extent (number of cells). */ public int gridHeight; /** * Describes the component's horizontal alignment. */ public Alignment hAlign; /** * Describes the component's vertical alignment. */ public Alignment vAlign; /** * Describes the component's {@code Insets} in it's display area. */ public Insets insets; /** * Describes whether individual components shall be taken into account * by the FormLayout if 1) they are invisible and 2) the FormLayout * does not honor the visibility. * * See {@link FormLayout#setHonorsVisibility(boolean)} and * {@link FormLayout#setHonorsVisibility(Component, Boolean)} for a * full description of this feature. */ public Boolean honorsVisibility; // Instance Creation **************************************************** /** * Constructs a default instance of {@code CellConstraints}. */ public CellConstraints() { this(1, 1); } /** * Constructs an instance of {@code CellConstraints} for the given * cell position.

* * Examples:

     * new CellConstraints(1, 3);
     * new CellConstraints(1, 3);
     * 
* * @param gridX the component's horizontal grid origin * @param gridY the component's vertical grid origin */ public CellConstraints(int gridX, int gridY) { this(gridX, gridY, 1, 1); } /** * Constructs an instance of {@code CellConstraints} for the given * cell position, anchor, and fill.

* * Examples:

     * new CellConstraints(1, 3, CellConstraints.LEFT,   CellConstraints.BOTTOM);
     * new CellConstraints(1, 3, CellConstraints.CENTER, CellConstraints.FILL);
     * 
* * @param gridX the component's horizontal grid origin * @param gridY the component's vertical grid origin * @param hAlign the component's horizontal alignment * @param vAlign the component's vertical alignment */ public CellConstraints(int gridX, int gridY, Alignment hAlign, Alignment vAlign) { this(gridX, gridY, 1, 1, hAlign, vAlign, EMPTY_INSETS); } /** * Constructs an instance of {@code CellConstraints} for the given * cell position and size.

* * Examples:

     * new CellConstraints(1, 3, 2, 1);
     * new CellConstraints(1, 3, 7, 3);
     * 
* * @param gridX the component's horizontal grid origin * @param gridY the component's vertical grid origin * @param gridWidth the component's horizontal extent * @param gridHeight the component's vertical extent */ public CellConstraints(int gridX, int gridY, int gridWidth, int gridHeight) { this(gridX, gridY, gridWidth, gridHeight, DEFAULT, DEFAULT); } /** * Constructs an instance of {@code CellConstraints} for the given * cell position and size, anchor, and fill.

* * Examples:

     * new CellConstraints(1, 3, 2, 1, CellConstraints.LEFT,   CellConstraints.BOTTOM);
     * new CellConstraints(1, 3, 7, 3, CellConstraints.CENTER, CellConstraints.FILL);
     * 
* * @param gridX the component's horizontal grid origin * @param gridY the component's vertical grid origin * @param gridWidth the component's horizontal extent * @param gridHeight the component's vertical extent * @param hAlign the component's horizontal alignment * @param vAlign the component's vertical alignment */ public CellConstraints(int gridX, int gridY, int gridWidth, int gridHeight, Alignment hAlign, Alignment vAlign) { this(gridX, gridY, gridWidth, gridHeight, hAlign, vAlign, EMPTY_INSETS); } /** * Constructs an instance of {@code CellConstraints} for * the complete set of available properties.

* * Examples:

     * new CellConstraints(1, 3, 2, 1, CellConstraints.LEFT,   CellConstraints.BOTTOM, new Insets(0, 1, 0, 3));
     * new CellConstraints(1, 3, 7, 3, CellConstraints.CENTER, CellConstraints.FILL,   new Insets(0, 1, 0, 0));
     * 
* * @param gridX the component's horizontal grid origin * @param gridY the component's vertical grid origin * @param gridWidth the component's horizontal extent * @param gridHeight the component's vertical extent * @param hAlign the component's horizontal alignment * @param vAlign the component's vertical alignment * @param insets the component's display area {@code Insets} * @throws IndexOutOfBoundsException if the grid origin or extent is negative * @throws NullPointerException if the horizontal or vertical alignment is null * @throws IllegalArgumentException if an alignment orientation is invalid */ public CellConstraints(int gridX, int gridY, int gridWidth, int gridHeight, Alignment hAlign, Alignment vAlign, Insets insets) { this.gridX = gridX; this.gridY = gridY; this.gridWidth = gridWidth; this.gridHeight = gridHeight; this.hAlign = hAlign; this.vAlign = vAlign; this.insets = insets; if (gridX <= 0) { throw new IndexOutOfBoundsException("The grid x must be a positive number."); } if (gridY <= 0) { throw new IndexOutOfBoundsException("The grid y must be a positive number."); } if (gridWidth <= 0) { throw new IndexOutOfBoundsException("The grid width must be a positive number."); } if (gridHeight <= 0) { throw new IndexOutOfBoundsException("The grid height must be a positive number."); } checkNotNull(hAlign, "The horizontal alignment must not be null."); checkNotNull(vAlign, "The vertical alignment must not be null."); ensureValidOrientations(hAlign, vAlign); } /** * Constructs an instance of {@code CellConstraints} from * the given encoded string properties.

* * Examples:

     * new CellConstraints("1, 3");
     * new CellConstraints("1, 3, left, bottom");
     * new CellConstraints("1, 3, 2, 1, left, bottom");
     * new CellConstraints("1, 3, 2, 1, l, b");
     * 
* * @param encodedConstraints the constraints encoded as string */ public CellConstraints(String encodedConstraints) { this(); initFromConstraints(encodedConstraints); } // Setters with Column-Row Order ****************************************** /** * Sets column and row origins; sets width and height to 1; * uses the default alignments.

* * Examples:

     * cc.xy(1, 1);
     * cc.xy(1, 3);
     * 
* * @param col the new column index * @param row the new row index * @return this */ public CellConstraints xy(int col, int row) { return xywh(col, row, 1, 1); } /** * Sets column and row origins; sets width and height to 1; * decodes horizontal and vertical alignments from the given string.

* * Examples:

     * cc.xy(1, 3, "left, bottom");
     * cc.xy(1, 3, "l, b");
     * cc.xy(1, 3, "center, fill");
     * cc.xy(1, 3, "c, f");
     * 
* * @param col the new column index * @param row the new row index * @param encodedAlignments describes the horizontal and vertical alignments * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid */ public CellConstraints xy(int col, int row, String encodedAlignments) { return xywh(col, row, 1, 1, encodedAlignments); } /** * Sets the column and row origins; sets width and height to 1; * set horizontal and vertical alignment using the specified objects.

* * Examples:

     * cc.xy(1, 3, CellConstraints.LEFT,   CellConstraints.BOTTOM);
     * cc.xy(1, 3, CellConstraints.CENTER, CellConstraints.FILL);
     * 
* * @param col the new column index * @param row the new row index * @param colAlign horizontal component alignment * @param rowAlign vertical component alignment * @return this */ public CellConstraints xy(int col, int row, Alignment colAlign, Alignment rowAlign) { return xywh(col, row, 1, 1, colAlign, rowAlign); } /** * Sets the column, row, width, and height; uses a height (row span) of 1 * and the horizontal and vertical default alignments.

* * Examples:

     * cc.xyw(1, 3, 7);
     * cc.xyw(1, 3, 2);
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @return this */ public CellConstraints xyw(int col, int row, int colSpan) { return xywh(col, row, colSpan, 1, DEFAULT, DEFAULT); } /** * Sets the column, row, width, and height; * decodes the horizontal and vertical alignments from the given string. * The row span (height) is set to 1.

* * Examples:

     * cc.xyw(1, 3, 7, "left, bottom");
     * cc.xyw(1, 3, 7, "l, b");
     * cc.xyw(1, 3, 2, "center, fill");
     * cc.xyw(1, 3, 2, "c, f");
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param encodedAlignments describes the horizontal and vertical alignments * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public CellConstraints xyw(int col, int row, int colSpan, String encodedAlignments) { return xywh(col, row, colSpan, 1, encodedAlignments); } /** * Sets the column, row, width, and height; sets the horizontal * and vertical alignment using the specified alignment objects. * The row span (height) is set to 1.

* * Examples:

     * cc.xyw(1, 3, 2, CellConstraints.LEFT,   CellConstraints.BOTTOM);
     * cc.xyw(1, 3, 7, CellConstraints.CENTER, CellConstraints.FILL);
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param colAlign horizontal component alignment * @param rowAlign vertical component alignment * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public CellConstraints xyw(int col, int row, int colSpan, Alignment colAlign, Alignment rowAlign) { return xywh(col, row, colSpan, 1, colAlign, rowAlign); } /** * Sets the column, row, width, and height; uses default alignments.

* * Examples:

     * cc.xywh(1, 3, 2, 1);
     * cc.xywh(1, 3, 7, 3);
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param rowSpan the row span or grid height * @return this */ public CellConstraints xywh(int col, int row, int colSpan, int rowSpan) { return xywh(col, row, colSpan, rowSpan, DEFAULT, DEFAULT); } /** * Sets the column, row, width, and height; * decodes the horizontal and vertical alignments from the given string.

* * Examples:

     * cc.xywh(1, 3, 2, 1, "left, bottom");
     * cc.xywh(1, 3, 2, 1, "l, b");
     * cc.xywh(1, 3, 7, 3, "center, fill");
     * cc.xywh(1, 3, 7, 3, "c, f");
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param rowSpan the row span or grid height * @param encodedAlignments describes the horizontal and vertical alignments * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public CellConstraints xywh(int col, int row, int colSpan, int rowSpan, String encodedAlignments) { CellConstraints result = xywh(col, row, colSpan, rowSpan); result.setAlignments(encodedAlignments, true); return result; } /** * Sets the column, row, width, and height; sets the horizontal * and vertical alignment using the specified alignment objects.

* * Examples:

     * cc.xywh(1, 3, 2, 1, CellConstraints.LEFT,   CellConstraints.BOTTOM);
     * cc.xywh(1, 3, 7, 3, CellConstraints.CENTER, CellConstraints.FILL);
     * 
* * @param col the new column index * @param row the new row index * @param colSpan the column span or grid width * @param rowSpan the row span or grid height * @param colAlign horizontal component alignment * @param rowAlign vertical component alignment * @return this * @throws IllegalArgumentException if an alignment orientation is invalid */ public CellConstraints xywh(int col, int row, int colSpan, int rowSpan, Alignment colAlign, Alignment rowAlign) { this.gridX = col; this.gridY = row; this.gridWidth = colSpan; this.gridHeight = rowSpan; this.hAlign = colAlign; this.vAlign = rowAlign; ensureValidOrientations(hAlign, vAlign); return this; } // Setters with Row-Column Order ****************************************** /** * Sets row and column origins; sets height and width to 1; * uses the default alignments.

* * Examples:

     * cc.rc(1, 1);
     * cc.rc(3, 1);
     * 
* * @param row the new row index * @param col the new column index * @return this * * @since 1.1 */ public CellConstraints rc(int row, int col) { return rchw(row, col, 1, 1); } /** * Sets row and column origins; sets height and width to 1; * decodes vertical and horizontal alignments from the given string.

* * Examples:

     * cc.rc(3, 1, "bottom, left");
     * cc.rc(3, 1, "b, l");
     * cc.rc(3, 1, "fill, center");
     * cc.rc(3, 1, "f, c");
     * 
* * @param row the new row index * @param col the new column index * @param encodedAlignments describes the vertical and horizontal alignments * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid * * @since 1.1 */ public CellConstraints rc(int row, int col, String encodedAlignments) { return rchw(row, col, 1, 1, encodedAlignments); } /** * Sets the row and column origins; sets width and height to 1; * set horizontal and vertical alignment using the specified objects.

* * Examples:

     * cc.rc(3, 1, CellConstraints.BOTTOM, CellConstraints.LEFT);
     * cc.rc(3, 1, CellConstraints.FILL,   CellConstraints.CENTER);
     * 
* * @param row the new row index * @param col the new column index * @param rowAlign vertical component alignment * @param colAlign horizontal component alignment * @return this * * @since 1.1 */ public CellConstraints rc(int row, int col, Alignment rowAlign, Alignment colAlign) { return rchw(row, col, 1, 1, rowAlign, colAlign); } /** * Sets the row, column, height, and width; uses a height (row span) of 1 * and the vertical and horizontal default alignments.

* * Examples:

     * cc.rcw(3, 1, 7);
     * cc.rcw(3, 1, 2);
     * 
* * @param row the new row index * @param col the new column index * @param colSpan the column span or grid width * @return this * * @since 1.1 */ public CellConstraints rcw(int row, int col, int colSpan) { return rchw(row, col, 1, colSpan, DEFAULT, DEFAULT); } /** * Sets the row, column, height, and width; * decodes the vertical and horizontal alignments from the given string. * The row span (height) is set to 1.

* * Examples:

     * cc.rcw(3, 1, 7, "bottom, left");
     * cc.rcw(3, 1, 7, "b, l");
     * cc.rcw(3, 1, 2, "fill, center");
     * cc.rcw(3, 1, 2, "f, c");
     * 
* * @param row the new row index * @param col the new column index * @param colSpan the column span or grid width * @param encodedAlignments describes the vertical and horizontal alignments * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid * * @since 1.1 */ public CellConstraints rcw(int row, int col, int colSpan, String encodedAlignments) { return rchw(row, col, 1, colSpan, encodedAlignments); } /** * Sets the row, column, height, and width; sets the vertical * and horizontal alignment using the specified alignment objects. * The row span (height) is set to 1.

* * Examples:

     * cc.rcw(3, 1, 2, CellConstraints.BOTTOM, CellConstraints.LEFT);
     * cc.rcw(3, 1, 7, CellConstraints.FILL,   CellConstraints.CENTER);
     * 
* * @param row the new row index * @param col the new column index * @param colSpan the column span or grid width * @param rowAlign vertical component alignment * @param colAlign horizontal component alignment * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid * * @since 1.1 */ public CellConstraints rcw(int row, int col, int colSpan, Alignment rowAlign, Alignment colAlign) { return rchw(row, col, 1, colSpan, rowAlign, colAlign); } /** * Sets the row, column, height, and width; uses default alignments.

* * Examples:

     * cc.rchw(1, 3, 2, 1);
     * cc.rchw(1, 3, 7, 3);
     * 
* * @param row the new row index * @param col the new column index * @param rowSpan the row span or grid height * @param colSpan the column span or grid width * @return this * * @since 1.1 */ public CellConstraints rchw(int row, int col, int rowSpan, int colSpan) { return rchw(row, col, rowSpan, colSpan, DEFAULT, DEFAULT); } /** * Sets the row, column, height, and width; * decodes the vertical and horizontal alignments from the given string.

* * Examples:

     * cc.rchw(3, 1, 1, 2, "bottom, left");
     * cc.rchw(3, 1, 1, 2, "b, l");
     * cc.rchw(3, 1, 3, 7, "fill, center");
     * cc.rchw(3, 1, 3, 7, "f, c");
     * 
* * @param row the new row index * @param col the new column index * @param rowSpan the row span or grid height * @param colSpan the column span or grid width * @param encodedAlignments describes the vertical and horizontal alignments * @return this * @throws IllegalArgumentException if an alignment orientation is invalid * * @since 1.1 */ public CellConstraints rchw(int row, int col, int rowSpan, int colSpan, String encodedAlignments) { CellConstraints result = rchw(row, col, rowSpan, colSpan); result.setAlignments(encodedAlignments, false); return result; } /** * Sets the row, column, height, and width; sets the vertical and * horizontal alignment using the specified alignment objects.

* * Examples:

     * cc.rchw(3, 1, 1, 2, CellConstraints.BOTTOM, CellConstraints.LEFT);
     * cc.rchw(3, 1, 3, 7, CellConstraints.FILL,   CellConstraints.CENTER);
     * 
* * @param row the new row index * @param col the new column index * @param rowSpan the row span or grid height * @param colSpan the column span or grid width * @param rowAlign vertical component alignment * @param colAlign horizontal component alignment * @return this * * @throws IllegalArgumentException if an alignment orientation is invalid * * @since 1.1 */ public CellConstraints rchw(int row, int col, int rowSpan, int colSpan, Alignment rowAlign, Alignment colAlign) { return xywh(col, row, colSpan, rowSpan, colAlign, rowAlign); } // Parsing and Decoding String Descriptions ***************************** /** * Decodes and returns the grid bounds and alignments for this * constraints as an array of six integers. The string representation * is a comma separated sequence, one of *
     * "x, y"
     * "x, y, w, h"
     * "x, y, hAlign, vAlign"
     * "x, y, w, h, hAlign, vAlign"
     * 
* * @param encodedConstraints represents horizontal and vertical alignment * * @throws IllegalArgumentException if the encoded constraints do not * follow the constraint syntax */ @SuppressWarnings("null") private void initFromConstraints(String encodedConstraints) { StringTokenizer tokenizer = new StringTokenizer(encodedConstraints, " ,"); int argCount = tokenizer.countTokens(); checkArgument(argCount == 2 || argCount == 4 || argCount == 6, "You must provide 2, 4 or 6 arguments."); Integer nextInt = decodeInt(tokenizer.nextToken()); checkArgument(nextInt != null, "First cell constraint element must be a number."); gridX = nextInt.intValue(); checkArgument(gridX > 0, "The grid x must be a positive number."); nextInt = decodeInt(tokenizer.nextToken()); checkArgument(nextInt != null, "Second cell constraint element must be a number."); gridY = nextInt.intValue(); checkArgument(gridY > 0, "The grid y must be a positive number."); if (!tokenizer.hasMoreTokens()) { return; } String token = tokenizer.nextToken(); nextInt = decodeInt(token); if (nextInt != null) { // Case: "x, y, w, h" or // "x, y, w, h, hAlign, vAlign" gridWidth = nextInt.intValue(); if (gridWidth <= 0) { throw new IndexOutOfBoundsException( "The grid width must be a positive number."); } nextInt = decodeInt(tokenizer.nextToken()); if (nextInt == null) { throw new IllegalArgumentException( "Fourth cell constraint element must be like third."); } gridHeight = nextInt.intValue(); if (gridHeight <= 0) { throw new IndexOutOfBoundsException( "The grid height must be a positive number."); } if (!tokenizer.hasMoreTokens()) { return; } token = tokenizer.nextToken(); } hAlign = decodeAlignment(token); vAlign = decodeAlignment(tokenizer.nextToken()); ensureValidOrientations(hAlign, vAlign); } /** * Decodes a string description for the horizontal and vertical alignment * and sets this CellConstraints' alignment values. If the boolean is * {@code true} the horizontal alignment is the first token, * and the vertical alignment is the second token. if the boolean is * {@code false} the vertical alignment comes first.

* * Valid horizontal alignments are: left, center, right, default, and fill. * Valid vertical alignments are: top, center, bottom, default, and fill. * The anchor's string representation abbreviates the alignment: * l, c, r, d, f, t, and b.

* * Anchor examples: * "c, c" is centered, "l, t" is northwest, "c, t" is north, "r, c" east. * "c, d" is horizontally centered and uses the row's default alignment. * "d, t" is on top of the cell and uses the column's default alignment.

* * @param encodedAlignments represents horizontal and vertical alignment * @throws IllegalArgumentException if an alignment orientation is invalid */ private void setAlignments(String encodedAlignments, boolean horizontalThenVertical) { StringTokenizer tokenizer = new StringTokenizer(encodedAlignments, " ,"); Alignment first = decodeAlignment(tokenizer.nextToken()); Alignment second = decodeAlignment(tokenizer.nextToken()); hAlign = horizontalThenVertical ? first : second; vAlign = horizontalThenVertical ? second : first; ensureValidOrientations(hAlign, vAlign); } /** * Decodes an integer string representation and returns the * associated Integer or null in case of an invalid number format. * * @param token the encoded integer * @return the decoded Integer or null */ private static Integer decodeInt(String token) { try { return Integer.decode(token); } catch (NumberFormatException e) { return null; } } /** * Parses an alignment string description and * returns the corresponding alignment value. * * @param encodedAlignment the encoded alignment * @return the associated {@code Alignment} instance */ private static Alignment decodeAlignment(String encodedAlignment) { return Alignment.valueOf(encodedAlignment); } /** * Checks and verifies that this constraints object has valid grid * index values, i. e. the display area cells are inside the form's grid. * * @param colCount number of columns in the grid * @param rowCount number of rows in the grid * @throws IndexOutOfBoundsException if the display area described * by this constraints object is not inside the grid */ void ensureValidGridBounds(int colCount, int rowCount) { if (gridX <= 0) { throw new IndexOutOfBoundsException( "The column index " + gridX + " must be positive."); } if (gridX > colCount) { throw new IndexOutOfBoundsException( "The column index " + gridX + " must be less than or equal to " + colCount + "."); } if (gridX + gridWidth - 1 > colCount) { throw new IndexOutOfBoundsException( "The grid width " + gridWidth + " must be less than or equal to " + (colCount - gridX + 1) + "."); } if (gridY <= 0) { throw new IndexOutOfBoundsException( "The row index " + gridY + " must be positive."); } if (gridY > rowCount) { throw new IndexOutOfBoundsException( "The row index " + gridY + " must be less than or equal to " + rowCount + "."); } if (gridY + gridHeight - 1 > rowCount) { throw new IndexOutOfBoundsException( "The grid height " + gridHeight + " must be less than or equal to " + (rowCount - gridY + 1) + "."); } } /** * Checks and verifies that the horizontal alignment is a horizontal * and the vertical alignment is vertical. * * @param horizontalAlignment the horizontal alignment * @param verticalAlignment the vertical alignment * @throws IllegalArgumentException if an alignment is invalid */ private static void ensureValidOrientations(Alignment horizontalAlignment, Alignment verticalAlignment) { if (!horizontalAlignment.isHorizontal()) { throw new IllegalArgumentException("The horizontal alignment must be one of: left, center, right, fill, default."); } if (!verticalAlignment.isVertical()) { throw new IllegalArgumentException("The vertical alignment must be one of: top, center, bottom, fill, default."); } } // Settings Component Bounds ******************************************** /** * Sets the component's bounds using the given component and cell bounds. * * @param c the component to set bounds * @param layout the FormLayout instance that computes the bounds * @param cellBounds the cell's bounds * @param minWidthMeasure measures the minimum width * @param minHeightMeasure measures the minimum height * @param prefWidthMeasure measures the preferred width * @param prefHeightMeasure measures the preferred height */ void setBounds(Component c, FormLayout layout, Rectangle cellBounds, FormLayout.Measure minWidthMeasure, FormLayout.Measure minHeightMeasure, FormLayout.Measure prefWidthMeasure, FormLayout.Measure prefHeightMeasure) { ColumnSpec colSpec = gridWidth == 1 ? layout.getColumnSpec(gridX) : null; RowSpec rowSpec = gridHeight == 1 ? layout.getRowSpec(gridY) : null; Alignment concreteHAlign = concreteAlignment(this.hAlign, colSpec); Alignment concreteVAlign = concreteAlignment(this.vAlign, rowSpec); Insets concreteInsets = this.insets != null ? this.insets : EMPTY_INSETS; int cellX = cellBounds.x + concreteInsets.left; int cellY = cellBounds.y + concreteInsets.top; int cellW = cellBounds.width - concreteInsets.left - concreteInsets.right; int cellH = cellBounds.height - concreteInsets.top - concreteInsets.bottom; int compW = componentSize(c, colSpec, cellW, minWidthMeasure, prefWidthMeasure); int compH = componentSize(c, rowSpec, cellH, minHeightMeasure, prefHeightMeasure); int x = origin(concreteHAlign, cellX, cellW, compW); int y = origin(concreteVAlign, cellY, cellH, compH); int w = extent(concreteHAlign, cellW, compW); int h = extent(concreteVAlign, cellH, compH); c.setBounds(x, y, w, h); } /** * Computes and returns the concrete alignment. Takes into account * the cell alignment and the {@code FormSpec} if applicable.

* * If this constraints object doesn't belong to a single column or row, * the {@code formSpec} parameter is {@code null}. * In this case the cell alignment is answered, but {@code DEFAULT} * is mapped to {@code FILL}.

* * If the cell belongs to a single column or row, we use the cell * alignment, unless it is {@code DEFAULT}, where the alignment * is inherited from the column or row resp. * * @param cellAlignment this cell's alignment * @param formSpec the associated column or row specification * @return the concrete alignment */ private static Alignment concreteAlignment(Alignment cellAlignment, FormSpec formSpec) { return formSpec == null ? cellAlignment == DEFAULT ? FILL : cellAlignment : usedAlignment(cellAlignment, formSpec); } /** * Returns the alignment used for a given form constraints object. * The cell alignment overrides the column or row default, unless * it is {@code DEFAULT}. In the latter case, we use the * column or row alignment. * * @param cellAlignment this cell constraint's alignment * @param formSpec the associated column or row specification * @return the alignment used */ private static Alignment usedAlignment(Alignment cellAlignment, FormSpec formSpec) { if (cellAlignment != CellConstraints.DEFAULT) { // Cell alignments other than DEFAULT override col/row alignments return cellAlignment; } FormSpec.DefaultAlignment defaultAlignment = formSpec.getDefaultAlignment(); if (defaultAlignment == FormSpec.FILL_ALIGN) { return FILL; } if (defaultAlignment == ColumnSpec.LEFT) { return LEFT; } else if (defaultAlignment == FormSpec.CENTER_ALIGN) { return CENTER; } else if (defaultAlignment == ColumnSpec.RIGHT) { return RIGHT; } else if (defaultAlignment == RowSpec.TOP) { return TOP; } else { return BOTTOM; } } /** * Computes and returns the pixel size of the given component using the * given form specification, measures, and cell size. * * @param component the component to measure * @param formSpec the specification of the component's column/row * @param minMeasure the measure for the minimum size * @param prefMeasure the measure for the preferred size * @param cellSize the cell size * @return the component size as measured or a constant */ private static int componentSize(Component component, FormSpec formSpec, int cellSize, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure) { if (formSpec == null) { return prefMeasure.sizeOf(component); } else if (formSpec.getSize() == Sizes.MINIMUM) { return minMeasure.sizeOf(component); } else if (formSpec.getSize() == Sizes.PREFERRED) { return prefMeasure.sizeOf(component); } else { // default mode return Math.min(cellSize, prefMeasure.sizeOf(component)); } } /** * Computes and returns the component's pixel origin. * * @param alignment the component's alignment * @param cellOrigin the origin of the display area * @param cellSize the extent of the display area * @param componentSize the component's size * @return the component's pixel origin */ private static int origin(Alignment alignment, int cellOrigin, int cellSize, int componentSize) { if (alignment == RIGHT || alignment == BOTTOM) { return cellOrigin + cellSize - componentSize; } else if (alignment == CENTER) { return cellOrigin + (cellSize - componentSize) / 2; } else { // left, top, fill return cellOrigin; } } /** * Returns the component's pixel extent. * * @param alignment the component's alignment * @param cellSize the size of the display area * @param componentSize the component's size * @return the component's pixel extent */ private static int extent(Alignment alignment, int cellSize, int componentSize) { return alignment == FILL ? cellSize : componentSize; } // Misc ***************************************************************** /** * Creates a copy of this cell constraints object. * * @return a copy of this cell constraints object */ @Override public Object clone() { try { CellConstraints c = (CellConstraints) super.clone(); c.insets = (Insets) insets.clone(); return c; } catch (CloneNotSupportedException e) { // This shouldn't happen, since we are Cloneable. throw new InternalError(); } } /** * Constructs and returns a string representation of this constraints object. * * @return string representation of this constraints object */ @Override public String toString() { StringBuffer buffer = new StringBuffer("CellConstraints"); buffer.append("[x="); buffer.append(gridX); buffer.append("; y="); buffer.append(gridY); buffer.append("; w="); buffer.append(gridWidth); buffer.append("; h="); buffer.append(gridHeight); buffer.append("; hAlign="); buffer.append(hAlign); buffer.append("; vAlign="); buffer.append(vAlign); if (!EMPTY_INSETS.equals(insets)) { buffer.append("; insets="); buffer.append(insets); } buffer.append("; honorsVisibility="); buffer.append(honorsVisibility); buffer.append(']'); return buffer.toString(); } /** * Returns a short string representation of this constraints object. * * @return a short string representation of this constraints object */ public String toShortString() { return toShortString(null); } /** * Returns a short string representation of this constraints object. * This method can use the given {@code FormLayout} * to display extra information how default alignments * are mapped to concrete alignments. Therefore it asks the * related column and row as specified by this constraints object. * * @param layout the layout to be presented as a string * @return a short string representation of this constraints object */ public String toShortString(FormLayout layout) { StringBuffer buffer = new StringBuffer("("); buffer.append(formatInt(gridX)); buffer.append(", "); buffer.append(formatInt(gridY)); buffer.append(", "); buffer.append(formatInt(gridWidth)); buffer.append(", "); buffer.append(formatInt(gridHeight)); buffer.append(", \""); buffer.append(hAlign.abbreviation()); if (hAlign == DEFAULT && layout != null) { buffer.append('='); ColumnSpec colSpec = gridWidth == 1 ? layout.getColumnSpec(gridX) : null; buffer.append(concreteAlignment(hAlign, colSpec).abbreviation()); } buffer.append(", "); buffer.append(vAlign.abbreviation()); if (vAlign == DEFAULT && layout != null) { buffer.append('='); RowSpec rowSpec = gridHeight == 1 ? layout.getRowSpec(gridY) : null; buffer.append(concreteAlignment(vAlign, rowSpec).abbreviation()); } buffer.append("\""); if (!EMPTY_INSETS.equals(insets)) { buffer.append(", "); buffer.append(insets); } if (honorsVisibility != null) { buffer.append(honorsVisibility.booleanValue() ? "honors visibility" : "ignores visibility"); } buffer.append(')'); return buffer.toString(); } // Helper Class ********************************************************* /** * An ordinal-based serializable typesafe enumeration for component * alignment types as used by the {@link FormLayout}. */ public static final class Alignment implements Serializable { private static final int HORIZONTAL = 0; private static final int VERTICAL = 1; private static final int BOTH = 2; private final transient String name; private final transient int orientation; private Alignment(String name, int orientation) { this.name = name; this.orientation = orientation; } static Alignment valueOf(String nameOrAbbreviation) { String str = nameOrAbbreviation.toLowerCase(Locale.ENGLISH); if (str.equals("d") || str.equals("default")) { return DEFAULT; } else if (str.equals("f") || str.equals("fill")) { return FILL; } else if (str.equals("c") || str.equals("center")) { return CENTER; } else if (str.equals("l") || str.equals("left")) { return LEFT; } else if (str.equals("r") || str.equals("right")) { return RIGHT; } else if (str.equals("t") || str.equals("top")) { return TOP; } else if (str.equals("b") || str.equals("bottom")) { return BOTTOM; } else { throw new IllegalArgumentException( "Invalid alignment " + nameOrAbbreviation + ". Must be one of: left, center, right, top, bottom, " + "fill, default, l, c, r, t, b, f, d."); } } /** * Returns this Alignment's name. * * @return this alignment's name. */ @Override public String toString() { return name; } /** * Returns the first character of this Alignment's name. * Used to identify it in short format strings. * * @return the name's first character. */ public char abbreviation() { return name.charAt(0); } private boolean isHorizontal() { return orientation != VERTICAL; } private boolean isVertical() { return orientation != HORIZONTAL; } // Serialization ********************************************************* private static int nextOrdinal = 0; private final int ordinal = nextOrdinal++; private Object readResolve() { return VALUES[ordinal]; // Canonicalize } } /** * Returns an integer that has a minimum of two characters. * * @param number the number to format * @return a string representation for a number with a minimum of two chars */ private static String formatInt(int number) { String str = Integer.toString(number); return number < 10 ? " " + str : str; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/PrototypeSize.java0000644000175000017500000001547611731041742026411 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.awt.Container; import java.awt.Font; import java.awt.FontMetrics; import java.io.Serializable; import java.util.List; import com.jgoodies.forms.util.DefaultUnitConverter; /** * A {@link Size} implementation that computes its width and height * by a prototype String.

* * Examples:

 * new PrototypeSize("123-456-789");
 * new FormLayout("p, 2dlu, 'MMMM'");
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.7 $ * * @see Size * @see Sizes * * @since 1.2 */ public final class PrototypeSize implements Size, Serializable { // Fields *************************************************************** private final String prototype; // Instance Creation **************************************************** /** * Constructs a PrototypeSize for the given String. * * @param prototype the String used to compute the width and height. * * @throws NullPointerException if {@code prototype} is {@code null}. * * @since 1.2 */ public PrototypeSize(String prototype) { this.prototype = prototype; } // Accessors ************************************************************ /** * Returns this size's prototype string. * * @return the prototype string */ public String getPrototype() { return prototype; } // Implementing the Size Interface ************************************** /** * Computes and returns the width of this Size's prototype in pixel. * Ignores the component list and measures. Obtains the FontMetrics * from the given layout {@code container} for the default dialog font * provided by {@link DefaultUnitConverter#getDefaultDialogFont()}.

* * Invoked by {@link com.jgoodies.forms.layout.FormSpec} to determine * the size of a column or row. * * @param container the layout container * @param components the list of components used to compute the size * @param minMeasure the measure that determines the minimum sizes * @param prefMeasure the measure that determines the preferred sizes * @param defaultMeasure the measure that determines the default sizes * * @return the {@code stringWidth} for this size's prototype string * computed by the {@code container}'s FontMetrics for the * {@code DefaultUnitConverter}'s default dialog font */ @Override public int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure) { Font font = DefaultUnitConverter.getInstance().getDefaultDialogFont(); FontMetrics fm = container.getFontMetrics(font); return fm.stringWidth(getPrototype()); } /** * Describes if this Size can be compressed, if container space gets scarce. * Used by the FormLayout size computations in {@code #compressedSizes} * to check whether a column or row can be compressed or not.

* * PrototypeSizes are incompressible. * * @return {@code false} */ @Override public boolean compressible() { return false; } /** * Returns a parseable string representation of this prototype size. * * @return a String that can be parsed by the Forms parser */ @Override public String encode() { return "'" + prototype + "'"; } // Overriding Object Behavior ******************************************* /** * Indicates whether some other ConstantSize is "equal to" this one. * * @param o the Object with which to compare * @return {@code true} if this object is the same as the obj * argument; {@code false} otherwise. * * @see java.lang.Object#hashCode() * @see java.util.Hashtable */ @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof PrototypeSize)) { return false; } PrototypeSize size = (PrototypeSize) o; return prototype.equals(size.prototype); } /** * Returns a hash code value for the object. This method is supported * for the benefit of hashtables such as those provided by * {@code java.util.Hashtable}. * * @return a hash code value for this object. * * @see java.lang.Object#equals(java.lang.Object) * @see java.util.Hashtable */ @Override public int hashCode() { return prototype.hashCode(); } /** * Returns a string representation of this size object. * * Note: This string representation may change * at any time. It is intended for debugging purposes. For parsing, * use {@link #encode()} instead. * * @return a string representation of the constant size */ @Override public String toString() { return encode(); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/BoundedSize.java0000644000175000017500000002241711731041742025755 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.awt.Container; import java.io.Serializable; import java.util.List; /** * Describes sizes that provide lower and upper bounds * as used by the JGoodies FormLayout. * * @author Karsten Lentzsch * @version $Revision: 1.21 $ * * @see Sizes * @see ConstantSize */ public final class BoundedSize implements Size, Serializable { /** * Holds the base size. */ private final Size basis; /** * Holds an optional lower bound. */ private final Size lowerBound; /** * Holds an optional upper bound. */ private final Size upperBound; // Instance Creation **************************************************** /** * Constructs a BoundedSize for the given basis using the * specified lower and upper bounds. * * @param basis the base size * @param lowerBound the lower bound size * @param upperBound the upper bound size * * @throws NullPointerException if {@code basis}, {@code lowerBound}, * or {@code upperBound} is {@code null} * * @since 1.1 */ public BoundedSize(Size basis, Size lowerBound, Size upperBound) { this.basis = checkNotNull(basis, "The basis must not be null."); this.lowerBound = lowerBound; this.upperBound = upperBound; if (lowerBound == null && upperBound == null) { throw new IllegalArgumentException( "A bounded size must have a non-null lower or upper bound."); } } // Accessors ************************************************************ /** * Returns the base size, which is not-{@code null}. * * @return the base size * * @since 1.1 */ public Size getBasis() { return basis; } /** * Returns the optional lower bound. * * @return the optional lower bound * * @since 1.1 */ public Size getLowerBound() { return lowerBound; } /** * Returns the optional upper bound. * * @return the optional upper bound * * @since 1.1 */ public Size getUpperBound() { return upperBound; } // Implementation of the Size Interface ********************************* /** * Returns this size as pixel size. Neither requires the component * list nor the specified measures. Honors the lower and upper bound.

* * Invoked by {@code FormSpec} to determine the size of a column or * row. * * @param container the layout container * @param components the list of components to measure * @param minMeasure the measure used to determine the minimum size * @param prefMeasure the measure used to determine the preferred size * @param defaultMeasure the measure used to determine the default size * @return the maximum size in pixels * @see FormSpec#maximumSize(Container, List, FormLayout.Measure, FormLayout.Measure, FormLayout.Measure) */ @Override public int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure) { int size = basis.maximumSize(container, components, minMeasure, prefMeasure, defaultMeasure); if (lowerBound != null) { size = Math.max(size, lowerBound.maximumSize( container, components, minMeasure, prefMeasure, defaultMeasure)); } if (upperBound != null) { size = Math.min(size, upperBound.maximumSize( container, components, minMeasure, prefMeasure, defaultMeasure)); } return size; } /** * Describes if this Size can be compressed, if container space gets scarce. * Used by the FormLayout size computations in {@code #compressedSizes} * to check whether a column or row can be compressed or not.

* * BoundedSizes are compressible if the base Size is compressible. * * @return {@code true} if and only if the basis is compressible * * @since 1.1 */ @Override public boolean compressible() { return getBasis().compressible(); } // Overriding Object Behavior ******************************************* /** * Indicates whether some other BoundedSize is "equal to" this one. * * @param object the object with which to compare * @return {@code true} if this object is the same as the object * argument, {@code false} otherwise. * @see Object#hashCode() * @see java.util.Hashtable */ @Override public boolean equals(Object object) { if (this == object) { return true; } if (!(object instanceof BoundedSize)) { return false; } BoundedSize size = (BoundedSize) object; return basis.equals(size.basis) && ( lowerBound == null && size.lowerBound == null || lowerBound != null && lowerBound.equals(size.lowerBound)) && ( upperBound == null && size.upperBound == null || upperBound != null && upperBound.equals(size.upperBound)); } /** * Returns a hash code value for the object. This method is * supported for the benefit of hashtables such as those provided by * {@code java.util.Hashtable}. * * @return a hash code value for this object. * @see Object#equals(Object) * @see java.util.Hashtable */ @Override public int hashCode() { int hashValue = basis.hashCode(); if (lowerBound != null) { hashValue = hashValue * 37 + lowerBound.hashCode(); } if (upperBound != null) { hashValue = hashValue * 37 + upperBound.hashCode(); } return hashValue; } /** * Returns a string representation of this size object.

* * Note: This string representation may change * at any time. It is intended for debugging purposes. For parsing, * use {@link #encode()} instead. * * @return a string representation of this bounded size */ @Override public String toString() { return encode(); } /** * Returns a parseable string representation of this bounded size. * * @return a String that can be parsed by the Forms parser * * @since 1.2 */ @Override public String encode() { StringBuffer buffer = new StringBuffer("["); if (lowerBound != null) { buffer.append(lowerBound.encode()); buffer.append(','); } buffer.append(basis.encode()); if (upperBound != null) { buffer.append(','); buffer.append(upperBound.encode()); } buffer.append(']'); return buffer.toString(); } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/LayoutMap.java0000644000175000017500000006074211751102622025455 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import com.jgoodies.forms.util.LayoutStyle; /** * Provides a hierarchical variable expansion useful to improve layout * consistency, style guide compliance, and layout readability.

* * A LayoutMap maps variable names to layout expression Strings. The FormLayout, * ColumnSpec, and RowSpec parsers expand variables before an encoded layout * specification is parsed and converted into ColumnSpec and RowSpec values. * Variables start with the '$' character. The variable name can be wrapped * by braces ('{' and '}'). For example, you can write: * new FormLayout("pref, $lcg, pref") or * new FormLayout("pref, ${lcg}, pref").

* * LayoutMaps build a chain; each LayoutMap has an optional parent map. * The root is defined by {@link LayoutMap#getRoot()}. Application-wide * variables should be defined in the root LayoutMap. If you want to override * application-wide variables locally, obtain a LayoutMap using {@code * new LayoutMap()}, configure it, and provide it as argument to the * FormLayout, ColumnSpec, and RowSpec constructors/factory methods.

* * By default the root LayoutMap provides the following associations: * * * * * * * * * *
Variable NameAbbreviationsOrientationDescription
label-component-gaplcg, lcgapbothgap between a label and the labeled component
related-gaprg, rgapbothgap between two related components
unrelated-gapug, ugapbothgap between two unrelated components
buttonbhorizontalbutton column with minimum width
line-gaplg, lgapverticalgap between two lines
narrow-line-gapnlg, nlgapverticalnarrow gap between two lines
paragraphpg, pgapverticalgap between two paragraphs/sections

* * Examples: *

 * // Predefined variables
 * new FormLayout(
 *     "pref, $lcgap, pref, $rgap, pref",
 *     "p, $lgap, p, $lgap, p");
 *
 * // Custom variables
 * LayoutMap.getRoot().columnPut("half", "39dlu");
 * LayoutMap.getRoot().columnPut("full", "80dlu");
 * LayoutMap.getRoot().rowPut("table", "fill:0:grow");
 * LayoutMap.getRoot().rowPut("table50", "fill:50dlu:grow");
 * new FormLayout(
 *     "pref, $lcgap, $half, 2dlu, $half",
 *     "p, $lcgap, $table50");
 * new FormLayout(
 *     "pref, $lcgap, $full",
 *     "p, $lcgap, $table50");
 *
 * // Nested variables
 * LayoutMap.getRoot().columnPut("c-gap-c", "$half, 2dlu, $half");
 * new FormLayout(
 *     "pref, $lcgap, ${c-gap-c}", // -> "pref, $lcgap, $half, 2dlu, $half",
 *     "p, $lcgap, $table");
 * 
* * LayoutMap holds two internal Maps that associate key Strings with expression * Strings for the columns and rows respectively. Null values are not allowed.

* * Tips:

    *
  • You should carefully override predefined variables, * because variable users may expect that these don't change. *
  • Set custom variables in the root LayoutMap. *
  • Avoid aliases for custom variables. *
* * @author Karsten Lentzsch * @version $Revision: 1.24 $ * * @see FormLayout * @see ColumnSpec * @see RowSpec * * @since 1.2 */ public final class LayoutMap { /** * Marks a layout variable; used by the Forms parsers. */ private static final char VARIABLE_PREFIX_CHAR = '$'; /** * Maps column aliases to their default name, for example * {@code "rgap"} -> {@code "related-gap"}. */ private static final Map COLUMN_ALIASES = new HashMap(); /** * Maps row aliases to their default name, for example * {@code "rgap"} -> {@code "related-gap"}. */ private static final Map ROW_ALIASES = new HashMap(); /** * Holds the lazily initialized root map. */ private static LayoutMap root = null; // Instance Fields ******************************************************** /** * Refers to the parent map that is used to look up values * if this map contains no association for a given key. * The parent maps can build chains. */ private final LayoutMap parent; /** * Holds the raw associations from variable names to expressions. * The expression may contain variables that are not expanded. */ private final Map columnMap; /** * Holds the cached associations from variable names to expressions. * The expression are fully expanded and contain no variables. */ private final Map columnMapCache; /** * Holds the raw associations from variable names to expressions. * The expression may contain variables that are not expanded. */ private final Map rowMap; /** * Holds the cached associations from variable names to expressions. * The expression are fully expanded and contain no variables. */ private final Map rowMapCache; // Instance Creation ****************************************************** /** * Constructs a LayoutMap that has the root LayoutMap as parent. */ public LayoutMap() { this(getRoot()); } /** * Constructs a LayoutMap with the given optional parent. * * @param parent the parent LayoutMap, may be {@code null} */ public LayoutMap(LayoutMap parent) { this.parent = parent; columnMap = new HashMap(); rowMap = new HashMap(); columnMapCache = new HashMap(); rowMapCache = new HashMap(); } // Default **************************************************************** /** * Lazily initializes and returns the LayoutMap that is used * for variable expansion, if no custom LayoutMap is provided. * * @return the LayoutMap that is used, if no custom LayoutMap is provided */ public synchronized static LayoutMap getRoot() { if (root == null) { root = createRoot(); } return root; } // Column Mapping ********************************************************* /** * Returns {@code true} if this map or a parent map - if any - contains * a mapping for the specified key. * * @param key key whose presence in this LayoutMap chain is to be tested. * @return {@code true} if this map contains a column mapping * for the specified key. * * @throws NullPointerException if the key is {@code null}. * * @see Map#containsKey(Object) */ public boolean columnContainsKey(String key) { String resolvedKey = resolveColumnKey(key); return columnMap.containsKey(resolvedKey) || parent != null && parent.columnContainsKey(resolvedKey); } /** * Looks up and returns the String associated with the given key. * First looks for an association in this LayoutMap. If there's no * association, the lookup continues with the parent map - if any. * * @param key key whose associated value is to be returned. * @return the column String associated with the {@code key}, * or {@code null} if no LayoutMap in the parent chain * contains an association. * * @throws NullPointerException if {@code key} is {@code null} * * @see Map#get(Object) */ public String columnGet(String key) { String resolvedKey = resolveColumnKey(key); String cachedValue = columnMapCache.get(resolvedKey); if (cachedValue != null) { return cachedValue; } String value = columnMap.get(resolvedKey); if (value == null && parent != null) { value = parent.columnGet(resolvedKey); } if (value == null) { return null; } String expandedString = expand(value, true); columnMapCache.put(resolvedKey, expandedString); return expandedString; } /** * Associates the specified column String with the specified key * in this map. * If the map previously contained a mapping for this key, the old value * is replaced by the specified value. The value set in this map * overrides an association - if any - in the chain of parent LayoutMaps.

* * The {@code value} must not be {@code null}. To remove * an association from this map use {@link #columnRemove(String)}. * * @param key key with which the specified value is to be associated. * @param value column expression value to be associated with the specified key. * @return previous String associated with specified key, * or {@code null} if there was no mapping for key. * * @throws NullPointerException if the {@code key} or {@code value} * is {@code null}. * * @see Map#put(Object, Object) */ public String columnPut(String key, String value) { checkNotNull(value, "The column expression value must not be null."); String resolvedKey = resolveColumnKey(key); columnMapCache.clear(); return columnMap.put( resolvedKey, value.toLowerCase(Locale.ENGLISH)); } public String columnPut(String key, ColumnSpec value) { return columnPut(key, value.encode()); } public String columnPut(String key, Size value) { return columnPut(key, value.encode()); } /** * Removes the column value mapping for this key from this map if it is * present.

* * Returns the value to which the map previously associated the key, * or {@code null} if the map contained no mapping for this key. * The map will not contain a String mapping for the specified key * once the call returns. * * @param key key whose mapping is to be removed from the map. * @return previous value associated with specified key, or {@code null} * if there was no mapping for key. * * @throws NullPointerException if {@code key} is {@code null}. * * @see Map#remove(Object) */ public String columnRemove(String key) { String resolvedKey = resolveColumnKey(key); columnMapCache.clear(); return columnMap.remove(resolvedKey); } // Row Mapping ************************************************************ /** * Returns {@code true} if this map or a parent map - if any - contains * a RowSpec mapping for the specified key. * * @param key key whose presence in this LayoutMap chain is to be tested. * @return {@code true} if this map contains a row mapping * for the specified key. * * @throws NullPointerException if the key is {@code null}. * * @see Map#containsKey(Object) */ public boolean rowContainsKey(String key) { String resolvedKey = resolveRowKey(key); return rowMap.containsKey(resolvedKey) || parent != null && parent.rowContainsKey(resolvedKey); } /** * Looks up and returns the RowSpec associated with the given key. * First looks for an association in this LayoutMap. If there's no * association, the lookup continues with the parent map - if any. * * @param key key whose associated value is to be returned. * @return the row specification associated with the {@code key}, * or {@code null} if no LayoutMap in the parent chain * contains an association. * * @throws NullPointerException if {@code key} is {@code null} * * @see Map#get(Object) */ public String rowGet(String key) { String resolvedKey = resolveRowKey(key); String cachedValue = rowMapCache.get(resolvedKey); if (cachedValue != null) { return cachedValue; } String value = rowMap.get(resolvedKey); if (value == null && parent != null) { value = parent.rowGet(resolvedKey); } if (value == null) { return null; } String expandedString = expand(value, false); rowMapCache.put(resolvedKey, expandedString); return expandedString; } public String rowPut(String key, String value) { checkNotNull(value, "The row expression value must not be null."); String resolvedKey = resolveRowKey(key); rowMapCache.clear(); return rowMap.put( resolvedKey, value.toLowerCase(Locale.ENGLISH)); } /** * Associates the specified ColumnSpec with the specified key in this map. * If the map previously contained a mapping for this key, the old value * is replaced by the specified value. The RowSpec set in this map * override an association - if any - in the chain of parent LayoutMaps.

* * The RowSpec must not be {@code null}. To remove an association * from this map use {@link #rowRemove(String)}. * * @param key key with which the specified value is to be associated. * @param value ColumnSpec to be associated with the specified key. * @return previous ColumnSpec associated with specified key, * or {@code null} if there was no mapping for key. * * @throws NullPointerException if the {@code key} or {@code value} * is {@code null}. * * @see Map#put(Object, Object) */ public String rowPut(String key, RowSpec value) { return rowPut(key, value.encode()); } public String rowPut(String key, Size value) { return rowPut(key, value.encode()); } /** * Removes the row value mapping for this key from this map if it is * present.

* * Returns the value to which the map previously associated the key, * or {@code null} if the map contained no mapping for this key. * The map will not contain a String mapping for the specified key * once the call returns. * * @param key key whose mapping is to be removed from the map. * @return previous value associated with specified key, or {@code null} * if there was no mapping for key. * * @throws NullPointerException if {@code key} is {@code null}. * * @see Map#remove(Object) */ public String rowRemove(String key) { String resolvedKey = resolveRowKey(key); rowMapCache.clear(); return rowMap.remove(resolvedKey); } // Overriding Object Behavior ********************************************* /** * Returns a string representation of this LayoutMap that lists * the column and row associations. * * @return a string representation */ @Override public String toString() { StringBuffer buffer = new StringBuffer(super.toString()); buffer.append("\n Column associations:"); for (Entry entry : columnMap.entrySet()) { buffer.append("\n "); buffer.append(entry.getKey()); buffer.append("->"); buffer.append(entry.getValue()); } buffer.append("\n Row associations:"); for (Entry entry : rowMap.entrySet()) { buffer.append("\n "); buffer.append(entry.getKey()); buffer.append("->"); buffer.append(entry.getValue()); } return buffer.toString(); } // String Expansion ******************************************************* String expand(String expression, boolean horizontal) { int cursor = 0; int start = expression.indexOf(LayoutMap.VARIABLE_PREFIX_CHAR, cursor); if (start == -1) { // No variables return expression; } StringBuffer buffer = new StringBuffer(); do { buffer.append(expression.substring(cursor, start)); String variableName = nextVariableName(expression, start); buffer.append(expansion(variableName, horizontal)); cursor = start + variableName.length() + 1; start = expression.indexOf(LayoutMap.VARIABLE_PREFIX_CHAR, cursor); } while (start != -1); buffer.append(expression.substring(cursor)); return buffer.toString(); } private static String nextVariableName(String expression, int start) { int length = expression.length(); if (length <= start) { FormSpecParser.fail(expression, start, "Missing variable name after variable char '$'."); } if (expression.charAt(start + 1) == '{') { int end = expression.indexOf('}', start + 1); if (end == -1) { FormSpecParser.fail(expression, start, "Missing closing brace '}' for variable."); } return expression.substring(start + 1, end + 1); } int end = start + 1; while (end < length && Character.isUnicodeIdentifierPart(expression.charAt(end))) { end++; } return expression.substring(start+1, end); } private String expansion(String variableName, boolean horizontal) { String key = stripBraces(variableName); String expansion = horizontal ? columnGet(key) : rowGet(key); if (expansion == null) { String orientation = horizontal ? "column" : "row"; throw new IllegalArgumentException("Unknown " + orientation + " layout variable \"" + key + "\""); } return expansion; } private static String stripBraces(String variableName) { return variableName.charAt(0) == '{' ? variableName.substring(1, variableName.length() - 1) : variableName; } // Helper Code ************************************************************ private static String resolveColumnKey(String key) { checkNotNull(key, "The column key must not be null."); String lowercaseKey = key.toLowerCase(Locale.ENGLISH); String defaultKey = COLUMN_ALIASES.get(lowercaseKey); return defaultKey == null ? lowercaseKey : defaultKey; } private static String resolveRowKey(String key) { checkNotNull(key, "The row key must not be null."); String lowercaseKey = key.toLowerCase(Locale.ENGLISH); String defaultKey = ROW_ALIASES.get(lowercaseKey); return defaultKey == null ? lowercaseKey : defaultKey; } private static LayoutMap createRoot() { LayoutMap map = new LayoutMap(null); // Column variables map.columnPut( "label-component-gap", new String[]{"lcg", "lcgap"}, FormSpecs.LABEL_COMPONENT_GAP_COLSPEC); map.columnPut( "related-gap", new String[]{"rg", "rgap"}, FormSpecs.RELATED_GAP_COLSPEC); map.columnPut( "unrelated-gap", new String[]{"ug", "ugap"}, FormSpecs.UNRELATED_GAP_COLSPEC); map.columnPut( "button", new String[]{"b"}, FormSpecs.BUTTON_COLSPEC); map.columnPut( "growing-button", new String[]{"gb"}, FormSpecs.GROWING_BUTTON_COLSPEC); map.columnPut( "dialog-margin", new String[]{"dm", "dmargin"}, ColumnSpec.createGap(LayoutStyle.getCurrent().getDialogMarginX())); map.columnPut( "tabbed-dialog-margin", new String[]{"tdm", "tdmargin"}, ColumnSpec.createGap(LayoutStyle.getCurrent().getTabbedDialogMarginX())); map.columnPut( "glue", FormSpecs.GLUE_COLSPEC.toShortString()); // Row variables map.rowPut( "label-component-gap", new String[]{"lcg", "lcgap"}, FormSpecs.LABEL_COMPONENT_GAP_ROWSPEC); map.rowPut( "related-gap", new String[]{"rg", "rgap"}, FormSpecs.RELATED_GAP_ROWSPEC); map.rowPut( "unrelated-gap", new String[]{"ug", "ugap"}, FormSpecs.UNRELATED_GAP_ROWSPEC); map.rowPut( "narrow-line-gap", new String[]{"nlg", "nlgap"}, FormSpecs.NARROW_LINE_GAP_ROWSPEC); map.rowPut( "line-gap", new String[]{"lg", "lgap"}, FormSpecs.LINE_GAP_ROWSPEC); map.rowPut( "paragraph-gap", new String[]{"pg", "pgap"}, FormSpecs.PARAGRAPH_GAP_ROWSPEC); map.rowPut( "dialog-margin", new String[]{"dm", "dmargin"}, RowSpec.createGap(LayoutStyle.getCurrent().getDialogMarginY())); map.rowPut( "tabbed-dialog-margin", new String[]{"tdm", "tdmargin"}, RowSpec.createGap(LayoutStyle.getCurrent().getTabbedDialogMarginY())); map.rowPut( "button", new String[]{"b"}, FormSpecs.BUTTON_ROWSPEC); map.rowPut( "glue", FormSpecs.GLUE_ROWSPEC); return map; } private void columnPut(String key, String[] aliases, ColumnSpec value) { ensureLowerCase(key); columnPut(key, value); for (String aliase : aliases) { ensureLowerCase(aliase); COLUMN_ALIASES.put(aliase, key); } } private void rowPut(String key, String[] aliases, RowSpec value) { ensureLowerCase(key); rowPut(key, value); for (String aliase : aliases) { ensureLowerCase(aliase); ROW_ALIASES.put(aliase, key); } } private static void ensureLowerCase(String str) { String lowerCase = str.toLowerCase(Locale.ENGLISH); if (!lowerCase.equals(str)) { throw new IllegalArgumentException( "The string \"" + str + "\" should be lower case."); } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/FormSpecParser.java0000644000175000017500000002670611731041742026442 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Parses encoded column and row specifications. * Returns ColumnSpec or RowSpec arrays if successful, * and aims to provide useful information in case of a syntax error. * * @author Karsten Lentzsch * @version $Revision: 1.12 $ * * @see ColumnSpec * @see RowSpec */ public final class FormSpecParser { // Parser Patterns ****************************************************** private static final Pattern MULTIPLIER_PREFIX_PATTERN = Pattern.compile("\\d+\\s*\\*\\s*\\("); private static final Pattern DIGIT_PATTERN = Pattern.compile("\\d+"); // Instance Fields ******************************************************** private final String source; private final LayoutMap layoutMap; // Instance Creation ****************************************************** /** * Constructs a parser for the given encoded column/row specification, * the given LayoutMap, and orientation. * * @param source the raw encoded column or row specification * as provided by the user * @param description describes the source, e.g. "column specification" * @param layoutMap maps layout variable names to ColumnSpec and * RowSpec objects * @param horizontal {@code true} for columns, {@code false} for rows * * @throws NullPointerException if {@code source} or {@code layoutMap} is {@code null} */ private FormSpecParser( String source, String description, LayoutMap layoutMap, boolean horizontal) { checkNotNull(source, "The %S must not be null.", description); checkNotNull(layoutMap, "The LayoutMap must not be null."); this.layoutMap = layoutMap; this.source = this.layoutMap.expand(source, horizontal); } // Parser API ************************************************************* static ColumnSpec[] parseColumnSpecs( String encodedColumnSpecs, LayoutMap layoutMap) { FormSpecParser parser = new FormSpecParser( encodedColumnSpecs, "encoded column specifications", layoutMap, true); return parser.parseColumnSpecs(); } static RowSpec[] parseRowSpecs( String encodedRowSpecs, LayoutMap layoutMap) { FormSpecParser parser = new FormSpecParser( encodedRowSpecs, "encoded row specifications", layoutMap, false); return parser.parseRowSpecs(); } // Parser Implementation ************************************************** private ColumnSpec[] parseColumnSpecs() { List encodedColumnSpecs = split(source, 0); int columnCount = encodedColumnSpecs.size(); ColumnSpec[] columnSpecs = new ColumnSpec[columnCount]; for (int i = 0; i < columnCount; i++) { String encodedSpec = (String) encodedColumnSpecs.get(i); columnSpecs[i] = ColumnSpec.decodeExpanded(encodedSpec); } return columnSpecs; } private RowSpec[] parseRowSpecs() { List encodedRowSpecs = split(source, 0); int rowCount = encodedRowSpecs.size(); RowSpec[] rowSpecs = new RowSpec[rowCount]; for (int i = 0; i < rowCount; i++) { String encodedSpec = (String) encodedRowSpecs.get(i); rowSpecs[i] = RowSpec.decodeExpanded(encodedSpec); } return rowSpecs; } // Parser Implementation ************************************************** private List split(String expression, int offset) { List encodedSpecs = new ArrayList(); int parenthesisLevel = 0; // number of open '(' int bracketLevel = 0; // number of open '[' int quoteLevel = 0; // number of open '\'' int length = expression.length(); int specStart = 0; char c; boolean lead = true; for (int i = 0; i < length; i++) { c = expression.charAt(i); if (lead && Character.isWhitespace(c)) { specStart++; continue; } lead = false; if (c == ',' && parenthesisLevel == 0 && bracketLevel == 0 && quoteLevel == 0) { String token = expression.substring(specStart, i); addSpec(encodedSpecs, token, offset + specStart); specStart = i + 1; lead = true; } else if (c == '(') { if (bracketLevel > 0) { fail(offset + i, "illegal '(' in [...]"); } parenthesisLevel++; } else if (c == ')') { if (bracketLevel > 0) { fail(offset + i, "illegal ')' in [...]"); } parenthesisLevel--; if (parenthesisLevel < 0) { fail(offset + i, "missing '('"); } } else if (c == '[') { if (bracketLevel > 0) { fail(offset + i, "too many '['"); } bracketLevel++; } else if (c == ']') { bracketLevel--; if (bracketLevel < 0) { fail(offset + i, "missing '['"); } } else if (c == '\'') { if (quoteLevel == 0) { quoteLevel++; } else if (quoteLevel == 1) { quoteLevel--; } } } if (parenthesisLevel > 0) { fail(offset + length, "missing ')'"); } if (bracketLevel > 0) { fail(offset + length, "missing ']"); } if (specStart < length) { String token = expression.substring(specStart); addSpec(encodedSpecs, token, offset + specStart); } return encodedSpecs; } private void addSpec(List encodedSpecs, String expression, int offset) { String trimmedExpression = expression.trim(); Multiplier multiplier = multiplier(trimmedExpression, offset); if (multiplier == null) { encodedSpecs.add(trimmedExpression); return; } List subTokenList = split(multiplier.expression, offset + multiplier.offset); for (int i=0; i < multiplier.multiplier; i++) { encodedSpecs.addAll(subTokenList); } } private Multiplier multiplier(String expression, int offset) { Matcher matcher = MULTIPLIER_PREFIX_PATTERN.matcher(expression); if (!matcher.find()) { return null; } if (matcher.start() > 0) { fail(offset + matcher.start(), "illegal multiplier position"); } Matcher digitMatcher = DIGIT_PATTERN.matcher(expression); if (!digitMatcher.find()) { return null; } String digitStr = expression.substring(0, digitMatcher.end()); int number = 0; try { number = Integer.parseInt(digitStr); } catch (NumberFormatException e) { fail(offset, e); } if (number <= 0) { fail(offset, "illegal 0 multiplier"); } String subexpression = expression.substring(matcher.end(),expression.length()-1); return new Multiplier(number, subexpression, matcher.end()); } // Exceptions ************************************************************* public static void fail(String source, int index, String description) { throw new FormLayoutParseException(message(source, index, description)); } private void fail(int index, String description) { throw new FormLayoutParseException( message(source, index, description)); } private void fail(int index, NumberFormatException cause) { throw new FormLayoutParseException( message(source, index, "Invalid multiplier"), cause); } private static String message(String source, int index, String description) { StringBuffer buffer = new StringBuffer('\n'); buffer.append('\n'); buffer.append(source); buffer.append('\n'); for (int i = 0; i < index; i++) { buffer.append(' '); } buffer.append('^'); buffer.append(description); String message = buffer.toString(); throw new FormLayoutParseException(message); } /** * Used by the parser for encoded column and row specifications. */ public static final class FormLayoutParseException extends RuntimeException { FormLayoutParseException(String message) { super(message); } FormLayoutParseException(String message, Throwable cause) { super(message, cause); } } // Helper Class *********************************************************** /** * Internal helper class that is returned by * {@link FormSpecParser#multiplier(String, int)}. */ static final class Multiplier { final int multiplier; final String expression; final int offset; Multiplier(int multiplier, String expression, int offset) { this.multiplier = multiplier; this.expression = expression; this.offset = offset; } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/FormLayout.java0000644000175000017500000024566411751011176025656 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkNotNull; import static com.jgoodies.common.base.Preconditions.checkState; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Insets; import java.awt.LayoutManager2; import java.awt.Rectangle; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.JComponent; import com.jgoodies.common.base.Objects; /** * FormLayout is a powerful, flexible and precise general purpose * layout manager. It aligns components vertically and horizontally in * a dynamic rectangular grid of cells, with each component occupying one or * more cells. * A whitepaper * about the FormLayout ships with the product documentation and is available * online.

* * To use FormLayout you first define the grid by specifying the * columns and rows. In a second step you add components to the grid. You can * specify columns and rows via human-readable String descriptions or via * arrays of {@link ColumnSpec} and {@link RowSpec} instances.

* * Each component managed by a FormLayout is associated with an instance of * {@link CellConstraints}. The constraints object specifies where a component * should be located on the form's grid and how the component should be * positioned. In addition to its constraints object the * {@code FormLayout} also considers each component's minimum and * preferred sizes in order to determine a component's size.

* * FormLayout has been designed to work with non-visual builders that help you * specify the layout and fill the grid. For example, the * {@link com.jgoodies.forms.builder.ButtonBarBuilder} assists you in building button * bars; it creates a standardized FormLayout and provides a minimal API that * specializes in adding buttons and Actions. Other builders can create * frequently used panel design, for example a form that consists of rows of * label-component pairs.

* * FormLayout has been prepared to work with different types of sizes as * defined by the {@link Size} interface.

* * Example 1 (Plain FormLayout):
* The following example creates a panel with 3 data columns and 3 data rows; * the columns and rows are specified before components are added * to the form. *

 * FormLayout layout = new FormLayout(
 *      "right:pref, 6dlu, 50dlu, 4dlu, default",  // columns
 *      "pref, 3dlu, pref, 3dlu, pref");           // rows
 *
 * JPanel panel = new JPanel(layout);
 * panel.add(new JLabel("Label1"),   CC.xy  (1, 1));
 * panel.add(new JTextField(),       CC.xywh(3, 1, 3, 1));
 * panel.add(new JLabel("Label2"),   CC.xy  (1, 3));
 * panel.add(new JTextField(),       CC.xy  (3, 3));
 * panel.add(new JLabel("Label3"),   CC.xy  (1, 5));
 * panel.add(new JTextField(),       CC.xy  (3, 5));
 * panel.add(new JButton("/u2026"),  CC.xy  (5, 5));
 * return panel;
 * 

* * Example 2 (Using PanelBuilder):
* This example creates the same panel as above using the * {@link com.jgoodies.forms.builder.PanelBuilder} to add components to the form. *

 * FormLayout layout = new FormLayout(
 *      "right:pref, 6dlu, 50dlu, 4dlu, default",  // columns
 *      "pref, 3dlu, pref, 3dlu, pref");           // rows
 *
 * PanelBuilder builder = new PanelBuilder(layout);
 * builder.addLabel("Label1",         CC.xy  (1, 1));
 * builder.add(new JTextField(),      CC.xywh(3, 1, 3, 1));
 * builder.addLabel("Label2",         CC.xy  (1, 3));
 * builder.add(new JTextField(),      CC.xy  (3, 3));
 * builder.addLabel("Label3",         CC.xy  (1, 5));
 * builder.add(new JTextField(),      CC.xy  (3, 5));
 * builder.add(new JButton("/u2026"), CC.xy  (5, 5));
 * return builder.getPanel();
 * 

* * Example 3 (Using DefaultFormBuilder):
* This example utilizes the * {@link com.jgoodies.forms.builder.DefaultFormBuilder} that * ships with the source distribution. *

 * FormLayout layout = new FormLayout(
 *      "right:pref, 6dlu, 50dlu, 4dlu, default"); // 5 columns; add rows later
 *
 * DefaultFormBuilder builder = new DefaultFormBuilder(layout);
 * builder.append("Label1", new JTextField(), 3);
 * builder.append("Label2", new JTextField());
 * builder.append("Label3", new JTextField());
 * builder.append(new JButton("/u2026"));
 * return builder.getPanel();
 * 
* * @author Karsten Lentzsch * @version $Revision: 1.30 $ * * @see ColumnSpec * @see RowSpec * @see CellConstraints * @see com.jgoodies.forms.builder.AbstractFormBuilder * @see com.jgoodies.forms.builder.ButtonBarBuilder * @see com.jgoodies.forms.builder.DefaultFormBuilder * @see com.jgoodies.forms.layout.FormSpecs * @see Size * @see Sizes */ public final class FormLayout implements LayoutManager2, Serializable { // Instance Fields ******************************************************** /** * Holds the column specifications. * * @see ColumnSpec * @see #getColumnCount() * @see #getColumnSpec(int) * @see #appendColumn(ColumnSpec) * @see #insertColumn(int, ColumnSpec) * @see #removeColumn(int) */ private final List colSpecs; /** * Holds the row specifications. * * @see RowSpec * @see #getRowCount() * @see #getRowSpec(int) * @see #appendRow(RowSpec) * @see #insertRow(int, RowSpec) * @see #removeRow(int) */ private final List rowSpecs; /** * Holds the column groups as an array of arrays of column indices. * * @see #getColumnGroups() * @see #setColumnGroups(int[][]) * @see #addGroupedColumn(int) */ private int[][] colGroupIndices; /** * Holds the row groups as an array of arrays of row indices. * * @see #getRowGroups() * @see #setRowGroups(int[][]) * @see #addGroupedRow(int) */ private int[][] rowGroupIndices; /** * Maps components to their associated {@code CellConstraints}. * * @see CellConstraints * @see #getConstraints(Component) * @see #setConstraints(Component, CellConstraints) */ private final Map constraintMap; private boolean honorsVisibility = true; // Fields used by the Layout Algorithm ************************************ /** * Holds the components that occupy exactly one column. * For each column we keep a list of these components. */ private transient List[] colComponents; /** * Holds the components that occupy exactly one row. * For each row we keep a list of these components. */ private transient List[] rowComponents; /** * Caches component minimum and preferred sizes. * All requests for component sizes shall be directed to the cache. */ private final ComponentSizeCache componentSizeCache; /** * These functional objects are used to measure component sizes. * They abstract from horizontal and vertical orientation and so, * allow to implement the layout algorithm for both orientations with a * single set of methods. */ private final Measure minimumWidthMeasure; private final Measure minimumHeightMeasure; private final Measure preferredWidthMeasure; private final Measure preferredHeightMeasure; // Instance Creation **************************************************** /** * Constructs an empty FormLayout. Columns and rows must be added * before components can be added to the layout container.

* * This constructor is intended to be used in environments * that add columns and rows dynamically. */ public FormLayout() { this(new ColumnSpec[0], new RowSpec[0]); } /** * Constructs a FormLayout using the given encoded column specifications. * The constructed layout has no rows; these must be added * before components can be added to the layout container. * The string decoding uses the default LayoutMap.

* * This constructor is intended to be used with builder classes that * add rows dynamically, such as the {@code DefaultFormBuilder}.

* * Examples:

     * // Label, gap, component
     * FormLayout layout = new FormLayout(
     *      "pref, 4dlu, pref");
     *
     * // Right-aligned label, gap, component, gap, component
     * FormLayout layout = new FormLayout(
     *      "right:pref, 4dlu, 50dlu, 4dlu, 50dlu");
     *
     * // Left-aligned labels, gap, components, gap, components
     * FormLayout layout = new FormLayout(
     *      "left:pref, 4dlu, pref, 4dlu, pref");
     * 
See the class comment for more examples. * * @param encodedColumnSpecs comma separated encoded column specifications * * @throws NullPointerException if encodedColumnSpecs is {@code null} * * @see LayoutMap#getRoot() */ public FormLayout(String encodedColumnSpecs) { this(encodedColumnSpecs, LayoutMap.getRoot()); } /** * Constructs a FormLayout using the given encoded column specifications * and LayoutMap. The constructed layout has no rows; these must be added * before components can be added to the layout container.

* * This constructor is intended to be used with builder classes that * add rows dynamically, such as the {@code DefaultFormBuilder}.

* * Examples:

     * // Label, gap, component
     * FormLayout layout = new FormLayout(
     *      "pref, 4dlu, pref",
     *      myLayoutMap);
     *
     * // Right-aligned label, gap, component, gap, component
     * FormLayout layout = new FormLayout(
     *      "right:pref, @lcgap, 50dlu, 4dlu, 50dlu",
     *      myLayoutMap);
     *
     * // Left-aligned labels, gap, components, gap, components
     * FormLayout layout = new FormLayout(
     *      "left:pref, @lcgap, pref, @myGap, pref",
     *      myLayoutMap);
     * 
See the class comment for more examples. * * @param encodedColumnSpecs comma separated encoded column specifications * @param layoutMap expands layout column and row variables * * @throws NullPointerException if {@code encodedColumnSpecs} or * {@code layoutMap} is {@code null} * * @see LayoutMap#getRoot() * * @since 1.2 */ public FormLayout(String encodedColumnSpecs, LayoutMap layoutMap) { this(ColumnSpec.decodeSpecs(encodedColumnSpecs, layoutMap), new RowSpec[0]); } /** * Constructs a FormLayout using the given * encoded column and row specifications and the default LayoutMap.

* * This constructor is recommended for most hand-coded layouts.

* * Examples:

     * FormLayout layout = new FormLayout(
     *      "pref, 4dlu, pref",               // columns
     *      "p, 3dlu, p");                    // rows
     *
     * FormLayout layout = new FormLayout(
     *      "right:pref, 4dlu, pref",         // columns
     *      "p, 3dlu, p, 3dlu, fill:p:grow"); // rows
     *
     * FormLayout layout = new FormLayout(
     *      "left:pref, 4dlu, 50dlu",         // columns
     *      "p, 2px, p, 3dlu, p, 9dlu, p");   // rows
     *
     * FormLayout layout = new FormLayout(
     *      "max(75dlu;pref), 4dlu, default", // columns
     *      "p, 3dlu, p, 3dlu, p, 3dlu, p");  // rows
     * 
See the class comment for more examples. * * @param encodedColumnSpecs comma separated encoded column specifications * @param encodedRowSpecs comma separated encoded row specifications * * @throws NullPointerException if encodedColumnSpecs or encodedRowSpecs * is {@code null} * * @see LayoutMap#getRoot() */ public FormLayout(String encodedColumnSpecs, String encodedRowSpecs) { this(encodedColumnSpecs, encodedRowSpecs, LayoutMap.getRoot()); } /** * Constructs a FormLayout using the given * encoded column and row specifications and the given LayoutMap.

* * Examples:

     * FormLayout layout = new FormLayout(
     *      "pref, 4dlu, pref",               // columns
     *      "p, 3dlu, p",                     // rows
     *      myLayoutMap);                     // custom LayoutMap
     *
     * FormLayout layout = new FormLayout(
     *      "right:pref, 4dlu, pref",         // columns
     *      "p, @lgap, p, @lgap, fill:p:grow",// rows
     *      myLayoutMap);                     // custom LayoutMap
     *
     * FormLayout layout = new FormLayout(
     *      "left:pref, 4dlu, 50dlu",         // columns
     *      "p, 2px, p, 3dlu, p, 9dlu, p",    // rows
     *      myLayoutMap);                     // custom LayoutMap
     *
     * FormLayout layout = new FormLayout(
     *      "max(75dlu;pref), 4dlu, default", // columns
     *      "p, 3dlu, p, 3dlu, p, 3dlu, p",   // rows
     *      myLayoutMap);                     // custom LayoutMap
     * 
See the class comment for more examples. * * @param encodedColumnSpecs comma separated encoded column specifications * @param encodedRowSpecs comma separated encoded row specifications * @param layoutMap expands layout column and row variables * * @throws NullPointerException if {@code encodedColumnSpecs}, * {@code encodedRowSpecs}, or {@code layoutMap} is {@code null} * * @since 1.2 */ public FormLayout( String encodedColumnSpecs, String encodedRowSpecs, LayoutMap layoutMap) { this(ColumnSpec.decodeSpecs(encodedColumnSpecs, layoutMap), RowSpec. decodeSpecs(encodedRowSpecs, layoutMap)); } /** * Constructs a FormLayout using the given column specifications. * The constructed layout has no rows; these must be added * before components can be added to the layout container. * * @param colSpecs an array of column specifications. * @throws NullPointerException if {@code colSpecs} is {@code null} * * @since 1.1 */ public FormLayout(ColumnSpec[] colSpecs) { this(colSpecs, new RowSpec[]{}); } /** * Constructs a FormLayout using the given column and row specifications. * * @param colSpecs an array of column specifications. * @param rowSpecs an array of row specifications. * @throws NullPointerException if {@code colSpecs} or {@code rowSpecs} * is {@code null} */ public FormLayout(ColumnSpec[] colSpecs, RowSpec[] rowSpecs) { checkNotNull(colSpecs, "The column specifications must not be null."); checkNotNull(rowSpecs, "The row specifications must not be null."); this.colSpecs = new ArrayList(Arrays.asList(colSpecs)); this.rowSpecs = new ArrayList(Arrays.asList(rowSpecs)); colGroupIndices = new int[][]{}; rowGroupIndices = new int[][]{}; int initialCapacity = colSpecs.length * rowSpecs.length / 4; constraintMap = new HashMap(initialCapacity); componentSizeCache = new ComponentSizeCache(initialCapacity); minimumWidthMeasure = new MinimumWidthMeasure(componentSizeCache); minimumHeightMeasure = new MinimumHeightMeasure(componentSizeCache); preferredWidthMeasure = new PreferredWidthMeasure(componentSizeCache); preferredHeightMeasure = new PreferredHeightMeasure(componentSizeCache); } // Accessing the Column and Row Specifications ************************** /** * Returns the number of columns in this layout. * * @return the number of columns */ public int getColumnCount() { return colSpecs.size(); } /** * Returns the {@code ColumnSpec} at the specified column index. * * @param columnIndex the column index of the requested {@code ColumnSpec} * @return the {@code ColumnSpec} at the specified column * @throws IndexOutOfBoundsException if the column index is out of range */ public ColumnSpec getColumnSpec(int columnIndex) { return (ColumnSpec) colSpecs.get(columnIndex - 1); } /** * Sets the ColumnSpec at the specified column index. * * @param columnIndex the index of the column to be changed * @param columnSpec the ColumnSpec to be set * @throws NullPointerException if {@code columnSpec} is {@code null} * @throws IndexOutOfBoundsException if the column index is out of range */ public void setColumnSpec(int columnIndex, ColumnSpec columnSpec) { checkNotNull(columnSpec, "The column spec must not be null."); colSpecs.set(columnIndex - 1, columnSpec); } /** * Appends the given column specification to the right hand side of all * columns. * * @param columnSpec the column specification to be added * @throws NullPointerException if {@code columnSpec} is {@code null} */ public void appendColumn(ColumnSpec columnSpec) { checkNotNull(columnSpec, "The column spec must not be null."); colSpecs.add(columnSpec); } /** * Inserts the specified column at the specified position. Shifts components * that intersect the new column to the right hand side and readjusts * column groups.

* * The component shift works as follows: components that were located on * the right hand side of the inserted column are shifted one column to * the right; component column span is increased by one if it intersects * the new column.

* * Column group indices that are greater or equal than the given column * index will be increased by one. * * @param columnIndex index of the column to be inserted * @param columnSpec specification of the column to be inserted * @throws IndexOutOfBoundsException if the column index is out of range */ public void insertColumn(int columnIndex, ColumnSpec columnSpec) { if (columnIndex < 1 || columnIndex > getColumnCount()) { throw new IndexOutOfBoundsException( "The column index " + columnIndex + "must be in the range [1, " + getColumnCount() + "]."); } colSpecs.add(columnIndex - 1, columnSpec); shiftComponentsHorizontally(columnIndex, false); adjustGroupIndices(colGroupIndices, columnIndex, false); } /** * Removes the column with the given column index from the layout. * Components will be rearranged and column groups will be readjusted. * Therefore, the column must not contain components and must not be part * of a column group.

* * The component shift works as follows: components that were located on * the right hand side of the removed column are moved one column to the * left; component column span is decreased by one if it intersects the * removed column.

* * Column group indices that are greater than the column index will be * decreased by one.

* * Note: If one of the constraints mentioned above * is violated, this layout's state becomes illegal and it is unsafe * to work with this layout. * A typical layout implementation can ensure that these constraints are * not violated. However, in some cases you may need to check these * conditions before you invoke this method. The Forms extras contain * source code for class {@code FormLayoutUtils} that provides * the required test methods:
* {@code #columnContainsComponents(Container, int)} and
* {@code #isGroupedColumn(FormLayout, int)}. * * @param columnIndex index of the column to remove * @throws IndexOutOfBoundsException if the column index is out of range * @throws IllegalStateException if the column contains components * or if the column is already grouped * * @see com.jgoodies.forms.extras.FormLayoutUtils#columnContainsComponent(Container, int) * @see com.jgoodies.forms.extras.FormLayoutUtils#isGroupedColumn(FormLayout, int) */ public void removeColumn(int columnIndex) { if (columnIndex < 1 || columnIndex > getColumnCount()) { throw new IndexOutOfBoundsException( "The column index " + columnIndex + " must be in the range [1, " + getColumnCount() + "]."); } colSpecs.remove(columnIndex - 1); shiftComponentsHorizontally(columnIndex, true); adjustGroupIndices(colGroupIndices, columnIndex, true); } /** * Returns the number of rows in this layout. * * @return the number of rows */ public int getRowCount() { return rowSpecs.size(); } /** * Returns the {@code RowSpec} at the specified row index. * * @param rowIndex the row index of the requested {@code RowSpec} * @return the {@code RowSpec} at the specified row * @throws IndexOutOfBoundsException if the row index is out of range */ public RowSpec getRowSpec(int rowIndex) { return (RowSpec) rowSpecs.get(rowIndex - 1); } /** * Sets the RowSpec at the specified row index. * * @param rowIndex the index of the row to be changed * @param rowSpec the RowSpec to be set * @throws NullPointerException if {@code rowSpec} is {@code null} * @throws IndexOutOfBoundsException if the row index is out of range */ public void setRowSpec(int rowIndex, RowSpec rowSpec) { checkNotNull(rowSpec, "The row spec must not be null."); rowSpecs.set(rowIndex - 1, rowSpec); } /** * Appends the given row specification to the bottom of all rows. * * @param rowSpec the row specification to be added to the form layout * @throws NullPointerException if {@code rowSpec} is {@code null} */ public void appendRow(RowSpec rowSpec) { checkNotNull(rowSpec, "The row spec must not be null."); rowSpecs.add(rowSpec); } /** * Inserts the specified column at the specified position. Shifts * components that intersect the new column to the right and readjusts * column groups.

* * The component shift works as follows: components that were located on * the right hand side of the inserted column are shifted one column to * the right; component column span is increased by one if it intersects * the new column.

* * Column group indices that are greater or equal than the given column * index will be increased by one. * * @param rowIndex index of the row to be inserted * @param rowSpec specification of the row to be inserted * @throws IndexOutOfBoundsException if the row index is out of range */ public void insertRow(int rowIndex, RowSpec rowSpec) { if (rowIndex < 1 || rowIndex > getRowCount()) { throw new IndexOutOfBoundsException( "The row index " + rowIndex + " must be in the range [1, " + getRowCount() + "]."); } rowSpecs.add(rowIndex - 1, rowSpec); shiftComponentsVertically(rowIndex, false); adjustGroupIndices(rowGroupIndices, rowIndex, false); } /** * Removes the row with the given row index from the layout. Components * will be rearranged and row groups will be readjusted. Therefore, the * row must not contain components and must not be part of a row group.

* * The component shift works as follows: components that were located * below the removed row are moved up one row; component row span is * decreased by one if it intersects the removed row.

* * Row group indices that are greater than the row index will be decreased * by one.

* * Note: If one of the constraints mentioned above * is violated, this layout's state becomes illegal and it is unsafe * to work with this layout. * A typical layout implementation can ensure that these constraints are * not violated. However, in some cases you may need to check these * conditions before you invoke this method. The Forms extras contain * source code for class {@code FormLayoutUtils} that provides * the required test methods:
* {@code #rowContainsComponents(Container, int)} and
* {@code #isGroupedRow(FormLayout, int)}. * * @param rowIndex index of the row to remove * @throws IndexOutOfBoundsException if the row index is out of range * @throws IllegalStateException if the row contains components * or if the row is already grouped * * @see com.jgoodies.forms.extras.FormLayoutUtils#rowContainsComponent(Container, int) * @see com.jgoodies.forms.extras.FormLayoutUtils#isGroupedRow(FormLayout, int) */ public void removeRow(int rowIndex) { if (rowIndex < 1 || rowIndex > getRowCount()) { throw new IndexOutOfBoundsException( "The row index " + rowIndex + "must be in the range [1, " + getRowCount() + "]."); } rowSpecs.remove(rowIndex - 1); shiftComponentsVertically(rowIndex, true); adjustGroupIndices(rowGroupIndices, rowIndex, true); } /** * Shifts components horizontally, either to the right if a column has been * inserted or to the left if a column has been removed. * * @param columnIndex index of the column to remove * @param remove true for remove, false for insert * @throws IllegalStateException if a removed column contains components */ private void shiftComponentsHorizontally(int columnIndex, boolean remove) { final int offset = remove ? -1 : 1; for (Iterator i = constraintMap.entrySet().iterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); CellConstraints constraints = (CellConstraints) entry.getValue(); int x1 = constraints.gridX; int w = constraints.gridWidth; int x2 = x1 + w - 1; if (x1 == columnIndex && remove) { throw new IllegalStateException( "The removed column " + columnIndex + " must not contain component origins.\n" + "Illegal component=" + entry.getKey()); } else if (x1 >= columnIndex) { constraints.gridX += offset; } else if (x2 >= columnIndex) { constraints.gridWidth += offset; } } } /** * Shifts components vertically, either to the bottom if a row has been * inserted or to the top if a row has been removed. * * @param rowIndex index of the row to remove * @param remove true for remove, false for insert * @throws IllegalStateException if a removed column contains components */ private void shiftComponentsVertically(int rowIndex, boolean remove) { final int offset = remove ? -1 : 1; for (Iterator i = constraintMap.entrySet().iterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); CellConstraints constraints = (CellConstraints) entry.getValue(); int y1 = constraints.gridY; int h = constraints.gridHeight; int y2 = y1 + h - 1; if (y1 == rowIndex && remove) { throw new IllegalStateException( "The removed row " + rowIndex + " must not contain component origins.\n" + "Illegal component=" + entry.getKey()); } else if (y1 >= rowIndex) { constraints.gridY += offset; } else if (y2 >= rowIndex) { constraints.gridHeight += offset; } } } /** * Adjusts group indices. Shifts the given groups to left, right, up, * down according to the specified remove or add flag. * * @param allGroupIndices the groups to be adjusted * @param modifiedIndex the modified column or row index * @param remove true for remove, false for add * @throws IllegalStateException if we remove and the index is grouped */ private static void adjustGroupIndices(int[][] allGroupIndices, int modifiedIndex, boolean remove) { final int offset = remove ? -1 : +1; for (int[] allGroupIndice : allGroupIndices) { int[] groupIndices = allGroupIndice; for (int i = 0; i < groupIndices.length; i++) { int index = groupIndices[i]; if (index == modifiedIndex && remove) { throw new IllegalStateException( "The removed index " + modifiedIndex + " must not be grouped."); } else if (index >= modifiedIndex) { groupIndices[i] += offset; } } } } // Accessing Constraints ************************************************ /** * Looks up and returns the constraints for the specified component. * A copy of the actualCellConstraints object is returned. * * @param component the component to be queried * @return the CellConstraints for the specified component * @throws NullPointerException if {@code component} is {@code null} * @throws IllegalStateException if {@code component} has not been * added to the container */ public CellConstraints getConstraints(Component component) { return (CellConstraints) getConstraints0(component).clone(); } private CellConstraints getConstraints0(Component component) { checkNotNull(component, "The component must not be null."); CellConstraints constraints = (CellConstraints) constraintMap.get(component); checkState(constraints != null, "The component has not been added to the container."); return constraints; } /** * Sets the constraints for the specified component in this layout. * * @param component the component to be modified * @param constraints the constraints to be applied * @throws NullPointerException if {@code component} or {@code constraints} * is {@code null} */ public void setConstraints(Component component, CellConstraints constraints) { checkNotNull(component, "The component must not be null."); checkNotNull(constraints, "The constraints must not be null."); constraints.ensureValidGridBounds(getColumnCount(), getRowCount()); constraintMap.put(component, (CellConstraints) constraints.clone()); } /** * Removes the constraints for the specified component in this layout. * * @param component the component to be modified */ private void removeConstraints(Component component) { constraintMap.remove(component); componentSizeCache.removeEntry(component); } // Accessing Column and Row Groups ************************************** /** * Returns a deep copy of the column groups. * * @return the column groups as two-dimensional int array */ public int[][] getColumnGroups() { return deepClone(colGroupIndices); } /** * Sets the column groups, where each column in a group gets the same * group wide width. Each group is described by an array of integers that * are interpreted as column indices. The parameter is an array of such * group descriptions.

* * Examples:

     * // Group columns 1, 3 and 4.
     * setColumnGroups(new int[][]{ {1, 3, 4}});
     *
     * // Group columns 1, 3, 4, and group columns 7 and 9
     * setColumnGroups(new int[][]{ {1, 3, 4}, {7, 9}});
     * 
* * @param colGroupIndices a two-dimensional array of column groups indices * @throws IndexOutOfBoundsException if an index is outside the grid * @throws IllegalArgumentException if a column index is used twice */ public void setColumnGroups(int[][] colGroupIndices) { int maxColumn = getColumnCount(); boolean[] usedIndices = new boolean[maxColumn + 1]; for (int group = 0; group < colGroupIndices.length; group++) { for (int j = 0; j < colGroupIndices[group].length; j++) { int colIndex = colGroupIndices[group][j]; if (colIndex < 1 || colIndex > maxColumn) { throw new IndexOutOfBoundsException( "Invalid column group index " + colIndex + " in group " + (group+1)); } if (usedIndices[colIndex]) { throw new IllegalArgumentException( "Column index " + colIndex + " must not be used in multiple column groups."); } usedIndices[colIndex] = true; } } this.colGroupIndices = deepClone(colGroupIndices); } /** * Adds the specified column index to the last column group. * In case there are no groups, a new group will be created. * * @param columnIndex the column index to be set grouped */ public void addGroupedColumn(int columnIndex) { int[][] newColGroups = getColumnGroups(); // Create a group if none exists. if (newColGroups.length == 0) { newColGroups = new int[][]{{columnIndex}}; } else { int lastGroupIndex = newColGroups.length-1; int[] lastGroup = newColGroups[lastGroupIndex]; int groupSize = lastGroup.length; int[] newLastGroup = new int[groupSize+1]; System.arraycopy(lastGroup, 0, newLastGroup, 0, groupSize); newLastGroup[groupSize] = columnIndex; newColGroups[lastGroupIndex] = newLastGroup; } setColumnGroups(newColGroups); } /** * Returns a deep copy of the row groups. * * @return the row groups as two-dimensional int array */ public int[][] getRowGroups() { return deepClone(rowGroupIndices); } /** * Sets the row groups, where each row in such a group gets the same group * wide height. Each group is described by an array of integers that are * interpreted as row indices. The parameter is an array of such group * descriptions.

* * Examples:

     * // Group rows 1 and 2.
     * setRowGroups(new int[][]{ {1, 2}});
     *
     * // Group rows 1 and 2, and group rows 5, 7, and 9.
     * setRowGroups(new int[][]{ {1, 2}, {5, 7, 9}});
     * 
* * @param rowGroupIndices a two-dimensional array of row group indices. * @throws IndexOutOfBoundsException if an index is outside the grid */ public void setRowGroups(int[][] rowGroupIndices) { int rowCount = getRowCount(); boolean[] usedIndices = new boolean[rowCount + 1]; for (int i = 0; i < rowGroupIndices.length; i++) { for (int j = 0; j < rowGroupIndices[i].length; j++) { int rowIndex = rowGroupIndices[i][j]; if (rowIndex < 1 || rowIndex > rowCount) { throw new IndexOutOfBoundsException( "Invalid row group index " + rowIndex + " in group " + (i+1)); } if (usedIndices[rowIndex]) { throw new IllegalArgumentException( "Row index " + rowIndex + " must not be used in multiple row groups."); } usedIndices[rowIndex] = true; } } this.rowGroupIndices = deepClone(rowGroupIndices); } /** * Adds the specified row index to the last row group. * In case there are no groups, a new group will be created. * * @param rowIndex the index of the row that should be grouped */ public void addGroupedRow(int rowIndex) { int[][] newRowGroups = getRowGroups(); // Create a group if none exists. if (newRowGroups.length == 0) { newRowGroups = new int[][]{{rowIndex}}; } else { int lastGroupIndex = newRowGroups.length-1; int[] lastGroup = newRowGroups[lastGroupIndex]; int groupSize = lastGroup.length; int[] newLastGroup = new int[groupSize+1]; System.arraycopy(lastGroup, 0, newLastGroup, 0, groupSize); newLastGroup[groupSize] = rowIndex; newRowGroups[lastGroupIndex] = newLastGroup; } setRowGroups(newRowGroups); } // Other Accessors ******************************************************** /** * Returns whether invisible components shall be taken into account * by this layout. This container-wide setting can be overridden * per component. See {@link #setHonorsVisibility(boolean)} for details. * * @return {@code true} if the component visibility is honored * by this FormLayout, {@code false} if it is ignored. * This setting can be overridden for individual CellConstraints * using {@link #setHonorsVisibility(Component, Boolean)}. * * @since 1.2 */ public boolean getHonorsVisibility() { return honorsVisibility; } /** * Specifies whether invisible components shall be taken into account by * this layout for computing the layout size and setting component bounds. * If set to {@code true} invisible components will be ignored by * the layout. If set to {@code false} components will be taken into * account regardless of their visibility. Visible components are always * used for sizing and positioning.

* * The default value for this setting is {@code true}. * It is useful to set the value to {@code false} (in other words * to ignore the visibility) if you switch the component visibility * dynamically and want the container to retain the size and * component positions.

* * This container-wide default setting can be overridden per component * using {@link #setHonorsVisibility(Component, Boolean)}.

* * Components are taken into account, if

    *
  1. they are visible, or *
  2. they have no individual setting and the container-wide settings * ignores the visibility (honorsVisibility set to {@code false}), or *
  3. the individual component ignores the visibility. *
* * @param b {@code true} to honor the visibility, i.e. to exclude * invisible components from the sizing and positioning, * {@code false} to ignore the visibility, in other words to * layout visible and invisible components * * @since 1.2 */ public void setHonorsVisibility(boolean b) { boolean oldHonorsVisibility = getHonorsVisibility(); if (oldHonorsVisibility == b) { return; } honorsVisibility = b; Set componentSet = constraintMap.keySet(); if (componentSet.isEmpty()) { return; } Component firstComponent = (Component) componentSet.iterator().next(); Container container = firstComponent.getParent(); invalidateAndRepaint(container); } /** * Specifies whether the given component shall be taken into account * for sizing and positioning. This setting overrides the container-wide * default. See {@link #setHonorsVisibility(boolean)} for details. * * @param component the component that shall get an individual setting * @param b {@code Boolean.TRUE} to override the container * default and honor the visibility for the given component, * {@code Boolean.FALSE} to override the container default and * ignore the visibility for the given component, * {@code null} to use the container default value as specified * by {@link #getHonorsVisibility()}. * * @since 1.2 */ public void setHonorsVisibility(Component component, Boolean b) { CellConstraints constraints = getConstraints0(component); if (Objects.equals(b, constraints.honorsVisibility)) { return; } constraints.honorsVisibility = b; invalidateAndRepaint(component.getParent()); } // Implementing the LayoutManager and LayoutManager2 Interfaces ********* /** * Throws an {@code UnsupportedOperationException}. Does not add * the specified component with the specified name to the layout. * * @param name indicates entry's position and anchor * @param component component to add * @throws UnsupportedOperationException always */ @Override public void addLayoutComponent(String name, Component component) { throw new UnsupportedOperationException( "Use #addLayoutComponent(Component, Object) instead."); } /** * Adds the specified component to the layout, using the specified * {@code constraints} object. Note that constraints are mutable and * are, therefore, cloned when cached. * * @param comp the component to be added * @param constraints the component's cell constraints * @throws NullPointerException if {@code constraints} is {@code null} * @throws IllegalArgumentException if {@code constraints} is neither * a String, nor a CellConstraints object, * or a String that is rejected by the CellConstraints construction */ @Override public void addLayoutComponent(Component comp, Object constraints) { checkNotNull(constraints, "The constraints must not be null."); if (constraints instanceof String) { setConstraints(comp, new CellConstraints((String) constraints)); } else if (constraints instanceof CellConstraints) { setConstraints(comp, (CellConstraints) constraints); } else { throw new IllegalArgumentException("Illegal constraint type " + constraints.getClass()); } } /** * Removes the specified component from this layout.

* * Most applications do not call this method directly. * * @param comp the component to be removed. * @see Container#remove(java.awt.Component) * @see Container#removeAll() */ @Override public void removeLayoutComponent(Component comp) { removeConstraints(comp); } // Layout Requests ****************************************************** /** * Determines the minimum size of the {@code parent} container * using this form layout.

* * Most applications do not call this method directly. * * @param parent the container in which to do the layout * @return the minimum size of the {@code parent} container * * @see Container#doLayout() */ @Override public Dimension minimumLayoutSize(Container parent) { return computeLayoutSize(parent, minimumWidthMeasure, minimumHeightMeasure); } /** * Determines the preferred size of the {@code parent} * container using this form layout.

* * Most applications do not call this method directly. * * @param parent the container in which to do the layout * @return the preferred size of the {@code parent} container * * @see Container#getPreferredSize() */ @Override public Dimension preferredLayoutSize(Container parent) { return computeLayoutSize(parent, preferredWidthMeasure, preferredHeightMeasure); } /** * Returns the maximum dimensions for this layout given the components * in the specified target container. * * @param target the container which needs to be laid out * @see Container * @see #minimumLayoutSize(Container) * @see #preferredLayoutSize(Container) * @return the maximum dimensions for this layout */ @Override public Dimension maximumLayoutSize(Container target) { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } /** * Returns the alignment along the x axis. This specifies how * the component would like to be aligned relative to other * components. The value should be a number between 0 and 1 * where 0 represents alignment along the origin, 1 is aligned * the farthest away from the origin, 0.5 is centered, etc. * * @param parent the parent container * @return the value {@code 0.5f} to indicate center alignment */ @Override public float getLayoutAlignmentX(Container parent) { return 0.5f; } /** * Returns the alignment along the y axis. This specifies how * the component would like to be aligned relative to other * components. The value should be a number between 0 and 1 * where 0 represents alignment along the origin, 1 is aligned * the farthest away from the origin, 0.5 is centered, etc. * * @param parent the parent container * @return the value {@code 0.5f} to indicate center alignment */ @Override public float getLayoutAlignmentY(Container parent) { return 0.5f; } /** * Invalidates the layout, indicating that if the layout manager * has cached information it should be discarded. * * @param target the container that holds the layout to be invalidated */ @Override public void invalidateLayout(Container target) { invalidateCaches(); } /** * Lays out the specified container using this form layout. This method * reshapes components in the specified container in order to satisfy * the constraints of this {@code FormLayout} object.

* * Most applications do not call this method directly.

* * The form layout performs the following steps: *

    *
  1. find components that occupy exactly one column or row *
  2. compute minimum widths and heights *
  3. compute preferred widths and heights *
  4. give cols and row equal size if they share a group *
  5. compress default columns and rows if total is less than pref size *
  6. give cols and row equal size if they share a group *
  7. distribute free space *
  8. set components bounds *
* * @param parent the container in which to do the layout * @see Container * @see Container#doLayout() */ @Override public void layoutContainer(Container parent) { synchronized (parent.getTreeLock()) { initializeColAndRowComponentLists(); Dimension size = parent.getSize(); Insets insets = parent.getInsets(); int totalWidth = size.width - insets.left - insets.right; int totalHeight = size.height- insets.top - insets.bottom; int[] x = computeGridOrigins(parent, totalWidth, insets.left, colSpecs, colComponents, colGroupIndices, minimumWidthMeasure, preferredWidthMeasure ); int[] y = computeGridOrigins(parent, totalHeight, insets.top, rowSpecs, rowComponents, rowGroupIndices, minimumHeightMeasure, preferredHeightMeasure ); layoutComponents(x, y); } } // Layout Algorithm ***************************************************** /** * Initializes two lists for columns and rows that hold a column's * or row's components that span only this column or row.

* * Iterates over all components and their associated constraints; * every component that has a column span or row span of 1 * is put into the column's or row's component list. */ private void initializeColAndRowComponentLists() { colComponents = new List[getColumnCount()]; for (int i=0; i < getColumnCount(); i++) { colComponents[i] = new ArrayList(); } rowComponents = new List[getRowCount()]; for (int i=0; i < getRowCount(); i++) { rowComponents[i] = new ArrayList(); } for (Iterator i = constraintMap.entrySet().iterator(); i.hasNext(); ) { Map.Entry entry = (Map.Entry) i.next(); Component component = (Component) entry.getKey(); CellConstraints constraints = (CellConstraints) entry.getValue(); if (takeIntoAccount(component, constraints)) { if (constraints.gridWidth == 1) { colComponents[constraints.gridX-1].add(component); } if (constraints.gridHeight == 1) { rowComponents[constraints.gridY-1].add(component); } } } } /** * Computes and returns the layout size of the given {@code parent} * container using the specified measures. * * @param parent the container in which to do the layout * @param defaultWidthMeasure the measure used to compute the default width * @param defaultHeightMeasure the measure used to compute the default height * @return the layout size of the {@code parent} container */ private Dimension computeLayoutSize(Container parent, Measure defaultWidthMeasure, Measure defaultHeightMeasure) { synchronized (parent.getTreeLock()) { initializeColAndRowComponentLists(); int[] colWidths = maximumSizes(parent, colSpecs, colComponents, minimumWidthMeasure, preferredWidthMeasure, defaultWidthMeasure); int[] rowHeights = maximumSizes(parent, rowSpecs, rowComponents, minimumHeightMeasure, preferredHeightMeasure, defaultHeightMeasure); int[] groupedWidths = groupedSizes(colGroupIndices, colWidths); int[] groupedHeights = groupedSizes(rowGroupIndices, rowHeights); // Convert sizes to origins. int[] xOrigins = computeOrigins(groupedWidths, 0); int[] yOrigins = computeOrigins(groupedHeights, 0); int width1 = sum(groupedWidths); int height1 = sum(groupedHeights); int maxWidth = width1; int maxHeight = height1; /* * Take components that span multiple columns or rows into account. * This shall be done if and only if a component spans an interval * that can grow. */ // First computes the maximum number of cols/rows a component // can span without spanning a growing column. int[] maxFixedSizeColsTable = computeMaximumFixedSpanTable(colSpecs); int[] maxFixedSizeRowsTable = computeMaximumFixedSpanTable(rowSpecs); for (Iterator i = constraintMap.entrySet().iterator(); i.hasNext(); ) { Map.Entry entry = (Map.Entry) i.next(); Component component = (Component) entry.getKey(); CellConstraints constraints = (CellConstraints) entry.getValue(); if (!takeIntoAccount(component, constraints)) { continue; } if ( constraints.gridWidth > 1 && constraints.gridWidth > maxFixedSizeColsTable[constraints.gridX-1]) { //int compWidth = minimumWidthMeasure.sizeOf(component); int compWidth = defaultWidthMeasure.sizeOf(component); //int compWidth = preferredWidthMeasure.sizeOf(component); int gridX1 = constraints.gridX-1; int gridX2 = gridX1 + constraints.gridWidth; int lead = xOrigins[gridX1]; int trail = width1 - xOrigins[gridX2]; int myWidth = lead + compWidth + trail; if (myWidth > maxWidth) { maxWidth = myWidth; } } if ( constraints.gridHeight > 1 && constraints.gridHeight > maxFixedSizeRowsTable[constraints.gridY-1]) { //int compHeight = minimumHeightMeasure.sizeOf(component); int compHeight = defaultHeightMeasure.sizeOf(component); //int compHeight = preferredHeightMeasure.sizeOf(component); int gridY1 = constraints.gridY-1; int gridY2 = gridY1 + constraints.gridHeight; int lead = yOrigins[gridY1]; int trail = height1 - yOrigins[gridY2]; int myHeight = lead + compHeight + trail; if (myHeight > maxHeight) { maxHeight = myHeight; } } } Insets insets = parent.getInsets(); int width = maxWidth + insets.left + insets.right; int height = maxHeight + insets.top + insets.bottom; return new Dimension(width, height); } } /** * Computes and returns the grid's origins. * * @param container the layout container * @param totalSize the total size to assign * @param offset the offset from left or top margin * @param formSpecs the column or row specs, resp. * @param componentLists the components list for each col/row * @param minMeasure the measure used to determine min sizes * @param prefMeasure the measure used to determine pre sizes * @param groupIndices the group specification * @return an int array with the origins */ private static int[] computeGridOrigins(Container container, int totalSize, int offset, List formSpecs, List[] componentLists, int[][] groupIndices, Measure minMeasure, Measure prefMeasure) { /* For each spec compute the minimum and preferred size that is * the maximum of all component minimum and preferred sizes resp. */ int[] minSizes = maximumSizes(container, formSpecs, componentLists, minMeasure, prefMeasure, minMeasure); int[] prefSizes = maximumSizes(container, formSpecs, componentLists, minMeasure, prefMeasure, prefMeasure); int[] groupedMinSizes = groupedSizes(groupIndices, minSizes); int[] groupedPrefSizes = groupedSizes(groupIndices, prefSizes); int totalMinSize = sum(groupedMinSizes); int totalPrefSize = sum(groupedPrefSizes); int[] compressedSizes = compressedSizes(formSpecs, totalSize, totalMinSize, totalPrefSize, groupedMinSizes, prefSizes); int[] groupedSizes = groupedSizes(groupIndices, compressedSizes); int totalGroupedSize = sum(groupedSizes); int[] sizes = distributedSizes(formSpecs, totalSize, totalGroupedSize, groupedSizes); return computeOrigins(sizes, offset); } /** * Computes origins from sizes taking the specified offset into account. * * @param sizes the array of sizes * @param offset an offset for the first origin * @return an array of origins */ private static int[] computeOrigins(int[] sizes, int offset) { int count = sizes.length; int[] origins = new int[count + 1]; origins[0] = offset; for (int i = 1; i <= count; i++) { origins[i] = origins[i-1] + sizes[i-1]; } return origins; } /** * Lays out the components using the given x and y origins, the column * and row specifications, and the component constraints.

* * The actual computation is done by each component's form constraint * object. We just compute the cell, the cell bounds and then hand over * the component, cell bounds, and measure to the form constraints. * This will allow potential subclasses of {@code CellConstraints} * to do special micro-layout corrections. For example, such a subclass * could map JComponent classes to visual layout bounds that may * lead to a slightly different bounds. * * @param x an int array of the horizontal origins * @param y an int array of the vertical origins */ private void layoutComponents(int[] x, int[] y) { Rectangle cellBounds = new Rectangle(); for (Iterator i = constraintMap.entrySet().iterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); Component component = (Component) entry.getKey(); CellConstraints constraints = (CellConstraints) entry.getValue(); int gridX = constraints.gridX-1; int gridY = constraints.gridY-1; int gridWidth = constraints.gridWidth; int gridHeight = constraints.gridHeight; cellBounds.x = x[gridX]; cellBounds.y = y[gridY]; cellBounds.width = x[gridX + gridWidth ] - cellBounds.x; cellBounds.height = y[gridY + gridHeight] - cellBounds.y; constraints.setBounds(component, this, cellBounds, minimumWidthMeasure, minimumHeightMeasure, preferredWidthMeasure, preferredHeightMeasure); } } /** * Invalidates the component size caches. */ private void invalidateCaches() { componentSizeCache.invalidate(); } /** * Computes and returns the sizes for the given form specs, component * lists and measures for minimum, preferred, and default size. * * @param container the layout container * @param formSpecs the column or row specs, resp. * @param componentLists the components list for each col/row * @param minMeasure the measure used to determine min sizes * @param prefMeasure the measure used to determine pre sizes * @param defaultMeasure the measure used to determine default sizes * @return the column or row sizes */ private static int[] maximumSizes(Container container, List formSpecs, List[] componentLists, Measure minMeasure, Measure prefMeasure, Measure defaultMeasure) { FormSpec formSpec; int size = formSpecs.size(); int[] result = new int[size]; for (int i = 0; i < size; i++) { formSpec = (FormSpec) formSpecs.get(i); result[i] = formSpec.maximumSize(container, componentLists[i], minMeasure, prefMeasure, defaultMeasure); } return result; } /** * Computes and returns the compressed sizes. Compresses space for columns * and rows iff the available space is less than the total preferred size * but more than the total minimum size.

* * Only columns and rows that are specified to be compressible will be * affected. You can specify a column and row as compressible by * giving it the component size default. * * @param formSpecs the column or row specs to use * @param totalSize the total available size * @param totalMinSize the sum of all minimum sizes * @param totalPrefSize the sum of all preferred sizes * @param minSizes an int array of column/row minimum sizes * @param prefSizes an int array of column/row preferred sizes * @return an int array of compressed column/row sizes */ private static int[] compressedSizes(List formSpecs, int totalSize, int totalMinSize, int totalPrefSize, int[] minSizes, int[] prefSizes) { // If we have less space than the total min size, answer the min sizes. if (totalSize < totalMinSize) { return minSizes; } // If we have more space than the total pref size, answer the pref sizes. if (totalSize >= totalPrefSize) { return prefSizes; } int count = formSpecs.size(); int[] sizes = new int[count]; double totalCompressionSpace = totalPrefSize - totalSize; double maxCompressionSpace = totalPrefSize - totalMinSize; double compressionFactor = totalCompressionSpace / maxCompressionSpace; // System.out.println("Total compression space=" + totalCompressionSpace); // System.out.println("Max compression space =" + maxCompressionSpace); // System.out.println("Compression factor =" + compressionFactor); for (int i=0; i < count; i++) { FormSpec formSpec = (FormSpec) formSpecs.get(i); sizes[i] = prefSizes[i]; if (formSpec.getSize().compressible()) { sizes[i] -= (int) Math.round((prefSizes[i] - minSizes[i]) * compressionFactor); } } return sizes; } /** * Computes and returns the grouped sizes. * Gives grouped columns and rows the same size. * * @param groups the group specification * @param rawSizes the raw sizes before the grouping * @return the grouped sizes */ private static int[] groupedSizes(int[][] groups, int[] rawSizes) { // Return the compressed sizes if there are no groups. if (groups == null || groups.length == 0) { return rawSizes; } // Initialize the result with the given compressed sizes. int[] sizes = new int[rawSizes.length]; for (int i = 0; i < sizes.length; i++) { sizes[i] = rawSizes[i]; } // For each group equalize the sizes. for (int[] groupIndices : groups) { int groupMaxSize = 0; // Compute the group's maximum size. for (int groupIndice : groupIndices) { int index = groupIndice - 1; groupMaxSize = Math.max(groupMaxSize, sizes[index]); } // Set all sizes of this group to the group's maximum size. for (int groupIndice : groupIndices) { int index = groupIndice - 1; sizes[index] = groupMaxSize; } } return sizes; } /** * Distributes free space over columns and rows and * returns the sizes after this distribution process. * * @param formSpecs the column/row specifications to work with * @param totalSize the total available size * @param totalPrefSize the sum of all preferred sizes * @param inputSizes the input sizes * @return the distributed sizes */ private static int[] distributedSizes(List formSpecs, int totalSize, int totalPrefSize, int[] inputSizes) { double totalFreeSpace = totalSize - totalPrefSize; // Do nothing if there's no free space. if (totalFreeSpace < 0) { return inputSizes; } // Compute the total weight. int count = formSpecs.size(); double totalWeight = 0.0; for (int i=0; i < count; i++) { FormSpec formSpec = (FormSpec) formSpecs.get(i); totalWeight += formSpec.getResizeWeight(); } // Do nothing if there's no resizing column. if (totalWeight == 0.0) { return inputSizes; } int[] sizes = new int[count]; double restSpace = totalFreeSpace; int roundedRestSpace = (int) totalFreeSpace; for (int i=0; i < count; i++) { FormSpec formSpec = (FormSpec) formSpecs.get(i); double weight = formSpec.getResizeWeight(); if (weight == FormSpec.NO_GROW) { sizes[i] = inputSizes[i]; } else { double roundingCorrection = restSpace - roundedRestSpace; double extraSpace = totalFreeSpace * weight / totalWeight; double correctedExtraSpace = extraSpace - roundingCorrection; int roundedExtraSpace = (int) Math.round(correctedExtraSpace); sizes[i] = inputSizes[i] + roundedExtraSpace; restSpace -= extraSpace; roundedRestSpace -= roundedExtraSpace; } } return sizes; } /** * Computes and returns a table that maps a column/row index * to the maximum number of columns/rows that a component can span * without spanning a growing column.

* * Iterates over the specs from right to left/bottom to top, * sets the table value to zero if a spec can grow, * otherwise increases the span by one.

* * Examples:

     * "pref, 4dlu, pref, 2dlu, p:grow, 2dlu,      pref" ->
     * [4,    3,    2,    1,    0,      MAX_VALUE, MAX_VALUE]
     *
     * "p:grow, 4dlu, p:grow, 9dlu,      pref" ->
     * [0,      1,    0,      MAX_VALUE, MAX_VALUE]
     *
     * "p, 4dlu, p, 2dlu, 0:grow" ->
     * [4, 3,    2, 1,    0]
     * 
* * @param formSpecs the column specs or row specs * @return a table that maps a spec index to the maximum span for * fixed size specs */ private static int[] computeMaximumFixedSpanTable(List formSpecs) { int size = formSpecs.size(); int[] table = new int[size]; int maximumFixedSpan = Integer.MAX_VALUE; // Could be 1 for (int i = size-1; i >= 0; i--) { FormSpec spec = (FormSpec) formSpecs.get(i); // ArrayList access if (spec.canGrow()) { maximumFixedSpan = 0; } table[i] = maximumFixedSpan; if (maximumFixedSpan < Integer.MAX_VALUE) { maximumFixedSpan++; } } return table; } // Helper Code ************************************************************ /** * Computes and returns the sum of integers in the given array of ints. * * @param sizes an array of ints to sum up * @return the sum of ints in the array */ private static int sum(final int[] sizes) { int sum = 0; for (int i = sizes.length - 1; i >= 0; i--) { sum += sizes[i]; } return sum; } private static void invalidateAndRepaint(Container container) { if (container == null) { return; } if (container instanceof JComponent) { ((JComponent) container).revalidate(); } else { container.invalidate(); } container.repaint(); } /** * Checks and answers whether the given component with the specified * CellConstraints shall be taken into account for the layout. * * @param component the component to test * @param cc the component's associated CellConstraints * @return {@code true} if * a) {@code component} is visible, or * b) {@code component} has no individual setting and the container-wide settings * ignores the visibility, or * c) {@code cc} indicates that this individual component * ignores the visibility. */ private boolean takeIntoAccount(Component component, CellConstraints cc) { return component.isVisible() || cc.honorsVisibility == null && !getHonorsVisibility() || Boolean.FALSE.equals(cc.honorsVisibility); } // Measuring Component Sizes ******************************************** /** * An interface that describes how to measure a {@code Component}. * Used to abstract from horizontal and vertical dimensions as well as * minimum and preferred sizes. * * @since 1.1 */ public static interface Measure { /** * Computes and returns the size of the given {@code Component}. * * @param component the component to measure * @return the component's size */ int sizeOf(Component component); } /** * An abstract implementation of the {@code Measure} interface * that caches component sizes. */ private abstract static class CachingMeasure implements Measure, Serializable { /** * Holds previously requested component sizes. * Used to minimize size requests to subcomponents. */ protected final ComponentSizeCache cache; private CachingMeasure(ComponentSizeCache cache) { this.cache = cache; } } /** * Measures a component by computing its minimum width. */ private static final class MinimumWidthMeasure extends CachingMeasure { private MinimumWidthMeasure(ComponentSizeCache cache) { super(cache); } @Override public int sizeOf(Component c) { return cache.getMinimumSize(c).width; } } /** * Measures a component by computing its minimum height. */ private static final class MinimumHeightMeasure extends CachingMeasure { private MinimumHeightMeasure(ComponentSizeCache cache) { super(cache); } @Override public int sizeOf(Component c) { return cache.getMinimumSize(c).height; } } /** * Measures a component by computing its preferred width. */ private static final class PreferredWidthMeasure extends CachingMeasure { private PreferredWidthMeasure(ComponentSizeCache cache) { super(cache); } @Override public int sizeOf(Component c) { return cache.getPreferredSize(c).width; } } /** * Measures a component by computing its preferred height. */ private static final class PreferredHeightMeasure extends CachingMeasure { private PreferredHeightMeasure(ComponentSizeCache cache) { super(cache); } @Override public int sizeOf(Component c) { return cache.getPreferredSize(c).height; } } // Caching Component Sizes ********************************************** /** * A cache for component minimum and preferred sizes. * Used to reduce the requests to determine a component's size. */ private static final class ComponentSizeCache implements Serializable { /** Maps components to their minimum sizes. */ private final Map minimumSizes; /** Maps components to their preferred sizes. */ private final Map preferredSizes; /** * Constructs a {@code ComponentSizeCache}. * * @param initialCapacity the initial cache capacity */ private ComponentSizeCache(int initialCapacity) { minimumSizes = new HashMap(initialCapacity); preferredSizes = new HashMap(initialCapacity); } /** * Invalidates the cache. Clears all stored size information. */ void invalidate() { minimumSizes.clear(); preferredSizes.clear(); } /** * Returns the minimum size for the given component. Tries to look up * the value from the cache; lazily creates the value if it has not * been requested before. * * @param component the component to compute the minimum size * @return the component's minimum size */ Dimension getMinimumSize(Component component) { Dimension size = (Dimension) minimumSizes.get(component); if (size == null) { size = component.getMinimumSize(); minimumSizes.put(component, size); } return size; } /** * Returns the preferred size for the given component. Tries to look * up the value from the cache; lazily creates the value if it has not * been requested before. * * @param component the component to compute the preferred size * @return the component's preferred size */ Dimension getPreferredSize(Component component) { Dimension size = (Dimension) preferredSizes.get(component); if (size == null) { size = component.getPreferredSize(); preferredSizes.put(component, size); } return size; } void removeEntry(Component component) { minimumSizes.remove(component); preferredSizes.remove(component); } } // Exposing the Layout Information ************************************** /** * Computes and returns the horizontal and vertical grid origins. * Performs the same layout process as {@code #layoutContainer} * but does not layout the components.

* * This method has been added only to make it easier to debug * the form layout. You must not call this method directly; * It may be removed in a future release or the visibility * may be reduced. * * @param parent the {@code Container} to inspect * @return an object that comprises the grid x and y origins */ public LayoutInfo getLayoutInfo(Container parent) { synchronized (parent.getTreeLock()) { initializeColAndRowComponentLists(); Dimension size = parent.getSize(); Insets insets = parent.getInsets(); int totalWidth = size.width - insets.left - insets.right; int totalHeight = size.height- insets.top - insets.bottom; int[] x = computeGridOrigins(parent, totalWidth, insets.left, colSpecs, colComponents, colGroupIndices, minimumWidthMeasure, preferredWidthMeasure ); int[] y = computeGridOrigins(parent, totalHeight, insets.top, rowSpecs, rowComponents, rowGroupIndices, minimumHeightMeasure, preferredHeightMeasure ); return new LayoutInfo(x, y); } } /** * Stores column and row origins. */ public static final class LayoutInfo { /** * Holds the origins of the columns. */ public final int[] columnOrigins; /** * Holds the origins of the rows. */ public final int[] rowOrigins; private LayoutInfo(int[] xOrigins, int[] yOrigins) { this.columnOrigins = xOrigins; this.rowOrigins = yOrigins; } /** * Returns the layout's horizontal origin, the origin of the first column. * * @return the layout's horizontal origin, the origin of the first column. */ public int getX() { return columnOrigins[0]; } /** * Returns the layout's vertical origin, the origin of the first row. * * @return the layout's vertical origin, the origin of the first row. */ public int getY() { return rowOrigins[0]; } /** * Returns the layout's width, the size between the first and the last * column origin. * * @return the layout's width. */ public int getWidth() { return columnOrigins[columnOrigins.length-1] - columnOrigins[0]; } /** * Returns the layout's height, the size between the first and last row. * * @return the layout's height. */ public int getHeight() { return rowOrigins[rowOrigins.length-1] - rowOrigins[0]; } } // Helper Code ********************************************************** /** * Creates and returns a deep copy of the given array. * Unlike {@code #clone} that performs a shallow copy, * this method copies both array levels. * * @param array the array to clone * @return a deep copy of the given array * * @see Object#clone() */ private static int[][] deepClone(int[][] array) { int[][] result = new int[array.length][]; for (int i = 0; i < result.length; i++) { result[i] = array[i].clone(); } return result; } // Serialization ******************************************************** /** * In addition to the default serialization mechanism this class * invalidates the component size cache. The cache will be populated * again after the deserialization. * Also, the fields {@code colComponents} and * {@code rowComponents} have been marked as transient * to exclude them from the serialization. */ private void writeObject(ObjectOutputStream out) throws IOException { invalidateCaches(); out.defaultWriteObject(); } // Debug Helper Code **************************************************** /* // Prints the given column widths and row heights. private void printSizes(String title, int[] colWidths, int[] rowHeights) { System.out.println(); System.out.println(title); int totalWidth = 0; System.out.print("Column widths: "); for (int i=0; i < getColumnCount(); i++) { int width = colWidths[i]; totalWidth += width; System.out.print(width + ", "); } System.out.println(" Total=" + totalWidth); int totalHeight = 0; System.out.print("Row heights: "); for (int i=0; i < getRowCount(); i++) { int height = rowHeights[i]; totalHeight += height; System.out.print(height + ", "); } System.out.println(" Total=" + totalHeight); System.out.println(); } */ } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/FormSpecs.java0000644000175000017500000002734611751010232025441 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import com.jgoodies.forms.util.LayoutStyle; /** * Provides frequently used column and row specifications. * * @author Karsten Lentzsch * @version $Revision: 1.17 $ * * @see com.jgoodies.forms.layout.FormLayout * @see ColumnSpec * * @since 1.6 This class was the FormFactory before. */ public final class FormSpecs { private FormSpecs() { // Suppresses default constructor, prevents instantiation. } // Frequently used Column Specifications ******************************** /** * An unmodifiable {@code ColumnSpec} that determines its width by * computing the maximum of all column component minimum widths. * * @see #PREF_COLSPEC * @see #DEFAULT_COLSPEC */ public static final ColumnSpec MIN_COLSPEC = new ColumnSpec(Sizes.MINIMUM); /** * An unmodifiable {@code ColumnSpec} that determines its width by * computing the maximum of all column component preferred widths. * * @see #MIN_COLSPEC * @see #DEFAULT_COLSPEC */ public static final ColumnSpec PREF_COLSPEC = new ColumnSpec(Sizes.PREFERRED); /** * An unmodifiable {@code ColumnSpec} that determines its preferred * width by computing the maximum of all column component preferred widths * and its minimum width by computing all column component minimum widths.

* * Useful to let a column shrink from preferred width to minimum width * if the container space gets scarce. * * @see #MIN_COLSPEC * @see #PREF_COLSPEC */ public static final ColumnSpec DEFAULT_COLSPEC = new ColumnSpec(Sizes.DEFAULT); /** * An unmodifiable {@code ColumnSpec} that has an initial width * of 0 pixels and that grows. Useful to describe glue columns * that fill the space between other columns. * * @see #GLUE_ROWSPEC */ public static final ColumnSpec GLUE_COLSPEC = new ColumnSpec(ColumnSpec.DEFAULT, Sizes.ZERO, ColumnSpec.DEFAULT_GROW); // Layout Style Dependent Column Specs *********************************** /** * Describes a logical horizontal gap between a label and an associated * component. Useful for builders that automatically fill a grid with labels * and components.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @since 1.0.3 */ public static final ColumnSpec LABEL_COMPONENT_GAP_COLSPEC = ColumnSpec.createGap(LayoutStyle.getCurrent().getLabelComponentPadX()); /** * Describes a logical horizontal gap between two related components. * For example the OK and Cancel buttons are considered * related.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #UNRELATED_GAP_COLSPEC */ public static final ColumnSpec RELATED_GAP_COLSPEC = ColumnSpec.createGap(LayoutStyle.getCurrent().getRelatedComponentsPadX()); /** * Describes a logical horizontal gap between two unrelated components.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #RELATED_GAP_COLSPEC */ public static final ColumnSpec UNRELATED_GAP_COLSPEC = ColumnSpec.createGap(LayoutStyle.getCurrent().getUnrelatedComponentsPadX()); /** * Describes a logical horizontal column for a fixed size button. This spec * honors the current layout style's default button minimum width.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #GROWING_BUTTON_COLSPEC */ public static final ColumnSpec BUTTON_COLSPEC = new ColumnSpec(Sizes.bounded(Sizes.PREFERRED, LayoutStyle.getCurrent().getDefaultButtonWidth(), null)); /** * Describes a logical horizontal column for a growing button. This spec * does not use the layout style's default button minimum width.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #BUTTON_COLSPEC */ public static final ColumnSpec GROWING_BUTTON_COLSPEC = new ColumnSpec(ColumnSpec.DEFAULT, BUTTON_COLSPEC.getSize(), ColumnSpec.DEFAULT_GROW); // Frequently used Row Specifications *********************************** /** * An unmodifiable {@code RowSpec} that determines its height by * computing the maximum of all column component minimum heights. * * @see #PREF_ROWSPEC * @see #DEFAULT_ROWSPEC */ public static final RowSpec MIN_ROWSPEC = new RowSpec(Sizes.MINIMUM); /** * An unmodifiable {@code RowSpec} that determines its height by * computing the maximum of all column component preferred heights. * * @see #MIN_ROWSPEC * @see #DEFAULT_ROWSPEC */ public static final RowSpec PREF_ROWSPEC = new RowSpec(Sizes.PREFERRED); /** * An unmodifiable {@code RowSpec} that determines its preferred * height by computing the maximum of all column component preferred heights * and its minimum height by computing all column component minimum heights.

* * Useful to let a column shrink from preferred height to minimum height * if the container space gets scarce. * * @see #MIN_COLSPEC * @see #PREF_COLSPEC */ public static final RowSpec DEFAULT_ROWSPEC = new RowSpec(Sizes.DEFAULT); /** * An unmodifiable {@code RowSpec} that has an initial height * of 0 pixels and that grows. Useful to describe glue rows * that fill the space between other rows. * * @see #GLUE_COLSPEC */ public static final RowSpec GLUE_ROWSPEC = new RowSpec(RowSpec.DEFAULT, Sizes.ZERO, RowSpec.DEFAULT_GROW); // Layout Style Dependent Row Specs ************************************* /** * Describes a logical horizontal gap between a label and an associated * component. Useful for builders that automatically fill a grid with labels * and components.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @since 1.4 */ public static final RowSpec LABEL_COMPONENT_GAP_ROWSPEC = RowSpec.createGap(LayoutStyle.getCurrent().getLabelComponentPadY()); /** * Describes a logical vertical gap between two related components. * For example the OK and Cancel buttons are considered * related.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #UNRELATED_GAP_ROWSPEC */ public static final RowSpec RELATED_GAP_ROWSPEC = RowSpec.createGap(LayoutStyle.getCurrent().getRelatedComponentsPadY()); /** * Describes a logical vertical gap between two unrelated components.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #RELATED_GAP_ROWSPEC */ public static final RowSpec UNRELATED_GAP_ROWSPEC = RowSpec.createGap(LayoutStyle.getCurrent().getUnrelatedComponentsPadY()); /** * Describes a logical vertical narrow gap between two rows in the grid. * Useful if the vertical space is scarce or if an individual vertical gap * shall be small than the default line gap.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #LINE_GAP_ROWSPEC * @see #PARAGRAPH_GAP_ROWSPEC */ public static final RowSpec NARROW_LINE_GAP_ROWSPEC = RowSpec.createGap(LayoutStyle.getCurrent().getNarrowLinePad()); /** * Describes the logical vertical default gap between two rows in the grid. * A little bit larger than the narrow line gap.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #NARROW_LINE_GAP_ROWSPEC * @see #PARAGRAPH_GAP_ROWSPEC */ public static final RowSpec LINE_GAP_ROWSPEC = RowSpec.createGap(LayoutStyle.getCurrent().getLinePad()); /** * Describes the logical vertical default gap between two paragraphs in * the layout grid. This gap is larger than the default line gap.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @see #NARROW_LINE_GAP_ROWSPEC * @see #LINE_GAP_ROWSPEC */ public static final RowSpec PARAGRAPH_GAP_ROWSPEC = RowSpec.createGap(LayoutStyle.getCurrent().getParagraphPad()); /** * Describes a logical row for a fixed size button. This spec * honors the current layout style's default button minimum height.

* * Note: In a future version this constant will likely * be moved to a class {@code LogicalSize} or {@code StyledSize}. * * @since 1.2 */ public static final RowSpec BUTTON_ROWSPEC = new RowSpec(Sizes.bounded(Sizes.PREFERRED, LayoutStyle.getCurrent().getDefaultButtonHeight(), null)); } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/ColumnSpec.java0000644000175000017500000002476011751010232025605 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkNotBlank; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** * Specifies columns in FormLayout by their default orientation, * start size and resizing behavior.

* * Examples:
* The following examples specify a column with FILL alignment, a size of * 10 dlu that won't grow. *

 * new ColumnSpec(Sizes.dluX(10));
 * new ColumnSpec(ColumnSpec.FILL, Sizes.dluX(10), 0.0);
 * new ColumnSpec(ColumnSpec.FILL, Sizes.dluX(10), ColumnSpec.NO_GROW);
 * ColumnSpec.parse("10dlu");
 * ColumnSpec.parse("10dlu:0");
 * ColumnSpec.parse("fill:10dlu:0");
 * 

* * The {@link com.jgoodies.forms.layout.FormSpecs} provides * predefined frequently used ColumnSpec instances. * * @author Karsten Lentzsch * @version $Revision: 1.20 $ * * @see com.jgoodies.forms.layout.FormSpecs */ public final class ColumnSpec extends FormSpec { // Horizontal Orientations ********************************************* /** * By default put components in the left. */ public static final DefaultAlignment LEFT = FormSpec.LEFT_ALIGN; /** * By default put the components in the center. */ public static final DefaultAlignment CENTER = FormSpec.CENTER_ALIGN; /** * By default put components in the right. */ public static final DefaultAlignment RIGHT = FormSpec.RIGHT_ALIGN; /** * By default fill the component into the column. */ public static final DefaultAlignment FILL = FormSpec.FILL_ALIGN; /** * Unless overridden the default alignment for a column is FILL. */ public static final DefaultAlignment DEFAULT = FILL; // Cache ****************************************************************** /** * Maps encoded column specifications to ColumnSpec instances. */ private static final Map CACHE = new HashMap(); // Instance Creation **************************************************** /** * Constructs a ColumnSpec for the given default alignment, * size and resize weight.

* * The resize weight must be a non-negative double; you can use * {@code NO_GROW} as a convenience value for no resize. * * @param defaultAlignment the column's default alignment * @param size constant, component size or bounded size * @param resizeWeight the column's non-negative resize weight * * @throws NullPointerException if the {@code size} is {@code null} * @throws IllegalArgumentException if the size is invalid or * the {@code resizeWeight} is negative */ public ColumnSpec(DefaultAlignment defaultAlignment, Size size, double resizeWeight) { super(defaultAlignment, size, resizeWeight); } /** * Constructs a ColumnSpec for the given size using the * default alignment, and no resizing. * * @param size constant size, component size, or bounded size * @throws IllegalArgumentException if the size is invalid */ public ColumnSpec(Size size) { super(DEFAULT, size, NO_GROW); } /** * Constructs a ColumnSpec from the specified encoded description. * The description will be parsed to set initial values.

* * Unlike the factory method {@link #decode(String)}, this constructor * does not expand layout variables, and it cannot vend cached objects. * * @param encodedDescription the encoded description */ private ColumnSpec(String encodedDescription) { super(DEFAULT, encodedDescription); } // Factory Methods ******************************************************** /** * Creates and returns a {@link ColumnSpec} that represents a gap with the * specified {@link ConstantSize}. * * @param gapWidth specifies the gap width * @return a ColumnSpec that describes a horizontal gap * * @throws NullPointerException if {@code gapWidth} is {@code null} * * @since 1.2 */ public static ColumnSpec createGap(ConstantSize gapWidth) { return new ColumnSpec(DEFAULT, gapWidth, FormSpec.NO_GROW); } /** * Parses the encoded column specification and returns a ColumnSpec object * that represents the string. Variables are expanded using the default * LayoutMap. * * @param encodedColumnSpec the encoded column specification * * @return a ColumnSpec instance for the given specification * @throws NullPointerException if {@code encodedColumnSpec} is {@code null} * * @see #decode(String, LayoutMap) * @see LayoutMap#getRoot() * * @since 1.2 */ public static ColumnSpec decode(String encodedColumnSpec) { return decode(encodedColumnSpec, LayoutMap.getRoot()); } /** * Parses the encoded column specifications and returns a ColumnSpec object * that represents the string. Variables are expanded using the given * LayoutMap. * * @param encodedColumnSpec the encoded column specification * @param layoutMap expands layout column variables * * @return a ColumnSpec instance for the given specification * @throws NullPointerException if {@code encodedColumnSpec} or * {@code layoutMap} is {@code null} * @throws IllegalArgumentException if {@code encodedColumnSpec} is empty * or whitespace * * @see #decodeSpecs(String, LayoutMap) * * @since 1.2 */ public static ColumnSpec decode(String encodedColumnSpec, LayoutMap layoutMap) { checkNotBlank(encodedColumnSpec, "The encoded column specification must not be null, empty or whitespace."); checkNotNull(layoutMap, "The LayoutMap must not be null."); String trimmed = encodedColumnSpec.trim(); String lower = trimmed.toLowerCase(Locale.ENGLISH); return decodeExpanded(layoutMap.expand(lower, true)); } /** * Decodes an expanded, trimmed, lower case column spec. * Called by the public ColumnSpec factory methods. * Looks up and returns the ColumnSpec object from the cache - if any, * or constructs and returns a new ColumnSpec instance. * * @param expandedTrimmedLowerCaseSpec the encoded column specification * @return a ColumnSpec for the given encoded column spec */ static ColumnSpec decodeExpanded(String expandedTrimmedLowerCaseSpec) { ColumnSpec spec = (ColumnSpec) CACHE.get(expandedTrimmedLowerCaseSpec); if (spec == null) { spec = new ColumnSpec(expandedTrimmedLowerCaseSpec); CACHE.put(expandedTrimmedLowerCaseSpec, spec); } return spec; } /** * Parses and splits encoded column specifications using the default * {@link LayoutMap} and returns an array of ColumnSpec objects. * * @param encodedColumnSpecs comma separated encoded column specifications * @return an array of decoded column specifications * @throws NullPointerException if {@code encodedColumnSpecs} is {@code null} * * @see #decodeSpecs(String, LayoutMap) * @see #decode(String) * @see LayoutMap#getRoot() */ public static ColumnSpec[] decodeSpecs(String encodedColumnSpecs) { return decodeSpecs(encodedColumnSpecs, LayoutMap.getRoot()); } /** * Splits and parses the encoded column specifications using the given * {@link LayoutMap} and returns an array of ColumnSpec objects. * * @param encodedColumnSpecs comma separated encoded column specifications * @param layoutMap expands layout column variables * @return an array of decoded column specifications * @throws NullPointerException if {@code encodedColumnSpecs} or * {@code layoutMap} is {@code null} * * @see #decodeSpecs(String) * @see #decode(String, LayoutMap) * * @since 1.2 */ public static ColumnSpec[] decodeSpecs(String encodedColumnSpecs, LayoutMap layoutMap) { return FormSpecParser.parseColumnSpecs(encodedColumnSpecs, layoutMap); } // Implementing Abstract Behavior *************************************** /** * Returns if this is a horizontal specification (vs. vertical). * Used to distinct between horizontal and vertical dialog units, * which have different conversion factors. * * @return always {@code true} (for horizontal) */ @Override protected boolean isHorizontal() { return true; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/RowSpec.java0000644000175000017500000002412111751010232025106 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkNotBlank; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** * Specifies rows in FormLayout by their default orientation, * start size and resizing behavior.

* * Examples:
* The following examples specify a centered row with a size of 14 dlu * that won't grow. *

 * new RowSpec(Sizes.dluX(14));
 * new RowSpec(RowSpec.CENTER, Sizes.dluX(14), 0.0);
 * new RowSpec(rowSpec.CENTER, Sizes.dluX(14), RowSpec.NO_GROW);
 * RowSpec.parse("14dlu");
 * RowSpec.parse("14dlu:0");
 * RowSpec.parse("center:14dlu:0");
 * 

* * The {@link com.jgoodies.forms.layout.FormSpecs} provides * predefined frequently used RowSpec instances. * * @author Karsten Lentzsch * @version $Revision: 1.20 $ * * @see com.jgoodies.forms.layout.FormSpecs */ public final class RowSpec extends FormSpec { // Vertical Orientations ************************************************ /** * By default put the components in the top. */ public static final DefaultAlignment TOP = FormSpec.TOP_ALIGN; /** * By default put the components in the center. */ public static final DefaultAlignment CENTER = FormSpec.CENTER_ALIGN; /** * By default put the components in the bottom. */ public static final DefaultAlignment BOTTOM = FormSpec.BOTTOM_ALIGN; /** * By default fill the component into the row. */ public static final DefaultAlignment FILL = FormSpec.FILL_ALIGN; /** * Unless overridden the default alignment for a row is CENTER. */ public static final DefaultAlignment DEFAULT = CENTER; // Cache ****************************************************************** /** * Maps encoded row specifications to RowSpec instances. */ private static final Map CACHE = new HashMap(); // Instance Creation **************************************************** /** * Constructs a RowSpec from the given default orientation, * size, and resize weight.

* * The resize weight must be a non-negative double; you can use * {@code NO_FILL} as a convenience value for no resize. * * @param defaultAlignment the row's default alignment * @param size constant size, component size, or bounded size * @param resizeWeight the row's non-negative resize weight * @throws IllegalArgumentException if the size is invalid or * the resize weight is negative */ public RowSpec(DefaultAlignment defaultAlignment, Size size, double resizeWeight) { super(defaultAlignment, size, resizeWeight); } /** * Constructs a RowSpec for the given size using the * default alignment, and no resizing. * * @param size constant size, component size, or bounded size * @throws IllegalArgumentException if the size is invalid */ public RowSpec(Size size) { super(DEFAULT, size, NO_GROW); } /** * Constructs a RowSpec from the specified encoded description. * The description will be parsed to set initial values.

* * Unlike the factory method {@link #decode(String)}, this constructor * does not expand layout variables, and it cannot vend cached objects. * * @param encodedDescription the encoded description */ private RowSpec(String encodedDescription) { super(DEFAULT, encodedDescription); } // Factory Methods ******************************************************** /** * Creates and returns a {@link RowSpec} that represents a gap with the * specified {@link ConstantSize}. * * @param gapHeight specifies the gap height * @return a RowSpec that describes a vertical gap with the given height * * @throws NullPointerException if {@code gapHeight} is {@code null} * * @since 1.2 */ public static RowSpec createGap(ConstantSize gapHeight) { return new RowSpec(RowSpec.DEFAULT, gapHeight, FormSpec.NO_GROW); } /** * Parses the encoded row specification and returns a RowSpec object * that represents the string. Variables are expanded using the default * LayoutMap. * * @param encodedRowSpec the encoded row specification * * @return a RowSpec instance for the given specification * @throws NullPointerException if {@code encodedRowSpec} is {@code null} * * @see #decode(String, LayoutMap) * @see LayoutMap#getRoot() * * @since 1.2 */ public static RowSpec decode(String encodedRowSpec) { return decode(encodedRowSpec, LayoutMap.getRoot()); } /** * Parses the encoded row specifications and returns a RowSpec object * that represents the string. Variables are expanded using the given * LayoutMap. * * @param encodedRowSpec the encoded column specification * @param layoutMap expands layout row variables * * @return a RowSpec instance for the given specification * @throws NullPointerException if {@code encodedRowSpec} or * {@code layoutMap} is {@code null} * * @see #decodeSpecs(String, LayoutMap) * * @since 1.2 */ public static RowSpec decode(String encodedRowSpec, LayoutMap layoutMap) { checkNotBlank(encodedRowSpec, "The encoded row specification must not be null, empty or whitespace."); checkNotNull(layoutMap, "The LayoutMap must not be null."); String trimmed = encodedRowSpec.trim(); String lower = trimmed.toLowerCase(Locale.ENGLISH); return decodeExpanded(layoutMap.expand(lower, false)); } /** * Decodes an expanded, trimmed, lower case row spec. * Called by the public RowSpec factory methods. * Looks up and returns the RowSpec object from the cache - if any, * or constructs and returns a new RowSpec instance. * * @param expandedTrimmedLowerCaseSpec the encoded column specification * @return a RowSpec for the given encoded row spec */ static RowSpec decodeExpanded(String expandedTrimmedLowerCaseSpec) { RowSpec spec = (RowSpec) CACHE.get(expandedTrimmedLowerCaseSpec); if (spec == null) { spec = new RowSpec(expandedTrimmedLowerCaseSpec); CACHE.put(expandedTrimmedLowerCaseSpec, spec); } return spec; } /** * Parses and splits encoded row specifications using the default * {@link LayoutMap} and returns an array of RowSpec objects. * * @param encodedRowSpecs comma separated encoded row specifications * @return an array of decoded row specifications * @throws NullPointerException if {@code encodedRowSpecs} is {@code null} * * @see #decodeSpecs(String, LayoutMap) * @see #decode(String) * @see LayoutMap#getRoot() */ public static RowSpec[] decodeSpecs(String encodedRowSpecs) { return decodeSpecs(encodedRowSpecs, LayoutMap.getRoot()); } /** * Parses and splits encoded row specifications using the given * {@link LayoutMap} and returns an array of RowSpec objects. * * @param encodedRowSpecs comma separated encoded row specifications * @param layoutMap expands layout row variables * @return an array of decoded row specifications * * @throws NullPointerException {@code encodedRowSpecs} or * {@code layoutMap} is {@code null} * * @see RowSpec#RowSpec(String) * * @since 1.2 */ public static RowSpec[] decodeSpecs(String encodedRowSpecs, LayoutMap layoutMap) { return FormSpecParser.parseRowSpecs(encodedRowSpecs, layoutMap); } // Implementing Abstract Behavior *************************************** /** * Returns if this is a horizontal specification (vs. vertical). * Used to distinct between horizontal and vertical dialog units, * which have different conversion factors. * * @return always {@code false} (for vertical) */ @Override protected boolean isHorizontal() { return false; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/Sizes.java0000644000175000017500000004150411731041742024635 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.awt.Component; import java.awt.Container; import java.io.Serializable; import java.util.Iterator; import java.util.List; import java.util.Locale; import com.jgoodies.forms.layout.ConstantSize.Unit; import com.jgoodies.forms.util.DefaultUnitConverter; import com.jgoodies.forms.util.UnitConverter; /** * Consists only of static methods that create and convert sizes * as required by the FormLayout. The conversion of sizes * that are not based on pixel is delegated to an implementation * of {@link UnitConverter}. The conversion methods require the * layout container as parameter to read its current font and resolution. * * @author Karsten Lentzsch * @version $Revision: 1.19 $ * * @see Size * @see UnitConverter * @see DefaultUnitConverter */ public final class Sizes { // Common Constant Sizes ************************************************ public static final ConstantSize ZERO = pixel(0); public static final ConstantSize DLUX1 = dluX( 1); public static final ConstantSize DLUX2 = dluX( 2); public static final ConstantSize DLUX3 = dluX( 3); public static final ConstantSize DLUX4 = dluX( 4); public static final ConstantSize DLUX5 = dluX( 5); public static final ConstantSize DLUX6 = dluX( 6); public static final ConstantSize DLUX7 = dluX( 7); public static final ConstantSize DLUX8 = dluX( 8); public static final ConstantSize DLUX9 = dluX( 9); public static final ConstantSize DLUX11 = dluX(11); public static final ConstantSize DLUX14 = dluX(14); /** * 21 horizontal dialog units. * @since 1.2 */ public static final ConstantSize DLUX21 = dluX(21); public static final ConstantSize DLUY1 = dluY( 1); public static final ConstantSize DLUY2 = dluY( 2); public static final ConstantSize DLUY3 = dluY( 3); public static final ConstantSize DLUY4 = dluY( 4); public static final ConstantSize DLUY5 = dluY( 5); public static final ConstantSize DLUY6 = dluY( 6); public static final ConstantSize DLUY7 = dluY( 7); public static final ConstantSize DLUY8 = dluY( 8); public static final ConstantSize DLUY9 = dluY( 9); public static final ConstantSize DLUY11 = dluY(11); public static final ConstantSize DLUY14 = dluY(14); /** * 21 vertical dialog units. * @since 1.2 */ public static final ConstantSize DLUY21 = dluY(21); // Static Component Sizes *********************************************** /** * Use the maximum of all component minimum sizes as column or row size. */ public static final ComponentSize MINIMUM = new ComponentSize("minimum"); /** * Use the maximum of all component preferred sizes as column or row size. */ public static final ComponentSize PREFERRED = new ComponentSize("preferred"); /** * Use the maximum of all component sizes as column or row size; * measures preferred sizes when asked for the preferred size * and minimum sizes when asked for the minimum size. */ public static final ComponentSize DEFAULT = new ComponentSize("default"); /** * An array of all enumeration values used to canonicalize * deserialized component sizes. */ private static final ComponentSize[] VALUES = { MINIMUM, PREFERRED, DEFAULT}; // Singleton State ******************************************************* /** * Holds the current converter that maps non-pixel sizes to pixels. * * @see #setUnitConverter(UnitConverter) */ private static UnitConverter unitConverter; /** * Holds the Unit that is used if no Unit is provided in encoded * ConstantSizes. * * @see #setDefaultUnit(ConstantSize.Unit) */ private static Unit defaultUnit = ConstantSize.PIXEL; // Instance Creation ****************************************************** private Sizes() { // Suppresses default constructor, prevents instantiation. } // Creation of Size Instances ********************************************* /** * Creates and returns an instance of {@code ConstantSize} from the * given encoded size and unit description. * * @param encodedValueAndUnit value and unit in string representation * @param horizontal true for horizontal, false for vertical * @return a {@code ConstantSize} for the given value and unit */ public static ConstantSize constant(String encodedValueAndUnit, boolean horizontal) { String lowerCase = encodedValueAndUnit.toLowerCase(Locale.ENGLISH); String trimmed = lowerCase.trim(); return ConstantSize.valueOf(trimmed, horizontal); } /** * Creates and returns a ConstantSize for the specified value * in horizontal dialog units. * * @param value size value in horizontal dialog units * @return the associated {@code ConstantSize} */ public static ConstantSize dluX(int value) { return ConstantSize.dluX(value); } /** * Creates and returns a ConstantSize for the specified value * in vertical dialog units. * * @param value size value in vertical dialog units * @return the associated {@code ConstantSize} */ public static ConstantSize dluY(int value) { return ConstantSize.dluY(value); } /** * Creates and returns a ConstantSize * for the specified pixel value. * * @param value value in pixel * @return the associated {@code ConstantSize} */ public static ConstantSize pixel(int value) { return new ConstantSize(value, ConstantSize.PIXEL); } /** * Creates and returns a BoundedSize for the given basis * using the specified lower and upper bounds. * * @param basis the base size * @param lowerBound the lower bound size * @param upperBound the upper bound size * @return a {@code BoundedSize} for the given basis and bounds * @throws NullPointerException if {@code basis} is {@code null}, * or if both {@code lowerBound} and {@code upperBound} are {@code null}. */ public static Size bounded(Size basis, Size lowerBound, Size upperBound) { return new BoundedSize(basis, lowerBound, upperBound); } // Unit Conversion ****************************************************** /** * Converts Inches and returns pixels using the specified resolution. * * @param in the Inches * @param component the component that provides the graphics object * @return the given Inches as pixels */ public static int inchAsPixel(double in, Component component) { return in == 0d ? 0 : getUnitConverter().inchAsPixel(in, component); } /** * Converts Millimeters and returns pixels using the resolution of the * given component's graphics object. * * @param mm Millimeters * @param component the component that provides the graphics object * @return the given Millimeters as pixels */ public static int millimeterAsPixel(double mm, Component component) { return mm == 0d ? 0 : getUnitConverter().millimeterAsPixel(mm, component); } /** * Converts Centimeters and returns pixels using the resolution of the * given component's graphics object. * * @param cm Centimeters * @param component the component that provides the graphics object * @return the given Centimeters as pixels */ public static int centimeterAsPixel(double cm, Component component) { return cm == 0d ? 0 : getUnitConverter().centimeterAsPixel(cm, component); } /** * Converts DTP Points and returns pixels using the resolution of the * given component's graphics object. * * @param pt DTP Points * @param component the component that provides the graphics object * @return the given Points as pixels */ public static int pointAsPixel(int pt, Component component) { return pt == 0 ? 0 : getUnitConverter().pointAsPixel(pt, component); } /** * Converts horizontal dialog units and returns pixels. * Honors the resolution, dialog font size, platform, and l&f. * * @param dluX the horizontal dialog units * @param component the component that provides the graphics object * @return the given horizontal dialog units as pixels */ public static int dialogUnitXAsPixel(int dluX, Component component) { return dluX == 0 ? 0 : getUnitConverter().dialogUnitXAsPixel(dluX, component); } /** * Converts vertical dialog units and returns pixels. * Honors the resolution, dialog font size, platform, and l&f. * * @param dluY the vertical dialog units * @param component the component that provides the graphics object * @return the given vertical dialog units as pixels */ public static int dialogUnitYAsPixel(int dluY, Component component) { return dluY == 0 ? 0 : getUnitConverter().dialogUnitYAsPixel(dluY, component); } // Accessing the Unit Converter ******************************************* /** * Returns the current {@link UnitConverter}. If it has not been initialized * before it will get an instance of {@link DefaultUnitConverter}. * * @return the current {@code UnitConverter} */ public static UnitConverter getUnitConverter() { if (unitConverter == null) { unitConverter = DefaultUnitConverter.getInstance(); } return unitConverter; } /** * Sets a new UnitConverter that will be used to convert * font-dependent sizes to pixel sizes. * * @param newUnitConverter the unit converter to be set */ public static void setUnitConverter(UnitConverter newUnitConverter) { unitConverter = newUnitConverter; } // Default Unit *********************************************************** /** * Returns the Unit that is used if an encoded ConstantSize contains * no unit string. * * @return the Unit if no unit string is provided * * @since 1.2 */ public static Unit getDefaultUnit() { return defaultUnit; } /** * Sets the Unit that shall be used if an encoded ConstantSize * provides no unit string. * * @param unit the new default Unit, {@code null} for dialog units * * @throws IllegalArgumentException if {@code unit} is * {@link ConstantSize#DLUX} or {@link ConstantSize#DLUY}. * * @since 1.2 */ public static void setDefaultUnit(Unit unit) { if ((unit == ConstantSize.DLUX) || (unit == ConstantSize.DLUY)) { throw new IllegalArgumentException( "The unit must not be DLUX or DLUY. " + "To use DLU as default unit, invoke this method with null."); } defaultUnit = unit; } // Helper Class ********************************************************* /** * An ordinal-based serializable typesafe enumeration that implements * the {@link Size} interface for the component sizes: * min, pref, default. */ static final class ComponentSize implements Size, Serializable { private final transient String name; private ComponentSize(String name) { this.name = name; } /** * Returns an instance of {@code ComponentSize} that corresponds * to the specified string. * @param str the encoded component size * @return the corresponding ComponentSize or null if none matches */ static ComponentSize valueOf(String str) { if (str.equals("m") || str.equals("min")) { return MINIMUM; } if (str.equals("p") || str.equals("pref")) { return PREFERRED; } if (str.equals("d") || str.equals("default")) { return DEFAULT; } return null; } /** * Computes the maximum size for the given list of components, using * this form spec and the specified measure. *

* Invoked by FormLayout to determine the size of one of my elements * * @param container the layout container * @param components the list of components to measure * @param minMeasure the measure used to determine the minimum size * @param prefMeasure the measure used to determine the preferred size * @param defaultMeasure the measure used to determine the default size * @return the maximum size in pixels for the given list of components */ @Override public int maximumSize( Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure) { FormLayout.Measure measure = this == MINIMUM ? minMeasure : (this == PREFERRED ? prefMeasure : defaultMeasure); int maximum = 0; for (Iterator i = components.iterator(); i.hasNext();) { Component c = (Component) i.next(); maximum = Math.max(maximum, measure.sizeOf(c)); } return maximum; } /** * Describes if this Size can be compressed, if container space gets scarce. * Used by the FormLayout size computations in {@code #compressedSizes} * to check whether a column or row can be compressed or not.

* * The DEFAULT ComponentSize is compressible, MINIMUM and PREFERRED * are incompressible. * * @return {@code true} for the DEFAULT size, * {@code false} otherwise * * @since 1.1 */ @Override public boolean compressible() { return this == DEFAULT; } @Override public String toString() { return encode(); } /** * Returns a parseable string representation of this ComponentSize. * * @return a String that can be parsed by the Forms parser * * @since 1.2 */ @Override public String encode() { return name.substring(0, 1); } // Serialization ***************************************************** private static int nextOrdinal = 0; private final int ordinal = nextOrdinal++; private Object readResolve() { return VALUES[ordinal]; // Canonicalize } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/FormSpec.java0000644000175000017500000005663111731041742025265 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import static com.jgoodies.common.base.Preconditions.checkArgument; import static com.jgoodies.common.base.Preconditions.checkNotBlank; import static com.jgoodies.common.base.Preconditions.checkNotNull; import java.awt.Container; import java.io.Serializable; import java.util.List; import java.util.Locale; import java.util.regex.Pattern; /** * An abstract class that specifies columns and rows in FormLayout * by their default alignment, start size and resizing behavior. * API users will use the subclasses {@link ColumnSpec} and {@link RowSpec}.

* * Also implements the parser for encoded column and row specifications * and provides parser convenience behavior for its subclasses ColumnSpec * and RowSpec.

* * TODO: Consider extracting the parser role to a separate class. * * @author Karsten Lentzsch * @version $Revision: 1.25 $ * * @see ColumnSpec * @see RowSpec * @see FormLayout * @see CellConstraints */ public abstract class FormSpec implements Serializable { // Horizontal and Vertical Default Alignments *************************** /** * By default put components in the left. */ static final DefaultAlignment LEFT_ALIGN = new DefaultAlignment("left"); /** * By default put components in the right. */ static final DefaultAlignment RIGHT_ALIGN = new DefaultAlignment("right"); /** * By default put the components in the top. */ static final DefaultAlignment TOP_ALIGN = new DefaultAlignment("top"); /** * By default put the components in the bottom. */ static final DefaultAlignment BOTTOM_ALIGN = new DefaultAlignment("bottom"); /** * By default put the components in the center. */ static final DefaultAlignment CENTER_ALIGN = new DefaultAlignment("center"); /** * By default fill the column or row. */ static final DefaultAlignment FILL_ALIGN = new DefaultAlignment("fill"); /** * An array of all enumeration values used to canonicalize * deserialized default alignments. */ private static final DefaultAlignment[] VALUES = { LEFT_ALIGN, RIGHT_ALIGN, TOP_ALIGN, BOTTOM_ALIGN, CENTER_ALIGN, FILL_ALIGN}; // Resizing Weights ***************************************************** /** * Gives a column or row a fixed size. */ public static final double NO_GROW = 0.0d; /** * The default resize weight. */ public static final double DEFAULT_GROW = 1.0d; // Parser Patterns ****************************************************** private static final Pattern TOKEN_SEPARATOR_PATTERN = Pattern.compile(":"); private static final Pattern BOUNDS_SEPARATOR_PATTERN = Pattern.compile("\\s*,\\s*"); // Fields *************************************************************** /** * Holds the default alignment that will be used if a cell does not * override this default. */ private DefaultAlignment defaultAlignment; /** * Holds the size that describes how to size this column or row. */ private Size size; /** * Holds the resize weight; is 0 if not used. */ private double resizeWeight; // Instance Creation **************************************************** /** * Constructs a {@code FormSpec} for the given default alignment, * size, and resize weight. The resize weight must be a non-negative * double; you can use {@code NONE} as a convenience value for no * resize. * * @param defaultAlignment the spec's default alignment * @param size a constant, component or bounded size * @param resizeWeight the spec resize weight * * @throws NullPointerException if the {@code size} is {@code null} * @throws IllegalArgumentException if the {@code resizeWeight} is negative */ protected FormSpec(DefaultAlignment defaultAlignment, Size size, double resizeWeight) { checkNotNull(size, "The size must not be null."); checkArgument(resizeWeight >= 0, "The resize weight must be non-negative."); this.defaultAlignment = defaultAlignment; this.size = size; this.resizeWeight = resizeWeight; } /** * Constructs a FormSpec from the specified encoded description. * The description will be parsed to set initial values. * * @param defaultAlignment the default alignment * @param encodedDescription the encoded description */ protected FormSpec(DefaultAlignment defaultAlignment, String encodedDescription) { this(defaultAlignment, Sizes.DEFAULT, NO_GROW); parseAndInitValues(encodedDescription.toLowerCase(Locale.ENGLISH)); } // Public API *********************************************************** /** * Returns the default alignment. * * @return the default alignment */ public final DefaultAlignment getDefaultAlignment() { return defaultAlignment; } /** * Returns the size. * * @return the size */ public final Size getSize() { return size; } /** * Returns the current resize weight. * * @return the resize weight. */ public final double getResizeWeight() { return resizeWeight; } /** * Checks and answers whether this spec can grow or not. * That is the case if and only if the resize weight is * != {@code NO_GROW}. * * @return true if it can grow, false if it can't grow */ final boolean canGrow() { return getResizeWeight() != NO_GROW; } // Abstract Behavior **************************************************** /** * Returns if this is a horizontal specification (vs. vertical). * Used to distinct between horizontal and vertical dialog units, * which have different conversion factors. * @return true for horizontal, false for vertical */ abstract boolean isHorizontal(); // Setting Values ********************************************************* void setDefaultAlignment(DefaultAlignment defaultAlignment) { this.defaultAlignment = defaultAlignment; } void setSize(Size size) { this.size = size; } void setResizeWeight(double resizeWeight) { this.resizeWeight = resizeWeight; } // Parsing ************************************************************** /** * Parses an encoded form specification and initializes all required fields. * The encoded description must be in lower case. * * @param encodedDescription the FormSpec in an encoded format * * @throws NullPointerException if {@code encodedDescription} is {@code null} * @throws IllegalArgumentException if {@code encodedDescription} * is empty, whitespace, has no size, or is otherwise invalid */ private void parseAndInitValues(String encodedDescription) { checkNotBlank(encodedDescription, "The encoded form specification must not be null, empty or whitespace."); String[] token = TOKEN_SEPARATOR_PATTERN.split(encodedDescription); checkArgument(token.length > 0, "The form spec must not be empty."); int nextIndex = 0; String next = token[nextIndex++]; // Check if the first token is an orientation. DefaultAlignment alignment = DefaultAlignment.valueOf(next, isHorizontal()); if (alignment != null) { setDefaultAlignment(alignment); checkArgument(token.length > 1, "The form spec must provide a size."); next = token[nextIndex++]; } setSize(parseSize(next)); if (nextIndex < token.length) { setResizeWeight(parseResizeWeight(token[nextIndex])); } } /** * Parses an encoded size spec and returns the size. * * @param token a token that represents a size, either bounded or plain * @return the decoded Size */ private Size parseSize(String token) { if (token.startsWith("[") && token.endsWith("]")) { return parseBoundedSize(token); } if (token.startsWith("max(") && token.endsWith(")")) { return parseOldBoundedSize(token, false); } if (token.startsWith("min(") && token.endsWith(")")) { return parseOldBoundedSize(token, true); } return parseAtomicSize(token); } private Size parseBoundedSize(String token) { String content = token.substring(1, token.length()-1); String[] subtoken = BOUNDS_SEPARATOR_PATTERN.split(content); Size basis = null; Size lower = null; Size upper = null; if (subtoken.length == 2) { Size size1 = parseAtomicSize(subtoken[0]); Size size2 = parseAtomicSize(subtoken[1]); if (isConstant(size1)) { if (isConstant(size2)) { lower = size1; basis = size2; upper = size2; } else { lower = size1; basis = size2; } } else { basis = size1; upper = size2; } } else if (subtoken.length == 3) { lower = parseAtomicSize(subtoken[0]); basis = parseAtomicSize(subtoken[1]); upper = parseAtomicSize(subtoken[2]); } if ( (lower == null || isConstant(lower)) && (upper == null || isConstant(upper))) { return new BoundedSize(basis, lower, upper); } throw new IllegalArgumentException( "Illegal bounded size '" + token + "'. Must be one of:" + "\n[,] // lower bound" + "\n[,] // upper bound" + "\n[,,] // lower and upper bound." + "\nExamples:" + "\n[50dlu,pref] // lower bound" + "\n[pref,200dlu] // upper bound" + "\n[50dlu,pref,200dlu] // lower and upper bound." ); } /** * Parses an encoded compound size and sets the size fields. * The compound size has format: * max(<atomic size>;<atomic size2>) | min(<atomic size1>;<atomic size2>) * One of the two atomic sizes must be a logical size, the other must * be a size constant. * * @param token a token for a bounded size, e.g. "max(50dlu; pref)" * @param setMax if true we set a maximum size, otherwise a minimum size * @return a Size that represents the parse result */ private Size parseOldBoundedSize(String token, boolean setMax) { int semicolonIndex = token.indexOf(';'); String sizeToken1 = token.substring(4, semicolonIndex); String sizeToken2 = token.substring(semicolonIndex+1, token.length()-1); Size size1 = parseAtomicSize(sizeToken1); Size size2 = parseAtomicSize(sizeToken2); // Check valid combinations and set min or max. if (isConstant(size1)) { if (size2 instanceof Sizes.ComponentSize) { return new BoundedSize(size2, setMax ? null : size1, setMax ? size1 : null); } throw new IllegalArgumentException( "Bounded sizes must not be both constants."); } if (isConstant(size2)) { return new BoundedSize(size1, setMax ? null : size2, setMax ? size2 : null); } throw new IllegalArgumentException( "Bounded sizes must not be both logical."); } /** * Decodes and returns an atomic size that is either a constant size or a * component size. * * @param token the encoded size * @return the decoded size either a constant or component size */ private Size parseAtomicSize(String token) { String trimmedToken = token.trim(); if ( trimmedToken.startsWith("'") && trimmedToken.endsWith("'")) { int length = trimmedToken.length(); if (length < 2) { throw new IllegalArgumentException("Missing closing \"'\" for prototype."); } return new PrototypeSize(trimmedToken.substring(1, length - 1)); } Sizes.ComponentSize componentSize = Sizes.ComponentSize.valueOf(trimmedToken); if (componentSize != null) { return componentSize; } return ConstantSize.valueOf(trimmedToken, isHorizontal()); } /** * Decodes an encoded resize mode and resize weight and answers * the resize weight. * * @param token the encoded resize weight * @return the decoded resize weight * @throws IllegalArgumentException if the string description is an * invalid string representation */ private static double parseResizeWeight(String token) { if (token.equals("g") || token.equals("grow")) { return DEFAULT_GROW; } if (token.equals("n") || token.equals("nogrow") || token.equals("none")) { return NO_GROW; } // Must have format: grow() if ((token.startsWith("grow(") || token.startsWith("g(")) && token.endsWith(")")) { int leftParen = token.indexOf('('); int rightParen = token.indexOf(')'); String substring = token.substring(leftParen + 1, rightParen); return Double.parseDouble(substring); } throw new IllegalArgumentException( "The resize argument '" + token + "' is invalid. " + " Must be one of: grow, g, none, n, grow(), g()"); } private static boolean isConstant(Size aSize) { return aSize instanceof ConstantSize || aSize instanceof PrototypeSize; } // Misc ***************************************************************** /** * Returns a string representation of this form specification. * The string representation consists of three elements separated by * a colon (":"), first the alignment, second the size, * and third the resize spec.

* * This method does not return an encoded version * of this object; the contrary is the case. Many instances * will return a string that cannot be parsed.

* * Note: The string representation may change at any time. * For parsing use {@link #encode()} instead. * * @return a string representation of the form specification. */ @Override public final String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(defaultAlignment); buffer.append(":"); buffer.append(size.toString()); buffer.append(':'); if (resizeWeight == NO_GROW) { buffer.append("noGrow"); } else if (resizeWeight == DEFAULT_GROW) { buffer.append("grow"); } else { buffer.append("grow("); buffer.append(resizeWeight); buffer.append(')'); } return buffer.toString(); } /** * Returns a string representation of this form specification. * The string representation consists of three elements separated by * a colon (":"), first the alignment, second the size, * and third the resize spec.

* * This method does not return an encoded version * of this object; the contrary is the case. Many instances * will return a string that cannot be parsed.

* * Note: The string representation may change at any time. * For parsing use {@link #encode()} instead. * * @return a string representation of the form specification. */ public final String toShortString() { StringBuffer buffer = new StringBuffer(); buffer.append(defaultAlignment.abbreviation()); buffer.append(":"); buffer.append(size.toString()); buffer.append(':'); if (resizeWeight == NO_GROW) { buffer.append("n"); } else if (resizeWeight == DEFAULT_GROW) { buffer.append("g"); } else { buffer.append("g("); buffer.append(resizeWeight); buffer.append(')'); } return buffer.toString(); } /** * Returns a short and parseable string representation of this * form specification. The string will omit the alignment and resize * specifications if these are the default values.

* * @return a string representation of the form specification. * * @see #toShortString() for a more verbose string representation * * @since 1.2 */ public final String encode() { StringBuffer buffer = new StringBuffer(); DefaultAlignment alignmentDefault = isHorizontal() ? ColumnSpec.DEFAULT : RowSpec.DEFAULT; if (!alignmentDefault.equals(defaultAlignment)) { buffer.append(defaultAlignment.abbreviation()); buffer.append(":"); } buffer.append(size.encode()); if (resizeWeight == NO_GROW) { // Omit the resize part } else if (resizeWeight == DEFAULT_GROW) { buffer.append(':'); buffer.append("g"); } else { buffer.append(':'); buffer.append("g("); buffer.append(resizeWeight); buffer.append(')'); } return buffer.toString(); } // Helper Code ********************************************************** /** * Computes the maximum size for the given list of components, using * this form spec and the specified measure.

* * Invoked by FormLayout to determine the size of one of my elements * * @param container the layout container * @param components the list of components to measure * @param minMeasure the measure used to determine the minimum size * @param prefMeasure the measure used to determine the preferred size * @param defaultMeasure the measure used to determine the default size * @return the maximum size in pixels */ final int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure) { return size.maximumSize(container, components, minMeasure, prefMeasure, defaultMeasure); } /** * An ordinal-based serializable typesafe enumeration for the * column and row default alignment types. */ public static final class DefaultAlignment implements Serializable { private final transient String name; private DefaultAlignment(String name) { this.name = name; } /** * Returns a DefaultAlignment that corresponds to the specified * string, null if no such alignment exists. * * @param str the encoded alignment * @param isHorizontal indicates the values orientation * @return the corresponding DefaultAlignment or null */ private static DefaultAlignment valueOf(String str, boolean isHorizontal) { if (str.equals("f") || str.equals("fill")) { return FILL_ALIGN; } else if (str.equals("c") || str.equals("center")) { return CENTER_ALIGN; } else if (isHorizontal) { if (str.equals("r") || str.equals("right")) { return RIGHT_ALIGN; } else if (str.equals("l") || str.equals("left")) { return LEFT_ALIGN; } else { return null; } } else { if (str.equals("t") || str.equals("top")) { return TOP_ALIGN; } else if (str.equals("b") || str.equals("bottom")) { return BOTTOM_ALIGN; } else { return null; } } } /** * Returns this Alignment's name. * * @return this alignment's name. */ @Override public String toString() { return name; } /** * Returns the first character of this Alignment's name. * Used to identify it in short format strings. * * @return the name's first character. */ public char abbreviation() { return name.charAt(0); } // Serialization ***************************************************** private static int nextOrdinal = 0; private final int ordinal = nextOrdinal++; private Object readResolve() { return VALUES[ordinal]; // Canonicalize } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/layout/Size.java0000644000175000017500000001030311731041742024443 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.awt.Container; import java.util.List; /** * An interface that describes sizes as used by the {@link FormLayout}: * component measuring sizes, constant sizes with value and unit, * and bounded sizes that provide lower and upper bounds for a size.

* * You can find a motivation for the different {@code Size} types in * the Forms whitepaper that is part of the product documentation and that is * available online too, see * * http://www.jgoodies.com/articles/forms.pdf. * * @author Karsten Lentzsch * @version $Revision: 1.12 $ * * @see Sizes * @see ConstantSize */ public interface Size { /** * Computes and returns this Size's maximum pixel size applied to * the given list of components using the specified measures.

* * Invoked by {@link com.jgoodies.forms.layout.FormSpec} to determine * the size of a column or row. This method is not intended to be called * by API users, and it uses API invisible parameter types. * * @param container the layout container * @param components the list of components used to compute the size * @param minMeasure the measure that determines the minimum sizes * @param prefMeasure the measure that determines the preferred sizes * @param defaultMeasure the measure that determines the default sizes * @return the maximum size in pixels for the given list of components */ int maximumSize(Container container, List components, FormLayout.Measure minMeasure, FormLayout.Measure prefMeasure, FormLayout.Measure defaultMeasure); /** * Describes if this Size can be compressed, if container space gets scarce. * Used by the FormLayout size computations in {@code #compressedSizes} * to check whether a column or row can be compressed or not.

* * The ComponentSize default is compressible, as well as * BoundedSizes that are based on the default size. * * @return {@code true} for compressible Sizes * * @since 1.1 */ boolean compressible(); /** * Returns a String respresentation of this Size object that can * be parsed by the Forms parser.

* * Implementors should return a non-verbose string. * * @return a parseable String representation of this object. * * @since 1.2 */ String encode(); } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/extras/0000755000175000017500000000000011731041714022661 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/extras/package.html0000644000175000017500000000515011731041714025143 0ustar tonytony Contains optional Forms framework classes that ship only with the JGoodies Forms source distribution and are not yet part of the binary Forms library. The API of these classes is work in progress and may change without notice. If you want to use a class from this package, you may consider copying it into your codebase.

Related Documentation

For more information see: @see com.jgoodies.forms.layout jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/extras/FormLayoutUtils.java0000644000175000017500000002223411731041714026651 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.extras; import static com.jgoodies.common.base.Preconditions.checkArgument; import java.awt.Component; import java.awt.Container; import java.util.NoSuchElementException; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * Consists only of static methods that provide convenience behavior * for working with the {@code FormLayout}.

* * Note: This class is not part of the binary Form library. * It comes with the Forms distributions as an extra. * The API is work in progress and may change without notice; * this class may even be completely removed from future distributions. * If you want to use this class, you may consider copying it into * your codebase. * * @author Karsten Lentzsch * @version $Revision: 1.12 $ */ public final class FormLayoutUtils { private FormLayoutUtils() { // Override default constructor; prevents instantiation. } // Tests ****************************************************************** /** * Checks and answers whether the given FormLayout container * contains a component in the specified column.

* * For every container child component, we look up the associated * {@code CellConstraints} object from the layout and * compare its horizontal grid origin with the specified column index. * * @param container the layout container * @param columnIndex the index of the column to test * @return true if the column contains a component, false otherwise * @throws IllegalArgumentException if the container's layout is * not a {@code FormLayout} */ public static boolean columnContainsComponent( Container container, int columnIndex) { for (ConstraintIterator iterator = new ConstraintIterator(container); iterator.hasNext(); ) { if (columnIndex == iterator.nextConstraints().gridX) { return true; } } return false; } /** * Checks and answers whether the given FormLayout container * contains a component in the specified row.

* * For every container child component, we look up the associated * {@code CellConstraints} object from the layout and * compare its vertical grid origin with the specified row index. * * @param container the layout container * @param rowIndex the index of the row to test * @return true if the row contains a component, false otherwise * @throws IllegalArgumentException if the container's layout is * not a {@code FormLayout} */ public static boolean rowContainsComponent( Container container, int rowIndex) { for (ConstraintIterator iterator = new ConstraintIterator(container); iterator.hasNext(); ) { if (rowIndex == iterator.nextConstraints().gridY) { return true; } } return false; } /** * Checks and answers whether the specified column is grouped * in the given FormLayout. A column {@code col} is grouped, * if and only if there's a column group group * that includes {@code col}'s index. * * @param layout the layout to be inspected * @param columnIndex the index of the column to be checked * @return true if the column is grouped, false if not */ public static boolean isGroupedColumn(FormLayout layout, int columnIndex) { return isGrouped(layout.getColumnGroups(), columnIndex); } /** * Checks and answers whether the specified row is grouped * in the given FormLayout. A row {@code row} is grouped, * if and only if there's a row group group * that includes {@code row}'s index. * * @param layout the layout to be inspected * @param rowIndex the index of the row to be checked * @return true if the column is grouped, false if not */ public static boolean isGroupedRow(FormLayout layout, int rowIndex) { return isGrouped(layout.getRowGroups(), rowIndex); } // Helper Code *********************************************************** /** * Checks and answers whether the specified index is contained * in one of the given group indices. * * @param allGroupIndices an array of arrays of group indices * @param index the index to be tested * @return true if index is contained in one of the groups */ private static boolean isGrouped(int[][] allGroupIndices, int index) { for (int[] groupIndices : allGroupIndices) { for (int aGroupIndex : groupIndices) { if (index == aGroupIndex) { return true; } } } return false; } /** * Iterates over a FormLayout container's {@code CellConstraints}. * The container's child component collection and the layout's * constraints collection must not be changed during the iteration; * otherwise the behavior of this iterator is unspecified and unsafe. * * @see FormLayout * @see CellConstraints */ public static final class ConstraintIterator { /** * Refers to the FormLayout instance used to look up constraints. */ private final FormLayout layout; /** * Holds a copy of the container's components. */ private final Component[] components; /** * The current index in the component array. * Used to determine whether there are more elements * and to look up the next constraints. */ private int index; // Instance Creation ************************************************* /** * Constructs a ConstraintIterator for the given FormLayout container. * Useful to iterate over the container's {@code CellConstraints}. * * @param container the layout container * @throws IllegalArgumentException if the container's layout is * not a {@code FormLayout} */ public ConstraintIterator(Container container) { checkArgument(container.getLayout() instanceof FormLayout, "The container must use an instance of FormLayout."); layout = (FormLayout) container.getLayout(); components = container.getComponents(); index = 0; } /** * Returns true if the iteration has more elements. (In other * words, returns true if next would return an element * rather than throwing an exception.) * * @return true if the iterator has more elements. */ public boolean hasNext() { return index < components.length; } /** * Returns the next element in the iteration. * * @return the next element in the iteration. * @throws NoSuchElementException iteration has no more elements. */ public CellConstraints nextConstraints() { if (!hasNext()) { throw new NoSuchElementException( "The constraint iterator has no more elements."); } return layout.getConstraints(components[index++]); } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/0000755000175000017500000000000011762200774022337 5ustar tonytonyjgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/package.html0000644000175000017500000000460211731041756024621 0ustar tonytony Consists of Forms framework helper classes for unit conversion and layout styles.

Related Documentation

For more information see: @see com.jgoodies.forms.builder @see com.jgoodies.forms.factories jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/DefaultUnitConverter.java0000644000175000017500000004100611753126102027307 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.util; import static com.jgoodies.common.base.Preconditions.checkNotBlank; import java.awt.Component; import java.awt.Font; import java.awt.FontMetrics; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.UIManager; /** * This is the default implementation of the {@link UnitConverter} interface. * It converts horizontal and vertical dialog base units to pixels.

* * The horizontal base unit is equal to the average width, in pixels, * of the characters in the system font; the vertical base unit is equal * to the height, in pixels, of the font. * Each horizontal base unit is equal to 4 horizontal dialog units; * each vertical base unit is equal to 8 vertical dialog units.

* * The DefaultUnitConverter computes dialog base units using a default font * and a test string for the average character width. You can configure * the font and the test string via the bound Bean properties * defaultDialogFont and averageCharacterWidthTestString. * See also Microsoft's suggestion for a custom computation * custom computation. * More information how to use dialog units in screen design can be found * in Microsoft's * Design * Specifications and Guidelines.

* * Since the Forms 1.1 this converter logs font information at * the {@code CONFIG} level. * * @version $Revision: 1.23 $ * @author Karsten Lentzsch * @see UnitConverter * @see com.jgoodies.forms.layout.Size * @see com.jgoodies.forms.layout.Sizes */ public final class DefaultUnitConverter extends AbstractUnitConverter { public static final String PROPERTY_AVERAGE_CHARACTER_WIDTH_TEST_STRING = "averageCharacterWidthTestString"; public static final String PROPERTY_DEFAULT_DIALOG_FONT = "defaultDialogFont"; /** * @since 1.6 */ public static final String OLD_AVERAGE_CHARACTER_TEST_STRING = "X"; /** * @since 1.4 */ public static final String MODERN_AVERAGE_CHARACTER_TEST_STRING = "abcdefghijklmnopqrstuvwxyz0123456789"; /** * @since 1.4 */ public static final String BALANCED_AVERAGE_CHARACTER_TEST_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static final Logger LOGGER = Logger.getLogger(DefaultUnitConverter.class.getName()); /** * Holds the sole instance that will be lazily instantiated. */ private static DefaultUnitConverter instance; /** * Holds the string that is used to compute the average character width. * Since 1.6 the default value is the balanced average character test * string, where it was just "X" before. */ private String averageCharWidthTestString = BALANCED_AVERAGE_CHARACTER_TEST_STRING; /** * Holds a custom font that is used to compute the global dialog base units. * If not set, a fallback font is is lazily created in method * #getCachedDefaultDialogFont, which in turn looks up a font * in method #lookupDefaultDialogFont. */ private Font defaultDialogFont; // Cached ***************************************************************** /** * Holds the lazily created cached global dialog base units that are used * if a component is not (yet) available - for example in a Border. */ private DialogBaseUnits cachedGlobalDialogBaseUnits = null; /** * Holds the horizontal dialog base units that are valid * for the FontMetrics stored in {@code cachedFontMetrics}. */ private DialogBaseUnits cachedDialogBaseUnits = null; /** * Holds the FontMetrics used to compute the per-component dialog units. * The latter are valid, if a FontMetrics equals this stored metrics. */ private FontMetrics cachedFontMetrics = null; /** * Holds a cached default dialog font that is used as fallback, * if no default dialog font has been set. * * @see #getDefaultDialogFont() * @see #setDefaultDialogFont(Font) */ private Font cachedDefaultDialogFont = null; // Instance Creation and Access ******************************************* /** * Constructs a DefaultUnitConverter and registers * a listener that handles changes in the look&feel. */ private DefaultUnitConverter() { } /** * Lazily instantiates and returns the sole instance. * * @return the lazily instantiated sole instance */ public static DefaultUnitConverter getInstance() { if (instance == null) { instance = new DefaultUnitConverter(); } return instance; } // Access to Bound Properties ********************************************* /** * Returns the string used to compute the average character width. * By default it is initialized to * {@link #BALANCED_AVERAGE_CHARACTER_TEST_STRING}. * * @return the test string used to compute the average character width */ public String getAverageCharacterWidthTestString() { return averageCharWidthTestString; } /** * Sets a string that will be used to compute the average character width. * By default it is initialized to * {@link #BALANCED_AVERAGE_CHARACTER_TEST_STRING}. You can provide * other test strings, for example: *

    *
  • "Xximeee"
  • *
  • "ABCEDEFHIJKLMNOPQRSTUVWXYZ"
  • *
  • "abcdefghijklmnopqrstuvwxyz"
  • *
* * @param newTestString the test string to be used * @throws NullPointerException if {@code newTestString} is {@code null} * @throws IllegalArgumentException if {@code newTestString} is empty or whitespace */ public void setAverageCharacterWidthTestString(String newTestString) { checkNotBlank(newTestString, "The test string must not be null, empty, or whitespace."); String oldTestString = averageCharWidthTestString; averageCharWidthTestString = newTestString; firePropertyChange( PROPERTY_AVERAGE_CHARACTER_WIDTH_TEST_STRING, oldTestString, newTestString); } /** * Returns the dialog font that is used to compute the dialog base units. * If a default dialog font has been set using * {@link #setDefaultDialogFont(Font)}, this font will be returned. * Otherwise a cached fallback will be lazily created. * * @return the font used to compute the dialog base units */ public Font getDefaultDialogFont() { return defaultDialogFont != null ? defaultDialogFont : getCachedDefaultDialogFont(); } /** * Sets a dialog font that will be used to compute the dialog base units. * * @param newFont the default dialog font to be set */ public void setDefaultDialogFont(Font newFont) { Font oldFont = defaultDialogFont; // Don't use the getter defaultDialogFont = newFont; clearCache(); firePropertyChange(PROPERTY_DEFAULT_DIALOG_FONT, oldFont, newFont); } // Implementing Abstract Superclass Behavior ****************************** /** * Returns the cached or computed horizontal dialog base units. * * @param component a Component that provides the font and graphics * @return the horizontal dialog base units */ @Override protected double getDialogBaseUnitsX(Component component) { return getDialogBaseUnits(component).x; } /** * Returns the cached or computed vertical dialog base units * for the given component. * * @param component a Component that provides the font and graphics * @return the vertical dialog base units */ @Override protected double getDialogBaseUnitsY(Component component) { return getDialogBaseUnits(component).y; } // Compute and Cache Global and Components Dialog Base Units ************** /** * Lazily computes and answer the global dialog base units. * Should be re-computed if the l&f, platform, or screen changes. * * @return a cached DialogBaseUnits object used globally if no container is available */ private DialogBaseUnits getGlobalDialogBaseUnits() { if (cachedGlobalDialogBaseUnits == null) { cachedGlobalDialogBaseUnits = computeGlobalDialogBaseUnits(); } return cachedGlobalDialogBaseUnits; } /** * Looks up and returns the dialog base units for the given component. * In case the component is {@code null} the global dialog base units * are answered.

* * Before we compute the dialog base units we check whether they * have been computed and cached before - for the same component * {@code FontMetrics}. * * @param c the component that provides the graphics object * @return the DialogBaseUnits object for the given component */ private DialogBaseUnits getDialogBaseUnits(Component c) { FormUtils.ensureValidCache(); if (c == null) { // || (font = c.getFont()) == null) { // logInfo("Missing font metrics: " + c); return getGlobalDialogBaseUnits(); } FontMetrics fm = c.getFontMetrics(getDefaultDialogFont()); if (fm.equals(cachedFontMetrics)) { return cachedDialogBaseUnits; } DialogBaseUnits dialogBaseUnits = computeDialogBaseUnits(fm); cachedFontMetrics = fm; cachedDialogBaseUnits = dialogBaseUnits; return dialogBaseUnits; } /** * Computes and returns the horizontal dialog base units. * Honors the font, font size and resolution.

* * Implementation Note: 14dluY map to 22 pixel for 8pt Tahoma on 96 dpi. * I could not yet manage to compute the Microsoft compliant font height. * Therefore this method adds a correction value that seems to work * well with the vast majority of desktops.

* * TODO: Revise the computation of vertical base units as soon as * there are more information about the original computation * in Microsoft environments. * * @param metrics the FontMetrics used to measure the dialog font * @return the horizontal and vertical dialog base units */ private DialogBaseUnits computeDialogBaseUnits(FontMetrics metrics) { double averageCharWidth = computeAverageCharWidth(metrics, averageCharWidthTestString); int ascent = metrics.getAscent(); double height = ascent > 14 ? ascent : ascent + (15 - ascent) / 3; DialogBaseUnits dialogBaseUnits = new DialogBaseUnits(averageCharWidth, height); if (LOGGER.isLoggable(Level.CONFIG)) { LOGGER.config( "Computed dialog base units " + dialogBaseUnits + " for: " + metrics.getFont()); } return dialogBaseUnits; } /** * Computes the global dialog base units. The current implementation * assumes a fixed 8pt font and on 96 or 120 dpi. A better implementation * should ask for the main dialog font and should honor the current * screen resolution.

* * Should be re-computed if the l&f, platform, or screen changes. * * @return a DialogBaseUnits object used globally if no container is available */ private DialogBaseUnits computeGlobalDialogBaseUnits() { LOGGER.config("Computing global dialog base units..."); Font dialogFont = getDefaultDialogFont(); FontMetrics metrics = createDefaultGlobalComponent().getFontMetrics(dialogFont); DialogBaseUnits globalDialogBaseUnits = computeDialogBaseUnits(metrics); return globalDialogBaseUnits; } /** * Lazily creates and returns a fallback for the dialog font * that is used to compute the dialog base units. * This fallback font is cached and will be reset if the L&F changes. * * @return the cached fallback font used to compute the dialog base units */ private Font getCachedDefaultDialogFont() { FormUtils.ensureValidCache(); if (cachedDefaultDialogFont == null) { cachedDefaultDialogFont = lookupDefaultDialogFont(); } return cachedDefaultDialogFont; } /** * Looks up and returns the font used by buttons. * First, tries to request the button font from the UIManager; * if this fails a JButton is created and asked for its font. * * @return the font used for a standard button */ private static Font lookupDefaultDialogFont() { Font buttonFont = UIManager.getFont("Button.font"); return buttonFont != null ? buttonFont : new JButton().getFont(); } /** * Creates and returns a component that is used to lookup the default * font metrics. The current implementation creates a {@code JPanel}. * Since this panel has no parent, it has no toolkit assigned. And so, * requesting the font metrics will end up using the default toolkit * and its deprecated method {@code ToolKit#getFontMetrics()}.

* * TODO: Consider publishing this method and providing a setter, so that * an API user can set a realized component that has a toolkit assigned. * * @return a component used to compute the default font metrics */ private static Component createDefaultGlobalComponent() { return new JPanel(null); } /** * Invalidates the caches. Resets the global dialog base units, * clears the Map from {@code FontMetrics} to dialog base units, * and resets the fallback for the default dialog font. * This is invoked after a change of the look&feel. */ void clearCache() { cachedGlobalDialogBaseUnits = null; cachedFontMetrics = null; cachedDefaultDialogFont = null; } // Helper Code ************************************************************ /** * Describes horizontal and vertical dialog base units. */ private static final class DialogBaseUnits { final double x; final double y; DialogBaseUnits(double dialogBaseUnitsX, double dialogBaseUnitsY) { this.x = dialogBaseUnitsX; this.y = dialogBaseUnitsY; } @Override public String toString() { return "DBU(x=" + x + "; y=" + y + ")"; } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/UnitConverter.java0000644000175000017500000001063611731041756026016 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.util; import java.awt.Component; /** * An interface that describes how to convert general sizes to pixel sizes. * For example, dialog units require a conversion that honors * the font and resolution. The {@link com.jgoodies.forms.layout.Sizes} class * delegates all size conversions to an implementation of this interface. * * @author Karsten Lentzsch * @version $Revision: 1.7 $ * @see com.jgoodies.forms.layout.Sizes * @see com.jgoodies.forms.layout.ConstantSize * @see AbstractUnitConverter * @see DefaultUnitConverter */ public interface UnitConverter { /** * Converts Inches and returns pixels using the specified resolution. * * @param in the Inches * @param component the component that provides the graphics object * @return the given Inches as pixels */ int inchAsPixel(double in, Component component); /** * Converts Millimeters and returns pixels using the resolution of the * given component's graphics object. * * @param mm Millimeters * @param component the component that provides the graphics object * @return the given Millimeters as pixels */ int millimeterAsPixel(double mm, Component component); /** * Converts Centimeters and returns pixels using the resolution of the * given component's graphics object. * * @param cm Centimeters * @param component the component that provides the graphics object * @return the given Centimeters as pixels */ int centimeterAsPixel(double cm, Component component); /** * Converts DTP Points and returns pixels using the resolution of the * given component's graphics object. * * @param pt DTP Points * @param component the component that provides the graphics object * @return the given Points as pixels */ int pointAsPixel(int pt, Component component); /** * Converts horizontal dialog units and returns pixels. * Honors the resolution, dialog font size, platform and look&feel. * * @param dluX the horizontal dialog units * @param component a component that provides the font and graphics * @return the given horizontal dialog units as pixels */ int dialogUnitXAsPixel(int dluX, Component component); /** * Converts vertical dialog units and returns pixels. * Honors the resolution, dialog font size, platform and look&feel. * * @param dluY the vertical dialog units * @param component a component that provides the font and graphics * @return the given vertical dialog units as pixels */ int dialogUnitYAsPixel(int dluY, Component component); } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/WindowsLayoutStyle.java0000644000175000017500000001270211751014216027045 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.util; import com.jgoodies.forms.layout.ConstantSize; import com.jgoodies.forms.layout.Size; import com.jgoodies.forms.layout.Sizes; /** * A {@link LayoutStyle} that aims to provide layout constants as defined by * Microsoft's User Experience Guidelines. * * @author Karsten Lentzsch * @version $Revision: 1.11 $ */ final class WindowsLayoutStyle extends LayoutStyle { static final WindowsLayoutStyle INSTANCE = new WindowsLayoutStyle(); private WindowsLayoutStyle() { // Suppresses default constructor, prevents instantiation. } // Component Sizes ****************************************************** private static final Size BUTTON_WIDTH = Sizes.dluX(50); private static final Size BUTTON_HEIGHT = Sizes.dluY(14); // Gaps ****************************************************************** private static final ConstantSize DIALOG_MARGIN_X = Sizes.DLUX7; private static final ConstantSize DIALOG_MARGIN_Y = Sizes.DLUY7; private static final ConstantSize TABBED_DIALOG_MARGIN_X = Sizes.DLUX4; private static final ConstantSize TABBED_DIALOG_MARGIN_Y = Sizes.DLUY4; private static final ConstantSize LABEL_COMPONENT_PADX = Sizes.DLUX3; private static final ConstantSize RELATED_COMPONENTS_PADX = Sizes.DLUX4; private static final ConstantSize UNRELATED_COMPONENTS_PADX = Sizes.DLUX7; private static final ConstantSize LABEL_COMPONENT_PADY = Sizes.DLUY2; private static final ConstantSize RELATED_COMPONENTS_PADY = Sizes.DLUY4; private static final ConstantSize UNRELATED_COMPONENTS_PADY = Sizes.DLUY7; private static final ConstantSize NARROW_LINE_PAD = Sizes.DLUY2; private static final ConstantSize LINE_PAD = Sizes.DLUY3; private static final ConstantSize PARAGRAPH_PAD = Sizes.DLUY9; private static final ConstantSize BUTTON_BAR_PAD = Sizes.DLUY5; // Layout Sizes ********************************************************* @Override public Size getDefaultButtonWidth() { return BUTTON_WIDTH; } @Override public Size getDefaultButtonHeight() { return BUTTON_HEIGHT; } @Override public ConstantSize getDialogMarginX() { return DIALOG_MARGIN_X; } @Override public ConstantSize getDialogMarginY() { return DIALOG_MARGIN_Y; } @Override public ConstantSize getTabbedDialogMarginX() { return TABBED_DIALOG_MARGIN_X; } @Override public ConstantSize getTabbedDialogMarginY() { return TABBED_DIALOG_MARGIN_Y; } @Override public ConstantSize getLabelComponentPadX() { return LABEL_COMPONENT_PADX; } @Override public ConstantSize getLabelComponentPadY() { return LABEL_COMPONENT_PADY; } @Override public ConstantSize getRelatedComponentsPadX() { return RELATED_COMPONENTS_PADX; } @Override public ConstantSize getRelatedComponentsPadY() { return RELATED_COMPONENTS_PADY; } @Override public ConstantSize getUnrelatedComponentsPadX() { return UNRELATED_COMPONENTS_PADX; } @Override public ConstantSize getUnrelatedComponentsPadY() { return UNRELATED_COMPONENTS_PADY; } @Override public ConstantSize getNarrowLinePad() { return NARROW_LINE_PAD; } @Override public ConstantSize getLinePad() { return LINE_PAD; } @Override public ConstantSize getParagraphPad() { return PARAGRAPH_PAD; } @Override public ConstantSize getButtonBarPad() { return BUTTON_BAR_PAD; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/LayoutStyle.java0000644000175000017500000002102111751014260025463 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.util; import com.jgoodies.common.base.SystemUtils; import com.jgoodies.forms.layout.ConstantSize; import com.jgoodies.forms.layout.Size; /** * An abstract class that describes a layout and design style guide. * It provides constants used to lay out panels consistently.

* * Note: This class is work in progress and * the API may change without notice. Therefore it is recommended * to not write custom subclasses for production code. * A future version of this class may collaborate with a class * {@code LogicalSize} or {@code StyledSize}. * * @author Karsten Lentzsch * @version $Revision: 1.15 $ * * @see com.jgoodies.forms.util.MacLayoutStyle * @see com.jgoodies.forms.util.WindowsLayoutStyle * @see com.jgoodies.forms.layout.FormSpecs * @see com.jgoodies.forms.factories.Borders */ public abstract class LayoutStyle { /** * Holds the current layout style. */ private static LayoutStyle current = initialLayoutStyle(); // Computing the initial layout style ************************************* /** * Computes and returns the initial {@code LayoutStyle}. * Checks the OS name and returns {@code MacLayoutStyle} * on Mac OS X and {@code WindowLayoutStyle} on all other platforms. * * @return MacLayoutStyle on Mac, WindowsLayoutStyle on all other platforms */ private static LayoutStyle initialLayoutStyle() { return SystemUtils.IS_OS_MAC ? MacLayoutStyle.INSTANCE : WindowsLayoutStyle.INSTANCE; } // Accessing the current style ****************************************** /** * Returns the current {@code LayoutStyle}. * * @return the current {@code LayoutStyle} */ public static LayoutStyle getCurrent() { return current; } /** * Set a new {@code LayoutStyle}. * * @param newLayoutStyle the style to be set */ public static void setCurrent(LayoutStyle newLayoutStyle) { current = newLayoutStyle; } // Layout Sizes ********************************************************* /** * Returns this style's default button width. * * @return the default button width * * @see #getDefaultButtonHeight() */ public abstract Size getDefaultButtonWidth(); /** * Returns this style's default button height. * * @return the default button height * * @see #getDefaultButtonWidth() */ public abstract Size getDefaultButtonHeight(); /** * Returns this style's horizontal margin for general dialogs. * * @return the horizontal margin for general dialogs * * @see #getDialogMarginY() * @see #getTabbedDialogMarginX() */ public abstract ConstantSize getDialogMarginX(); /** * Returns this style's vertical margin for general dialogs. * * @return the vertical margin for general dialogs * * @see #getDialogMarginX() * @see #getTabbedDialogMarginY() */ public abstract ConstantSize getDialogMarginY(); /** * Returns this style's horizontal margin for dialogs that consist of * a tabbed pane. * * @return the horizontal margin for dialogs that consist of a tabbed pane * * @see #getTabbedDialogMarginY() * @see #getDialogMarginX() * * @since 1.0.3 */ public abstract ConstantSize getTabbedDialogMarginX(); /** * Returns this style's vertical margin for dialogs that consist of * a tabbed pane. * * @return the vertical margin for dialogs that consist of a tabbed pane * * @see #getTabbedDialogMarginX() * @see #getDialogMarginY() * * @since 1.0.3 */ public abstract ConstantSize getTabbedDialogMarginY(); /** * Returns a gap used to separate a label and associated control. * * @return a gap between label and associated control * * @see #getRelatedComponentsPadX() * @see #getUnrelatedComponentsPadX() */ public abstract ConstantSize getLabelComponentPadX(); /** * Returns a gap used to separate a label and associated control. * * @return a gap between label and associated control * * @see #getRelatedComponentsPadY() * @see #getUnrelatedComponentsPadY() * * @since 1.4 */ public abstract ConstantSize getLabelComponentPadY(); /** * Returns a horizontal gap used to separate related controls. * * @return a horizontal gap between related controls * * @see #getLabelComponentPadX() * @see #getRelatedComponentsPadY() * @see #getUnrelatedComponentsPadX() */ public abstract ConstantSize getRelatedComponentsPadX(); /** * Returns a vertical gap used to separate related controls. * * @return a vertical gap between related controls * * @see #getRelatedComponentsPadX() * @see #getUnrelatedComponentsPadY() */ public abstract ConstantSize getRelatedComponentsPadY(); /** * Returns a horizontal gap used to separate unrelated controls. * * @return a horizontal gap between unrelated controls * * @see #getLabelComponentPadX() * @see #getUnrelatedComponentsPadY() * @see #getRelatedComponentsPadX() */ public abstract ConstantSize getUnrelatedComponentsPadX(); /** * Returns a vertical gap used to separate unrelated controls. * * @return a vertical gap between unrelated controls * * @see #getUnrelatedComponentsPadX() * @see #getRelatedComponentsPadY() */ public abstract ConstantSize getUnrelatedComponentsPadY(); /** * Returns a narrow vertical pad used to separate lines. * * @return a narrow vertical pad used to separate lines * * @see #getLinePad() * @see #getParagraphPad() */ public abstract ConstantSize getNarrowLinePad(); /** * Returns a narrow vertical pad used to separate lines. * * @return a vertical pad used to separate lines * * @see #getNarrowLinePad() * @see #getParagraphPad() */ public abstract ConstantSize getLinePad(); /** * Returns a pad used to separate paragraphs. * * @return a vertical pad used to separate paragraphs * * @see #getNarrowLinePad() * @see #getLinePad() */ public abstract ConstantSize getParagraphPad(); /** * Returns a pad used to separate a button bar from a component. * * @return a vertical pad used to separate paragraphs * * @see #getRelatedComponentsPadY() * @see #getUnrelatedComponentsPadY() * * @since 1.0.3 */ public abstract ConstantSize getButtonBarPad(); } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/FormUtils.java0000644000175000017500000001130511731041756025125 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.util; import javax.swing.LookAndFeel; import javax.swing.UIManager; /** * A library-internal class that consists only of static utility methods. * * Note: This class is not part of the public Forms API. * It's intended for library implementation purposes only. * The class's API may change at any time. * * @author Karsten Lentzsch * @version $Revision: 1.14 $ * * @since 1.2 */ public final class FormUtils { // Instance ************************************************************* private FormUtils() { // Suppresses default constructor, prevents instantiation. } // API ******************************************************************** /** * Lazily checks and answers whether the Aqua look&feel is active. * * @return {@code true} if the current look&feel is Aqua */ public static boolean isLafAqua() { ensureValidCache(); if (cachedIsLafAqua == null) { cachedIsLafAqua = Boolean.valueOf(computeIsLafAqua()); } return cachedIsLafAqua.booleanValue(); } // Caching and Lazily Computing the Laf State ***************************** /** * Clears cached internal Forms state that is based * on the Look&Feel, for example dialog base units.

* * There's typically no need to call this method directly. * It'll be invoked automatically, if the L&F has been changed * via {@link UIManager#setLookAndFeel} and cached data is requested. * It's been made public to allow cache invalidation for cases * where the L&F is changed temporarily by replacing the UIDefaults, * for example in a visual editor. * * @since 1.2.1 */ public static void clearLookAndFeelBasedCaches() { cachedIsLafAqua = null; DefaultUnitConverter.getInstance().clearCache(); } /** * Holds the LookAndFeel that has been used to computed cached values. * If the current L&F differs from this cached value, * the caches must be cleared. */ private static LookAndFeel cachedLookAndFeel; /** * Holds the cached result of the Aqua l&f check. * Is invalidated if a look&feel change has been detected * in {@code #ensureValidCache}. */ private static Boolean cachedIsLafAqua; /** * Computes and answers whether an Aqua look&feel is active. * This may be Apple's Aqua L&f, or a sub-L&f that * uses the same ID, because it doesn't substantially change the look. * * @return true if the current look&feel is Aqua */ private static boolean computeIsLafAqua() { return UIManager.getLookAndFeel().getID().equals("Aqua"); } static void ensureValidCache() { LookAndFeel currentLookAndFeel = UIManager.getLookAndFeel(); if (currentLookAndFeel != cachedLookAndFeel) { clearLookAndFeelBasedCaches(); cachedLookAndFeel = currentLookAndFeel; } } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/MacLayoutStyle.java0000644000175000017500000001267111767774440026143 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.util; import com.jgoodies.forms.layout.ConstantSize; import com.jgoodies.forms.layout.Size; import com.jgoodies.forms.layout.Sizes; /** * A {@link LayoutStyle} that aims to provide layout constants as defined by * Microsoft's User Experience Guidelines. * * @author Karsten Lentzsch * @version $Revision: 1.12 $ */ public final class MacLayoutStyle extends LayoutStyle { static final MacLayoutStyle INSTANCE = new MacLayoutStyle(); private MacLayoutStyle() { // Suppresses default constructor, prevents instantiation. } // Component Sizes ****************************************************** private static final Size BUTTON_WIDTH = Sizes.dluX(54); private static final Size BUTTON_HEIGHT = Sizes.dluY(14); // Gaps ****************************************************************** private static final ConstantSize DIALOG_MARGIN_X = Sizes.DLUX9; private static final ConstantSize DIALOG_MARGIN_Y = Sizes.DLUY9; private static final ConstantSize TABBED_DIALOG_MARGIN_X = Sizes.DLUX4; private static final ConstantSize TABBED_DIALOG_MARGIN_Y = Sizes.DLUY4; private static final ConstantSize LABEL_COMPONENT_PADX = Sizes.DLUX3; private static final ConstantSize RELATED_COMPONENTS_PADX = Sizes.DLUX4; private static final ConstantSize UNRELATED_COMPONENTS_PADX = Sizes.DLUX8; private static final ConstantSize LABEL_COMPONENT_PADY = Sizes.DLUY2; private static final ConstantSize RELATED_COMPONENTS_PADY = Sizes.DLUY3; private static final ConstantSize UNRELATED_COMPONENTS_PADY = Sizes.DLUY6; private static final ConstantSize NARROW_LINE_PAD = Sizes.DLUY2; private static final ConstantSize LINE_PAD = Sizes.DLUY3; private static final ConstantSize PARAGRAPH_PAD = Sizes.DLUY9; private static final ConstantSize BUTTON_BAR_PAD = Sizes.DLUY4; // Layout Sizes ********************************************************* @Override public Size getDefaultButtonWidth() { return BUTTON_WIDTH; } @Override public Size getDefaultButtonHeight() { return BUTTON_HEIGHT; } @Override public ConstantSize getDialogMarginX() { return DIALOG_MARGIN_X; } @Override public ConstantSize getDialogMarginY() { return DIALOG_MARGIN_Y; } @Override public ConstantSize getTabbedDialogMarginX() { return TABBED_DIALOG_MARGIN_X; } @Override public ConstantSize getTabbedDialogMarginY() { return TABBED_DIALOG_MARGIN_Y; } @Override public ConstantSize getLabelComponentPadX() { return LABEL_COMPONENT_PADX; } @Override public ConstantSize getLabelComponentPadY() { return LABEL_COMPONENT_PADY; } @Override public ConstantSize getRelatedComponentsPadX() { return RELATED_COMPONENTS_PADX; } @Override public ConstantSize getRelatedComponentsPadY() { return RELATED_COMPONENTS_PADY; } @Override public ConstantSize getUnrelatedComponentsPadX() { return UNRELATED_COMPONENTS_PADX; } @Override public ConstantSize getUnrelatedComponentsPadY() { return UNRELATED_COMPONENTS_PADY; } @Override public ConstantSize getNarrowLinePad() { return NARROW_LINE_PAD; } @Override public ConstantSize getLinePad() { return LINE_PAD; } @Override public ConstantSize getParagraphPad() { return PARAGRAPH_PAD; } @Override public ConstantSize getButtonBarPad() { return BUTTON_BAR_PAD; } } jgoodies-forms-1.6.0/src/main/java/com/jgoodies/forms/util/AbstractUnitConverter.java0000644000175000017500000002373611762200774027510 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.util; import java.awt.Component; import java.awt.FontMetrics; import java.awt.Toolkit; import com.jgoodies.common.bean.Bean; /** * An abstract implementation of the {@link UnitConverter} interface that * minimizes the effort required to convert font-dependent sizes to pixels. * * @author Karsten Lentzsch * @version $Revision: 1.8 $ * * @see DefaultUnitConverter * @see com.jgoodies.forms.layout.Size * @see com.jgoodies.forms.layout.Sizes */ public abstract class AbstractUnitConverter extends Bean implements UnitConverter { private static final int DTP_RESOLUTION = 72; // Unit Converter Implementation ********************************************* /** * Converts Inches and returns pixels using the specified resolution. * * @param in the Inches * @param component the component that provides the graphics object * @return the given Inches as pixels */ @Override public int inchAsPixel(double in, Component component) { return inchAsPixel(in, getScreenResolution(component)); } /** * Converts Millimeters and returns pixels using the resolution of the * given component's graphics object. * * @param mm Millimeters * @param component the component that provides the graphics object * @return the given Millimeters as pixels */ @Override public int millimeterAsPixel(double mm, Component component) { return millimeterAsPixel(mm, getScreenResolution(component)); } /** * Converts Centimeters and returns pixels using the resolution of the * given component's graphics object. * * @param cm Centimeters * @param component the component that provides the graphics object * @return the given Centimeters as pixels */ @Override public int centimeterAsPixel(double cm, Component component) { return centimeterAsPixel(cm, getScreenResolution(component)); } /** * Converts DTP Points and returns pixels using the resolution of the * given component's graphics object. * * @param pt DTP Points * @param component the component that provides the graphics object * @return the given Points as pixels */ @Override public int pointAsPixel(int pt, Component component) { return pointAsPixel(pt, getScreenResolution(component)); } /** * Converts horizontal dialog units and returns pixels. * Honors the resolution, dialog font size, platform, and l&f. * * @param dluX the horizontal dialog units * @param c a Component that provides the font and graphics * @return the given horizontal dialog units as pixels */ @Override public int dialogUnitXAsPixel(int dluX, Component c) { return dialogUnitXAsPixel(dluX, getDialogBaseUnitsX(c)); } /** * Converts vertical dialog units and returns pixels. * Honors the resolution, dialog font size, platform, and l&f. * * @param dluY the vertical dialog units * @param c a Component that provides the font and graphics * @return the given vertical dialog units as pixels */ @Override public int dialogUnitYAsPixel(int dluY, Component c) { return dialogUnitYAsPixel(dluY, getDialogBaseUnitsY(c)); } // Abstract Behavior ***************************************************** /** * Gets and returns the horizontal dialog base units. * Implementations are encouraged to cache previously computed * dialog base units. * * @param component a Component that provides the font and graphics * @return the horizontal dialog base units */ protected abstract double getDialogBaseUnitsX(Component component); /** * Gets and returns the vertical dialog base units. * Implementations are encouraged to cache previously computed * dialog base units. * * @param component a Component that provides the font and graphics * @return the vertical dialog base units */ protected abstract double getDialogBaseUnitsY(Component component); // Convenience Methods *************************************************** /** * Converts Inches and returns pixels using the specified resolution. * * @param in the Inches * @param dpi the resolution * @return the given Inches as pixels */ protected static final int inchAsPixel(double in, int dpi) { return (int) Math.round(dpi * in); } /** * Converts Millimeters and returns pixels using the specified resolution. * * @param mm Millimeters * @param dpi the resolution * @return the given Millimeters as pixels */ protected static final int millimeterAsPixel(double mm, int dpi) { return (int) Math.round(dpi * mm * 10 / 254); } /** * Converts Centimeters and returns pixels using the specified resolution. * * @param cm Centimeters * @param dpi the resolution * @return the given Centimeters as pixels */ protected static final int centimeterAsPixel(double cm, int dpi) { return (int) Math.round(dpi * cm * 100 / 254); } /** * Converts DTP Points and returns pixels using the specified resolution. * * @param pt DTP Points * @param dpi the resolution in dpi * @return the given Points as pixels */ protected static final int pointAsPixel(int pt, int dpi) { return Math.round(dpi * pt / DTP_RESOLUTION); } /** * Converts horizontal dialog units and returns pixels. * * @param dluX the horizontal dialog units * @param dialogBaseUnitsX the horizontal dialog base units * @return the given dialog base units as pixels */ protected int dialogUnitXAsPixel(int dluX, double dialogBaseUnitsX) { return (int) Math.round(dluX * dialogBaseUnitsX / 4); } /** * Converts vertical dialog units and returns pixels. * * @param dluY the vertical dialog units * @param dialogBaseUnitsY the vertical dialog base units * @return the given dialog base units as pixels */ protected int dialogUnitYAsPixel(int dluY, double dialogBaseUnitsY) { return (int) Math.round(dluY * dialogBaseUnitsY / 8); } // Helper Code ************************************************************ /** * Computes and returns the average character width * of the specified test string using the given FontMetrics. * The test string shall represent an "average" text. * * @param metrics used to compute the test string's width * @param testString the string that shall represent an "average" text * @return the test string's average character width. */ protected double computeAverageCharWidth( FontMetrics metrics, String testString) { int width = metrics.stringWidth(testString); double average = (double) width / testString.length(); //System.out.println("Average width of '" + testString + "'=" + average); return average; } /** * Returns the components screen resolution or the default screen * resolution if the component is null or has no toolkit assigned yet. * * @param c the component to ask for a toolkit * @return the component's screen resolution */ protected int getScreenResolution(Component c) { if (c == null) { return getDefaultScreenResolution(); } Toolkit toolkit = c.getToolkit(); return toolkit != null ? toolkit.getScreenResolution() : getDefaultScreenResolution(); } private static int defaultScreenResolution = -1; /** * Computes and returns the default resolution. * * @return the default screen resolution */ protected int getDefaultScreenResolution() { if (defaultScreenResolution == -1) { defaultScreenResolution = Toolkit.getDefaultToolkit().getScreenResolution(); } return defaultScreenResolution; } } jgoodies-forms-1.6.0/src/test/0000755000175000017500000000000012052333450014754 5ustar tonytonyjgoodies-forms-1.6.0/src/test/java/0000755000175000017500000000000012052333501015672 5ustar tonytonyjgoodies-forms-1.6.0/src/test/java/META-INF/0000755000175000017500000000000012003555436017043 5ustar tonytonyjgoodies-forms-1.6.0/src/test/java/META-INF/MANIFEST.MF0000644000175000017500000000014712003555434020475 0ustar tonytonyManifest-Version: 1.0 Ant-Version: Apache Ant 1.8.2 Created-By: 1.7.0_05-b05 (Oracle Corporation) jgoodies-forms-1.6.0/src/test/java/com/0000755000175000017500000000000011731041624016455 5ustar tonytonyjgoodies-forms-1.6.0/src/test/java/com/jgoodies/0000755000175000017500000000000011731041624020260 5ustar tonytonyjgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/0000755000175000017500000000000011731041624021406 5ustar tonytonyjgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/0000755000175000017500000000000011731041646022727 5ustar tonytonyjgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/FormLayoutTest.java0000644000175000017500000005200711731041646026537 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.awt.Dimension; import javax.swing.JPanel; import junit.framework.TestCase; import com.jgoodies.forms.factories.CC; /** * Tests the FormLayout's layout algorithm. * * @author Karsten Lentzsch * @version $Revision: 1.17 $ */ public final class FormLayoutTest extends TestCase { /** * Checks basic layout functions. */ public static void testBasic() { FormLayout layout = new FormLayout( "1px, 2px, 3px, 5px, 7px", "1px, 2px, 3px"); JPanel panel = new JPanel(layout); panel.doLayout(); FormLayout.LayoutInfo info = layout.getLayoutInfo(panel); assertEquals("Columns", 6, info.columnOrigins.length); assertEquals("Rows", 4, info.rowOrigins.length); assertEquals("Column 0", 0, info.columnOrigins[0]); assertEquals("Column 1", 1, info.columnOrigins[1]); assertEquals("Column 2", 3, info.columnOrigins[2]); assertEquals("Column 3", 6, info.columnOrigins[3]); assertEquals("Column 4", 11, info.columnOrigins[4]); assertEquals("Column 5", 18, info.columnOrigins[5]); } /** * Checks whether components are aligned according to the column specs. */ public static void testHorizontalAlignments() { TestComponent left = new TestComponent(2, 7, 4, 9); TestComponent center = new TestComponent(2, 7, 4, 9); TestComponent right = new TestComponent(2, 7, 4, 9); TestComponent fill = new TestComponent(2, 7, 4, 9); TestComponent def = new TestComponent(2, 7, 4, 9); FormLayout layout = new FormLayout( "left:10px, center:10px, right:10px, fill:10px, 10px", "pref"); JPanel panel = new JPanel(layout); panel.add(left, CC.xy(1, 1)); panel.add(center, CC.xy(2, 1)); panel.add(right, CC.xy(3, 1)); panel.add(fill, CC.xy(4, 1)); panel.add(def, CC.xy(5, 1)); panel.doLayout(); assertEquals("Left.x", 0, left.getX()); assertEquals("Left.width", 4, left.getWidth()); assertEquals("Center.x", 13, center.getX()); assertEquals("Center.width", 4, center.getWidth()); assertEquals("Right.x", 26, right.getX()); assertEquals("Right.width", 4, right.getWidth()); assertEquals("Fill.x", 30, fill.getX()); assertEquals("Fill.width", 10, fill.getWidth()); assertEquals("Default.x", 40, def.getX()); assertEquals("Default.width", 10, def.getWidth()); } /** * Checks whether components are aligned according to the row specs. */ public static void testVerticalAlignments() { TestComponent top = new TestComponent(7, 2, 9, 4); TestComponent center = new TestComponent(7, 2, 9, 4); TestComponent bottom = new TestComponent(7, 2, 9, 4); TestComponent fill = new TestComponent(7, 2, 9, 4); TestComponent def = new TestComponent(7, 2, 9, 4); FormLayout layout = new FormLayout( "pref", "top:10px, center:10px, bottom:10px, fill:10px, 10px"); JPanel panel = new JPanel(layout); panel.add(top, CC.xy(1, 1)); panel.add(center, CC.xy(1, 2)); panel.add(bottom, CC.xy(1, 3)); panel.add(fill, CC.xy(1, 4)); panel.add(def, CC.xy(1, 5)); panel.doLayout(); assertEquals("Top.y", 0, top.getY()); assertEquals("Top.height", 4, top.getHeight()); assertEquals("Center.y", 13, center.getY()); assertEquals("Center.height", 4, center.getHeight()); assertEquals("Bottom.y", 26, bottom.getY()); assertEquals("Bottom.height", 4, bottom.getHeight()); assertEquals("Fill.y", 30, fill.getY()); assertEquals("Fill.height", 10, fill.getHeight()); assertEquals("Default.y", 43, def.getY()); assertEquals("Default.height", 4, def.getHeight()); } /** * Tests bounded min and pref widths. */ public static void testBoundedWidth() { TestComponent c1 = new TestComponent( 2, 7, 4, 9); TestComponent c2 = new TestComponent(20, 7, 40, 9); TestComponent c3 = new TestComponent( 2, 7, 4, 9); TestComponent c4 = new TestComponent(20, 7, 40, 9); TestComponent c5 = new TestComponent( 2, 7, 4, 9); TestComponent c6 = new TestComponent(20, 7, 40, 9); TestComponent c7 = new TestComponent( 2, 7, 4, 9); TestComponent c8 = new TestComponent(20, 7, 40, 9); FormLayout layout = new FormLayout( "[10px,min], [10px,min], " + "[10px,pref], [10px,pref], " + "[min,10px], [min,10px], " + "[pref,10px], [pref,10px]", "pref"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy(1, 1)); panel.add(c2, CC.xy(2, 1)); panel.add(c3, CC.xy(3, 1)); panel.add(c4, CC.xy(4, 1)); panel.add(c5, CC.xy(5, 1)); panel.add(c6, CC.xy(6, 1)); panel.add(c7, CC.xy(7, 1)); panel.add(c8, CC.xy(8, 1)); panel.doLayout(); assertEquals("max(10px;c1_min).width", 10, c1.getWidth()); assertEquals("max(10px;c2_min).width", 20, c2.getWidth()); assertEquals("max(10px;c3_pref).width", 10, c3.getWidth()); assertEquals("max(10px;c4_pref).width", 40, c4.getWidth()); assertEquals("min(10px;c5_min).width", 2, c5.getWidth()); assertEquals("min(10px;c6_min).width", 10, c6.getWidth()); assertEquals("min(10px;c7_pref).width", 4, c7.getWidth()); assertEquals("min(10px;c8_pref).width", 10, c8.getWidth()); } /** * Tests bounded min and pref widths. */ public static void testBoundedHeight() { TestComponent c1 = new TestComponent(7, 2, 9, 4); TestComponent c2 = new TestComponent(7, 20, 9, 40); TestComponent c3 = new TestComponent(7, 2, 9, 4); TestComponent c4 = new TestComponent(7, 20, 9, 40); TestComponent c5 = new TestComponent(7, 2, 9, 4); TestComponent c6 = new TestComponent(7, 20, 9, 40); TestComponent c7 = new TestComponent(7, 2, 9, 4); TestComponent c8 = new TestComponent(7, 20, 9, 40); FormLayout layout = new FormLayout( "pref", "f:[10px,min], f:[10px,min], " + "f:[10px,pref], f:[10px,pref], " + "f:[min,10px], f:[min,10px], " + "f:[pref,10px], f:[pref,10px]"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy(1, 1)); panel.add(c2, CC.xy(1, 2)); panel.add(c3, CC.xy(1, 3)); panel.add(c4, CC.xy(1, 4)); panel.add(c5, CC.xy(1, 5)); panel.add(c6, CC.xy(1, 6)); panel.add(c7, CC.xy(1, 7)); panel.add(c8, CC.xy(1, 8)); panel.doLayout(); assertEquals("[10px, c1_min].height", 10, c1.getHeight()); assertEquals("[10px, c2_min].height", 20, c2.getHeight()); assertEquals("[10px,c3_pref].height", 10, c3.getHeight()); assertEquals("[10px,c4_pref].height", 40, c4.getHeight()); assertEquals("[c5_min, 10px].height", 2, c5.getHeight()); assertEquals("[c6_min, 10px].height", 10, c6.getHeight()); assertEquals("[c7_pref,10px].height", 4, c7.getHeight()); assertEquals("[c8_pref,10px].height", 10, c8.getHeight()); } // Testing components that span multiple columns/rows ********************* /** * Checks and verifies that components that span multiple columns * do not expand the container of no column grows. */ public static void testNoExtraExpansionIfAllColumnsAreFixed() { TestComponent c1 = new TestComponent(10, 1, 50, 1); TestComponent c2 = new TestComponent(10, 1, 50, 1); TestComponent c3 = new TestComponent(10, 1, 50, 1); TestComponent c4 = new TestComponent(10, 1, 50, 1); FormLayout layout = new FormLayout( "10px, 15px, 20px", "pref, pref"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy (1, 1)); panel.add(c2, CC.xy (2, 1)); panel.add(c3, CC.xy (3, 1)); panel.add(c4, CC.xyw(1, 2, 2)); Dimension preferredLayoutSize = layout.preferredLayoutSize(panel); panel.setSize(preferredLayoutSize); panel.doLayout(); int col1And2Width = c2.getX() + c2.getWidth(); int gridWidth = c3.getX() + c3.getWidth(); int totalWidth = preferredLayoutSize.width; assertEquals("Col1+2 width", 25, col1And2Width); assertEquals("Grid width", 45, gridWidth); assertEquals("Total width", 45, totalWidth); } /** * Checks and verifies that components that span multiple columns * do not expand the container of no column grows. */ public static void testNoExtraExpansionIfSpannedColumnsAreFixed() { TestComponent c1 = new TestComponent(10, 1, 50, 1); TestComponent c2 = new TestComponent(10, 1, 50, 1); TestComponent c3 = new TestComponent(10, 1, 50, 1); TestComponent c4 = new TestComponent(10, 1, 50, 1); FormLayout layout = new FormLayout( "10px, 15px, 20px:grow", "pref, pref"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy (1, 1)); panel.add(c2, CC.xy (2, 1)); panel.add(c3, CC.xy (3, 1)); panel.add(c4, CC.xyw(1, 2, 2)); Dimension preferredLayoutSize = layout.preferredLayoutSize(panel); panel.setSize(preferredLayoutSize); panel.doLayout(); int col1And2Width = c2.getX() + c2.getWidth(); int gridWidth = c3.getX() + c3.getWidth(); int totalWidth = preferredLayoutSize.width; assertEquals("Col1+2 width", 25, col1And2Width); assertEquals("Grid width", 45, gridWidth); assertEquals("Total width", 45, totalWidth); // 70 is wrong } /** * Checks and verifies that components that span multiple columns * do not expand the container of no column grows. */ public static void testExtraExpansionIfSpannedColumnsGrow() { TestComponent c1 = new TestComponent(10, 1, 50, 1); TestComponent c2 = new TestComponent(10, 1, 50, 1); TestComponent c3 = new TestComponent(10, 1, 50, 1); TestComponent c4 = new TestComponent(10, 1, 50, 1); FormLayout layout = new FormLayout( "10px, 15px:grow, 20px", "pref, pref"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy (1, 1)); panel.add(c2, CC.xy (2, 1)); panel.add(c3, CC.xy (3, 1)); panel.add(c4, CC.xyw(1, 2, 2)); Dimension preferredLayoutSize = layout.preferredLayoutSize(panel); panel.setSize(preferredLayoutSize); panel.doLayout(); int col1And2Width = c2.getX() + c2.getWidth(); int gridWidth = c3.getX() + c3.getWidth(); int totalWidth = preferredLayoutSize.width; assertEquals("Col1+2 width", 50, col1And2Width); assertEquals("Grid width", 70, gridWidth); assertEquals("Total width", 70, totalWidth); } /** * Checks and verifies that components that span multiple columns * and that expand the container are measured using the correct measure. */ public static void testExtraExpansionHonorsCurrentMeasure() { TestComponent c1 = new TestComponent(10, 1, 50, 1); TestComponent c2 = new TestComponent(10, 1, 50, 1); TestComponent c3 = new TestComponent(10, 1, 50, 1); TestComponent c4 = new TestComponent(10, 1, 50, 1); FormLayout layout = new FormLayout( "10px, 15px:grow, 20px", "pref, pref"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy (1, 1)); panel.add(c2, CC.xy (2, 1)); panel.add(c3, CC.xy (3, 1)); panel.add(c4, CC.xyw(1, 2, 2)); int minimumLayoutWidth = layout.minimumLayoutSize(panel).width; int preferredLayoutWidth = layout.preferredLayoutSize(panel).width; assertEquals("Minimum layout width", 45, minimumLayoutWidth); assertEquals("Preferred layout width", 70, preferredLayoutWidth); } /** * Tests the layout size, column and row sizes for a default specs. */ public static void testDefaultSize() { TestComponent c1 = new TestComponent(10, 10, 50, 50); FormLayout layout = new FormLayout( "default", "default"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy(1, 1)); Dimension minimumLayoutSize = layout.minimumLayoutSize(panel); Dimension preferredLayoutSize = layout.preferredLayoutSize(panel); assertEquals("Minimum layout width", 10, minimumLayoutSize.width); assertEquals("Minimum layout height", 10, minimumLayoutSize.height); assertEquals("Preferred layout width", 50, preferredLayoutSize.width); assertEquals("Preferred layout height", 50, preferredLayoutSize.height); panel.setSize(minimumLayoutSize); panel.doLayout(); int columnWidth = c1.getWidth(); int rowHeight = c1.getHeight(); assertEquals("Column width (container min)", 10, columnWidth); assertEquals("Row height (container min)", 10, rowHeight); panel.setSize(preferredLayoutSize); panel.doLayout(); columnWidth = c1.getWidth(); rowHeight = c1.getHeight(); assertEquals("Column width (container pref)", 50, columnWidth); assertEquals("Row height (container pref)", 50, rowHeight); } /** * Tests the combination of a default size spec with a lower bound * that shall ensure a minimum size. */ public static void testDefaultWithLowerBound() { TestComponent c1 = new TestComponent(10, 10, 50, 50); FormLayout layout = new FormLayout( "[20px,default]", "[20px,default]"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy(1, 1)); Dimension minimumLayoutSize = layout.minimumLayoutSize(panel); Dimension preferredLayoutSize = layout.preferredLayoutSize(panel); assertEquals("Minimum layout width", 20, minimumLayoutSize.width); assertEquals("Minimum layout height", 20, minimumLayoutSize.height); assertEquals("Preferred layout width", 50, preferredLayoutSize.width); assertEquals("Preferred layout height", 50, preferredLayoutSize.height); panel.setSize(minimumLayoutSize); panel.doLayout(); int columnWidth = c1.getWidth(); int rowHeight = c1.getHeight(); assertEquals("Column width (container min)", 20, columnWidth); assertEquals("Row height (container min)", 20, rowHeight); panel.setSize(preferredLayoutSize); panel.doLayout(); columnWidth = c1.getWidth(); rowHeight = c1.getHeight(); assertEquals("Column width (container pref)", 50, columnWidth); assertEquals("Row height (container pref)", 50, rowHeight); } /** * Tests the combination of a default size spec with an upper bound * that shall ensure a maximum size. */ public static void testDefaultWithUpperBound() { TestComponent c1 = new TestComponent(10, 10, 50, 50); FormLayout layout = new FormLayout( "[default,20px]", "[default,20px]"); JPanel panel = new JPanel(layout); panel.add(c1, CC.xy(1, 1)); Dimension minimumLayoutSize = layout.minimumLayoutSize(panel); Dimension preferredLayoutSize = layout.preferredLayoutSize(panel); assertEquals("Minimum layout width", 10, minimumLayoutSize.width); assertEquals("Minimum layout height", 10, minimumLayoutSize.height); assertEquals("Preferred layout width", 20, preferredLayoutSize.width); assertEquals("Preferred layout height", 20, preferredLayoutSize.height); panel.setSize(minimumLayoutSize); panel.doLayout(); int columnWidth = c1.getWidth(); int rowHeight = c1.getHeight(); assertEquals("Column width (container min)", 10, columnWidth); assertEquals("Row height (container min)", 10, rowHeight); panel.setSize(preferredLayoutSize); panel.doLayout(); columnWidth = c1.getWidth(); rowHeight = c1.getHeight(); assertEquals("Column width (container pref)", 20, columnWidth); assertEquals("Row height (container pref)", 20, rowHeight); } // Visibility ************************************************************* /** * Checks whether components are taken into account according * to their visibility, the container wide FormLayout setting, * and the cell setting. */ public static void testVisibility() { testVisibility(true); testVisibility(false); } public static void testVisibility(boolean containerHonorsVisibility) { TestComponent visible = new TestComponent(10, 10, 10, 10); TestComponent invisible = new TestComponent(10, 10, 10, 10); invisible.setVisible(false); TestComponent invisibleHonorsVisibility = new TestComponent(10, 10, 10, 10); invisibleHonorsVisibility.setVisible(false); TestComponent invisibleIgnoresVisibility = new TestComponent(10, 10, 10, 10); invisibleIgnoresVisibility.setVisible(false); FormLayout layout = new FormLayout( "pref, pref, pref, pref", "pref, pref, pref, pref"); layout.setHonorsVisibility(containerHonorsVisibility); JPanel panel = new JPanel(layout); panel.add(visible, CC.xy(1, 1)); panel.add(invisible, CC.xy(2, 2)); panel.add(invisibleHonorsVisibility, CC.xy(3, 3)); panel.add(invisibleIgnoresVisibility, CC.xy(4, 4)); layout.setHonorsVisibility(invisibleHonorsVisibility, Boolean.TRUE); layout.setHonorsVisibility(invisibleIgnoresVisibility, Boolean.FALSE); panel.doLayout(); FormLayout.LayoutInfo info = layout.getLayoutInfo(panel); int size1 = 10; int size2 = containerHonorsVisibility ? 0 : 10; int size3 = 0; int size4 = 10; int origin1 = size1; int origin2 = origin1 + size2; int origin3 = origin2 + size3; int origin4 = origin3 + size4; assertEquals("Column 0", 0, info.columnOrigins[0]); assertEquals("Column 1", origin1, info.columnOrigins[1]); assertEquals("Column 2", origin2, info.columnOrigins[2]); assertEquals("Column 3", origin3, info.columnOrigins[3]); assertEquals("Column 4", origin4, info.columnOrigins[4]); assertEquals("Row 0", 0, info.rowOrigins[0]); assertEquals("Row 1", origin1, info.rowOrigins[1]); assertEquals("Row 2", origin2, info.rowOrigins[2]); assertEquals("Row 3", origin3, info.rowOrigins[3]); assertEquals("Row 4", origin4, info.rowOrigins[4]); } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/BordersTest.java0000644000175000017500000000606011751076762026045 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import javax.swing.border.Border; import junit.framework.TestCase; import com.jgoodies.forms.factories.Borders; /** * A test case for class {@link Borders}. * * @author Karsten Lentzsch * @version $Revision: 1.5 $ */ public final class BordersTest extends TestCase { /** * Checks that the constructor rejects negative resize weights. */ public static void testValidEncodings() { assertInsetsEquals( Borders.DLU14, Borders.createEmptyBorder("14dlu, 14dlu, 14dlu, 14dlu")); assertInsetsEquals( Borders.DLU14, Borders.createEmptyBorder(" 14dlu , 14dlu , 14dlu , 14dlu ")); assertInsetsEquals( Borders.createEmptyBorder(Sizes.DLUY1, Sizes.DLUX2, Sizes.DLUY3, Sizes.DLUX4), Borders.createEmptyBorder(" 1dlu , 2dlu , 3dlu , 4dlu ")); } // Helper Code ************************************************************ /** * Checks if the given CellConstraints instances are equal * and throws a failure if not. * * @param expected the expected constraints object to be compared * @param actual the actual constraints object to be compared */ private static void assertInsetsEquals(Border expected, Border actual) { assertEquals(expected.getBorderInsets(null), actual.getBorderInsets(null)); } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/FormLayoutGroupsTest.java0000644000175000017500000001437711731041646027747 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import junit.framework.TestCase; /** * Tests column and row groups of the FormLayout. * * @author Karsten Lentzsch * @version $Revision: 1.16 $ */ public final class FormLayoutGroupsTest extends TestCase { private FormLayout layout; /** * @throws Exception in case of an unexpected problem */ @Override protected void setUp() throws Exception { super.setUp(); layout = new FormLayout( "pref, pref, pref, pref", "pref, pref, pref, pref"); } /** * @throws Exception in case of an unexpected problem */ @Override protected void tearDown() throws Exception { super.tearDown(); layout = null; } /** * Checks that column groups use a deep copy mechanism, * not a shallow copy. */ public void testDeepCopyColumnGroups() { int[][] columnGroups = createAllGroups(); layout.setColumnGroups(columnGroups); // Modify the column group set (first level). columnGroups[1] = new int[]{1, 4}; if (equals(columnGroups, layout.getColumnGroups())) { fail("Column group sets should be immutable."); } // Modify a column group (second level) columnGroups[0][0] = 5; if (equals(columnGroups, layout.getColumnGroups())) { fail("Column groups should be immutable."); } } /** * Checks that row groups use a deep copy mechanism, * not a shallow copy. */ public void testDeepCopyRowGroups() { int[][] rowGroups = createAllGroups(); layout.setRowGroups(rowGroups); // Modify the row group set (first level). rowGroups[1] = new int[]{1, 4}; if (equals(rowGroups, layout.getRowGroups())) { fail("The row group sets should be immutable."); } // Modify a row group (second level) rowGroups[0][0] = 5; if (equals(rowGroups, layout.getRowGroups())) { fail("Row groups should be immutable."); } } /** * Tests if invalid column indices are rejected. */ public void testRejectInvalidColumnIndex() { try { layout.setColumnGroups(new int[][]{{1, 5}}); fail("An invalid column index should be rejected."); } catch (IndexOutOfBoundsException e) { // The expected behavior } } /** * Tests if invalid row indices are rejected. */ public void testRejectInvalidRowIndex() { try { layout.setRowGroups(new int[][]{{1, 5}}); fail("An invalid row index should be rejected."); } catch (IndexOutOfBoundsException e) { // The expected behavior } } /** * Tests if duplicate column indices are rejected. */ public void testRejectDuplicateColumnIndex() { try { layout.setColumnGroups(new int[][]{{1, 2}, {2, 3}}); fail("A duplicate column index should be rejected."); } catch (IllegalArgumentException e) { // The expected behavior } } /** * Tests if duplicate row indices are rejected. */ public void testRejectDuplicateRowIndex() { try { layout.setRowGroups(new int[][]{{1, 2}, {2, 3}}); fail("A duplicate row index should be rejected."); } catch (IllegalArgumentException e) { // The expected behavior } } // Helper Code ************************************************* private static int[][] createAllGroups() { int[] group1 = new int[]{1, 2}; int[] group2 = new int[]{3, 4}; return new int[][] {group1, group2}; } /** * Checks and returns if the two-dimensional arrays are equal. * @param array1 a two-dimensional array * @param array2 a second two-dimensional array * @return true if both arrays are equal, false otherwise */ private static boolean equals(int[][] array1, int[][] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; i++) { int[] subarray1 = array1[i]; int[] subarray2 = array2[i]; if (subarray1.length != subarray2.length) { return false; } for (int j = 0; j < subarray1.length; j++) { if (subarray1[j] != subarray2[j]) { return false; } } } return true; } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/RowSpecTest.java0000644000175000017500000003605411751010232026011 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.util.Locale; import junit.framework.TestCase; /** * A test case for class {@link RowSpec}. * * @author Karsten Lentzsch * @version $Revision: 1.30 $ */ public final class RowSpecTest extends TestCase { /** * Checks that the constructor rejects negative resize weights. */ @SuppressWarnings("unused") public static void testRejectNegativeResizeWeight() { try { new RowSpec(RowSpec.DEFAULT, Sizes.DEFAULT, -1); fail("The RowSpec constructor should reject negative resize weights."); } catch (IllegalArgumentException e) { // The expected behavior } catch (Exception e) { fail("The RowSpec constructor has thrown an unexpected exception."); } } /** * Checks that the constructor rejects negative resize weights. */ public static void testRejectParsedNegativeResizeWeight() { try { RowSpec.decode("right:default:-1"); fail("The RowSpec parser constructor should reject negative resize weights."); } catch (IllegalArgumentException e) { // The expected behavior } catch (Exception e) { fail("The RowSpec constructor has thrown an unexpected exception."); } } /** * Tests the RowSpec parser on valid encodings with different locales. */ public static void testValidRowSpecEncodings() { testValidRowSpecEncodings(Locale.ENGLISH); testValidRowSpecEncodings(AllFormsTests.TURKISH); } /** * Tests that the RowSpec parser rejects invalid encodings for a given Locale. */ public static void testRejectInvalidRowSpecEncodings() { testRejectInvalidRowSpecEncodings(Locale.ENGLISH); testRejectInvalidRowSpecEncodings(AllFormsTests.TURKISH); } public static void testDefaultVariables() { assertEquals( FormSpecs.RELATED_GAP_ROWSPEC, RowSpec.decode("${related-gap}")); assertEquals( FormSpecs.RELATED_GAP_ROWSPEC, RowSpec.decode("${RELATED-GAP}")); assertEquals( FormSpecs.RELATED_GAP_ROWSPEC, RowSpec.decode("$rgap")); assertEquals( FormSpecs.RELATED_GAP_ROWSPEC, RowSpec.decode("$rg")); assertEquals( FormSpecs.UNRELATED_GAP_ROWSPEC, RowSpec.decode("${unrelated-gap}")); assertEquals( FormSpecs.UNRELATED_GAP_ROWSPEC, RowSpec.decode("$ugap")); assertEquals( FormSpecs.UNRELATED_GAP_ROWSPEC, RowSpec.decode("$ug")); assertEquals( FormSpecs.NARROW_LINE_GAP_ROWSPEC, RowSpec.decode("${narrow-line-gap}")); assertEquals( FormSpecs.NARROW_LINE_GAP_ROWSPEC, RowSpec.decode("$nlgap")); assertEquals( FormSpecs.NARROW_LINE_GAP_ROWSPEC, RowSpec.decode("$nlg")); assertEquals( FormSpecs.LINE_GAP_ROWSPEC, RowSpec.decode("${line-gap}")); assertEquals( FormSpecs.LINE_GAP_ROWSPEC, RowSpec.decode("$lgap")); assertEquals( FormSpecs.LINE_GAP_ROWSPEC, RowSpec.decode("$lg")); assertEquals( FormSpecs.PARAGRAPH_GAP_ROWSPEC, RowSpec.decode("${paragraph-gap}")); assertEquals( FormSpecs.PARAGRAPH_GAP_ROWSPEC, RowSpec.decode("$pgap")); } public static void testCustomVariable() { ConstantSize gapHeight = Sizes.DLUY21; RowSpec largeGap = RowSpec.createGap(gapHeight); LayoutMap layoutMap = new LayoutMap(null); layoutMap.rowPut("large", largeGap); assertEquals( largeGap, RowSpec.decode("$large", layoutMap)); } public static void testOverrideDefaultVariableWithDefaultName() { ConstantSize gapHeight = Sizes.DLUY1; RowSpec lineSpec = RowSpec.createGap(gapHeight); LayoutMap layoutMap = new LayoutMap(); layoutMap.rowPut("line-gap", lineSpec); assertEquals( lineSpec, RowSpec.decode("${line-gap}", layoutMap)); assertEquals( lineSpec, RowSpec.decode("$lgap", layoutMap)); } public static void testOverrideDefaultVariableWithAlias() { ConstantSize gapHeight = Sizes.DLUY1; RowSpec lineSpec = RowSpec.createGap(gapHeight); LayoutMap layoutMap = new LayoutMap(); layoutMap.rowPut("lgap", lineSpec); assertEquals( lineSpec, RowSpec.decode("${line-gap}", layoutMap)); assertEquals( lineSpec, RowSpec.decode("$lgap", layoutMap)); } public static void testVariableExpression() { RowSpec spec0 = new RowSpec(FormSpec.TOP_ALIGN, Sizes.PREFERRED, FormSpec.NO_GROW); RowSpec spec1 = RowSpec.createGap(Sizes.DLUY3); RowSpec spec2 = new RowSpec(Sizes.PREFERRED); LayoutMap layoutMap = new LayoutMap(); layoutMap.rowPut("var1", "top:p, 3dlu, p"); layoutMap.rowPut("var2", "$var1, 3dlu, $var1"); RowSpec[] specs = RowSpec.decodeSpecs("$var1, 3dlu, $var1", layoutMap); RowSpec[] expected = new RowSpec[]{spec0, spec1, spec2, spec1, spec0, spec1, spec2}; assertEquals(expected, specs); specs = RowSpec.decodeSpecs("$var2", layoutMap); assertEquals(expected, specs); } public static void testMissingColumnSpecVariable() { String variable = "$rumpelstilzchen"; try { RowSpec.decode(variable); fail("The parser should reject the missing variable:" + variable); } catch (Exception e) { // The expected behavior } } /** * Tests the RowSpec parser on valid encodings for a given locale. * * @param locale the Locale used while parsing the strings */ private static void testValidRowSpecEncodings(Locale locale) { Locale oldDefault = Locale.getDefault(); Locale.setDefault(locale); try { RowSpec spec; spec = new RowSpec(RowSpec.TOP, Sizes.PREFERRED, FormSpec.NO_GROW); assertEquals(spec, RowSpec.decode("t:p")); assertEquals(spec, RowSpec.decode("top:p")); assertEquals(spec, RowSpec.decode("t:pref")); assertEquals(spec, RowSpec.decode("top:pref")); spec = new RowSpec(RowSpec.DEFAULT, Sizes.MINIMUM, FormSpec.NO_GROW); assertEquals(spec, RowSpec.decode("min")); assertEquals(spec, RowSpec.decode("c:min")); assertEquals(spec, RowSpec.decode("center:min")); assertEquals(spec, RowSpec.decode("c:min:none")); assertEquals(spec, RowSpec.decode("center:min:grow(0)")); spec = new RowSpec(RowSpec.FILL, Sizes.DEFAULT, FormSpec.NO_GROW); assertEquals(spec, RowSpec.decode("f:default")); assertEquals(spec, RowSpec.decode("fill:default")); assertEquals(spec, RowSpec.decode("FILL:DEFAULT")); assertEquals(spec, RowSpec.decode("f:default:none")); assertEquals(spec, RowSpec.decode("F:DEFAULT:NONE")); assertEquals(spec, RowSpec.decode("fill:default:grow(0)")); assertEquals(spec, RowSpec.decode("FILL:DEFAULT:GROW(0)")); spec = new RowSpec(RowSpec.BOTTOM, Sizes.pixel(10), FormSpec.NO_GROW); assertEquals(spec, RowSpec.decode("b:10px")); assertEquals(spec, RowSpec.decode("bottom:10px")); assertEquals(spec, RowSpec.decode("BOTTOM:10PX")); assertEquals(spec, RowSpec.decode("bottom:10px:none")); assertEquals(spec, RowSpec.decode("bottom:10px:grow(0)")); assertEquals(spec, RowSpec.decode("bottom:10px:g(0)")); Size size = Sizes.bounded(Sizes.PREFERRED, Sizes.pixel(10), null); spec = new RowSpec(RowSpec.BOTTOM, size, FormSpec.NO_GROW); assertEquals(spec, RowSpec.decode("bottom:max(10px;pref)")); assertEquals(spec, RowSpec.decode("bottom:max(pref;10px)")); assertEquals(spec, RowSpec.decode("bottom:[10px,pref]")); size = Sizes.bounded(Sizes.PREFERRED, null, Sizes.pixel(10)); spec = new RowSpec(RowSpec.BOTTOM, size, FormSpec.NO_GROW); assertEquals(spec, RowSpec.decode("bottom:min(10px;pref)")); assertEquals(spec, RowSpec.decode("BOTTOM:MIN(10PX;PREF)")); assertEquals(spec, RowSpec.decode("bottom:min(pref;10px)")); assertEquals(spec, RowSpec.decode("bottom:[pref,10px]")); size = Sizes.bounded(Sizes.DEFAULT, null, Sizes.pixel(10)); spec = new RowSpec(RowSpec.DEFAULT, size, FormSpec.NO_GROW); assertEquals(spec, RowSpec.decode("min(10px;default)")); assertEquals(spec, RowSpec.decode("min(10px;d)")); assertEquals(spec, RowSpec.decode("min(default;10px)")); assertEquals(spec, RowSpec.decode("min(d;10px)")); assertEquals(spec, RowSpec.decode("[d,10px]")); size = Sizes.bounded(Sizes.PREFERRED, Sizes.pixel(50), Sizes.pixel(200)); spec = new RowSpec(RowSpec.DEFAULT, size, FormSpec.NO_GROW); assertEquals(spec, RowSpec.decode("[50px,pref,200px]")); spec = new RowSpec(RowSpec.DEFAULT, Sizes.DEFAULT, FormSpec.DEFAULT_GROW); assertEquals(spec, RowSpec.decode("d:grow")); assertEquals(spec, RowSpec.decode("default:grow(1)")); assertEquals(spec, RowSpec.decode("c:d:g")); assertEquals(spec, RowSpec.decode("c:d:grow(1.0)")); assertEquals(spec, RowSpec.decode("c:d:g(1.0)")); spec = new RowSpec(RowSpec.DEFAULT, Sizes.DEFAULT, 0.75); assertEquals(spec, RowSpec.decode("d:grow(0.75)")); assertEquals(spec, RowSpec.decode("default:grow(0.75)")); assertEquals(spec, RowSpec.decode("c:d:grow(0.75)")); assertEquals(spec, RowSpec.decode("center:default:grow(0.75)")); RowSpec spec1 = new RowSpec(RowSpec.TOP, Sizes.PREFERRED, FormSpec.NO_GROW); RowSpec spec2 = new RowSpec(RowSpec.BOTTOM, Sizes.DEFAULT, 1.0); RowSpec[] specs = RowSpec.decodeSpecs( "top:pref:none , bottom:default:grow"); assertEquals(2, specs.length); assertEquals(spec1, specs[0]); assertEquals(spec2, specs[1]); } finally { Locale.setDefault(oldDefault); } } /** * Tests that the RowSpec parser rejects invalid encodings for a given Locale. * * @param locale the Locale used while parsing the strings */ private static void testRejectInvalidRowSpecEncodings(Locale locale) { Locale oldDefault = Locale.getDefault(); Locale.setDefault(locale); try { assertRejects("karsten"); assertRejects("d:a:b:"); assertRejects("right:default:grow"); // invalid alignment assertRejects("left:20dlu"); assertRejects("max(pref;pref)"); assertRejects("min(pref;pref)"); assertRejects("[pref,pref]"); assertRejects("[pref,pref,200px]"); // lower bound must be constant assertRejects("[10px,pref,pref]"); // upper bound must be constant } finally { Locale.setDefault(oldDefault); } } // Helper Code *********************************************************** /** * Checks if the given RowSpec instances are equal and throws a failure * if not. * * @param expected the expected row spec object to be compared * @param actual the actual row spec object to be compared */ private static void assertEquals(RowSpec expected, RowSpec actual) { if (!expected.getDefaultAlignment().equals(actual.getDefaultAlignment())) { fail("Alignment mismatch: expected=" + expected + "; actual=" + actual); } if (!expected.getSize().equals(actual.getSize())) { fail("Size mismatch: expected=" + expected + "; actual=" + actual); } if (!(expected.getResizeWeight() == actual.getResizeWeight())) { fail("Resize weight mismatch: expected=" + expected + "; actual=" + actual); } } private static void assertEquals(RowSpec[] specs1, RowSpec[] specs2) { if (specs1.length != specs2.length) { fail("Array size mismatch. specs1.length" + specs1.length + "; specs2.length=" + specs2.length); } for (int i = 0; i < specs1.length; i++) { assertEquals(specs1[i], specs2[i]); } } /** * Asserts that the specified row spec encoding is rejected. * * @param encodedRowSpec an encoded row spec */ private static void assertRejects(String encodedRowSpec) { try { RowSpec.decode(encodedRowSpec); fail("The parser should reject encoding:" + encodedRowSpec); } catch (Exception e) { // The expected behavior } } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/UnitConversionTest.java0000644000175000017500000000721711731041646027426 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.awt.Component; import java.awt.Font; import javax.swing.JLabel; import junit.framework.TestCase; import com.jgoodies.forms.util.DefaultUnitConverter; /** * Tests the unit conversion used by the Forms layout system. * * @author Karsten Lentzsch * @version $Revision: 1.12 $ */ public final class UnitConversionTest extends TestCase { /** * Checks that users can set a custom font for use in * the DefaultUnitConverter. */ public static void testSetDefaultDialogFont() { DefaultUnitConverter duc = DefaultUnitConverter.getInstance(); Font customFont = new Font("Serif", Font.PLAIN, 16); duc.setDefaultDialogFont(customFont); } /** * Checks that users can set a custom string for testing * the average character width in the DefaultUnitConverter. */ public static void testSetAverageCharacterWidthTestString() { DefaultUnitConverter duc = DefaultUnitConverter.getInstance(); String customString = "Einen Vorsprung im Leben hat, " + "wer da anpackt, " + "wo die anderen erst einmal reden."; duc.setAverageCharacterWidthTestString(customString); } /** * Checks that a size with a value of 0 map to 0 px regardless * which unit has been specified. */ public static void testZeroSizesMapToZeroPixels() { Component component = new JLabel(); assertEquals("Centimeter to pixel", 0, Sizes.centimeterAsPixel(0.0d, component)); assertEquals("DluX to pixel", 0, Sizes.dialogUnitXAsPixel(0, component)); assertEquals("DluY to pixel", 0, Sizes.dialogUnitYAsPixel(0, component)); assertEquals("Inch to pixel", 0, Sizes.inchAsPixel (0.0d, component)); assertEquals("Millimeter to pixel", 0, Sizes.millimeterAsPixel(0.0d, component)); assertEquals("Point to pixel", 0, Sizes.pointAsPixel (0, component)); } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/PanelBuilderTest.java0000644000175000017500000001157011764277376027025 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import javax.swing.JLabel; import javax.swing.JTextField; import junit.framework.TestCase; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.factories.CC; /** * A test case for class {@link PanelBuilder}. * * @author Karsten Lentzsch * @version $Revision: 1.5 $ */ public final class PanelBuilderTest extends TestCase { private JLabel labelWithMnemonic; private JLabel labelWithoutMnemonic; private JLabel labelingLabel; private JTextField plainField; private JTextField unfocusableField; private JTextField labeledField; private PanelBuilder builder; // Setup ****************************************************************** @Override protected void setUp() { labelWithMnemonic = new JLabel("Label1:"); labelWithMnemonic.setDisplayedMnemonic('L'); labelWithoutMnemonic = new JLabel("Label2:"); plainField = new JTextField("plain"); unfocusableField = new JTextField("unfocusable"); unfocusableField.setFocusable(false); labeledField = new JTextField("labeled"); labelingLabel = new JLabel("Label3"); labelingLabel.setLabelFor(labeledField); builder = createBuilder(); } // LabelFor Feature ******************************************************* /** * Checks the association between mnemonic label and next component. */ public void testLabelForWithMnemonic() { builder.add(labelWithMnemonic, CC.xy(1, 1)); builder.add(plainField, CC.xy(3, 1)); assertSame("Labeling label", plainField, labelWithMnemonic.getLabelFor()); } /** * Checks the association between plain label and next component. */ public void testLabelForWithoutMnemonic() { builder.add(labelWithoutMnemonic, CC.xy(1, 1)); builder.add(plainField, CC.xy(3, 1)); assertSame("Labeling label", plainField, labelWithoutMnemonic.getLabelFor()); } /** * Checks the association between label and unfocusable component. */ public void testLabelForUnfocusableField() { builder.add(labelWithoutMnemonic, CC.xy(1, 1)); builder.add(unfocusableField, CC.xy(3, 1)); assertNull("Labeling label", labelWithoutMnemonic.getLabelFor()); } /** * Checks the association between labeling label and next component. */ public void testLabelForLabelingLabel() { builder.add(labelingLabel, CC.xy(1, 1)); builder.add(plainField, CC.xy(3, 1)); builder.add(labelWithMnemonic, CC.xy(1, 3)); builder.add(new JTextField(), CC.xy(3, 3)); assertSame("Labeling label", labeledField, labelingLabel.getLabelFor()); } // Helper Code ************************************************************ private static PanelBuilder createBuilder() { FormLayout layout = new FormLayout( "p, $lcgap, p", "10*(p, $lg), p"); return new PanelBuilder(layout) .labelForFeatureEnabled(true); } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/CellConstraintsTest.java0000644000175000017500000002445711731041646027555 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.util.Locale; import junit.framework.TestCase; /** * A test case for class {@link CellConstraints}. * * @author Karsten Lentzsch * @version $Revision: 1.19 $ */ public final class CellConstraintsTest extends TestCase { /** * Checks that the constructor rejects non-positive origin and extent. */ public static void testRejectNonPositiveOriginAndExtent() { assertRejects( 0, 1, 1, 1); assertRejects(-1, 1, 1, 1); assertRejects( 1, 0, 1, 1); assertRejects( 1, -1, 1, 1); assertRejects( 1, 1, 0, 1); assertRejects( 1, 1, -1, 1); assertRejects( 1, 1, 1, 0); assertRejects( 1, 1, 1, -1); } /** * Tests that the CellConstraints parser rejects invalid alignments. */ @SuppressWarnings("unused") public static void testRejectInvalidCellConstraintsAlignments() { try { new CellConstraints(1, 1, CellConstraints.BOTTOM, CellConstraints.CENTER); fail("The CellConstraints constructor should reject invalid orientations."); } catch (IllegalArgumentException e) { // The expected behavior } catch (Exception e) { fail("The constructor has thrown an unexpected exception: " + e); } try { new CellConstraints(1, 1, CellConstraints.CENTER, CellConstraints.RIGHT); fail("The CellConstraints constructor should reject invalid orientations."); } catch (IllegalArgumentException e) { // The expected behavior } catch (Exception e) { fail("The constructor has thrown an unexpected exception: " + e); } CellConstraints cc = new CellConstraints(); try { cc.xy(1, 1, CellConstraints.BOTTOM, CellConstraints.CENTER); fail("The CellConstraints setter should reject invalid orientations."); } catch (IllegalArgumentException e) { // The expected behavior } catch (Exception e) { fail("The setter has thrown an unexpected exception: " + e); } try { cc.xy(1, 1, CellConstraints.BOTTOM, CellConstraints.CENTER); fail("The CellConstraints setter should reject invalid orientations."); } catch (IllegalArgumentException e) { // The expected behavior } catch (Exception e) { fail("The setter has thrown an unexpected exception: " + e); } } /** * Tests the CellConstraints parser on valid encodings with different locales. */ public static void testValidEncodings() { testValidEncodings(Locale.ENGLISH); testValidEncodings(AllFormsTests.TURKISH); } /** * Tests with different locales that the CellConstraints parser * rejects invalid encodings. */ public static void testRejectInvalidCellConstraintsEncodings() { testRejectInvalidCellConstraintsEncodings(Locale.ENGLISH); testRejectInvalidCellConstraintsEncodings(AllFormsTests.TURKISH); } /** * Tests the CellConstraints parser on valid encodings with a given locale. * * @param locale the Locale used while parsing the strings */ private static void testValidEncodings(Locale locale) { Locale oldDefault = Locale.getDefault(); Locale.setDefault(locale); try { CellConstraints cc; cc = new CellConstraints(); assertEquals(cc, new CellConstraints("1, 1")); cc = new CellConstraints(2, 3); assertEquals(cc, new CellConstraints("2, 3")); cc = new CellConstraints(3, 4, 2, 5); assertEquals(cc, new CellConstraints("3, 4, 2, 5")); cc = new CellConstraints(5, 6, CellConstraints.LEFT, CellConstraints.BOTTOM); assertEquals(cc, new CellConstraints("5, 6, l, b")); assertEquals(cc, new CellConstraints("5, 6, L, B")); assertEquals(cc, new CellConstraints("5, 6, left, bottom")); assertEquals(cc, new CellConstraints("5, 6, LEFT, BOTTOM")); cc = new CellConstraints(7, 8, 3, 2, CellConstraints.FILL, CellConstraints.DEFAULT); assertEquals(cc, new CellConstraints("7, 8, 3, 2, f, d")); assertEquals(cc, new CellConstraints("7, 8, 3, 2, F, D")); assertEquals(cc, new CellConstraints("7, 8, 3, 2, fill, default")); assertEquals(cc, new CellConstraints("7, 8, 3, 2, FILL, DEFAULT")); } finally { Locale.setDefault(oldDefault); } } /** * Tests that the CellConstraints parser rejects invalid encodings * on a given locale. * * @param locale the Locale used while parsing the strings */ private static void testRejectInvalidCellConstraintsEncodings(Locale locale) { Locale oldDefault = Locale.getDefault(); Locale.setDefault(locale); try { assertRejects("0, 1, 1, 1"); // Illegal bounds assertRejects("0, 1, 1"); // Illegal number of arguments assertRejects("0, 1, 1, 1, 1"); // Illegal number of arguments assertRejects("1"); // Syntax error assertRejects("1, 1, fill"); // Syntax error assertRejects("1, 1, 3, 4, f"); // Syntax error assertRejects("1, 1, top, center"); // Illegal column alignment assertRejects("1, 1, fill, left"); // Illegal row alignment assertRejects("1, 1, F\u0131LL, TOP"); // Illegal Turkish char assertRejects("1, 1, 2, 3, t, c"); // Illegal column alignment assertRejects("1, 1, 2, 3, f, l"); // Illegal row alignment } finally { Locale.setDefault(oldDefault); } } // Helper Code *********************************************************** /** * Checks if the CellConstraints constructor allows to construct * an instance for the specified cell bounds. * * @param invalidEncoding the encoding that should be rejected */ @SuppressWarnings("unused") private static void assertRejects(String invalidEncoding) { try { new CellConstraints(invalidEncoding); fail("The parser should reject the invalid encoding: " + invalidEncoding); } catch (IllegalArgumentException e) { // The expected behavior } catch (IndexOutOfBoundsException e) { // The expected behavior } catch (Exception e) { fail("The parser has thrown an unexpected exception for:" + invalidEncoding + "; exception=" + e); } } /** * Checks if the CellConstraints constructor allows to construct * an instance for the specified cell bounds. * * @param gridX the first column in the grid * @param gridY the first row in the grid * @param gridWidth the column span * @param gridHeight the row span */ @SuppressWarnings("unused") private static void assertRejects(int gridX, int gridY, int gridWidth, int gridHeight) { try { new CellConstraints(gridX, gridY, gridWidth, gridHeight); fail("The CellConstraints constructor should reject non-positive bounds values."); } catch (IndexOutOfBoundsException e) { // The expected behavior } catch (Exception e) { fail("The CellConstraints constructor has thrown an unexpected exception:" + e); } } /** * Checks if the given CellConstraints instances are equal * and throws a failure if not. * * @param expected the expected constraints object to be compared * @param actual the actual constraints object to be compared */ private static void assertEquals(CellConstraints expected, CellConstraints actual) { if ( expected.gridX != actual.gridX || expected.gridY != actual.gridY || expected.gridWidth != actual.gridWidth || expected.gridHeight != actual.gridHeight) { fail("Bounds mismatch: expected=" + expected + "; actual=" + actual); } if ( expected.hAlign != actual.hAlign || expected.vAlign != actual.vAlign) { fail("Alignment mismatch: expected=" + expected + "; actual=" + actual); } if (!expected.insets.equals(actual.insets)) { fail("Insets mismatch: expected=" + expected + "; actual=" + actual); } } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/TestComponent.java0000644000175000017500000000767111731041646026407 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.awt.Component; import java.awt.Dimension; /** * A component that is used in the layout tests. It is constructed * with fixed minimum and preferred sizes. * * @author Karsten Lentzsch * @version $Revision: 1.14 $ */ public final class TestComponent extends Component { /** * Holds the component's minimum size that can be requested * using {@code #getMinimumSize}. */ private final Dimension minimumSize; /** * Holds the component's preferred size that can be requested * using {@code #getPreferredSize}. */ private final Dimension preferredSize; // Instance Creation ****************************************************** /** * Constructs a TestComponent with the given minimum and preferred sizes. * * @param minimumSize the component's minimum size * @param preferredSize the component's preferred size */ public TestComponent(Dimension minimumSize, Dimension preferredSize) { this.minimumSize = minimumSize; this.preferredSize = preferredSize; } /** * Constructs a TestComponent with the given minimum and preferred * widths and heights. * * @param minWidth the component's minimum width * @param minHeight the component's minimum height * @param prefWidth the component's preferred width * @param prefHeight the component's preferred height */ public TestComponent(int minWidth, int minHeight, int prefWidth, int prefHeight) { this(new Dimension(minWidth, minHeight), new Dimension(prefWidth, prefHeight)); } // Accessing Properties *************************************************** /** * Returns the minimum size of this component. * * @return a dimension object indicating this component's minimum size * @see #getPreferredSize() */ @Override public Dimension getMinimumSize() { return minimumSize; } /** * Returns the preferred size of this component. * * @return a dimension object indicating this component's preferred size * @see #getMinimumSize() */ @Override public Dimension getPreferredSize() { return preferredSize; } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/ClassLoaderTest.java0000644000175000017500000000713511731041646026634 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import junit.framework.TestCase; /** * Tests working with the Forms with different class loaders. * * @author Karsten Lentzsch * @version $Revision: 1.5 $ */ public final class ClassLoaderTest extends TestCase{ // Tests ****************************************************************** public void testLayoutMapAccess() throws ClassNotFoundException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException { testStaticAccess(LayoutMap.class.getName(), "getRoot"); } // Helper Code ************************************************************ private void testStaticAccess(String className, String methodName) throws ClassNotFoundException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException { Class classVersion1 = loadClass(className); staticAccess(classVersion1, methodName); Class classVersion2 = loadClass(className); staticAccess(classVersion2, methodName); } private Class loadClass(String className) throws ClassNotFoundException { URL url = getClass().getResource("/"); ClassLoader parent = ClassLoader.getSystemClassLoader().getParent(); ClassLoader loader = new URLClassLoader(new URL[]{url}, parent); return loader.loadClass(className); } private static void staticAccess(Class classVersion, String methodName) throws IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { Method method = classVersion.getMethod(methodName, (Class[]) null); method.invoke(classVersion, (Object[])null); } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/DefaultComponentFactoryTest.java0000644000175000017500000000673211731041646031241 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import javax.swing.JLabel; import junit.framework.TestCase; import com.jgoodies.forms.factories.DefaultComponentFactory; /** * A test case for class {@link DefaultComponentFactory}. * * @author Karsten Lentzsch * @version $Revision: 1.10 $ */ public final class DefaultComponentFactoryTest extends TestCase { public static void testLabelWithoutColon() { testLabelAccessibleName("Label without colon", "Name", "Name"); testLabelAccessibleName("1 char label without colon", "A", "A"); testLabelAccessibleName("Empty label without colon", "", ""); } public static void testLabelWithColon() { testLabelAccessibleName("Label without colon", "Name:", "Name"); testLabelAccessibleName("Empty label without colon", ":", ""); } public static void testLabelWithCustomAccessibleName() { String text = "Name:"; String accessibleName = "The name"; JLabel label = DefaultComponentFactory.getInstance().createLabel(text); label.getAccessibleContext().setAccessibleName(accessibleName); testLabelAccessibleName("Label with custom accessible name", label, accessibleName); } private static void testLabelAccessibleName( String description, String text, String expected) { testLabelAccessibleName( description, DefaultComponentFactory.getInstance().createLabel(text), expected); } private static void testLabelAccessibleName( String description, JLabel label, String expected) { assertEquals(description, expected, label.getAccessibleContext().getAccessibleName()); } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/AllFormsTests.java0000644000175000017500000000461111731041646026336 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.util.Locale; import org.junit.runner.RunWith; import org.junit.runners.Suite; /** * A test suite for all tests related to the JGoodies Forms framework. * * @author Karsten Lentzsch * @version $Revision: 1.23 $ */ @RunWith(Suite.class) @Suite.SuiteClasses({ BordersTest.class, CellConstraintsTest.class, ClassLoaderTest.class, ColumnSpecTest.class, DefaultComponentFactoryTest.class, FormLayoutTest.class, FormLayoutGroupsTest.class, PanelBuilderTest.class, RowSpecTest.class, SerializationTest.class, UnitConversionTest.class }) public final class AllFormsTests { /** A constant for the Turkish locale. */ public static final Locale TURKISH = new Locale("tr"); } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/SerializationTest.java0000644000175000017500000002304011731041646027246 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.io.*; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import junit.framework.TestCase; import com.jgoodies.forms.factories.CC; /** * Tests the serialization and deserialization of instances of * {@code FormLayout} and {@code JPanel}. * * @author Karsten Lentzsch * @version $Revision: 1.12 $ * * @see java.io.Serializable */ public final class SerializationTest extends TestCase { /** * Tests the serialization of a FormLayout that has just been constructed. * The layout contains no components and the layout algorithm has not * been performed. */ public static void testSerializeConstructedLayout() { FormLayout layout = createSampleLayout(); OutputStream out = new ByteArrayOutputStream(); serialize(out, layout); } /** * Tests the serialization of an empty FormLayout that has computed * a layout immediately after its construction. * The layout contains no components. */ public static void testSerializeEmptyLayout() { FormLayout layout = createSampleLayout(); doLayout(layout); OutputStream out = new ByteArrayOutputStream(); serialize(out, layout); } /** * Tests the serialization of a panel that is laid out using * a FormLayout. The panel consists some sample components that in turn * uses some sample {@code CellConstraints}. */ public static void testSerializePanel() { JPanel panel = createSamplePanel(); OutputStream out = new ByteArrayOutputStream(); serialize(out, panel); } /** * Tests the deserialization of a FormLayout that has just been constructed. * The layout contains no components and the layout algorithm has not * been performed. */ public static void testDeserializeConstructedLayout() { FormLayout layout = createSampleLayout(); ByteArrayOutputStream out = new ByteArrayOutputStream(); serialize(out, layout); byte[] bytes = out.toByteArray(); InputStream in = new ByteArrayInputStream(bytes); deserialize(in); } /** * Tests the deserialization of an empty FormLayout that has computed * a layout immediately after its construction. * The layout contains no components. */ public static void testDeserializeEmptyLayout() { FormLayout layout = createSampleLayout(); doLayout(layout); ByteArrayOutputStream out = new ByteArrayOutputStream(); serialize(out, layout); byte[] bytes = out.toByteArray(); InputStream in = new ByteArrayInputStream(bytes); deserialize(in); } /** * Tests the deserialization of a panel that is laid out using * a FormLayout. The panel consists some sample components that in turn * uses some sample {@code CellConstraints}. */ public static void testDeserializePanel() { JPanel panel = createSamplePanel(); ByteArrayOutputStream out = new ByteArrayOutputStream(); serialize(out, panel); byte[] bytes = out.toByteArray(); InputStream in = new ByteArrayInputStream(bytes); deserialize(in); } /** * Tests that the a layout can be computed with a deserialized * empty FormLayout. */ public static void testLayoutDeserializedEmptyLayout() { FormLayout layout = createSampleLayout(); doLayout(layout); ByteArrayOutputStream out = new ByteArrayOutputStream(); serialize(out, layout); byte[] bytes = out.toByteArray(); InputStream in = new ByteArrayInputStream(bytes); FormLayout layout2 = (FormLayout) deserialize(in); doLayout(layout2); } /** * Tests that the a panel can be laid out with a deserialized * FormLayout. */ public static void testLayoutDeserializedPanel() { JPanel panel = createSamplePanel(); ByteArrayOutputStream out = new ByteArrayOutputStream(); serialize(out, panel); byte[] bytes = out.toByteArray(); InputStream in = new ByteArrayInputStream(bytes); JPanel panel2 = (JPanel) deserialize(in); panel2.doLayout(); } // Helper Code ********************************************************* /** * Creates and returns a sample {@code FormLayout} instance * that uses all prebuilt alignments and {@code Size} implementations * so we can test their serialization and deserialization. * * @return a sample layout */ private static FormLayout createSampleLayout() { return new FormLayout( "l:1px, c:2dlu, r:3mm, f:m, p, d, max(p;3dlu), min(p;7px)", "t:1px, c:2dlu, b:3mm, f:m, p, d, max(p;3dlu), min(p;7px)"); } /** * Creates and returns a sample panel that uses the sample layout * created by {@code #createSampleLayout}. Useful to test the * FormLayout serialization in combination with a layout container * and some components managed by the FormLayout. Especially it tests * the serialization of {@code CellConstraints} objects. * * @return a sample panel */ private static JPanel createSamplePanel() { JPanel panel = new JPanel(createSampleLayout()); panel.add(new JLabel("Test1"), CC.xy(1, 1, "l, t")); panel.add(new JButton("Test2"), CC.xy(2, 2, "c, c")); panel.add(new JButton("Test3"), CC.xy(3, 3, "r, b")); panel.add(new JButton("Test4"), CC.xy(4, 4, "f, f")); panel.doLayout(); return panel; } /** * Lays out a container using the given {@code FormLayout} * and returns the layout info object. * * @param layout the FormLayout used to lay out * @return the layout info after the container has been laid out */ private static FormLayout.LayoutInfo doLayout(FormLayout layout) { JPanel panel = new JPanel(layout); panel.doLayout(); FormLayout.LayoutInfo info = layout.getLayoutInfo(panel); return info; } /** * Serializes the given object and writes it to the given * output stream. * * @param out the stream to write the serialized object * @param object the object to be serialized */ private static void serialize(OutputStream out, Object object) { ObjectOutputStream objectOut = null; try { objectOut = new ObjectOutputStream(out); objectOut.writeObject(object); } catch (IOException e) { e.printStackTrace(); fail("IO Exception"); } finally { if (objectOut != null) { try { objectOut.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } /** * Deserializes and returns an object that is contained in serialized form * in the given input stream. * * @param in the stream to read from * @return the deserialized object */ private static Object deserialize(InputStream in) { ObjectInputStream objectIn = null; try { objectIn = new ObjectInputStream(in); return objectIn.readObject(); } catch (IOException e) { e.printStackTrace(); fail("IO Exception"); } catch (ClassNotFoundException e) { e.printStackTrace(); fail("Class not found"); } finally { if (objectIn != null) { try { objectIn.close(); } catch (IOException e1) { e1.printStackTrace(); } } } return null; } } jgoodies-forms-1.6.0/src/test/java/com/jgoodies/forms/layout/ColumnSpecTest.java0000644000175000017500000004505211751010232026475 0ustar tonytony/* * Copyright (c) 2002-2012 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its 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. */ package com.jgoodies.forms.layout; import java.util.Locale; import junit.framework.TestCase; /** * A test case for class {@link ColumnSpec}. * * @author Karsten Lentzsch * @version $Revision: 1.37 $ */ public final class ColumnSpecTest extends TestCase { /** * Checks that the constructor rejects negative resize weights. */ @SuppressWarnings("unused") public static void testRejectNegativeResizeWeight() { try { new ColumnSpec(ColumnSpec.DEFAULT, Sizes.DEFAULT, -1); fail("The ColumnSpec constructor should reject negative resize weights."); } catch (IllegalArgumentException e) { // The expected behavior } catch (Exception e) { fail("The ColumnSpec constructor has thrown an unexpected exception."); } } /** * Checks that the constructor rejects negative resize weights. */ public static void testRejectParsedNegativeResizeWeight() { try { ColumnSpec.decode("right:default:-1"); fail("The ColumnSpec parser constructor should reject negative resize weights."); } catch (IllegalArgumentException e) { // The expected behavior } catch (Exception e) { fail("The ColumnSpec constructor has thrown an unexpected exception."); } } /** * Tests the ColumnSpec parser on valid encodings with different Locales. */ public static void testValidColumnSpecEncodings() { testValidColumnSpecEncodings(Locale.ENGLISH); testValidColumnSpecEncodings(AllFormsTests.TURKISH); } /** * Tests with different Locales that the ColumnSpec parser * rejects invalid encodings. */ public static void testRejectInvalidColumnSpecEncodings() { testRejectInvalidColumnSpecEncodings(Locale.ENGLISH); testRejectInvalidColumnSpecEncodings(AllFormsTests.TURKISH); } public static void testDefaultVariables() { assertEquals( FormSpecs.LABEL_COMPONENT_GAP_COLSPEC, ColumnSpec.decode("${label-component-gap}")); assertEquals( FormSpecs.LABEL_COMPONENT_GAP_COLSPEC, ColumnSpec.decode("${LABEL-COMPONENT-GAP}")); assertEquals( FormSpecs.LABEL_COMPONENT_GAP_COLSPEC, ColumnSpec.decode("$lcgap")); assertEquals( FormSpecs.LABEL_COMPONENT_GAP_COLSPEC, ColumnSpec.decode("$lcg")); assertEquals( FormSpecs.RELATED_GAP_COLSPEC, ColumnSpec.decode("${related-gap}")); assertEquals( FormSpecs.RELATED_GAP_COLSPEC, ColumnSpec.decode("$rgap")); assertEquals( FormSpecs.RELATED_GAP_COLSPEC, ColumnSpec.decode("$rg")); assertEquals( FormSpecs.UNRELATED_GAP_COLSPEC, ColumnSpec.decode("${unrelated-gap}")); assertEquals( FormSpecs.UNRELATED_GAP_COLSPEC, ColumnSpec.decode("$ugap")); assertEquals( FormSpecs.UNRELATED_GAP_COLSPEC, ColumnSpec.decode("$ug")); } public static void testCustomVariable() { ColumnSpec labelColumnSpec = ColumnSpec.decode("left:[80dlu,pref]"); LayoutMap layoutMap = new LayoutMap(null); layoutMap.columnPut("label", labelColumnSpec); assertEquals( labelColumnSpec, ColumnSpec.decode("$label", layoutMap)); } public static void testOverrideDefaultVariableWithDefaultName() { ConstantSize gapWidth = Sizes.DLUX1; ColumnSpec labelComponentColumnSpec = ColumnSpec.createGap(gapWidth); LayoutMap layoutMap = new LayoutMap(); layoutMap.columnPut("label-component-gap", labelComponentColumnSpec); assertEquals( labelComponentColumnSpec, ColumnSpec.decode("${label-component-gap}", layoutMap)); assertEquals( labelComponentColumnSpec, ColumnSpec.decode("$lcgap", layoutMap)); } public static void testOverrideDefaultVariableWithAlias() { ConstantSize gapWidth = Sizes.DLUX1; ColumnSpec labelComponentColumnSpec = ColumnSpec.createGap(gapWidth); LayoutMap layoutMap = new LayoutMap(); layoutMap.columnPut("lcgap", labelComponentColumnSpec); assertEquals( labelComponentColumnSpec, ColumnSpec.decode("${label-component-gap}", layoutMap)); assertEquals( labelComponentColumnSpec, ColumnSpec.decode("$lcgap", layoutMap)); } public static void testVariableExpression() { ColumnSpec spec0 = new ColumnSpec(FormSpec.LEFT_ALIGN, Sizes.PREFERRED, FormSpec.NO_GROW); ColumnSpec spec1 = ColumnSpec.createGap(Sizes.DLUX3); ColumnSpec spec2 = new ColumnSpec(Sizes.PREFERRED); LayoutMap layoutMap = new LayoutMap(); layoutMap.columnPut("var1", "left:p, 3dlu, p"); layoutMap.columnPut("var2", "$var1, 3dlu, $var1"); ColumnSpec[] specs = ColumnSpec.decodeSpecs("$var1, 3dlu, $var1", layoutMap); ColumnSpec[] expected = new ColumnSpec[]{spec0, spec1, spec2, spec1, spec0, spec1, spec2}; assertEquals(expected, specs); specs = ColumnSpec.decodeSpecs("$var2", layoutMap); assertEquals(expected, specs); } public static void testPrototypeVariable() { Size size = new PrototypeSize("123-456-789"); ColumnSpec spec = new ColumnSpec(size); LayoutMap layoutMap = new LayoutMap(); layoutMap.columnPut("prototype", "'123-456-789'"); assertEquals(spec, ColumnSpec.decode("$prototype", layoutMap)); } public static void testMissingVariable() { String variable = "$rumpelstilzchen"; try { ColumnSpec.decode(variable); fail("The parser should reject the missing variable:" + variable); } catch (Exception e) { // The expected behavior } } public static void testMultiplier() { ColumnSpec prefSpec = ColumnSpec.decode("pref"); ColumnSpec[] specs = ColumnSpec.decodeSpecs("2*(pref)"); assertEquals(prefSpec, 2, specs); } public static void testMultiplierWithBlanks() { ColumnSpec prefSpec = ColumnSpec.decode("pref"); ColumnSpec[] specs = ColumnSpec.decodeSpecs("2* (pref)"); assertEquals(prefSpec, 2, specs); specs = ColumnSpec.decodeSpecs("2 *(pref)"); assertEquals(prefSpec, 2, specs); specs = ColumnSpec.decodeSpecs("2 * (pref)"); assertEquals(prefSpec, 2, specs); specs = ColumnSpec.decodeSpecs(" 2 * (pref) "); assertEquals(prefSpec, 2, specs); specs = ColumnSpec.decodeSpecs(" 2 * ( pref ) "); assertEquals(prefSpec, 2, specs); } /** * Tests the ColumnSpec parser on valid encodings for a given Locale. * * @param locale the Locale used while parsing the strings */ private static void testValidColumnSpecEncodings(Locale locale) { Locale oldDefault = Locale.getDefault(); Locale.setDefault(locale); try { ColumnSpec spec; spec = new ColumnSpec(ColumnSpec.LEFT, Sizes.PREFERRED, FormSpec.NO_GROW); assertEquals(spec, ColumnSpec.decode("l:p")); assertEquals(spec, ColumnSpec.decode("L:P")); assertEquals(spec, ColumnSpec.decode("left:p")); assertEquals(spec, ColumnSpec.decode("LEFT:P")); assertEquals(spec, ColumnSpec.decode("l:pref")); assertEquals(spec, ColumnSpec.decode("L:PREF")); assertEquals(spec, ColumnSpec.decode("left:pref")); assertEquals(spec, ColumnSpec.decode("LEFT:PREF")); spec = new ColumnSpec(ColumnSpec.DEFAULT, Sizes.MINIMUM, FormSpec.NO_GROW); assertEquals(spec, ColumnSpec.decode("min")); assertEquals(spec, ColumnSpec.decode("MIN")); assertEquals(spec, ColumnSpec.decode("f:min")); assertEquals(spec, ColumnSpec.decode("fill:min")); assertEquals(spec, ColumnSpec.decode("FILL:MIN")); assertEquals(spec, ColumnSpec.decode("f:min:nogrow")); assertEquals(spec, ColumnSpec.decode("F:MIN:NOGROW")); assertEquals(spec, ColumnSpec.decode("fill:min:grow(0)")); spec = new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT, FormSpec.NO_GROW); assertEquals(spec, ColumnSpec.decode("d")); assertEquals(spec, ColumnSpec.decode("default")); assertEquals(spec, ColumnSpec.decode("DEFAULT")); assertEquals(spec, ColumnSpec.decode("f:default")); assertEquals(spec, ColumnSpec.decode("fill:default")); assertEquals(spec, ColumnSpec.decode("f:default:nogrow")); assertEquals(spec, ColumnSpec.decode("fill:default:grow(0)")); assertEquals(spec, ColumnSpec.decode("FILL:DEFAULT:GROW(0)")); spec = new ColumnSpec(ColumnSpec.RIGHT, Sizes.pixel(10), FormSpec.NO_GROW); assertEquals(spec, ColumnSpec.decode("r:10px")); assertEquals(spec, ColumnSpec.decode("right:10px")); assertEquals(spec, ColumnSpec.decode("right:10px:nogrow")); assertEquals(spec, ColumnSpec.decode("RIGHT:10PX:NOGROW")); assertEquals(spec, ColumnSpec.decode("right:10px:grow(0)")); assertEquals(spec, ColumnSpec.decode("right:10px:g(0)")); Size size = Sizes.bounded(Sizes.PREFERRED, Sizes.pixel(10), null); spec = new ColumnSpec(ColumnSpec.RIGHT, size, FormSpec.NO_GROW); assertEquals(spec, ColumnSpec.decode("right:max(10px;pref)")); assertEquals(spec, ColumnSpec.decode("right:max(pref;10px)")); assertEquals(spec, ColumnSpec.decode("right:[10px,pref]")); assertEquals(spec, ColumnSpec.decode("right:[10px, pref]")); assertEquals(spec, ColumnSpec.decode("right:[10px ,pref]")); assertEquals(spec, ColumnSpec.decode("right:[ 10px , pref ]")); size = Sizes.bounded(Sizes.PREFERRED, null, Sizes.pixel(10)); spec = new ColumnSpec(ColumnSpec.RIGHT, size, FormSpec.NO_GROW); assertEquals(spec, ColumnSpec.decode("right:min(10px;pref)")); assertEquals(spec, ColumnSpec.decode("right:min(pref;10px)")); assertEquals(spec, ColumnSpec.decode("right:[pref,10px]")); size = Sizes.bounded(Sizes.DEFAULT, null, Sizes.pixel(10)); spec = new ColumnSpec(ColumnSpec.DEFAULT, size, FormSpec.NO_GROW); assertEquals(spec, ColumnSpec.decode("min(10px;default)")); assertEquals(spec, ColumnSpec.decode("MIN(10PX;DEFAULT)")); assertEquals(spec, ColumnSpec.decode("min(10px;d)")); assertEquals(spec, ColumnSpec.decode("min(default;10px)")); assertEquals(spec, ColumnSpec.decode("min(d;10px)")); assertEquals(spec, ColumnSpec.decode("[d,10px]")); size = Sizes.bounded(Sizes.PREFERRED, Sizes.pixel(50), Sizes.pixel(200)); spec = new ColumnSpec(ColumnSpec.DEFAULT, size, FormSpec.NO_GROW); assertEquals(spec, ColumnSpec.decode("[50px,pref,200px]")); spec = new ColumnSpec(ColumnSpec.DEFAULT, Sizes.DEFAULT, FormSpec.DEFAULT_GROW); assertEquals(spec, ColumnSpec.decode("d:grow")); assertEquals(spec, ColumnSpec.decode("default:grow(1)")); assertEquals(spec, ColumnSpec.decode("f:d:g")); assertEquals(spec, ColumnSpec.decode("f:d:grow(1.0)")); assertEquals(spec, ColumnSpec.decode("f:d:g(1.0)")); spec = new ColumnSpec(ColumnSpec.DEFAULT, Sizes.DEFAULT, 0.75); assertEquals(spec, ColumnSpec.decode("d:grow(0.75)")); assertEquals(spec, ColumnSpec.decode("default:grow(0.75)")); assertEquals(spec, ColumnSpec.decode("f:d:grow(0.75)")); assertEquals(spec, ColumnSpec.decode("fill:default:grow(0.75)")); assertEquals(spec, ColumnSpec.decode("FILL:DEFAULT:GROW(0.75)")); spec = ColumnSpec.decode("fill:10in"); assertEquals(spec, ColumnSpec.decode("FILL:10IN")); spec = new ColumnSpec(new PrototypeSize("prototype")); assertEquals(spec, ColumnSpec.decode("'prototype'")); spec = new ColumnSpec(new PrototypeSize("prototype string")); assertEquals(spec, ColumnSpec.decode("'prototype string'")); ColumnSpec spec1 = new ColumnSpec(ColumnSpec.LEFT, Sizes.PREFERRED, FormSpec.NO_GROW); ColumnSpec spec2 = new ColumnSpec(ColumnSpec.RIGHT, Sizes.DEFAULT, 1.0); ColumnSpec[] specs = ColumnSpec.decodeSpecs( "left:pref:none , right:default:grow"); assertEquals(2, specs.length); assertEquals(spec1, specs[0]); assertEquals(spec2, specs[1]); spec2 = new ColumnSpec(new PrototypeSize("a,b")); specs = ColumnSpec.decodeSpecs("l:p, 'a,b'"); assertEquals(2, specs.length); assertEquals(spec1, specs[0]); assertEquals(spec2, specs[1]); } finally { Locale.setDefault(oldDefault); } } /** * Tests that the ColumnSpec parser rejects invalid encodings for a given Locale. * * @param locale the Locale used while parsing the strings */ private static void testRejectInvalidColumnSpecEncodings(Locale locale) { Locale oldDefault = Locale.getDefault(); Locale.setDefault(locale); try { assertRejects("karsten"); assertRejects("d:a:b:"); assertRejects("top:default:grow"); assertRejects("bottom:10px"); assertRejects("max(pref;pref)"); assertRejects("min(pref;pref)"); assertRejects("[pref,pref]"); assertRejects("[pref,pref,200px]"); // lower bound must be constant assertRejects("[10px,pref,pref]"); // upper bound must be constant assertRejectsSpecs("7dlu l:p:g 7dlu"); // Missing commas } finally { Locale.setDefault(oldDefault); } } // Helper Code *********************************************************** /** * Checks if the given ColumnSpec instances are equal and throws a failure * if not. * * @param expected the expected spec object to be compared * @param actual the actual spec object to be compared */ private static void assertEquals(ColumnSpec expected, ColumnSpec actual) { if (!expected.getDefaultAlignment().equals(actual.getDefaultAlignment())) { fail("Alignment mismatch: expected=" + expected + "; actual=" + actual); } if (!expected.getSize().equals(actual.getSize())) { fail("Size mismatch: expected=" + expected + "; actual=" + actual); } if (!(expected.getResizeWeight() == actual.getResizeWeight())) { fail("Resize weight mismatch: expected=" + expected + "; actual=" + actual); } } private static void assertEquals(ColumnSpec[] specs1, ColumnSpec[] specs2) { if (specs1.length != specs2.length) { fail("Array size mismatch. specs1.length" + specs1.length + "; specs2.length=" + specs2.length); } for (int i = 0; i < specs1.length; i++) { assertEquals(specs1[i], specs2[i]); } } private static void assertEquals(ColumnSpec expectedSpec, int expectedLength, ColumnSpec[] specs) { assertEquals("Multiplier", expectedLength, specs.length); for (int i = 0; i < specs.length; i++) { assertEquals("ColumnSpec[" + i + "]", expectedSpec, specs[i]); } } /** * Asserts that the specified column spec encoding is rejected. * * @param invalidEncoding the invalid encoded column spec */ private static void assertRejects(String invalidEncoding) { try { ColumnSpec.decode(invalidEncoding); fail("The parser should reject the invalid encoding:" + invalidEncoding); } catch (Exception e) { // The expected behavior } } /** * Asserts that the specified column spec encodings are rejected. * * @param invalidEncodings the invalid encoded column specs */ private static void assertRejectsSpecs(String invalidEncodings) { try { ColumnSpec.decodeSpecs(invalidEncodings); fail("The parser should reject the invalid encodings:" + invalidEncodings); } catch (Exception e) { // The expected behavior } } } jgoodies-forms-1.6.0/pom.xml0000644000175000017500000000427612003555436014542 0ustar tonytony 4.0.0 com.jgoodies jgoodies-forms 1.6.0 jar JGoodies Forms https://forms.java.net/ The JGoodies Forms framework helps you lay out and implement elegant Swing panels quickly and consistently. It makes simple things easy and the hard stuff possible, the good design easy and the bad difficult. com.jgoodies jgoodies-common 1.4.0 runtime junit junit 4.8 test The BSD License http://www.opensource.org/licenses/bsd-license.html JGoodies http://www.jgoodies.com/ karsten Karsten Lentzsch JGoodies http://www.jgoodies.com/ +0100 Project owner Developer JIRA http://java.net/jira/browse/FORMS/ User List http://http://java.net/projects/forms/lists/users/archive users@forms.java.net scm:svn:https://svn.java.net/svn/forms~svn head https://svn.java.net/svn/forms~svn